//
// Browser detection
//

//
// Script below from QuirksMode - unrestricted use (see http://www.quirksmode.org/about/copyright.html)
//
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
		return "";
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return "";
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();


// Original browser detection.
var myAgent = navigator.userAgent.toLowerCase();
var myVersion = parseInt(navigator.appVersion);

var is_ie  = ((myAgent.indexOf("msie") != -1) 
           && (myAgent.indexOf("opera") == -1));
var is_ff  =  (myAgent.indexOf("firefox") != -1);
var is_nav = ((myAgent.indexOf('mozilla') != -1) 
           && (myAgent.indexOf('spoofer') == -1) 
           && (myAgent.indexOf('compatible') == -1) 
           && (myAgent.indexOf('opera') == -1)
           && (myAgent.indexOf('webtv') == -1) 
           && (myAgent.indexOf('hotjava') == -1));
var is_win = ((myAgent.indexOf("win") != -1) 
           || (myAgent.indexOf("16bit") != -1));
var is_mac =  (myAgent.indexOf("mac") != -1);


//
// Generic form validation
//
var emailPattern  		= new RegExp("^[-&a-zA-Z0-9/._+']+@[-a-zA-Z0-9]+[-a-zA-Z0-9.]*\\.[-a-zA-Z0-9]+$");
var domainPattern 		= new RegExp("^[-a-zA-Z0-9]+[-a-zA-Z0-9.]*\\.[-a-zA-Z0-9]+$");
var doubleDotsFilePattern	= new RegExp("^.+\\.\\..+$");

// Generic HTML-editor functions 
var hasTinyMCE	 = false;

function isHTMLEditorActive(formField, name) {
	var active = false;
	if (typeof(tinyMCE) != "undefined") {
		hasTinyMCE = true;
		if (tinyMCE.getInstanceById(name) || tinyMCE.getInstanceById("id_"+name)) {
			active = true;
		}
	}
	return (active)
}
function getHTMLEditorSource(name) {
	var htmlsrc = "";
	if (hasTinyMCE) {
		if (tinyMCE.get('id_'+name)) { 
			htmlsrc = tinyMCE.get('id_'+name).getContent();
		} else if (tinyMCE.get(name)) {
			htmlsrc = tinyMCE.get(name).getContent();
		}
	}
	if (typeof(htmlsrc) == "undefined") { htmlsrc = ""; }
	return htmlsrc;
}
function focusOnHTMLEditor(name) {
	if (hasTinyMCE) {
		if (tinyMCE.get('id_'+name)) { 
			tinyMCE.execCommand('mceFocus', false, 'id_'+name);
		} else if (tinyMCE.get(name)) {
			tinyMCE.execCommand('mceFocus', false, name);
		}
	}
}
// End of HTML-editor functions

function y2k(number) { 
	return (number < 1000) ? number + 1900 : number;
}
function getValue(formField, name) {
	if (formField.type == "text" || formField.type == "textarea" || formField.type == "password" || formField.type == "hidden" || formField.type == "file") {
		if (name && isHTMLEditorActive(formField, name)) {
			return trim(getHTMLEditorSource(name));
		} else {
			return trim(formField.value);
		}
	} else if (formField.type == "checkbox") {
		return formField.checked ? trim(formField.value) : "";
	} else if (formField.type == "select-one" || formField.type == "select-multiple") {
		return trim(formField.options[formField.selectedIndex].value);
	} else {
		for (var i=0; i < formField.length; i++) {
			if (formField[i].checked) {
				return trim(formField[i].value);
			}
		}
	}
	return "";
}
function trim(str) { 
	return (str != null ? (str.replace(/^\s*/, '').replace(/\s*$/, '')) : null); 
}
var doFormChecking = true;
function disableFormChecking() {
	doFormChecking = false;
}
function enableFormChecking() {
	doFormChecking = true;
}

