/*
Standard Puakma JavaScript Library
*/

function jsIsNetscape()
{
	return (navigator.appName == "Netscape") ? true : false;
}

function getDBURL()
{
	var pathname = window.location.pathname;
	var iPos = window.location.pathname.toString().toLowerCase().lastIndexOf('.pma');
	if(iPos>0) return pathname.substring(0, iPos+4);

	return pathname;	
}

function jsCurrentTimeMS()
{
	var dtNow = new Date();
	return dtNow.getTime();
}

function jsMakeArray( szText, szSeperator )
{
	var Array = szText.split(szSeperator)
	return Array;
}

function jsHasProperty(object, propertyName)
{
	for(var pName in object)
	{
		if(pName == propertyName) return true;
	}	
	return false;
}

function jsIsInArray(vValueArray, vValue)
{
	var i=0;
	for(i=0; i<vValueArray.length; i++)
	{
		if(vValueArray[i] == vValue) return true;
	}
	return false;
}


function jsGetFieldValue( field )
{
	var szReturn = "";
	var szType;
	
	if(field == null) return "";
	
	if(field.type) szType = field.type;
	else szType = field[0].type;
    switch (szType) {
    case "hidden":
    case "text":
    case "file":
	case "password":
    case "textarea":
		return field.value;
    case "radio":
		return jsGetRadioValue( field );
    case "checkbox":        
        return jsGetCheckboxValue( field );
    case "select-one":
    		if(field.selectedIndex < 0) return "";
    		szReturn = field.options[field.selectedIndex].value;
    		//if(szReturn == "") return field.options[field.selectedIndex].text;
    		//else 
    		return szReturn;
    case "select-multiple": 
		var vValue = "";    		
		for( i=0; i<field.length; i++)
		{
          	if (field[i].selected)
		{
			vValue = field[i].value;
			//if(vValue == "") vValue = field[i].text;
          		if(szReturn == "") szReturn = vValue;
          		else szReturn = szReturn + "," + vValue;
          	}
		}
		return szReturn;		
    };
}

function jsGetRadioValue( RadioField )
{
	var i="";	
	if(RadioField == null) return "";
	if(jsHasProperty(RadioField, 'type'))
	{
		if( RadioField.checked==true) return RadioField.value;
	}
	
   	for (i=0; i<RadioField.length; i++ ) 
	{
		if( RadioField[i].checked==true) 
		{		
			return RadioField[i].value
		}
	}
	return "";
};

function jsGetCheckboxValue( CheckboxField )
{
	var i="";	
	var szChoice="";
	
	if(CheckboxField == null) return "";	
	if(jsHasProperty(CheckboxField, 'type'))
	{
		if( CheckboxField.checked==true) szChoice = CheckboxField.value;
		return szChoice;
	}
	
   	for (i=0; i<CheckboxField.length; i++ ) 
	{
		if( CheckboxField[i].checked==true) 
		{
			if(szChoice == "") szChoice = CheckboxField[i].value
			else szChoice = szChoice + "," + CheckboxField[i].value			
		}
	}
	return szChoice;
}

function jsIsChecked( CheckboxField, szValue )
{
	var i="";
	
	if(CheckboxField == null) return false;
	if(CheckboxField.type != null)
	{
		if( CheckboxField.checked==true) return true;
		else return false;
	}
	
   	for (i=0; i<CheckboxField.length; i++ ) 
	{
		if( CheckboxField[i].checked==true) 
		{
			if(CheckboxField[i].value == szValue) return true;
		}
	}
	return false;
}

function jsSetCheckbox( CheckboxField, szValue )
{
	var i="";			
	if(CheckboxField == null) return;
   	for (i=0; i<CheckboxField.length; i++ ) 
	{
		if( CheckboxField[i].value==szValue) 
		{
			CheckboxField[i].checked = true;
			return true;
		}
	}
	return false;
}

