/*========================================================================
  Cookie management
========================================================================*/
function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}


/*========================================================================
  Action and Input Validation
========================================================================*/
var action;
function setAction(newAction) 
  {
	action = newAction;
  }
/*==========================================================================================
  Form validation utillity methods
==========================================================================================*/
function MaxLengthCheck(obj,varMaxLength)
{
	if(typeof obj != 'object')
		var obj = xbGetElementById(obj);
				
	if(obj.value.length>varMaxLength)
	{
		var i = window.event.keyCode;  // won't work in FireFox!
		// var i = window.event.keyCode ? window.event.keyCode : event.which ? event.which : event.charCode; // Also didn't work in firefox
		
		var bOK = false;
		if ( i == 9 ||               // TAB key
			i == 8 ||               // Backspace key
			i == 36 ||               // Home key
			i == 35 ||               // End key
			i == 39 ||               // Right Arrow
			i == 37 ||               // Left Arrow
			i == 46 ||               // Delete Key
			(i >= 48 && i <= 57) ||         // Top row 0 to 9
			(i >= 96 && i <= 105) ||        // Number pad 0 to 9
			(i >= 188 && i <= 190) ||       // Keyboard "." & "," & "-"
			(i == 107 || i == 109 || i == 110)) // Num pad "-" & "+" & "."
		{ 
			bOK = true;
		}
		if (!bOK) 
		{
			window.event.returnValue = false;     // Cancel keystroke
		}		
	}
}	

function LimitText(limitField, limitCount, limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	} 
}	

function ZeroLengthCheck(varElementName)
  {
	if(arguments.length>1)
	{
		var frmName = arguments[1];
		var El = document.forms[frmName].elements[varElementName];	
	}
	else
	{
	 var El = xbGetElementById(varElementName)	
	}
	if(El.value.length==0)
       return true;
	else
	   return false;
  }	
function FormSubmit(objDoc, strForm)
  {
     var frm = objDoc.forms[strForm];     
     frm.submit();
     //submit();
  }	
function ZeroValueCheck(varElementName)
  {
	 var El = xbGetElementById(varElementName);
	 if(parseInt(El.value)==0)
    	return true;
	 else
		return false;	
  }
function ShowErrorMsg(varElementName,varMsg)
  {
	var El = xbGetElementById(varElementName)
	xbSetInnerHTML(El,varMsg);
  }



function CheckLength(length) {
	var nKey;
			
		
	if (document.all) { //IE trap
		nKey = window.event.keyCode;
		//alert(nKey);
		if (window.event.srcElement.value.length >= length) {
			/*
			8 = backspace
			9 = tab
			46 = delete
			37-40 = arrow keys
			*/
			if ((nKey == 8) || (nKey == 9) || (nKey == 46) || ((nKey >= 37) && (nKey <= 40))) {
				return true;
			} else {
				return false;
			}
		 }				
	 } else {                 //must be NS then
		nKey = evt.which;
		return true; //requires server side validation too
	}             
}

function createNamedElement(type, name) {
   var element = null;
   // Try the IE way; this fails on standards-compliant browsers
   try {
      element = document.createElement('<'+type+' name="'+name+'">');
   } catch (e) {
   }
   if (!element || element.nodeName != type.toUpperCase()) {
      // Non-IE browser; use canonical method to create named element
      element = document.createElement(type);
      element.name = name;
   }
   return element;
}


function SwitchChkBoxes(chkbox, frmName) {
	var frm;
	var frmElements;
	var blnChecked;
				 
					
	frm = document.forms[frmName];
	frmElements = frm.elements;
	
	blnChecked = chkbox.checked;
	
	//Clear All checkboxes/radio buttons	  	
	for(i=0;i < frmElements.length;i++)
	{	
		if(frmElements[i].type=="checkbox")
		{
			if (!frmElements[i].disabled) {
				frmElements[i].checked = blnChecked;						
			}
		}
	}
}

function clearCheckBoxes(chkbox, frmName) {
	var frm;
	var frmElements;
	var varID;
					
	frm = document.forms[frmName];
	frmElements = frm.elements;
	
	varID = chkbox.id;
	var blnChecked = chkbox.checked;
	
	//Clear All checkboxes/radio buttons	  	
	
	for(i=0;i < frmElements.length;i++)
	{	
		if(frmElements[i].type=="checkbox" && frmElements[i].id==varID)
		{
			frmElements[i].checked = false;
			//alert('hit');						
		}
	}	
	chkbox.checked = blnChecked;	
}