// DataType can be int,float,text,date,select,email,domain,radio,colour
function checkField(form, name, label, dataType, status, minSize, maxSize) {
	var editor_obj = null;
	name		= trim(name);
	label		= trim(label);
	dataType	= trim(dataType);
	status		= trim(status);
	if (minSize) { minSize = trim(minSize); }
	if (maxSize) { maxSize = trim(maxSize); }
	var formField = "";
	if (dataType == "date") {
		formField 	= form.elements[name + "Year"];
	} else {
		formField = form.elements[name];
	}

	if (! formField) {
		return true;
		alert("The field '" + name + "' does not exist"); return false;
	}
	
	if (!(dataType=='file'||dataType=='text'||dataType=='int'||dataType=='float'||dataType=='domain'||dataType=='email'||dataType=='select'||dataType=='date'||dataType=='radio'||dataType=='aclcheck'||dataType=='notify'||dataType=='phone'||dataType=='colour')) {
		alert("Unknown datatype:" + dataType); return false;
	}

	var value = getValue(formField, name);
	if (value == '' || (value == '--' && dataType=='select') || ((value == 'yyyy'||value == 'YYYY') && dataType=='date') ) {
		if (status == 'req') {
			alert("Please enter a value for: " + label);
			if (dataType=='file'||dataType=='text'||dataType=='int'||dataType=='domain'||dataType=='email'||dataType=='select') {
				if (isHTMLEditorActive(formField, name)) {
					focusOnHTMLEditor(name);
				} else {
					formField.focus();
				}
			}
			return false;
		}
	} else {

		if (dataType == "int") {
			if ((value.length > 1) && (value.charAt(0) == "0")) { prefix = "0"; } else { prefix = ""; }
			if ((prefix + parseInt(value)) != value) {
				alert("Please enter a numeric value for: " + label); 
				formField.focus(); return false;
			}
			if (minSize && parseInt(value) < parseInt(minSize)) {
				alert(label + " should be at least " + minSize); 
				formField.focus(); return false;
			} else if (maxSize && parseInt(value) > parseInt(maxSize)) {
				alert(label + " can be up to " + maxSize); 
				formField.focus(); return false;
			}
		} else if (dataType == "float") {
			if (parseFloat(value) != value) {
				alert("Please enter a numeric value for: " + label); 
				formField.focus(); return false;
			}
			if (minSize && parseFloat(value) < parseFloat(minSize)) {
				alert(label + " should be at least " + minSize); 
				formField.focus(); return false;
			} else if (maxSize && parseFloat(value) > parseFloat(maxSize)) {
				alert(label + " can be up to " + maxSize); 
				formField.focus(); return false;
			}
		} else if (dataType == "text" || dataType == "email" || dataType == "domain" || dataType == "file") {
			if (maxSize && value.length > maxSize) {
				alert(label + " should be at most " + maxSize + " characters in length.  You have entered " + value.length + " character(s).");
				if (isHTMLEditorActive(formField, name)) {
					focusOnHTMLEditor(name);
				} else {
					formField.focus();
				}
				return false;
			} else if (minSize && value.length < minSize) {
				alert(label + " must be at least " + minSize + " characters in length.  You have entered " + value.length + " character(s)."); 
				if (isHTMLEditorActive(formField, name)) {
					focusOnHTMLEditor(name);
				} else {
					formField.focus();
				}
				return false;
			} else if (dataType == "email") {
				if (!emailPattern.test(value)) {
					alert("Please enter a valid email address for: " + label); 
					formField.focus(); return false;
				}
			} else if (dataType == "domain") {
				if (!domainPattern.test(value)) {
					alert("Please enter a valid domain for: " + label); 
					formField.focus(); return false;
				}
			} else if (dataType == "file") {
				if (doubleDotsFilePattern.test(value)) {
					alert("The filename for " + label + " contains '..' which is not allowed.  Note that your file, eg. myfile..txt, may show as 'myfile.' if you hide extensions. Please correct your filename and try again.");
					formField.focus(); return false;
				}
			}
		} else if (dataType == 'date') {

			year = y2k(getValue(form.elements[name + "Year"]));
			month = getValue(form.elements[name + "Month"]);
			dayEle	= form.elements[name + "Day"];
			day = getValue(dayEle);

			if (year == "" || month == "" || day == "") {
				alert("Please select a valid date for: " + label); 
				dayEle.focus(); return false;
			} else {
				var test = new Date(year,month-1,day);
			    if (!((test.getFullYear() == year) && (month == test.getMonth() + 1) && (day == test.getDate()))) {
					alert("Please select a valid date for: " + label); 
					dayEle.focus(); return false;
				}
			}
			if (minSize) {
				minSize = "" + minSize;
				if (minSize == "now") {
					tmpDate = new Date;
					minDate = new Date(tmpDate.getYear(), tmpDate.getMonth(), tmpDate.getDate());
				} else {
					minDate = new Date(minSize.substring(0,4), minSize.substring(4,6)-1, minSize.substring(6,8));
				}
				if (test < minDate) {
					alert("Please select a later date for: " + label); 
					dayEle.focus(); return false;
				}
			}
		} else if (dataType == 'aclcheck') {
			field2	= minSize;
			label2	= maxSize;
			value2 	= getValue(form.elements[field2]);
			
			if (value > value2) {
				alert("The access control for '" + label + "' cannot be more restrictive than the access control for '" + label2 + "'");
				formField.focus(); return false;
			}
				
		} else if (dataType == 'notify') {
			if (value == "Y") {
				f = form.elements["notifysubject"];
				if (f) {
					v = trim(f.value);
					if (v == '') {
						alert("If you want to send a notification then you must enter a subject");
						f.focus(); return false;
					}
				}

				f = form.elements["usernotifymessage"];
				if (f) {
					v = trim(f.value);
					if (maxSize && v.length > maxSize) {
						alert("The notification message should be at most " + maxSize + " characters in length.  You have entered " + v.length + " character(s)."); 
						f.focus(); return false;
					}
				}
				
			}

		} else if (dataType == 'radio') {
			isSelected = false;
			for (var i=0; i < formField.length; i++) {
				if ((formField[i].checked) && (formField[i].value != "--")) {
					isSelected = true;
				}
			}
			if (!isSelected) {
				alert("Please pick an option for: " + label); 
				return false;
			}
			
		} else if (dataType == 'select') {
			isSelected = false;
			if ((formField.selectedIndex >= 0) && (formField.selectedIndex.value != "--")) {
				isSelected = true;
			}
			if (!isSelected) {
				alert("Please pick an option for: " + label); 
				return false;
			}

		} else if (dataType == 'phone') {
			pattern = /[^0-9 \(\)\+ext]/i
			if (value.search(pattern) != -1) {
				alert("Please enter a phone number for: " + label + "\n(Valid characters are 0-9 + () ext)");
				formField.focus(); return false;
			}
			if (maxSize && value.length > maxSize) {
				alert(label + " should be at most " + maxSize + " characters in length.  You have entered " + value.length + " character(s)."); 
				formField.focus(); return false;
			} else if (minSize && value.length < minSize) {
				alert(label + " must be at least " + minSize + " characters in length.  You have entered " + value.length + " character(s)."); 
				formField.focus(); return false;
			}

		} else if (dataType == 'colour') {
			pattern = /^#?[0-9A-F]{6}$/i
			if (value.search(pattern) == -1) {
				alert("Please enter a valid colour for: " + label + "\n(Valid characters are 0-9 A-F)");
				formField.focus(); return false;
			}
			if (maxSize && value.length > maxSize) {
				alert(label + " should be at most " + maxSize + " characters in length.  You have entered " + value.length + " character(s)."); 
				formField.focus(); return false;
			} else if (minSize && value.length < minSize) {
				alert(label + " must be at least " + minSize + " characters in length.  You have entered " + value.length + " character(s)."); 
				formField.focus(); return false;
			}

		} else {
			alert("Unknown data type"); return false;
		}
	}
	return true;
}
// End generic form validation

