function Len(e) {
	return e.length;
}

// returns the amount in the .99 format 
function cent(amount) {
	if (isNaN(amount) || !isFinite(amount)) { amount = "0"; }
    
    amount -= 0;
    amount = (Math.round(amount*1000))/1000;

    return (amount == Math.floor(amount)) ? amount + '.00' : (  (amount*10 == Math.floor(amount*10)) ? amount + '0' : amount);
}

// returns Math.floor()
function floor(amount) {
	if (isNaN(amount) || !isFinite(amount)) { amount = "0"; }
    
    amount -= 0;

    return (Math.floor(amount));
}

// returns Math.ceil()
function ceil(amount) {
	if (isNaN(amount) || !isFinite(amount)) { amount = "0"; }
    
    amount -= 0;

    return (Math.ceil(amount));
}

// Output a number with ,'s
function thousands(Number) {
var n = eval(Number) + ''

	if (isNaN(n) || !isFinite(n)) {	n = "0"; }

	var arr=new Array('0'), i=0; 
	while (n>0) 
		{arr[i]=''+n%1000; n=Math.floor(n/1000); i++;}
	arr=arr.reverse();
	for (var i in arr) if (i>0) //padding zeros
		while (arr[i].length<3) arr[i]='0'+arr[i];
	return arr.join();
}

// Convert a fraction to a percent
function percent(x) {
	if (isNaN(x) || !isFinite(x)) {	x = "0"; }
	
	return Math.round((x-0)*100) + '%';
}

function dollar(num) {
    if (num == undefined) num = "0";

    num = num.toString().replace(/\$|\,/g,'');
    
    if(isNaN(num))
        num = "0";
        
    var sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    var cents = num%100;
    num = Math.floor(num/100).toString();

    if(cents<10)
        cents = "0" + cents;

    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        num = num.substring(0,num.length-(4*i+3))+','+

    num.substring(num.length-(4*i+3));

    return (((sign)?'':'-') + '$' + num + '.' + cents);
}
/*
function dollar(Number) {
  	var Num = eval(Math.round(ToNumber(Number)*100)/100) + '';
    var newNum = "";
    var newNum2 = "";
    var count = 0;
    
    //check for decimal number
    if (Num.indexOf('.') != -1){  //number ends with a decimal point
        if (Num.indexOf('.') == Num.length-1){
            Num += "00";
        }
        if (Num.indexOf('.') == Num.length-2){ //number ends with a single digit
            Num += "0";
        }
        
        var a = Num.split("."); 
        Num = a[0];   //the part we will commify
        var end = a[1] //the decimal place we will ignore and add back later
    }
    else {var end = "00";}  
 
    //this loop actually adds the commas   
    for (var k = Num.length-1; k >= 0; k--){
      var oneChar = Num.charAt(k);
      if (count == 3){
        newNum += ",";
        newNum += oneChar;
        count = 1;
        continue;
      }
      else {
        newNum += oneChar;
        count ++;
      }
   }  //but now the string is reversed!
   
  //re-reverse the string
  for (var k = newNum.length-1; k >= 0; k--){
      var oneChar = newNum.charAt(k);
      newNum2 += oneChar;
  }
   
   // add dollar sign and decimal ending from above
   newNum2 = "$" + newNum2 + "." + end;
   
   return newNum2;
}
*/

function pound(Number) {
	return (dollar(Number).replace(/\$/, "£"));
}

function daysBetween(date1, date2){
   if (date1.indexOf("-") != -1) { date1 = date1.split("-"); } else if (date1.indexOf("/") != -1) { date1 = date1.split("/"); } else { return 0; }
   if (date2.indexOf("-") != -1) { date2 = date2.split("-"); } else if (date2.indexOf("/") != -1) { date2 = date2.split("/"); } else { return 0; }
   if (parseInt(date1[0], 10) >= 1000) {
       var sDate = new Date(date1[0]+"/"+date1[1]+"/"+date1[2]);
   } else if (parseInt(date1[2], 10) >= 1000) {
       var sDate = new Date(date1[2]+"/"+date1[0]+"/"+date1[1]);
   } else {
       return 0;
   }
   if (parseInt(date2[0], 10) >= 1000) {
       var eDate = new Date(date2[0]+"/"+date2[1]+"/"+date2[2]);
   } else if (parseInt(date2[2], 10) >= 1000) {
       var eDate = new Date(date2[2]+"/"+date2[0]+"/"+date2[1]);
   } else {
       return 0;
   }
   var one_day = 1000*60*60*24;
   var daysApart = Math.abs(Math.ceil((sDate.getTime()-eDate.getTime())/one_day));
   return daysApart;
} 

