
function f_submit(formname,rid,role,argv)
{
	fl_call(formname,rid,'',role,argv,'');
}
function f_search(formname,rid,col,role,argv)
{
	fl_call(formname,rid,col,role,argv,'popup');
}
function fl_call(formname,rid,col,role,argv,target)
{
	//argv = Array(arg0,arg1,arg2,..)

	///alert(Array(formname,rid,col,role,argv,target).join('\n'));///

	var get=0; //or post fnm,rid,argv

	var url = "";
	url = "submit.php?"
	if( role) url += "&role=" + ic_escape(role);
	if( col ) url += "&col="  + ic_escape(col);

	if( get )
	{
		if( col ) url += "&fnm="  + ic_escape(formname); //fnm for search
		if( rid ) url += "&rid="  + ic_escape(rid);
		if( argv) url += "&argv=" + ic_escape(fl_joinargv(argv));
	}
	else
	{
		//fnm from postvar FNM, hardcoded in the form
		//argv+rid from postvar ARGV:
		if( argv || rid )
			fl_putvalue(formname,'ARGV',fl_joinargv(argv,rid));
	}

	///alert(url);///

	if( target )
	{
		var ops = "";
		ops += ",width=500,height=500";
		ops += ",scrollbars=yes";
		ops += ",resizable=yes";
		ops += ",dependent=yes";
			//close child when self closes; doesn't work

		var w = window.open('',target,ops);
		w.focus();
	}

	var f = document.forms[formname];
	f.target = target;
	f.action = url;
	f.submit();
}
function fl_joinargv(argv,rid)
{
	var a = Array();
	for( var i=0; i<argv.length; i++ )
		a[i] = ic_escape(argv[i]); //only to escape any '&'
	if( rid )
		a[i] = rid; //!!
	return a.join('&');
}
function f_return(formname,fieldname,value)
{
	window.opener.focus();
	window.opener.fl_putvalue(formname,fieldname,value);
	self.close();
}
function f_reset(formname,rid) //TEDOEN rid
{
	document.forms[formname].reset();
}
function fl_getvalue(formname,fieldname)
{
	return fl_getevalue(fl_getelement(formname,fieldname));
}

function fl_putvalue(formname,fieldname,value)
{
	///alert('putvalue('+formname+','+fieldname+','+value+')');///
	fl_putevalue(fl_getelement(formname,fieldname),value);
}

function fl_getelement(formname,fieldname)
{
	var element = document.forms[formname].elements[fieldname];
	return element;
}
function fl_typeofelement(element)
{
	/*
	alert(     "nam="+element.name
		+"\ntyp="+element.type
		+"\nopt="+element.options
		+"\nlen="+element.length
		+"\nval="+element.value
		);
	*/
	switch( element.type )
	{
	default: //<input type=radio>* ??
		if( element.length )
			return 'radio'; //then element.type==undefined!
		return null;

	case 'select-one': //<select>+<option>*
	case 'select-multiple': //<select multiple>+<option>*
		return element.type;

	case 'text': //<input type=text>
	case 'textarea': //<textarea>
	case 'password': //<input type=password>
	case 'hidden': //<input type=hidden>
		return 'text';
	}
}
function fl_getevalue(element)
{
	var value = null;
	var i;
	switch( fl_typeofelement(element) )
	{
	case 'select-one':
	case 'select-multiple':
		i = element.selectedIndex; //if select-multiple then 1st
		value = element.options[i].value;
		break;
	case 'radio':
		for(i=0; i<element.length; i++)
			if (element[i].checked)
				value = element[i].value;
		break;
	case 'text':
		value = element.value;
	}
	return value;
}
function fl_putevalue(element,value)
{
	switch( fl_typeofelement(element) )
	{
	default:
		//dont know what to do
		break;
	case 'text':
		element.value = value;
		break;
	}
}

