/************************************
COPYRIGHT 2005 EMARK SOLUTIONS PTY. LTD. 
ALL RIGHTS RESERVED.
*************************************/

// Set a flag if the browser is using IE6.
//var isIE6 = navigator.userAgent.toLowerCase().indexOf('msie 6') != -1;

// This is the iframe written to post back javascript errors to our error reporting mechanism.
//if (!isIE6)
//    document.write('<iframe id="idErrorReportingFrame" style="display:none;" src="' + SiteBasePath + 'notexist.html"></iframe>');

// This is the error handler function.
// Dependencies: 'SiteBasePath' variable set in the XSLT template.

window.onerror = function(msg, url, linenumber)
{
    // If we're in developer mode, just write out the line number etc to an alert box.
    if (getCookie('DebugLevel') == '1')
        alert('Javascript Error: ' + msg + '\nLine Number: '+linenumber + '\nURL: ' + url);
/*
    else if (!isIE6)
    {
        // Otherwise hide the error and submit an error report.
        var sURL = SiteBasePath + 'Script/SEC/Error-JS.asp?ErrorURL=' + escape(url) + '&ErrorLineNo=' + escape(linenumber) + '&ErrorMsg=' + escape(msg);
        document.getElementById('idErrorReportingFrame').src = sURL;
    }
*/
    this.returnValue = true;
    return true;
}

window.onload = body_onload_global;

function body_onload_global()
{
	if ( bPlaceFocus ) 
		placeFocus();
	
	try
	{
		body_onload();
	}
	catch(e)
	{
	}
}

function fixcode(unclean) 
{ 
	var clean = unclean.replace(/%27%/g,"'"); 
	return clean; 
} 

function javascriptString( str )
{
  var sTemp = str.replace( /\\/g, '\\\\');
  return sTemp.replace( /\'/g, '\\\'');
}

var bPlaceFocus = true;
function placeFocus() 
{
	var j, i, field;

	if (document.forms.length > 0)
		for ( j = 0; j < document.forms.length; j++ )
			for (i = 0, field = document.forms[j]; i < field.length; i++) 
				if ( !field.elements[i].disabled && field.elements[i].style.display != "none" && field.elements[i].style.visibility == "visible" )
					switch ( field.elements[i].type )
					{
						case 'text':		;
						case 'textarea':	;
						case 'password':	field.elements[i].focus();
											return;
					}
}

function createWindow(URL, name, options)
{
	var j = window.open(URL, name, options); 
	j.focus();
}

function closeWindow(bRefreshParent)
{
	if (bRefreshParent)
		window.opener.location.reload();
	
	window.close();
}

// Returns true if the given string contains no printable characters.
function isStringEmpty(str)
{
	if (!str) return true;
	return !str.match(/[A-Za-z0-9_]/,'i');
}

// Focus's the browser on the specified object.
function objFocus(obj)
{
	//if ()// && obj.style.display != "none", obj.style.visibility == "visible"
	//{
		if ( obj.length > 1)
			for( var i = 0; i < obj.length; i++ )
			{
				if ( obj[i].type != "hidden" && !obj[i].disabled && obj[i].style.display != "none" )
				{
					objFocus( obj[i] );
					break;
				}
			}
		else ( obj.type != "hidden" && !obj.disabled && obj.style.display != "none" )
		{
			try
			{
				if ( obj.focus )
					obj.focus();
				if ( obj.select )
				//if (obj.type == "text" || obj.type == "textarea" || obj.type == "password")
					obj.select();
			}
			catch (ex)
			{
				;
			}
		}
	//}
}

// Returns true if the given object contains only alpha-numeric chars.
function validateNumeric(obj, sMsg)
{
	return validateRegExp(obj, /^-*(\d+,)*\d+$/, sMsg);
}

