function SubmitForm(frm, sURL)
{

	if (sURL != '' )
		frm.action = sURL;
	frm.method = 'post';

	frm.submit();
}


function ConfirmDelete(psMessage, pbDefaultRet)
{
	var lbRet;
	if (psMessage == undefined || psMessage == null || psMessage == '')
		psMessage = 'Are you sure you want to delete this record ?';

	
	if (pbDefaultRet == undefined || pbDefaultRet == null || pbDefaultRet == '')
	{
		lbRet = confirm(psMessage);		
	}
	else
	{
		alert(psMessage);
		lbRet = pbDefaultRet;
	}

	return lbRet;
}


function hderr(sName)
{
	sName+= '_err';
	var d = document;
	if ( d.getElementById )
	{
		if ( d.getElementById(sName) )
		{
			d.getElementById(sName).style.visibility = 'hidden';
			d.getElementById(sName).setAttribute("title","")
		}
	}
}

function swerr(sName, sErrMsg)
{
	sName+= '_err';
	var oFld = document.getElementById(sName);
	oFld.style.visibility = 'visible';

	var sTitle = oFld.getAttribute("title")
	if ( sTitle != '' && ( sTitle.indexOf(sErrMsg) == -1 ) ) 
		sErrMsg +=  '\n' + oFld.getAttribute("title") ;

	if (sErrMsg == null)
		alert(sName + ' is null ')
		
	oFld.setAttribute("title", sErrMsg);
}


function HideAllErrors( frm )
{
	for ( var i=0; i < frm.elements.length; i++ )
		hderr(frm.elements[i].name);
}

