function randRange(maxVal)
{
	return Math.round(maxVal * Math.random());
}

function checkLength(length)
{
	if(window.event.srcElement.value.length  >= length)
	{
		alert("You have reached the maximum length of " + length + " characters permitted here.");
		return false;
	}
}

function rand()
{
	return (new Date()).valueOf();
}

function href_stripQueryString(href)
{
	var retVal = href;
	if(href.indexOf('?') >= 0)
		retVal = href.substring(0, href.indexOf('?'));
	return retVal;
}

function href_appendQueryString(href, varName, varValue)
{
	if(href.indexOf('?') >= 0)
		href += "&" + varName + "=" + escape(varValue);
	else
		href += "?" + varName + "=" + escape(varValue);
	return href;
}

function href_goto(href)
{
	if(href.length > 0)
		window.open(href);
}

function radio_getValue(radioName)
{
	var radioObjs = document.getElementsByName(radioName);
	
	var retVal = null;
	for(i=0;i<radioObjs.length;i++)
		if (radioObjs[i].checked == true)
			retVal = radioObjs[i].value;
	return retVal;
}

function checkbox_getValues(formId, checkboxName)
{
	var values = "";
	
	for(var i=0; i<document.getElementById(formId)[checkboxName].length; i++)
		if(document.getElementById(formId)[checkboxName][i].checked)
			values = listAppend(values, document.getElementById(formId)[checkboxName][i].value);
	
	return values;
}

function listAppend(list, value)
{
	if(list.length > 0)
		list += "," + value;
	else
		list = value;
	return list;
}



