// Adapted from DOM Ready extension by Dan Webb
// http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
// which was based on work by Matthias Miller, Dean Edwards and John Resig
//
// Usage:
//
// Event.onReady(callbackFunction);
Object.extend(Event, {
  _domReady: function() {
    if (arguments.callee.done) {
      return
    };
    arguments.callee.done = true;

    if (Event._timer) {
      clearInterval(Event._timer);
    }

    Event._readyCallbacks.each(function(f) { f() });
    Event._readyCallbacks = null;
  },

  onReady: function(f) {
    if (!this._readyCallbacks) {
      var domReady = this._domReady;

      if (domReady.done) {
        return f();
      }

      if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", domReady, false);
      }

      /*@cc_on @*/
      /*@if (@_win32)
      var dummy = location.protocol == "https:" ?  "https://javascript:void(0)" : "javascript:void(0)";
      document.write("<script id=__ie_onload defer src='" + dummy + "'><\/script>");
      document.getElementById("__ie_onload").onreadystatechange = function() {
        if (this.readyState == "complete") {
          domReady();
        }
      };
      /*@end @*/

      if (/WebKit/i.test(navigator.userAgent)) {
        this._timer = setInterval(function() {
          if (/loaded|complete/.test(document.readyState)) {
            domReady();
          }
        }, 10);
      }

      Event.observe(window, 'load', domReady);
      Event._readyCallbacks = [];
    }
    Event._readyCallbacks.push(f);
  }
});

// The Disstill namespace
var Disstill = function () {
  // CSS style class names
  var CLASS = {
    MIN_DIGGS : 'minDiggs',
    FLOAT_LEFT: 'floatLeft',
    DEFAULT   : 'default'
  };

  // HTML id attributes
  var ID = {
    SLIDER           : 'slider',
    SLIDER_HANDLE_MIN: 'sliderHandleMin',
    LABEL_MIN        : 'labelMin',
    LABEL_MAX        : 'labelMax',
    GET_FEED         : 'getFeed',
    GET_HTML         : 'getHtml',
    DIGG_BUTTON_MIN  : 'diggButtonMin',
    HOME             : 'home',
    RESULTS          : 'min',
    KEYWORD_INPUT    : 'keywordInput',
    KEYWORD_FORM     : 'keywordForm'
  };

  var URL = {
    PATH_PREFIX: '/digg_stories/min/',
    GOAL_PREFIX: '/goal'
  };

  // Add the slider to the home and results pages
  var sliderDiv = $(ID.SLIDER);
  if (sliderDiv) {
    var values      = [];
    var MIN         = 0;
    var MAX         = 5000;
    var DEFAULT_MIN = 1000;
    var INCREMENT   = 100;

    sliderDiv.show();

    $(ID.LABEL_MIN).innerHTML = MIN;
    $(ID.LABEL_MAX).innerHTML = MAX;

    for (var i = MIN; i <= MAX; i += INCREMENT) {
      values.push(i);
    }

    // Parses the min/max diggs from /digg_stories/xxx.html
    function parseResultsUrl() {
      var minDiggs, maxDiggs;
      document.location.href.scan(/\/min\/(\d+)?(\.html)?/, function(match) {
        // ["/4600.html", 4600]
        minDiggs = match[1];
      });

      return minDiggs;
    }

    var parsedResultsUrl = parseResultsUrl();
    var defaultMin = parsedResultsUrl || DEFAULT_MIN;

    function trackClick(e) {
      urchinTracker(URL.GOAL_PREFIX + Event.element(e).getAttribute('href'));
    }

    var sliderValue; // Closure required so keyword input can get slider value
                     // (no getValue method on the slider grrr)

    function hrefUpdate(v) {
      var sliderMin = v || sliderValue;
      sliderValue = sliderMin;
      document.getElementsByClassName(CLASS.MIN_DIGGS).each(function(element) {
        element.innerHTML = sliderMin;
      });
      if ($(ID.HOME)) {
        // On homepage
        var getHtml = $(ID.GET_HTML);
        var getFeed = $(ID.GET_FEED);
        var htmlHref, feedHref, urchinValue;
        htmlHref = feedHref = URL.PATH_PREFIX + sliderMin;
        urchinValue = URL.TRACK_FEED + sliderMin;
        getHtml.href = htmlHref;
        getFeed.href = feedHref + '.xml';

        var keywordInput = $(ID.KEYWORD_INPUT);
        var keywordInputValue = keywordInput.value;
        if (keywordInputValue !== keywordInput.defaultValue) {
          keywordInputValue = '?q=' + keywordInputValue
          getHtml.href += keywordInputValue;
          getFeed.href += keywordInputValue;
        }

        // Track feed subscriptions
        getFeed.observe('click', trackClick);
      }
    }

    hrefUpdate(defaultMin);

    (new Control.Slider([ ID.SLIDER_HANDLE_MIN ], sliderDiv, {
      range      : $R(0, MAX),
      values     : values,
      sliderValue: defaultMin,
      onSlide    : hrefUpdate,
      onChange   : function (v) {
        hrefUpdate(v);
        var urlRegex = new RegExp(URL.PATH_PREFIX + '\\d+');
        if ($(ID.RESULTS)) {
          // On results page
          document.location = document.location.href.replace(urlRegex, URL.PATH_PREFIX + v);
        }
      }
    }));
  }

  if ($(ID.HOME)) {
    // On homepage
    var keywordInput = $(ID.KEYWORD_INPUT);
    var defaultKeywordInputValue = keywordInput.defaultValue;
    if (keywordInput.value === defaultKeywordInputValue) {
      keywordInput.addClassName(CLASS.DEFAULT);
    }
    keywordInput.observe('focus', function () {
      if (this.value === defaultKeywordInputValue) {
        this.clear();
        this.removeClassName(CLASS.DEFAULT);
      } 
    });
    keywordInput.observe('blur', function () {
      if (this.value === '') {
        this.value = defaultKeywordInputValue;
        this.addClassName(CLASS.DEFAULT);
      } 
    });
    keywordInput.observe('keyup', function () {
      hrefUpdate(); 
    });
    keywordInput.observe('keydown', function (e) {
      if (e.keyCode === Event.KEY_RETURN) {
        Event.stop(e);
        document.location = $(ID.GET_HTML).href;
      }
    });

    keywordForm.observe('submit', function (e) {
      Event.stop(e);
    });
  }
};

// Fire up the Disstill application when the DOM is ready
Event.onReady(Disstill);
