function stringRight(str,count) { return str.substr(str.length-count,count); } // like vbscript RIGHT()
function stringLeft(str,count) { return str.substr(0,count); } // like vbscript LEFT()

function listen(obj,eventType,callFunc) {
	if (!obj) return;
	if (obj.addEventListener){
	  obj.addEventListener(eventType, callFunc, false); 
	} else if (obj.attachEvent){
	  obj.attachEvent('on'+eventType, callFunc);	// does on+ always work?
	}
}

/*function getEventTarget(e) {
	var targ;
	if (!e) e=window.event;
	if (e.target) targ=e.target;
	else if (e.srcElement) targ=e.srcElement;
	if (targ.nodeType==3) targ=targ.parentNode; // defeat Safari bug
	return targ;
}*/

function findPosX(obj) {
	var curleft=0;
	if (obj.offsetParent) {
		while (obj.offsetParent) { curleft += obj.offsetLeft; obj=obj.offsetParent; }
	} else if (obj.x) curleft += obj.x;
	return curleft;
}
function findPosY(obj) {
	var curtop=0;
	if (obj.offsetParent) 	{
		while (obj.offsetParent) { curtop += obj.offsetTop; obj=obj.offsetParent; }
	} else if (obj.y) curtop += obj.y;
	return curtop;
}



function getScrollY() {
	if (document.documentElement && !isNaN(document.documentElement.scrollTop)) {
		return document.documentElement.scrollTop;	// IE (new)
	}
	else if (document.body && !isNaN(document.body.scrollTop)) {
		return document.body.scrollTop;		// IE (old?)
	}
	else if (window && !isNaN(window.pageYOffset)) {
		return window.pageYOffset;		// NS 4+ ?
	}
	else if (window && !isNaN(window.scrollY)); {
		return window.scrollY;		// Mozilla ?
	}
return 0;
}


function getWindowHeight() {
	if (document.documentElement.clientHeight && !isNaN(document.documentElement.clientHeight))	{ // IE (new?)
		return document.documentElement.clientHeight;
	}
	else if (document.body.clientHeight && !isNaN(document.body.clientHeight)) {	// IE (old?)
		return document.body.clientHeight;
	}
	else if (window.innerHeight && !isNaN(window.innerHeight)) {  // Mozilla
		return window.innerHeight;
	}
return 0;
}

function isObjVisible(obj) {		// checks if (any part of) element within current scroll bounds
	wTop=getScrollY();	// visible page area
	wBottom=wTop+getWindowHeight();

	oTop=findPosY(obj);
	oBottom=oTop+obj.scrollHeight;
	
		if (oTop>wBottom || oBottom<wTop) { // outside range
			return false;
		} else {
			return true;
		}
	return true;
}

//----- AJAX ----- //

ajaxObjCounter=0;
ajaxErrorShown=false;		// triggered if browser is incompatible

//var ajaxObjectsArray=new Array();