// Returns true if the given object contains a guid.
function validateGUID(obj, sMsg)
{
	return validateRegExp(obj, /^\{*[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}*$/, sMsg);
}

// Returns true if the given object contains a valid floating point number.
function validateFloat(obj, sMsg)
{
	return validateRegExp(obj, /^-*(\d+,)*\d+(\.\d+)?$/, sMsg);
}

// Returns true if the given object contains valid text.
function validateText( obj, sMsg )
{
	return validateRegExp( obj, /[\w]/, sMsg );
}

// Returns true if the given object contains a valid floating point number.
function validateEmail(obj, sMsg)
{
	return validateRegExp(obj, /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/, sMsg);
}

function validateURL( obj, sMsg )
{
	return validateRegExp( obj, /^https?:\/\/([a-zA-Z0-9\-]*\.)*[a-zA-Z0-9\-]+(:[0-9]+)?(\/|(\/([a-zA-Z0-9\-_\.]+\/)*[a-zA-Z0-9\-_\.]*((\?[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?){1}(&[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?)*)?)?)?$/, sMsg )
}

function validateRegExp(obj, regExp, sMsg)
{
	if ( obj ) 
	{
		// Check that it isn't the null value;
		var sValue = new String( obj.value );
		
		if ( !(sValue.match( regExp, 'i' ) ) )
		{
			if ( sMsg && sMsg.length > 0 ) 
			{
				//objFocus( obj );				
				alert( sMsg );
			}
			return false;
		}
	}
	return true;
}

function ValidateControl( obj, bIsRequired, sDatType, sObjNarrative )
{
	var bErr = false,
		sValue = "",
		i, strarray, sPickNar, objType;
		
	objType = ( obj.type ? obj.type : ( obj.length > 1 ? obj[0].type : null ) )

	// Get the value from the object.
	switch ( objType )
	{

		case 'select-one':			sValue = ( obj.selectedIndex >= 0 ? obj.options[obj.selectedIndex].value : '' );
          							sPickNar = 'Please select ' + selectSingular( sObjNarrative ) + ' ';
          							break;
									
		case 'text':				;
		case 'password':			;
		case 'hidden':				;
		case 'textarea':			obj.value = trim(obj.value);    // trim away any leading/trailing spaces.
		                            sValue = obj.value;
									sPickNar = 'Please enter a valid ';
									break;

		case 'radio':				if (obj.length > 1)
									{
										for (i = 0; i < obj.length; i++)
											if (obj[i].checked)
											{
												sValue = obj[i].value;
												break;
											}
									}
									else if (obj.checked)
										sValue = obj.value;
									
									sPickNar = 'Please select ' + selectSingular( sObjNarrative ) + ' ';
									break;
									
		case 'checkbox':			if (obj.length > 1)
									{
										for (i = 0; i < obj.length; i++)
											if (obj[i].checked)
												sValue = sValue + (i > 0 ? ', ' : '' ) + obj[i].value;
									}
									else if (obj.checked)
										sValue = obj.value;
									
									sPickNar = 'Please select ' + selectSingular( sObjNarrative ) + ' ';
									break;

		case 'select-multiple':		for (i = 0; i < obj.options.length; i++)
										if ( obj.options[i].selected )
											sValue = sValue + (sValue.length > 0 ? ', ' : '' ) + obj.options[i].value;
									
									sPickNar = 'Please select ' + selectSingular( sObjNarrative ) + ' ';
									break;
									
		case 'file':				sValue = obj.value;
									sPickNar = 'Please use the browse button to select ' + selectSingular( sObjNarrative ) + ' ';
									break;
								
		default:					alert( "Unknown Type on Control: '" + obj.name + "' - '" + objtype + "'" );
									//alert( "Unknown Control Type: '" + obj.type + "' (document." + obj.form.name + "." + obj.name + ")" );
									return false;
	}
	
	// Abort as successful if object is empty but optional anyway.
	if ( !bIsRequired && isStringEmpty( sValue ) )
	{
		return true;
	}

	// Evaluate the data against 
	switch ( sDatType )
	{
		case 'text':		bErr = isStringEmpty( sValue );
							break;
							
		case 'date':		bErr = !getDate( sValue );
							break;

		case 'time':		bErr = !getTime( sValue, new Date )
							break;
															
		case 'currency':	bErr = !sValue.match( /^-?(\d+,)*\d+\.\d{2,2}$/, 'i' );
							break;
		
		// Accept currency and number values
		case 'money':		bErr = !sValue.match( /^-?((\d+,)*(\d+\.\d{1,2})|(\d+))$/, 'i' );
							break;

		case 'decimal':		bErr = !sValue.match( /^-?(\d+,)*\d+(\.\d+)?$/, 'i' );
							break;
							
		case 'number':		bErr = !sValue.match( /^-?(\d+,)*\d+$/, 'i');
							break;
							
		case 'percentage':	bErr = !sValue.match( /^-?((\d{1,3}\.\d{1,2})|(\d{1,3}))$/, 'i' );
							break;

		case 'email':		bErr = !sValue.match( /^([^\x00-\x1f\x80-\xff\x7f<>\(\)\\,;:""@]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/, 'i' );
							break;

		case 'url':			bErr = !sValue.match( /^https?:\/\/([a-zA-Z0-9\-]*\.)*[a-zA-Z0-9\-]+(:[0-9]+)?(\/|(\/([a-zA-Z0-9\-_\.]+\/)*[a-zA-Z0-9\-_\.]*((\?[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?){1}(&[a-zA-Z0-9\-%]+(=[a-zA-Z0-9\-%]*)?)*)?)?)?$/, 'i' );
							break;
							
		case 'phone':		sValue = sValue.replace(/[ -\(\)\.]*/ig, '');
		                    bErr = !sValue.match( /(^0011)|(^[+])|(^1300\d{6}$)|(^1800|1900|1902\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\d{4}$)|(^04\d{2,3}\d{6}$)/, 'i' );
							break;

	    case 'ipv4':        var iparray = sValue.split('.');

	                        if ( iparray.length != 4 )
	                        {
	                            bErr = true;
	                            break;
	                        }
	                        bErr = false;
	                        for ( var ipvi = 0; ipvi < iparray.length; ipvi++ )
	                        {
	                            if ( !( parseInt( iparray[ipvi], 10 ) >= 0 && parseInt( iparray[ipvi], 10 ) <= 255 ) )
	                            {
	                                bErr = true;
	                                break;
	                            }
	                        }

	                        break;

		default:			alert( "Unknown Data Type: '" + sDatType + "' (document." + obj.form.name + "." + obj.name + ")");
							return false;
	}
	
	// Handle the error situation.
	if ( bErr )
	{
		objFocus( obj );
		alert( sPickNar + sObjNarrative );
		return false;
	}
	return true;
}

function selectSingular( noun )
{
	switch ( noun.charAt(0) )
	{
		case 'a':	;
		case 'A':	;
		case 'e':	;
		case 'E':	;
		case 'i':	;
		case 'I':	;
		case 'h':	;
		case 'H':	;
		case 'u':	;
		case 'U':	return 'an';
	}
	return 'a';
}

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=");
  if (c_start!=-1)
    {
    c_start=c_start + c_name.length+1;
    c_end=document.cookie.indexOf(";",c_start);
    if (c_end==-1) c_end=document.cookie.length;
    return unescape(document.cookie.substring(c_start,c_end));
    }
  }
  return "";
}

// Trims any left & right whitespace.
function trim(s)
{
    if (!s || s.length == 0) return '';
    
	var l=0; 
	var r=s.length - 1;
	
	while(l < s.length && s.substr(l, 1) == ' ')
	    l++; 
	
	while(r > l && s.substr(r, 1) == ' ')
	    r-=1;	
	
	return s.substring(l, r+1);
}

