/*
-----------------------------------------------
xxx javascript
version: 2006.07.26
The code is occasionally ridiculous. sic
----------------------------------------------- */


/* this file requires Prototype to be preloaded
----------------------------------------------- */
    if((typeof Prototype=='undefined') || 
       (typeof Element == 'undefined') || 
       (typeof Element.Methods=='undefined') ||
       parseFloat(Prototype.Version.split(".")[0] + "." +
                  Prototype.Version.split(".")[1]) < 1.5)
       throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");

/* Client 
----------------------------------------------- */      
	
/* Extending Prototype generated Objects
----------------------------------------------- */
	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);
		}
	});
	
/* 
----------------------------------------------- */ 
  Object.extend(Field, {
    getLabel: function(element) {
      element = $(element);
      var labels = document.getElementsByTagName('label');
      for (var i = 0; i < labels.length; i++) { 
        if (labels[i].htmlFor &&
            labels[i].htmlFor == element.id) { 
              return $(labels[i]); 
        } 
      } 
      return false; 
    },
    getLabelText: function(element) {
      return $(Field.getLabel(element)).firstChild.nodeValue.strip();
    }
  });

  Element.addMethods({
    substituteClassName: function(element, classNameOld, classNameNew) {
      element = $(element);
      element.removeClassName(classNameOld);
      element.addClassName(classNameNew);      
      return element;
    }
  });/**/
	
/* Extending predefined Objects
----------------------------------------------- */


/* Extending Effect Object
----------------------------------------------- */
  

/*
----------------------------------------------- 
----------------------------------------------- */
   
/* (Helper)
----------------------------------------------- */

  var Cookie = {
    createCookie: function(name, value, days) {
      var expires = '';
      if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
      }
      
      document.cookie = name+"="+value+expires+"; path=/";
    },
  
    getCookie: function(name) {
      var start, stop, value;
    
      if (!document.cookie) return false;
      if (document.cookie.indexOf(name) == -1) return false;
      
      start = document.cookie.indexOf(name+'=') + name.length+1;
      stop  = (document.cookie.indexOf(';', start) != -1) 
      	? document.cookie.indexOf(';', start) 
      	: document.cookie.length+1;
      value = unescape(document.cookie.substring(start, stop));
    
      return value;
    },
    
    eraseCookie: function(name) {
      Cookie.createCookie(name, '', -1);
    }
  }
   
/*------------------------------------------------ 
   Dom Scripts
----------------------------------------------- */


/* smoothScroller Maker
----------------------------------------------- */
  function makeScrollers() {
    var hasEffectLib = (typeof Effect != 'undefined') ? true : false;
    if (!hasEffectLib) return;
    
    var anchars = $$('a').findAll(function(a) {
      return (   a.href && a.href.indexOf('#') != -1 
              && (a.pathname == location.pathname || '/'+a.pathname == location.pathname) 
              && a.search == location.search);
    });    
    anchars.each(function(element) {
      $(element).observe('click', function(e) { 
        new Effect.ScrollTo(Event.findElement(e, 'a').hash.substr(1));
        Event.stop(e);            
      }, false);
    });
  }
    
/* Table-Ruler Maker
----------------------------------------------- */
  function makeTablesrulers() {
    $$('tbody').each(function(element) {
      $A(element.getElementsByTagName('tr')).each(function(element, i) {
        $(element).removeClassName((i%2 == '0' ? 'even'   : 'uneven')); 
        $(element).addClassName(   (i%2 == '0' ? 'uneven' : 'even'));  
        $(element).observe('mouseover', function(e) { $(Event.findElement(e, 'tr')).addClassName('hilite');    }, false);  
        $(element).observe('mouseout',  function(e) { $(Event.findElement(e, 'tr')).removeClassName('hilite'); }, false);  
        $(element).observe('click',     function(e) { 
          if (Event.findElement(e, 'tr').hasClassName('selected')) {
            $(Event.findElement(e, 'tr')).removeClassName('selected');
          } else {
            $(Event.findElement(e, 'tr')).addClassName('selected');
          }        
        }, false);
      });
    });
  }

