//This function validate a date
need2BSubmitted=false;
var pageIsLoaded=false;
var alreadySubmitted=false;

var agt=navigator.userAgent.toLowerCase();

// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use is_ie5up to detect IE5.
var is_major = parseInt(navigator.appVersion);
var is_minor = parseFloat(navigator.appVersion);

// Note: Opera and WebTV spoof Navigator.  We do strict client detection.
// If you want to allow spoofing, take out the tests for opera and webtv.
var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
            && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
            && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
var is_nav4 = (is_nav && (is_major == 4));

function none(){}
function validDate(toVerify) {
	if (toVerify != '') {
		var aryElms = toVerify.split('/') ;
		strRe = "/ /g"
		re = new RegExp(strRe);
		aryElms[0].replace(re,'');
		aryElms[1].replace(re,'');
		aryElms[2].replace(re,'');
		if (aryElms[0]=='' || aryElms[1]=='' || aryElms[2]=='')
			return '' ;
		var giorno  = aryElms[0] * 1 ;
		var mese    = aryElms[1] * 1 ;
		var anno    = aryElms[2] * 1 ;

		if (anno < 50) { 
			anno += 2000 ;
		}
		else if (anno<100){
			anno += 1900 ;
		}
		if (isNaN(anno)) {
			var toDay = new Date() ;
			anno = toDay.getFullYear() ;
		}
		var d = new Date(mese+'/'+giorno+'/'+anno);
		if (isNaN(d) || ( giorno+'/'+mese+'/'+anno !=  d.getDate()+'/'+(d.getMonth()+1)+'/'+d.getFullYear())) {
			return '' ;
		}

		return (giorno+'/'+mese+'/'+anno) ;
	}
	return '' ;
}

function isValidDate(toVerify)
{
	if (validDate(toVerify)!='') return true;
	return false;
}

function selectDefault(objSelect, strValue) {
	var i;
	for (i = 0; i < objSelect.options.length; i ++) {
			currValue = objSelect.options[i].value * 1
			if ( currValue == strValue) {
			return i;
		}
	}
	return -1;
}


//This function is used to command page change arrows 
//	strLayers: string of layers 
//	offset:	   decrement/increment offset (1; -1)
//  arrowFwd:  forward arrow
//	arrowBkw:  backward arrow		  
//  txtLayer:  Output text layer
//	fontClass: font class of text
//	pos is a global variable (begin value = 0) 
function renderCurrLayers(strLayers, offset, arrowFwd, arrowBkw, txtLayer, fontClass) {
	nameList = new Array;
	nameList = strLayers.split(':');
	pos = pos + offset;
	posPrinted = pos + 1;
	txtOutput = '<span class=' + fontClass + '>' + posPrinted + '/' + (nameList.length) + '</span>';
	putText2Layer(txtLayer,0,txtOutput);
	mHideElement(strLayers); 
	showElement(nameList[pos]);
	if (pos == 0) {
		hideElement(arrowBkw); 
		showElement(arrowFwd);
	}
	else if (pos == (nameList.length-1)) {
		hideElement(arrowFwd); 
		showElement(arrowBkw);
	}
	else {
		showElement(arrowFwd); 
		showElement(arrowBkw);
	}
	return;
}

function showAlertMessage(msg)
{
	var len=msg.length;
	var mnew='';
	mnew+="E R R O R   F O U N D !!\n"
	for(var x=0;x<19;x++){
		mnew+='_';
	}
	mnew+='\n\n\n'
	mnew+="     "+msg+'     \n\n'
	alert(mnew);
}

function makeCentered(msg,lens){
	var lnx=(msg.length/2);
	var addx=(lens/2)-lnx;

	var ret='';
	for (var f=0;f<10+addx;f++){
		ret+=' ';
	}
	ret+=msg;
	return ret;
}

