|
|
|
|
(ns NoteHub.main
|
|
|
|
|
(:require [goog.crypt.Md5 :as md5]
|
|
|
|
|
[goog.crypt :as crypt]
|
|
|
|
|
[NoteHub.crossover.lib :as lib]))
|
|
|
|
|
|
|
|
|
|
(defn log
|
|
|
|
|
"Logs to console.log"
|
|
|
|
|
[text]
|
|
|
|
|
(.log js/console text))
|
|
|
|
|
|
|
|
|
|
(defn $
|
|
|
|
|
"Returns DOM element by Id"
|
|
|
|
|
[id]
|
|
|
|
|
(.getElementById js/document (name id)))
|
|
|
|
|
|
|
|
|
|
(defn val
|
|
|
|
|
"Returns the value of the element or sets the value if the value was provided"
|
|
|
|
|
([element] (.-value element))
|
|
|
|
|
([element value]
|
|
|
|
|
(set! (.-value element) value)))
|
|
|
|
|
|
|
|
|
|
(defn show
|
|
|
|
|
"show the element"
|
|
|
|
|
[element]
|
|
|
|
|
(set! (.-display (.-style element)) "block"))
|
|
|
|
|
|
|
|
|
|
; frequently used selectors
|
|
|
|
|
(def $draft ($ :draft))
|
|
|
|
|
(def $action ($ :action))
|
|
|
|
|
(def $preview ($ :preview))
|
|
|
|
|
(def $password ($ :password))
|
|
|
|
|
(def $plain-password ($ :plain-password))
|
|
|
|
|
(def $input-elems ($ :input-elems))
|
|
|
|
|
(def $dashed-line ($ :dashed-line))
|
|
|
|
|
|
|
|
|
|
; Markdown Converter & Sanitizer instantiation
|
|
|
|
|
(def md-converter (Markdown.Converter.))
|
|
|
|
|
|
|
|
|
|
; instantiate & reset a MD5 hash digester
|
|
|
|
|
(def md5 (goog.crypt.Md5.))
|
|
|
|
|
(.reset md5)
|
|
|
|
|
|
|
|
|
|
; try to detect iOS
|
|
|
|
|
(def ios-detected? (.match (.-userAgent js/navigator) "(iPad|iPod|iPhone)"))
|
|
|
|
|
|
|
|
|
|
(def timer nil)
|
|
|
|
|
|
|
|
|
|
(def timerDelay
|
|
|
|
|
; TODO: also test for Android
|
|
|
|
|
(if ios-detected? 800 400))
|
|
|
|
|
|
|
|
|
|
(defn update-preview
|
|
|
|
|
"Updates the preview"
|
|
|
|
|
[]
|
|
|
|
|
(do
|
|
|
|
|
(js/clearTimeout timer)
|
|
|
|
|
(let [content (val $draft)
|
|
|
|
|
; the delay between the last typing and preview update is dynamic
|
|
|
|
|
; and increases with the length of the text
|
|
|
|
|
delay (Math/min timerDelay (* timerDelay (/ (count content) 400)))]
|
|
|
|
|
(def timer
|
|
|
|
|
(js/setTimeout
|
|
|
|
|
#(do
|
|
|
|
|
(show $dashed-line)
|
|
|
|
|
(show $input-elems)
|
|
|
|
|
(set! (.-innerHTML $preview)
|
|
|
|
|
(.makeHtml md-converter content))) delay)))))
|
|
|
|
|
|
|
|
|
|
; set focus to the draft textarea (if there is one)
|
|
|
|
|
(when $action
|
|
|
|
|
(do
|
|
|
|
|
(if (= "update" (val $action))
|
|
|
|
|
(update-preview)
|
|
|
|
|
(val $draft ""))
|
|
|
|
|
; focus setting is impossible in iOS, so we border the field instead
|
|
|
|
|
(if ios-detected?
|
|
|
|
|
(set! (.-className $draft) (str (.-className $draft) " ui-border"))
|
|
|
|
|
(.focus $draft))))
|
|
|
|
|
|
|
|
|
|
; show the preview & publish buttons as soon as the user starts typing.
|
|
|
|
|
(set! (.-onkeyup $draft) update-preview)
|
|
|
|
|
|
|
|
|
|
; when the publish button is clicked, compute the hash of the entered text and
|
|
|
|
|
; provided session key and assign to the field session-value;
|
|
|
|
|
; moreover, compute the password hash as md5 before transmission
|
|
|
|
|
(set! (.-onclick ($ :publish-button))
|
|
|
|
|
(fn [e]
|
|
|
|
|
(do
|
|
|
|
|
(.update md5 (val $plain-password))
|
|
|
|
|
(val $plain-password nil)
|
|
|
|
|
(when (val $plain-password)
|
|
|
|
|
(val $password (crypt/byteArrayToHex (.digest md5))))
|
|
|
|
|
(val ($ :session-value)
|
|
|
|
|
(lib/hash #(.charCodeAt % 0) (str (val $draft) (val ($ :session-key))))))))
|