//
// Generic Popup-related JS functions
//
var popupWindowRef = null;

function popupBrowser(objType, formField, num, params) {
	window.objType 		= objType;
	window.formField  	= formField;
	window.num			= num;
	popupWindowRef = window.open("itempopup?objType=" + objType + "&" + params, "Browser", "width=620px,height=430px,resizable,scrollable,scrollbars=yes");
	if (!popupWindowRef.opener)	{
		popupWindowRef.opener = this.window;
	}
	popupWindowRef.focus();  // Bring to front if already opened
}

function popupBrowserX(objType, num, params, formField1, formField2, formField3) {
	window.objType 		= objType;
	window.formField  	= formField1;
	window.num			= num;
	if (formField2) {window.formField2	= formField2;}
	if (formField3) {window.formField3	= formField3;}
	popupWindowRef = window.open("itempopup?objType=" + objType + "&" + params, "Browser", "width=620px,height=430px,resizable,scrollable,scrollbars=yes");
	if (!popupWindowRef.opener)	{
		popupWindowRef.opener = this.window;
	}
	popupWindowRef.focus();  // Bring to front if already opened
}

function genericPopup(url, title, params) {
	var windowRef = window.open(url, title, params);
	if (!windowRef.opener) {
		windowRef.opener = this.window;
	}
	windowRef.focus();  // Bring to front if already opened	
}

function closePopup() {
	if (popupWindowRef != null) {
		popupWindowRef.close();
		popupWindowRef = null;
	}
}
function removeSelected(formField,check) {
	if (check) { check = confirm("Are you sure you want to remove the selected items?"); }
	else { check = true; }
	if (check) {
		for (var i=0; i<formField.options.length; i++) {
			if (formField.options[i].selected) {		
				formField.options[i] = null;
				i=-1;
			}
		}
	}
}
function clearSelect(formField,check) {
	if (check) { check = confirm("Are you sure you want to remove all items in the list?"); }
	else { check = true; }
	if (check) {
		for (var i=formField.options.length; i>-1; i--) {
			formField.options[i] = null;
		}
	}
}
function saveSelect(formField, hiddenIDField, hiddenTxtField, delim) {
	var sID = '';
	var sVal = '';
	var iCount = formField.options.length;
	if (!delim) { delim = ","; }
	for (var i=0; i<iCount; i++) {
		sID = sID + formField.options[i].value + ",";					
		sVal = sVal + formField.options[i].text + delim;
	}
	hiddenIDField.value = sID.substr(0,(sID.length-1));
	if (hiddenTxtField) { hiddenTxtField.value = sVal.substr(0,(sVal.length-1)); }
}
// END Generic Popup-related JS functions


