/*------------------------------------------------------------------------------- 
 *
 *	Copyright:			M.H.M. Creemers
 *
 *	Module:					xx_dhtmlapi.js
 *
 * $Id: xx_dhtmlapi.js 26 2004-07-29 07:48:39Z thijs $
 * 
 *	Date Created:		2003/03/14
 *	Target Release:	1.0	
 * 
 *
 *	$Author: thijs $
 *	$Revision: 26 $
 *	$Date: 2004-07-29 09:48:39 +0200 (Thu, 29 Jul 2004) $
 *
 *-------------------------------------------------------------------------------
 *
 * $Log: xx_dhtmlapi.js,v $
 * Revision 1.2  2003/06/25 19:19:25  thijs
 * dev checkin
 *
 * Revision 1.1  2003/05/19 17:53:42  thijs
 * no message
 *
 * Revision 1.1  2003/03/21 12:52:48  thijs
 * no message
 *
 *
 *-------------------------------------------------------------------------------
 */

// Global variables
var isCSS, isW3C, isIE4, isNN4, isIE6CSS;
var initialized = false;

// initialize upon load to let all browsers establish content objects
function init_dhtmlapi() {
	if (!initialized) {
  	if (document.images) {
  		isCSS = (document.body && document.body.style) ? true : false;
  		isW3C = (isCSS && document.getElementById) ? true : false;
		  isIE4 = (isCSS && document.all) ? true : false;
  		isNN4 = (document.layers) ? true : false;
  		isIE6CSS = (document.compatMode && document.compatMode.indexOf("CSS1") >= 0) ? true : false;
  	}
	  initialized = true;
  }
}

// set event handler to initialize API
window.onload = init_dhtmlapi;

// Seek nested NN4 layer from string name
function seek_layer(doc, name) {
  var theObj;
  for (var i=0; i < doc.layers.length;i++) {
  	if (doc.layers[i].name == name) {
  		theObj = doc.layers[i];
  		break;
 		}
  	// dive into nested layers if necessary
  	if (doc.layers[i].document.layers.length > 0) {
  		theObj = seek_layer(document.layers[0].document, name)
  	}
  }
  return theObj;
}

// Convert objectname string or object reference
// into a valid object reference
function get_object(obj) {
  var theObj;
  if (typeof(obj) == "string") {
  	if (isW3C) {
  		theObj = document.getElementById(obj);
  	} else if (isIE4) {
  		theobj = document.all(obj);
  	} else if (isNN4) {
  		theObj = seek_layer(document, obj);
  	}
  } else {
  	// pass throug the object reference
  	theObj = obj;
  }
  //alert('In get_object : '+theObj);
  return theObj;
}

// Convert objectname string or object reference
// into a valid style (or NN4 layer) reference
function get_object_style(obj) {
  var theObj = get_object(obj);
  if (theObj && isCSS) {
  	theObj = theObj.style
  }
  return theObj;
}

// position an an object at specific pixel coordinate
function shift_to(obj, x, y) {
  var theObj = get_object_style(obj);
  if (theObj) {
  	if (isCSS) {
  		// equalize incorrect numeric type
  		var units = (typeof theObj.left == "string") ? "px" : 0;
  		theObj.left = x + units;
  		theObj.top = y + units;
  	} else if (isNN4) {
  		theObj.moveTo(x,y);
  	}
  }
}

// Move an object by x and/or y pixels
function shift_by(obj, deltaX, deltaY) {
  var theObj = get_object_style(obj);
  if (theObj) {
  	if (isCSS) {
  		// equalize incorrect numeric type
  		var units = (typeof theObj.left == "string") ? "px" : 0;
  		theObj.left = get_object_left(obj) + deltaX + units;
  		theObj.top = get_object_top(obj) + deltaY + units;
  	} else if (isNN4) {
  		theObj.moveBy(deltaX, deltaY);
  	}
  }
}