function RuleValidation(f)
{	
	var bRet = true;
	var r;
	var re;
	
	HideAllErrors( f );

	var oEls = f.elements;		//elements

	for (var i=0; i < oEls.length ; i++)
	{
		//get field reference
		var oFld = oEls[i];

		if (oFld.type == 'text')
			oFld.value = trim(oFld.value);


		if ( oFld.getAttribute("man") != null )
		{
			switch ( oFld.type )
			{
				case 'checkbox'	:
				case 'radio'	:
									if (isCheckBoxGroupChecked(oFld.name) == false)
									{
										swerr( oFld.name, "This field is mandatory" );
										bRet = false;
									}
									break;

				case 'file'		:	//same as text

				case 'password'	:
				case 'text'		:
				case 'textarea' :
									if ( oFld.value.length < 1 )
									{
										swerr( oFld.name, "This field is mandatory" );
										bRet = false;
									}
									break;

				case 'select-one' :
									if (oFld.selectedIndex != -1 )
									{
										if ( oFld.options[oFld.selectedIndex].value == '' )
										{
											swerr( oFld.name, "This field is mandatory" );
											bRet = false;
										}
									}
									else
									{
										swerr( oFld.name, "This field is mandatory" );
										bRet = false;
									}
									break;

				case 'select-multiple'
								:
									if (oFld.selectedIndex == -1)
									{
										swerr(oFld.name, "This field is mandatory");
										bRet = false;
									}

									break;

				default			:
									alert( oFld.type + ' not implemented in frmval.js.  Validation fails');
									bRet = false;

			}
		}

		
		if ( oFld.getAttribute("email") != null )
		{
			
			if ( oFld.value != '') 
			{
					if (oFld.value.indexOf(',') != -1)
					{
						var emailsplit = oFld.value.split(',');
						
						for (var m = 0; m < emailsplit.length; m++) 
						{
							if (!isValidEmailAddress(emailsplit[m],1,0))
							{
								swerr(oFld.name, "Invalid email address");
								bRet = false;
							}
							
						}
					}
					else
					{
						if (isValidEmailAddress(oFld.value) == false)
						{
							swerr(oFld.name, "Invalid email address");
							bRet = false;
						}
					}
			}
		}
		
		if ( oFld.getAttribute("num") != null )
		{
			oFld.value = oFld.value.RemoveAllSpaces();
			if (oFld.value != '')
			{
				if ( isNumber(oFld.value ) == false )
				{
					swerr(oFld.name, "Invalid number");
					bRet = false;
				}
			}
		}


		if ( oFld.getAttribute("minlen") != null )
		{
			if ( oFld.value != '' )
				if ( oFld.value.length < oFld.getAttribute("minlen").value )
				{
					swerr(oFld.name, "Invalid lenth, minimum length must be " + oFld.getAttribute("minlen").value) + " characters";
					bRet = false;
				}
		}

		if ( oFld.getAttribute("maxlen") != null )
		{
			if ( oFld.value != '' )
				if ( oFld.value.length > oFld.getAttribute("maxlen").value )
				{
					swerr(oFld.name, "Invalid lenth, maximum length must be less than " + oFld.getAttribute("maxlen").value) + " characters";
					bRet = false;
				}
		}
		
		
		if ( oFld.getAttribute("minval") != null )
		{
			if ( oFld.value != '' )
				if (isNaN(oFld.value))
				{
					swerr(oFld.name, "Minimum value must be greater than or equal to " + oFld.getAttribute("minval").value);
					bRet = false;
				}
				else
				{
					if ( parseFloat( oFld.value ) < oFld.getAttribute("minval").value )
					{
						swerr(oFld.name, "Minimum value must be greater than or equal to " + oFld.getAttribute("minval").value);
						bret = false;
					}
				}
		}


		if ( oFld.getAttribute("maxval") != null )
		{
			if ( oFld.value != '' )
				if (isNaN(oFld.value))
				{
					swerr(oFld.name, "Maximum value must be less than or equal to " + oFld.getAttribute("maxval").value);
					bRet = false;
				}
				else
				{
					if ( parseFloat( oFld.value ) > oFld.getAttribute("maxval").value )
					{
						swerr(oFld.name, "Maximum value must be less than or equal to " + oFld.getAttribute("maxval").value);
						bret = false;
					}
				}
		}

		if ( oFld.getAttribute("creditcard") != null )
		{
			if ( oFld.value != '' )
				if (isCreditCard(oFld.value) == false)
				{
					swerr(oFld.name, "Invalid credit card number");
					bRet = false;
				}
		}


		if ( oFld.getAttribute("date") != null )
		{
			if ( oFld.value != '' )
			{
				re = new RegExp( "^([0]?[1-9]|[1-2][0-9]|3[0-1])\/([0]?[1-9]|1[0-2])\/([1-2][0-9][0-9][0-9])$", "ig" );
				r = oFld.value.match(re);

				if ( r==null )
				{
					swerr(oFld.name, "Invalid date, please enter the date in dd/mm/yyyy format");
					bRet = false;
				}
				else
					if ( !isValidDate(oFld.value) )
					{
						swerr(oFld.name, "Invalid date, please enter the date in dd/mm/yyyy format");
						bRet = false;
					}
			}
		}


		if ( oFld.getAttribute("url") != null )
		{
			if (oFld.value != '')
			{
				if (isValidURL(oFld.value) == false )
				{
					swerr(oFld.name, "Invalid URL, please enter a valid url eg,  http://www.domainname.co.za");
					bRet = false;
				}
			}
		}

		if ( oFld.getAttribute("file") != null )
		{
			alert("file validation not implemented in frmval.js");
		}

	}	//for i

	//set the focus to the first field containing an error
	var oFirstErrorField = null;
	for ( i=0 ; (i < oEls.length) && (oFirstErrorField == null) ; i++ )
	{
		if ( document.getElementById(oEls[i].name + '_err') )
			if ( document.getElementById(oEls[i].name + '_err').style.visibility == 'visible' )
			{
				oFirstErrorField = oEls[i];
				if (oFirstErrorField.type != 'hidden')
					oFirstErrorField.focus();
			}
	}

	return bRet;
}


function bValidNonExecutableFileName(psFilename)
{
	var lbRet = true;
	
	if ( psFilename.toUpperCase().indexOf('.EXE') != -1 )
		lbRet = false;

	if ( psFilename.toUpperCase().indexOf('.COM') != -1 )
		lbRet = false;

	if ( psFilename.toUpperCase().indexOf('.BAT') != -1 )
		lbRet = false;

	if ( psFilename.toUpperCase().indexOf('.VBS') != -1 )
		lbRet = false;

	if ( psFilename.toUpperCase().indexOf('.MSI') != -1 )
		lbRet = false;

	return lbRet;
}