function unsetCol(q, r,c) {
	var rr = 1;
	var n = "";
	var e = "";
	for (rr=1; rr <= 40; rr=rr+1) {
		n = "q" + q + "r" + rr + "c" + c;
		e = document.getElementById(n);
		if (rr != r && e) {
			e.checked = false;
		}
	}
}


//
// Display Toggle JS
//
function toggleDisplayBoolArray(bool, elementArray) {
	for (var i=0; i<elementArray.length; i=i+1) {
		toggleDisplayBool(bool, elementArray[i]);
	}
}
function toggleDisplayBool(bool, elementName) {
	var e = document.getElementById(elementName);
	if (e) {
		e.style.display = bool ? "" : "none";
	}
}
function toggleDisplay(checkboxElement, elementName) {
	toggleDisplayBool(checkboxElement.checked, elementName);
}
function toggleDisplayArray(checkboxElement, elementArray) {
	for (var i=0; i<elementArray.length; i=i+1) {
		toggleDisplay(checkboxElement, elementArray[i]);
	}
}
function toggleDisplayBySelect(selectElement,elementName) {
	bool = (selectElement[selectElement.selectedIndex].value == "Y");
	toggleDisplayBool(bool,elementName);
}
function toggleDisplayButtonArray(bool, showButton, hideButton, showArray) {
	toggleDisplayBool(!bool, showButton);
	toggleDisplayBool(bool, hideButton);
	for (var i=0; i<showArray.length; i=i+1) {
		toggleDisplayBool(bool, showArray[i]);
	}
}
function toggleDisplayButton(bool, elementName, showprefix, hideprefix) {
	toggleDisplayBool(!bool, showprefix + elementName);
	toggleDisplayBool(bool, hideprefix + elementName);
	toggleDisplayBool(bool, elementName);
}
function toggleDisplayAuto(elementName) {
	e = document.getElementById(elementName);
	if (e) {
		e.style.display = (e.style.display == "") ? "none" : "";
	}
}

function resuscitateHTMLEditor (instanceNames) {
	/* no-op */
}

function swapStyle(element,style1,style2) {
	if (element.className == style1) { 
		element.className = style2; 
	} else if (element.className == style2) { 
		element.className = style1; 
	}
}

var expandImage = new Image();
var expandImageSrc = "/inovem/sites/images/actions/expand.gif"
expandImage.src = expandImageSrc;
var contractImage = new Image();
var contractImageSrc = "/inovem/sites/images/actions/contract.gif";
contractImage.src = contractImageSrc;
var spacerImageSrc = "/inovem/sites/images/spacer.gif";

// Swap the icon from + to -, or vice versa, and toggle the visibility of all child nodes
function toggleNode(nodelist, nodeid, prefix) {
	var vis = false;
	if (prefix) { nodeid = prefix + nodeid; }
	eval("nodeImg = document.images['img_" + nodeid + "']");
	expandLen = expandImageSrc.length;
	contractLen = contractImageSrc.length;
	nodeImgLen = nodeImg.src.length;
	
	if (nodeImg.src.substr(nodeImgLen-expandLen, expandLen) == expandImageSrc) {
		vis = true;
	} else if (nodeImg.src.substr(nodeImgLen-contractLen, contractLen) == contractImageSrc) {
		vis = false;
	}
	if (vis) { showChildren(nodelist, nodeid); }
	else	 { hideChildren(nodelist, nodeid); }
}
function showChildren(nodelist, nodeid) {
	eval("nodeImg = document.images['img_" + nodeid + "']");
	nodeImg.src = contractImage.src;

	var child = "";
	if (nodelist[nodeid] != null) {
		var arr = nodelist[nodeid];
		for (var i = 0; i < arr.length; i++) {
			child = arr[i];
			if (nodelist[child] == null) {
				eval("nodeImg = document.images['img_" + child + "']");
				nodeImg.src = spacerImageSrc;
				nodeImg.width = 9;
				nodeImg.height = 9;
			}
			toggleDisplayBool(true, child);
		}
	} else {
		eval("nodeImg = document.images['img_" + nodeid + "']");
		nodeImg.src = spacerImageSrc;
		nodeImg.width = 9;
		nodeImg.height = 9;
	}
}
function hideChildren(nodelist, nodeid) {
	eval("nodeImg = document.images['img_" + nodeid + "']");
	nodeImg.src = expandImage.src;

	var child = "";
	if (nodelist[nodeid] != null) {
		var arr = nodelist[nodeid];
		for (var i = 0; i < arr.length; i++) {
			child = arr[i];
			toggleDisplayBool(false, child);
			eval("var childImg = document.images['img_" + child + "']");
			childImg.src = expandImage.src;
			hideChildren(nodelist, child);
		}
	}
}
// Expand every node in the list
function showAllNodes(nodelist) {
	for (nodeid in nodelist) {
		showNode(nodelist, nodeid);
		var arr = nodelist[nodeid];
		for (var i = 0; i < arr.length; i++) {
			showNode(nodelist, arr[i]);
		}
	}
}
function showNode(nodelist, nodeid) {
	eval("nodeImg = document.images['img_" + nodeid + "']");
	if (nodeImg) {
		if (nodelist[nodeid] != null) {
			nodeImg.src = contractImage.src;
		} else {
			nodeImg.src = spacerImageSrc;
			nodeImg.width = 9;
			nodeImg.height = 9;
		}
		toggleDisplayBool(true, nodeid);
	}
}
// End display Toggle JS

