var isIE = false;
var isMoz = false;
if (navigator.product == "Gecko")
  isMoz = true;
else
  isIE = true;

var isMobile = false;
var NonInteger =  /[^0-9]/;         // used to test for non-numeric entries
var NonFloat =  /[^0-9\.]/;         // used to test for non-numeric entries
var blankSpace = /[\s]/;            // used to check for blank fields
var whitespace = " \t\n\r";
var invalidCharacters = /[\'\,]/;
var QuoteChar = /[\']/;
var specialChars = "#^|~";
var singleSpace = "\u00a0";			//used to create a space for document.createTextNode

var mPrefix = "Please enter the ";
var iEmail = " must be in a format similar to abc@xyz.com and not contain characters such as ' ( ) \", etc."
var msgSellRateInvalid = 'Your Sell Rate is no longer valid. Please delete.';
var defaultEmptyOK = false;
var today = new Date();     // used to check for past dates
var currYear = today.getFullYear();
var currMonth = today.getMonth() + 1;
var currDay = today.getDate();
var iMillsInDay = 86400000;
var iDaysInWeek = 7;
var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;
var monthNames=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var maxYear = 2070;

var REQUIRED = false;
var OPTIONAL = true;
var gstrLEVEL_1 = "1";
var gstrLEVEL_2 = "2";
var gstrBOTH_LEVELS = "9";
var gstrFULL_IND = "F";
var gstrPARTIAL_IND = "P";
var gstrTRIP_TYPE_ONE_TIME = "O";
var gstrTRIP_TYPE_DAILY = "D";
var gstrTRIP_TYPE_PER_DAY = "Y";
var gstrTRIP_TYPE_WEEKLY = "W";
var gstrTRIP_TYPE_PER_WEEK = "Z";
var gstrTRIP_TYPE_BI_WEEKLY = "B";
var gstrTRIP_TYPE_MONTHLY = "M";
var gstrTRIP_TYPE_ANNUALLY = "A";
var gstrTRIP_TYPE_EVERY_X_DAYS = "X";
var gstrTRIP_TYPE_UNKNOWN = "U";
var gstrFIXED_AMOUNT_IND = "F";
var gstrPERCENTAGE_IND = "P";
var gstrACTUAL_WEIGHT_IND = "A";
var gstrCHARGEABLE_WEIGHT_IND = "C";
var gstrCONTAINER_YARD_IND = "C";
var gstrDROP_STATION_IND = "S";
var gstrCFS_IND = "C"; //container freight station
var gstrRAMP_IND = "R";
var gstrPORT_IND = "P";
var gstrDS_IND = "S";
var gstrDOOR_IND = "D";
var gstrSEARCH_BY_LOCATION = "L";
var gstrSEARCH_BY_COUNTRY = "C";
var gstrLUMP_SUM_DESCRIP = "Lump Sum";
var gstrFLAT_FEE_IND = "F";
var gstrPER_UNIT_IND = "U";
var gstrPERCENT_IND = "P";
var gstrABSOLUTE_VALUE_IND = "A";
var gstrMULTIPLIER_IND = "M";
var giDEFAULT_CURRENCY_ID = "1";
var gstrSEARCH_BY_COMMODITY = "C";
var gstrSEARCH_LOWEST_RATES = "L";
var gstrAIR_DEFAULT_COMMODITY_NAME = "F.A.K.";
var gstrOCEAN_DEFAULT_COMMODITY_NAME = "N.O.S. - GDSM - F.A.K.";
var gstrRATE_TYPE_UNSPECIFIED = "U";

//system types
var gstrINTERMEDIARY_SYSTEM = 'I';
var gstrCARRIER_SYSTEM = 'C';
var gstrMANUFACTURER_SYSTEM = 'M';

//routing area
var gstrUS_WEST_COAST = "USWC";
var gstrUS_EAST_COAST = "USEC";
var gstrUS_GULF_COAST = "USGC";
var gstraROUTING_AREAS = ["",gstrUS_WEST_COAST, gstrUS_EAST_COAST, gstrUS_GULF_COAST];

var giKEY_CODE_BACKSPACE = 8;

var giMODE_LAND = 1;
var giMODE_AIR = 2;
var giMODE_SEA = 3;

var giLumpSumId = 196;
var giPercentId = 199;
var giPerUnitId = 200;
var giKgChargeableId = 201;

//U.S.A. routing areas
var giUS_WEST_COAST = -1;
var giUS_EAST_COAST = -2;
var giUS_GULF_COAST = -3;

var giDEFAULT_COMMODITY_ID = -9;
var giDEFAULT_TRADE_LANE_ID = -1;
var giCONTAINER_20FT_ID = 1;
var giCONTAINER_40FT_ID = 2;
var giCONTAINER_40FTHC_ID = 3;
var giCONTAINER_45FTHC_ID = 4;
var giCUBIC_METER_0_10_ID = 65;
var giCUBIC_METER_10_PLUS_ID = 67;
var giMETRIC_TON_ID = 60;
var giCUBIC_FT_500LBS_ID = 195;
var giCUBIC_FT_2000LBS_ID = 193;
var gi100LBS_ID = 194;
var giLUMP_SUM_ID = 196;
var giHAZ = 33;
var giSOC = 31;
var giGOH = 134;
var giHAZ_AIR = 120;
var giDISC = 550;
var giACTIVE = 0;
var gstrINCHES = "1";
var gstrFEET = "2";
var gstrCENTIMETERS = "3";
var gstrMETERS = "4";

//convertion constants - should match with values in the java constants file
var gfCB_FEET_TO_CB_METERS = .0283;
var gfCB_METERS_TO_CB_FEET = 35.3146;
var gfKILOGRAMS_TO_POUNDS = 2.21;
var gfKILOGRAMS_TO_POUNDS_NEW = 2.204622;
var gfPOUNDS_TO_KILOGRAMS = .4536;
var gfCB_INCHS_TO_CB_FEET = 0.000578703704;
var gfCB_INCHS_TO_CB_METERS = 0.000016387064;
var gfCB_CMS_TO_CB_FEET = 0.0000353146667;
var gfCB_CMS_TO_CB_METERS = 0.000001;
var giCB_INCHES_TO_VOLUME_KILOS = 366;
var giCB_CMS_TO_VOLUME_KILOS = 6000;
var giCB_METERS_TO_CB_CMS = 1000000;
var giCB_FEET_TO_CB_INCHES = 1728;


//moved here from Quote.js - HS
var giCBM_1000KGS_ID = 143;
var giCBM_600KGS_ID = 157;
var giCBM_500KGS_ID = 155;
var giCBM_363KGS_ID = 180;
var giCBM_333KGS_ID = 156;
var giCBM_300KGS_ID = 159;

//Convert contract to quote constants
var gstrCONVERT_CONTRACT_AND_ADD_TO_EXISTING = "ccaq";
var gstrCONVERT_CONTRACT_TO_QUOTE = "ccq";

//==============================
	// To caputre whether the browser is firefox
    // convert all characters to lowercase to simplify testing
    var agt = navigator.userAgent.toLowerCase();
    var is_konq = false;
    var kqPos   = agt.indexOf('konqueror');
    if (kqPos !=-1) {
       is_konq  = true;
    }
	var is_chrome = (agt.indexOf('chrome')!=-1)?true:false;
    var is_safari = (agt.indexOf('safari')!=-1)?true:false;
    var is_khtml  = (is_safari || is_konq);
    var is_gecko  = ((!is_khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
    var is_moz_ff = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
                    (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
                    (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
                    (is_gecko) &&
                    ((navigator.vendor=="")||(navigator.vendor=="Mozilla")));
//==============================

var glPieceBidGroupId = 130550;

function AddOption(objOption, iIndex, strValue, strText)
{
	objOption.options[iIndex] = new Option(strText, strValue);
	return true;
}

function RemoveItemFromList(obj)
{
    var i = 0;
    while (i<obj.length) {
        if (obj.options[i].selected==true)
        	obj.remove(i);
        else
            i++;
    }
}

function RemoveAllItemsFromList(obj)
{
    var i = 0;
    while (i<obj.length)
       	obj.remove(i);
}

function warnInvalid (errorMessage, errorField)
{
	alert (errorMessage);
	errorField.focus();
}

function warnEmpty (theField, label)
{
	alert(mPrefix + label)
	theField.focus()
	return false
}
function isWhitespace (s)
{
	var i;
	if (isEmpty(s)) return true;
	for (i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (whitespace.indexOf(c) == -1) return false;
	}
	return true;
}

function IsBlank (s)
{
	if (isEmpty(s)) return true;
	else return false;
}

function isEmpty(s)
{
	return ((s == null) || (s.length == 0))
}

function isDigit (c)
{
	return ((c >= "0") && (c <= "9"))
}

function IsValidFloat (s)
{
	if (NonFloat.test (s))  return false;
	if (s.indexOf('.') >=0)
	{
		// has a decimal
		if (s.length == 1 && s.indexOf('.') == 0)  return false;   // check for "." only.
		if (s.length - s.indexOf('.') > 3)         return false;   // check for number of decimal places (2 or less is ok)
		if (s.indexOf('.') != s.lastIndexOf('.'))  return false;   // check the number of decimals entered
	}
	return true;
}

function IsValidPercent (s)
{

	var re = /^\d{0,2}(\.\d{0,2})?$/ ;
	return re.test(s);

}

function IsValidInteger (s)
{
	for (var i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (!isDigit(c)) return false;
	}
	return true;
}

function checkString (theField, label, emptyOK)
{
	if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
		var value = fieldValue(theField);
	if (isEmpty(value))
		return (emptyOK ? true : warnEmpty(theField, label));
	if (isWhitespace(value))
		return warnEmpty (theField, label);
	else return true;
}

function hasInvalidChars (theField, fieldName)
{
	var i;
	var value = fieldValue(theField);
	for (i = 0; i < value.length; i++)
	{
		var c = value.charAt(i);
		if (invalidCharacters.test(c)) {
			alert(fieldName + " may not contain ' or ,")
			theField.focus()
			return false;
		}
	}
	return true;
}

function checkEmail (theField, label, emptyOK)
{
	if (checkEmail.arguments.length == 2) emptyOK = defaultEmptyOK;
	if (isEmpty(theField.value))
		return (emptyOK ? true : warnEmpty(theField, label));
	else if (!isEmail(theField.value, false))
		return warnInvalid (label + iEmail, theField);
	else return true;
}

function checkemail(strEmail){
	var bValid = false;
	var reg=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	if (reg.test(strEmail))
		bValid = true;

	return bValid;
}

function trim(value) {
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }

   return temp;
}

function daysInFebruary (year)
{
    // February has 29 days in any year evenly divisible by four,
    // EXCEPT centurial years which are not divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function IsValidDate (userYear, userMonth, userDay)
{
    if ((userYear == "spacer") || (userMonth == "spacer") || (userDay == "spacer")) return false;

    var intYear = parseInt (userYear);
    var intMonth = parseInt (userMonth);
    var intDay = parseInt (userDay);

    if (isNaN(intYear) || isNaN(intMonth) || isNaN(intDay))
    	return false;

    if (intDay > daysInMonth[intMonth]) return false;
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}

function FirstIsEarlierThanSecond (year1, month1, day1, year2, month2, day2)
{
	var intYear1 = parseInt (year1,10);
	var intMonth1 = parseInt (month1,10);
	var intDay1 = parseInt (day1,10);

	var intYear2 = parseInt (year2,10);
	var intMonth2 = parseInt (month2,10);
	var intDay2 = parseInt (day2,10);
	
	if (intYear1 < intYear2) return true;
	if ((intYear1 == intYear2) && (intMonth1 < intMonth2)) return true;
	if ((intYear1 == intYear2) && (intMonth1 == intMonth2) && (intDay1 <= intDay2)) return true;

	return false;   // second date is equal to or later than first date
}

function FirstIsLaterThanSecond (year1, month1, day1, year2, month2, day2)
{
    var intYear1 = parseInt (year1);
    var intMonth1 = parseInt (month1,10);
    var intDay1 = parseInt (day1,10);

    var intYear2 = parseInt (year2);
    var intMonth2 = parseInt (month2,10);
    var intDay2 = parseInt (day2,10);

    if (intYear1 > intYear2) return true;
    if ((intYear1 == intYear2) && (intMonth1 > intMonth2)) return true;
    if ((intYear1 == intYear2) && (intMonth1 == intMonth2) && (intDay1 >= intDay2)) return true;

    return false;
}

function FirstIsEqualToSecond (year1, month1, day1, year2, month2, day2)
{
    var intYear1 = parseInt (year1);
    var intMonth1 = parseInt (month1,10);
    var intDay1 = parseInt (day1,10);

    var intYear2 = parseInt (year2);
    var intMonth2 = parseInt (month2,10);
    var intDay2 = parseInt (day2,10);

    if ((intYear1 == intYear2) && (intMonth1 == intMonth2) && (intDay1 == intDay2)) return true;

    return false;
}

function getRadioButtonValue (radio)
{
	var strValue = null;
	if (typeof(radio.length) != 'undefined') {
	   for (var i = 0; i < radio.length; i++)
	   {
		  if (radio[i].checked) {
			strValue = radio[i].value;
			break;
		  }
	   }
	}
	else {
		strValue = radio.value;
	}

	return strValue;
}

function getSelectedRadioIndex (radio)
{
    var iIndex = -1;
    for (var i = 0; i < radio.length; i++)
    {
       if (radio[i].checked) {
          iIndex = i;
          break;
       }
    }

    return iIndex;
}

function getRadioIndexForValue (radio, strValue)
{
    var iIndex = -1;
    for (var i = 0; i < radio.length; i++)
    {
       if (radio[i].value == strValue) {
          iIndex = i;
          break;
       }
    }

    return iIndex;
}

function ToggleSelect(strName, bSelected)
{
    var obj = document.forms[0][strName];

    for (var i=0; i < obj.length; i++)
        obj.options[i].selected = bSelected;
}

function fieldValue(theField)
{
	if ( theField.type.lastIndexOf("select", 0) == 0 )
		return theField.options[theField.selectedIndex].value;
	else
		return theField.value;
}

// -------------------------------------------------------------------
//  function to determine if a select object has an options array
// -------------------------------------------------------------------
function hasOptions(obj) {
	if (obj!=null && obj.options!=null)
		return true;
	return false;
}

function sortSelect(obj)
{
	var o = new Array();
	if (!hasOptions(obj))
		return;

	for (var i=0; i<obj.options.length; i++) {
		o[o.length] = new Option( obj.options[i].text, obj.options[i].value, obj.options[i].defaultSelected, obj.options[i].selected) ;
	}

	if (o.length==0)
		return;

	o = o.sort(
		function(a,b) {
			if ((a.text.toLowerCase()+"") < (b.text.toLowerCase()+"")) { return -1; }
			if ((a.text.toLowerCase()+"") > (b.text.toLowerCase()+"")) { return 1; }
			return 0;
		}
	);

	for (var i=0; i<o.length; i++) {
		obj.options[i] = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
	}
}

function getOffsetTop(e){
	var top  = 0;
	while (e.offsetParent){
		top  += e.offsetTop;
		e    = e.offsetParent;
	}
	top  += e.offsetTop;
	return top;
}

function getOffsetLeft(e){
	var top  = 0;
	while (e.offsetParent){
		top  += e.offsetLeft;
		e    = e.offsetParent;
	}
	top  += e.offsetLeft;
	return top;
}

//start of private methods
function isEmail (s)
{   if (isEmpty(s))
		if (isEmail.arguments.length == 1) return defaultEmptyOK;
		else return (isEmail.arguments[1] == true);
	if (isWhitespace(s)) return false;
	if (s.indexOf(":") >= 0) return false;
	var i = 1;
	var sLength = s.length;
	while ((i < sLength) && (s.charAt(i) != "@"))
	{ i++;
	}
	if ((i >= sLength) || (s.charAt(i) != "@")) return false;
	else i += 2;
	while ((i < sLength) && (s.charAt(i) != "."))
	{ i++;
	}
	if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
	var i = 0;
	while (i < sLength)
	{
		if (s.charAt(i) == " ")
			return false;
		i++;
	}
	return true;
}

function nextNearest(value, number) {
  var remainder = value % number;

  if (remainder > 0)
    value = value - remainder + number;
  return value;
}

function hasSpecialChars (theField, fieldName)
{
	var i;
	for (var i = 0; i < theField.value.length; i++) {
		if (specialChars.indexOf(theField.value.charAt(i)) != -1) {
		  	alert (fieldName +" may contain special characters ("+ specialChars +"). \n Please remove them and try again.");
			theField.focus();
			return false;
		}
	}
	return true;
}

function totalTextCounter(textFieldName,counterField,maxLimit)
{
	if(document.forms[0].elements[textFieldName]!= null) {
		if (document.forms[0].elements[textFieldName].value.length > maxLimit) // if too long...trim it!
			document.forms[0].elements[textFieldName].value = document.forms[0].elements[textFieldName].value.substring(0, maxLimit);
		// otherwise, update 'characters left' counter
		else
			document.getElementById(counterField).innerText = maxLimit - document.forms[0].elements[textFieldName].value.length + ' characters left';
	}
}

String.prototype.trim = function() {
a = this.replace(/^\s+/, '');
return a.replace(/\s+$/, '');
};

/* Functions to handle browser incompatibilites */
function eventElementCommon(event)
{
  if(isMoz || isMobile)
    return event.currentTarget;
  else
    return event.srcElement;
}

function addKeyListenerCommon(element, listener)
{
  if (element.addEventListener)
	element.addEventListener("keydown",listener,false);
  else
    element.attachEvent("onkeydown",listener);
}

function addListenerCommon(element, type, listener)
{
  if (element.addEventListener)
    element.addEventListener(type, listener, false);
  else
    element.attachEvent('on' + type, listener);
}

function removeListenerCommon(element, type, listener)
{
  if (element.removeEventListener)
    element.removeEventListener(type, listener, false);
  else
    element.detachEvent('on' + type, listener);
}

function keyhandlerCommon(e)
{
	var iKeyCode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
	if (x && e.keyCode==8) {
		return true;
	}else if (!x && e.keyCode==8) {
       return false;
   }
}

function getTextValue(obj) {
	return typeof(obj.innerText) != "undefined" ? obj.innerText : obj.textContent;
}

function setTextValue(obj, text) {
	typeof(obj.innerText) != "undefined" ? obj.innerText = text : obj.textContent = text;
}

function deleteAllChildNodes(elementId){
  var oElem = document.getElementById(elementId);
  while (oElem != null && oElem.hasChildNodes() ) { oElem.removeChild( oElem.lastChild ); }
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";

	document.cookie = name+"=\""+value+"\""+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

