[cleanup] remove coffee script files

This commit is contained in:
caryoscelus 2022-05-31 13:32:47 +04:00
parent fee2a4f2c9
commit 574928e625
50 changed files with 0 additions and 4951 deletions

View file

@ -1,138 +0,0 @@
class Animation
slideDown: (elem, props) ->
if elem.offsetTop > 2000
return
h = elem.offsetHeight
cstyle = window.getComputedStyle(elem)
margin_top = cstyle.marginTop
margin_bottom = cstyle.marginBottom
padding_top = cstyle.paddingTop
padding_bottom = cstyle.paddingBottom
transition = cstyle.transition
elem.style.boxSizing = "border-box"
elem.style.overflow = "hidden"
elem.style.transform = "scale(0.6)"
elem.style.opacity = "0"
elem.style.height = "0px"
elem.style.marginTop = "0px"
elem.style.marginBottom = "0px"
elem.style.paddingTop = "0px"
elem.style.paddingBottom = "0px"
elem.style.transition = "none"
setTimeout (->
elem.className += " animate-inout"
elem.style.height = h+"px"
elem.style.transform = "scale(1)"
elem.style.opacity = "1"
elem.style.marginTop = margin_top
elem.style.marginBottom = margin_bottom
elem.style.paddingTop = padding_top
elem.style.paddingBottom = padding_bottom
), 1
elem.addEventListener "transitionend", ->
elem.classList.remove("animate-inout")
elem.style.transition = elem.style.transform = elem.style.opacity = elem.style.height = null
elem.style.boxSizing = elem.style.marginTop = elem.style.marginBottom = null
elem.style.paddingTop = elem.style.paddingBottom = elem.style.overflow = null
elem.removeEventListener "transitionend", arguments.callee, false
slideUp: (elem, remove_func, props) ->
if elem.offsetTop > 1000
return remove_func()
elem.className += " animate-back"
elem.style.boxSizing = "border-box"
elem.style.height = elem.offsetHeight+"px"
elem.style.overflow = "hidden"
elem.style.transform = "scale(1)"
elem.style.opacity = "1"
elem.style.pointerEvents = "none"
setTimeout (->
elem.style.height = "0px"
elem.style.marginTop = "0px"
elem.style.marginBottom = "0px"
elem.style.paddingTop = "0px"
elem.style.paddingBottom = "0px"
elem.style.transform = "scale(0.8)"
elem.style.borderTopWidth = "0px"
elem.style.borderBottomWidth = "0px"
elem.style.opacity = "0"
), 1
elem.addEventListener "transitionend", (e) ->
if e.propertyName == "opacity" or e.elapsedTime >= 0.6
elem.removeEventListener "transitionend", arguments.callee, false
remove_func()
slideUpInout: (elem, remove_func, props) ->
elem.className += " animate-inout"
elem.style.boxSizing = "border-box"
elem.style.height = elem.offsetHeight+"px"
elem.style.overflow = "hidden"
elem.style.transform = "scale(1)"
elem.style.opacity = "1"
elem.style.pointerEvents = "none"
setTimeout (->
elem.style.height = "0px"
elem.style.marginTop = "0px"
elem.style.marginBottom = "0px"
elem.style.paddingTop = "0px"
elem.style.paddingBottom = "0px"
elem.style.transform = "scale(0.8)"
elem.style.borderTopWidth = "0px"
elem.style.borderBottomWidth = "0px"
elem.style.opacity = "0"
), 1
elem.addEventListener "transitionend", (e) ->
if e.propertyName == "opacity" or e.elapsedTime >= 0.6
elem.removeEventListener "transitionend", arguments.callee, false
remove_func()
showRight: (elem, props) ->
elem.className += " animate"
elem.style.opacity = 0
elem.style.transform = "TranslateX(-20px) Scale(1.01)"
setTimeout (->
elem.style.opacity = 1
elem.style.transform = "TranslateX(0px) Scale(1)"
), 1
elem.addEventListener "transitionend", ->
elem.classList.remove("animate")
elem.style.transform = elem.style.opacity = null
show: (elem, props) ->
delay = arguments[arguments.length-2]?.delay*1000 or 1
elem.style.opacity = 0
setTimeout (->
elem.className += " animate"
), 1
setTimeout (->
elem.style.opacity = 1
), delay
elem.addEventListener "transitionend", ->
elem.classList.remove("animate")
elem.style.opacity = null
elem.removeEventListener "transitionend", arguments.callee, false
hide: (elem, remove_func, props) ->
delay = arguments[arguments.length-2]?.delay*1000 or 1
elem.className += " animate"
setTimeout (->
elem.style.opacity = 0
), delay
elem.addEventListener "transitionend", (e) ->
if e.propertyName == "opacity"
remove_func()
addVisibleClass: (elem, props) ->
setTimeout ->
elem.classList.add("visible")
window.Animation = new Animation()