/************************************************************
 Responsible for automatic form checking
 will have even custom alert messages depending on field name
 Parameters passed:
 	formObj		- form object to verify
 	showAllAtOnce	- show error message in one alert or per each field
 	need2BSubmitted - true/false. false to put when using in onsubmit event of <form>
 										true to use when we have <a href> in onclick event because of
 										problems of a form!
 	target		- optional parameter for target of form!
 	window oppening string	- optional parameter that will open window with following string!
 coding of form field names:
 1st char is type of field:
 	N - Numeric
 	T - Text
 	F - Full name (first & last)
 	D - Date
 	E - Email
 	R - Radio
 	C - Checkbox
 	S - Select (signgle select)
 2nd is is it obligatory or not(O or anything other)
 3rd is optional parameter and specifies required length
 4th (or 3rd if 3rd is left out) must be '|' (pipe symbol)
 and after theese goes real name of field.
 If you wan t to extend verification, you need to override 
 function aditionalVerify(form) where parameter 'form' is
 reference to form object
*************************************************************/ 
function autoFormVerify(formObj,showAllAtOnce,need2BSubmitted)
{
	/*
	if(alreadySubmitted){
		return;
	}
	alreadySubmitted=true;
	*/
	if(!pageIsLoaded){
		showAlertMessage("Page is still loading. Please wait.");
		return;
	}
	var i,toFocus;
	var ok=true
	var custMessage='';
	var myNewForm = formObj;
	var showed=false;
	
	if (autoFormVerify.arguments.length >= 4) 
		myNewForm.target=autoFormVerify.arguments[3];
	
	for (i=0;i<myNewForm.elements.length;i++){
		if(myNewForm.elements[i].type =='select' || myNewForm.elements[i].type =='text'
			|| myNewForm.elements[i].type =='textarea' || myNewForm.elements[i].type =='radio'
			|| myNewForm.elements[i].type =='password' || myNewForm.elements[i].type =='checkbox'
			|| myNewForm.elements[i].type =='hidden' || myNewForm.elements[i].type =='select-one'){
			if(!analyzeFormField(myNewForm.elements[i])){
				if (!toFocus) toFocus=myNewForm.elements[i]
				var newName = myNewForm.elements[i].name.substring(myNewForm.elements[i].name.indexOf('|')+1,myNewForm.elements[i].name.length);
				ok=false;
				var myMsg=eval(newName+'_message');
				if(!showAllAtOnce && !showed){
					showed=true
					showAlertMessage(myMsg)					
				}
				else
					custMessage+=(myMsg+'\n')					
			}
			
		}
	}
	//aditionalVerify(form) can be overloaded to add support to define 
	//additional verifications (like bonds of elements) 
	if(ok)
		ok&=additionalVerify(myNewForm);
	if(showAllAtOnce && custMessage!='')
		alert(custMessage)
	if(ok){
		var ok=false
		while (!ok){
			ok=true;
			for (i=0;i<myNewForm.elements.length;i++){
				myNewForm.elements[i].name=myNewForm.elements[i].name.substring(myNewForm.elements[i].name.indexOf('|')+1,myNewForm.elements[i].name.length);
				ok&=!(myNewForm.elements[i].name.indexOf('|')>-1)
			}
		}
		//for (i=0;i<myNewForm.elements.length;i++){
		//	if (myNewForm.elements[i].type =='password'){
		//		myNewForm.elements[i].value=md5(myNewForm.elements[i].value)
		//	}
		//}
		if (autoFormVerify.arguments.length == 5) {
			var mwin=window.open('',autoFormVerify.arguments[3],autoFormVerify.arguments[4])				
			mwin.focus();
		}
		if(need2BSubmitted){
			myNewForm.submit();
		}
	}
	if (toFocus){
		if (toFocus.type=='hidden'){}
		else{
			toFocus.focus()
			if(toFocus.type =='text' && toFocus.type !='textarea')
				toFocus.select()
		}
	}
	if (!ok)
		return false;
	else
		return true;
}

function additionalVerify(form)
{
	return true;
}

