/*
Utility Function Library
created:		3/18/04
last modified:	6/25/04
*/

/*
Global Parameters
variables initialized with jsp data
*/
var dateFormat = 2;	//	default date format US: MM-DD-YY;
var decimalFormatType = null;	//	default decimal format
decimalFormatRegEx = null;	//	default regex for decimal format
var popWin = null;
var leadTimeValue = '';	// values passed from backend
var leadTimePast = 0;
var leadTimeFuture = 0;
var closeAll = '';		//	localized content
var expandAll = '';		//	localized content
var dateString = '';
var today = new Date();
var day = 86400000;	// a day in milliseconds
var msLead;
var msEnd;
var msPast;
var leadDate;
var endDate;
var pastDate;
var delimeter = "-";
var piecesFldName = "";
var quantityFldName = "";
var canRoundQuantity = false;	//	used to activate/deactivate the rounding function
var noRounding = false;

//Browsercheck
function lib_bwcheck(){ 
  this.ver=navigator.appVersion
  this.agent=navigator.userAgent
  this.dom=document.getElementById?1:0
  this.opera5=this.agent.indexOf("Opera 5")>-1
  this.ie5=(this.ver.indexOf("MSIE 5")>-1 && this.dom && !this.opera5)?1:0; 
  this.ie6=(this.ver.indexOf("MSIE 6")>-1 && this.dom && !this.opera5)?1:0;
  this.ie7=(this.ver.indexOf("MSIE 7")>-1 && this.dom && !this.opera5)?1:0; 
  this.ie4=(document.all && !this.dom && !this.opera5)?1:0;
  this.ie=this.ie4||this.ie5||this.ie6||this.ie7
  this.mac=this.agent.indexOf("Mac")>-1
  this.ns6=(this.dom && parseInt(this.ver) >= 5) ?1:0; 
  this.ns4=(document.layers && !this.dom)?1:0;
  this.bw=(this.ie6||this.ie5||this.ie4||this.ns4||this.ns6||this.opera5)
  return this
}
bw=new lib_bwcheck() //Browsercheck object


function openWin() {
	//	this function can be used with a variable number of arguments
	//	arguments must be in this order
	//	empty arguments need to be included as 0/false values:  value,value,0,value
	//	url is the only required value
	// args: url, width, height, scrollbars, resizable
	//	example call:  new window with width, height, no scrollbars, resizable
	//			openWin('http://somewhere.com',520,500,0,1);
	args = openWin.arguments;
	var len = args.length;
	var url,w,h,s,r,win,winName,params;
	url = args[0];
	w = len>1&&args[1]?args[1]:500;
	h = len>2&&args[2]?args[2]:500;
	s = len>3&&args[3]?args[3]:0;
	r = len>4&&args[4]?args[4]:0;
	winName = len>5&&args[5]?args[5]:"";
	params = 'width='+w+',height='+h+',scrollbars='+s+',resizable='+r;
	popWin = window.open(url,winName,params);
	popWin.focus();
}

function trimAll( strValue ) {
 var objRegExp = /^(\s*)$/;

    /*//check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }*/
    
   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}


function isNotEmpty( strValue ) {
   var strTemp = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }  
   return false;
}

function setLeadTimePast(time) {
	leadTimePast = time;
}
function getLeadTimePast() {
	return leadTimePast;
}

function setLeadTimeFuture(time) {
	leadTimeFuture = time;
}
function getLeadTimeFuture() {
	return leadTimeFuture;
}

function setLeadTimeValue(time) {
	leadTimeValue = time;
}

function getLeadTimeValue() {
	return leadTimeValue;
}

function setAllLeadTimes(lead,future,past) {
	setLeadTimeValue(lead);
	setLeadTimePast(past);
	setLeadTimeFuture(future);
}

function setDateFormat(dF) {
	//	date format string seems to return in either string on numeric form
	dateStr = dF.toLowerCase();
	dateFormat = dateStr=="dd-mm-yyyy"?1:dateStr=="mm-dd-yyyy"?2:dateStr=="yyyy-mm-dd"?3:2;
	setDateStr(dF.toUpperCase());
}

function getDateFormat() {
	return dateFormat;
}
function getDelimeter() {
	return delimeter;
}
function setDelimeter(d) {
	delimeter = d;
}

function setDateStr(str) {
	dateString = str;
}
function getDateStr() {
	return dateString;
}

function getIfFormat() {
	dateCase = getDateFormat();
	d = getDelimeter();
	switch (dateCase) {
		case 1:
			return "%d"+d+"%m"+d+"%Y";
		break;
		
		case 2:
			return "%m"+d+"%d"+d+"%Y";
		break;
		
		case 3:
			return "%Y"+d+"%m"+d+"%d";
		break;
		
		default:
			return "%m"+d+"%d"+d+"%Y";
		break;
	}
}