View file

@ -1,23 +0,0 @@
class Class
trace: true
log: (args...) ->
return unless @trace
return if typeof console is 'undefined'
args.unshift("[#{@.constructor.name}]")
console.log(args...)
@
logStart: (name, args...) ->
return unless @trace
@logtimers or= {}
@logtimers[name] = +(new Date)
@log "#{name}", args..., "(started)" if args.length > 0
@
logEnd: (name, args...) ->
ms = +(new Date)-@logtimers[name]
@log "#{name}", args..., "(Done in #{ms}ms)"
@
window.Class = Class

View file

@ -1,3 +0,0 @@
window.$ = (selector) ->
if selector.startsWith("#")
return document.getElementById(selector.replace("#", ""))

View file

@ -1,26 +0,0 @@
class ItemList
constructor: (@item_class, @key) ->
@items = []
@items_bykey = {}
sync: (rows, item_class, key) ->
@items.splice(0, @items.length) # Empty items
for row in rows
current_obj = @items_bykey[row[@key]]
if current_obj
current_obj.row = row
@items.push current_obj
else
item = new @item_class(row, @)
@items_bykey[row[@key]] = item
@items.push item
deleteItem: (item) ->
index = @items.indexOf(item)
if index > -1
@items.splice(index, 1)
else
console.log "Can't delete item", item
delete @items_bykey[item.row[@key]]
window.ItemList = ItemList

View file

@ -1,110 +0,0 @@
class Menu
constructor: ->
@visible = false
@items = []
@node = null
@height = 0
@direction = "bottom"
show: =>
window.visible_menu?.hide()
@visible = true
window.visible_menu = @
@direction = @getDirection()
hide: =>
@visible = false
toggle: =>
if @visible
@hide()
else
@show()
Page.projector.scheduleRender()
addItem: (title, cb, selected=false) ->
@items.push([title, cb, selected])
storeNode: (node) =>
@node = node
# Animate visible
if @visible
node.className = node.className.replace("visible", "")
setTimeout (=>
node.className += " visible"
node.attributes.style.value = @getStyle()
), 20
node.style.maxHeight = "none"
@height = node.offsetHeight
node.style.maxHeight = "0px"
@direction = @getDirection()
getDirection: =>
if @node and @node.parentNode.getBoundingClientRect().top + @height + 60 > document.body.clientHeight and @node.parentNode.getBoundingClientRect().top - @height > 0
return "top"
else
return "bottom"
handleClick: (e) =>
keep_menu = false
for item in @items
[title, cb, selected] = item
if title == e.currentTarget.textContent or e.currentTarget["data-title"] == title
keep_menu = cb?(item)
break
if keep_menu != true and cb != null
@hide()
return false
renderItem: (item) =>
[title, cb, selected] = item
if typeof(selected) == "function"
selected = selected()
if title == "---"
return h("div.menu-item-separator", {key: Time.timestamp()})
else
if cb == null
href = undefined
onclick = @handleClick
else if typeof(cb) == "string" # Url
href = cb
onclick = true
else # Callback
href = "#"+title
onclick = @handleClick
classes = {
"selected": selected,
"noaction": (cb == null)
}
return h("a.menu-item", {href: href, onclick: onclick, "data-title": title, key: title, classes: classes}, title)
getStyle: =>
if @visible
max_height = @height
else
max_height = 0
style = "max-height: #{max_height}px"
if @direction == "top"
style += ";margin-top: #{0 - @height - 50}px"
else
style += ";margin-top: 0px"
return style
render: (class_name="") =>
if @visible or @node
h("div.menu#{class_name}", {classes: {"visible": @visible}, style: @getStyle(), afterCreate: @storeNode}, @items.map(@renderItem))
window.Menu = Menu
# Hide menu on outside click
document.body.addEventListener "mouseup", (e) ->
if not window.visible_menu or not window.visible_menu.node
return false
menu_node = window.visible_menu.node
menu_parents = [menu_node, menu_node.parentNode]
if e.target.parentNode not in menu_parents and e.target.parentNode.parentNode not in menu_parents
window.visible_menu.hide()
Page.projector.scheduleRender()