function weekdaysBetween(startDate, endDate) {
   if (startDate < endDate) {
      var s = startDate;
      var e = endDate;
   } else {
      var s = endDate;
      var e = startDate;
   }
   var diffDays = Math.floor((e - s) / 86400000);
   var weeksBetween = Math.floor(diffDays / 7);
   if (s.getDay() == e.getDay()) {
      var adjust = 0;
   } else if (s.getDay() == 0 && e.getDay() == 6) {
      var adjust = 5;
   } else if (s.getDay() == 6 && e.getDay() == 0) {
      var adjust = 0;
   } else if (e.getDay() == 6 || e.getDay() == 0) {
      var adjust = 5-s.getDay();
   } else if (s.getDay() == 0 || s.getDay() == 6) {
      var adjust = e.getDay();
   } else if (e.getDay() > s.getDay() ) {
      var adjust = e.getDay()-s.getDay();
   } else {
      var adjust = 5+e.getDay()-s.getDay();
   }
   return (weeksBetween * 5) + adjust;
}
/*
function getSelectedCount(item) {
var curIndex, lastchar;
var fieldName, fieldType;
var itemCount = 0;
alert(item);

	curIndex = item.indexOf('{udf_', 0)
	if (curIndex > -1) {
		lastchar = item.indexOf('}', curIndex)
		fieldName = item.substr(curIndex, lastchar-curIndex+1)
		fieldType = eval('document.forms[0].' + fieldName.substr(1, fieldName.length-2) + '.type');
		if (fieldType == 'select-multiple') {
			var e = eval('document.forms[0].' + fieldName.substr(1, fieldName.length-2));
			for( var j = 0; j < e.options.length; j++ ) {
				if( e.options[j].selected ) {
					itemCount++;
				}
			}
		}
		else
			return 1;
	}

	return itemCount;
}
*/



//=============================================================================================
function CalcAllFields(LimitItem) { 
var e, i
var f = document.forms[0]

	for( i = 0; i < f.length; i++ ) {
		e = f.elements[i]

		if (e.name) {
			if (e.name.indexOf('calc_') == 0) {
				CalcField(e)
			}
		}
	}
	//if (document.forms[0].qpDebug) { alert('udf_PaperWeight=' + document.forms[0].udf_PaperWeight.value); }

    if (typeof SFDisplay=='function') {
        SFDisplay();
    }

	return true
}

function CalcField(field)
{
var curIndex = 0, lastchar = 0
var formula = field.value
var fieldName, fieldValue, fieldType, oField
var answer, CleanAnswer
var myExp

//alert(formula)

	while (curIndex != -1) {
		curIndex = formula.indexOf('{udf_', 0)
		if (curIndex == -1) { curIndex = formula.indexOf('{invlist_', 0); } 
		if (curIndex == -1) { curIndex = formula.indexOf('{qty_', 0); } 
		if (curIndex == -1) { curIndex = formula.indexOf('{price_', 0); } 
		if (curIndex == -1) { curIndex = formula.indexOf('{tax_', 0); } 
		if (curIndex == -1) { curIndex = formula.indexOf('{wt_', 0); } 
		if (curIndex > -1) {
			lastchar = formula.indexOf('}', curIndex)
			fieldName = formula.substr(curIndex, lastchar-curIndex+1)
			//fieldType = eval('document.forms[0].' + fieldName.substr(1, fieldName.length-2) + '.type')
			fieldValue = GetFieldValue(fieldName.substr(1, fieldName.length-2))
			//if (document.forms[0].qpDebug && field.name == 'calc_DrillingFormula') {alert(fieldName.substr(1, fieldName.length-2) + '=' + fieldValue)}
			myExp = new RegExp(fieldName, "gi")
			formula = formula.replace(myExp, fieldValue)
		}
	}
//alert(formula)
//if (document.forms[0].qpDebug && field.name == 'calc_DrillingFormula') { alert(formula); }

	// Make the real field an object
	var objField = eval('document.forms[0].udf_' + field.name.substr(5))

	answer = eval(formula) + '';
//alert('DEBUG answer=' + answer)
	// Remove , $ and % from the answer so it looks like a number
	CleanAnswer = ToNumber(answer)
//alert('DEBUG CleanAnswer=' + CleanAnswer)
	
	//OLD WAY
	//myExp = new RegExp(',', "gi"); CleanAnswer = answer.replace(myExp, ''); 
	//myExp = new RegExp('\\$', "gi"); CleanAnswer = CleanAnswer.replace(myExp, '');
	//myExp = new RegExp('%', "gi"); CleanAnswer = CleanAnswer.replace(myExp, '');

	// Make sure we have a number
	if (isNaN(CleanAnswer)) {
		if (objField) { objField.value = 0; }
	}
	else {
		if (objField) { objField.value = answer; }
	}
}