function calcHeight(framename, minheight, padding) {
	if (minheight == null) { minheight = 100; }
	if (padding == null) { padding = 75; }
	if (document.getElementById &&	frames[framename].document.getElementById('resize_div')) {
		f = document.getElementById(framename);
		h = frames[framename].document.getElementById('resize_div').offsetTop+padding;
		if (h < minheight) { h = minheight; }
		f.height = h; 
	}
}

// Generic date-picker Popup-related JS functions -------------------------------------------------
// getAnchorPosition(anchorname)
// This function returns an object having .x and .y properties which are the coordinates
// of the named anchor, relative to the page.
function getAnchorPosition(anchorname) {
	// This function will return an Object with x and y properties
	var useWindow=false;
	var coordinates=new Object();
	var x=0,y=0;
	// Browser capability sniffing
	var use_gebi=false, use_css=false, use_layers=false;
	if (document.getElementById) { use_gebi=true; }
	else if (document.all) { use_css=true; }
	else if (document.layers) { use_layers=true; }
	// Logic to find position
 	if (use_gebi && document.all) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
	} else if (use_gebi) {
		var o=document.getElementById(anchorname);
		x=AnchorPosition_getPageOffsetLeft(o);
		y=AnchorPosition_getPageOffsetTop(o);
	} else if (use_css) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
	} else if (use_layers) {
		var found=0;
		for (var i=0; i<document.anchors.length; i++) {
			if (document.anchors[i].name==anchorname) { found=1; break; }
		}
		if (found==0) {
			coordinates.x=0; coordinates.y=0; return coordinates;
		}
		x=document.anchors[i].x;
		y=document.anchors[i].y;
	} else {
		coordinates.x=0; coordinates.y=0; return coordinates;
	}
	coordinates.x=x;
	coordinates.y=y;
	return coordinates;
}

// getAnchorWindowPosition(anchorname)
//   This function returns an object having .x and .y properties which are the coordinates
//   of the named anchor, relative to the window
function getAnchorWindowPosition(anchorname) {
	var coordinates=getAnchorPosition(anchorname);
	var x=0;
	var y=0;
	var scrollLeft = 0;
	var scrollTop = 0;
	if (((document.all) && (BrowserDetect.version < 6)) || (navigator.userAgent.indexOf('Safari')>=0)) {
		scrollLeft = document.body.scrollLeft;
		scrollTop = document.body.scrollTop;
	} else {
		scrollLeft = document.documentElement.scrollLeft;
		scrollTop = document.documentElement.scrollTop;
	}
	if (document.getElementById) {
		if (isNaN(window.screenX)) {
			x=coordinates.x-scrollLeft+window.screenLeft;
			y=coordinates.y-scrollTop+window.screenTop;
		} else {
			x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
			y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
		}
	} else if (document.all) {
		x=coordinates.x-scrollLeft+window.screenLeft;
		y=coordinates.y-scrollTop+window.screenTop;
	} else if (document.layers) {
		x=coordinates.x+window.screenX+(window.outerWidth-window.innerWidth)-window.pageXOffset;
		y=coordinates.y+window.screenY+(window.outerHeight-24-window.innerHeight)-window.pageYOffset;
	}
	coordinates.x=x;
	coordinates.y=y;
	return coordinates;
}

