function CmdProp(sType, sStep, sCmd, sP1, sP2, sP3, sMap) {
	this.type = sType;
	this.step = sStep;
	this.cmd = sCmd;
	this.p1 = sP1;
	this.p2 = sP2;
	this.p3 = sP3;
	this.map = sMap;
}
function objValidate(sValidation) {
	var aKey = sValidation.split(';');
	this.map = unescape(aKey[0]);
	this.regexp = unescape(aKey[1]);
	this.ctrl = unescape(aKey[2]);
	this.errmessage = unescape(aKey[3]);
}
function runCmdMap(sCmdType, nFormId, sCtrlName, nStart, sender) {

	var aCmd, sCmd, sParam1, sParam2, sParam3;
	
	if(eval('window.CmdMap' + nFormId + '_' + sCtrlName)) {
		eval('aCmd = CmdMap' + nFormId + '_' + sCtrlName + ';');
		if(aCmd[nStart]) {
			eval("doCmd("+nFormId+",'"+sCtrlName+"',aCmd[nStart], sender);");
		}
	}
}
function findForm( objItem ) 
{
	if (objItem.tagName == "FORM")
		return objItem;
	else if (objItem.tagName == "BODY")
		return null;
 
	return findForm(objItem.parentNode);
}
function dborGetForm(nFormId, sender) {
	var frm = null;
	if(sender!=null) {
		 frm = findForm(sender);
	} else {
		if(eval('window.DBOR_FormPointer' + nFormId)) {
			eval('var nRealFormId = window.DBOR_FormPointer' + nFormId);
			eval('frm = document.DBOR_FRM' + nRealFormId);
		} else {
			eval('frm = document.DBOR_FRM' + nFormId);
		}
	}
	return frm;
}
function validateForm(nFormId, bShowErrMsg) {

	var aVal = eval('DBOR_FRM'+nFormId+'_V');
	var sData = '', bValidated = true, tObj = null, re = null, sValidationErrMsg ='';

	for(var x=0; x<aVal.length; x++) {
		if(aVal[x].regexp!='') {
			tObj = document.getElementById(aVal[x].ctrl);
			sData = tObj.value; re = eval(aVal[x].regexp);
			sData = sData.replace('\n',String.fromCharCode(0));
			if(!re.test(sData))  {
				bValidated = false;
				sValidationErrMsg += '\n' + aVal[x].errmessage;
			}
			sData = sData.replace(String.fromCharCode(0),'\n');
		}
	}
	
	if(sValidationErrMsg!='')
		alert('Please ensure the following fields are completed correctly:\n' + sValidationErrMsg);
		
	if(bValidated) 
		return true;
	else
		return false;
}
//function doCmd(nFormId, sCtrlName, nFromStep, sCmd, sParam1, sParam2, sParam3, sender)
function doCmd(nFormId, sCtrlName, aCmd, sender)
{
	if(!aCmd)
		return;
	
	var nFromStep = aCmd.step;
	var sCmd = aCmd.cmd;
	var sParam1 = aCmd.p1;
	var sParam2 = aCmd.p2;
	var sParam3 = aCmd.p3;
	var sMap = aCmd.map;	
		 
	var frm = dborGetForm(nFormId, sender);
	var pn = dborGetFormObj(frm, nFormId, 'PN', 'input', 'hidden');
	var cmd = dborGetFormObj(frm, nFormId, 'CMD', 'input', 'hidden');
	var p1 = dborGetFormObj(frm, nFormId, 'P1', 'input', 'hidden');
	var cs = dborGetFormObj(frm, nFormId, 'CS', 'input', 'hidden'); // current command step
	var cm = dborGetFormObj(frm, nFormId, 'CM', 'input', 'hidden'); // current command map
	
	cm.value = sMap;
	cs.value = nFromStep;
	
	switch(sCmd.toLowerCase()) {
	
		case 'cmd_validate':
			var bValidated;
			bValidated = validateForm(nFormId, true);
		
			if(bValidated) {
				runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, sParam2));
			} else {			
				runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, sParam3));
			}
			break;
			
		case 'cmd_export':
			if(sParam1!='') {
				var aKeys = sParam1.split(';');
				//window.open('/dbor/forms/asp/form'+nFormId+'.asp?DBOR_FRM' + nFormId + '_CMD=export&selFields='+aKeys[1], 'Export', '');
			
				var cmdtemp;
				cmdtemp = cmd.value; cmd.value = 'gridexport'; frm.target = '_blank';
				frm.action = '/dbor/forms/asp/form' + nFormId + '.asp?DBOR_FRM' + nFormId + '_CMD=export&selFields='+aKeys[1];
				frm.submit();
				frm.target = '_self'; cmd.value = cmdtemp; frm.action = '';
			
			} else { alert('Export not configured'); }
			break;
	
		case 'cmd_print':
			window.print();
			break;
			
		case 'cmd_sendmail':
			cmd.value = 'sendmail';
			frm.submit();
			break;
	
		case 'cmd_orderby':
			var oc = dborGetFormObj(frm, nFormId, 'OC', 'input', 'hidden'); oc.value = sParam1;
			var od = dborGetFormObj(frm, nFormId, 'OD', 'input', 'hidden'); od.value = sParam2;
			frm.submit();
			break;
		
		case 'cmd_execfunction':
			cmd.value = 'execfunction';
			p1.value = sParam1;
			frm.submit();
			break;
			
		case 'cmd_firstrecord':
			pn.value = 1;
			frm.submit();
			break;
			
		case 'cmd_lastrecord':
			eval('var nNumPages = nDBOR_FRM'+nFormId+'_NumPages;');
			pn.value = nNumPages;
			frm.submit();
			break;		
		
		case 'cmd_nextrecord':
			eval('var nCurPage = nDBOR_FRM'+nFormId+'_CurPage;');
			eval('var nNumPages = nDBOR_FRM'+nFormId+'_NumPages;');
			if(nCurPage>=nNumPages) {
				alert('No more records.');
			} else {
				var rec_inc = 1; 
				if(sParam1) rec_inc = parseInt(sParam1);
				pn.value = parseInt(pn.value) + rec_inc;
				frm.submit();
			}
			break;
			
		case 'cmd_prevrecord':
			eval('var nCurPage = nDBOR_FRM'+nFormId+'_CurPage;');
			if(nCurPage<=1) {
				alert('No previous records.');
			} else {
				var rec_dec = 1; 
				if(sParam1) rec_dec = parseInt(sParam1);
				pn.value = parseInt(pn.value) - rec_dec;
				frm.submit();
			}
			break;

		case 'cmd_selrecord':
			eval('var nCurPage = nDBOR_FRM'+nFormId+'_CurPage;');
			eval('var nNumPages = nDBOR_FRM'+nFormId+'_NumPages;');
			if(nNumPages<=1) {
				alert('No other records.');
			} else {
				var selPage = nCurPage;
				if(sParam1) {selPage = parseInt(sParam1);
				} else {
					if(sParam2) var sel = dborGetFormObj(frm, nFormId, sParam2, 'input', 'text');
						selPage = sel.value;
				}
				if (selPage>nNumPages) {
					alert('This page does not exist');
				} else {
					pn.value = selPage;
					frm.submit();
				}
			}
			break;

			
		case 'cmd_message':
			alert(sParam1);
			runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, parseInt(nFromStep)+1));
			break;
			
		case 'cmd_stop':
			break;
			
		case 'cmd_gotoform':
			dborOpenForm(nFormId, sParam1, sParam2, sParam3, 1);
			break;
			
		case 'cmd_gotostep':
			runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, sParam1));
			break;
			
		case 'cmd_question':
			if(window.confirm(sParam1)) {
				runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, sParam2));
			} else {
				runCmdMap('', nFormId, sCtrlName, GetCommandIndex(nFormId, sCtrlName, sParam3));
			}	
			break;
		
		case 'cmd_filter':
			pn.value = 1;
			var fm = dborGetFormObj(frm, nFormId, 'FM', 'input', 'hidden');
			cmd.value = 'filter';
			fm.value = sParam1;
			frm.submit();
			break;
			
		case 'cmd_insert':
		case 'cmd_update':
		case 'cmd_delete':
		
			if(window.tinyMCE)
				tinyMCE.triggerSave();

			if(validateForm(nFormId, true)) {
				cmd.value = sCmd.substring(4);
				if(sParam1!='') {
					rm = dborGetFormObj(frm, nFormId, 'RM', 'input', 'hidden');
					rm.value = 'internal';
					dborOpenForm(nFormId, sParam1, '', '', 1);
				} else {
					frm.submit();
				}
			}
			break;
	}
}
function dborGetFormObj(objForm, nFormId, sName, sElement, sType) {
	eval('var obj = objForm.DBOR_FRM' + nFormId + '_' + sName);
	if(!obj) {
		obj = document.createElement(sElement);
		obj.name = 'DBOR_FRM' + nFormId + '_' + sName; 
		obj.type = 'hidden';
		objForm.appendChild(obj); 
	}
	return obj;
}
function dborOpenForm(nFormId, nOpenFormId, ForeignField, MatchValue, LinkType) 
{
	var frm = dborGetForm(nFormId, null);
	if(eval('window.DBOR_FormPointer' + nFormId)) eval('var nFormId = window.DBOR_FormPointer' + nFormId);
			
	var fr = dborGetFormObj(frm, nFormId, 'FR', 'input', 'hidden');
	var mv = dborGetFormObj(frm, nOpenFormId, 'MV', 'input', 'hidden');
	var mf = dborGetFormObj(frm, nOpenFormId, 'MF', 'input', 'hidden');
	var lt, pn = null;

	// LinkType = 1 is to a form, 2 is to a subform
	if(LinkType==1) {
		fr.value = nOpenFormId;
		lt = dborGetFormObj(frm, nOpenFormId, 'LT', 'input', 'hidden'); lt.value = LinkType;
	} else {
		lt = dborGetFormObj(frm, nFormId, 'LT', 'input', 'hidden'); lt.value = LinkType;
		pn = dborGetFormObj(frm, nOpenFormId, 'PN', 'input', 'hidden'); pn.value = 1;
	}
	if(MatchValue != '') {mf.value = ForeignField; mv.value = MatchValue;};
	frm.submit();
}
function dborOpenFormEx(nFormId, nOpenFormId, MatchArray, LinkType) 
{
	var frm = dborGetForm(nFormId, null);
	if(eval('window.DBOR_FormPointer' + nFormId)) eval('var nFormId = window.DBOR_FormPointer' + nFormId);
			
	var fr = dborGetFormObj(frm, nFormId, 'FR', 'input', 'hidden');
	var ma = dborGetFormObj(frm, nOpenFormId, 'MA', 'input', 'hidden');
	var lt, pn = null;
	
	// LinkType = 1 is to a form, 2 is to a subform
	if(LinkType==1) {
		fr.value = nOpenFormId;
		lt = dborGetFormObj(frm, nOpenFormId, 'LT', 'input', 'hidden'); lt.value = LinkType;
	} else {
		lt = dborGetFormObj(frm, nFormId, 'LT', 'input', 'hidden'); lt.value = LinkType;
		pn = dborGetFormObj(frm, nOpenFormId, 'PN', 'input', 'hidden'); pn.value = 1;
	}
	if(MatchArray != '') {ma.value = MatchArray;}
	frm.submit();
}
function GetCommandIndex(nFormId, sCtrlName, sStep) {

	var aCmd;
	eval('aCmd = CmdMap' + nFormId + '_' + sCtrlName + ';');
	
	for(var x=0; x<aCmd.length; x++) {
		if(aCmd[x].step == parseInt(sStep))
			return x;
	}
	
	return -1;
}
