/*
'==========================================================================================
'	JavaScript form validation and "date object" creation
'==========================================================================================
'	(c) Copyright 2003-2004 Ocktober Design Inc. All rights reserved.
'
'	Email			:	info@ocktober.com
'	Web Site		:	www.ocktober.com
'------------------------------------------------------------------------------------------
*/


/*
//----------------------------------------------------------------------------------------
//	Validation Functions
//----------------------------------------------------------------------------------------

Validation sequence:

1.	StartValidatingForm(strFormName)

2.			FV_GetValue(strElement)
and/or		FV_ValidationError(strErrorMessage)
and/or		FV_Validate(strElement, strValidationType, strErrorMsg)
				// Validation types:
				NOT_EMPTY
				IS_NUMBER
				IS_TEXT

3.	if(blnCurValidationOK)
		...form is okay
*/



// Validation-related variables
var strFormValidated = null;
var blnCurValidationOK = false;

// Validation types
var NOT_EMPTY= 10
var IS_NUMBER=11
var IS_TEXT = 12
var MIN_LENGTH = 13
var MAX_WORDS = 14
var MUST_BE_EMPTY = 15
var MAX_LENGTH = 16
var NOT_CONTAIN = 17
var IS_EMAIL = 18
var IS_UPPER_CASE = 19
var IS_LOWER_CASE = 20
var IS_MONEY = 21
var MIN_ELEMENT = 22
var MAX_ELEMENT = 23


function StartValidatingForm(strFormName)
{
	blnCurValidationOK = true;
	if ( isNaN( parseFloat( strFormName ) ) ) {
		strFormValidated = document.strFormName;
	} else {
		strFormValidated = document.forms[strFormName];
	}
}

function SetFormAction(strAction)
{
	strFormValidated.action = strAction;
}

function SubmitForm()
{
	strFormValidated.submit();
}

function FV_GetValue(strElement)
{
//	var objElement = document.forms[strFormValidated].elements[GetElementIndex(strFormValidated,strElement)];
	var objElement = strFormValidated.elements[GetElementIndex(strFormValidated,strElement)];
//alert(isNaN(objElement.length))
	switch (objElement.type)
	{
		case "checkbox":
			return GetCheckBoxValue(strFormValidated,strElement);
			break;
		case "radio":
			return GetRadioValue(strFormValidated,strElement);
			break;
		case "select-one":
			return GetSelectValue(strFormValidated,strElement);
			break;
		default:
			return GetTextValue(strFormValidated,strElement);
			break;
	}
	alert ("Error");
}


function FV_SetFocus(strElement)
{
	var objElement = strFormValidated.elements[GetElementIndex(strFormValidated,strElement)];
	if ( objElement.type != "hidden" ) {
		objElement.focus();
	};
}


function FV_SetValue(strElement,vntVal)
{
	var objElement = strFormValidated.elements[GetElementIndex(strFormValidated,strElement)];
	switch (objElement.type)
	{
		case "checkbox":
			SetCheckBoxValue(strFormValidated,strElement,vntVal);
			break;
		case "radio":
			SetRadioValue(strFormValidated,strElement,vntVal);
			break;
		case "select-one":
			SetSelectValue(strFormValidated,strElement,vntVal);
			break;
		default:
			SetTextValue(strFormValidated,strElement,vntVal);
			break;
	}
}


function FV_ValidationError(strErrorMessage)
{
	if (blnCurValidationOK==false)
		return;
	blnCurValidationOK=false;
	alert (strErrorMessage);
}

