function gjsf_cleanup_quote (p_strg)
{
	p_strg = p_strg.replace (/"/g,"&quot;");
	p_strg = p_strg.replace (/'/g,"&acute;");
	return p_strg;
}

function gjsf_cleanup_phone_no (p_phone_no)
{ 
	p_phone_no = p_phone_no.replace (/ /g,"");
	p_phone_no = p_phone_no.replace (/-/g,"");
	p_phone_no = p_phone_no.replace (/\(/g,"");
	p_phone_no = p_phone_no.replace (/\)/g,"");
	p_phone_no = p_phone_no.replace (/\'/g,"");
	p_phone_no = p_phone_no.replace (/\"/g,"");
	return p_phone_no;
}

function gjsf_contact_us()
{	
	window.open('/contactus.php','_blank','width=450, height=550, location=no, menubar=no, resizable=no, scrollable=no, status=no');
}

function gjsf_open_tell_a_friend (p_prodcode, p_code, p_row, p_col)
{ 
	var p1 = "tellafriend.php?p="+p_prodcode+"&cat="+p_code+"&r="+p_row+"&c="+p_col;
	var p2 = "_blank";
	var p3 = "directories=no,height=550,width=450,location=no,menubar=no,titlebar=no,scrollbars=yes";
	window.open (p1, p2, p3);
}

function gjsf_isnumeric(strString)
{
	var strValidChars = "0123456789.-";
	var strChar;
	var blnResult = true;
	
	if (strString.length == 0) return true;
	
	//  test strString consists of valid characters listed above
	for (i = 0; i < strString.length && blnResult == true; i++)
	  {
	  strChar = strString.charAt(i);
	  if (strValidChars.indexOf(strChar) == -1)
		 {
		 blnResult = false;
		 }
	  }
	return blnResult;
}

function gjsf_mouse_over_highlight (obj)
{ 
//	obj.style.filter = "alpha(opacity=120)";
	obj.className = "css-highlite-picture";
}

function gjsf_mouse_out_dim (obj)
{ 
//	obj.style.filter = "alpha(opacity=100)";
	obj.className = "css-lowlite-picture";
}

function gjsf_build_province_state (p_tb, p_country, p_fldname, p_default, p_event_name, p_event_func)
{ 
	switch (p_country)
	{	case "CA":	var thtml="<select id='"+p_fldname+"' name='"+p_fldname+"' class='css-standard-font' "+
					p_event_name+"='"+p_event_func+"'>"+
					"<option value=''>-- Provinces --</option>"+
					"<option value='AB'>Alberta</option>"+
					"<option value='BC'>British Columbia</option>"+
					"<option value='MB'>Manitoba</option>"+
					"<option value='NB'>New Brunswick</option>"+
					"<option value='NL'>Newfoundland and Labrador</option>"+
					"<option value='NT'>Northwest Territories</option>"+
					"<option value='NS'>Nova Scotia</option>"+
					"<option value='NU'>Nunavut</option>"+
					"<option value='ON'>Ontario</option>"+
					"<option value='PE'>Prince Edward Island</option>"+
					"<option value='QC'>Quebec</option>"+
					"<option value='SK'>Saskatchewan</option>"+
					"<option value='YT'>Yukon</option>"+
					"</select>";
					break;
		case "US":	var thtml="<select label='State' validate='mandatory=yes' id='"+p_fldname+"' name='"+p_fldname+"' class='css-standard-font' "+
					p_event_name+"='"+p_event_func+"'>"+
					"<option value=''>-- States --</option>"+
					"<option value='AL'>ALABAMA</option>"+
					"<option value='AK'>ALASKA</option>"+
					"<option value='AS'>AMERICAN SAMOA</option>"+
					"<option value='AZ'>ARIZONA</option>"+
					"<option value='AR'>ARKANSAS</option>"+
					"<option value='CA')>CALIFORNIA</option>"+
					"<option value='CO'>COLORADO</option>"+
					"<option value='CT'>CONNECTICUT</option>"+
					"<option value='DE'>DELAWARE</option>"+
					"<option value='DC'>DISTRICT OF COLUMBIA</option>"+
					"<option value='FM'>FEDERATED STATES OF MICRONESIA</option>"+
					"<option value='FL'>FLORIDA</option>"+
					"<option value='GA'>GEORGIA</option>"+
					"<option value='GU'>GUAM</option>"+
					"<option value='HI'>HAWAII</option>"+
					"<option value='ID'>IDAHO</option>"+
					"<option value='IL'>ILLINOIS</option>"+
					"<option value='IN'>INDIANA</option>"+
					"<option value='IA'>IOWA</option>"+
					"<option value='KS'>KANSAS</option>"+
					"<option value='KY'>KENTUCKY</option>"+
					"<option value='LA'>LOUISIANA</option>"+
					"<option value='ME'>MAINE</option>"+
					"<option value='MH'>MARSHALL ISLANDS</option>"+
					"<option value='MD'>MARYLAND</option>"+
					"<option value='MA'>MASSACHUSETTS</option>"+
					"<option value='MI'>MICHIGAN</option>"+
					"<option value='MN'>MINNESOTA</option>"+
					"<option value='MS'>MISSISSIPPI</option>"+
					"<option value='MO'>MISSOURI</option>"+
					"<option value='MT'>MONTANA</option>"+
					"<option value='NE'>NEBRASKA</option>"+
					"<option value='NV'>NEVADA</option>"+
					"<option value='NH'>NEW HAMPSHIRE</option>"+
					"<option value='NJ'>NEW JERSEY</option>"+
					"<option value='NM'>NEW MEXICO</option>"+
					"<option value='NY'>NEW YORK</option>"+
					"<option value='NC'>NORTH CAROLINA</option>"+
					"<option value='ND'>NORTH DAKOTA</option>"+
					"<option value='MP'>NORTHERN MARIANA ISLANDS</option>"+
					"<option value='OH'>OHIO</option>"+
					"<option value='OK'>OKLAHOMA</option>"+
					"<option value='OR'>OREGON</option>"+
					"<option value='PW'>PALAU</option>"+
					"<option value='PA'>PENNSYLVANIA</option>"+
					"<option value='PR'>PUERTO RICO</option>"+
					"<option value='RI'>RHODE ISLAND</option>"+
					"<option value='SC'>SOUTH CAROLINA</option>"+
					"<option value='SD'>SOUTH DAKOTA</option>"+
					"<option value='TN'>TENNESSEE</option>"+
					"<option value='TX'>TEXAS</option>"+
					"<option value='UT'>UTAH</option>"+
					"<option value='VT'>VERMONT</option>"+
					"<option value='VI'>VIRGIN ISLANDS</option>"+
					"<option value='VA'>VIRGINIA</option>"+
					"<option value='WA'>WASHINGTON</option>"+
					"<option value='WV'>WEST VIRGINIA</option>"+
					"<option value='WI'>WISCONSIN</option>"+
					"<option value='WY'>WYOMING</option>"+
					"</select>";
					break;
		default:	var thtml="<input label='province/state' class='css-standard-font' type='text' id='"+p_fldname+"' name='"+p_fldname+"' size='30' "+
					"maxlength='30' "+p_event_name+"='"+p_event_func+"'>";
	}
	p_tb.innerHTML = thtml;
}
//------------------------------------------------------------------------------------------------
function gjsf_trim(s)
{   var i;
    var returnString = "";
	if (s!=null && s!="")
	{
		for (i = 0; i < s.length; i++)
		{   
			var c = s.charAt(i);
			if (c != " ") returnString += c;
		}
	}
    return returnString;
}
//-------------------------------------------------------------------------------------------
function gjsf_form_validator(p_form)
{
	// this function takes a form as parameter and validates all fields in the form according to directives set
	// fields that needs validation required directive set in tag named "VALIDATE"
	// more than one directives can be set in the tag. directives are created in pair in format of KEY=VALUE
	// multiple directives are separated with semi-color ';".
	// accepted directives are as follow:-
	// MANDATORY	(yes / no)	: field are mandatory, value must exists in fields
	// DTYPE (number/date/time/datetime/email/phone/postalzip) : validate format of value according to data  type
	// SUPCALL (function name): additional function called after build in validation is performed.
	
	//----------------------------------------------------------------------------------------------
	function jsf_checkInternationalPhone(strPhone)
	{
		var digits = "0123456789";
		// non-digit characters which are allowed in phone numbers
		var phoneNumberDelimiters = "()- ";
		// characters which are allowed in international phone numbers
		// (a leading + is OK)
		var validWorldPhoneChars = phoneNumberDelimiters + "+";
		// Minimum no of digits in an international phone no.
		var minDigitsInIPhoneNumber = 10;
	
		var bracket=3;
		strPhone=gjsf_trim(strPhone);
		if(strPhone.indexOf("+")>1)
			return false;
	
		if(strPhone.indexOf("-")!=-1)
			bracket=bracket+1;
			
		if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)
			return false;
			
		var brchr=strPhone.indexOf("(");
		
		if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")
			return false;
			
		if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)
			return false;
			
		s=jsf_stripCharsInBag(strPhone,validWorldPhoneChars);
		
		return (gjsf_isnumeric(s) && s.length >= minDigitsInIPhoneNumber);
	}
	//-------------------------------------------------------------------------------------------
	function jsf_stripCharsInBag(s, bag)
	{   var i;
		var returnString = "";
		for (i = 0; i < s.length; i++)
		{   
			var c = s.charAt(i);
			if (bag.indexOf(c) == -1) returnString += c;
		}
		return returnString;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_date(p_value)
	{
		var validformat=/^\d{4}\-\d{2}\-\d{2}$/;
		var rtnbool=validformat.test(p_value);
		if (rtnbool)
		{
			var yearfield=p_value.split("-")[0];
			var monthfield=p_value.split("-")[1];
			var dayfield=p_value.split("-")[2];
			var dayobj = new Date(yearfield, monthfield-1, dayfield);
			rtnbool = (!((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield)));
		}
		return rtnbool
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_mutli_emails(p_emails)
	{
		ary_emails = p_emails.split(";");
		cont = true;
		for (var i = 0; (i<ary_emails.length && cont); i++)
			cont = jsf_validate_email (ary_emails[i]);
		return cont;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_email(p_email)
	{
	   var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	   rtnbool = reg.test(p_email);
	   return rtnbool;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_url(p_url)
	{
	   var reg = /^([A-Za-z0-9_\-\.])+\.([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	   rtnbool = reg.test(p_url);
	   return rtnbool;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_phone(p_phoneno)
	{
		rtnbool = jsf_checkInternationalPhone(p_phoneno);

		return rtnbool;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_postal(p_postal)
	{
		zip = p_postal.replace (/ /g, "");
		var ll = zip.length;
		switch (ll)
		{	// US zip code
			case 5: rtnbool = gjsf_isnumeric(zip); break;
			case 9: rtnbool = gjsf_isnumeric(zip); break;
			case 10: rtnbool = (zip.search(/^\d{5}-\d{4}$/)!= -1); break;
			// canadian postal code
			case 6: rtnbool = (zip.length == 6 && zip.search(/^[a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d$/)!= -1); break;
			default: rtnbool = true;
		}
		return rtnbool;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_time(p_timeStr)
	{
		var rtnbool = true;
		var timePat = /^(\d{1,2}):(\d{1,2})(:(\d{1,2}))?(\s?(AM|am|PM|pm))?$/;
		var matchArray = p_timeStr.match(timePat);
		rtnbool = (matchArray != null) 
		if (matchArray == null)
		{	return false;	}
		
		hour = matchArray[1];
		minute = matchArray[2];
		second = matchArray[4];
		ampm = matchArray[6];
	
		if (second=="") { second = null; }
		if (ampm=="") { ampm = null }
	
		if (hour < 0  || hour > 23) 
		{	return false;	}
		
		if  (hour > 12 && ampm != null) 
		{	return false;	}
		
		if (minute < 0 || minute > 59) 
		{	return false;	}
		
		if (second != null && (second < 0 || second > 59)) 
		{	return false;	}
		
		return true;
	}
	//-------------------------------------------------------------------------------------------
	function jsf_validate_datetime(p_value)
	{
		alert ("form validator - jsf_validate_datetime has not yet defined");
		return true;
	}
	//-------------------------------------------------------------------------------------------
	var rtnbool = true;
	var ptr = 0;
	for (var i=0; i<p_form.elements.length && rtnbool; i++)
	{	//alert (p_form.elements[i].id + " / " + p_form.elements[i].disabled);
		ptr = i;
		ptrname = p_form.elements[i].id;
		if (!p_form.elements[i].disabled)
		{
			var thevalue = gjsf_trim(p_form.elements[i].value);

			// if input is file, then check if the original file name is uploaded into attribute "filename"
			if (!thevalue && p_form.elements[i].getAttribute("type")=="file")
				var thevalue = p_form.elements[i].getAttribute("filename");
			
			var attr = p_form.elements[i].getAttribute("validate");
			if (attr)
			{	var ar_attr = attr.split(";");
				for (var j=0; j<ar_attr.length && rtnbool; j++)
				{
					tr_tmp = ar_attr[j].split("=");
					key = tr_tmp[0].toLowerCase();
					val = tr_tmp[1].toLowerCase();

					if (key=="mandatory")
					{	if (val=="yes")
							rtnbool = (thevalue!="");

						if (!rtnbool)
							errormsg = "field must be entered";
					}
					else if (key=="minchar")
					{
						rtnbool = (thevalue.length>=val);
						if (!rtnbool)
							errormsg = "entry length must be at least "+val+" characters.";
					}
					else if (key=="maxchar")
					{
						rtnbool = (thevalue.length>=val);
						if (!rtnbool)
							errormsg = "entry length must be no longer than "+val+" characters.";
					}
					else if (key=="dtype")
					{ 
						if (thevalue && thevalue!="")
						{
							switch (val)
							{	case "number":	rtnbool = gjsf_isnumeric(thevalue);
												if (!rtnbool) errormsg = "field must be numeric";
												break;
												
								case "date": rtnbool = jsf_validate_date(thevalue);
											 if (!rtnbool) errormsg = "Invalid date entry";
											 break;
											 
								case "time": rtnbool = jsf_validate_time(thevalue);
											 if (!rtnbool) errormsg = "Invalid time entry";
											 break;
											 
								case "datetime": rtnbool = jsf_validate_datetime(thevalue);
												 if (!rtnbool) errormsg = "Invalid date/time entry";
												 break;
												 
								case "email": rtnbool = jsf_validate_email(thevalue);
											  if (!rtnbool) errormsg = "Invalid email address";
											  break;
								
								case "multiemails": rtnbool = jsf_validate_mutli_emails(thevalue);
											 if (!rtnbool) errormsg = "Invalid email address ("+thevalue+")";
											 break;

								case "url":	$rtnbool = jsf_validate_url(thevalue);
											if (!rtnbool) errormsg = "Invalid URL";
											break;
											  
								case "phone": rtnbool = jsf_validate_phone(thevalue); 
											  if (!rtnbool) errormsg = "Invalid phone entry";
											  break;
											  
								case "postalzip": rtnbool = jsf_validate_postal(thevalue);
												  if (!rtnbool) errormsg = "Invalid postal/zip code entry";
												  break;
								
								default: errormsg = "Invalid validation data type specified"; 
										 rtnbool = false;
							}
						}
					}
				}
			}
		}
	}
	if (!rtnbool)
	{
		lbl = p_form.elements[i=ptr].getAttribute("label");
		alert ("Msg: "+(lbl?lbl:"")+" "+errormsg);
		// don't focus on tag element when it is hidden
		if (p_form.elements[ptr].style.visibility!="hidden")
			if (p_form.elements[ptr]) p_form.elements[ptr].focus();
	}
	return rtnbool;
}
//----------------------------------------------------------------------------------------
function handleErr(msg,url,l)
{
	txt="Error occurs in page.\n\n";
	txt+="Error: " + msg + "\n";
	txt+="URL: " + url + "\n";
	txt+="Line: " + l + "\n\n";
	txt+="Click OK to continue.\n\n";
	alert(txt);
	return true;
}
//----------------------------------------------------------------------------------------
function gjsf_openpopwindow(mypage, myname, w, h, scroll)
{
	LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
	TopPosition =  (screen.height) ? (screen.height-h)/2 : 0;
	settings = 'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars='+scroll+',resizable';
	window.open(mypage,myname,settings)
}