function f_validate(element,dbtyp,dblen)
{
	if( fl_typeofelement(element)!='text' )
		return true; //or: check initial value against list

	//re = /^(.*)\s$/;
	var re = /^((\s*\S+)*)\s*$/; //dont know easier way
	var v = element.value.replace(re,"$1"); //remove trailing space
	if( v!=element.value )
		element.value = v; //!

	if( v=="" )
		return true;

	var ok = true;

	switch( dbtyp )
	{
	case "UT":
		v = element.value.replace(/\t/g,'        '); //for NS4
		v = fl_repairoverflow(v,dblen);
		if( v!=element.value )
			element.value = v; //!
		break;
	case "AU":
		element.value = element.value.toUpperCase(); //!
		break;
	case "NY":
		ok = fl_chkperiod(element.value);
		if( !ok )
			fl_message('invalid period value');
		break;
	case "DY":
	case "DD":
	case "D":
		ok = fl_chkdate(element);
		if( !ok )
			fl_message('invalid date value');
		break;
	case "T":
	case "TS":
		ok = fl_chktime(element.value);
		if( !ok )
			fl_message('invalid time value');
		break;
	case "N":
		ok = fl_chkinteger(element,dblen);
		if( !ok )
			fl_message('invalid integer value');
		break;
	default:
		var N = dbtyp.charAt(0);
		if( N=='N'||N=='S' )
		{
			var d = Number(dbtyp.charAt(1));
			if( d==NaN )
				d = 0;
			var n = dblen-d;
			var s = false;
			if( N=='S' )
			{
				n--;
				s = true;
			}
			ok = fl_chknumber(element,s,n,d);
			if( !ok )
				fl_message('invalid number value');
		}
		break;
	}

	if( ok )
		fl_message('');
	else
	{
		element.select();
		element.focus();//!?then loop problems sometimes
	}
	return ok;
}
function fl_chknumber(element,sgn,dig,dec)
{
	var val = element.value;
	newval = val.replace(new RegExp(',','g'),'.'); // , to .
	if( newval!=val )
		element.value = newval; //!
	val = newval;

	var pat = '';
	if( sgn ) pat += '-? *';
	if( dig>0 ) pat +=     '\\d{1,' + dig.toString() + '}?';
	if( dec>0 ) pat += '(\\.\\d{1,' + dec.toString() + '}?)?';
	pat = '^ *' + pat + ' *$';
	///alert('['+val+']'+'\n'+'['+pat+']');///

	return (val.search(new RegExp(pat))==0);
}
function fl_chkinteger(element,dig)
{
	return fl_chknumber(element,false,dig,0);
}
function fl_chkperiod(val)
{
	return true; //TEDOEN
}

