var view='',showHints='false',validationType='multiple';

function onError(control){
	if(view!='' && control.getAttribute('group')&& typeof(showPage)=='function'){
		control.offsetHeight==0 ? showPage(control.getAttribute('group')): '';
	}
}

function isInteger(inputVal,canBeEmpty){
	var inputStr=inputVal.toString();
	return(canBeEmpty && inputStr.length==0)? true : /^-?(\d)+$/.test(inputStr);
}

function isFloat(inputVal){
	var str=inputVal.toString();
	return /^-?\d+(\.(\d)+)?$/.test(str);
}

function VResult(result,text,el){
	this.result=result;
	this.text=text;
	this.el=el;
}

function checkInputText(el,format,desc){

	var bRes=true;
	var err='';
	var v=el.value;
	if(format!=''){

		datatype=format.substr(0,1);
		var bRange=false;
		if(format.match(/\S:\[(\S{0,});(\S{0,})\]/)){
			bRange=true;
			var range=format.replace(/\S:\[(\S{0,});(\S{0,})\]/,'$1:$2').split(':');
		}

		switch(datatype){

			case 'i': 
				if(!(bRes=isInteger(v,true))){
					err='must be integer value!';
				}else if(bRange&&(err=checkNumberRange(el,range[0],range[1],desc))!=false){bRes=false;}
			break;
			case 'n':
				if(!(bRes=isInteger(v,false))){
					err='must be non-empty integer value!';
				}else if(bRange&&(err=checkNumberRange(el,range[0],range[1],desc))!=false){bRes=false;}
			break;
			case 'f': 
				if(!(bRes=isFloat(v))){
					err='must be float value!';
				}else if(bRange&&(err=checkNumberRange(el,range[0],range[1],desc))!=false){bRes=false;}
			break;
			case 's':
				if(bRange&&(err=checkStringLengthRange(el,range[0],range[1],desc))!=false){bRes=false;}
			break;
		}
	}
	return new VResult(bRes,err,el);
}


function checkNumberRange(el,minVal,maxVal,desc){
	var err=false;
	if(minVal!='' && Number(minVal)>Number(el.value)){
		err='must be '+minVal+' minimum!';
	}
	if(maxVal!='' && !errMsg && Number(maxVal)<Number(el.value)){
		err='must be '+maxVal+' maximum!';
	}
	return err;
}

function checkStringLengthRange(el,minVal,maxVal,desc){
	var err=false;
	if(minVal!=''&&Number(minVal)>Number(el.value.length)){
		err='must be '+minVal+' length minimum!';
	}
	if(maxVal!="" && !err && Number(maxVal)<Number(el.value.length)){
		err='must be '+maxVal+' length maximum!';
	}
	return err;
}

function checkList(el,f,d){

	var f=f.split(';'),err='';
	var nodeStart=el.childNodes[0].firstChild.nodeName=='LEGEND'?1:0;

	if(el.childNodes[nodeStart].firstChild.type=='checkbox' && el.getAttribute('format')!=null){
		var bRes=true;

		for(var i=nodeStart;i<el.childNodes.length;i++){
			if(f.indexOf(el.childNodes[i].firstChild.value)!=-1 && el.childNodes[i].firstChild.checked!=true){
				err='Mandratory field "'+el.childNodes[i].lastChild.firstChild.nodeValue+'" in fieldset "'+d+'" not selected!';
				bRes=false;
			}
		}

	}else{
		var bRes=false;
		for(var i=nodeStart;i<el.childNodes.length;i++){
			if(el.childNodes[i].firstChild.checked==true){
				bRes=true;
				break;
			}
		}
		err='Select one option from the '+d+' list';
	}
	return new VResult(bRes,err,el);
}