// Set the z-order of an object
function set_z_index(obj, zOrder) {
  var theObj = get_object_style(obj);
  if (theObj) {
  	theObj.zIndex = zOrder;
  }
}

// Set the backgroundcolor of an object
function set_bgcolor(obj, color) {
  var theObj = get_object_style(obj);
  if (theObj) {
  	if (isNN4) {
  		theObj.bgcolor = color;
  	} else if (isCSS) {
  		theObj.backgroundColor = color;
  	}
  }
}	

// Set visibilty of an object to hidden
function set_hidden(obj){
  var theObj = get_object_style(obj);
  if (theObj) {
  	theObj.visibility = "hidden";
  }
}

// Set visibilty of an object to visible
function set_visible(obj){
  var theObj = get_object_style(obj);
  if (theObj) {
  	theObj.visibility = "visible";
  }
}

// Hide the object
function hide(obj){
  var theObj = get_object_style(obj);
  if (theObj) {
  	if (isCSS) {
    	theObj.display = "none";
  	}
    set_hidden(obj);
  }
}

// Show the object
function show(obj){
  var theObj = get_object_style(obj);
  if (theObj) {
  	if (isCSS) {
  		theObj.display = "block";
  	}
  	set_visible(obj);
  }
}

// retrieve the x coordinate of a positionable object
function get_object_left(obj) {
  var elem = get_object(obj);
  var result = 0;
  if (document.defaultView) {
  	var style = document.defaultView;
  	var cssDecl = style.getComputedStyle(elem, "");
  	result = cssDecl.getPropertyValue("left");
  } else if (elem.currentStyle) {
  	result = elem.currentStyle.left;
  } else if (elem.style) {
  	result = elem.style.left;
  } else if (isNN4) {
  	result = elem.left;
  }
  return parseInt(result);
}

// retrieve the y coordinate of a positionable object
function get_object_top(obj) {
  var elem = get_object(obj);
  var result = 0;
  if (document.defaultView) {
    var style = document.defaultView;
    var cssDecl = style.getComputedStyle(elem, "");
  	result = cssDecl.getPropertyValue("top");
  } else if (elem.currentStyle) {
  	result = elem.currentStyle.top;
  } else if (elem.style) {
  	result = elem.style.top;
  } else if (isNN4) {
  	result = elem.top;
  }
  return parseInt(result);
}

// Retrieve the rendered width of an element
function get_object_width(obj) {
  var elem = get_object(obj);
  var result = 0;
  if (elem.offsetWidth) {
  	if (elem.scrollWidth && (elem.offsetWidth != elem.scrollWidth)) {
		  result = elem.scrollWidth;
  	} else {
  		result = elem.offsetWidth;
  	}
  } else if (elem.clip && elem.clip.width) {
  	result = elem.clip.width;
  } else if (elem.style && elem.style.pixelwidth) {
  	result = elem.style.pixelWidth;
  }
  return parseInt(result);
}

// Retrieve the rendered height of an element
function get_object_height(obj) {
  var elem = get_object(obj);
  var result = 0;
  if (elem.offsetHeight) {
  	if (elem.scrollHeight && (elem.offsetHeight != elem.scrollHeight)) {
  		result = elem.scrollHeight;
  	} else {
  		result = elem.offsetHeight;
  	}
  } else if (elem.clip && elem.clip.height) {
  	result = elem.clip.height;
  } else if (elem.style && elem.style.pixelheight) {
  	result = elem.style.pixelHeight;
  }
  return parseInt(result);
}

// Retrieve the available content width space in the browser window
function get_inside_window_width() {
  if (window.innerWidth) {
  	return window.innerWidth;
  } else if (isIE6CSS) {
  	// measure the html elements clientWidth
  	return document.body.parentElement.clientWidth;
  } else if (document.body && document.body.clientWidth) {
  	return document.body.clientWidth;
  }
  return 0;
}

