var fvMessage;
var fvStop;
var fvDateFormat;
var fvConditionGroups = new Array();
var fvPassFailID = new Array();
var fvPassFailClasses = new Array();
function fvIsValid(fvFunction)
{
	if (fvFunction==null) fvFunction='fvValidate';
	fvResetPassFail();
	eval(fvFunction+'()');
	fvSetClasses();
	if (fvMessage!='') {
		alert(fvMessage);
		return false;
	}
	return true;
}
function fvObjType(obj)
{
	if (obj==null) {
		return '';
	}
	else if (typeof obj!='object') {
		return 'var';
	}	
	else if(obj.length>0) {
		if (obj[0].length>0) {
			return obj[0].type+'-array';
		}
		else if (obj[0].type=='radio' || obj[0].type=='checkbox') {
			return obj[0].type;
		}
		else if (obj.type=='select-one' || obj.type=='select-multiple') {
			return obj.type;
		}
		else if (typeof obj[0]!='object') {
			return 'var-array';
		}
		else {
			return obj[0].type+'-array';
		}
	}
	else {
		return obj.type;
	}
}

function fvObjValue(obj)
{
	var objType, i, objValue;
	objType=fvObjType(obj)
	if (objType=='var') {
		return obj;
	}
	else if (objType=='select-one') {
		if (obj.selectedIndex<0) {
			return ''
		}
		else {
			return obj[obj.selectedIndex].value;
		}
	}
	else if (objType=='select-multiple') {
		objValue='';
		for (i=0; i<obj.length; i++) {
			if (obj[i].selected) {
				if (objValue!='') objValue+=',';
				objValue+=obj[i].value;
			}
		}
		return objValue;
	}
	else if (objType=='checkbox' || objType=='radio') {
		objValue='';
		for (i=0; i<obj.length; i++) {
			if (obj[i].checked) {
				if (objValue!='') objValue+=',';
				objValue+=obj[i].value;
				if (objType=='radio') break;
			}
		}
		return objValue;
	}
	else if (objType=='text' || objType=='password' || objType=='textarea' || objType=='hidden') {
		return obj.value;
	}
	else {
		return obj;
	}
}

function fvObjText(obj)
{
	var objType, i, objText;
	objType=fvObjType(obj)
	if (objType=='select-one') {
		if (obj.selectedIndex<0) {
			return 'undefined'
		}
		else {
			return obj[obj.selectedIndex].text;
		}
	}
	else if (objType=='select-multiple') {
		objText='';
		for (i=0; i<obj.length; i++) {
			if (obj[i].selected) {
				if (objText!='') objText+=',';
				objText+=obj[i].text;
			}
		}
		return objText;
	}
	else {
		return fvObjValue(obj)
	}
}

function fvReverseDate(d)
{
	var ddd, ddm, ddy;
	var df=fvDateFormat;
	var dl=df.substring(2,3);
	var dy=df.indexOf('99');
	var dm=df.indexOf('12');
	var dd=df.indexOf('31') ;
	var pos1=d.indexOf(dl);
	var pos2=d.indexOf(dl,pos1+1);
	var posend=d.indexOf(' ',pos2+1);
	if (posend<0) posend=d.length;
	if (dd==0) ddd=d.substring(0,pos1);
	if (dm==0) ddm=d.substring(0,pos1);
	if (dy==0) ddy=d.substring(0,pos1);
	if (dd==3) ddd=d.substring(pos1+1,pos2);
	if (dm==3) ddm=d.substring(pos1+1,pos2);
	if (dy==3) ddy=d.substring(pos1+1,pos2);
	if (dd==6) ddd=d.substring(pos2+1,posend);
	if (dm==6) ddm=d.substring(pos2+1,posend);
	if (dy==6) ddy=d.substring(pos2+1,posend);
	var dr=parseInt(1*ddy)
	if (dr<100) dr+=2000;
	dr=parseInt(dr*10000+ddm*100+ddd*1);
	return dr
}