function clearFormItem(id, frmName) 
{
	var frm;
	var frmElements;
	var varID;
					
	frm = document.forms[frmName];
	frmElements = frm.elements;
	
	//Clear All checkboxes/radio buttons	  	
	for(i=0;i < frmElements.length;i++)
	{	
		if(frmElements[i].id==id)
		{
			switch (frmElements[i].type)
			{
				case "radio":	
					frmElements[i].checked = false;
					break;
				case "checkbox":
					frmElements[i].checked = false;
					break;
				case "text":
					frmElements[i].value = "";
					break;
			}
			//alert('hit');						
		}
	}	
}

function getClassName(row)
{
	if (row == null)
		row = 0;
						
	if (row % 2 == 0)
	{
		return "table-row";
	}
	else
	{
		return "table-row-alt";
	}			
}

//Sets action variable for contextual validation on form submit event
	function setUserAction(newAction)
	{
		USER_ACTION = newAction;
	}	
	//Returns contextual validation variable
	function getUserAction()
	{
		return USER_ACTION;
	}			 
	//onload event handler for body object	  		  
	function OnBodyLoad()
	{				
		if(!ON_BODY_LOAD=="")
			eval(ON_BODY_LOAD);			
	}			
			
	function launch(varURL, varName, varFeatures) {
	  window.open(varURL,varName,varFeatures);
	}
			
    //used by launchCentered			
	var childWindow;
	var currentLocation;
	function launchCentered (varURL, varName, varWidth, varHeight, varFeatures, blnReload) {
	  
	  if (!varName) varName = '';
	  if (!varFeatures) 
			varFeatures = '';
	  else
	    varFeatures = ',' + varFeatures;
	 
	  if (varWidth < 0)
		varWidth = screen.availWidth - varWidth;
		
	  if (varHeight < 0)
		varHeight = screen.availHeight - varHeight;
	    
	  var x = Math.round((screen.availWidth - varWidth) / 2);
	  var y = Math.round((screen.availHeight - varHeight) / 2);
	  
	  varFeatures = 'left=' + x + ',top=' + y + ',width=' + varWidth + ',height=' + varHeight + varFeatures;
	  
	  if (window.showModalDialog && (varFeatures.indexOf('modal=yes') > 0 ))  
		childWindow = window.showModalDialog(varURL,varName, 'dialogTop:' + y + ';dialogLeft:' + x + ';dialogWidth:' + varWidth + 'px;dialogHeight:' + varHeight + 'px');
	  else			  
		childWindow = window.open(varURL,varName,varFeatures);
	
		currentLocation = window.location;
		
		if (arguments.length == 6)
		{
			if (arguments[5] == true)
			{						
				if ($.browser.msie && $.browser.version == "6.0") //IE6 Only
				{
				    //done as xb.addEvent fails on RTM version of IE6
			        childWindow.attachEvent('onunload', unload);
                    childWindow.attachEvent('onbeforeunload', fixUnload);    
                }
                else
                {
                    //childWindow.attachEvent('onunload', doUnload);
                    //setTimeout("doUnload()",100);
                    $(window).focus(function() {
                        window.location.reload();
                    });                    
                    
                }
                
				
			}
		}
	}
	
    function fixUnload() {
            // Is there things still loading, then fake the unload event
            if (document.readyState == 'interactive') {
                    function stop() {
                            // Prevent memory leak
                            document.detachEvent('onstop', stop);
     
                            // Call unload handler
                            unload();
                    };
     
                    // Fire unload when the currently loading page is stopped
                    document.attachEvent('onstop', stop);
     
                    // Remove onstop listener after a while to prevent the unload function
                    // to execute if the user presses cancel in an onbeforeunload
                    // confirm dialog and then presses the stop button in the browser
                    window.setTimeout(function() {
                            document.detachEvent('onstop', stop);
                    }, 0);
            }
    };	
    
    function unload() {
            reloadPage();
    };
	
	function reloadPage()
	{
		if (currentLocation == window.location)
			window.location.reload();
	}	
	
	function launchFullScreen(varURL, varName, varFeatures)
	{
		if (!varName) varName = '';
		if (!varFeatures) 
		   	varFeatures = '';
		else
		  varFeatures = ',' + varFeatures;
				    
		var varWidth = screen.availWidth;
		var varHeight = screen.availHeight;
				  
		varFeatures = 'left=0,top=0,width=' + varWidth + ',height=' + varHeight + varFeatures;		  
		window.open(varURL,varName,varFeatures);		
	}
			
	function launchCenteredWithToolbar(varURL, varName, varWidth, varHeight, varFeatures) {
		var varNewURL;
		var varMSIEpos;
		var varMajorIEVersion;
				
		varMSIEpos = window.navigator.appVersion.indexOf('MSIE');

		varMajorIEVersion = parseInt(window.navigator.appVersion.charAt(varMSIEpos+5));

		if (varMSIEpos > -1 && varMajorIEVersion > 5) {
			// change existing QMarks to another token.
			varURL = escape(varURL);				
			varNewURL = '/global/print/FrameHolder.asp?PageURL=' + varURL;
		} else {
			varNewURL = varURL;
		}

				
		varFeatures = varFeatures + ',modal=yes';
								
		//now call original method
		launchCentered (varNewURL, varName, varWidth, varHeight, varFeatures);
	}
	
	function launchCenteredPrint (varURL, varName, varWidth, varHeight, varFeatures,varContentDiv) {
	  if (!varName) varName = '';
	  if (!varFeatures) 
			varFeatures = '';
	  else
	    varFeatures = ',' + varFeatures;
	    
	  var x = Math.round((screen.availWidth - varWidth) / 2);
	  var y = Math.round((screen.availHeight - varHeight) / 2);
	  
	  varFeatures = 'left=' + x + ',top=' + y + ',width=' + varWidth + ',height=' + varHeight + varFeatures;
	  
	  if (window.showModalDialog && (varFeatures.indexOf('modal=yes') > 0 ))  
		window.showModalDialog(varURL,varName, 'dialogTop:' + y + ';dialogLeft:' + x + ';dialogWidth:' + varWidth + 'px;dialogHeight:' + varHeight + 'px');
	  else			  
		
	  	var thisWindow = window.open('',varName,varFeatures);
		var s_el = xbGetElementById(varContentDiv);
		
		if(s_el != undefined){
			thisWindow.document.write(s_el.innerHTML);
		} else {

		}
	}		
			
			
	//Check if Current NodeID
	function getNow() {
		if(document.cookie)
		{
			index = document.cookie.indexOf("Now");
			if (index != -1)
			{
				cookieStart = (document.cookie.indexOf("=", index) + 1);
				cookieEnd = document.cookie.indexOf(";", index);
				if (cookieEnd == -1) {cookieEnd = document.cookie.length;}
				return document.cookie.substring(cookieStart, cookieEnd);
			}
		}
	}

