var INTHEDARK = 0.8;
var INTHELIGHT = 0.0;

function prepareUnderlay(opacity) {
  window.underlay = $(document.createElement('div'));

  window.underlay.setStyle({
    background: 'black',
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
    minHeight: '100%',
    zIndex: 5
  });

  Element.setOpacity(window.underlay, opacity ? opacity : INTHELIGHT);

  var parent = $(document.body).down('.container');
  parent.insertBefore(window.underlay, parent.firstChild);
  resizeUnderlay();
  Event.observe(window, 'resize', resizeUnderlay);
  Event.observe(window, 'load', resizeUnderlay);
}

function resizeUnderlay() {
  var x,y;
  if (window.innerHeight && window.scrollMaxY) {  
    y = window.innerHeight + window.scrollMaxY;
  } else if (document.body.scrollHeight > document.body.offsetHeight) { 
    y = document.body.scrollHeight;
  } else { 
    y = document.body.offsetHeight;
  }
  x = Math.max(document.body.offsetWidth, document.body.scrollWidth);

  window.underlay.setStyle({width: x + "px", height: y + "px"});
}

function glimmer() {
  lightSequence(
    window.underlay,
    INTHEDARK,
    [ 
      {pause: 0.3, and: switchOn},
      {fade: 0.4, to: 0.2, and: turnLightOn},
      {snap: 0.6, to: 0.8, and: turnLightOff},
      {snap: 0.4, to: 0.4, and: turnLightOn},
      {snap: 0.3, to: 0.7, and: turnLightOff},
      {snap: 0.1, to: INTHELIGHT, and: turnLightOn}
    ]
  )();
}

function dissipate() {
  lightSequence(
    window.underlay,
    INTHELIGHT,
    [{pause: 0.1, and: switchOff},{fade: 0.3, to: INTHEDARK, and: turnLightOff}]
  )();
}

function lightSequence(elem, start, arr) {
  if (arr.length == 0) { return function () {} }
  var params = arr.shift();
  return function () {
    if (params.pause) {
      setTimeout(lightSequence(elem, start, arr), params.pause * 1000);
    } else if (params.snap) {
      Element.setOpacity(elem, params.to);
      setTimeout(lightSequence(elem, params.to, arr), params.snap * 1000);
    } else if (params.fade) {
      new Effect.Opacity(
        elem,
        {
          duration: params.fade,
          from: start,
          to: params.to,
          afterFinish: lightSequence(elem, params.to, arr)
        }
      );
    } else {
      lightSequence(elem, start, arr);
    }

    if (params.and) {
      params.and();
    }
  }
}

function turnLightOn() {
  darkStylesheet().disabled = true;
}

function turnLightOff() {
  darkStylesheet().disabled = false;
}

function switchOn() {
  $('switch').src = "/static/images/switch_on.gif"; 
}

function switchOff() {
  $('switch').src = "/static/images/switch_off.gif"; 
}

function darkStylesheet() {
  return $$('link[rel="stylesheet"]')[1];
}

function toggleLights() {
  if (!window.underlay) {alert('Sorry, this switch is dysfunctional!'); return;}

  if (window.underlay.getOpacity() > INTHELIGHT) {
    glimmer();
    uStyle.set('bright');
  } else {
    dissipate();
    uStyle.set('dark');
  }
}

function initialiseStyle() {
  if (typeof isHomepage != 'undefined' && !uStyle.get()) {
    switchOff();
    turnLightOff();
    prepareUnderlay(INTHEDARK);
    Event.observe(window, 'load', glimmer);
    uStyle.set('bright');
  } else if (uStyle.get() == 'dark') {
    switchOff();
    turnLightOff();
    prepareUnderlay(INTHEDARK);
  } else {
    switchOn();
    turnLightOn();
    prepareUnderlay(INTHELIGHT);
  }
}
