// guistuff.js

/*****************************************************************/
/** Inline "Popup" Window
/*****************************************************************/

function Dialog(dialogId){
	this.id					= dialogId;
	this.height			= 150;
	this.width 			= 200;
	this.url			= false;
	this.title			= '';
	this.imageId		= false;
	this.onclose		= function(){};
	this.closeImg 		= 'close-small.gif';
	this.showTitle		= true;
	this.contentDiv		= false;
	this.modal 			= true;
}

Dialog.prototype.show = function(imageId) {
	// only proceed if we haven't before
	if(document.getElementById(this.id) != null) return false;
	
	// imageId is an optional parameter
	this.imageId = (typeof imageId == 'undefined'?false:imageId);

	var bodyEl = document.getElementsByTagName("body")[0];
	var divEl = document.createElement("div");
	
	divEl.id = this.id;
	divEl.className = 'guiDialog';
	divEl.style.visibility = 'hidden';
	
	var scrollPos = gs_getScrollingPosition();
	var viewSize = gs_getViewportSize();
	var pageDim = gs_getPageDimensions();
	
	if(viewSize[1] > pageDim[1]) pageDim[1] = viewSize[1];
	
	// create the overlay
	if(this.modal){
		var overlayEl = document.createElement("div");
		overlayEl.id = 'overlay';
		//overlayEl.style.height = ((viewSize[1] > bodyEl.offsetHeight)?viewSize[1]:bodyEl.offsetHeight + 30) + 'px';
		//overlayEl.style.width = ((viewSize[0] > bodyEl.offsetWidth)?viewSize[0]:bodyEl.offsetWidth + 30) + 'px';
		overlayEl.style.height = pageDim[1] + 'px';
		overlayEl.style.width = pageDim[0] + 'px';
	}

	// create the titlebar
	var titleBarEl = document.createElement("div");
	titleBarEl.id = this.id + '_titleBar';
	titleBarEl.className = 'guiTitlebar';
	
	// create the close button
	var closeEl = document.createElement('a');
	var closeImgEl = document.createElement('img');
	closeImgEl.src = this.closeImg;
	closeEl.style.border = 'none';
	closeEl.style.cssFloat = 'right';
	closeEl.style.styleFloat = 'right';
	closeEl.appendChild(closeImgEl);
	closeEl.href='javascript:Dialog_Dispose(\'' + this.id + '\');';
	closeEl.onclick = this.onclose;
	
	// add the titlebar text
	titleBarEl.appendChild(closeEl);
	titleBarEl.appendChild(document.createTextNode(this.title));
	
	//add the title bar
	if(this.showTitle)
		divEl.appendChild(titleBarEl);
	
	// add the dialog box to the document
	bodyEl.appendChild(divEl);
	
	//add iframe if url specified
	if(this.url != false){
		var iframe = document.createElement('iframe');
		iframe.src = this.url
		iframe.frameBorder = '0';
		iframe.scrolling = 'no';
		iframe.style.border = 'none';
		iframe.style.width = this.width + 'px';
		iframe.style.height = this.height - (this.showTitle?titleBarEl.offsetHeight:0) + 'px';
		divEl.appendChild(iframe);
	}
	
	// add image if image specified
	if(this.imageId != false){
		var imageViewEl = new Image();
		var pageImageEl = document.getElementById(this.imageId);
		imageViewEl.src = pageImageEl.src;
		imageViewEl.style.margin = '10px 10px';
		// set window size to image size
		this.height = imageViewEl.height + (this.showTitle?titleBarEl.offsetHeight:0) + 20;
		this.width = imageViewEl.width + 20;
		divEl.appendChild(imageViewEl);
	}
	
	if(this.contentDiv != false){
		var content = document.getElementById(this.contentDiv);
		if(typeof content != 'undefined'){
			var contentDiv = document.createElement('div');
			contentDiv.style.overflow = 'auto';
			contentDiv.style.width = this.width + 'px';
			contentDiv.style.height = this.height - (this.showTitle?titleBarEl.offsetHeight:0) + 'px';
			content.style.display = '';
			contentDiv.appendChild(content);
			divEl.appendChild(contentDiv);
		}
	}

	// set the size and position
	divEl.style.height = this.height + 'px';
	divEl.style.width = this.width + 'px';
	divEl.style.left = scrollPos[0] + (viewSize[0] - this.width)/2 + 'px';
	divEl.style.top = scrollPos[1] + (viewSize[1] - this.height)/2 + 'px';
	
	// hide all the select elements
	gs_toggleSelects('hidden');

	// add the overlay to the document
	if(this.modal) 
		bodyEl.appendChild(overlayEl);
	
	// show the div element
	divEl.style.visibility = 'visible';

	// attach drag events
	titleBarEl.onmousedown = function(event){
		var event = (typeof event == 'undefined')?window.event:event;
		if((typeof this.id != 'undefined') && (gs_getEventTarget(event).id.indexOf('_titleBar') > 0)){
			document.dragObject = gs_getEventTarget(event).parentNode;
			document.offsetX = (event.clientX + scrollPos[0]) - document.dragObject.offsetLeft;
			document.offsetY = (event.clientY + scrollPos[1]) - document.dragObject.offsetTop;
			// cancel out any text selections 
			document.body.focus();
			document.onselectstart = function(){return false;};
			// if we're dealing with an iframe it needs to be hidden
			var iframes = document.dragObject.getElementsByTagName('iframe');
			if(iframes[0] != null)iframes[0].style.display = 'none';
			document.onmousemove = function(event){
				if(document.dragObject == null){
					document.onmousemove = null;
					document.onmouseup = null;
					document.onselectstart = null;
				}else{
					var event = (typeof event == 'undefined')?window.event:event;
					document.onmouseup = function(event){
						// restore any hidden iframes
						var iframes = document.dragObject.getElementsByTagName('iframe');
						if(iframes[0] != null)iframes[0].style.display = '';
						document.dragObject = null;
					};
					document.dragObject.style.top = event.clientY + scrollPos[1] - document.offsetY + 'px';
					document.dragObject.style.left = event.clientX + scrollPos[0] - document.offsetX + 'px';
				}
			};
			return false;
		}
	};
	return false;
};