// This function sets the "blnCurValidationOK" variable according to the results of the validation,
// and prints an error message if unsuccessful.
// Note: if blnCurValidationOK is already = false, we just skip the test
function FV_Validate(strElement, strValidationType, strErrorMsg, vntArg)
{
	if (blnCurValidationOK==false)
		return;
	var strCurValue = FV_GetValue(strElement);

	switch (strValidationType)
	{
		case 10:
			if(strCurValue== "")
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 11:
			if(isNaN(parseFloat(strCurValue)))
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 12:
			if(!isNaN(parseFloat(strCurValue)))
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 13:
			if(String(strCurValue).length<vntArg)
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 14:
			if(CountWords(String(strCurValue))>vntArg)
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 15:
			if(strCurValue!= "")
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 16:
			if(String(strCurValue).length>vntArg)
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 17:
			if(String(strCurValue).indexOf(vntArg)!=-1)
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 18:
			var AtSymStart			= String(strCurValue).indexOf('@');
			var AtSymEnd			= String(strCurValue).lastIndexOf('@');
			var PeriodSym			= String(strCurValue).lastIndexOf('.');
			var SpaceSym			= String(strCurValue).indexOf(' ');
			var ExclamationMarkSym	= String(strCurValue).indexOf('!');
			var QuestionMarkSym		= String(strCurValue).indexOf('?');
			var PoundSym			= String(strCurValue).indexOf('#');
			var AsteriskSym			= String(strCurValue).indexOf('*');
/*
			var BackSlashSym		= String(strCurValue).indexOf('\');
			var FrontSlashSym		= String(strCurValue).indexOf('/');
*/
			var Length				= String(strCurValue).length;

			if ((AtSymStart < 1) ||					// '@' cannot be in first position
			    (AtSymStart != AtSymEnd) ||			// '@' must be found only once
			    (PeriodSym <= AtSymStart+1) ||		// Must be atleast one valid char btwn '@' and '.'
			    (PeriodSym == Length-1 ) ||			// Must be atleast one valid char after '.'
			    (SpaceSym  != -1) ||				// No empty spaces permitted
				(ExclamationMarkSym != -1) ||		// No exclamation mark permitted
				(QuestionMarkSym != -1) ||			// No question mark permitted
				(PoundSym != -1) ||					// No pound permitted
				(AsteriskSym != -1))				// No asterisk permitted
/*
				(BackSlashSym != -1))				// No back slash permitted
				(FrontSlashSym != -1))				// No front slash permitted
*/
			{  
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			}
			break;
		case 19:
			var RegularPattern		= String(strCurValue)
			var UpperCasePattern	= String(strCurValue).toUpperCase()
			if( RegularPattern==UpperCasePattern && RegularPattern!='')
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 20:
			var RegularPattern		= String(strCurValue)
			var LowerCasePattern	= String(strCurValue).toLowerCase()
			if( RegularPattern==LowerCasePattern && RegularPattern!='')
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			break;
		case 21:
			var RegularExpression	= /[^\.0-9]/;
			var PeriodSymStart		= String(strCurValue).indexOf('.');
			var PeriodSymEnd		= String(strCurValue).lastIndexOf('.');
			var Length				= String(strCurValue).length;

			if ( RegularExpression.test(String(strCurValue)) ) { 
				FV_ValidationError(strErrorMsg);
				FV_SetFocus(strElement);
			} else if (PeriodSymStart != -1) {
				if ( PeriodSymStart != Length-3 | PeriodSymEnd != Length-3 ) { 
					FV_ValidationError(strErrorMsg);
					FV_SetFocus(strElement);
				} 
			};
			break;
		case 22:
			var a					= String(strCurValue).split(',');
			var Length				= a.length;

			if(Length<vntArg) {
				FV_ValidationError(strErrorMsg);
			};
			break;
		case 23:
			var a					= String(strCurValue).split(',');
			var Length				= a.length;

			if(Length>vntArg) {
				FV_ValidationError(strErrorMsg);
			};
			break;
		default:
			FV_ValidationError("Invalid validation type");
			FV_SetFocus(strElement);
			break;
	}
}










/*
//----------------------------------------------------------------------------------------
//	Gets ISO string from any JavaScript date object (and vice versa)
//----------------------------------------------------------------------------------------
*/
function Get_ISO8601_DateTime(objDateTime)
{
	// ***** DATE OBJECTS ARE FUCKED: MONTH is from 0 to 11!!!! +1 to put in database!
	return objDateTime.getFullYear()+"-"+Get2Digits(objDateTime.getMonth()+1)+"-"+Get2Digits(objDateTime.getDate())+"T"+
							Get2Digits(objDateTime.getHours())+":"+Get2Digits(objDateTime.getMinutes())+":00";
}

function Get_JavaObjFrom_ISO8601_DateTime(strDateTime)
{
	if(strDateTime=="")
		return new Date();

	// ***** DATE OBJECTS ARE FUCKED: MONTH is from 0 to 11!!!! +1 to put in database!
	var strYear=String(strDateTime).slice(0,4);
	var strMonth=String(strDateTime).slice(5,7);
	var strDay=String(strDateTime).slice(8,10);
	var strHour=String(strDateTime).slice(11,13);
	var strMin=String(strDateTime).slice(14,16);
	var strSec=String(strDateTime).slice(17,19);
	return new Date(strYear,strMonth-1,strDay,strHour,strMin,strSec);
}