//	Decimal Format Functions
function validateDecimalFormat(strValue,classType)  {
	objRegExp = classType==1 ? /(^(\d{1,3})((,)?\d{3})*(\.\d{1,4})?$)/ : /(^(\d{1,3})((\.)?\d{3})*(,\d{1,4})?$)/;
	if(noRounding) {
		objRegExp = classType==1 ? /(^(\d{1,3})((,)?\d{3})*(\.\d{1,})?$)|(^(\.\d{1,})?$)/ : /(^(\d{1,3})((\.)?\d{3})*(,\d{1,})?$)|(^(,\d{1,})?$)/;
		//alert("strValue = " + strValue + " Validate returned " + objRegExp.test(strValue))
	}
	
	return objRegExp.test(strValue)
}
function setDecimalFormatType(df) {
	//	changes decimal format pattern string to number
	var val = null;
	//alert("Decimal Pattern: " + df);
	
	if(df==""||!df) return;
	if(df=="#,##0.##")
		val = 1;
	if(df=="#0.##")
		val = 2;
	if(df=="#.##0,##")
		val = 3;
	if(df=="#0,##")
		val = 4;
	decimalFormatType = val;
}
function getDecimalFormatType() {
	return decimalFormatType;
}


function getUserDecimalFormatValue(val) {
	df = getDecimalFormatType();	//	int for type of format
}


function getDecimalFormatValue(fldObj) {
	//	return entered value as js formatted value

	df = getDecimalFormatType();
	val = (typeof fldObj=="object") ? fldObj.value : fldObj;
	var regEx = /\s*/g
	val = val.replace(regEx,"");
	if(val=="") {
		return false;
	}
	
	//	decimal values are in two basic classes:
	//		period as decimal delimeter and commas as grouping delimeter
	//		periods as grouping delimeter and comma a decimal delimeter
	classType=1;
	if(df==3||df==4)
		classType=2;

	if(!validateDecimalFormat(val,classType)) {
		return false;
	}
	
	re = null;
	switch(df) {
		case 1:
			re = /,/g;
			val = val.replace(re,'');
		break;
		case 2:
			re = /,/g;
			val = val.replace(re,'');
		break;
		case 3:
			re = /\./g;
			val = val.replace(re,'');
			re = /,/;
			val = val.replace(re,'.');
		break;
		case 4:
			re = /\./g;
			val = val.replace(re,'');
			re = /,/;
			val = val.replace(re,'.');
		break;
		default:
			re = /,/g;
			val = val.replace(re,'');
		break;	
	}
	return val;

}

function setDecimalFormatValue(val) {
	//	take a js formatted decimal value and change it into the user preferred decimal format
	
	if(!val) return val;
	//	identify the user Decimal Format Preference
	df = getDecimalFormatType();
	val = val + "";	// convert to string

	//	change number for display
	switch(df) {
		case 1:
			val = addGroupDelimeter(val,',');
		break;
		case 2:
			val = val;
		break;
		case 3:
			re = /\./g;
			val = val.replace(re,',');
			val = addGroupDelimeter(val,'.');
		break;
		case 4:
			re = /\./g;
			val = val.replace(re,',');
		break;
		default:
			val = val;
		break;	
	}
	return val;
}

function setDecimalFormatFieldValue(fldObj) {
	//	for field validation, check and set the decimal formatted value of input field
	val = fldObj.value

	//	get field value and convert to js value
	if(getDecimalFormatValue(fldObj)) {
		val = getDecimalFormatValue(fldObj);
	} else {
		fldObj.value = "";
		return;
	}
	
	//	get js value as formatted value
	val = setDecimalFormatValue(val)
	
	//	set the value of the field
	fldObj.value = val;
}


function addGroupDelimeter(strValue,delim) {
	//	add commas or decimal points as group delimeters
	var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})'); 
	strValue = "" + strValue;	//	need to change to string value
	
	//check for match to search criteria
	while(objRegExp.test(strValue)) {
		//replace original string with first group match, a delimeter, then second group match
		strValue = strValue.replace(objRegExp, '$1' + delim + '$2');
	}
  return strValue;
}


//	Checks a checkbox associated with a drop down menu
function selectCheckBox(selectObj, ckBox, fieldObj) {
	if(selectObj.selectedIndex > 0) {
		ckBox.checked = true;
		fieldObj.value = "";
	}
}
function checkDateField(fieldObj, selectObj, ckBox) {
	ckBox.checked = true;
	selectObj.selectedIndex = 0;
}
function getMinRDD(daysInt) {
	daysInt = !daysInt?0:daysInt;
	daysInMilli = daysInt * day;
	today = new Date();
	todayInMilli = today.getTime();
	return new Date(todayInMilli + daysInMilli);
}