// Functions for IE to get position of an object
function AnchorPosition_getPageOffsetLeft (el) {
	var ol=el.offsetLeft;
	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
	return ol;
}
function AnchorPosition_getWindowOffsetLeft (el) {
	var p;
	if (((document.all) && (BrowserDetect.version < 6)) || (navigator.userAgent.indexOf('Safari')>=0)) {
		p = document.body.scrollLeft;
	} else {
		p = document.documentElement.scrollLeft;
	}
	return AnchorPosition_getPageOffsetLeft(el)-p;
}	
function AnchorPosition_getPageOffsetTop (el) {
	var ot=el.offsetTop;
	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
	return ot;
}
function AnchorPosition_getWindowOffsetTop (el) {
	var p;
	if (((document.all) && (BrowserDetect.version < 6)) || (navigator.userAgent.indexOf('Safari')>=0)) {
		p = document.body.scrollTop;
	} else {
		p = document.documentElement.scrollTop;
	}
	return AnchorPosition_getPageOffsetTop(el)-p;
}

function openDatePicker(datePickerURL, anchorName, params) {
	coordinates = getAnchorWindowPosition(anchorName);
	popupWindowRef = window.open(datePickerURL, "DatePicker", "dependent,screenX=" + coordinates.x + ",screenY=" + coordinates.y + ",left=" + coordinates.x + ",top=" + coordinates.y + "," + params);
	if (!popupWindowRef.opener)	{
  	  popupWindowRef.opener = this.window;
	}
	popupWindowRef.focus();
}
function popupProfile(url) {
	profRef = window.open(url,"UserProfile","width=750px,height=575px,resizable,scrollable,scrollbars=yes");
	profRef.focus();
}
function popupMail(url) {
	mailRef = window.open(url,"MailToUser","width=750px,height=575px,resizable,scrollable,scrollbars=yes");
	mailRef.focus();
}

// END Generic Popup-related JS functions ----------------------------------------------

// generic functions
function selectDropDown(e, newValue) {
	for (var i=0 ; i < e.length; i++) {
		if (e[i].value == newValue) {
			e.selectedIndex = i;
		}
	}
}
function dumpElement(o) {
	for (var prop in o) {
		document.write(prop + " = " + o[prop] + "<br>");
	}
}
function isElementDisplayable(o) {
	var ret = true;
	var p = o;
	while ((ret == true) && (p != null)) {
		if ((p.disabled == true) || ((p.style != null) && (p.style.display == "none"))) { ret = false; }
		else { p = p.parentElement; }
	}
	return ret;
}
function selectFirstField() {
	if (document.forms.length > 0) {
		var myform ="";
		if (document.forms.length > 1) {
			myform = document.forms[1];
		} else {
			myform = document.forms[0];
		}
		for (var i=0 ; i < myform.elements.length; i++) {
			var obj = myform.elements[i];
			var mytype = obj.type;
			if ((mytype == "file") || (mytype == "password") ||
				(mytype == "text") || (mytype == "textarea")) {
				if (isElementDisplayable(obj) == true) {
					obj.focus();
					return "";
				}
			}
		}
	}
	return "";
}
function selectFirstFieldInForm(myform) {
	if (myform) {
		for (var i=0 ; i < myform.elements.length; i++) {
			var obj = myform.elements[i];
			var mytype = obj.type;
			if ((mytype == "file") || (mytype == "password") ||
				(mytype == "text") || (mytype == "textarea")) {
				if (isElementDisplayable(obj) == true) {
					obj.focus();
					return "";
				}
			}
		}
	}
	return "";
}
function selectRadio(radio, nIndex) {
	radio[nIndex].checked = true;
}
function myVoid() { ; }
function setCheckBoxes(arr, value){
	if (arr){
		if (arr.length){
			for (var i = 0; i < arr.length; i++){
				arr[i].checked = value;
			}
		} else {
			arr.checked = value;
		}
	}
}
function setSelect(arr, value){
	for (var i = 0; i < arr.length; i++){
		arr[i].selected = value;
	}
}
function setAllRadios(f, prefix, count, index) {
	for (var i=1; i <= count; i++) {
		e = f.elements[prefix + i];
		if (e) {
			if (!e[index].disabled) {
				e[index].checked = true;
			}
		}
	}
}
function setAllRadiosArray(f, arr, index) {
	for (i=0; i<=arr.length; i=i+1) {
		e = f.elements[arr[i]];
		if (e) {
			if (!e[index].disabled) {
				e[index].checked = true;
			}
		}
	}
}

function setField(f, eleName, value, len) {
	if (eleName != "") {
		e = f.elements[eleName];
		if (e) {
			value = "0000" + value;
			value = value.substr(value.length - len);
			if (e.type == "text") {
				e.value = value;
			} else {
				selectDropDown(e, value);
			}
		}
	}
}

function setDateFields(formName, yearEleName, monthEleName, dayEleName, year, month, day) {	
	f = eval("document." + formName);
	if (f) {
		setField(f, yearEleName, year, 4);
		setField(f, monthEleName, month, 2);
		setField(f, dayEleName, day, 2);
	}
}