// Gets a date from a string as above, but expects to date to be in --UTC (Greenwich time)--
function Get_UTC_JavaObjFrom_ISO8601_DateTime(strDateTime)
{
	if(strDateTime=="")
		return new Date();

	// ***** DATE OBJECTS ARE FUCKED: MONTH is from 0 to 11!!!! +1 to put in database!
	var strYear=String(strDateTime).slice(0,4);
	var strMonth=String(strDateTime).slice(5,7);
	var strDay=String(strDateTime).slice(8,10);
	var strHour=String(strDateTime).slice(11,13);
	var strMin=String(strDateTime).slice(14,16);
	var strSec=String(strDateTime).slice(17,19);
	return new Date(Date.UTC(strYear,strMonth-1,strDay,strHour,strMin,strSec));
}












//	Lower-level Get/Set functions for forms
//----------------------------------------------------------------------------------------
function GetElementIndex(strForm,strElem)
{
	for (var i = 0; i < strForm.elements.length; i++)
	{
		if(strForm.elements[i].name ==strElem)
		{
			return i;
		}
	}
return -1;
}
function SetSelectValue(strForm,strElem,vntVal)
{
	var objelem = strForm.elements[strElem];
	for(i=0;i<objelem.length;i++)
	{
		if(objelem[i].value==vntVal)
		{
			objelem.selectedIndex=i;
			return;
		}
	}
}
function GetSelectValue(strForm,strElem)
{
	var objelem = strForm.elements[strElem];
	return objelem[objelem.selectedIndex].value;
}



function SetRadioValue(strForm,strElem,vntVal)
{
	var objelem = strForm.elements[strElem];
	for(i=0;i<objelem.length;i++)
	{
		if(objelem[i].value==vntVal)
		{
			objelem[i].checked=true;
			return;
		}
	}
}
function GetRadioValue(strForm,strElem)
{
	var objelem = strForm.elements[strElem];
	if(isNaN(objelem.length))
	{
		if(objelem.checked==true)
			return  objelem.value;
		return "";
	}
	for(i=0;i<objelem.length;i++)
	{
		if(objelem[i].checked)
			return objelem[i].value;
	}
	return "";
}



function SetTextValue(strForm,strElem,vntVal)
{
	strForm.elements[strElem].value=vntVal;
}

function GetTextValue(strForm,strElem)
{
	var objelem = strForm.elements[strElem];
	return objelem.value;
}

function GetTextLength(strForm,strElem)
{
	var objelem = strForm.elements[strElem];
	return objelem.lenght;
}

function GetTextIndexOf(strForm,strElem)
{
	var objelem = strForm.elements[strElem];
	return objelem.indexof;
}

function SetCheckBoxValue(strForm,strElem,vntVal)
{
	var objelem = strForm.elements[strElem];

	// If it is a Single CheckBox
	if( isNaN( objelem.length ) ) {
		if ( objelem.value == vntVal ) {
			objelem.checked = true;
		} else {
			objelem.checked = false;
		}
	}
	// Else, it is a Group of CheckBoxes
	else {
		for( i=0; i<objelem.length; i++ ) {
			if ( objelem[i].value == vntVal ) {
				objelem[i].checked = true;
			} else {
				objelem[i].checked = false;
			}
		}
	}
}

function GetCheckBoxValue(strForm,strElem)
{
	var objelem = strForm.elements[strElem];

	// If it is a Single CheckBox
	if( isNaN( objelem.length ) ) {
		if ( objelem.checked ) {
			var objvalue = objelem.value;
		}

	// Else, it is a Group of CheckBoxes
	} else {
		var objvalue = new Array();
		for( i=0; i<objelem.length; i++ ) {
			if ( objelem[i].checked ) {
				push2( objvalue, objelem[i].value );
			}

		}
	}
	return objvalue;
}














//----------------------------------------------------------------------------------------
//	Various utility functions
//----------------------------------------------------------------------------------------




// Abstract checking
//----------------------------------------------------------------------------------------
function CountWords(strText)
{
  var words = new String(strText);
  var num_words = 0;

  words = words.split(/\s+/);
  num_words = words.length;
  return num_words;
}

// Used in "date" functions
//----------------------------------------------------------------------------------------
function Get2Digits(str)
{
	if(str<10)
		return "0"+str;
	return str;
}


// Adds an item at the end of an array
//----------------------------------------------------------------------------------------
function push2(Aobj,vnt)
{
	Aobj[ Aobj.length ] = vnt;
}