function fvSetPassFail(id,notValid)
{
	var idList=id.split(',');
	for (var i=0; i<idList.length; i++) {
		idList[i]=idList[i].replace(/ /g,'')
		if (fvPassFailID[idList[i]]==null) fvPassFailID[idList[i]]=false;
		if (notValid) fvPassFailID[idList[i]]=true;
	}
}

function fvResetPassFail()
{
	var id;
	for (id in fvPassFailID) {
		fvPassFailID[id]=false;
	}
}

function fvSetClasses()
{
	var id, pf, obj;
	for (id in fvPassFailID) {
		obj = document.getElementById(id);
		if(obj!=null) {
			pf=fvPassFailID[id] ? 0 : 1;
			obj.className=fvPassFailClasses[id][pf];
		}
	}
}
function fvGetConditionGroups(rules)
{
	/*v1.0.5*/
	if (typeof fvGrid=='undefined') return;
	var i, j, k, objValue, actionExists, validRow;
	var hasActions=false;
	fvConditionGroups[rules] = new Array();
	if (fvGrid[rules]==null) {
		return;
	}
	for (h=0; h<fvGridList[rules].length; h++) {
		hasActions=false;
		fvConditionGroups[rules][fvGridList[rules][h]] = new Array();
		for (i=0; i<fvGrid[rules][fvGridList[rules][h]].length; i++) {
			validRow=true;
			if (i>0 && hasActions==false) break;
			for (j=0; j<fvGridColumnNames[rules][fvGridList[rules][h]].length; j++) {
				if (fvGridColumnObjects[rules][fvGridList[rules][h]][j]!=null || (fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]!='undefined' && fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]!=null)) {
					if (fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]!=null) {
						objValue=eval(fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]])
					}
					else {
						objValue=fvObjValue(fvGridColumnObjects[rules][fvGridList[rules][h]][j]);
					}
					if (fvGrid[rules][fvGridList[rules][h]][i][j]!='*') {
						if (objValue!=fvGrid[rules][fvGridList[rules][h]][i][j]) {
							validRow=false;
							if (i>0) break;
						}
					}
				}
				else if (i==0) {
					hasActions=true;
				}
			}
			if (validRow && hasActions) {
				for (j=0; j<fvGridColumnNames[rules][fvGridList[rules][h]].length; j++) {
					if (fvGridColumnObjects[rules][fvGridList[rules][h]][j]==null && (fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]==null || fvGridCondition[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]=='undefined')) {
						if (fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]==null || fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]]=='undefined') fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]] = new Array();
						actionExists=false;
						for (k=0; k<fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]].length; k++) {
							if (fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]][k]==fvGrid[rules][fvGridList[rules][h]][j]) {
								actionExists=true;
								break;
							}
						}
						if (!actionExists) fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]][fvConditionGroups[rules][fvGridList[rules][h]][fvGridColumnNames[rules][fvGridList[rules][h]][j]].length]=fvGrid[rules][fvGridList[rules][h]][i][j];
					}
				}

			}
		}
	}
}

function fvCheckConditionGroup(group,rules,grid,column)
{
	var r, g, c, i;
	if (rules==null) {
		for (r in fvConditionGroups) {
			if (fvCheckConditionGroup(group,r)) return true;
		}
	}
	else {
		if (grid==null) {
			for (g in fvConditionGroups[rules]) {
				if (fvCheckConditionGroup(group,rules,g)) return true;
			}
		}
		else {
			if (column==null) {
				for (c in fvConditionGroups[rules][grid]) {
					if (fvCheckConditionGroup(group,rules,grid,c)) return true;
				}
			}
			else {
				for (i=0; i<fvConditionGroups[rules][grid][column].length; i++) {
					if (fvConditionGroups[rules][grid][column][i]==group) {
						return true;
					}
				}
			}
		}
	}
	return false;
}

function fvCheckConditionGroupUnique(group,rules,grid,column)
{
	if (typeof fvConditionGroups[rules][grid][column]=='undefined') return false;
	if (fvConditionGroups[rules][grid][column].length==1) {
		if (fvConditionGroups[rules][grid][column][0]==group) {
			return true;
		}
	}
	return false;
}