function nowDateTime(formName, yearEleName, monthEleName, dayEleName, hourEleName, minEleName, secEleName) {
	f = eval("document." + formName);
	if (f) {
		nowDate = new Date();
		setField(f, yearEleName, nowDate.getFullYear(), 4);
		setField(f, monthEleName, nowDate.getMonth()+1, 2);
		setField(f, dayEleName, nowDate.getDate(), 2);
		setField(f, hourEleName, nowDate.getHours(), 2);
		setField(f, minEleName, nowDate.getMinutes(), 2);
		setField(f, secEleName, nowDate.getSeconds(), 2);
	}
}

function swapListItems(box, index1, index2) {
	if ((index1 >= 0) && (index1 < box.options.length) &&
		(index2 >= 0) && (index2 < box.options.length) &&
		(index1 != index2)) {
		var temp = new Option(box.options[index1].text, box.options[index1].value);
		box.options[index1].text 	= box.options[index2].text;
		box.options[index1].value	= box.options[index2].value;
		box.options[index2] = temp;
		box.selectedIndex = index2;
	}
}

function orderList(box, positionindex) {
	var localUndefined;
	if (box.selectedIndex != localUndefined) {
		swapListItems(box, box.selectedIndex, (box.selectedIndex+positionindex));
	}
}

function moveListItem(box, offset) {
	var localUndefined;
	if (box.selectedIndex != localUndefined) {
		numRows = box.options.length;
		if (offset == 'b') {
			for (i=box.selectedIndex; i<numRows-1; i++) {
				swapListItems(box, i, i+1);
			}
		} else if (offset == 't') {
			for (i=box.selectedIndex; i>0; i--) {	
				swapListItems(box, i, i-1);
			}
		} else {
			newRowNum = box.selectedIndex + offset;
			if (newRowNum < 0) { newRowNum = 0; }
			if (newRowNum > numRows) { newRowNum = numRows-1; }
			swapListItems(box, box.selectedIndex, newRowNum);
		}
	}
}