function jsSetFieldValue( field, szValue )
{
	var szReturn = "";
	var szType;
	if(field == null) return;
	if(field.type) szType = field.type;
	else szType = field[0].type;
	
    switch (szType) {
    case "hidden":
    case "text":
	case "password":
    case "textarea":
    		field.value = szValue;
		return field.value;
    case "radio":
    		for( i=0; i<field.length; i++)
		{
			if( field[i].value == szValue)
			{
				field[i].checked = true;
				return szValue;
			}
		}
		return "";
    case "checkbox":
		var szValueArray = jsMakeArray( szValue, "," )
		for( i=0; i<field.length; i++)
		{
			if( jsIsInArray(szValueArray, field[i].value) )			
				field[i].checked = true;			
			else
				field[i].checked = false;
		}
		return szValue;
    case "select-one":
    		for( i=0; i<field.length; i++)
		{
			if( field.options[i].text == szValue || field.options[i].value == szValue)
			{
				field.options[i].selected = true;
				return szValue;
			}
		}
			if(field.selectedIndex>field.options.length || field.selectedIndex<0)
				szReturn = '';
			else
				szReturn = field.options[field.selectedIndex].value;
    		if(szReturn == '') return field.options[field.selectedIndex].text;
    		else return szReturn;
	case "select-multiple": 
    		var szValueArray = jsMakeArray( szValue, "," )
    		var vValue;
		for( i=0; i<field.length; i++)
		{
			vValue = field[i].value;
			if( vValue == "") vValue = field[i].text;
			if( jsIsInArray(szValueArray, vValue) )
				field[i].selected = true;			
			else
				field[i].selected = false;
		}
		return szValue;    
    };
}


function jsDumpObject( obj )
{   
	var vResult = "";	
	if(obj==null)
	{
		alert('Object is null');
		return;
	}	
	for (var i in obj)
	{
		if(vResult == "")  vResult = i + " = " + obj[i];
		else vResult = vResult + ", " + i + " = " + obj[i];
	};	
	window.alert( vResult );
}

function jsDialog(szFormName, iWidth, iHeight, szURLParam) 
{   
	var iXpos = (screen.width - iWidth)/2;
	var iYpos = (screen.height - iHeight)/2;     
     var szMode = "";
     if(szURLParam.lastIndexOf('~READMODE~') > 0) szMode = "ReadPage"; else szMode = "OpenPage";
     var dbName = getDBURL() + "/" + szFormName + '?' + szMode;
     var windowFeatures =  'resizable=yes,left=' + iXpos.toString() + ',top=' + iYpos.toString() + 'screenX=' + iXpos.toString() + ',screenY=' + iYpos.toString() + ',width=' + iWidth.toString() + ',height=' + iHeight.toString();

	newWindow = window.open(dbName + szURLParam, szFormName, windowFeatures);
	if(newWindow) newWindow.focus();
	return newWindow;
}

function jsWindow(szURL, iWidth, iHeight, szURLParam, szWindowFeatures) 
{   
	var iXpos = (screen.width - iWidth)/2;
	var iYpos = (screen.height - iHeight)/2;
     var windowFeatures =  szWindowFeatures + ',resizable=yes,left=' + iXpos.toString() + ',top=' + iYpos.toString() + 'screenX=' + iXpos.toString() + ',screenY=' + iYpos.toString() + ',width=' + iWidth.toString() + ',height=' + iHeight.toString();
	var dtNow = new Date();	
	var szWindowID = dtNow.getTime().toString();

	var newWindow = window.open(szURL + szURLParam, szWindowID, windowFeatures);
	if(newWindow) newWindow.focus();
	return newWindow;
}


//used by datepicker applet
function jsDatePicker( szField, szDate, szAction)
{
  var form = document.forms[0];
  var field = form.elements[szField];

  if(szAction == "1")  field.value=szDate;

  return field.value;
}

function jsResetListBox( vListField )
{
	for(i=0; i<vListField.length; i++)
	{
		if(vListField.options[i].defaultSelected) 
			vListField.options[i].selected = true 
		else
			vListField.options[i].selected = false
	}
} //jsResetListBox

function jsGetRadioButtonValue( vField )
{
	for(i=0; i<vField.length; i++)
	{
		if(vField[i].checked) return vField[i].value;
	}
	return "";
} //jsGetRadioButtonValue