var hasFocus = true;
var ON_BODY_LOAD = "";
var USER_ACTION = "";

function refreshIfLostFocus ()
{
	if (hasFocus == false) {
		window.location.reload();
		hasFocus = true
	}
}

//Sets evaluation variable for processing on body load event
function setOnBodyLoad(evalScript)
{
	ON_BODY_LOAD += evalScript;
}

function forceImageWidthToCSSWidth(varSourveDivID){
	var s_el = xbGetElementById(varSourveDivID);
	if ((s_el != typeof undefined) && (s_el != null)) {
		var myWidth = s_el.offsetWidth;
		if((myWidth != typeof undefined) && (myWidth != null) && (myWidth != 0)) {
			s_el.innerHTML = "<img src=\"/images/spacer.gif\" alt=\"\" height=\"1\" width=\"" + myWidth + "\" border=\"0\" />";
		}
	}	
}

function transferDivContents(varSource,varTarget){
	var s_el = xbGetElementById(varSource);
	var t_el = xbGetElementById(varTarget);	
	
	if(typeof(s_el) != 'undefined'){
		if(s_el != null) {
			if(typeof(t_el) != 'undefined'){
				if(s_el != null) {
					 t_el.innerHTML = s_el.innerHTML;
				} else {
					// alert("Target Element is NULL");
				}
			} else {
				// alert("Target Element is undefined");
			}
		} else {
			// alert("Source Element is NULL");
		}
	} else {
		// alert("Source Element is undefined");
	}
}