function bValidImageFileName(psFilename)
{
	var lbRet = false;

	if (bValidNonExecutableFileName(psFilename) == true)
	{
	
		if ( psFilename.toUpperCase().indexOf('.GIF') != -1 )
			lbRet = true;

		if ( psFilename.toUpperCase().indexOf('.JPG') != -1 )
			lbRet = true;

		if ( psFilename.toUpperCase().indexOf('.JPEG') != -1 )
			lbRet = true;

	}
	return lbRet;
}



function bValidJpegFileName(psFilename)
{
	var lbRet = false;

	if ( psFilename.toUpperCase().indexOf('.JPG') != -1 )
		lbRet = true;

	if ( psFilename.toUpperCase().indexOf('.JPEG') != -1 )
		lbRet = true;

	return lbRet;
}




function isValidDate( sDate )
{
	// sDate = d/m/y format

	var days = [31,28,31,30,31,30,31,31,30,31,30,31];
	var d, m, y = new Number();
	var la_DMY = new Array();
	var bRet = true;

	if ( trim( sDate ) != '' )
	{
		var re = new RegExp( "^([0]?[1-9]|[1-2][0-9]|3[0-1])\/([0]?[1-9]|1[0-2])\/([1-2][0-9][0-9][0-9])$", "ig" );
		var r = sDate.match(re);

		if ( r==null )
			bRet = false;
		else
		{
			//matched to dd/mm/yyyy format
			la_DMY = sDate.split("/");

			d = la_DMY[0];
			m = la_DMY[1];
			y = la_DMY[2];

			if ((m < 1) || (m > 12))
				bRet = false;

			if ((y % 4) == 0)
				days[1] = 29;
			else
				days[1] = 28;

			if ((y % 100) == 0) 
			{
				if ((y % 400) == 0)
					days[1] = 29;
				else
					days[1] = 28;
			}

			if (d > days[m - 1])
				bRet = false;
				
			if (y<1900 || y>2100)
				bRet = false;
		}
	}
	else
		bRet = false;

	return bRet;
}


