/**
 * EventSelectors extension
 *
 * @package    Skeletor
 * @copyright  Copyright (c) 2005-2007 Quicken Loans, Inc.
(http://www.quickenloans.com)
 */

Object.extend(EventSelectors, {
    
    /**
     * Overwrites the default assign method by
     * simply removing the call to this._unloadCache
     */
    assign: function(rules) {
           var observer = null;
           
           rules._each(function(rule) {
               var selectors = $A(rule.key.split(','));
               selectors.each(function(selector) {
                   var pair = selector.split(':');
                   var event = pair[1];
                   $$(pair[0]).each(function(element) {
                       if (pair[1] == '' || pair.length == 1) return rule.value(element);

                       if (event.toLowerCase() == 'loaded') {
                           this.timer[pair[0]] =
                           
                           
                           
                           
                           setInterval(this._checkLoaded.bind(this, element, pair[0], rule), 15);
                       } else {
                           observer = function(event) {
                               var element = Event.element(event);
                               if (element.nodeType == 3) // Safari Bug (Fixed in Webkit)
                                   element = element.parentNode;
                           rule.value($(element), event);
                        }
                   
                       this.cache.push([element, event, observer]);
                       Event.observe(element, event, observer);
                   }
               }.bind(this));
           }.bind(this));
       }.bind(this));
   },
  
   /**
    * Use this method to restart events after you
    * add new elements to the DOM and need to assign
    * events to them
    *
    * @param    rules    Ruleset object
    */
   restart: function(rules) {
           this._unloadCache(rules);
        this.start(rules);
   },
   
   /**
    * This methods stops the specified ruleset
    * by removing any listeners from each object
    * and clearing the cache
    *
    * @param    rules    Ruleset object
    */
   stop: function(rules) {
           this._unloadCache(rules);
   },
   
   /**
    * "Private" method that removes the listeners
    * from each DOM object and clears the cache
    *
    * @param    rules    Ruleset object
    */
   _unloadCache: function(rules) {
           // Stop observing each rule
        rules._each(function(rule) {
               var selectors = $A(rule.key.split(','));
               selectors.each(function(selector) {
                   var pair = selector.split(':');
                   var event = pair[1];
                   $$(pair[0]).each(function(element) {
                       if (pair[1] == '' || pair.length == 1) return rule.value(element);

                       observer = function(event) {
                        var element = Event.element(event);
                        if (element.nodeType == 3) // Safari Bug (Fixed in Webkit)
                               element = element.parentNode;
                    rule.value($(element), event);
                    }

                    for (var i = 0; i < this.cache.length; i++) {
                        if (this.cache[i][0] == element) {
                              Event.stopObserving.apply(this, this.cache[i]);    
                        }
                    }
               }.bind(this));
           }.bind(this));
       }.bind(this));
              
       // Clear cache
       this.cache = [];
   }
});