function GetFieldValue(field) {
var e = eval('document.forms[0].' + field)
var fValue, multiVal = 0

	if (typeof(e) != 'undefined') {
		if( e.type == "select-one") {
        //alert(RealValue(e.options[e.selectedIndex].value,-1))
			return (e.selectedIndex>=0) ? RealValue(e.options[e.selectedIndex].value,-1) : ''
		}
		else if( e.type == "select-multiple") {
			for( var j = 0; j < e.options.length; j++ ) {
				if( e.options[j].selected ) {
					multiVal = multiVal + (RealValue(e.options[j].value,-1) * 1)
				}
			}
			return multiVal
		}
		else if( e.type == "checkbox") {
			if (e.checked)
				return RealValue(e.value,1)
			else
				return RealValue(e.value,0)
		}
		else if( e.type == "Xhidden") {
				return RealValue(e.value,-1)
		}
		else if (e.length > 1 && eval('document.forms[0].' + field + '[0].type') == 'radio') {
	        for (var j = 0; j < e.length; j++ ) {
		        if (e[j].checked) {
		            return RealValue(e[j].value,-1);
		        }	
	        }
		}
		else {
			fValue = ToNumber(e.value)
			//fValue = isNaN(e.value) ? 0 : e.value
			return fValue == '' ? 0 : unPadZero(fValue)
		}
	}
	else {
		alert('Error in formula\nField not found: ' + field)
		return 0
	}
}

// Netscape 4x Octal work-around
function unPadZero(myNumber) {
var i = 0;
var _myNumber = myNumber + '';

	while (_myNumber.charAt(i) == '0' && i < (_myNumber.length-1))
		i++
		
	return _myNumber.substr(i)

}

function RealValue(item, index) {
var pos, pend, value;

	pos = item.indexOf('@=');
	pend = item.indexOf('@={', 3); // Don't bump into ezFill
	if (pend == -1) { pend = item.length; }

	if (pos > -1) {
		value = item.substr(pos+2, (pend-(pos+2)));
		
		if (index == -1) {
			if (value == "" || isNaN(value))
				return 0;
			else
				return unPadZero(value);
		} else {
			var idxary = value.split("|");
			if (index >= idxary.length)
				return 0;
			else {
				var idxvalue = idxary[index];
				if (idxvalue == "" || isNaN(idxvalue))
					return 0;
				else
					return unPadZero(idxvalue);
			}
		}
	}
	else {
		if (index == -1) {
			if (item == "" || isNaN(item))
				return 0;
			else
				return unPadZero(item);
		}
			//return 0;
	}
}

function ToNumber(numString)
{
var _returnValue = "0";
var _numString, _array, bNeg = false;

	_numString = numString + ''
	_array =_numString.split(""); /* make each character be in its own array slot */;
	
	for(var i=0; i< _array.length;i++)
	{
		/* if the character is not a $ or a space or a comma or a % then take it */
		if(_array[i].search(/[$ ,%]/) == -1)
		{
			/* this uses strings addition to catinate the value together */
			/* the first value in an addition equation sets the type of opperation - here it is a string */
			if (_array[i].toString() == '-')
				bNeg = true;
			else
				_returnValue += _array[i].toString();
		}
	}
	if (bNeg) _returnValue = '-' + _returnValue
	
	/* this converts it to a float */
	if (_numString.charAt(_numString.length-1) == '%')
		return(parseFloat(_returnValue)/100);
	
	return(parseFloat(_returnValue));
}

function CheckLimit(numfld, promptfld, minfld, maxfld) {
	var rangeError = false;
	
	if (numfld.value) {
		var num = parseFloat(numfld.value); //Old Way??
		if (!isNaN(num)) 
		{
			var min = parseFloat(minfld.value);
			if (!isNaN(min) && num < min && min != max) {
				numfld.value = min;
				rangeError = true;
			}
			
			var max = parseFloat(maxfld.value);
			if (!isNaN(max) && num > max && min != max) {
				numfld.value = max;
				rangeError = true;
			}

			if (rangeError) {
				alert('"' + promptfld.value + '" must be in the range ' + min + ' - ' + max + ', resetting to: ' + numfld.value);
			}
		} else {
			rangeError = true;
			alert('Only numbers are allowed for ' + promptfld.value + '. Please remove any text, symbols, or spaces.')
		}
	}
	return !rangeError;
}

