// -------------------------------------------------------------------
// DHTML Window Widget- By Dynamic Drive, available at: http://www.dynamicdrive.com
// v1.0: Script created Feb 15th, 07'
// v1.01: Feb 21th, 07' (see changelog.txt)
// v1.02: March 26th, 07' (see changelog.txt)
// v1.03: May 5th, 07' (see changelog.txt)
// -------------------------------------------------------------------

// example:
// dhtmlwindow.open("pagebox", "[inline | iframe | ajax | div]", "uri.html?t=" + new Date(), String title, "width=700px,height=489px,center=1|0,resize=1|0,scrolling=1|0");


if(window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;

var dhtmlwindow = {
imagefiles:['/images/iconMinus.gif', '/images/iconClose.gif', '/images/iconMaximize.gif', '/images/resize.gif'], //Path to 4 images used by script, in that order
ajaxbustcache: true, //Bust caching when fetching a file via Ajax?

minimizeorder: 0,
tobjects: [], //object to contain references to dhtml window divs, for cleanup purposes

init: function(t){
	
	var domwindow = document.createElement("div") //create dhtml window div
	domwindow.id = t
	domwindow.className = "dhtmlwindow";
	var domwindowdata = ''
	domwindowdata = '<div class="drag-handle">';
	domwindowdata += 'DHTML Window <div class="drag-controls" style="margin:2px 3px">'+
		'<img src="' + this.imagefiles[0] +'" title="Minimize" />&nbsp;&nbsp;<img src="' + this.imagefiles[1]+'" title="Close" /></div>'
	domwindowdata += '</div>';
	domwindowdata += '<div class="drag-contentarea"></div>';
	domwindowdata += '<div class="drag-statusarea"><div class="drag-resizearea" style="background: transparent url('+this.imagefiles[3]+') top right no-repeat;">&nbsp;</div></div>';
	domwindowdata += '</div>';
	domwindow.innerHTML = domwindowdata;
	
	document.getElementById("dhtmlwindowholder").appendChild(domwindow);
	
	this.zIndexvalue = (this.zIndexvalue)? this.zIndexvalue+1 : 100 //z-index value for DHTML window: starts at 0, increments whenever a window has focus
	

	if(window.ie6){
		this.iFrame = document.createElement("iframe"); //create dhtml window iframe
		this.iFrame.style.zIndex = this.zIndexvalue - 1; //set z-index of this dhtml window
					this.iFrame.style.position = 'absolute';
					this.iFrame.style.display = 'block';
					this.iFrame.style.visibility = 'visible';
					this.iFrame.style.width = document.documentElement.clientWidth + 'px';
					this.iFrame.style.height = document.documentElement.clientHeight + 'px';
					this.iFrame.style.margin = '0px';
					this.iFrame.style.padding = '0px';					
					this.iFrame.style.border = 'none';
					
					this.iFrame.frameborder = 0;
					this.iFrame.src = '';
					
		document.getElementById("dhtmlwindowholder").appendChild(this.iFrame);
		
	}
	
	var t = document.getElementById(t);
	
	var divs = t.getElementsByTagName("div")
	for (var i = 0; i < divs.length; i++){ //go through divs inside dhtml window and extract all those with class="drag-" prefix
		if(/drag-handle/.test(divs[i].className))
			t.dragHandle = divs[i];
		if(/drag-/.test(divs[i].className))
			t[divs[i].className.replace(/drag-/, "")] = divs[i] //take out the "drag-" prefix for shorter access by name
	}
	t.style.zIndex = this.zIndexvalue //set z-index of this dhtml window
	
	t.handle._parent = t //store back reference to dhtml window
	t.resizearea._parent = t //same
	t.controls._parent = t //same
	t.onclose = function(){return true} //custom event handler "onclose"
	t.onmousedown = function(){dhtmlwindow.zIndexvalue++; this.style.zIndex = dhtmlwindow.zIndexvalue} //Increase z-index of window when focus is on it
	t.handle.onmousedown = dhtmlwindow.setupdrag //set up drag behavior when mouse down on handle div
	t.resizearea.onmousedown = dhtmlwindow.setupdrag //set up drag behavior when mouse down on resize div
	t.controls.onclick = dhtmlwindow.enablecontrols
	t.show = function(){dhtmlwindow.show(this)} //public function for showing dhtml window
	t.hide = function(){dhtmlwindow.close(this)} //public function for hiding dhtml window
	t.setSize = function(w, h){dhtmlwindow.setSize(this, w, h)} //public function for setting window dimensions
	t.setSize = function(w, h){dhtmlwindow.setSize(this, w, h)} //public function for setting window dimensions
	t.moveTo = function(x, y){dhtmlwindow.moveTo(this, x, y)} //public function for moving dhtml window (relative to viewpoint)
	t.isResize = function(bol){dhtmlwindow.isResize(this, bol)} //public function for specifying if window is resizable
	t.isScrolling = function(bol){dhtmlwindow.isScrolling(this, bol)} //public function for specifying if window content contains scrollbars

	//t.scrapBookTracker = 0; // keep track of how manu daughters have been added to the scrapbook.
	
	t.load = function(contenttype, contentsource, title){dhtmlwindow.load(this, contenttype, contentsource, title)} //public function for loading content into window

	this.t = t;

	this.tobjects[this.tobjects.length] = t
	return t //return reference to dhtml window div
},

open: function(t, contenttype, contentsource, title, attr, recalonload, elmt){
	var d = dhtmlwindow //reference dhtml window object
	function getValue(Name){
		var config = new RegExp(Name+"=([^,]+)", "i") //get name/value config pair (ie: width=400px,)
		return (config.test(attr))? parseInt(RegExp.$1) : 0 //return value portion (int), or 0 (false) if none found
	}
	
	if (document.getElementById(t) == null){ //if window doesn't exist yet, create it
		t = this.init(t); //return reference to dhtml window div
		t.minimize = getValue("minimize");
		if(t.minimize < 0) t.controls.firstChild.parentNode.removeChild(t.controls.firstChild);
	} else {
		t = document.getElementById(t);
	}
	
	if(elmt){
		this.elmt = d.elmt = elmt;
		t.eventCaller = elmt.onclick;
	}
	
	t.setSize(getValue(("width")), (getValue("height"))) //Set dimensions of window
	var xpos = getValue("center")? "middle" : getValue("left") //Get x coord of window
	var ypos = getValue("center")? "middle" : getValue("top") //Get y coord of window
	//t.moveTo(xpos, ypos) //Position window
	
	if (typeof recalonload != "undefined" && recalonload == "recal" && this.scroll_top == 0){ //reposition window when page fully loads with updated window viewpoints?
		if (window.attachEvent && !window.opera) //In IE, add another 400 milisecs on page load (viewpoint properties may return 0 b4 then)
			this.addEvent(window, function(){setTimeout(function(){t.moveTo(xpos, ypos)}, 400)}, "load")
		else
			this.addEvent(window, function(){t.moveTo(xpos, ypos)}, "load")
	}
	
	t.isResize(getValue("resize")) //Set whether window is resizable
	t.isScrolling(getValue("scrolling")) //Set whether window should contain scrollbars
	t.dragable = getValue("drag");
	t.callout = getValue('callout');
	
	t.w = getValue('w');
	t.h = getValue('h');
	
	if(t.callout)  this.createCallout();
	
	if(t.dragable < 0) t.dragHandle.style.cursor = 'default';
	
	t.style.visibility = "visible";
	t.style.display = "block";
	if(window.ie6){
		this.iFrame.style.display = t.style.display;
	}
	t.contentarea.style.display = "block";
	t.moveTo(xpos, ypos) //Position window
	t.load(contenttype, contentsource, title)
	if (t.state == "minimized" && t.controls.firstChild.title == "Restore"){ //If window exists and is currently minimized?
		t.controls.firstChild.setAttribute("src", dhtmlwindow.imagefiles[0]) //Change "restore" icon within window interface to "minimize" icon
		t.controls.firstChild.setAttribute("title", "Minimize")
		t.state = "fullview" //indicate the state of the window as being "fullview"
	}
	return t
},
/*
createCallout: function(){
	if(!this.t.calloutImg){
		this.t.calloutImg = new Element('img', {
				'src': '/cmegroup/images/callout.gif'
			}
		).injectInside(this.t.calloutDiv = new Element('div', {}).injectInside(this.t));
	}
	
	var calloutDivStyle = {};
	if(this.elmt.getCoordinates().top < window.getScrollTop() + 4){
		this.t.calloutImg.src = '/cmegroup/images/callout_high.gif';
		calloutDivStyle = {'z-index':205, 'position':'absolute', 'left': '-4px', 'top': '-1px'};
		
	} else if(this.elmt.getCoordinates().bottom > (window.getScrollTop() + window.getHeight() - 4)){
		this.t.calloutImg.src = '/cmegroup/images/callout_low.gif';
		calloutDivStyle = {'z-index':205, 'position':'absolute', 'left': '-4px', 'top': (this.t.h + 19) + 'px'};
		
	} else {
		this.t.calloutImg.src = '/cmegroup/images/callout.gif';
		calloutDivStyle = {'z-index':205, 'position':'absolute', 'left': '-4px', 'top': (this.elmt.getCoordinates().top - window.getScrollTop() - top + 5) + 'px'};
	}
	
	this.t.calloutDiv.setStyles(calloutDivStyle);
},*/

setSize: function(t, w, h){ //set window size (min is 150px wide by 100px tall)
	//alert('t = ' + t + ', w = ' + w + ', h = ' + h);
	t.style.width						= Math.max(parseInt(w), 150)+"px";
	t.contentarea.style.height		= Math.max(parseInt(h), 100)+"px";
	if(window.ie6){
		this.iFrame.style.width		= Number(parseInt(t.style.width) + 2) + 'px'; // t.style.width
		this.iFrame.style.height	= t.offsetHeight + 'px';
	}
},

moveTo: function(t, x, y){ //move window. Position includes current viewpoint of document
	this.getviewpoint() //Get current viewpoint numbers
	t.style.left = (x == "middle")? this.scroll_left+(this.docwidth-t.offsetWidth)/2+"px" : this.scroll_left+parseInt(x)+"px";
	t.style.top = (y == "middle")? this.scroll_top+(this.docheight-t.offsetHeight)/2+"px" : this.scroll_top+parseInt(y)+"px"
	
	if(window.ie6){
		this.iFrame.style.left = (x == "middle")? this.scroll_left+(this.docwidth-t.offsetWidth)/2+"px" : this.scroll_left+parseInt(x)+"px";
		this.iFrame.style.top = (y == "middle")? this.scroll_top+(this.docheight-t.offsetHeight)/2+"px" : this.scroll_top+parseInt(y)+"px";
		this.iFrame.style.height = t.offsetHeight + "px";
	}
},

isResize: function(t, bol){ //show or hide resize interface (part of the status bar)
	t.statusarea.style.display = (bol)? "block" : "none"
	t.resizeBool = (bol)? 1 : 0
},

isScrolling: function(t, bol){ //set whether loaded content contains scrollbars
	t.contentarea.style.overflow= Boolean(bol) ? "auto" : "hidden"
},

load: function(t, contenttype, contentsource, title){ //loads content into window plus set its title (3 content types: "inline", "iframe", or "ajax")

	
	var contenttype = contenttype.toLowerCase() //convert string to lower case
	if (typeof title != "undefined"){
		t.handle.firstChild.nodeValue = t.title = title;
	}
	if (contenttype == "inline")
		t.contentarea.innerHTML = contentsource
	else if (contenttype == "div"){
		//t.contentarea.innerHTML = document.getElementById(contentsource).innerHTML //Populate window with contents of specified div on page
		//document.getElementById(contentsource).style.display = "none" //hide that div
		
		//t.contentarea.style.overflow = 'hidden';
		t.contentarea.appendChild(document.getElementById(contentsource));
		document.getElementById(contentsource).style.display = "block";
		
	}
	else if (contenttype == "iframe"){
		t.contentarea.style.overflow = "hidden" //disable window scrollbars, as iframe already contains scrollbars
		if (!t.contentarea.firstChild || t.contentarea.firstChild.tagName != "IFRAME") //If iframe tag doesn't exist already, create it first
			t.contentarea.innerHTML = '<iframe src = "" style="border:none; frameborder:no; margin:0px; padding:0px; width:100%; height: 100%" name="_iframe-'+t.id+'"></iframe>'
		window.frames["_iframe-"+t.id].location.replace(contentsource) //set location of iframe window to specified URL
		}
	else if (contenttype == "ajax"){
		this.ajax_connect(contentsource, t) //populate window with external contents fetched via Ajax
	}
	t.contentarea.datatype = contenttype //store contenttype of current window for future reference
},

setupdrag: function(e){
	if(this._parent.dragable > -1){
		var d = dhtmlwindow //reference dhtml window object
		var t = this._parent //reference dhtml window div
		d.etarget = this //remember div mouse is currently held down on ("handle" or "resize" div)
		var e = window.event || e
		d.initmousex = e.clientX //store x position of mouse onmousedown
		d.initmousey = e.clientY
		d.initx = parseInt(t.offsetLeft) //store offset x of window div onmousedown
		d.inity = parseInt(t.offsetTop)
		d.width = parseInt(t.offsetWidth) //store width of window div
		d.contentheight = parseInt(t.contentarea.offsetHeight) //store height of window div's content div
		if (t.contentarea.datatype == "iframe"){ //if content of this window div is "iframe"
			t.style.backgroundColor = "#F8F8F8" //colorize and hide content div (while window is being dragged)
			t.contentarea.style.visibility = "hidden"
		}
		document.onmousemove = d.getdistance //get distance travelled by mouse as it moves
		document.onmouseup = function(){
			if (t.contentarea.datatype == "iframe"){ //restore color and visibility of content div onmouseup
				t.contentarea.style.backgroundColor = "white"
				t.contentarea.style.visibility = "visible"
			}
			d.stop()
		}
	}
	return false
},

getdistance: function(e){
	var d = dhtmlwindow
	var etarget = d.etarget
	var e = window.event || e
	d.distancex = e.clientX-d.initmousex //horizontal distance travelled relative to starting point
	d.distancey = e.clientY-d.initmousey
	if (etarget.className == "drag-handle") //if target element is "handle" div
		d.move(etarget._parent, e)
	else if (etarget.className == "drag-resizearea") //if target element is "resize" div
		d.resize(etarget._parent, e)
	return false //cancel default dragging behavior
},

getviewpoint: function(){ //get window viewpoint numbers
	var ie = document.all && !window.opera
	var domclientWidth = document.documentElement && parseInt(document.documentElement.clientWidth) || 100000 //Preliminary doc width in non IE browsers
	this.standardbody = (document.compatMode == "CSS1Compat")? document.documentElement : document.body //create reference to common "body" across doctypes
	this.scroll_top = (ie)? this.standardbody.scrollTop : window.pageYOffset
	this.scroll_left = (ie)? this.standardbody.scrollLeft : window.pageXOffset
	this.docwidth = (ie)? this.standardbody.clientWidth : (/Safari/i.test(navigator.userAgent))? window.innerWidth : Math.min(domclientWidth, window.innerWidth-16)
	this.docheight = (ie)? this.standardbody.clientHeight: window.innerHeight
},

rememberattrs: function(t){ //remember certain attributes of the window when it's minimized or closed, such as dimensions, position on page
	this.getviewpoint() //Get current window viewpoint numbers
	t.lastx = parseInt((t.style.left || t.offsetLeft))-dhtmlwindow.scroll_left //store last known x coord of window just before minimizing
	t.lasty = parseInt((t.style.top || t.offsetTop))-dhtmlwindow.scroll_top
	t.lastwidth = parseInt(t.style.width) //store last known width of window just before minimizing/ closing
},

move: function(t, e){
	t.style.left = dhtmlwindow.distancex+dhtmlwindow.initx+"px"
	t.style.top = dhtmlwindow.distancey+dhtmlwindow.inity+"px";
	
	if(window.ie6){
		this.iFrame.style.left = dhtmlwindow.distancex+dhtmlwindow.initx+"px";
		this.iFrame.style.top = dhtmlwindow.distancey+dhtmlwindow.inity+"px";
	}
},

resize: function(t, e){
	t.style.width = Math.max(dhtmlwindow.width+dhtmlwindow.distancex, 150)+"px"
	t.contentarea.style.height = Math.max(dhtmlwindow.contentheight+dhtmlwindow.distancey, 100)+"px";
	
	if(window.ie6){
		this.iFrame.style.width = Number(parseInt(t.style.width) + 2) + 'px';
		this.iFrame.style.height = t.offsetHeight + "px";
	}
},

enablecontrols: function(e){
	var d = dhtmlwindow
	var sourceobj = window.event? window.event.srcElement : e.target //Get element within "handle" div mouse is currently on (the controls)
	if (/Minimize/i.test(sourceobj.getAttribute("title"))) //if this is the "minimize" control
		d.minimize(sourceobj, this._parent)
	else if (/Restore/i.test(sourceobj.getAttribute("title"))) //if this is the "restore" control
		d.restore(sourceobj, this._parent)
	else if (/Close/i.test(sourceobj.getAttribute("title"))) //if this is the "close" control
		d.close(this._parent)
	return false
},

minimize: function(button, t){
	dhtmlwindow.rememberattrs(t)
	button.setAttribute("src", dhtmlwindow.imagefiles[2])
	button.setAttribute("title", "Restore")
	/*t.state = "minimized" //indicate the state of the window as being "minimized"
	
	t.title = t.title.replace(/\:/, '');
	
	t.style.display = "none";
	if(!!MooTools){
		if(!$('breadcrumbs')){
			var oldBreadcrumbs = $$('.breadcrumb')[0].innerHTML;
			$$('.breadcrumb')[0].innerHTML = '';
			var newBreadcrumbs = new Element('div', {'id': 'breadcrumbs', 'class':'leftFloat'}).injectInside($$('.breadcrumb')[0]).innerHTML = oldBreadcrumbs;
			var scrapBook = new Element('div', {'id': 'scrapBook', 'class':'rightFloat rightAlign'}).injectInside($$('.breadcrumb')[0]);
		}
		++t.scrapBookTracker;
		dhtmlwindow.scrapBookTracker = t.scrapBookTracker;
		if(t.eventCaller){
			if(t.scrapBookTracker <= 5){
				var scrapBookItem = new Element('span', {'class':'scrapBookItem'}).injectInside($('scrapBook'));
			} else {
				var scrapBookItem = new Element('span', {'class':'scrapBookItemHidden'}).injectInside($('scrapBook'));
			}
			t.scrapBookTracker > 1 ? new Element('span', {'class':'divider'}).injectInside(scrapBookItem).appendText(" :: ") : null;
			new Element('a', {'href':'javascript:;', 'events':{'click': t.eventCaller}}).injectInside(scrapBookItem).innerHTML = t.scrapBookTracker +'. '+ t.title;
		}
		// cookie code...
	}*/
	
	
	t.contentarea.style.display = "none"
	t.statusarea.style.display = "none"
	
	if (typeof t.minimizeorder == "undefined"){ //stack order of minmized window on screen relative to any other minimized windows
		dhtmlwindow.minimizeorder++ //increment order
		t.minimizeorder = dhtmlwindow.minimizeorder
	}
	
	t.style.left = "10px" //left coord of minmized window
	t.style.width = "200px";
	
	var windowspacing = t.minimizeorder*10 //spacing (gap) between each minmized window(s)
	t.style.top = dhtmlwindow.scroll_top+dhtmlwindow.docheight-(t.handle.offsetHeight*t.minimizeorder)-windowspacing+"px";
	
	if(window.ie6){
		this.iFrame.style.left = t.style.left;
		this.iFrame.style.width	= "202px";
		this.iFrame.style.top = t.style.top;
		this.iFrame.style.height = t.offsetHeight + 'px';
	}
	
},

restore: function(button, t){
	dhtmlwindow.getviewpoint()
	button.setAttribute("src", dhtmlwindow.imagefiles[0])
	button.setAttribute("title", "Minimize")
	t.state = "fullview" //indicate the state of the window as being "fullview"
	t.style.display = "block"
	t.contentarea.style.display = "block"
	if (t.resizeBool) //if this window is resizable, enable the resize icon
		t.statusarea.style.display = "block"
	t.style.left = parseInt(t.lastx)+dhtmlwindow.scroll_left+"px" //position window to last known x coord just before minimizing
	t.style.top = parseInt(t.lasty)+dhtmlwindow.scroll_top+"px"
	t.style.width = parseInt(t.lastwidth)+"px";
	
	if(window.ie6){
		this.iFrame.style.left = t.style.left;
		this.iFrame.style.width	= (2 + parseInt(t.lastwidth)) +"px";
		this.iFrame.style.top = t.style.top;
		this.iFrame.style.height = t.offsetHeight + 'px';
	}
},


close: function(t){
	try{
		var closewinbol = t.onclose();
	} catch(err){ //In non IE browsers, all errors are caught, so just run the below
		var closewinbol = true
	} finally { //In IE, not all errors are caught, so check if variable isn't defined in IE in those cases
		if (typeof closewinbol == "undefined"){
			//alert("An error has occured somwhere inside your \"onclose\" event handler")
			var closewinbol = true
		}
	}
	if (closewinbol){ //if custom event handler function returns true
		if (t.state != "minimized") {//if this window isn't currently minimized
			dhtmlwindow.rememberattrs(t) //remember window's dimensions/position on the page before closing
		}
		
		t.style.display = "none";
		if(window.ie6){
			this.iFrame.style.display = t.style.display;
		}
	}
	
	if(!!MooTools){
		if(dhtmlwindow.elmt)
			if($(dhtmlwindow.elmt).getParent().className == 'scrapBookItem')
				dhtmlwindow.elmt.getParent().remove();
	}
	
	return closewinbol;
},

show: function(t){
	if (t.lastx) //If there exists previously stored information such as last x position on window attributes (meaning it's been minimized or closed)
		dhtmlwindow.restore(t.controls.firstChild, t) //restore the window using that info
	else{
		t.style.display = "block";
		if(window.ie6){
			this.iFrame.style.display = t.style.display;
		}
	}
	t.state = "fullview" //indicate the state of the window as being "fullview"
},

ajax_connect: function(url, t){
	if(!!MooTools){
		var myAjax = new Ajax(url, {method: 'get', update: t.contentarea, evalScripts:true}).request();
		return;
	}
	
	var page_request = false
	var bustcacheparameter = ""
	if (window.XMLHttpRequest) // if Mozilla, IE7, Safari etc
		page_request = new XMLHttpRequest()
	else if (window.ActiveXObject){ // if IE6 or below
		try {
		page_request = new ActiveXObject("Msxml2.XMLHTTP")
		} 
		catch (e){
			try{
			page_request = new ActiveXObject("Microsoft.XMLHTTP")
			}
			catch (e){}
		}
	}
	else
		return false
		
	page_request.onreadystatechange = function(){dhtmlwindow.ajax_loadpage(page_request, t)}
	if (this.ajaxbustcache) //if bust caching of external page
		bustcacheparameter = (url.indexOf("?") != -1)? "&"+new Date().getTime() : "?"+new Date().getTime()
	page_request.open('GET', url+bustcacheparameter, true)
	page_request.send(null)
},

ajax_loadpage: function(page_request, t){
	if (page_request.readyState == 4 && (page_request.status == 200 || window.location.href.indexOf("http") == -1)){
		t.contentarea.innerHTML = page_request.responseText
	}
},


stop: function(){
	dhtmlwindow.etarget = null //clean up
	document.onmousemove = null
	document.onmouseup = null
},

addEvent: function(target, functionref, tasktype){ //assign a function to execute to an event handler (ie: onunload)
	var tasktype = (window.addEventListener)? tasktype : "on"+tasktype
	if (target.addEventListener)
		target.addEventListener(tasktype, functionref, false)
	else if (target.attachEvent)
		target.attachEvent(tasktype, functionref)
},

cleanup: function(){
	for (var i = 0; i<dhtmlwindow.tobjects.length; i++){
		dhtmlwindow.tobjects[i].handle._parent = dhtmlwindow.tobjects[i].resizearea._parent = dhtmlwindow.tobjects[i].controls._parent = null
	}
	window.onload = null
}

} //End dhtmlwindow object

document.write('<div id="dhtmlwindowholder"><span style="display:none">.</span></div>') //container that holds all dhtml window divs on page
window.onunload = dhtmlwindow.cleanup
