/* This function enables inclusion of multiple javascripts. Please do not modify. */function include(file) {var script  = document.createElement('script'); script.src  = file; script.type = 'text/javascript'; script.defer = true; document.getElementsByTagName('head').item(0).appendChild(script); }   

var PATH="dmn-design/Clickless/";//Please change to point to the current directory

include(PATH+'lang.js'); 
include(PATH+'config.js'); 
include(PATH+'init.js'); 

var Clickless = new ClicklessObject;
var ClicklessOptionMap = new ClicklessOptionMapObject;
	 
	 
 function ClicklessObject(){
 	this.wrapped=new Array();
	
	this.current=false;
	
 	this.frame=document.createElement('div');
	this.frame=jQuery(this.frame).addClass('ClicklessFrame');
	this.frame.bind('mouseout',function(){Clickless.hideFrame();Clickless.hideMenu();});
 	
	this.menu=document.createElement('ul');
	this.menu=jQuery(this.menu).addClass('ClicklessMenu');
	this.menu.bind('mouseenter', function(){Clickless.menu.css('display','block');Clickless.frame.css('display','block');});
	this.menu.bind('mouseout', function(){Clickless.hideFrame(); Clickless.hideMenu();});
	
	this.cmdExecute=document.createElement('a');
	this.cmdExecute=jQuery(this.cmdExecute).addClass('ClicklessCmdExecute');
	
	
	this.panel=document.createElement('div');
	this.panel=jQuery(this.panel).addClass('ClicklessPanel');
	
	this.scrollDirection=false;
	
	this.TicToc=function()
	{
		var repeat=false;
		if(this.scrollDirection!=false)
		{
			
			repeat=true;
			switch(this.scrollDirection)
			{
				case 'up':
					window.scrollBy(0,-ClicklessConfig["VScrollSpeed"]);
					if (this.getScrollHeight() == 0) {
						this.scrollDirection = false;
					}
				break;
				case 'down':
					temp=this.getScrollHeight();
					window.scrollBy(0,ClicklessConfig["VScrollSpeed"]);
					if (temp == this.getScrollHeight()) {
						this.scrollDirection = false;
					}
				break;
				default:
					this.scrollDirection=false;
					repeat=false;
				break;
			}
		}
		
		if(repeat)
			setTimeout(function(){Clickless.TicToc();},10);
	}
	
 	this.init=function()
	{
		this.initPanel();
		this.cmdExecute.append(ClicklessLangPack["execute"]);
	}
	
	this.initPanel=function()
	{
		var temp=document.createElement('div');
		temp.setAttribute('id','ClicklessPanelContent');
		temp=jQuery(temp);
		var scrollBlock=document.createElement('div');
		scrollBlock.setAttribute('id','ClicklessPanelScrollBox');
		scrollBlock=jQuery(scrollBlock);
		
		var scrollUp=document.createElement('div');
		scrollUp.setAttribute('id','ClicklessScrollButtonUp');
		scrollUp=jQuery(scrollUp).addClass('ClicklessScrollButton');
		scrollUp.append(ClicklessLangPack["scrollUp"]);
		scrollUp.bind('mouseover',function(){Clickless.startScroll('up');});
		scrollUp.bind('mouseout',function(){Clickless.stopScroll();});
		scrollBlock.append(scrollUp);
		
		var scrollDown=document.createElement('div');
		scrollDown.setAttribute('id','ClicklessScrollButtonDown');
		scrollDown=jQuery(scrollDown).addClass('ClicklessScrollButton');
		scrollDown.append(ClicklessLangPack["scrollDown"]);
		scrollDown.bind('mouseover',function(){Clickless.startScroll('down');});
		scrollDown.bind('mouseout',function(){Clickless.stopScroll();});
		scrollBlock.append(scrollDown);
		temp.append(scrollBlock);

		this.panel.append(temp);
		
		
		//Create Maximize button
		temp=document.createElement('d');
		temp.setAttribute('id','ClicklessPanelMaximize');
		temp=jQuery(temp).addClass('ClicklessPanelButton');
		temp.append(ClicklessLangPack['maximize']);
		temp.bind('click',function(){Clickless.maximizePanel();});
		ClicklessOptionMap.setOption(ClicklessLangPack["click"],temp,function(){Clickless.maximizePanel();});
		this.wrap(temp.get(0));
		this.panel.append(temp);
		
		//Create Minimize button
		temp=document.createElement('div');
		temp.setAttribute('id','ClicklessPanelMinimize');
		temp=jQuery(temp).addClass('ClicklessPanelButton');
		temp.append(ClicklessLangPack['minimize']);
		temp.bind('click',function(){Clickless.minimizePanel();});
		ClicklessOptionMap.setOption(ClicklessLangPack["click"],temp,function(){Clickless.minimizePanel();});
		this.wrap(temp.get(0));
		this.panel.append(temp);
		
	}
	
	this.startScroll=function(direction)
	{
		this.scrollDirection=direction;
		this.TicToc();
	}
	
	this.stopScroll=function()
	{
		this.scrollDirection=false;
	}
	this.maximizePanel=function(){
		jQuery("#ClicklessPanelMaximize").css('display','none');
		jQuery("#ClicklessPanelContent").css('display','block');
		jQuery("#ClicklessPanelMinimize").css('display','block');
	}
	
	
	
	this.minimizePanel=function(){
		jQuery("#ClicklessPanelMaximize").css('display','block');
		jQuery("#ClicklessPanelContent").css('display','none');
		jQuery("#ClicklessPanelMinimize").css('display','none');
	}
	
	
	this.fixClick=function(object)
	{
		func=object.onclick;
		ClicklessOptionMap.setOption(ClicklessLangPack["click"],object,func);
	}
	this.fixFile=function(object)
	{
		var func = function() {
				jQuery(object).click();
			}
		ClicklessOptionMap.setOption(ClicklessLangPack["browse"],object,func);
	}
	this.fixReset=function(object)
	{
		var f=Clickless.getForm(object);
		var func = function() {
				f.reset();
			}
		ClicklessOptionMap.setOption(ClicklessLangPack["reset"],object,func);
	}
	this.fixSubmit=function(object)
	{
		var f=Clickless.getForm(object);
		var func;
		if(f.onsubmit != undefined)
		{
			func = function() {
				if(f.onsubmit()!==false) f.submit();
			}
		}
		else
		{
			func = function(){f.submit()};
		}
		
		ClicklessOptionMap.setOption(ClicklessLangPack["submit"],object,func);
	}
	this.fixHref=function(object)
	{
		func=function(){location.href=object.getAttribute('href');};
		ClicklessOptionMap.setOption(ClicklessLangPack["visit"],object,func);
	}
	
	this.getForm=function(button)
	{
		var temp=button;
		while(temp.tagName.toLowerCase()!='form') {
			if(temp.tagName.toLowerCase()=='body') return null;
			temp=temp.parentNode;
		}
		return temp;
	}
	
	this.wrap=function(object,wrapped)
	{
		if (!wrapped) {
			jQuery(object).bind("mouseenter", Clickless.createEnter(object));
		}
		return true;
	}	
	
	this.wrapInFocus=function(object)
	{
		jQuery(object).bind('mouseenter',function(){object.focus()});
	}
	
	this.createEnter=function(object)
	{
		return function(event)
		{
			Clickless.showFrame(object);
			Clickless.showMenu(object);
			//Show Menu
		}
	}
	this.showFrame=function(object)
	{
		
		var jqObject=jQuery(object);
		var newOffset=jqObject.offset();
	
		
		Clickless.current=jqObject;
			
		var newTop=newOffset.top;
		var newLeft=newOffset.left;
		var newHeight=jqObject.outerHeight();
		var newWidth=jqObject.outerWidth();
		
		children=jQuery("*",jqObject).get();
		for(i in children)
		{
			if (children[i].tagName != undefined) {
				jqChild = jQuery(children[i]);
				if (jqChild.outerHeight() > newHeight) {
					newTop=newTop-(jqChild.outerHeight()-newHeight);
					newHeight = jqChild.outerHeight();
					
				}
				if(jqChild.outerWidth()>newWidth) newWidth=jqChild.outerWidth();
			}
		}
		
		
		blw=this.frame.css('border-left-width').substring(0,this.frame.css('border-left-width').length-2);
		bbw=this.frame.css('border-bottom-width').substring(0,this.frame.css('border-bottom-width').length-2);
		this.frame.css('left',(newLeft-blw-1)+'px');
		this.frame.css('top',(newTop-bbw-1)+'px');
		this.frame.css('height',(newHeight-(-bbw-1))+'px');
		this.frame.css('width',(newWidth-(-blw-1))+'px');
		this.frame.css('display', 'block');
	}
	this.hideFrame=function()
	{
		this.frame.css('display', 'none');
		Clickless.frame.unbind("click");
		Clickless.cmdExecute.css('display','none');
	}
	
	this.showMenu=function(object)
	{
		this.clearMenu();
		
		var options=ClicklessOptionMap.getOptions(object);
		
		var trig=true; //used to bind an event to the click of the frame
		for(i in options)
		{
			if(trig) {
				Clickless.frame.bind('click',options[i]);
				trig=false;
			}
			this.addOptionToMenu(i,options[i]);
		}
		
		var newOffset=this.frame.offset();
		var frameHeight=this.frame.outerHeight();
		
		var menuHeight=this.menu.outerHeight();
		var menuWidth=this.menu.outerWidth();
		
		var windowSize=Clickless.getWindowSize();
		bbw=this.frame.css('border-bottom-width').substring(0,this.frame.css('border-bottom-width').length-2);
		
		menuTop=newOffset.top-(-frameHeight)-bbw;
		menuLeft=newOffset.left;
		
		if(menuTop+menuHeight+10>(windowSize[0]+Clickless.getScrollHeight()))
		{ //menu would go off bottom of the screen
			menuTop=newOffset.top-frameHeight-(-bbw*2-1);
		}
		
		if(menuLeft+menuWidth>(windowSize[1]))
		{ //menu would go off the right side of the screen
			menuLeft=windowSize[1]-menuWidth;
		}
		
		this.menu.css('top',menuTop+'px');
		this.menu.css('left',menuLeft+'px');
		this.menu.css('display','block');
		
	}
	this.hideMenu=function()
	{
		if (!this.cursorInMenu) {
			this.menu.css('display', 'none');
		}
	}
	

	this.clearMenu=function()
	{
		m=this.menu.get(0);
		if ( m.hasChildNodes() )
		{
		    while ( m.childNodes.length >= 1 )
		    {
		        m.removeChild( m.firstChild );       
		    } 
			this.menu = jQuery(m);
		}
	} 
	
	this.addOptionToMenu=function(text,func)
	{
		var a= document.createElement('a');
		var ccf=this.createShowConfirmFunction(func,a);
		a=jQuery(a);
		a.bind('click','return false;');
		a.attr('href','#');
		a.text(text);
		a.bind('mousemove', function (){Clickless.showCmdExecute(a)});
		a.bind('mouseenter', ccf);
		//a.bind('mouseout', this.createHideConfirmFunction(a));
		var li=document.createElement('li');
		li.appendChild(a.get(0));
		m=this.menu.get(0);
		m.appendChild(li);
		this.menu=jQuery(m);
		
	
	}
	this.createShowConfirmFunction=function(func, a)
	{
		return function()
		{
			
			var locala=jQuery(a);
			
			Clickless.cmdExecute.css('display','none');
			Clickless.cmdExecute.unbind('mouseenter');
			Clickless.cmdExecute.bind('mouseenter',func);
			
			Clickless.cmdExecute.bind('mouseenter',Clickless.createHideConfirmFunction());
			Clickless.showCmdExecute(locala);
		};
	}
	
	this.showCmdExecute=function (a)
	{
		if (this.cmdExecute.css('display') != 'block') {
			var newOffset = a.offset();
			if (newOffset.top > this.getScrollHeight()) {
				this.cmdExecute.css('top', (newOffset.top ) + 'px');
				
				newLeft=(newOffset.left - (-a.outerWidth()));
				var cmdExecuteWidth=this.cmdExecute.outerWidth();
				
				var windowSize=Clickless.getWindowSize();
				
				if(newLeft+cmdExecuteWidth>(windowSize[1]))
				{ //cmdExecute would go off the right side of the screen
					newLeft=newOffset.left-cmdExecuteWidth;
				}
				
				this.cmdExecute.css('left', newLeft + 'px');
				this.cmdExecute.css('display', 'block');
			}
		}
	}
	this.createHideConfirmFunction=function(a)
	{
		return function(){
			Clickless.cmdExecute.css('display','none');
		};
	}
	
	this.getScrollHeight=function()
	{
	   var h = window.pageYOffset ||
	           document.body.scrollTop ||
	           document.documentElement.scrollTop;
	           
	   return h ? h : 0;
	}
	this.getWindowSize=function()
	{
	  var myWidth = 0, myHeight = 0;
	  if( typeof( window.innerWidth ) == 'number' ) {
	    //Non-IE
	    myWidth = window.innerWidth;
	    myHeight = window.innerHeight;
	  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
	    //IE 6+ in 'standards compliant mode'
	    myWidth = document.documentElement.clientWidth;
	    myHeight = document.documentElement.clientHeight;
	  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
	    //IE 4 compatible
	    myWidth = document.body.clientWidth;
	    myHeight = document.body.clientHeight;
	  }
	  return [ myHeight, myWidth  ];
	}
 }
 
 function ClicklessOptionMapObject()
 {
 	this.setOption = function(text,obj,func)
	{
		var a=jQuery(obj).data('optionMap');
		if(a==undefined) a=new Array();
		a[text]=func;
		jQuery(obj).data('optionMap',a);
	} 
	this.getOptions = function(obj)
	{
		return jQuery(obj).data('optionMap');
	}
 }
	