function toDateString(dateObj) {
	m = dateObj.getMonth()+1;
	m = m < 10 ? "0" + m : m;
	d = dateObj.getDate();
	d = d < 10 ? "0" + d : d;
	y = dateObj.getYear() < 100 ? 2000+parseInt(dateObj.getYear()) : dateObj.getYear() < 1000 ? 1900+parseInt(dateObj.getYear()) : dateObj.getYear();
	return m + "/" + d + "/" + y;
}

function localizeDate(dateObj) {
	//	pass in a standard JS date string and convert into the localized date
	dateCase = getDateFormat();
	dateArr = dateObj.split("/");
	
	rStr = "";
	delimiter = "-";
	rM = dateArr[0];
	rD = dateArr[1];
	rY = dateArr[2];
	
	switch (dateCase) {
		//	DD-MM-YYYY
		case 1:
			return rD + delimiter + rM + delimiter + rY;
		break;
		//	MM-DD-YYYY
		case 2:
			return rM + delimiter + rD + delimiter + rY;
		break;
		//	YYYY-MM-DD
		case 3:
			return rY + delimiter + rM + delimiter + rD;
		break;
		//	MM-DD-YYYY
		default:
			return rM + delimiter + rD + delimiter + rY;
		break;
	}
}

function deLocalizeDate(dateStr) {
	//	pass in localized date and return a javascript friendly date format
	dateCase = getDateFormat()
	re = /(\d{1,4})(\D)(\d{1,4})(\D)(\d{1,4})/g
	
	switch (dateCase) {
		case 1:
			newDateStr = dateStr.replace(re,"$3/$1/$5")
		break;
		case 2:
			newDateStr = dateStr.replace(re,"$1/$3/$5")
		break;
		case 3:
			newDateStr = dateStr.replace(re,"$3/$5/$1")
		break;
		default:
			newDateStr = dateStr.replace(re,"$1/$3/$5")
		break;
	}
	return toDateString(new Date(newDateStr));
}

function compareDates(dateStr1, dateStr2) {
	date1 = new Date(dateStr1)
	date2 = new Date(dateStr2)
	//alert(date1 + " " + date2)
	if(date1.getTime() > date2.getTime())
		return 0
	return 1
}

function disableDates(newDate) {

	var ms_lead, ms_send, ms_past, lead_date, end_date, past_date, ltf, ltp, ltv;
	ltf = getLeadTimeFuture();
	ltp = getLeadTimePast();
	ltv = getLeadTimeValue();
	
	if(ltf==0 && ltp==0 && ltv==0) { return;}
	
	end_date = ltf != 0 ? ltf * day : 0;
	past_date = ltp != 0 ? ltp * day : 0;
	
	var disableType = past_date==0 ? 1 : 0;
	
	if(ltv && (typeof ltv)=="string") {
		lead_date = new Date(ltv)
		ms_lead = lead_date.getTime();
	} else if(ltv && (typeof ltv)=="number") {
		ms_lead = today.getTime() + (ltv * day);
	} else if(ltv==0) {
		ms_lead = today.getTime();
	}
	
	if(end_date!=0)
		ms_send = today.getTime() + end_date;
	if(past_date!=0)
		ms_past = today.getTime() - past_date;
	
	//	disable these dates
	//	two types of searches:  1. Search -- 90 days back, 2. RDD -- leadtime and delivery window (1 yr.)
	if(disableType) {
		if(ms_lead > newDate.getTime() || ms_send < newDate.getTime() || newDate.getDay()==0 || newDate.getDay()==6)
			return true;
	} else {
		if(newDate.getTime() < ms_past || (today.getTime()+day) < newDate.getTime())
			return true;
	}
	return false; 
}

function passDuplicateID(action, ID) {
	//	For Backend duplicate funtion
	//	sets the value of the hidden field then submits form
	//	make sure this points to the correct form!
	
	formObj = document.forms[0];
	if(!formObj || !formObj.duplicate) { return; }
	formObj.duplicate.value = ID?ID:0;
	formObj.action = action;
	formObj.submit();
}


function passDeleteID(action, ID) {
	//	sets the value of the hidden field then submits form
	//	make sure this points to the correct form!
	formObj = document.forms[0];
	formObj.deleteId.value = ID?ID:0;
	formObj.action = action;
	formObj.submit();
}




//	Front End Duplicate and Delete Functions

var dupeRowCount = 0;	//	total count of all current and added rows

