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(b,a){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,menuOffsetX:0,menuOffsetY:0},a||{});this.activated=false;this.items=this.options.items||[];this.container=$(b);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}this.clicked=Event.element(a);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){if(!(!c.condition||c.condition&&c.condition()!==false)){return}var b=$(document.createElement("li"));b.update($value(c.label));a.appendChild(b);b[$value(c.enabled)?"removeClassName":"addClassName"]("disabled");b.observe("mousedown",function(e,d){if(!$value(d.enabled)){return e.stop()}this.activated=$value(d.label)}.bindAsEventListener(this,c));b.observe("click",this.selectMenuItem.bindAsEventListener(this,c,b));b.observe("contextmenu",this.selectMenuItem.bindAsEventListener(this,c,b))}.bind(this))},addItem:function(a){if(!("enabled" in a)){a.enabled=true}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(!$value(b.enabled)){return c.stop()}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),10))}.bind(this));window.setTimeout(function(){if(this.close()&&this.options.delayCallback){b.callback(this.clicked)}}.bind(this),this.options.animationLength);if(!this.options.delayCallback){b.callback(this.clicked)}}else{if(this.close()){b.callback(this.clicked)}}}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.appendChild(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 b=d.height+h;var a=d.width+g;var c=document.viewport.getDimensions();var f=document.viewport.getScrollOffsets();g+=Control.ContextMenu.current.options.menuOffsetX;h+=Control.ContextMenu.current.options.menuOffsetY;if(b>c.height+f.top){h-=b-((c.height+f.top)-Control.ContextMenu.offset)}if(a>c.width+f.left){g-=a-((c.width+f.left)-Control.ContextMenu.offset)}Control.ContextMenu.container.setStyle({top:h+"px",left:g+"px"})}});Object.Event.extend(Control.ContextMenu);