// Delegate functions for prototype.js version 1.6
// ©2008 Ken Snyder (ken d snyder ~at~ gmail ~dot~ com) 
// under the creative commons attribution license v3.0 (http://creativecommons.org/licenses/by/3.0/)
Object.extend(Event,(function(){var cache={};return{delegate:function(element,eventName){if(arguments[3]){var rules={};rules[arguments[2]]=arguments[3];}else{var rules=Object.extend({},arguments[2]);}
var el=$(element),ev=eventName,id=el.identify?el.identify():'document';if(!cache[id]){cache[id]={'$observer':function(event){var el=event.element();if(cache[id][event.type])
for(var i=0,len=cache[id][event.type].length;i<len;i++)
for(var selector in cache[id][event.type][i])
if(cache[id][event.type][i][selector][1].match(el))
cache[id][event.type][i][selector][0](event);}};}
if(!cache[id][ev]){cache[id][ev]=[];el.observe(ev,cache[id]['$observer']);}
for(var selectorStr in rules)
rules[selectorStr]=[rules[selectorStr],new Selector(selectorStr)];cache[id][ev].push(rules);return el;},stopDelegating:function(element,eventName){if(element===undefined){for(var id in cache)
Event.stopDelegating(id=='$document'?document:id);cache={};return true;}
if(Object.isString(arguments[2])){var rules={};rules[arguments[2]]=true;}else if(arguments[2]){var rules=arguments[2];}else{var rules=false;}
var el=$(element),ev=eventName,id=el.identify?el.identify():'$document';if(cache[id]){if(ev&&cache[id][ev]){for(var i=0,len=cache[id][ev].length;i<len;i++){if(rules){for(var selector in rules)
delete cache[id][ev][i][selector];}
if(!rules||$H(cache[id][ev][i]).any()==false){el.stopObserving(ev,cache[id]['$observer']);cache[id][ev][i]='r';}}
cache[id][ev]=cache[id][ev].without('r');}else{for(var evName in cache[id])
if(evName!='$observer')
el.stopObserving(evName,cache[id]['$observer']);delete cache[id];}}
return el;}};})());Element.addMethods({delegate:Event.delegate,stopDelegating:Event.stopDelegating});document.delegate=Event.delegate.curry(document);document.stopDelegating=Event.stopDelegating.curry(document);Event.observe(window,'unload',Event.stopDelegating);
