
/*
   Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
   of Simon Willison (see comments by Simon below).

   Description:
    
     Uses css selectors to apply javascript behaviours to enable
     unobtrusive javascript in html documents.

   Usage:   
   
     var myRules = {
       'div' : function(element){
        	element.onclick = function() {
			alert('foo');
		}
       },

       '#somediv':  function(element){
        	element.onclick = function() {
			alert('bar');  
		}
       }
     };

     Behaviour.register(myRules);
  
  // Call Behaviour.apply() to re-apply the rules (if you
  // update the dom, etc).

   License:
   
   This file is entirely BSD licensed.
    
   More information:
    
    http://ripcord.co.nz/behaviour/  < this doesn't exist anymore
*/


// jQuery version Modified by Artur Grabowski <majest.pl@gmail.com>
// http://web-madness.blogspot.com/




if (typeof jQuery == 'undefined' || jQuery.fn.jquery < '1.3.0') {
  throw "Behaviour needs Jquery";
}


var Behaviour = {
  list : [],
  
  eventObservers : [],
  
  clearedElements : [],

  addEventObserver : function(element, name, observer, useCapture){
    if (!this.clearedElements.include(element)) { // should do a hashed lookup here
      this.clearedElements.push(element);
      Behaviour.removeAllObservers(element);
    }
    
    element = $(element);
    useCapture = useCapture || false;
    Behaviour.eventObservers.push([element, name, observer, useCapture]);
    Event.observe(element, name, observer, useCapture);
  },

  removeEventObserver : function(element, name, observer, useCapture){
    element = $(element);
    useCapture = useCapture || false;
    Behaviour.eventObservers = Behaviour.eventObservers.reject(function(list) {
      return (list[0] == element && list[1] == name && list[2] == observer && list[3] == useCapture);
    });
    Event.stopObserving(element, name, observer, useCapture);
  },

  removeAllObservers : function(element){
    var el = $(element);
    var observersForElement = Behaviour.eventObservers.findAll(
                               function(observerInfo){
                                 return (observerInfo[0]==el);
                               });

    observersForElement.each(function(observerInfo){
      Behaviour.removeEventObserver(observerInfo[0], observerInfo[1], observerInfo[2], observerInfo[3]);
    });
  },

  register : function(sheet){
    Behaviour.list.push(sheet);
  },
  
  start : function(){
    Behaviour.addLoadEvent(function(){
      Behaviour.apply();
    });
  },
  
  addLoadEvent : function(func){
    var oldonload = window.onload;
    
    if (typeof window.onload != 'function') {
      window.onload = func;
    } else {
      window.onload = function() {
        oldonload();
        func();
      };
    }
  },

  // @todo RRC 2011-01-13 - Method doesn't work as it was perhaps intended. 'baseElement' parameter is unused. Added tweaked reapply method below.
  apply : function(baseElement){
  		
    this.clearedElements = [];
    jQuery.each(Behaviour.list, function() {
		sheet = this;
      for (selector in sheet) {
        var list = $(selector);
        if (!list){
          continue;
        }
        jQuery.each(list, function() {
          sheet[selector](this);
        });
      }
    });
  },

  	/**
  	 * Reapply behaviour, by specific registered selector string
  	 * 
  	 * Be careful where behaviour uses:
  	 *   "jQuery(element).click(function() {})" (jQuery style)
  	 * rather than:
  	 *   "jQuery(element).onclick = function() {}"
  	 * to avoid duplicate event handlers!
  	 * 
  	 * @param string selector
  	 */
	reapply : function(selector) {
		if (typeof selector != 'string' || !selector.length)
			throw "Invalid value for 'selector' parameter";
		// For each sheet (each Behaviour.register = sheet)
		jQuery.each(Behaviour.list, function() {
			var sheet = this;
			// For each selector
			jQuery.each(sheet, function(index, value) {
				// Filter by specified selector
				if (index == selector) {
					var elements = $(selector);
					// For each element matched
					jQuery.each(elements, function() {
						if (typeof sheet[selector] == 'function')
							sheet[selector](this);
					});
				}
			});
		});
	}
};

Behaviour.start();