function CheckNumeric(e) {
	if (e) {
		if (isNaN(parseFloat(String.fromCharCode(getkey(e)))) && getkey(e) !=0 && getkey(e) != 8 && getkey(e) != 9 && getkey(e) != 45 && getkey(e) != 46 && getkey(e) != 63234 && getkey(e) != 63235) {
			alert('Only numbers are allowed for this field.');
			return false;
		}
	}
	return true;
}

// ezFill (Advanced Auto Fill)
function EvalField(e, theForm) {
var v, arr, item, value;
var cSEP = '@={', cEND = '}=';
var cSUBS = '{', cSUBE = '}';
var cLOCKED = '{locked}';
var curIndex = 0;
var lastChar = 0;
var myExp = /\x7c\x7c/g; // Double bar

	if (typeof(e) != 'undefined') {
		if( e.type == "select-one") {
			v = e.options[e.selectedIndex].value;
		}
		else if( e.type == "checkbox" || e.type == "radio") {
			v = e.value;
		}
	
		while (curIndex != -1) {
			curIndex = v.indexOf(cSEP, curIndex);
			if (curIndex > -1) {
				lastChar = v.indexOf(cSEP, (curIndex + cSEP.length));
				if (lastChar == -1) { lastChar = v.length; }
					
				// Extract the individual line items
				item = v.substr(curIndex, lastChar-curIndex);
				item = item.substr(cSEP.length - 1);
				// Split to item/value pairs
				arr = item.split(cEND);
				item = arr[0].substr(1); value = arr[1];
				value = value.replace(myExp, '\n');

				if( e.type == "checkbox") {
					if (!e.checked) value = '';
				}

				/* Allow data from another field to be embedded */
				var subItem, subArr, subField, subIndex = 0, endChar = 0;
		        while (subIndex != -1) {
			        subIndex = value.indexOf(cSUBS, subIndex);
			        if (subIndex > -1) {
				        endChar = value.indexOf(cSUBS, (subIndex + cSUBS.length));
				        if (endChar == -1) { endChar = value.length; }
        					
				        // Extract the individual line items
				        subItem = value.substr(subIndex, endChar-subIndex);
				        subItem = subItem.substr(cSUBS.length - 1);

				        // Split to item/value pairs
				        subArr = subItem.split(cSUBE);
				        subField = cSUBS + subArr[0].substr(1) + cSUBE;
				        subItem = subArr[0].substr(1);

				        if (eval('document.' + theForm + '[\'' + subItem + '\']')) {
		                    var subFieldSrc  = eval('document.' + theForm + '[\'' + subItem + '\']');
			                if (subFieldSrc.type == "select-one") {
			                    if (subFieldSrc.selectedIndex > -1)
				                    value = value.replace(subField, subFieldSrc.options[subFieldSrc.selectedIndex].text);
			                } 
        					else if (subFieldSrc.type == 'checkbox') {
						        if (subFieldSrc.checked) {
						            valueText = subFieldSrc.value; subArr = valueText.split(cSEP);
						            valueText = subArr[0];
							        value = value.replace(subField, valueText);
						        }
						        else
							        value = value.replace(subField, '');
        					}
					        else if (subFieldSrc.length > 1 && eval('document.' + theForm + '.' + subItem + '[0].type') == 'radio') {
						        for (var k = 0; k < subFieldSrc.length; k++ ) {
							        if (subFieldSrc[k].checked) {
							            valueText = subFieldSrc[k].value; subArr = valueText.split(cSEP);
							            valueText = subArr[0];
								        value = value.replace(subField, valueText);
								        break;
							        }	
						        }
			                }
			                else {
				                value = value.replace(subField, subFieldSrc.value);
			                }
                        }
                        
    					subIndex = endChar;
   				    }
	    		}
				
				
		
				// Use this notation to trap errors
				if (eval('document.' + theForm + '[\'' + item + '\']')) {
					var destField  = eval('document.' + theForm + '[\'' + item + '\']');
                    var destDate = eval('document.' + theForm + '[\'DT' + item + '\']');
	
	                destField.disabled = false;
	                removeElement('DisabledFields', item + '_DISABLED');
	                if (destDate) destDate.disabled = false;
	                if (value == cLOCKED) {
	                    destField.disabled = true;
	                    addElement('DisabledFields', item + '_DISABLED', destField.value);	
	                    
	                    if (destDate) destDate.disabled = true;
					}
					else if (destField.type == 'select-one' || destField.type == 'select-multiple') {
						for( var k = 0; k < destField.options.length; k++ ) {
							if (destField.options[k].value == value || destField.options[k].text == value) {
								destField.options[k].selected = true;
								if (destField.type == 'select-one') { break; }
							}
						}
					}
					else if (destField.type == 'checkbox') {
						if (value.toLowerCase() == 'checked')
							destField.checked = true;
						else
							destField.checked = false;
					}
					else if (destField.length > 1 && eval('document.' + theForm + '.' + item + '[0].type') == 'radio') {
						for (var k = 0; k < destField.length; k++ ) {
							if (destField[k].value == value) {
								destField[k].checked = true;
								break;
							}	
						}
					}
					else {
						destField.value = value;
						//eval('document.' + theForm + '[\'' + item + '\'].value=\'' + value + '\'');
		            }
		            $('#' + item.replace(':', '\\:')).trigger('blur');
				}
				curIndex = lastChar;
			}
		}  //while
	
		
	}

	return true
}