Dialog.prototype.dispose = function(){
	if(document.getElementById(this.id) != null)
		this.onclose();
	Dialog_Dispose(this.id);
	return false;	
};

Dialog.prototype.close = function(){
	if(document.getElementById(this.id) != null)
		this.onclose();
	Dialog_Dispose(this.id);
	return false;
};

function Dialog_Dispose(dialogId) {
	var divEl = document.getElementById(dialogId);

	if(typeof divEl != 'undefined'){
		divEl.parentNode.removeChild(divEl);
		
		var mask = document.getElementById(divEl.id + '_mask');
		if(typeof mask != 'undefined' && mask != null) mask.parentNode.removeChild(mask);
		
		// remove the overlay
		var overlayEl = document.getElementById('overlay');
		if(typeof overlayEl != 'undefined' && overlayEl != null)
			overlayEl.parentNode.removeChild(overlayEl);
		
		// show all the select elements
		gs_toggleSelects('visible');
	}
}


/*****************************************************************/
/** Support methods
/*****************************************************************/

function gs_createMask(obj){
	var iframe = document.createElement('iframe');

	iframe.src = 'javascript:false;';
	iframe.tabIndex = '-1';
	iframe.style.border = 'none';
	iframe.style.position = 'absolute';
	iframe.style.zIndex = '9998';
	iframe.id = obj.id + '_mask';
	iframe.style.top = obj.offsetTop + 'px';
	iframe.style.left = obj.offsetLeft + 'px';
	iframe.style.width = obj.offsetWidth + 'px';
	iframe.style.height = obj.offsetHeight + 'px';
	obj.parentNode.appendChild(iframe);
}

function gs_getEventTarget(event){
	if(typeof event.target == 'undefined'){
		return event.srcElement;
	}else{
		return event.target;
	}
}

