var CONSTRAIN_NO=0;var CONSTRAIN_PROPORTIONAL=1;var CONSTRAIN_SWITCH_ORIENTATION=2;ElementContainer=Base.extend({element:null,constructor:function(className,elementName){if(!elementName){elementName='div';}this.element=CE(elementName,className);},addTo:function(el){el.appendChild(this.element);this.doLayout();},add:function(node){this.element.appendChild(node);},setStyle:function(hash){Element.setStyle(this.element,hash);},doLayout:function(){},getElement:function(){return this.element;},getWidth:function(withLeftMargin,withRightMargin){return Element.getWidth(this.getElement(),withLeftMargin,withRightMargin);},getHeight:function(withTopMargin,withBottomMargin){return Element.getHeight(this.getElement(),withTopMargin,withBottomMargin);}});Movable=Base.extend({setPosition:function(x,y){switch(this.constrainByParent){case CONSTRAIN_NO:break;case CONSTRAIN_PROPORTIONAL:if(x+this.getWidth(true,false)>this.element.offsetParent.offsetWidth){x=this.element.offsetParent.offsetWidth-this.getWidth();}else if(x<0){x=0;}if(y+this.getHeight(true,false)>this.element.offsetParent.offsetHeight){y=this.element.offsetParent.offsetHeight-this.getHeight();}else if(y<0){y=0;}break;case CONSTRAIN_SWITCH_ORIENTATION:if(x+this.getWidth(true,false)>this.element.offsetParent.offsetWidth){x=x-this.getWidth(true,false);}if(x<0||isNaN(x)){x=0;}if(y+this.getHeight(true,false)>this.element.offsetParent.offsetHeight){y=y-this.getHeight(true,false);}if(y<0||isNaN(y)){y=0;}break;}Element.setPosition(this.element,x,y);},setSize:function(w,h){Element.setSize(this.element,w,h);this.doLayout();},setConstrainByParent:function(constrain){this.constrainByParent=constrain;},setPositionAdjacent:function(element,yOrientation,xOrientation){var pos=getAbsolutePositionOf(element);var myDim=Element.getDimensions(this.element);var newX=0;var newY=0;switch(xOrientation){case 'right':newX=pos.x+(element.offsetWidth||0)+5;break;default:newX=pos.x;}switch(yOrientation){case 'top':newY=pos.y-(this.element.offsetHeight||0)-5;break;case 'bottom':default:newY=pos.y+(element.offsetHeight||0)+5;}this.setPosition(newX,newY);}});Hidable=Base.extend({show:function(){this.element.style.visibility='visible';},hide:function(){this.element.style.visibility='hidden';},isVisible:function(){return this.element.style.visibility=='visible';}});Tracable=Base.extend({mouseTraceInited:false,mouseTraceInit:function(){if(typeof this.updateMouseXY!='function'){alert('updateMouseXY is not implemented in '+this.constructor);return;}this.boundGetMouseXY=this.getMouseXY.bindAsEventListener(this);this.boundTriggerUpdateMouseXY=this.triggerUpdateMouseXY.bind(this);this.mouseTraceInited=true;this.mouseX=null;this.mouseY=null;},startMouseTrace:function(event){if(this.isMouseTracing){return;}if(!this.mouseTraceInited)this.mouseTraceInit();this.isMouseTracing=true;if(event){this.boundGetMouseXY(event);}Event.observe(document,'mousemove',this.boundGetMouseXY,false);},stopMouseTrace:function(){this.mouseX=null;this.mouseY=null;if(this.isMouseTracing){Event.stopObserving(document,'mousemove',this.boundGetMouseXY,false);this.isMouseTracing=false;}},getMouseXY:function(event){var x=Event.pointerX(event);var y=Event.pointerY(event);if(Event.element(event).ownerDocument!=this.element.ownerDocument){var pos=getAbsolutePositionOf(Event.element(event).ownerDocument.frame);x+=pos.x;y+=pos.y;}if(this.mouseX!=x||this.mouseY!=y){this.mouseMoved=true;this.mouseX=x;this.mouseY=y;this.updateMouseXY(this.mouseX,this.mouseY);}else{this.mouseMoved=false;}},triggerUpdateMouseXY:function(){if(typeof this.mouseX!='number'||typeof this.mouseY!='number'||!this.mouseMoved){return;}DEBUG('Trigger update mouse XY @ '+[this.mouseX,this.mouseY].join(','));this.updateMouseXY(this.mouseX,this.mouseY);}});Draggable=Tracable.extend({observerDocuments:[],initDraggable:function(dragElement){this.addObserverDocument(document);this.dragElement=dragElement;this.isDraggable=true;this.boundUnlistenDragEvent=this.unlistenDragEvent.bindAsEventListener(this);this.dragElement.onmousedown=this.listenDragEvent.bindAsEventListener(this);},addObserverDocument:function(d){this.observerDocuments.push(d);},setDraggable:function(d){this.isDraggable=d;},updateMouseXY:function(x,y){DEBUG('update @ '+[x,y].join(','));if(this.isDraggable)this.setPosition(x-this.offsetMouseX,y-this.offsetMouseY);return false;},setMousePositionOffset:function(x,y){var p=this.element.offsetParent;do{x+=p.offsetLeft;y+=p.offsetTop;}while(p=p.offsetParent)DEBUG('OFFSET @ '+x+','+y);this.offsetMouseX=x;this.offsetMouseY=y;},listenDragEvent:function(event){if(this.isDraggable){this.setMousePositionOffset(event.offsetX||event.layerX,event.offsetY||event.layerY);Element.addClassName(this.element,'dragged');for(i in this.observerDocuments){this.startMouseTrace();Event.observe(this.observerDocuments[i],'mouseup',this.boundUnlistenDragEvent,false);}}},unlistenDragEvent:function(event){Element.removeClassName(this.element,'dragged');for(i in this.observerDocuments){this.stopMouseTrace();Event.stopObserving(this.observerDocuments[i],'mouseup',this.boundUnlistenDragEvent,false);}}});Draggable.implement(Movable);Icons={_IMAGE_ROOT:'../cms/template/gfx/icons',_IMAGE_EXT:'.gif',WINDOW_CLOSE_ICON:'close',HELP_ICON:'help',image:function(type,isButton){return this.urlImage(this.getImageUrl(type),isButton);},urlImage:function(url,isButton){var img=CE('img');img.src=url;Element.addClassName(img,'icon');if(isButton){img.onmouseover=Icons.iconMouseOver.bindAsEventListener(img);img.onmouseout=Icons.iconMouseOut.bindAsEventListener(img);img.onmousedown=Icons.iconMouseDown.bindAsEventListener(img);}return img;},iconMouseOver:function(){Element.addClassName(this,'mouse-over');},iconMouseDown:function(){Element.addClassName(this,'mouse-down');},iconMouseOut:function(){Element.removeClassName(this,'mouse-down');Element.removeClassName(this,'mouse-over');},getImageUrl:function(type){return Icons._IMAGE_ROOT+'/'+type+Icons._IMAGE_EXT;}};Icons.Static=Base.extend({constructor:function(icon){this.icon=icon;},getDefaultIcon:function(){return this.icon;}});Icons.Animate=Icons.Static.extend({constructor:function(animation){this.base(animation['std']);this.animation=animation;},getStateIcon:function(state){if(state in this.animation){return this.animation[state];}return this.getDefaultIcon();}});Icons.std={};Icons.std.folder=new Icons.Animate({std:'folder_closed',open:'folder'});Icons.std.select=new Icons.Animate({std:'folder_closed',open:'folder'});Icons.std.document=new Icons.Static('document');Icons.std.radio=new Icons.Animate({std:'radio-off',selected:'radio-on'});ToolTip=ElementContainer.extend({constructor:function(text,isHtml,trace,constrain){this.base('tooltip');this.delay=400;if(isHtml){this.element.innerHTML=text;}else{this.element.appendChild(CT(text));}this.trace=(trace?true:false);this.setConstrainByParent(constrain);this.boundPopup=this.popup.bindAsEventListener(this);this.boundPopout=this.popout.bindAsEventListener(this);this.hide();},popup:function(event){this.startMouseTrace(event);this.show.delay=setTimeout(this.show.bind(this),this.delay);},show:function(){this.base();},popout:function(){if(this.show.delay){clearTimeout(this.show.delay);}this.hide();this.stopMouseTrace();},attachTo:function(element,delay){if(typeof delay!='undefined'){this.delay=delay;}this.listenTo(element,'mouseover');},listenTo:function(element,eventName,noOpposite){Event.observe(element,eventName,this.boundPopup,false);if(!noOpposite){var opposite=Ysf.getCancellingEventName(eventName);if(opposite){Event.observe(element,opposite,this.boundPopout,false);}}},stopListeningTo:function(element,eventName,noOpposite){Event.stopObserving(element,eventName,this.boundPopup);if(!noOpposite){var opposite=Ysf.getCancellingEventName(eventName);if(opposite){Event.stopObserving(element,opposite,this.boundPopout);}}},detachFrom:function(element){this.stopListeningTo(element,'mouseover');},updateMouseXY:function(x,y){if(!this.trace&&this.isVisible()){return;}this.setPosition(x,y);}});ToolTip.implement(Hidable);ToolTip.implement(Movable);ToolTip.implement(Tracable);ToolTip.create=function(hookElement,text,isHtml,trace,constrain){var ret=new ToolTip(text,isHtml,trace,constrain);document.body.appendChild(ret.getElement());ret.attachTo(hookElement);return ret;};InternalWindow=ElementContainer.extend({title:null,container:null,constructor:function(title,x,y,w,h){this.base('internal-window');this.title=CE('h2');this.title.appendChild(CT(title));this.add(this.title);this.initButtons();this.initDraggable(this.title);this.initContentPane();this.setPosition(x||0,y||0);this.setSize(w||300,h||200);this.setConstrainByParent(true);},initButtons:function(){var buttonBar=CE('div','button-bar');this.closeButton=Icons.image(Icons.WINDOW_CLOSE_ICON,true);this.closeButton.onclick=this.closeButtonClicked.bindAsEventListener(this);buttonBar.appendChild(this.closeButton);this.add(buttonBar);},setIcon:function(type){Element.addClassName(this.title,'icon');Element.setStyle(this.title,$H({backgroundImage:"url("+Icons.getImageUrl(type)+")"}));},closeButtonClicked:function(){this.hide();},addMenuStrip:function(strip){this.element.insertBefore(strip.element,this.contentPane);},initContentPane:function(){this.contentPane=CE('div','content-pane');this.add(this.contentPane);this.contentPane.appendChild(CT('WINDOW'));},getInnerHeight:function(){return this.getHeight()-this.getTitleBarHeight()-2;},getInnerWidth:function(){return this.getWidth()-2;},getInnerDimensions:function(){return{w:this.getInnerWidth(),h:this.getInnerHeight()};},doLayout:function(){Element.setSize(this.contentPane,this.getInnerWidth(),this.getInnerHeight());},getWidth:function(){return Element.getWidth(this.element);},getHeight:function(){return Element.getHeight(this.element);},getTitleBarHeight:function(){return Element.getHeight(this.title);}});InternalWindow.implement(Draggable);InternalWindow.implement(Hidable);InternalUrlWindow=InternalWindow.extend({constructor:function(title,url,x,y,w,h){this.base(title,x,y,w,h);this.url=url;},initContentPane:function(){this.contentPane=CE('iframe','content-pane');this.add(this.contentPane);},doLayout:function(){this.base();if(!this.isUrlLoaded){this.loadUrl();}},onUrlLoaded:function(){this.addObserverDocument(this.contentPane.contentDocument);},loadUrl:function(){this.contentPane.src=this.url;Event.observe(this.contentPane,'load',this.onUrlLoaded.bind(this),false);}});