// Retrieve the available content height space in the browser window
function get_inside_window_height() {
  if (window.innerHeight) {
  	return window.innerHeight;
  } else if (isIE6CSS) {
  	// measure the html elements clientHeight
  	return document.body.parentElement.clientHeight;
  } else if (document.body && document.body.clientHeight) {
  	return document.body.clientHeight;
  }
  return 0;
}

// Programatic attaching of events 
function addEvent(obj, evType, fn, useCapture)
{
	theObj = get_object(obj);
	if (theObj) {
  	if (theObj.addEventListener) {
  		// Mozilla1+ & NS6+
  		theObj.addEventListener(evType, fn, useCapture);
  		return true;
  	} else if (theObj.attachEvent) {
  		// IE5+
  		var r = theObj.attachEvent("on"+evType, fn);
  		return r;
  	} else {
	    //alert('evaluate: theObj.on'+evType+' = '+fn+';');
  		eval('theObj.on'+evType+' = '+fn+';');
	 	}
  }
}

// Programatic detaching of events
function removeEvent(obj, evType, fn, useCapture)
{
  if (obj.removeEventListener) {
  	// Mozilla1+ & NS6+
  	obj.removeEventListener(evType, fn, useCapture);
  	return true;
  } else if (obj.detachEvent) {
  	// IE5+
  	var r = obj.detachEvent("on"+evType, fn);
  	return r;
  } else if (obj.removeAttribute) {
  	//Older browsers and Mac IE
  	obj.removeAttribute("on"+evType)
  } else {
  	alert("Handler could not be removed");
  }
}

// drag 'n drop functions
var selectedObject;
var offsetX, offsetY;

// Set global reference to element being engaged and dragged
function set_selected_element(evt) {
	var target = (evt.target) ? evt.target : evt.srcElement;
	var divID = target.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id; //(target.name && target.src) ? target.name + "Wrap" : "";
	if (divID) {
		if (document.layers) {
			selectedObject = document.layers[divID];
		} else if (document.all) {
			selectedObject = document.all(divID);
		} else if (document.getElementById) {
			selectedObject = document.getElementById(divID);
		}
		selectedObject.style.position = 'absolute';
		set_z_index(selectedObject, 100);
		return
	}
	selectedObject = null;
	return;
}

// drag an element
function drag_it(evt) {
	evt = (evt) ? evt : event;
	if (selectedObject) {
		if (evt.pageX) {
			shift_to(selectedObject, (evt.pageX - offsetX), (evt.pageY - offsetY));
		} else if (evt.clientX || evt.clientY) {
			shift_to(selectedObject, (evt.clientX - offsetX), (evt.clientY - offsetY));
		}
		evt.cancelBubble = true;
		return false;
	}
}

// Turn selected element on
function engage(evt) {
	evt = (evt) ? evt : event;
	if (selectedObject) {
		if (evt.pageX) {
			offsetX = evt.pageX - ((selectedObject.offsetLeft) ? selectedObject.offsetLeft : selectedObject.Left);
			offsetY = evt.pageY - ((selectedObject.offsetTop) ? selectedObject.offsetTop : selectedObject.Top);
		}
		else if (evt.offsetX || evt. offsetY) {
			offsetX = evt.offsetX - ((evt.offsetX < -2) ? 0 : document.body.scrollLeft);
			offsetY = evt.offsetY - ((evt.offsetY < -2) ? 0 : document.body.scrollTop);
		}			
		else if (evt.clientX) {
			offsetX = evt.clientX - ((selectedObject.offsetLeft) ? selectedObject.offsetLeft: 0);
			offsetY = evt.clientY - ((selectedObject.offsetLeft) ? selectedObject.offsetTop: 0);
		}
		return false;
	}			
}

// Turn selected element off
function release(evt) {
	//selectedObject.style.position = 'relative';
	if (selectedObject) {
		set_z_index(selectedObject, 1);
		selectedObject = null;
	}
}