function checkSelect(el, format, desc)
{
	var bRes=true,err='';
	if(format!=''){
		if(format.indexOf('!')>-1){
			restrVal=format.substr(format.indexOf('!')+1);
			if((el.selectedIndex==-1)||(el.options[el.selectedIndex].value==restrVal)){
				return new VResult(false,'Choose other option for '+desc+'!',el.parentNode);
			}
		}
	}
	return new VResult(true,'',el.parentNode);
}

function checkInputCheckbox(el, format, desc)
{
	var bRes=true,err='';
	if(format!=""){
		if(format=="true"){
			if(!el.checked){
				err='You must check '+desc+'!';
				bRes=false;
			}
		}else if(format=="false"){
			 if(el.checked){
				err='You must uncheck '+desc+'!';
				bRes=false;
			}
		}
	}
	return new VResult(bRes,err,el);
}

function getDesc(el){
	return el.getAttribute('desc')||el.getAttribute('title')||(el.getAttribute('name')||'').replace('PST_CTRL_','').replace('GET_CTRL_','');
}

function checkInputRadioByName(form,name,desc){
	var i=0;
	var noempty=false;
	for(i=0;i<form.elements.length;i++){
		if(form.elements[i].getAttribute('name')==name && form.elements[i].getAttribute('type')=='radio'){
			noempty=noempty||form.elements[i].checked;
		}
	}
	return new VResult(noempty,'Choose any option for '+desc+'!',el);
}

function bulkUsersTabKeyDown(){
	if(event.keyCode==9){
		with(document.selection.createRange()){
			text='\t';
			select();
		}
		event.returnValue=false;
	}
}

function checkCalendar(form,calName){
	var year=0,mon=0,day=0;
	for(var i=0;i<form.elements.length;i++){
		var el=form.elements[i],err=false;
		var desc=getDesc(el);
		var type;
		if(el.selectedIndex){
			var value=el.options[el.selectedIndex].value;
		}
		if(el.getAttribute('part_of')==calName && el.nodeName=='SELECT'){
			switch(el.getAttribute('name').replace(calName,'')){
				case'_mon':type='month';mon=value;break;
				case'_year':type='year';year=value;break;
				case'_day':type='day';day=value;break;
			}
			if(!el.selectedIndex){
				err='Choose any option for '+type+' in '+desc+'!';
				return new VResult(false,err,el);
			}
		}
	}

	if(form.elements[calName+'_format']){
		if(form.elements[calName+'_format'].value){
			var timestamp=year+mon+day;
			var format=form.elements[calName+'_format'].value;
			var max=extractMaxRange(format);
			var min=extractMinRange(format);

			if((timestamp<max)&&(timestamp>min)){
			}else{
			return new VResult(false,err,el);
				err="Selected date ("+timestamp+") in "+desc+" must be between "+min+" and "+max+" values!";
				return new VResult(false,err,el.parentNode);
			}
		}
	}
	return new VResult(true,'',el.parentNode);
}

function calendarSetValue(frm,prefix,el,format,delimiter){
	doc=document;
	y=doc.forms[frm.name].elements[prefix+'_year'];
	m=doc.forms[frm.name].elements[prefix+'_mon'];
	d=doc.forms[frm.name].elements[prefix+'_day'];
	ret=doc.forms[frm.name].elements[el];

	if(m.value<10){mvalue='0'+m.value;}else{mvalue=m.value;}
	if(format=='YYYYMMDD'){
		ret.value=y.value+delimiter+(mvalue)+delimiter+d.value;
	}else if(format=='YYYYDDMM'){
		ret.value=y.value+delimiter+(d.value)+delimiter+mvalue;
	}else if(format=="DDMMYYYY"){
		ret.value=d.value+delimiter+(mvalue)+delimiter+y.value;
	}else if(format=="MMDDYYYY"){
		ret.value=(mvalue)+delimiter+d.value+delimiter+y.value;
	}else if(format=='DDYYYYMM'){  
		ret.value=d.value+delimiter+y.value+delimiter+mvalue;
	}else if(format=='MMYYYYDD'){
		ret.value=mvalue+delimiter+y.value+delimiter+d.value;
	}
}