//THIS IS A GENERIC KEY PARSING FUNCTION
//build an array of allowable character codes, then test that the key pressed is on of those codes
//szWhat must be: alpha, ALPHA, Alpha, number, mixed, MIXED, Mixed
//szChars specify any additional characters to allow, ie: /*^
//iMaxLength is the maximum number of characters allowed in a field
//can be used to parse date entry by: onKeyPress=return jsAllowKey(event, "number", "/", 10, true); 
function jsAllowKey(e, szWhat, szChars, iMaxLength, bShowError)
{
	var vAllowChars;
	var iMaxNumber = 10;
	var iMaxAlpha = 26;
	var iArraySize;
	var szHelpChars = "";

	var charCode = (navigator.appName == "Netscape") ? e.which : e.keyCode;
	if(charCode==8) return true; //allow the backspace key (for Netscape)
	if(charCode==13) return false; //don't allow the enter key
	var vField = (navigator.appName == "Netscape") ? e.target : e.srcElement;
	if(vField.value.length >= iMaxLength) 
	{
		var vPlural = (iMaxLength==1) ? "character" : "characters";
		if(bShowError) alert( "This field allows a maximum of " + iMaxLength + " " + vPlural );
		return false;
	}

	switch( szWhat ) //case sensitive compare!!
	{
	case "alpha": //lowercase only
		szHelpChars = "a-z"
		iArraySize = iMaxAlpha + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxAlpha; i++)
			vAllowChars[i] = i + 97; //a=97
		break;
	case "ALPHA": //uppercase only
		szHelpChars = "A-Z"
		iArraySize = iMaxAlpha + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxAlpha; i++)
			vAllowChars[i] = i + 65; //A=65
		break;
	case "Alpha": //mixed case
		szHelpChars = "aA-zZ"
		iArraySize = iMaxAlpha*2 + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxAlpha; i++)
		{
			vAllowChars[i] = i + 65; //A=65
			vAllowChars[i+iMaxAlpha] = i + 97; //a=97
		}
		i = iArraySize - szChars.length;
		break;
	case "number":
		szHelpChars = "0-9"
		iArraySize = iMaxNumber + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxNumber; i++)
			vAllowChars[i] = i + 48; //0=48
		break;
	case "mixed": //lowercase letters & numbers
		szHelpChars = "a-z 0-9"
		iArraySize = iMaxAlpha + iMaxNumber + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxNumber; i++)
			vAllowChars[i] = i + 48; //0=48
		k=0;
		for(i=i; i<iMaxAlpha+iMaxNumber; i++)
		{
			vAllowChars[i] = k + 97; //a=97
			k++;
		}
		i = iArraySize - szChars.length;
		break;
	case "MIXED": //uppercase letters & numbers
		szHelpChars = "A-Z 0-9"
		iArraySize = iMaxAlpha + iMaxNumber + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxNumber; i++)
			vAllowChars[i] = i + 48; //0=48
		k=0;
		for(i=i; i<iMaxAlpha+iMaxNumber; i++)
		{
			vAllowChars[i] = k + 65; //A=65
			k++;
		}
		i = iArraySize - szChars.length;
		break;
	case "Mixed": //mixedcase letters & numbers
		szHelpChars = "aA-zZ 0-9"
		iArraySize = iMaxAlpha*2 + iMaxNumber + szChars.length;
		vAllowChars = new Array( iArraySize );
		for(i=0; i<iMaxNumber; i++)
			vAllowChars[i] = i + 48; //0=48
		k=0;
		for(i=i; k<iMaxAlpha; i++)
		{
			vAllowChars[i] = k + 65; //A=65
			vAllowChars[i+iMaxAlpha] = k + 97; //a=97
			k++;
		}
		i = iArraySize - szChars.length;
		break;

	default:
		if(szChars.length == 0) return true; //programmer error, let all keys through
		iArraySize = szChars.length;
		vAllowChars = new Array( iArraySize );
		break;
	};
		
	k=0;
	for(i=i; i<iArraySize; i++)
	{
		vAllowChars[i] = szChars.charCodeAt(k);
		k++;
	}
	
	//look to see if the key pressed is in the array
	for(i=0; i<iArraySize; i++)
		if(charCode == vAllowChars[i]) return true;

	var szCharError = "";
	if(szChars == "") szCharError = ""; else szCharError = " and " + szChars;
	//if we get to here we did not find an allowable character
	if(bShowError) alert( "'" + String.fromCharCode(charCode) + "' may not be entered in this field. Allowable characters are: " + szHelpChars + szCharError );
	return false;
} //jsAllowKey