/* Label-to-Element-Highlighter Maker
----------------------------------------------- */
  function makeLabelToElementHighlighters() {    
    $$('label').each(function(element) {
      $(element).observe(         'mouseover', function(e) { $(Event.element(e).htmlFor).addClassName('hilite');    }, false);
      $(element).observe(         'focus',     function(e) { $(Event.element(e).htmlFor).addClassName('hilite');    }, false);
      // safari is such a pussy!!!!!
      $(element).observe(         'mouseout',  function(e) { $(Event.findElement(e, 'label').htmlFor).removeClassName('hilite'); }, false);
      $(element).observe(         'blur',      function(e) { $(Event.element(e).htmlFor).removeClassName('hilite'); }, false);

      $(element.htmlFor).observe('mouseover', function(e) { if (Field.getLabel(Event.element(e))) Field.getLabel(Event.element(e)).addClassName('hilite');    }, false);
      $(element.htmlFor).observe('focus',     function(e) { if (Field.getLabel(Event.element(e))) Field.getLabel(Event.element(e)).addClassName('hilite');    }, false);
      $(element.htmlFor).observe('mouseout',  function(e) { if (Field.getLabel(Event.element(e))) Field.getLabel(Event.element(e)).removeClassName('hilite'); }, false);
      $(element.htmlFor).observe('blur',      function(e) { if (Field.getLabel(Event.element(e))) Field.getLabel(Event.element(e)).removeClassName('hilite'); }, false);
    });
  }
    
/* Option-Ruler Maker
----------------------------------------------- */
  function makeOptionsrulers() {
    $$('select').each(function(select) {
      $A(select.getElementsByTagName('option')).each(function(element, i) {
        $(element).removeClassName((i%2 == '0' ? 'even'   : 'uneven'));
        $(element).addClassName(   (i%2 == '0' ? 'uneven' : 'even'));
      });
    });
  }
  
/* External-Link Windowmaker
----------------------------------------------- */
  function makeLinksexternal() {
    var regex1 = new RegExp('external', 'i');
    var regex2 = new RegExp('^'+location.protocol+'//'+location.hostname, 'i');
    
    $$('a').each(function(element) {
      if ( regex1.test(element.rel)  &&
          !regex2.test(element.href) &&
          element.rel != 'service') {
            element.onclick = function() { window.open(this.href, 'external'); return false; };
      }    
    }); 
  }
  
/* Download-Link Maker
----------------------------------------------- */
  function makeLinksdownload() {
    var regex1 = new RegExp('enclosure', 'i');
    var regex2 = new RegExp('^'+location.protocol+'//'+location.hostname, 'i');

    $$('a').each(function(element) {
      if ( regex1.test(element.rel)  &&
          !regex2.test(element.href)   ) {
            element.onclick = function() { 
            	window.location = '?action=download&file='+encodeURIComponent(this.href); 
            	return false; 
            };
      }    
    });
  }
  
  

/*------------------------------------------------ 
   xhr
----------------------------------------------- */  
	  
	var Loader = Class.create();
	Loader.prototype = {
  
    initialize: function(element) {
			this.element = $(element);
			this.createLoader();
			this.startLoading();
		},
		
		createLoader: function() {
			this.loader = document.createElement('span');
			this.loader.className = 'loader';
			this.element.parentNode.appendChild(this.loader);
		},
	
		startLoading: function() {
			this._interval = window.setInterval(
      function() {
        var html = this.loader.innerHTML;
        this.loader.update(html.length > 2 ? '' : html + '.');
      }.bind(this), 100)
		},
  
		destroyLoader: function() {
    	window.clearInterval(this._interval);
    	this.loader.remove();
		}
  }