function transferDivHTML(varSource,varTarget) {
	transferDivContents(varSource,varTarget);
}

function showReportPrintVersion(strSkin,varReportName,varSourceDivs){
	var s;
	var strHTML;
	var newWindow;
	var newPopup;
	var newPopupBody;
	var Anchors;
	
	var strBodyStart;
	strBodyStart = "";
	strBodyStart += "<!doctype html public '-//w3c//dtd html 4.0 transitional//en'><html><head><title>";
	strBodyStart += varReportName;
	strBodyStart += "</title><meta name='author' content='studyserve'><link rel='stylesheet' type='text/css' href='/skins/default/styles/studyserve.css'><link rel='stylesheet' type='text/css' href='/skins/" + strSkin + "/styles/studyserve.css'>";
	strBodyStart += "<script type='text/javascript' language='javascript'>function trapError(errMsg, errScript, errLine){return true;};window.onerror = trapError;</script>";
	strBodyStart += "</head><body id='ReportPrintVersion' style='padding:15px;'>";
	strBodyStart += "<a href='JavaScript:window.print();'><img src=\"/imagegenerator/default.aspx?skin=" + strSkin + "&type=buttonsmall&text=Print\" border=0></a>&nbsp;&nbsp;<a href='JavaScript:window.close();'><img src=\"/imagegenerator/default.aspx?skin=" + strSkin + "&type=buttonsmall&text=Close\" border=0></a><br>";
	
	var strBodyEnd;
	strBodyEnd = "";
	strBodyEnd += "</body></html>";
	
	strHTML = "";
	if(varSourceDivs.length > 0){
		varSourceDivArray = varSourceDivs.split(",");
		for (i=0; i < varSourceDivArray.length; i++) {			
			s = xbGetElementById(varSourceDivArray[i]);
			if(s != typeof undefined && s != null){
				strHTML += "<br>";
				strHTML += s.innerHTML;
			}
		}
	}
	
	
	if(strHTML != ""){
		
		newWindow = window.open("",varReportName,"width=750, height=400, toolbar=yes, scrollbars=yes, resizable");
		newWindow.document.write(strBodyStart);
		newWindow.document.write(strHTML);
		newWindow.document.write(strBodyEnd);
		newWindow.document.close();


		//newPopup = window.createPopup();
		//newPopupBody = newPopup.document.body;		
		//newPopupBody.innerHTML = strHTML;
		
		//newPopup.show(200,200,600,400, document.body);
		
		//Anchors = newWindow.innerHTML;
		//alert(Anchors);

		//alert(Anchors.length);
		//if(Anchors.length > 0){
		//	for (i=0; i < Anchors.length;i++){
		//		alert(Anchors[i]);
		//		Anchors[i].href = "#";
		//	}
		
		//}
		
		
	}
}

function showReceipt(strSkin,varReportName,varSourceDivs){
	var s;
	var strHTML;
	var newWindow;
	var newPopup;
	var newPopupBody;
	var Anchors;

	var strBodyStart;
	strBodyStart = "";
	strBodyStart += "<!doctype html public '-//w3c//dtd html 4.0 transitional//en'><html><head><title>";
	strBodyStart += varReportName;
	strBodyStart += "</title><meta name='author' content='studyserve'><link rel='stylesheet' type='text/css' href='/skins/" + strSkin + "/styles/studyserve.css'>";
	strBodyStart += "<script type='text/javascript' language='javascript'>function trapError(errMsg, errScript, errLine){return true;};window.onerror = trapError;</script>";
	strBodyStart += "</head><body style='padding:15px;'>";
	strBodyStart += "<a href='JavaScript:window.print();'><img src=\"/imagegenerator/default.aspx?skin=" + strSkin + "&type=buttonsmall&text=Print\" border=0></a>&nbsp;&nbsp;<a href='JavaScript:window.close();'><img src=\"/imagegenerator/default.aspx?skin=" + strSkin + "&type=buttonsmall&text=Close\" border=0></a><br>";

	var strBodyEnd;
	strBodyEnd = "";
	strBodyEnd += "</body></html>";
	
	strHTML = "";
	if(varSourceDivs.length > 0){
		varSourceDivArray = varSourceDivs.split(",");
		for (i=0; i < varSourceDivArray.length; i++) {			
			s = xbGetElementById(varSourceDivArray[i]);
			if(typeof(s) != 'undefined' && s != null){
				if(s.display == "" || s.display == "none") {
					s.display  = "block";
				}
				strHTML += s.innerHTML;
			}
		}	
	}
	
	if(strHTML != ""){
		
		newWindow = window.open('',varReportName.replace(' ',''),"width=750, height=400, toolbar=yes, scrollbars=yes, resizable");
		newWindow.document.write(strBodyStart);
		newWindow.document.write(strHTML);
		newWindow.document.write(strBodyEnd);
		newWindow.document.close();
		
	}
}