View file

@ -1,74 +0,0 @@
# From: http://dev.bizo.com/2011/12/promises-in-javascriptcoffeescript.html
class Promise
@when: (tasks...) ->
num_uncompleted = tasks.length
args = new Array(num_uncompleted)
promise = new Promise()
for task, task_id in tasks
((task_id) ->
task.then(() ->
args[task_id] = Array.prototype.slice.call(arguments)
num_uncompleted--
promise.complete.apply(promise, args) if num_uncompleted == 0
)
)(task_id)
return promise
constructor: ->
@resolved = false
@end_promise = null
@result = null
@callbacks = []
resolve: ->
if @resolved
return false
@resolved = true
@data = arguments
if not arguments.length
@data = [true]
@result = @data[0]
for callback in @callbacks
back = callback.apply callback, @data
if @end_promise
@end_promise.resolve(back)
fail: ->
@resolve(false)
then: (callback) ->
if @resolved == true
callback.apply callback, @data
return
@callbacks.push callback
@end_promise = new Promise()
window.Promise = Promise
###
s = Date.now()
log = (text) ->
console.log Date.now()-s, Array.prototype.slice.call(arguments).join(", ")
log "Started"
cmd = (query) ->
p = new Promise()
setTimeout ( ->
p.resolve query+" Result"
), 100
return p
back = cmd("SELECT * FROM message").then (res) ->
log res
return "Return from query"
.then (res) ->
log "Back then", res
log "Query started", back
###

View file

@ -1,9 +0,0 @@
String::startsWith = (s) -> @[...s.length] is s
String::endsWith = (s) -> s is '' or @[-s.length..] is s
String::repeat = (count) -> new Array( count + 1 ).join(@)
window.isEmpty = (obj) ->
for key of obj
return false
return true

View file

@ -1,62 +0,0 @@
last_time = {}
calling = {}
calling_iterval = {}
call_after_interval = {}
# Rate limit function call and don't allow to run in parallel (until callback is called)
window.RateLimitCb = (interval, fn, args=[]) ->
cb = -> # Callback when function finished
left = interval - (Date.now() - last_time[fn]) # Time life until next call
# console.log "CB, left", left, "Calling:", calling[fn]
if left <= 0 # No time left from rate limit interval
delete last_time[fn]
if calling[fn] # Function called within interval
RateLimitCb(interval, fn, calling[fn])
delete calling[fn]
else # Time left from rate limit interval
setTimeout (->
delete last_time[fn]
if calling[fn] # Function called within interval
RateLimitCb(interval, fn, calling[fn])
delete calling[fn]
), left
if last_time[fn] # Function called within interval
calling[fn] = args # Schedule call and update arguments
else # Not called within interval, call instantly
last_time[fn] = Date.now()
fn.apply(this, [cb, args...])
window.RateLimit = (interval, fn) ->
if calling_iterval[fn] > interval
clearInterval calling[fn]
delete calling[fn]
if not calling[fn]
call_after_interval[fn] = false
fn() # First call is not delayed
calling_iterval[fn] = interval
calling[fn] = setTimeout (->
if call_after_interval[fn]
fn()
delete calling[fn]
delete call_after_interval[fn]
), interval
else # Called within iterval, delay the call
call_after_interval[fn] = true
###
window.s = Date.now()
window.load = (done, num) ->
console.log "Loading #{num}...", Date.now()-window.s
setTimeout (-> done()), 1000
RateLimit 500, window.load, [0] # Called instantly
RateLimit 500, window.load, [1]
setTimeout (-> RateLimit 500, window.load, [300]), 300
setTimeout (-> RateLimit 500, window.load, [600]), 600 # Called after 1000ms
setTimeout (-> RateLimit 500, window.load, [1000]), 1000
setTimeout (-> RateLimit 500, window.load, [1200]), 1200 # Called after 2000ms
setTimeout (-> RateLimit 500, window.load, [3000]), 3000 # Called after 3000ms
###