function gs_getScrollingPosition(){
 var position = [0, 0];

 if (typeof window.pageYOffset != 'undefined')
 {
   position = [
       window.pageXOffset,
       window.pageYOffset
   ];
 }

 else if (typeof document.documentElement.scrollTop
     != 'undefined' && document.documentElement.scrollTop > 0)
 {
   position = [
       document.documentElement.scrollLeft,
       document.documentElement.scrollTop
   ];
 }

 else if (typeof document.body.scrollTop != 'undefined')
 {
   position = [
       document.body.scrollLeft,
       document.body.scrollTop
   ];
 }

 return position;
}

function gs_getViewportSize(){
 var size = [0, 0];

 if (typeof window.innerWidth != 'undefined')
 {
   size = [
       window.innerWidth,
       window.innerHeight
   ];
 }
 else if (typeof document.documentElement != 'undefined'
     && typeof document.documentElement.clientWidth !=
     'undefined' && document.documentElement.clientWidth != 0)
 {
   size = [
       document.documentElement.clientWidth,
       document.documentElement.clientHeight
   ];
 }
 else
 {
   size = [
       document.getElementsByTagName('body')[0].clientWidth,
       document.getElementsByTagName('body')[0].clientHeight
   ];
 }

 return size;
}

function gs_getPageDimensions() {
	var body = document.getElementsByTagName('body')[0];
	var bodyOffsetWidth = 0;
	var bodyOffsetHeight = 0;
	var bodyScrollWidth = 0;
	var bodyScrollHeight = 0;
	var pageDimensions = [0,0];
	
	if (typeof document.documentElement != 'undefined' && typeof document.documentElement.scrollWidth != 'undefined'){
			pageDimensions[0] = document.documentElement.scrollWidth;
			pageDimensions[1] = document.documentElement.scrollHeight;
	}
	
	bodyOffsetWidth = body.offsetWidth;
	bodyOffsetHeight = body.offsetHeight;
	bodyScrollWidth = body.scrollWidth;
	bodyScrollHeight = body.scrollHeight;
	
	if (bodyOffsetWidth > pageDimensions[0]) pageDimensions[0] = bodyOffsetWidth;
	
	if (bodyOffsetHeight > pageDimensions[1]) pageDimensions[1] = bodyOffsetHeight;
	
	if (bodyScrollWidth > pageDimensions[0]) pageDimensions[0] = bodyScrollWidth;
	
	if (bodyScrollHeight > pageDimensions[1]) pageDimensions[1] = bodyScrollHeight;
	
	return pageDimensions;
}

function gs_findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		// this loop will continue until offsetParent doesn't exist and obj evals to null
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function gs_attachEventListener(target, eventType, functionRef, capture){
	if(typeof target.addEventListener != 'undefined'){
		target.addEventListener(eventType, functionRef, capture);
	}else if(typeof target.attachEvent != 'undefined'){
		var functionString = eventType + functionRef;
		target['e' + functionString] = functionRef;
		
		target[functionString] = function(event){
			if(typeof event == 'undefined'){
				event = window.event;
			}
			target['e' + functionString](event);
		};
		target.attachEvent('on' + eventType, target[functionString]);
	}else{
		eventType = 'on' + eventType;
		
		if(typeof target[eventType] == 'function'){
			var oldListener = target[eventType];
			target[eventType] = function(){
				oldListener();
				return functionRef();
			};
		}else{
			target[eventType] = functionRef;
		}
	}
}

function gs_detachEventListener(target, eventType, functionRef, capture){
	if(typeof target.removeEventListener != 'undefined'){
		target.removeEventListener(eventType, functionRef, capture);
	}else if(typeof target.detachEvent != 'undefined'){
		var functionString = eventType + functionRef;
		target.detachEvent('on' + eventType, target[functionString]);
		target['e' + functionString] = null;
		target[functionString] = null;
	}else{
		target['on' + eventType] = null;
	}
}

function gs_toggleSelects(visibility){
	if(!document.all) return false;
    selects = document.getElementsByTagName('select');
	for(var i = 0; i < selects.length; i++) {
		selects[i].style.visibility = visibility;
    } 
}