/******************************************************************
ChangeObligatoryField takes 3 parameters
fieldObj 	- current field (we'll use fld.form to get form element)
name 		- name of field to change obligatory flag
obligatory 	- true/false for obligatory flag
******************************************************************/
function changeObligatoryField(fieldObj,name,obligatory)
{
	var i
	var form = fieldObj.form
	var par
	if (obligatory)
		par='O'
	else
		par='X'
	for (i=0;i<form.elements.length;i++){
		var nm,frnm
		nm=name.toLowerCase()
		frnm=form.elements[i].name.toLowerCase()
		nm=nm.substring(2,nm.length)
		frnm=frnm.substring(2,frnm.length)
		if(nm==frnm){
			form.elements[i].name=form.elements[i].name.charAt(0)+par+
				form.elements[i].name.substring(2,form.elements[i].name.length)
		}
	}
}

function analyzeFormField(fld)
{
	fld.value=trim(fld.value)
	if (fld.name.indexOf('|')<2){
		return true;
	}
	var newName = fld.name.substring(fld.name.indexOf('|')+1,fld.name.length);
	var toCheck = fld.name.substring(0,fld.name.indexOf('|'));
	//fld.name=newName
	reqLen=0
	if (toCheck.length>2){
		br = toCheck.substring(2,toCheck.length)
		if (isInteger(br))
			reqLen = parseInt(br);
		toCheck = toCheck.substring(0,2);
		
	}
	toCheck=toCheck.toUpperCase()
	passed=true;
	if (toCheck.charAt(1)=='O' && toCheck.charAt(0)!='C')
		passed&=(!isWhitespace(fld.value)) & (!isEmpty(fld.value));
	if (toCheck.charAt(1)=='O' && toCheck.charAt(0)=='S'){
		if (is_nav4){
			var mvtt;
			mvtt=fld.options[fld.selectedIndex].value;
			passed&=(!isWhitespace(mvtt)) & (!isEmpty(mvtt));
		}
		else
			passed&=(!isWhitespace(fld.value)) & (!isEmpty(fld.value));
	}

	if (reqLen>0 && fld.value.length>0)
		passed&=(fld.value.length>=reqLen) & toCheck.charAt(1)=='O'
	ch=toCheck.charAt(0)
	if (ch=='N')
		passed&=isInteger(fld.value,true)
	else if (ch=='D'){
		passed&=isValidDate(fld.value,true)
		if(passed) 
			fld.value=validDate(fld.value,true)
	}
	else if (ch=='E' && fld.value.length>0)
		passed&=isEmail(fld.value,true)
	else if (ch=='F' && fld.value.length>0)
		passed&=isFullName(fld.value,false)
	else if (ch=='R' || ch=='C'){
		passed&=verifyRadioGroup(fld,toCheck.charAt(1)=='O')
	}
	if (!passed){
		return false;
	}
	return true;
}

function verifyRadioGroup(fld,mandatory)
{
	if (mandatory){
		var newName = fld.name.substring(fld.name.indexOf('|')+1,fld.name.length);
		var newNameForm;
		var i
		var form = fld.form
		var pos=0;
		
		var myPos=-1;
		//if (navigator.appName.toLowerCase()=="netscape" && navigator.appVersion.substring(0,1)>'4')
		//	pos--;
		
		for (i=0;i<form.elements.length;i++){
			newNameForm = form.elements[i].name.substring(form.elements[i].name.indexOf('|')+1,form.elements[i].name.length);
			if (newName.toLowerCase()==newNameForm.toLowerCase()){
				if (fld.value==form.elements[i].value){
					myPos=pos;
				}
				pos++;
			}
		}
		var chk=false
		if (myPos==0){

			for (i=0;i<form.elements.length;i++){
				newNameForm = form.elements[i].name.substring(form.elements[i].name.indexOf('|')+1,form.elements[i].name.length);
				if (newName.toLowerCase()==newNameForm.toLowerCase()){
					chk|=form.elements[i].checked;
				}
			}
			return chk;
		}
		else
			return true;
	}
	else
		return true;
}

function trim(s) {
	return s.replace(/^\s*/,'').replace(/\s*$/, '');
}

function isFullName(s){
	if (isEmpty(s)){
		if (isFullName.arguments.length == 1) 
			return defaultEmptyOK;
		else 
			return (isFullName.arguments[1] == true);
	}	
    arr=s.split(" ");
    if (arr.length > 1) {
        return true;
    }
	return false;
}
function propagate(){}