function getAjaxObject(destObjRef,specialMethod,callFuncAfter)
{ 
var ajaxObj=new Object();
ajaxObj.destObj=destObjRef;

ajaxObj.settingMethod="innerhtml";				// specialMethod can be [null,false,"innerhtml"](innerhtml) or [true,"form"](form)
	if (typeof specialMethod=="boolean") {
		if (specialMethod==true)
			ajaxObj.settingMethod="form";
	}
	else if (specialMethod=="form")
		ajaxObj.settingMethod="form";

ajaxObj.ID=ajaxObjCounter;

ajaxObj.objXMLHttp=null;

	if (window.XMLHttpRequest)
		ajaxObj.objXMLHttp=new XMLHttpRequest();
	else if (window.ActiveXObject)
		ajaxObj.objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");

ajaxObj.objXMLHttp.onreadystatechange=
		function()
		{
			if (!ajaxObj.objXMLHttp) { jsDbg("no objXMLHttp"); return false; }
			if (ajaxObj.objXMLHttp==null) { jsDbg("objXMLHttp is null"); return false; }
			
			if (!ajaxObj.destObj || ajaxObj.destObj==null) { jsDbg("ajaxObj.destObj is null or does not exist"); return false; }
			
			if (ajaxObj.objXMLHttp.readyState==4 || ajaxObj.objXMLHttp.readyState=="complete")
			{
				if (ajaxObj.settingMethod=="form") {		// form field
					ajaxObj.destObj.value=ajaxObj.objXMLHttp.responseText;
				}
				else {		// use innerhtml
					// NEED TO COMPENSATE FOR IE'S SELECT-INNERHTML BUG
					if (ajaxObj.destObj.tagName=="SELECT" && ajaxObj.destObj.outerHTML)		// SELECT lists in IE
					{
						ajaxObj.destObj.innerHTML="";		// clears current options
						ajaxObj.destObj.outerHTML=ajaxObj.destObj.outerHTML.replace("</SELECT>", ajaxObj.objXMLHttp.responseText + "</SELECT>");		// add innerHTML indirectly
					}
					else		// all other cases, just put in code
					{
						separateScripts=false;
						  if (navigator.appName.indexOf("Netscape")!=-1) separateScripts=true	// mozilla

						tText=ajaxObj.objXMLHttp.responseText;
						
						  if (separateScripts==true)
						  {
						  scriptNodes=new Array();	// scripts are put in after text
						
							// need to parse out <script>'s:
							while (tText.indexOf("<script")!=-1 && tText.indexOf("<"+"/script>")!=-1)
							{
							// outside positions are script tags, inside are without them
							parsedScript=tText.substring(tText.indexOf("<scr"+"ipt"), tText.indexOf("</scr"+"ipt>") + ("</scr"+"ipt>").length);
							parsedInsideScript=parsedScript.substring(parsedScript.indexOf(">")+1, parsedScript.lastIndexOf("</"));
							tText=tText.replace(parsedScript,"");	// remove parsed script
							//alert("Creating scriptnode #" + scriptNodes.length);
							scriptInd=scriptNodes.length;
							scriptNodes[scriptInd]=document.createElement('script');
							scriptNodes[scriptInd].setAttribute('type','text/javascript');
							//scriptNodes[scriptInd].setAttribute('defer','true');		// useful?
							scriptNodes[scriptInd].appendChild(document.createTextNode(parsedInsideScript));
							//alert("#"+scriptInd+" ok");
							}
						  }
					
						try {
							ajaxObj.destObj.innerHTML=tText;			// RUNTIME ERROR IN IE B/C OF THIS LINE!?
						} catch(e) { jsDbg("AJAX Error encountered."); }
						
						try {
							// put scripts in AFTER text
							if (separateScripts==true) {
								for (ssInd=0; ssInd<scriptNodes.length; ssInd++) ajaxObj.destObj.appendChild(scriptNodes[ssInd]);
							}
						} catch(e) { jsDbg("AJAX Error encountered w/ script separation."); }						
					}
				}
				
				if (typeof callFuncAfter=='function' && callFuncAfter) callFuncAfter();
			}
		}	// end readystate function

return ajaxObj;
}



function getAjax(postFormObj,destObj,url,specialMethod,callFuncAfter)			// postFormObj should be null for GET calls
{
dbgMsgStr="ajax call:\n" + "postFormObj: " + postFormObj + "\n" + "destObj: " + destObj + "\n" + "url: " + url + "\n" + "specialMethod: " + specialMethod + "\n" + "callFuncAfter: " + callFuncAfter
	if (!destObj || url=="") return false;

//ajaxObjectsArray[++ajaxObjCounter]=new getAjaxObject(destObj,specialMethod,callFuncAfter);

ajax=new getAjaxObject(destObj,specialMethod,callFuncAfter);	//ajaxObjectsArray[ajaxObjCounter];

xmlHttp=ajax.objXMLHttp;

	if (xmlHttp==null)
	{
		  if (!ajaxErrorShown) 
			alert ("Your browser does not support HTTP Requests. Some elements on this page will not work properly.");
	  ajaxErrorShown=true;
	  return false;
	}

	// add random param to URL so page is not loaded from cache:
	if (url.indexOf("?")==-1) // no params at all
		url+="?";
	else if (stringRight(url,1)!="&")		// no & at end of URL
		url+="&";
	
	url+="sid="+Math.random();

ajaxDbgObj=document.getElementById("ajaxDebugging");
	if (ajaxDbgObj)
		ajaxDbgObj.innerHTML=ajaxDbgObj.innerHTML+"<div><a href='"+url+"'>"+url+"</a></div>"

sendData=null;
method="GET";

	if (postFormObj!=null)
	{
		method="POST";
		sendData="";
		
			for (i=0; i<postFormObj.length; i++)
				sendData+=postFormObj.elements[i].name + "=" + escape(postFormObj.elements[i].value) + "&";
	}

xmlHttp.open(method,url,true);
	if (method=="POST")
		xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	
xmlHttp.send(sendData);
} 