function fl_chkdate(element)
{
// 
// mm-dd-yyyy, mm/dd/yyyy, mm.dd.yyyy, mm dd yyyy, 
// mmm dd yyyy, mmddyyyy, m-d-yyyy, m/d/yyyy, m.d.yyyy, 
// m d yyyy, mmm d yyyy, m-d-yy, m/d/yy, m.d.yy, m d yy, 
// mmm d yy (yy is 20yy) 
//
	// var strDatestyle = "US"; //United States date style
	var strDatestyle = "EU";  //European date style
	var strDate;
	var strDateArray;
	var strDay;
	var strMonth;
	var strYear;
	var intday;
	var intMonth;
	var intYear;
	var booFound = false;
	var datefield = element;
	var strSeparatorArray = new Array("-"," ","/",".");
	var intElementNr;
	var err = 0;
	var strMonthArray = new Array(12);
	strMonthArray[0] = "Jan";
	strMonthArray[1] = "Feb";
	strMonthArray[2] = "Mar";
	strMonthArray[3] = "Apr";
	strMonthArray[4] = "May";
	strMonthArray[5] = "Jun";
	strMonthArray[6] = "Jul";
	strMonthArray[7] = "Aug";
	strMonthArray[8] = "Sep";
	strMonthArray[9] = "Oct";
	strMonthArray[10] = "Nov";
	strMonthArray[11] = "Dec";
	strDate = datefield.value;
	if (strDate.length < 1) {
		return true;
	}
	for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) {
		if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) {

			strDateArray = strDate.split(strSeparatorArray[intElementNr]);
			if (strDateArray.length != 3) {
				err = 1;
				return false;
			} else {
				if( strDateArray[0].length == 4 &&
					strDateArray[2].length == 2 )
				{
					strYear  = strDateArray[0];
					strMonth = strDateArray[1];
					strDay   = strDateArray[2];
				} else {
					strDay   = strDateArray[0];
					strMonth = strDateArray[1];
					strYear  = strDateArray[2];
				}  
			}
			booFound = true;
	   }
	}

	if (booFound == false) {
		if (strDate.length>5) {
			strDay = strDate.substr(0, 2);
			strMonth = strDate.substr(2, 2);
			strYear = strDate.substr(4);
		}
		else return false;
	}
	if (strYear.length == 2) {
		strYear = '20' + strYear;
	}

	// US style
	if (strDatestyle == "US") {
		strTemp = strDay;
		strDay = strMonth;
		strMonth = strTemp;
	}

	intday = parseInt(strDay, 10);
	if (isNaN(intday)) {
		err = 2;
		return false;
	}
	intMonth = parseInt(strMonth, 10);
	if (isNaN(intMonth)) {
		for (i = 0;i<12;i++) {
			if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) {
				intMonth = i+1;
				strMonth = strMonthArray[i];
				i = 12;
			}
		}
		if (isNaN(intMonth)) {
			err = 3;
			return false;
		}
	}

	intYear = parseInt(strYear, 10);
	if (isNaN(intYear)) {
		err = 4;
		return false;
	}
	if (intMonth>12 || intMonth<1) {
		err = 5;
		return false;
	}
	if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) {
		err = 6;
		return false;
	}
	if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) {
		err = 7;
		return false;
	}
	if (intMonth == 2) {
		if (intday < 1) {
			err = 8;
			return false;
		}
		if (fl_leapyear(intYear) == true) {
			if (intday > 29) {
				err = 9;
				return false;
			}
		} else {
			if (intday > 28) {
				err = 10;
				return false;
			}
		}
	}

	if (strDatestyle == "US") {
		//datefield.value = strMonthArray[intMonth-1] + " " + intday+" " + strYear;
	} else {
		//datefield.value = intday + " " + strMonthArray[intMonth-1] + " " + strYear;
	}
	return true;
}
function fl_leapyear(intYear) {

	if (intYear % 100 == 0) {
		if (intYear % 400 == 0) { return true; }
	} else {
		if ((intYear % 4) == 0) { return true; }
	}
	return false;
}
function fl_chktime(timeStr) 
{
	if (timeStr == null || timeStr == "" )
		return true;

	// Checks if time is in HH:MM:SS AM/PM format.
	// The seconds and AM/PM are optional.

	var timePat = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
	var matchArray = timeStr.match(timePat);

	if (matchArray == null)
		return false;

	hour = matchArray[1];
	minute = matchArray[2];
	second = matchArray[4];

	if (second=="" || second==null)
		second = 0;

	if (hour < 0  || hour > 23)
		return false;

	if (minute<0 || minute > 59)
		return false;

	if (second < 0 || second > 59)
		return false;

	return true;
}

function fl_message( message )
{
	window.status = message;
}

function fl_repairoverflow(v,dblen)
// repair overflowing text lines
{
	v = v.replace(/\r/g,''); //remove all CR, for IE
	var page = v.split('\n');
	for( var i=0; i<page.length; i++ )
	{
		var line = page[i];
		if( line.length>dblen )
		{
			//overflow: split the line on a space, if any
			//(like the default view in IE and Moz)
			var p = line.substr(0,dblen).lastIndexOf(' ');
			p = (p<0 ? dblen : p+1);
			page.splice(i,1,line.substr(0,p),line.substr(p));
		}
	}
	return page.join('\n');
}

function fl_strvisible(s)
// make control chars visible
{
	var x = '';
	for( var i=0; i<s.length; i++ )
	{
		var n = s.charCodeAt(i);
		if( 32<=n && n<127 )
			x += s.charAt(i);
		else	x += '<\\' + n + '>\n';
	}
	return x;
}