function duplicateRow(objID) {
	
	if(!objID) {return;}
	
	//	extract the row id# from the id string
	uIndex = objID.indexOf("_")
	rowid = parseInt(objID.substring(uIndex+1));
	
	//	get table object
	var tableNode = document.getElementById("data");
	tableNode = tableNode.tBodies[0];
	
	//	get table rows length
	len = tableNode.rows.length;
	
	//	clone the row with given row id#
	dupeRow = document.getElementById(objID).cloneNode(true);

	
	//	search new row content for any index number
	//	increment all index numbers
	
	//	find and replace all old ID's with new ID's
	re = new RegExp();
	replaceID = re.compile("_" + rowid,"gi");
	dupeID = "_" + dupeRowCount++;
	document.forms[0].count.value = dupeRowCount;	//	pass count to BE for loop check
	dupeRow.setAttribute("id","dd" + dupeID);
	
	
	//	take the cloned row and replace old id with new id
	//	ie balks on commented code!
	for(i=0;i<dupeRow.childNodes.length; i++) {
		if(dupeRow.childNodes[i].innerHTML) {
			dupeRow.childNodes[i].innerHTML = dupeRow.childNodes[i].innerHTML.replace(replaceID,dupeID);
		}
	}
	

	//	put cloned row into a new array of table rows
	//	since you are adding a row, account for this extra row in the loop
	
	var newRows = new Array();
	var k = 0;	//	when new row is added -1 from old table row index below

	for(i=0; i<len+1; i++) {
		cnt = i-1<0?0:i-1;
		if(tableNode.rows[cnt].getAttribute("id")==objID) {	//	is previous row the selected row?  add new row here
			newRows[i] = dupeRow;
			k = -1;
			//alert(newRows[i].innerHTML);
		} else {
			newRows[i] = tableNode.rows[i+k];	//	keep adding old table rows
		}
	}
	
	//	build new table rows
	
	for(j=0; j < newRows.length; j++) {
		tableNode.appendChild(newRows[j]);
	}
	
	var fill = false;
	for(k=0; k < newRows.length; k++) {
		if(tableNode.rows[k].className.indexOf("rowColor") > -1) {
			tableNode.rows[k].className = fill?"rowColorB":"rowColorA";
			fill = !fill;
		}
	}
	
	//	hide calendar icon from IE due to IE security issues
	calImgId = "calDateTrigger" + dupeID;
	calImg = document.getElementById(calImgId);
	if(bw.ie&&calImg){calImg.style.display = "none"};
	
	//	show delete link
	deleteId = "delete" + dupeID;
	deleteLink = document.getElementById(deleteId);
	deleteLink.style.display="block";
}

function deleteRow(objID) {
	//	get table object
	var tableNode = document.getElementById("data");
	tableNode = tableNode.tBodies[0];
	
	//	find row with the matching id
	for(i=0;i<tableNode.rows.length;i++) {
		if(tableNode.rows[i].getAttribute("id")==objID) 
			tableNode.deleteRow(i);
	}
	
	var fill = false;
	for(k=0; k < tableNode.rows.length; k++) {
		if(tableNode.rows[k].className.indexOf("rowColor") > -1) {
			tableNode.rows[k].className = fill?"rowColorB":"rowColorA";
			fill = !fill;
		}
	}
}


//	request pricing swap function
//		params:
//			ind : int = row index
//			n : int = index of element clicked, e.g., pieces, kgs, lbs
function quantitySwap(ind,n) {
	quantityArr = new Array('pieces','kgs','lbs')
	target1 = 'quantityText_' + ind + '_1';
	target2 = 'quantityText_' + ind + '_2';
	target3 = 'quantityText_' + ind + '_3';
	targetVal = eval('var_' + quantityArr[n]);
	quantityBar = 'quantityBar_' + ind;
	divText = '';
	spanStart = '<span class="selected">';
	spanEnd = '</span>';
	hiddenFld = eval('document.forms[0].quantityType_' + ind);
	
	//	rewrite the quantityBar
	for(i=0;i<quantityArr.length;i++) {
		if(i==n) {
			divText += spanStart;
			divText += eval('var_' + quantityArr[i]);	//	localized text in css.jsp
			divText += spanEnd;
		} else {
			divText += '<a href="javascript: quantitySwap(' + ind + ',' + i + ')">';
			divText += eval('var_' + quantityArr[i]);	//	localized text
			divText += '</a>';
		}
		divText += i!=2?' &nbsp;|&nbsp; ':'';
	}
	document.getElementById(quantityBar).innerHTML = divText;
	
	//	rewrite the quantity values
	document.getElementById(target1).innerHTML = targetVal;
	document.getElementById(target2).innerHTML = targetVal;
	document.getElementById(target3).innerHTML = targetVal;
	
	//	set the quantity value of the hidden field
	switch (n) {
		case 0:
			hiddenFld.value = "EA";
			break;
		case 1:
			hiddenFld.value = "KG";
			break;
		case 2:
			hiddenFld.value = "LB";
			break;
		default:	
			hiddenFld.value = "EA";
			break;
	}
}