View file

@ -1,147 +0,0 @@
class Text
toColor: (text, saturation=30, lightness=50) ->
hash = 0
for i in [0..text.length-1]
hash += text.charCodeAt(i)*i
hash = hash % 1777
return "hsl(" + (hash % 360) + ",#{saturation}%,#{lightness}%)";
renderMarked: (text, options={}) ->
options["gfm"] = true
options["breaks"] = true
options["sanitize"] = true
options["renderer"] = marked_renderer
text = marked(text, options)
return @fixHtmlLinks text
emailLinks: (text) ->
return text.replace(/([a-zA-Z0-9]+)@zeroid.bit/g, "<a href='?to=$1' onclick='return Page.message_create.show(\"$1\")'>$1@zeroid.bit</a>")
# Convert zeronet html links to relaitve
fixHtmlLinks: (text) ->
if window.is_proxy
return text.replace(/href="http:\/\/(127.0.0.1|localhost):43110/g, 'href="http://zero')
else
return text.replace(/href="http:\/\/(127.0.0.1|localhost):43110/g, 'href="')
# Convert a single link to relative
fixLink: (link) ->
if window.is_proxy
back = link.replace(/http:\/\/(127.0.0.1|localhost):43110/, 'http://zero')
return back.replace(/http:\/\/zero\/([^\/]+\.bit)/, "http://$1") # Domain links
else
return link.replace(/http:\/\/(127.0.0.1|localhost):43110/, '')
toUrl: (text) ->
return text.replace(/[^A-Za-z0-9]/g, "+").replace(/[+]+/g, "+").replace(/[+]+$/, "")
getSiteUrl: (address) ->
if window.is_proxy
if "." in address # Domain
return "http://"+address+"/"
else
return "http://zero/"+address+"/"
else
return "/"+address+"/"
fixReply: (text) ->
return text.replace(/(>.*\n)([^\n>])/gm, "$1\n$2")
toBitcoinAddress: (text) ->
return text.replace(/[^A-Za-z0-9]/g, "")
jsonEncode: (obj) ->
return unescape(encodeURIComponent(JSON.stringify(obj)))
jsonDecode: (obj) ->
return JSON.parse(decodeURIComponent(escape(obj)))
fileEncode: (obj) ->
if typeof(obj) == "string"
return btoa(unescape(encodeURIComponent(obj)))
else
return btoa(unescape(encodeURIComponent(JSON.stringify(obj, undefined, '\t'))))
utf8Encode: (s) ->
return unescape(encodeURIComponent(s))
utf8Decode: (s) ->
return decodeURIComponent(escape(s))
distance: (s1, s2) ->
s1 = s1.toLocaleLowerCase()
s2 = s2.toLocaleLowerCase()
next_find_i = 0
next_find = s2[0]
match = true
extra_parts = {}
for char in s1
if char != next_find
if extra_parts[next_find_i]
extra_parts[next_find_i] += char
else
extra_parts[next_find_i] = char
else
next_find_i++
next_find = s2[next_find_i]
if extra_parts[next_find_i]
extra_parts[next_find_i] = "" # Extra chars on the end doesnt matter
extra_parts = (val for key, val of extra_parts)
if next_find_i >= s2.length
return extra_parts.length + extra_parts.join("").length
else
return false
parseQuery: (query) ->
params = {}
parts = query.split('&')
for part in parts
[key, val] = part.split("=")
if val
params[decodeURIComponent(key)] = decodeURIComponent(val)
else
params["url"] = decodeURIComponent(key)
return params
encodeQuery: (params) ->
back = []
if params.url
back.push(params.url)
for key, val of params
if not val or key == "url"
continue
back.push("#{encodeURIComponent(key)}=#{encodeURIComponent(val)}")
return back.join("&")
highlight: (text, search) ->
if not text
return [""]
parts = text.split(RegExp(search, "i"))
back = []
for part, i in parts
back.push(part)
if i < parts.length-1
back.push(h("span.highlight", {key: i}, search))
return back
formatSize: (size) ->
if isNaN(parseInt(size))
return ""
size_mb = size/1024/1024
if size_mb >= 1000
return (size_mb/1024).toFixed(1)+" GB"
else if size_mb >= 100
return size_mb.toFixed(0)+" MB"
else if size/1024 >= 1000
return size_mb.toFixed(2)+" MB"
else
return (parseInt(size)/1024).toFixed(2)+" KB"
window.is_proxy = (document.location.host == "zero" or window.location.pathname == "/")
window.Text = new Text()

View file

@ -1,59 +0,0 @@
class Time
since: (timestamp) ->
now = +(new Date)/1000
if timestamp > 1000000000000 # In ms
timestamp = timestamp/1000
secs = now - timestamp
if secs < 60
back = "Just now"
else if secs < 60*60
minutes = Math.round(secs/60)
back = "" + minutes + " minutes ago"
else if secs < 60*60*24
back = "#{Math.round(secs/60/60)} hours ago"
else if secs < 60*60*24*3
back = "#{Math.round(secs/60/60/24)} days ago"
else
back = "on "+@date(timestamp)
back = back.replace(/^1 ([a-z]+)s/, "1 $1") # 1 days ago fix
return back
dateIso: (timestamp=null) ->
if not timestamp
timestamp = window.Time.timestamp()
if timestamp > 1000000000000 # In ms
timestamp = timestamp/1000
tzoffset = (new Date()).getTimezoneOffset() * 60
return (new Date((timestamp - tzoffset) * 1000)).toISOString().split("T")[0]
date: (timestamp=null, format="short") ->
if not timestamp
timestamp = window.Time.timestamp()
if timestamp > 1000000000000 # In ms
timestamp = timestamp/1000
parts = (new Date(timestamp * 1000)).toString().split(" ")
if format == "short"
display = parts.slice(1, 4)
else if format == "day"
display = parts.slice(1, 3)
else if format == "month"
display = [parts[1], parts[3]]
else if format == "long"
display = parts.slice(1, 5)
return display.join(" ").replace(/( [0-9]{4})/, ",$1")
weekDay: (timestamp) ->
if timestamp > 1000000000000 # In ms
timestamp = timestamp/1000
return ["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][ (new Date(timestamp * 1000)).getDay() ]
timestamp: (date="") ->
if date == "now" or date == ""
return parseInt(+(new Date)/1000)
else
return parseInt(Date.parse(date)/1000)
window.Time = new Time

View file

@ -1,85 +0,0 @@
class ZeroFrame extends Class
constructor: (url) ->
@url = url
@waiting_cb = {}
@wrapper_nonce = document.location.href.replace(/.*wrapper_nonce=([A-Za-z0-9]+).*/, "$1")
@connect()
@next_message_id = 1
@history_state = {}
@init()
init: ->
@
connect: ->
@target = window.parent
window.addEventListener("message", @onMessage, false)
@cmd("innerReady")
# Save scrollTop
window.addEventListener "beforeunload", (e) =>
@log "save scrollTop", window.pageYOffset
@history_state["scrollTop"] = window.pageYOffset
@cmd "wrapperReplaceState", [@history_state, null]
# Restore scrollTop
@cmd "wrapperGetState", [], (state) =>
@history_state = state if state?
@log "restore scrollTop", state, window.pageYOffset
if window.pageYOffset == 0 and state
window.scroll(window.pageXOffset, state.scrollTop)
onMessage: (e) =>
message = e.data
cmd = message.cmd
if cmd == "response"
if @waiting_cb[message.to]?
@waiting_cb[message.to](message.result)
else
@log "Websocket callback not found:", message
else if cmd == "wrapperReady" # Wrapper inited later
@cmd("innerReady")
else if cmd == "ping"
@response message.id, "pong"
else if cmd == "wrapperOpenedWebsocket"
@onOpenWebsocket()
else if cmd == "wrapperClosedWebsocket"
@onCloseWebsocket()
else
@onRequest cmd, message.params
onRequest: (cmd, message) =>
@log "Unknown request", message
response: (to, result) ->
@send {"cmd": "response", "to": to, "result": result}
cmd: (cmd, params={}, cb=null) ->
@send {"cmd": cmd, "params": params}, cb
send: (message, cb=null) ->
message.wrapper_nonce = @wrapper_nonce
message.id = @next_message_id
@next_message_id += 1
@target.postMessage(message, "*")
if cb
@waiting_cb[message.id] = cb
onOpenWebsocket: =>
@log "Websocket open"
onCloseWebsocket: =>
@log "Websocket close"
window.ZeroFrame = ZeroFrame