if(typeof(Prototype)=="undefined"){throw"Control.ContextMenu requires Prototype to be loaded."}if(typeof(Object.Event)=="undefined"){throw"Control.ContextMenu requires Object.Event to be loaded."}Control.ContextMenu=Class.create({initialize:function(a,b){Control.ContextMenu.load();this.options=Object.extend({leftClick:false,disableOnShiftKey:true,disableOnAltKey:true,selectedClassName:"selected",activatedClassName:"activated",animation:true,animationCycles:2,animationLength:300,delayCallback:true},b||{});this.activated=false;this.items=this.options.items||[];this.container=$(a);this.container.observe(this.options.leftClick?"click":(Prototype.Browser.Opera?"click":"contextmenu"),function(c){if(!Control.ContextMenu.enabled||Prototype.Browser.Opera&&!c.ctrlKey){return}this.open(c)}.bindAsEventListener(this))},open:function(a){if(Control.ContextMenu.current&&!Control.ContextMenu.current.close()){return}if(this.notify("beforeOpen",a)===false){return false}this.buildMenu();if(this.items.length==0){this.close(a);return false}Control.ContextMenu.current=this;Control.ContextMenu.positionContainer(a);Control.ContextMenu.container.show();if(this.notify("afterOpen",a)===false){return false}a.stop();return true},close:function(a){if(a){a.stop()}if(this.notify("beforeClose")===false){return false}Control.ContextMenu.current=false;this.activated=false;Control.ContextMenu.container.removeClassName(this.options.activatedClassName);Control.ContextMenu.container.select("li").invoke("stopObserving");Control.ContextMenu.container.hide();Control.ContextMenu.container.update("");if(this.notify("afterClose")===false){return false}return true},buildMenu:function(){var a=document.createElement("ul");Control.ContextMenu.container.appendChild(a);this.items.each(function(c){var b;b=new Element("li");b.update($value(c.label));a.appendChild(b);b.observe("mousedown",function(e,d){this.activated=$value(d.label)}.bindAsEventListener(this,c));b.observe("mouseover",function(e,d){this.addClassName("hover")});b.observe("mouseout",function(e,d){this.removeClassName("hover")});b.observe("click",this.selectMenuItem.bindAsEventListener(this,c,b));b.observe("contextmenu",this.selectMenuItem.bindAsEventListener(this,c,b))}.bind(this))},addItem:function(a){this.items.push(a);return this},destroy:function(){this.container.stopObserving(Prototype.Browser.Opera||this.options.leftClick?"click":"contextmenu");this.items=[]},selectMenuItem:function(c,b,a){if(!this.activated||this.activated==$value(b.label)){if(this.options.animation){Control.ContextMenu.container.addClassName(this.options.activatedClassName);$A($R(0,this.options.animationCycles*2)).each(function(d){window.setTimeout(function(){a.toggleClassName(this.options.selectedClassName)}.bind(this),d*parseInt(this.options.animationLength/(this.options.animationCycles*2)))}.bind(this));window.setTimeout(function(){if(this.close()&&this.options.delayCallback){b.callback()}}.bind(this),this.options.animationLength);if(!this.options.delayCallback){b.callback()}}else{if(this.close()){b.callback()}}}c.stop();return false}});Object.extend(Control.ContextMenu,{loaded:false,capture_all:false,menus:[],current:false,enabled:false,offset:4,load:function(a){if(Control.ContextMenu.loaded){return}Control.ContextMenu.loaded=true;if(typeof(a)=="undefined"){a=false}Control.ContextMenu.capture_all=a;Control.ContextMenu.container=$(document.createElement("div"));Control.ContextMenu.container.id="control_contextmenu";Control.ContextMenu.container.style.position="absolute";Control.ContextMenu.container.style.zIndex=99999;Control.ContextMenu.container.hide();$(document.body).insert({top:Control.ContextMenu.container});Control.ContextMenu.enable()},enable:function(){Control.ContextMenu.enabled=true;Event.observe(document.body,"click",Control.ContextMenu.onClick);if(Control.ContextMenu.capture_all){Event.observe(document.body,"contextmenu",Control.ContextMenu.onContextMenu)}},disable:function(){Event.stopObserving(document.body,"click",Control.ContextMenu.onClick);if(Control.ContextMenu.capture_all){Event.stopObserving(document.body,"contextmenu",Control.ContextMenu.onContextMenu)}},onContextMenu:function(a){a.stop();return false},onClick:function(){if(Control.ContextMenu.current){Control.ContextMenu.current.close()}},positionContainer:function(e){var d=Control.ContextMenu.container.getDimensions();var h=Event.pointerY(e);var g=Event.pointerX(e);var a=d.height+h;var b=d.width+g;var c=document.viewport.getDimensions();var f=document.viewport.getScrollOffsets();if(a>c.height+f.top){h-=a-((c.height+f.top)-Control.ContextMenu.offset)}if(b>c.width+f.left){g-=b-((c.width+f.left)-Control.ContextMenu.offset)}Control.ContextMenu.container.setStyle({top:h+"px",left:g+"px"})}});Object.Event.extend(Control.ContextMenu);Control.ClickMenu=Class.create(Control.ContextMenu,{initialize:function($super,a,b){b=Object.extend({leftClick:true,position:"left",animation:false,className:"control_clickmenu"},b||{});$super(a,b)},addItems:function(a){$A(a).each(function(b){this.addItem(b)},this)},close:function($super,a){Control.ContextMenu.container.removeClassName(this.options.className);return $super(a)},open:function(a){if(Control.ContextMenu.current&&!Control.ContextMenu.current.close()){return}if(this.notify("beforeOpen",a)===false){return false}this.buildMenu();if(this.items.length==0){this.close(a);return false}Control.ContextMenu.current=this;Control.ContextMenu.container.addClassName(this.options.className);Control.ClickMenu.positionContainer(this.container,this.options.position);Control.ContextMenu.container.show();if(this.notify("afterOpen",a)===false){return false}a.stop();return true}});Object.extend(Control.ClickMenu,{offset:0,positionContainer:function(c,a){var b=c.getDimensions();var d=c.cumulativeOffset();var g=Control.ContextMenu.container.getDimensions();var f,e;switch(a){case"left":f=d.top+b.height+Control.ContextMenu.offset;e=d.left-g.width+b.width;break;case"right":default:f=d.top+b.height+Control.ContextMenu.offset;e=d.left}Control.ContextMenu.container.setStyle({top:f+"px",left:e+"px"})}});