function submitOnEnter(checkFormFunc, formRef, e) {
	if (navigator.appName.indexOf("Microsoft") != -1) {
		kc = eval("window.event.keyCode");
	} else {
		kc = 0; 
	}
	if (document.selection) {
		// IE-only 
		cc = (e && e.which) ? e.which : kc;
		if (cc == 13) {
			if (checkFormFunc) {
			 	if (checkFormFunc()) {formRef.submit();}
			} else {
				formRef.submit();
			}
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}

function textCounter(field, countfield, maxlimit) {
	var f = document.getElementById(field);
	var c = document.getElementById(countfield);
	if (f.value.length > maxlimit) {
		f.value = f.value.substring(0, maxlimit);
	} else {
		c.innerHTML = maxlimit - f.value.length;
	}

}

function resizeTextArea(id, minRows, maxRows, inc) {
	e = document.getElementById(id);
	if (e) {
		newRows = e.rows + inc;
		if (newRows < minRows) {
			newRows = minRows;
		} else if (newRows > maxRows) {
			newRows = maxRows;
		}
		e.rows = newRows ;

		expEle = document.getElementById(id + "_expand");
		if (expEle) { expEle.style.display = (newRows != maxRows) ? "" : "none"; }
		redEle = document.getElementById(id + "_reduce");
		if (redEle) { redEle.style.display = (newRows != minRows) ? "" : "none";	}
	}	
}

function textAreaInsertAtCursor(formField, insertText) {
	//IE support
	if (document.selection) {
		formField.focus();
		sel = document.selection.createRange();
		sel.text = insertText;
	//MOZILLA/NETSCAPE support
	} else if (formField.selectionStart || formField.selectionStart == '0') {
		var startPos = formField.selectionStart;
		var endPos = formField.selectionEnd;
		formField.value = formField.value.substring(0, startPos)
		+ insertText
		+ formField.value.substring(endPos, formField.value.length);
	} else {
		formField.value += insertText;
	}
}


// Spellchecking functions  (currently IE-only)
function spellCheckDocument(doc) {
	if (is_ie && is_win) {
	  try {
		var oIeSpell = new ActiveXObject("ieSpell.ieSpellExtension");
		ret = oIeSpell.CheckAllLinkedDocuments2(doc, true);
		return (ret > 0);  // User may have pressed "cancel", so may not want to submit form
	  } catch(e) {
		// No-op
	  }
	}
	return true;  // Default drop-out.  Submit
}

function spellCheckField(formField) {
	if (is_ie && is_win) {
	  try {
	    var oIeSpell = new ActiveXObject("ieSpell.ieSpellExtension");
	    ret = oIeSpell.CheckDocumentNode2(formField, true);
	    return (ret > 0);  // User may have pressed "cancel", so may not want to submit form
	  } catch(e) {
	    // No-op
	  }
	}
    return true;  // Default drop-out.  Submit
}
// end of spell-checking funcs

// Calendar
function padout(number) { return (number < 10) ? '0' + (number-0) : (number-0); }
function gotoyyyymmdd(url, cid, yyyymmdd) {
	window.location.href = url + "?cid=" + cid + "&viewdate=" + yyyymmdd;
}
function gotoDate(url, cid, yyyy, mm, dd) {
	gotoyyyymmdd(url, cid, '' + yyyy+padout(mm)+padout(dd));
}


// jQuery utility functions (requires jquery.js to be included)
var minusImg = "/inovem/public/foldertree/images/dhtmlgoodies_minus.gif";
var plusImg = "/inovem/public/foldertree/images/dhtmlgoodies_plus.gif";

function in_jq_getInitialTreeShowHideImage() {
	return "<img class='in_jq_showhideimage' src='" + minusImg + "' alt='[-]' title='Hide' />"
}
function in_jq_showHideTreeShow(jqObj, speed) {
	jqObj.attr('src', minusImg).attr('alt', "[-]").attr('title', "Hide").parents('li:first').find('ul:first').show(speed);
}
function in_jq_showHideTreeHide(jqObj, speed) {
	jqObj.attr('src', plusImg).attr('alt', "[+]").attr('title', "Show").parents('li:first').find('ul:first').hide(speed);
}
function in_jq_toggleTreeShowHide(jqObj, speed) {
	if (jqObj.attr('src').indexOf(minusImg) >= 0) {
		in_jq_showHideTreeHide(jqObj, speed);
	} else {
		in_jq_showHideTreeShow(jqObj, speed);
	}
}
function in_jq_setupShowHideTree(treeParams) {
	// Add [+/-] image to all sections which have children (and adjust to compensate for new image)
	$('li.'+treeParams.li).find('ul:first').parent('li').each(function() {
		$(this).prepend(in_jq_getInitialTreeShowHideImage());
		$(this).find('a:first').addClass("in_jq_adjustup");
	});
	
	// Add a click-handler on each image
	$('ul.'+treeParams.ul+' li img.in_jq_showhideimage').click(function() {
		in_jq_toggleTreeShowHide($(this), 'fast');
	});
	
	// Set all of the top-level sections to be rolled-up
	$('li.'+treeParams.li+' img.in_jq_showhideimage').each(function() {
		in_jq_toggleTreeShowHide($(this), null);
	});
	
	// Find the currently selected part, and unroll all of its parents
	$('li.'+treeParams.selected).parents('li.'+treeParams.li).not(treeParams.isTop).children('ul.'+treeParams.ul).prevAll('img.in_jq_showhideimage').each(function() {
		in_jq_toggleTreeShowHide($(this), null);
	});
	
	// Expand the currently selected part (to just one level) - unless it's the top part (ie. the document).
	if ($('li.'+treeParams.selected+':not('+treeParams.isTop+') img.in_jq_showhideimage').size() > 0) {
		in_jq_toggleTreeShowHide($('li.'+treeParams.selected+' img.in_jq_showhideimage:first'), null);
	}
}

// Show-hide function which uses jQuery to smoothly animate the show/hide of a div by user clicking on a span.
// Specify ID's of the span (for the label) and the div, and also the text of the label to put into the span.
// If javascript turned off then div's will just display and the span's will be empty.
// If ulClass is specified, then code looks for a UL with that class and inserts a "close" button as last button in list.
// --- use style="xxx" on the cf_ui_buttonbar customtag to mark a buttonbar UL so that this func will add a "close" button
// If bShowInitially is specified and is TRUE, then keep the div visible, else hide it initially
function in_jq_showHideDiv(spanID, divID, ulClass, label, bShowInitially, animateSpeed) {
	var aLabel = divID+'_label';
	spanID = "#" + spanID;
	divID = "#" + divID;
	if (!animateSpeed) { 
		animateSpeed = 'slow'; 
	} else if ((animateSpeed != 'slow') && (animateSpeed != 'fast')) { 
		animateSpeed = null; 
	}
	if (!bShowInitially) {
		$(divID).hide();
	}
	$(spanID).append('<a id="' +aLabel+ '" href="javascript:;">[' +label+ ']</a>&nbsp;&nbsp;').find('#' +aLabel).click(function () {
		$(divID).slideDown(animateSpeed);
		$(spanID).slideUp(animateSpeed);
	});
	if (ulClass != '') {
		$(divID+ ' ul.' +ulClass).append('<li><a class="button_notaction" title="Close" href="javascript:;">Close</a></li>').find('a.button_notaction').click(function() {
			$(spanID).slideDown(animateSpeed);
			$(divID).slideUp(animateSpeed);
		});
	}
	if (bShowInitially) { 
		$(spanID).hide();
	}
}
// /jQuery


// end generic functions


