/************************************************************************************************************ @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 = [300,300]; // 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;no0) { 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;no23) { 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 = 'http://agenciearchitects.com/images/top_left.gif'; //img.align='left'; //topDiv.appendChild(img); //var img = document.createElement('IMG'); //img.src = 'http://agenciearchitects.com/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 = 'http://agenciearchitects.com/images/minimize.gif'; //img.className='minimizeButton'; //buttonDiv.appendChild(img); var img = document.createElement('IMG'); img.src = 'http://agenciearchitects.com/images/close_win.gif'; img.className='closeButton'; buttonDiv.appendChild(img); //var img = document.createElement('IMG'); //img.src = 'http://agenciearchitects.com/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 = 'http://agenciearchitects.com/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 */ 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;