function jsFormatDate( e, vField, szSeperator, szDateFormat, bShowErrors)
{ //used in onKeypress= to 'typeahead' on dates
	var vDateArray = new Array();
	var vNextChar;
	var szFieldValue = jsGetFieldValue(vField);
	var iCurrentPos;
	var iNumberPressed;
	var bValid = true;
	var szLastChar="";
	
	if(!jsAllowKey(e, "number", szSeperator, 10, bShowErrors) ) return false;
	vNextChar = (navigator.appName == "Netscape") ? e.which : e.keyCode; 
	if(vNextChar == 8)	return true; //for Netscape
	iCurrentPos = szFieldValue.length+1;
	iNumberPressed = parseInt(String.fromCharCode(vNextChar));
	if(vNextChar == szSeperator.charCodeAt(0)) iNumberPressed = parseInt(vNextChar);
	szLastChar = szFieldValue.substring(szFieldValue.length-1, szFieldValue.length);	
	//alert(iNumberPressed);
	if(szDateFormat=="DMY")
	{	
		if(iNumberPressed <= 9)
		{
		switch(iCurrentPos)
		{
			case 1:					
					if(iNumberPressed > 3)
					{
						szFieldValue =  "0" + iNumberPressed + szSeperator;					
					}
					else if(iNumberPressed > 0) szFieldValue =  iNumberPressed;
					break;
			case 2:
					if(szLastChar == "3" && iNumberPressed > 1) 
					{						
						szFieldValue =  szFieldValue + szSeperator + iNumberPressed + szSeperator;
					}
					else
						szFieldValue =  szFieldValue + iNumberPressed + szSeperator;
					break;
			case 4: //month
					if(iNumberPressed > 1)
					{
						szFieldValue =  szFieldValue + "0" + iNumberPressed + szSeperator;					
					}
					else if(iNumberPressed >= 0) szFieldValue =  szFieldValue + iNumberPressed;
					break;
			case 5:
					if(szLastChar == "1" && iNumberPressed > 2) return false;
					szFieldValue =  szFieldValue + iNumberPressed + szSeperator;
					break;
			default:
					szFieldValue =  szFieldValue + iNumberPressed;
		}//end switch
		}
		else //seperator entered
		{
			szFieldValue =  szFieldValue + szSeperator;
		}
	}
	else //MDY format
	{
		if(iNumberPressed <= 9)
		{
			switch(iCurrentPos)
			{
			case 1: //month
					if(iNumberPressed > 1)
					{
						szFieldValue =  "0" + iNumberPressed + szSeperator;					
					}
					else szFieldValue =  iNumberPressed;
					break;
			case 2:
					if(szLastChar == "1" && iNumberPressed > 2) 
						szFieldValue =  szFieldValue + szSeperator + iNumberPressed + szSeperator;
					else
						szFieldValue =  szFieldValue + iNumberPressed + szSeperator;
					break;
			case 4: //day
					if(iNumberPressed > 3)
					{
						szFieldValue =  szFieldValue + "0" + iNumberPressed + szSeperator;					
					}
					else if(iNumberPressed > 0) szFieldValue =  szFieldValue + iNumberPressed;
					break;
			case 5:
					if(szLastChar == "3" && iNumberPressed > 1) 
					{						
						szFieldValue =  szFieldValue + szSeperator + iNumberPressed;
					}
					else
						szFieldValue =  szFieldValue + iNumberPressed + szSeperator;
					break;			
			default:
					szFieldValue =  szFieldValue + iNumberPressed;
			}//end switch
		}
		else //seperator entered
		{
			szFieldValue =  szFieldValue + szSeperator;
		}
	}
	//validate year for leap etc				
	szFieldValue = jsValidateDate( szFieldValue, szSeperator, szDateFormat, bShowErrors );
	jsSetFieldValue(vField, szFieldValue);
	return false;
}