function Truncate(length) {
	if (document.all) { //IE trap
		if (window.event.srcElement.value.length > length) {
			window.event.srcElement.value=window.event.srcElement.value.substring(0,length);
			alert('Your text exceeded the maximum size for this field: ' + length);
		}
	}
}

function showElementById(strElementID) {
		var el = xbGetElementById(strElementID);

		if (typeof el != 'undefined' && el != null) {
			el.style.display = 'inline';
		}
}

function hideElementById(strElementID) {
		var el = xbGetElementById(strElementID);

		if (typeof(el) != 'undefined' && el != null) {
			el.style.display = 'none';
		}
}

function inspectAttributes(elm){
  var str = "";
  for (var i in elm){
    str += "\n" + i + ": " + elm.getAttribute(i).name + "-|-" + elm.getAttribute(i) + "\n";
  }
  return str;
 }

function DoHierarchicalCheckBoxes(chkbox)
{
	var frm = chkbox.form; 
    var frmElements = frm.elements;
	var parents;
	var children;
	
	disableAll(frmElements, true);
	
    if(chkbox.checked)
    {  
        children = getChildren(frmElements,chkbox.id);   

        for(var i =0; i < children.length; i++)
			children[i].checked = true;
        		
		//Check if all children of parent are checked
		checkParents(frmElements, getParent(frmElements, chkbox.id));
    }
    else
    {
        parents = getParents(frmElements,chkbox.id);
        for(var i =0; i < parents.length; i++)
			parents[i].checked = false;  
		
		children = getChildren(frmElements,chkbox.id);
        for(var i =0; i < children.length; i++)
			children[i].checked = false;
    }

	disableAll(frmElements, false);
}

function disableAll(frmElements, disabled)
{
	for(var i=0;i < frmElements.length;i++)
	{
		if(frmElements[i].type=="checkbox")
			frmElements[i].disabled = disabled;
	}
}

function checkParents(frmElements, parent)
{	
	if(parent != null)
	{
		children = getChildren(frmElements, parent.id); 
		var allChildrenChecked = true;
		for(var i =0; i < children.length; i++)
		{
			if(!children[i].checked)
				allChildrenChecked = false;
		}
		if(allChildrenChecked)
		{
			parent.checked = true;
			checkParents(frmElements, getParent(frmElements, parent.id));
		}
	}
}

function getChildren(frmElements, id)
{           
    var ret = new Array();
    var x = 0; 

    for(var i=0;i < frmElements.length;i++)
    {	
		if(frmElements[i].id.indexOf(id) > -1 && frmElements[i].id != id && frmElements[i].type=="checkbox")			
		{ 
			ret[x] = frmElements[i];
			x++;
		}
    }

    return ret;
}

function getParents(frmElements, id)
{ 
	var ret = new Array();
    var x = 0;

    for(var i=0;i < frmElements.length;i++)
    {    
		if(frmElements[i].type=="checkbox")
		{
			if(isParent(frmElements[i].id, id))
			{  
				ret[x] = frmElements[i];
				x++;
			}
		}
    }

    return ret;
} 

function isParent(parentId, childId)
{
    var pos = childId.split('#').length; 
    var temp = childId.substr(0,childId.lastIndexOf('#'));
    for(var i=0;i<pos;i++)
    { 
        if(parentId == temp)
			return true;
        else
			temp = temp.substr(0,temp.lastIndexOf('#'));
    }
}