function trim(str) {
	return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

function bRadioChecked(oControl)
{
	var bRet = false;

	if(oControl.length)
	{
		for(i=0; i < oControl.length ; i++ )
		{
			if(oControl[i].checked == true)
			{
				bRet = true;
				break;
			}
		}
	}
	else
	{
		if(oControl.checked == true)
		{
			bRet = true;
		}
	}
	return bRet;
}


function iPosRadioCheckboxChecked( psControlName )
{
	var liPos;
	var liRetVal = -1;
	var lbFound = false;
	var loColControls = document.getElementsByName(psControlName);	//get control collection

	if (loColControls.length > 0)
	{
		liPos = 0;
		while ( ( liPos < loColControls.length ) && ( lbFound == false ) )
		{
			if ( loColControls[liPos].checked == true )
			{
				liRetVal = liPos;
				lbFound = true;
			}
			liPos++;
		}
	}
	else
		liRetVal = -1;

	return liRetVal;
}


function isCreditCard(st) {
	// Encoding only works on cards with less than 19 digits
	// does a Luhn Mod-10

	if (st.length > 19)
		return (false);

	sum = 0; mul = 1; l = st.length;
	for (i = 0; i < l; i++) {
		digit = st.substring(l-i-1,l-i);
		tproduct = parseInt(digit ,10)*mul;
		if (tproduct >= 10)
			sum += (tproduct % 10) + 1;
		else
			sum += tproduct;

		if (mul == 1)
			mul++;
		else
			mul--;
	}

	if ((sum % 10) == 0)
		return (true);
	else
		return (false);
}

function isNumber( sNumber )
{
	var re = new RegExp( "^([0-9]{1,})(([.]?[0-9]{1,})?)$", "ig" );
	var r = sNumber.match(re);

	if ( r==null )
		return false;
	else
		return true;
}


function lb_AddItem ( lo_SelectName, sID, sText )
{
	var loOption = new Option(sText, sID);
	lo_SelectName.options[lo_SelectName.length] = loOption;
}

function lb_RemoveItem( lo_SelectName, sID )
{
	for (var i=0; i< lo_SelectName.length;) {
		if (lo_SelectName.options[i].value == sID)
		{
			lo_SelectName.remove(i);
		}
		else {
			i++;
		};
	};
};


function isCheckBoxGroupChecked(sName)
{
	var bChecked = false;
	var oControls = document.getElementsByName(sName);

	if ( oControls.length )
	{
		for ( i=0 ; i < oControls.length; i++ )
			if ( oControls[i].checked == true )
				bChecked = true;
	}
	else
	{
		if (oControls.checked == true)
			bChecked = true;
	}
	return bChecked;
}


function ConfirmFormNotDirty(loFrm)
{
	var bFrmDirty = false;
	var oEls = loFrm.elements;
	var i=0;
	
	for (i=0; i < oEls.length; i++)
	{
		switch (oEls[i].type)
		{
			case 'select-one'	:	
									//if(oEls[i].options[oEls[i].selectedIndex].defaultSelected != oEls[i].options[oEls[i].selectedIndex].selected )
									//	bFrmDirty = true;
									//break;

			case 'radio'		:
			case 'checkbox'		:
									if (oEls[i].defaultChecked != oEls[i].checked )
										bFrmDirty = true;
									break;

			case 'textarea'		:
			case 'text'			:
									if (oEls[i].value != oEls[i].defaultValue)
										bFrmDirty = true;
									break;
		}
	}

	if (bFrmDirty == true)
		return confirm('Unsaved changes were detected, are you sure you want to continue ?');
	else
		return true;
}

function isValidURL(sURL)
{
	var re = new RegExp( "^(http://)[a-z][a-z_0-9\\.-]*\.[a-z_0-9\\.-]+\\.[a-z]{2,3}$", "ig" );
	r = sURL.match(re);

	if ( r==null )
		return false;
	else
		return true;
}


function setListBoxItem(oListBox, sValue)
{
	if (oListBox)
	{
		for (var i=0; i < oListBox.length; i++)
		{
			if (oListBox.options[i].value == sValue)
				oListBox.selectedIndex = i;
		}
	}
	else
		alert("The listbox does not exist");
}


function setCalendarReturnField()
{
	var oReturnFld = eval('document.' + window.__CalendarReturnDateField.form.name + '.' + window.__CalendarReturnDateField.name);
	var sReturnDate = eval('window.__CalendarReturnDateField.value;');
	
	oReturnFld.value = sReturnDate;
}


function datediff(sDateDiffType, strDate1, strDate2)
{	//strDate1, strDate2 must be in dd/mm/yyyy format
	
	var iResult = 0;

	switch ( sDateDiffType.toUpperCase())	
	{
		case "YYYY"	:
						datDate1= Date.parse(strDate1);
						datDate2= Date.parse(strDate2);
						iResult = parseInt(((datDate2-datDate1)/(24*60*60*1000) / 365.25 ));

						break;


		case "M"	:
						datDate1= Date.parse(strDate1);
						datDate2= Date.parse(strDate2);
						iResult = parseInt(((datDate2-datDate1)/(24*60*60*1000) / 365.25 ) * 12);

						break;

		case "D"	:
						datDate1= Date.parse(strDate1);
						datDate2= Date.parse(strDate2);
						iResult = parseInt(((datDate2-datDate1)/(24*60*60*1000) ));

						break;

		default		:
						alert(sDateDiffType + " not implemented in frmval.js, function datediff");
						break;
	}
	return iResult;
}


String.prototype.RemoveAllSpaces = function()
{   //check for all spaces
	var lsTmp=this;
	var objRegExp=new RegExp("[ ]*","ig");
	lsTmp = lsTmp.replace(objRegExp, "");

	return lsTmp;
}



function isValidEmailAddress(psEmailAddress)
{	
	
	//re = new RegExp( "^[a-z][a-z_0-9\\.-]*@[a-z_0-9\\.-]+\\.[a-z]{2,3}$", "ig" );
	//Change by G.S to allow emails with 4 chars in 2nd extension and to allow emails starting with a number(02/11/2004)
	re = new RegExp( "^[a-z0-9][a-z_0-9\\.-]*@[a-z_0-9\\.-]+\\.[a-z]{2,4}$", "ig" );
	r = psEmailAddress.match(re);

	if ( r==null )
		return false;
	else
		return true;
}