function jsValidateDate( szDate, szSeperator, szDateFormat, bShowErrors )
{ //Used to validate a string date
	var szReturn;
	var vDateArray;
	var szDay, szMonth, szYear;
	var iDay, iMonth, iYear;
	var vValidMonthDays = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
	var vMonthNames = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var iDayMax;
	var bDayChanged=false;

	iDay=0; iMonth=0; iYear=-1;
	szDay=new String(""); szMonth=new String(""); szYear=new String(""); 
	szDate = new String(szDate); //force cast to string else string functions do not work!
	if(szDate.indexOf(szSeperator) < 0) return szDate;
	vDateArray = szDate.split(szSeperator);		
	if(szDateFormat == "DMY")
	{
		switch(vDateArray.length) //fall through
		{
		default:
		case 3:
				szYear = new String(vDateArray[2]);
				if(szYear.length > 4) szYear = szYear.substring(0, 4);
				if(szYear != "") iYear = parseInt(szYear, 10);		
		case 2:
				szMonth = "0" + vDateArray[1];
				iMonth = parseInt(szMonth, 10);
				if(iMonth == 1 && vDateArray.length < 3)
					szMonth = new String(iMonth);
				else
					if(iMonth==0) szMonth = ""; else szMonth = szMonth.substring(szMonth.length-2, szMonth.length) + szSeperator;
		case 1:
				szDay = "0" + vDateArray[0];
				iDay = parseInt(szDay, 10);				
				if(iMonth > 0)
				{
					iDayMax = vValidMonthDays[iMonth-1];
					if(iDay > iDayMax) { iDay = iDayMax; bDayChanged=true;}
				}				
				szDay = new String("0" + iDay);
				if(iMonth == 2 && iDay >= 29) //leap year testing
				{
					iDay = 29;
					if(szYear != "")
					{ //only test 4 digit years for leapyear						
						if(szYear.length == 4 && !jsIsLeapYear(iYear)) {iDay = 28; bDayChanged=true;}
					}							
					szDay = new String(iDay);
				}				
				if(iDay==0) szDay = ""; else szDay = szDay.substring(szDay.length-2, szDay.length) + szSeperator;
		};		
		szReturn = szDay + szMonth + szYear;
	}
	else//assume MDY
	{	
		//return szDate;
		switch(vDateArray.length) //fall through
		{
		default:
		case 3:
				szYear = new String(vDateArray[2]);
				if(szYear.length > 4) szYear = szYear.substring(0, 4);
				if(szYear != "") iYear = parseInt(szYear, 10);		
		case 1:
		case 2:
				szMonth = "0" + vDateArray[0];
				iMonth = parseInt(szMonth, 10);
				if(iMonth == 1 && vDateArray.length == 1) 
					szMonth = new String(iMonth);
				else
					if(iMonth==0) szMonth = ""; else szMonth = szMonth.substring(szMonth.length-2, szMonth.length) + szSeperator;
				if(vDateArray.length == 1) break;
		//do days now
				szDay = "0" + vDateArray[1];
				iDay = parseInt(szDay, 10);				
				if(iMonth > 0)
				{
					iDayMax = vValidMonthDays[iMonth-1];
					if(iDay > iDayMax) {iDay = iDayMax; bDayChanged=true;}
				}				
				szDay = new String("0" + iDay);
				if(iMonth == 2 && iDay >= 29) //leap year testing
				{
					iDay = 29;
					if(szYear != "")
					{ //only test 4 digit years for leapyear						
						if(szYear.length == 4 && !jsIsLeapYear(iYear)) {iDay = 28; bDayChanged=true;}
					}							
					szDay = new String(iDay);
				}	
				if(iDay < 4 && iDay > 0 && vDateArray.length < 3)
					szDay = new String(iDay);
				else 
					if(iDay == 0) szDay = ""; else szDay = szDay.substring(szDay.length-2, szDay.length) + szSeperator;
		};		
		szReturn = szMonth + szDay + szYear;
	}
	if(bDayChanged && bShowErrors) alert(vMonthNames[iMonth-1] + " has only " + iDayMax + " days.");	
	
	return szReturn;
}

function jsIsLeapYear( iYear )
{
	//tests whether the given year (yr) is a leap year.
	return (((iYear % 4 == 0) && (iYear % 100 != 0)) || (iYear % 400 == 0))
}

function jsFieldFocus( vField )
{
	if(vField==null) return;
	var szType;	
	if(vField.type) szType = vField.type;
	else szType = vField[0].type;
	
	if(vField.length > 1 && !(szType=='select-one' || szType=='select-multiple'))
		vField[0].focus();
	else
		vField.focus();
}

function jsAddOption(vField, szDisplayValue, szValue)
{
	var elOptNew = document.createElement('option');
	elOptNew.text = szDisplayValue;
	elOptNew.value = szValue;
	  
	try {
		vField.add(elOptNew, null); // standards compliant; doesn't work in IE
	}
	catch(ex) {
		vField.add(elOptNew); // IE only
	}
}

function jsRemoveAllOptions(vField)
{
	if(!vField) return;
	if(vField.options)	vField.options.length = 0;
}

function jsIsDefined( sVariable)
{
    return (typeof(window[sVariable]) == "undefined") ?  false: true;
}