/*
	Programatically jumps to an anchor on the page
*/
function jumpToAnchor(anchorName) 
{
	window.location = String(window.location).replace(/\#.*$/, "") + "#" + anchorName;
}

// generate click event
if(typeof(HTMLElement) != "undefined")
{
	HTMLElement.prototype.click = function() 
	{
		var evt = this.ownerDocument.createEvent('MouseEvents');
		evt.initMouseEvent('click', true, true, this.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
		this.dispatchEvent(evt);
	}
}
function jumpToAnchor_fromLink(theLink)
{
	var hyperlink = document.getElementById(theLink);
	hyperlink.click();
}

function list_append(list, item, delimiter)
{
	if(delimiter == null)
		delimiter = ",";
		
	if(list.length > 0)
		list += delimiter + item;
	else
		list += item;
	return list;
}

// BEGIN: date functions
//   - used with generateDate function to manage date fields
var daysNormal   = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var daysLeapYear = new Array( 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

function isLeapYear(year)
{
   if ((year / 4)   != Math.floor(year / 4))   
		return false;
   if ((year / 100) != Math.floor(year / 100)) 
		return true;
   if ((year / 400) != Math.floor(year / 400)) 
		return false;
   return true;
}

function updateDays(dateName)
{
	var objMonth = document.getElementById(dateName + '_month');
	var objDay = document.getElementById(dateName + '_day');
	var objYear = document.getElementById(dateName + '_year');
	//var days = isLeapYear(objYear.value) ? daysLeapYear[parseInt(objMonth.value)-1] : daysNormal[parseInt(objMonth.value)-1];
	var days = daysInMonth(objYear.value, objMonth.value);
	var oldDay = objDay.value == "" ? 1 : objDay.value;
	
	objDay.options.length = 0;
	for(var i=1; i<=days; i++)
		objDay.options[objDay.options.length] = new Option(i, i);
	if(oldDay > days)
		oldDay = days;
	objDay.value = oldDay;
}

function daysInMonth(year, month)
{
	var days = isLeapYear(year) ? daysLeapYear[parseInt(month)-1] : daysNormal[parseInt(month)-1];
	return days;
}

function convert_12to24(fieldName)
{
	var hour;
	if($F(fieldName + "_amPm").toLowerCase() == "am")
	{
		if($F(fieldName + "_hour") == 12)
			hour = 0;
		else
			hour = parseInt($F(fieldName + "_hour"));
	}
	else if($F(fieldName + "_amPm").toLowerCase() == "pm")
	{
		if($F(fieldName + "_hour") == 12)
			hour = 0;
		else
			hour = parseInt($F(fieldName + "_hour"));
		hour += 12;
	}
	return hour;
}
// END: date functions

// deprecated
var iframe_counter = 1;
var debugger_showIframe = false;
function iframe_request()
{
	var iframe_loader = document.createElement("iframe");
	var iframe_id = "iframe_loader_" + iframe_counter++;
	iframe_loader.id = iframe_id;
	iframe_loader.name = iframe_id;
	//iframe_loader.style.position = "absolute";
	iframe_loader.style.left = 0;
	iframe_loader.style.top = 0;
	iframe_loader.style.border = "0px";
	iframe_loader.style.width = "500px";
	iframe_loader.style.height = "300px";
	iframe_loader.style.backgroundColor = "white";
	iframe_loader.style.display = (debugger_showIframe ? "" : "none");
	
	document.body.appendChild(iframe_loader);
	return iframe_id;
}


function table_getRowIndex(tableObj, id)
{
	var rowIndex = null;
	for(var i=0; i<tableObj.rows.length; i++)
	{
		if(tableObj.rows[i].id == id)
		{
			rowIndex = i;
			break;
		}
	}
	return rowIndex;
}

function getFrame(id)
{
	return document.getElementById(id).contentWindow;
}

var ani_resizeIncrement = 50;
var ani_resizeSpeed = 10;
function aniOpen(targetFrameId, href, finalHeight)
{
	var targetFrame = document.getElementById(targetFrameId);
			
	// keep resizing
	if(targetFrame.clientHeight < finalHeight)
	{
		targetFrame.style.height = (targetFrame.clientHeight + ani_resizeIncrement) + "px";
		window.setTimeout("aniOpen('" + targetFrameId + "', '" + href + "', " + finalHeight + ")", ani_resizeSpeed); 
	}
	// done resizing...assign href
	else
	{
		targetFrame.style.height = finalHeight + "px";
		if(href.length > 0)
			getFrame(targetFrameId).location.href = href;
	}
}

function aniClose(targetFrameId, onClose)
{
	var targetFrame = document.getElementById(targetFrameId);
	//alert(targetFrame);
	// keep resizing
	if(targetFrame.clientHeight > ani_resizeIncrement)
	{
		targetFrame.style.height = (targetFrame.clientHeight - ani_resizeIncrement) + "px";
		window.setTimeout("aniClose('" + targetFrameId + "', \"" + onClose + "\")", ani_resizeSpeed); 
	}
	// hide iframe and call onClose
	else
	{
		targetFrame.style.height = "0px";
		if(onClose.length > 0)
			eval(onClose);
	}
}

function aniScroll(scrollId, contentId, destHeight, increment, speed, onDone)
{
	var obj = document.getElementById(scrollId);
	var height = obj.clientHeight + increment;
	
	// expand
	if(increment > 0)
	{
		if(height >= destHeight)
		{
			obj.style.height = destHeight + "px";
			document.getElementById(contentId).style.display = "";
			setTimeout(onDone, 0);
		}
		else
		{
			obj.style.height = height + "px";
			setTimeout("aniScroll('" + scrollId + "', '" + contentId + "', " + destHeight + ", " + increment + ", " + speed + ", '" + onDone + "')", speed);
		}
	}
	
	// contract
	else
	{
		
		if(height < 0)
		{
			obj.style.height = "0px";
			setTimeout(onDone, 0);
		}
		else
		{
			document.getElementById(contentId).style.display = "none";
			obj.style.height = height + "px";
			setTimeout("aniScroll('" + scrollId + "', '" + contentId + "', " + destHeight + ", " + increment + ", " + speed + ", '" + onDone + "')", speed);
		}
	}
}


function dummy(){}









function getElementsByClass(searchClass, node, tag) 
{
	// Taken from http://www.dustindiaz.com/top-ten-javascript/
	var classElements = new Array();
	if(node == null)
		node = document;
	if(tag == null)
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)");
	for(i=0, j=0; i<elsLen; i++) 
	{
		if(pattern.test(els[i].className)) 
		{
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


function jscss(a,o,c1,c2)
{
  switch (a){
    case 'swap':
      o.className=!jscss('check',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);
    break;
    case 'add':
      if(!jscss('check',o,c1)){o.className+=o.className?' '+c1:c1;}
    break;
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
    break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
    break;
  }
}




function previewImage(destObj, show, imgSrc, imgStyle)
{
	if(show)
	{
		var img = document.createElement("img");
		img.src = imgSrc;
		img.className = "img_preview";
		if(imgStyle)
			img.style.cssText = imgStyle;
		img.style.border = "2px solid black";
		img.style.position = "absolute";
		destObj.appendChild(img);
	}
	else
	{
		var imgs = getElementsByClass("img_preview", destObj, "img") ;
		for(var i=0; i<imgs.length; i++)
			destObj.removeChild(imgs[i]);
	}
}

var previewedImages = new Array();
function previewImage_toggle(destObj, imgSrc, imgStyle)
{
	var index = -1;
	for(var i=0; i<previewedImages.length; i++)
	{
		if(previewedImages[i] == destObj.id)
		{
			index = i;
			break;
		}
	}
	
	// image being viewed, hide it
	if(index == -1)
	{
		previewImage(destObj, true, imgSrc, imgStyle);
		previewedImages[previewedImages.length] = destObj.id;
		
	}
	else
	{
		previewImage(destObj, false)
		previewedImages[index] = null;
	}
}







function stripeRows(objId, className)
{
	if(className == null)
		className = "recordSet";
	
	var rows = document.getElementById(objId).tBodies[0].rows;
	for(var i=0; i<rows.length; i++)
		rows[i].className = className + ((i % 2) + 1);
}


function stripeRows_ul(objId)
{
	var rows = document.getElementById(objId).getElementsByTagName("li");
	for(var i=0; i<rows.length; i++)
		rows[i].className = "recordSet" + ((i % 2) + 1);
}



function addLoadEvent(func) 
{
  if(window.addEventListener)
	{
		window.addEventListener("load", func, false);
	}
	else
	{
		window.attachEvent("onload", func);
	}
}


var FontDetector = function()
{
	var h = document.getElementsByTagName("BODY")[0];
	var d = document.createElement("DIV");
	var s = document.createElement("SPAN");
	d.appendChild(s);
	d.style.fontFamily = "sans-serif";		//font for the parent element DIV.
	s.style.fontFamily = "sans-serif";		//arial font used as a comparator.
	s.style.fontSize   = "72px";			//we test using 72px font size, we may use any size. I guess larger the better.
	s.innerHTML        = "mmmmmmmmmml";		//we use m or w because these two characters take up the maximum width. And we use a L so that the same matching fonts can get separated
	h.appendChild(d);
	var defaultWidth   = s.offsetWidth;		//now we have the defaultWidth
	var defaultHeight  = s.offsetHeight;	//and the defaultHeight, we compare other fonts with these.
	h.removeChild(d);
	/* test
	 * params:
	 * font - name of the font you wish to detect
	 * return: 
	 * f[0] - Input font name.
	 * f[1] - Computed width.
	 * f[2] - Computed height.
	 * f[3] - Detected? (true/false).
	 */
	function test(font) {
		h.appendChild(d);
		var f = [];
		f[0] = s.style.fontFamily = font;	// Name of the font
		f[1] = s.offsetWidth;				// Width
		f[2] = s.offsetHeight;				// Height
		h.removeChild(d);
		font = font.toLowerCase();
		if (font == "arial" || font == "sans-serif") {
			f[3] = true;	// to set arial and sans-serif true
		} else {
			f[3] = (f[1] != defaultWidth || f[2] != defaultHeight);	// Detected?
		}
		return f;
	}
	this.test = test;
}



function createCSS(selector, declaration) {
	// test for IE
	var ua = navigator.userAgent.toLowerCase();
	var isIE = (/msie/.test(ua)) && !(/opera/.test(ua)) && (/win/.test(ua));
	
	// create the style node for all browsers
	var style_node = document.createElement("style");
	style_node.setAttribute("type", "text/css");
	style_node.setAttribute("media", "screen"); 
	
	// append a rule for good browsers
	if (!isIE) style_node.appendChild(document.createTextNode(selector + " {" + declaration + "}"));
	
	// append the style node
	document.getElementsByTagName("head")[0].appendChild(style_node);
	
	// use alternative methods for IE
	if (isIE && document.styleSheets && document.styleSheets.length > 0) {
	        var last_style_node = document.styleSheets[document.styleSheets.length - 1];
	        if (typeof(last_style_node.addRule) == "object") last_style_node.addRule(selector, declaration);
	}
};