/************************************************************************************************************
        @fileoverview
        Floating window
        
        Copyright (C) 2006  Alf Magne Kalleland(post@dhtmlgoodies.com)
        
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public
        License as published by the Free Software Foundation; either
        version 2.1 of the License, or (at your option) any later version.
        
        This library is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        Lesser General Public License for more details.
        
        You should have received a copy of the GNU Lesser General Public
        License along with this library; if not, write to the Free Software
        Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
        
        
        www.dhtmlgoodies.com 
        Alf Magne Kalleland


Update log:
        
        January 18th, 2006: Added feature that makes the window cover selectboxes(ref. problem with windowed and window less elements).
        January 29th, 2006: Fixed problem showing the windows in Opera
        Feb, 8th 2006:                Added support for creating new windows dynamically
        March,        11th, 2006: Added support for getting content from external files by use of Ajax
        
        
************************************************************************************************************/
                
        var readSizeFromCookie = false;        // Determines if size and position of windows should be set/retreved by use of cookie
        var windowMinSize = [80,30];        // Mininum width and height of windows.
        
        var moveCounter = -1;        
        var startEventPos = new Array();
        var startPosWindow = new Array();
        var startWindowSize = new Array();
        var initResizeCounter = -1;        
        var activeWindow = false;
        var activeWindowContent = false;        
        var windowSizeArray = new Array();
        var windowPositionArray = new Array();
        var currentZIndex = 10000;
        var windowStateArray = new Array();        // Minimized or maximized
        var activeWindowIframe = false;
        var divCounter = 0;
        var zIndexSet = false;
        
        var MSIEWIN = (navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Win')>=0 && navigator.userAgent.toLowerCase().indexOf('opera')<0)?true:false;
        var opera = navigator.userAgent.toLowerCase().indexOf('opera')>=0?true:false;
        
        var ajaxObjects = new Array();
        

                
                        
        /*
        These cookie functions are downloaded from 
        http://www.mach5.com/support/analyzer/manual/html/General/CookiesJavaScript.htm
        */        
        function Get_Cookie(name) { 
           var start = document.cookie.indexOf(name+"="); 
           var len = start+name.length+1; 
           if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
           if (start == -1) return null; 
           var end = document.cookie.indexOf(";",len); 
           if (end == -1) end = document.cookie.length; 
           return unescape(document.cookie.substring(len,end)); 
        } 
        // This function has been slightly modified
        function Set_Cookie(name,value,expires,path,domain,secure) { 
                expires = expires * 60*60*24*1000;
                var today = new Date();
                var expires_date = new Date( today.getTime() + (expires) );
            var cookieString = name + "=" +escape(value) + 
               ( (expires) ? ";expires=" + expires_date.toGMTString() : "") + 
               ( (path) ? ";path=" + path : "") + 
               ( (domain) ? ";domain=" + domain : "") + 
               ( (secure) ? ";secure" : ""); 
            document.cookie = cookieString; 
        } 
                        
        function cancelEvent()
        {
                return (moveCounter==-1 && initResizeCounter==-1)?true:false;
        }
        function initMove(e)
        {                
                if(document.all)e = event;
                moveCounter = 0;
                switchElement(false,this);
                startEventPos = [e.clientX,e.clientY];
                startPosWindow = [activeWindow.offsetLeft,activeWindow.offsetTop];
                startMove();
                if(!MSIEWIN)return false;
        
        }
        
        function startMove()
        {
                if(moveCounter>=0 && moveCounter<=10){
                        moveCounter++;
                        setTimeout('startMove()',5);
                }
        }
        
        function stopMove(e)
        {
                if(document.all)e = event;
                moveCounter=-1;
                initResizeCounter=-1;
                if(!activeWindow || !activeWindowContent)return;
                var state = '0';
                if(windowStateArray[activeWindow.id.replace(/[^0-9]/g,'')])state = '1';
                
                Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
        }
        
        function moveWindow(e)
        {
                
                if(document.all)e = event;
                if(moveCounter>=10){
                        activeWindow.style.left = startPosWindow[0] + e.clientX - startEventPos[0]  + 'px';
                        activeWindow.style.top = startPosWindow[1] + e.clientY - startEventPos[1]  + 'px';
                        
                }        
                
                if(initResizeCounter>=10){
                        var newWidth = Math.max(windowMinSize[0],startWindowSize[0] + e.clientX - startEventPos[0]);
                        var newHeight = Math.max(windowMinSize[1],startWindowSize[1] + e.clientY - startEventPos[1]);
                        activeWindow.style.width =  newWidth + 'px';
                        activeWindowContent.style.height = newHeight  + 'px';                
                        
                        if(MSIEWIN && activeWindowIframe){
                                activeWindowIframe.style.width = (newWidth) + 'px';        
                                activeWindowIframe.style.height = (newHeight+20) + 'px';        
                        }
                                
                        
                }
                if(!document.all)return false;
        }
        
        
        function initResizeWindow(e)
        {
                if(document.all)e = event;
                initResizeCounter = 0;
                switchElement(false,document.getElementById('dhtml_goodies_id' + this.id.replace(/[^\d]/g,'')));

                startWindowSize = [activeWindowContent.offsetWidth,activeWindowContent.offsetHeight];
                startEventPos = [e.clientX,e.clientY];
                
                if(MSIEWIN)activeWindowIframe = activeWindow.getElementsByTagName('IFRAME')[0];
                startResizeWindow();
                return false;
                        
        }
        
        function startResizeWindow()
        {
                if(initResizeCounter>=0 && initResizeCounter<=10){
                        initResizeCounter++;
                        setTimeout('startResizeWindow()',5);
                }
        }
        
        function switchElement(e,inputElement)
        {
                if(!inputElement)inputElement = this;
                var numericId = inputElement.id.replace(/[^0-9]/g,'');
                var state = '0';
                if(windowStateArray[numericId])state = '1';
                        
                if(activeWindow && activeWindowContent){
                        Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
        
                }
                currentZIndex = currentZIndex/1 + 1;
                activeWindow = document.getElementById('dhtml_goodies_id' + numericId);        
                activeWindow.style.zIndex = currentZIndex;
                activeWindowContent = document.getElementById('windowContent' + numericId);

                Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);
        }
        
        function hideWindow()
        {
                switchElement(false,document.getElementById('dhtml_goodies_id' + this.id.replace(/[^\d]/g,'')));        
                activeWindow.style.display='none';
        }
        
        function minimizeWindow(e,inputObj)
        {
                if(!inputObj)inputObj = this;
                var numericID = inputObj.id.replace(/[^0-9]/g,'');
                switchElement(false,document.getElementById('dhtml_goodies_id' + numericID));
                var state;        
                if(inputObj.src.indexOf('minimize')>=0){
                        activeWindowContent.style.display='none';
                        document.getElementById('resizeImage'+numericID).style.display='none';
                        inputObj.src = inputObj.src.replace('minimize','maximize');        
                        windowStateArray[numericID] = false;
                        state = '0';                
                }else{                        
                        activeWindowContent.style.display='block';
                        document.getElementById('resizeImage'+numericID).style.display='';
                        inputObj.src = inputObj.src.replace('maximize','minimize');
                        windowStateArray[numericID] = true;
                        state = '1';
                }
                
                Set_Cookie(activeWindow.id + '_attr',activeWindow.style.left.replace('px','') + ',' + activeWindow.style.top.replace('px','') + ',' + activeWindow.style.width.replace('px','') + ',' + activeWindowContent.style.height.replace('px','') + ',' + activeWindow.style.zIndex + ',' + state,50);

        }
        
        function initWindows(e,divObj)
        {
                
                
                var divs = document.getElementsByTagName('DIV');
                
                if(divObj){
                        var tmpDivs = divObj.getElementsByTagName('DIV');
                        var divs = new Array();
                        divs[divs.length] = divObj;
                        
                        for(var no=0;no<tmpDivs.length;no++){
                                divs[divs.length] = tmpDivs[no];
                        }
                }
                
                for(var no=0;no<divs.length;no++){
                        
                        if(divs[no].className=='dhtmlgoodies_window'){        
                
                                if(MSIEWIN){
                                        var iframe = document.createElement('IFRAME');
                                        iframe.style.border='0px';
                                        iframe.frameborder=0;
                                        iframe.style.position = 'absolute';
                                        iframe.style.backgroundColor = '#FFFFFF';
                                        iframe.style.top = '0px';
                                        iframe.style.left = '0px';
                                        iframe.style.zIndex = 100;
                                
                                        
                                        var subDiv = divs[no].getElementsByTagName('DIV')[0];
                                        divs[no].insertBefore(iframe,subDiv);
                                        
                                }                                        
                                if(divObj){
                                        divs[no].style.zIndex = currentZIndex;
                                        currentZIndex = currentZIndex /1 + 1;
                                }
                                
                                divCounter = divCounter + 1;        
                                if(divCounter==1)activeWindow = divs[no];                
                                divs[no].id = 'dhtml_goodies_id' + divCounter;        
                                divs[no].onmousedown = switchElement;
                                if(readSizeFromCookie)var cookiePos = Get_Cookie(divs[no].id + '_attr') + '';        else cookiePos = '';
                                if(divObj)cookiePos='';
                                var cookieValues = new Array();
                                
                                        
                                if(cookiePos.indexOf(',')>0){
                                        cookieValues = cookiePos.split(',');
                                        if(!windowPositionArray[divCounter])windowPositionArray[divCounter] = new Array();
                                        windowPositionArray[divCounter][0] = Math.max(0,cookieValues[0]);
                                        windowPositionArray[divCounter][1] = Math.max(0,cookieValues[1]);
                                }

                                if(cookieValues.length==5 && !zIndexSet){
                                        divs[no].style.zIndex = cookieValues[4];
                                        if(cookieValues[4]/1 > currentZIndex)currentZIndex = cookieValues[4]/1;                                        
                                }
                                if(windowPositionArray[divCounter]){
                                        divs[no].style.left = windowPositionArray[divCounter][0] + 'px';        
                                        divs[no].style.top = windowPositionArray[divCounter][1] + 'px';        
                                }
                                
                                var subImages = divs[no].getElementsByTagName('IMG');
                                for(var no2=0;no2<subImages.length;no2++){
                                        if(subImages[no2].className=='resizeImage'){
                                                subImages[no2].style.cursor = 'nw-resize';
                                                subImages[no2].onmousedown = initResizeWindow;
                                                subImages[no2].id = 'resizeImage' + divCounter;
                                                break;
                                        }        
                                        if(subImages[no2].className=='closeButton'){
                                                subImages[no2].id = 'closeImage' + divCounter;
                                                subImages[no2].onclick = hideWindow;        
                                        }        
                                        if(subImages[no2].className=='minimizeButton'){
                                                subImages[no2].id = 'minimizeImage' + divCounter;
                                                subImages[no2].onclick = minimizeWindow;        
                                                if(cookieValues.length==6 && cookieValues[5]=='0'){							
							setTimeout('minimizeWindow(false,document.getElementById("minimizeImage' + divCounter + '"))',10);
						}
						if(cookieValues.length==6 && cookieValues[5]=='1'){							
							windowStateArray[divCounter] = 1;
						}
						
						
					}
				}			
			}	
			if(divs[no].className=='dhtmlgoodies_windowMiddle' || divs[no].className=='dhtmlgoodies_window_bottom'){
				divs[no].style.zIndex = 1000;
				
			}
			if(divs[no].className=='dhtmlgoodies_window_top'){
				divs[no].onmousedown = initMove;
				divs[no].id = 'top_bar'+divCounter;
				divs[no].style.zIndex = 1000;
	
			}

			if(divs[no].className=='dhtmlgoodies_windowContent'){
				divs[no].id = 'windowContent'+divCounter;
				divs[no].style.zIndex = 1000;
				if(cookieValues && cookieValues.length>3){
					if(!windowSizeArray[divCounter])windowSizeArray[divCounter] = new Array();
					windowSizeArray[divCounter][0] = cookieValues[2];
					windowSizeArray[divCounter][1] = cookieValues[3];
				}	
				if(cookieValues && cookieValues.length==5){
					activeWindowContent = document.getElementById('windowContent' + divCounter);	
				}		
				if(windowSizeArray[divCounter]){
					divs[no].style.height = windowSizeArray[divCounter][1] + 'px';
					divs[no].parentNode.parentNode.style.width = windowSizeArray[divCounter][0] + 'px';
					
					if(MSIEWIN){
						iframe.style.width = (windowSizeArray[divCounter][0]) + 'px';
						iframe.style.height = (windowSizeArray[divCounter][1]+20) + 'px';
					}
				}
			}

			
		}	
		
		if(!divObj){
			document.documentElement.onmouseup = stopMove;	
			document.documentElement.onmousemove = moveWindow;
			document.documentElement.ondragstart = cancelEvent;
			document.documentElement.onselectstart = cancelEvent;
		}
		
		return divCounter;
	}

	function createNewWindow(width,height,left,top)
	{
		var div = document.createElement('DIV');
		div.className='dhtmlgoodies_window';
		document.body.appendChild(div);
		
	
			
					
		var topDiv = document.createElement('DIV');
		topDiv.className='dhtmlgoodies_window_top';
		div.appendChild(topDiv);
		
		var img = document.createElement('IMG');
		img.src = 'images/top_left.gif';
		img.align='left';
		topDiv.appendChild(img);
		
		var img = document.createElement('IMG');
		img.src = 'images/top_center.gif';
		img.className='topCenterImage';
		topDiv.appendChild(img);
		
		var buttonDiv = document.createElement('DIV');
		buttonDiv.className='top_buttons';
		topDiv.appendChild(buttonDiv);
		
		var img = document.createElement('IMG');
		img.src = 'images/minimize.gif';
		img.className='minimizeButton';
		buttonDiv.appendChild(img);	
		
		var img = document.createElement('IMG');
		img.src = 'images/close1.gif';
		img.className='closeButton';
		buttonDiv.appendChild(img);	
		
		var img = document.createElement('IMG');
		img.src = 'images/top_right.gif';
		buttonDiv.appendChild(img);		
		
		var middleDiv = document.createElement('DIV');
		middleDiv.className='dhtmlgoodies_windowMiddle';
		div.appendChild(middleDiv);
		
		var contentDiv = document.createElement('DIV');
		contentDiv.className='dhtmlgoodies_windowContent';
		middleDiv.appendChild(contentDiv);
		
		var bottomDiv = document.createElement('DIV');
		bottomDiv.className='dhtmlgoodies_window_bottom';
		div.appendChild(bottomDiv);
		
		var img = document.createElement('IMG');
		img.src = 'images/bottom_right.gif';
		img.className='resizeImage';
		bottomDiv.appendChild(img);		

		windowSizeArray[windowSizeArray.length] = [width,height];
		windowPositionArray[windowPositionArray.length] = [left,top];

		div.style.width =  width + 'px';
		contentDiv.style.height = height  + 'px';		
		div.style.left =  left + 'px';
		div.style.top = top  + 'px';	
			
		return initWindows(false,div);
		
		
		 	
	}
	
	function showAjaxContent(ajaxIndex,windowId)
	{
		document.getElementById('windowContent' + windowId).innerHTML = ajaxObjects[ajaxIndex].response;			
		
		
	}
	
	function addContentFromUrl(url,windowId)
	{
		var ajaxIndex = ajaxObjects.length;
		ajaxObjects[ajaxIndex] = new sack();
		ajaxObjects[ajaxIndex].requestFile = url;	// Specifying which file to get
		ajaxObjects[ajaxIndex].onCompletion = function(){ showAjaxContent(ajaxIndex,windowId); };	// Specify function that will be executed after file has been found
		ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function			
		
		
	}
	
	/* This function illustrates how you can create a new custom window dynamically */

	
	/* This function illustrates how you can create a new custom window dynamically */
	
	function customFunctionCreateWindow(urlToExternalFile,width,height,left,top)
	{		

		var divId = createNewWindow(width,height,left,top);
		document.getElementById('windowContent' + divId).innerHTML = 'Content of new window';
		if(urlToExternalFile)addContentFromUrl(urlToExternalFile,divId);	// Add content from external file
		


			
	}
		
	
	window.onload = initWindows;