function getParent(frmElements, childId)
{	
	if(childId.indexOf('#') > -1)
	{
		var pos = childId.split('#').length; 
		var parentId = childId.substr(0,childId.lastIndexOf('#'));
		for(var i=0;i < frmElements.length;i++)
		{    
			if(frmElements[i].type=="checkbox")
			{
				if(parentId == frmElements[i].id)          
					return frmElements[i];  
			}
		}
	}
	return null;
}

            
function checkHierarchy(formName)
{           
	
    var frm = document.forms[formName]; 
    var frmElements = frm.elements;

    for(var i=0;i < frmElements.length;i++)
    {    
        if(frmElements[i].type=="checkbox" && frmElements[i].checked)
			
			DoHierarchicalCheckBoxes(frmElements[i]);
    }
}

function AddHashOptions(id,hash,showAll,allName)
//This method is a generic method for generating the objects in a hashtable to 
//a selection box. Note: each object must implement .id and .name
{
	//renders the options for the courses select combo
				
	var select = xbGetElementById(id);
	var pos;
	var keys = hash.keys();
				
	while (select.options.length>0)
		select.options[0] = null;
				
	pos=0;	
	if (showAll)
	{
		select.options[pos] = new Option(allName,0);
		pos++;
	}
				
	for (i in keys)
		{
			var obj = hash.get(keys[i]);
			select.options[pos] = new Option(obj.name,obj.id);
			pos++;
		}
				
	//select.change();
}

function dateDiff(dteFrom, dteTo) {
	if((dteFrom.getTime() - dteTo.getTime()) == 0){
		return 0;
	} else {
		if((dteFrom.getTime() - dteTo.getTime()) > 0){
			return -1;
		} else {
			return 1;
		}
	}
}

function disablehref(){

	var input = document.getElementsByTagName("a");
	var count = input.length;
	
	for(var i =0; i < count; i++)
	{
	     if(input[i].attributes.getNamedItem("class").value == "hidden"){                             
            input[i].style.display = "none";                            
         }                     
		input[i].removeAttribute("href");
	}
}

function callSubmit(el){
	// This mimics the form image submit by assigning a value to the name.x parameter. This methodology is used extensively throughout the code 
	// so it is easier to mimic rather than write an alternative
	$(el).parents("form:eq(0)").append('<input type="hidden" name="' + $(el).attr("name") + '.x" id="' + $(el).attr("id")  + '.x" value="12" />');
	$(el).parents("form:eq(0)").submit();
}

function isSet(BitMask, Value) {
	if ((BitMask != null || BitMask != 'undefined') && (Value != null || Value != 'undefined')) {
		return ((BitMask & Value) == Value);
	} else {
		return false;	
	}
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function Right(str, n) {
	if (n <= 0) {
	   return "";
	} else if (n > String(str).length) {
	   return str; 
	} else {
	   var iLen = String(str).length;
	   return String(str).substring(iLen, iLen - n);
	}
}

function isNull(obj) {
	if (obj == null || typeof(obj) == 'undefined') {
		return true;
	};
	return false;
};

function navigate(link) {   
    window.top.location = link;
}

function InStr(strSearch, charSearchFor) {
	for (i=0; i < Len(strSearch); i++) {
		if (charSearchFor == Mid(strSearch, i, 1)) {
			return i;
		}
	}
	return -1;
}

function Mid(str, start, len) {
		// 0 Based!
        if (start < 0 || len < 0) {
			return "";
		}

        var iEnd, iLen = String(str).length;
        if (start + len > iLen) {
                iEnd = iLen;
        } else {
                iEnd = start + len;
		}
        return String(str).substring(start,iEnd);
}

function Len(str) {
	return String(str).length;
}

function getSafeElementID(strID, strOptionalReplaceCharater) {
	
	// !!!!!!   KEEP THE VB VERSION IN SYNC  !!!!!!!
	
	// this removes invalid characters from the id so jQuery and javascript can reference them
	
	// Valid characters in an elementID - Note []{}\/ and ~ are all missing!
	var strCharset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-.';

	if(typeof(strOptionalReplaceCharater) == 'undefined' || strOptionalReplaceCharater == null){
		strOptionalReplaceCharater = '';
	}
	
	var strResult = '';
	var i;

	for(i=parseInt(Len(strID)-1);i>=0;i--) {
		if(InStr(strCharset, Mid(strID,i,1)) >= 0){
			strResult = Mid(strID,i,1) + strResult.toString();
		} else {
			strResult = strOptionalReplaceCharater + strResult.toString();
		}
	}

	return strResult
}