function addElement(ParentElName, NewElName, NewElValue) {
    var ParentEl = document.getElementById(ParentElName);
    var element;

    try {
        element = document.createElement('<input name="' + NewElName + '" id="' + NewElName + '" type="hidden" value="' + NewElValue + '"/>');
    } catch (e) {
        element = document.createElement("input");
        element.setAttribute("name", NewElName);
        element.setAttribute("id", NewElName);
        element.setAttribute("type", "hidden");
        element.setAttribute("value", NewElValue);
    }

    ParentEl.appendChild(element);
}

function removeElement(ParentElName, ChildElName) {

    try {
        var ParentEl = document.getElementById(ParentElName);
        var element = document.getElementById(ChildElName);
        ParentEl.removeChild(element);
    } catch (e) {
        ;
    }
}

function ConvertToBarcode(rawData) {
    var offset = 32;
    var highAscii = 18;
    var newCodeString = new Array(rawData.length + 3);
    newCodeString[0] = offset + highAscii + 104;
    var total = 104;
    for(var stringCounter = 0 ; stringCounter < rawData.length ; stringCounter++) {
	    var character = rawData.substr(stringCounter, 1);
		var ASCIIValue = character.charCodeAt(0);
		var checkDigit = ((ASCIIValue - offset) * (stringCounter + 1));
		total += checkDigit;
		newCodeString[stringCounter + 1] = ASCIIValue;	
    }
    var check = total % 103;
   
    var holder = 0;
    if(check + offset >= 127) {
		holder = check + offset + highAscii;        
    } else {
		holder = check + offset;     
    }
    newCodeString[newCodeString.length - 2] = holder;
    holder = 106 + offset + highAscii;
    newCodeString[newCodeString.length - 1] = holder;
    for(var rCounter = 0 ; rCounter < newCodeString.length ; rCounter++) {
        if(newCodeString[rCounter] == 32) {
            newCodeString[rCounter] = 128;
        }
    }

    var strString = '';
	for (var i in newCodeString) {
		//strString += unescape('&#' + newCodeString[i]);
		strString += String.fromCharCode(newCodeString[i]);
    }
   return symbolsToEntities(strString);

    //return getBarcodeText(newCodeString);
}

function symbolsToEntities(sText) {
	var sNewText = "";
	var iLen = sText.length;
	for (i=0; i<iLen; i++) {
		iCode = sText.charCodeAt(i);
		sNewText += (iCode > 127? "&#" + iCode + ";": sText.charAt(i));
	}
	return sNewText;
}

function getBarcodeText(codeString) {
var returnVal = '';
	//var returnVal = "<p align = \"center\" style=\"font-size:16.0pt;mso-bidi-font-size:16.0pt;font-family:Code128bWinLarge\">";
	for(var counter = 0 ; counter < codeString.length ; counter++) {  
	     var intValue = codeString[counter];
		returnVal += String.fromCharCode(parseInt(intValue));
    }
    //returnVal += "</P>";
    return returnVal;
}





function getkey(e)
{
	if (window.event)
	   return window.event.keyCode;
	else if (e)
	   return e.which;
	else
	   return null;
}

function toHex(d) {
var hD="0123456789ABCDEF";
var h = hD.substr(d&15,1);
	while(d>15) {d>>=4;h=hD.substr(d&15,1)+h;}
	return h;
}

// http://www.developer.irt.org/script/number.htm