//----- END AJAX FUNCTION ----//


// limit image size
function limitImgWidth(tImgObj,maxWidth) {		// width
	if (!tImgObj) return false;
	if ((tImgObj.scrollWidth>maxWidth) || (tImgObj.width>maxWidth)) {
	 tImgObj.width=maxWidth;
	 tImgObj.style.width=maxWidth+"px";
	}
}

function limitImgHeight(tImgObj,maxHeight) {		// height
	if (!tImgObj) return false;
	if ((tImgObj.scrollHeight>maxHeight) || (tImgObj.height>maxHeight)) {
	 tImgObj.height=maxHeight;
	 tImgObj.style.height=maxHeight+"px";
	}
}

function limitImgSize(tImgObj,maxWidth,maxHeight) {		// width AND height
	limitImgWidth(tImgObj,maxWidth);
	limitImgHeight(tImgObj,maxHeight);
}

function getSelectValues(selectObj) {		// makes string of all selected items in MULTIPLE SELECT box
	if (!selectObj || !selectObj.options) return false;
str=""
	for (i=0; i<selectObj.length; i++) {
		if (selectObj.options[i].selected==true)
			str+=selectObj.options[i].value+", ";
	}
return str;		// note: return string will have extra ", " at end
}


function getCheckboxValues(cbNodeObj) {		// makes string of all selected checkboxes
	if (!cbNodeObj) return;
str=""
	for (i=0; i<cbNodeObj.length; i++) {
		cbObj=cbNodeObj[i];
			if (cbObj.checked==true) str+=cbObj.value+", ";
	}
return str;		// note: return string will have extra ", " at end
}


// copied from http://www.jsmadeeasy.com/javascripts/Forms/Date%20Validation/template.htm
function isValidDate(dateStr) {
// Checks for the following valid date formats:
// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
// Also separates date into month, day, and year variables
var datePat = /^(\d{1,2})(\/)(\d{1,2})\2(\d{2}|\d{4})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
	if (matchArray == null) {
		//alert("Date is not in a valid format.")
		return false;
	}
month = matchArray[1]; // parse date into variables
day = matchArray[3];
year = matchArray[4];
	if (month < 1 || month > 12) { // check month range
		//alert("Month must be between 1 and 12.");
		return false;
	}
	if (day < 1 || day > 31) {
		//alert("Day must be between 1 and 31.");
		return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		//alert("Month "+month+" doesn't have 31 days!")
		return false
	}
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
			if (day>29 || (day==29 && !isleap)) {
				//alert("February " + year + " doesn't have " + day + " days!");
				return false;
			   }
	}

return true;  // date is valid
}

defaultFormSegmentSize=50000;

function splitFormSegments(formObj,fullContent,itemName,sizePerSegment,clearOrigObj) {		// splits item in a form into manageable segments
	totalLen=fullContent.length;

	itemsToSend=Math.round(totalLen/sizePerSegment)+1;
	//alert("Total: " + totalLen + "\nSend " + itemsToSend + " items.");
	
	contentSent=fullContent;
	lenSent=0;		// temp
	
		for (itemCount=1; itemCount<=itemsToSend; itemCount++) {
			fContent=document.createElement("input");
			fContent.setAttribute("type","hidden");
			fContent.name=itemName+itemCount;
			contentPart=contentSent.substr(0,sizePerSegment);	// cut this part
			lenSent+=contentPart.length;	// for checking
			contentSent=contentSent.slice(sizePerSegment);		// cut this part from rest of content
			fContent.setAttribute("value",contentPart);
			formObj.appendChild(fContent);
		}
	//alert("Length sent: " + lenSent + " in " + itemsToSend + " parts, supposed to be: " + totalLen);
	
		if (clearOrigObj!=null) {
			try {
				clearOrigObj.value="";
			} catch(e) {}
		}
}


function highlightLinkBox(obj,toggle) {
	if (toggle && obj.className.toLowerCase()!="linkBoxActive") {	//on
		obj.style.border="solid #6699CC 1px";
	}
	else {	// off
		obj.style.border="solid #FFFFFF 1px";
	}
}
