require 'browsernizr/test/css/rgba'
require 'browsernizr/test/css/transforms3d'
Modernizr = require 'browsernizr'

require './vendor/mootools.js'

async = require 'async'
ready = require './vendor/ready.js'

now = window.performance?.now?.bind(window.performance) or Date.now

# fallback for browsers not supporting createObjectURL
blobURLSupport = window.URL?.createObjectURL?
buildDataURL = do ->
  charMap = {}
  charMap[i] = String.fromCharCode(i) for i in [0...256]
  return (data) ->
    str = ''
    for i in [0...data.length]
      str += charMap[data[i]]
    return 'data:image/gif;base64,' + btoa(str)

loadImage = (src, callback) ->
  img = new Image()
  img.onload = ->
    callback null, img
  img.onerror = ->
    callback new Error "Could load #{ src }"
  img.src = src

setupDemo = (element) ->
  element.getElements('.hover-buttons li').addEvents
    mouseenter: -> element.addClass @className
    mouseleave: -> element.removeClass @className

  qslider = element.getElement '.quality input'
  qvalue = element.getElement '.quality span'
  renderimg = element.getElement 'img.render'
  logel = element.getElement 'pre'

  gif = new GIF
    quality: 10
    workers: 2

  startTime = null
  gif.on 'start', ->
    startTime = now()

  gif.on 'finished', (blob, data) ->
    if blobURLSupport
      renderimg.src = URL.createObjectURL(blob)
    else
      renderimg.src = buildDataURL(data)
    delta = now() - startTime
    logel.set 'text', "Rendered #{ images.length } frame(s) at q#{ gif.options.quality } in #{ delta.toFixed(2) }ms"

  gif.on 'progress', (p) ->
    logel.set 'text', "Rendering #{ images.length } frame(s) at q#{ gif.options.quality }... #{ Math.round(p * 100) }%"

  images = element.getElements('img.original').map (img) -> img.src
  async.map images, loadImage, (error, images) ->
    throw error if error?
    gif.addFrame image, {delay: 500, copy: true} for image in images
    gif.render()

  qslider.addEvent 'change', ->
    val = 31 - parseInt qslider.value
    qvalue.set 'text', val
    gif.setOption 'quality', val
    gif.abort()
    gif.render()

  delay = element.getElement '.delay'
  if delay?
    delay.getElement('input').addEvent 'change', ->
      value = parseInt this.value
      delay.getElement('.value').set 'text', value + 'ms'
      for frame in gif.frames
        frame.delay = value
      gif.abort()
      gif.render()

  repeat = element.getElement '.repeat'
  if repeat?
    repeat.getElement('input').addEvent 'change', ->
      value = parseInt this.value
      value = -1 if value is 0
      value = 0 if value is 21
      switch value
        when 0
          txt = 'forever'
        when -1
          txt = 'none'
        else
          txt = value
      repeat.getElement('.value').set 'text', txt
      gif.setOption 'repeat', value
      gif.abort()
      gif.render()

ready ->
  for demo in document.body.querySelectorAll '.demo'
    setupDemo demo