function calendarChangeYM(frm,prefix,el,format,delimiter){
	daysInMonth=new Array(0,31,29,31,30,31,30,31,31,30,31,30,31);
	doc=document;
	y=doc.forms[frm.name].elements[prefix+'_year'];
	m=doc.forms[frm.name].elements[prefix+'_mon'];
	d=doc.forms[frm.name].elements[prefix+'_day'];
	days=daysInMonth[m.value];	
	if(m.value=='all'){
		days=31;		
	}else{
		if(y.value!='all' &&((y.value-2004)%4)!=0 && m.value==2 ){
			days=28;
		}
	}
	dvalue=d.value;
	d.length=0;
	d.options[0]=new Option('','all');
	for(i=1;i<days+1;i++){
		if(i<10){val='0'+(i);}else{val=(i);}
		d.options[i]=new Option(val,val);
	}
	if(dvalue>(d.length-1))
		d.selectedIndex=d.length-1;
	else	
		d.selectedIndex=dvalue;	
	ret=doc.forms[frm.name].elements[el];
	if((doc.activeElement==m && m.value=='all')||
		(doc.activeElement==y && y.value=='all')){
		y.selectedIndex=0;
		m.selectedIndex=0;
		d.selectedIndex=0;
		ret.value=0;
	}else{
		if(m.value=='all' || y.value=='all' || d.value=='all'){
			if(doc.activeElement!=y)y.selectedIndex=1;
			if(doc.activeElement!=m)m.selectedIndex=1;
			if(doc.activeElement!=d)d.selectedIndex=1;
		}
		calendarSetValue(frm,prefix,el,format,delimiter);
	}
}

function calendarChangeDay(frm,prefix,el,format,delimiter){
	doc=document;
	y=doc.forms[frm.name].elements[prefix+'_year'];
	m=doc.forms[frm.name].elements[prefix+'_mon'];
	d=doc.forms[frm.name].elements[prefix+'_day'];
	ret=doc.forms[frm.name].elements[el];
	if(d.value=='all' && ret.value!=0){
		y.selectedIndex=0;
		m.selectedIndex=0;
		ret.value=0;
	}else{
		if(d.value=='all' || m.value=='all' || y.value=='all'){
			if(doc.activeElement!=y)y.selectedIndex=1;
			if(doc.activeElement!=m)m.selectedIndex=1;
			if(doc.activeElement!=d)d.selectedIndex=1;
		}
		calendarSetValue(frm,prefix,el,format,delimiter);
	}
}

function onCheckUploads(theel)
{
	if(theel.value !=""){
	var str=theel.value;
	re=/(.jpg$)/i;
	if(str.search(re)==-1){
		theel.value="";
		showAlert("Only *.jpg files are allowed! ");
	}
	}
}

function checkRegExp(el,desc){
	return(new VResult((new RegExp(el.getAttribute('match'))).test(el.value),desc,el));
}

function isHint(){
	return window.showHints=='true';
}

