var Distributor = {
  debug: false,
  
  els : [],
  
  handleElement: function(el) {
    if (this.els.length == 0) {
      this.onDomReady(this.startup);
    }
    this.els.push(el);
  },
  
  startup: function() {
    for (var i=0; i<Distributor.els.length; i++) {
      Distributor.distributeElement.call(Distributor, Distributor.els[i]);
    }
  },
  
  calcElementWidth: function(el) {
    var oldWidthStyle = el.style.width;
    el.style.width = "200px";
    var offsetWidth = el.offsetWidth;
    el.style.width = oldWidthStyle;
    return el.offsetWidth - (offsetWidth - 200);
  },
  
  distributeElement: function(el) {
    if (typeof(el) == 'string') {
      el = document.getElementById(el);
    }
    
    var kids = [];
    var children = el.childNodes;
    var i;
    var cumlW = 0;
    
    //alert("Element has " + children.length + " children");
    
    // Make copies of all the real child nodes [not whitespace / text]
    for (i=0; i<children.length; i++) {
      if (children[i].nodeType == 1) {
        children[i].style.marginLeft = children[i].style.marginRight = "0px";
        children[i].style.paddingLeft = children[i].style.paddingRight = "0px";
        /*children[i].style.borderLeftWidth = children[i].style.borderRightWidth = "0px";*/
        kids.push(children[i].cloneNode(true));
        cumlW += children[i].offsetWidth;
      }
    }
    if (kids.length == 0) {
      return;
    }
    
    totalW = this.calcElementWidth(el);
    
    if (cumlW > totalW) {
      for (i=0; i<children.length; i++) {
        if (children[i].nodeType == 1) {
           children[i].style.marginLeft = children[i].style.marginRight = "";
           children[i].style.paddingLeft = children[i].style.paddingRight = "";
           /*children[i].style.borderLeftWidth = children[i].style.borderRightWidth = "";*/
        }
      }
      return;
    }
    
    var spacing = Math.floor((totalW - cumlW) / (kids.length-1));
    var remainder = (totalW - cumlW) - (kids.length-1) * spacing;
    
    //alert("Total width = " + totalW + "\nSpacing=" + spacing + "\nRemainder = " + remainder);
    
    var kidPadding = [];
    
    for (i=0; i<kids.length; i++) {
      kidPadding[i] = [ Math.floor(spacing/2), Math.ceil(spacing/2) ];
    }
    // First element has no left padding
    kidPadding[0][0] = 0;
    // Last element has no right padding
    kidPadding[kids.length-1][1] = 0;
    // Last element gets remainder on left
    kidPadding[kids.length-1][0] += remainder;
    
    //alert(kidPadding.toString());
    
    // Apply padding
    for (i=0; i<kids.length; i++) {
      kids[i].style.paddingLeft = Math.max(0,kidPadding[i][0]-1) + 'px';
      kids[i].style.paddingRight = kidPadding[i][1] + 'px';
      /*
      if (this.debug) {
        kids[i].style.borderColor = (i % 2 == 0) ? 'red' : 'blue';
      }
      */
    }
    
    // Remove all children from parent
    while (el.childNodes.length > 0) {
      el.removeChild(el.childNodes[0]);
    }
    
    //alert("Adding kids now...");
    
    // Add all the new kids
    for (i=0; i<kids.length; i++) {
      el.appendChild(kids[i]);
    }
  },
  
	addEvent: function(elm, evType, fn, useCapture){
		if (elm.addEventListener)
		{
			elm.addEventListener(evType, fn, useCapture);
			return true;
		} else if (elm.attachEvent) {
			var r = elm.attachEvent('on' + evType, fn);
			return r;
		} else {
			elm['on' + evType] = fn;
		}
	},

	_domReady: function() {
    if (this._readyDone) {
      return;
    }
    this._readyDone = true;

    if (this._timer) { clearInterval(this._timer); this._timer = false; }

    for (var i=0; i<this._readyCallbacks.length; i++) {
      (function(f) { f(); })(this._readyCallbacks[i]);
    }
	},

	onDomReady: function(fn) {
    if (!this._readyCallbacks) {
      this._readyDone = false;
      this._readyCallbacks = [];
      
      var _domReadyFn = function() {
        Distributor._domReady.call(Distributor);
      };

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

      /*@cc_on @*/
      /*@if (@_win32)
          document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
          document.getElementById("__ie_onload").onreadystatechange = function() {
              if (this.readyState == "complete") _domReadyFn();
          };
      /*@end @*/

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

      this.addEvent(window, 'load', _domReadyFn, false);
    }
    this._readyCallbacks[this._readyCallbacks.length] = fn;
	}
};