function checkFields(form,postfunction){

	var radioNames=calendarNames=errs=[];
	if(typeof(updateRTEs)=='function'){
		updateRTEs();
	}

	var vType=window.validationType=='multiple'?2:1; // single | multiple
	var err=null;

	for(var i=0;i<form.elements.length;i++){

		var el=form.elements[i],type=el.type,name=el.name,format=el.getAttribute('format')||'',desc=getDesc(el);

		if(err!==null){
			if(vType==1){
				if(!reflectStatus(err)){
					return false;
				}
			}
			errs.push(err);
		}

		var err=null;

		if(el.getAttribute('validated')=='true' &&(!el.disabled || !el.readonly)){

			if(el.getAttribute('match')){
				errs.push(err=checkRegExp(el,desc));
				continue;
			}

			switch(el.nodeName.toLowerCase()){
			case'fieldset':err=checkList(el,format,desc);break;
			case'input':{
				switch(type){
					case'password':
					case'text': 
						err=checkInputText(el,format,desc);
					break;
					case'checkbox':err=checkInputCheckbox(el,format,desc);break;
					case'radio':
						if(radioNames.indexOf(name)==-1){
							radioNames.push(name);
							err=checkInputRadioByName(form,name,desc);
						}
					break;
					case'hidden':{
						if(el.parentNode.className.indexOf('AWLTimeControl')>-1){
							err=(new VResult(/^\d{4}$/.test(el.value),'Please select '+desc+'!',el.parentNode));
						}
					}
					default:{}
				}
				break;
			}
			case'textarea':err=checkInputText(el,format,desc);break;
			case'select':
				if(el.getAttribute('part_of')){
					if(calendarNames.indexOf(el.getAttribute('part_of'))==-1){
						calendarNames.push(el.getAttribute('part_of'));
						err=checkCalendar(form,el.getAttribute('part_of'));
					}
				}else{
					err=checkSelect(el, format, desc);
				}
				break;
			}

		}else if(type=='radio' &&(!el.disabled || !el.readonly)){
//CAUSED ERROR WITH checklist
//			if(radioNames.indexOf(name)==-1){
//				radioNames.push(name);
//				err=checkInputRadioByName(form,name,desc);
//			}
		}
	}

	if(vType==2){
		if(!reflectMassStatus(errs)){
			return false;
		}
	}
	return eval(postfunction+"(form)");
}

function __hilite(err){

	var cls=err.el.className.replace('ValidationFailed','').replace('ValidationPassed','');
	var tdcls='';

	if(err.result){
		cls+=' ValidationPassed';
//		tdcls=' ValidationDescPassed';
	}else{
		err.el.parentNode.className = err.el.parentNode.className.replace('ValidationDescFailed','').replace('ValidationDescPassed','')+' ValidationDescFailed';
		cls+=' ValidationFailed';
//		tdcls=' ValidationDescFailed';
	}
	err.el.className=cls;

//	err.el.parentNode.style.color='#f00';

//	if(err.el.parentNode.nodeName.toLowerCase()=='td' && (desc=err.el.parentNode.previousSibling) && desc.nodeName.toLowerCase()=='td'){
//		desc.className=desc.className.replace('ValidationDescFailed','').replace('ValidationDescPassed','')+tdcls;
//	}
}

function reflectStatus(err){
	__hilite(err);
	onError(err.el);
	showAlert(err.text);
	err.el.focus();
	return err.result;
}

function reflectMassStatus(errs){
	var i=0,j=0,firstErr=null;
	for(var i=0;i<errs.length;i++){

		var err=errs[i];
		__hilite(err);
/*
		if(isHint()){
			var notes=err.el.parentNode.getElementsByTagName('span');
			for(var k=0;k<notes.length;k++){
				if(notes[k].getAttribute('__Note')==1){
					notes[k].parentNode.removeChild(notes[k]);
				}
			}
		}

		if(!err.result){
			if(j==0){
				firstErr=err.el;
			}
			j++;

			if(isHint()){
				var note=err.el.parentNode.appendChild(document.createElement('span'));
				note.appendChild(document.createTextNode(err.text));
				note.setAttribute('__Note',1);
				note.className='AWL_ControlErrorNote';
			}
		}
*/

		if(!err.result){
			if(j==0){
				firstErr=err.el;
			}
			j++;
		}

	}

	if(j>0){
		onError(firstErr);
		firstErr.focus();
		showAlert('You must complete all mandatory fields which are marked with a *, please complete the missing details and click SEND');
		return false;
	}
	return true;
}

Array.prototype.indexOf=function(s){
	var l=this.length;
	var i=0;
		for(i=0;i<l;i++)if(this[i]==s)return i;
	return -1;
}