var MULTIPLE_TEXT_DATA_SEPARATER=",";

//array(T, G, M, k, m, micro, n, p, f) magnitude represented in original DCT values
var magValueArray = new Array(0.000000000001, 0.000000001, 0.000001, 0.001, 1000, 1000000, 1000000000, 1000000000000,1000000000000000);

// Jyotsna 1/20/2008 array(T, G, M, k, m, micro, n, p, f) magnitude represented in whole numbers
var magValueConvertedArray = new Array(1000000000000, 1000000000, 1000000, 1000, 1000, 1000000, 1000000000, 1000000000000,1000000000000000);

// Naga 1/21/2008 array(T, G, M, k, m, micro, n, p, f) magnitude represented in whole numbers
// This conversion of default magnitude is needed as the default magnitude we get from XML are as below
var defaultMagnitudeArray = new Array(0.000000000001, 0.000000001, 0.000001, 0.001, 1000, 1000000, 1000000000, 1000000000000,1000000000000000);


function displayFilteredSelectionTable(filterString, filterParam) {
	var tableId = 'selectionTable'	

	$("input#viewinteractivebtn").hide();
	$("div#prodseltable").hide();
	
	// Stripping white-spaces and new lines in the html.
	var browserIE=document.all?1:0			
	if (!browserIE){
//		var sortTimeStart = (new Date()).getTime();
		cleanWhitespace(tableId);
//		var sortTimeEnd = (new Date()).getTime();
//		alert("Time taken for cleanWhitespace method: "+ (sortTimeEnd-sortTimeStart));
	}
	
//	var preFilterTimeStart = (new Date()).getTime();
	filterParamArr = filterParam.split(',');
	if (null != filterString) {
		doPreFilter(filterString,filterParamArr);
	}
//	var preFilterTimeEnd = (new Date()).getTime();
	
	if ("" == $("table#" + tableId).find('tbody').html()) {
		$("table#" + tableId).find('tbody').html("<tr><td colspan='" + (numberOfColumns + 1) + "'><b>Sorry, there are no generics to display.</b></td></tr>");
	} 
	
//	$("div#product_similartab_table").find('span').remove();
	$("input#viewinteractivebtn").show();
	$("div#prodseltable").show();
	
	hideNoDisplayColumns(tableId);
	
//	var endTime = (new Date()).getTime();
//	alert("Time taken for displaySelectionTable method: " + (endTime-baseMillis)+ " and time for pre Filtering : " + (preFilterTimeEnd-preFilterTimeStart) );
}

function hideNoDisplayColumns(tableId) {
	var i=1;	
	$("table#" + tableId).find("thead th.headerinfo").each(function() {
	   displayVal = this.attributes["displaycolumn"].value;	   
	  if (displayVal == "false") {
		   hideColumn(tableId, i+1);
	   }
	   i++;
	});	
}

function doPreFilter(filterString,filterParam) {
	var paramId;
	var filterOperator;
	var filterValue;
	var keyword;
	var colIndx;
	var tableId;
	var absolute = true;
	
	var allFilters = filterString.split('@#@');			
	if(null != allFilters) {
		for(var i = 0; i < allFilters.length; i++) {
			var filterInfo = allFilters[i].split(':');
			paramId = filterInfo[0];
			filterOperator = filterInfo[1];
			filterValue = filterInfo[2];
			
			keyword = filterOperator + ':' + filterValue;
			tableId = 'selectionTable';
			
			if(filterParam.contains(paramId)){
				colIndx= getProdSTColumnIndexForParamId(tableId, paramId);
				if (colIndx!=0){
					applyQuickFilter(colIndx, tableId, keyword, absolute,paramId);
				}
			}
		}
	}
}

function applyQuickFilter(columnNdx, tableId, keyword, absolute,paramId) {
	var index = null;
	var rows = $("table#" + tableId).find('tbody tr').get();
	var currentRow = rows[0];
	var rowsNdx = 0;
	var numberOfRows = rows.length;
	for (rowsNdx=0; rowsNdx < numberOfRows; rowsNdx++) {
		currentRow = rows[rowsNdx];
		if($(currentRow).is(':visible')) {
		var columnText =currentRow.childNodes[columnNdx].innerHTML;
		var sortAttribute = currentRow.childNodes[columnNdx].attributes["sortValue"];
		var sortValue = (sortAttribute != undefined) ? sortAttribute.value : "";

		var paramIdAttribute = currentRow.childNodes[columnNdx].attributes["id"];
		var parameterId = (paramIdAttribute != undefined) ? paramIdAttribute.value : "";	   
		
		if (parameterId != null){
			var tokens = parameterId.split("-");
			var key1= tokens[0];
			var key2= tokens[1];
			if (key1 != null && key2 != null){
				flag = true;
				if(key1 == paramId ){
					index=0;
				} else if( key2 == paramId){
					index=1;	
				}
			}
		}
		
		var showflag = false;

		 // Get the datatype of the particular column.
		 var dataType = getProdSTColumnDataType(tableId, columnNdx);		 	
		 
		 // Now keyword is in form <operator>:<value>. so split it.
		 var fCriteria = keyword.split(':');
		 var fOp = fCriteria[0];
		 var fVal = fCriteria[1];
		
		 // Do the type specific filtering
		 if(dataType.toUpperCase() == 'DATE') {			
			// Do Date type filtering
			showflag = filterDateData(fOp, keyword, sortValue);
		} else if(dataType.toUpperCase() == 'NUMBER'){				
			// Do Numeric filtering
			showflag = filterNumericData(fOp, fVal, sortValue);				
		} else if (dataType.indexOf("grouped") != -1){
			var keyTokens = sortValue.split(",");
			//keyword = keyword;
			var sortkey = keyTokens[index];			
			showflag = filterNumericData(fOp, fVal, sortkey);
			
		} else if (dataType.toUpperCase() == 'TEXT'){			
			showflag = filterTextData(fOp, fVal, sortValue, false);					
		}
		
		if (!showflag) {
			$(currentRow).remove();
		}
		
	}
	}
	if ($("table#" + tableId).find('tbody tr').get().length == 0) {
		$("div#product_similartab_table").html("<span><b>Sorry, there is no selection table to display.</b></span>");
	}
}

function getProdSTColumnIndexForParamId(tableId, paramId) {
	var counter = 0;
	var allTDs = $("table#" + tableId).find('thead > tr > th.centered');
	if(null != allTDs) {
		for(var i = 1; i < allTDs.length; i++) {
			var tdId = allTDs[i].id;
			if(!isStringEmpty(tdId)) {
				var tokens = tdId.split("-");
				var key1= tokens[0];
				var key2= tokens[1];
				if (key1 != null && key2 != null){
					if(key1 == paramId || key2 == paramId){
						counter = i;
						break;
					}
				}
				else if(tdId == paramId) {
					counter = i;
					break;
				}
			}
		}
	}
	return counter;
}

function getProdSTColumnDataType(tableId, colIndex) {
	var dataType = "";
	$("table#" + tableId).find('thead > tr > th.centered').filter(':nth-child('
			+ (colIndex+1) + ')').each(function() {
		dataType = this.attributes["dataType"].value;
	});
	return dataType;
}


function generatePssFilterString(json) {
	var filterXmlStr = "&lt;productpage_ps_query";
	filterXmlStr += " productline=";
	filterXmlStr += "&quot;";
	filterXmlStr += json.IstSelectionTable.paramQuery.productLine;
	filterXmlStr += "&quot;";
	filterXmlStr += "&gt;";
	
	$(json.IstSelectionTable.paramQuery.parameters.PssParameter).each(function() {
		filterXmlStr += "&lt;";
		filterXmlStr += "parameter id=";
		filterXmlStr += "&quot;";
		filterXmlStr += this.id;
		filterXmlStr += "&quot;";
		filterXmlStr += " value=";
		filterXmlStr += "&quot;";
		filterXmlStr += this.value;
		filterXmlStr += "&quot;";
		filterXmlStr += " PriorityFlag=";
		filterXmlStr += "&quot;";
		filterXmlStr += this.priority;
		filterXmlStr += "&quot;";
		filterXmlStr += " DisplayFlag=";
		filterXmlStr += "&quot;";
		filterXmlStr += this.displayFlag;
		filterXmlStr += "&quot;";
		filterXmlStr += "/&gt;";

	});
	filterXmlStr += "&lt;";
	filterXmlStr += "/productpage_ps_query";
	filterXmlStr += "&gt;";
	
	return filterXmlStr;
}
/* Added Functions used for Product page */ 

var notWhitespace = /\S/;

function cleanWhitespace(tableId) {
	var $tableObj = $("table#" + tableId);
	var rows = $('tbody  tr', $tableObj).get();
	var rowsNdx = 0;
	var numberOfRows = rows.length;	
	var currentRow = rows[0];

	for (rowsNdx=0; rowsNdx < numberOfRows; rowsNdx++) {
		var currentRow = rows[rowsNdx];
		
		for (var x = 0; x < currentRow.childNodes.length; x++) {
			var childNode = currentRow.childNodes[x]
			if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
				// that is, if it's a whitespace text node
				currentRow.removeChild(currentRow.childNodes[x])
				x--
			}
			/*if (childNode.nodeType == 1) {
				// elements can have text child nodes of their own
				cleanWhitespace(childNode)
			}*/
		}
	}

	rows = null;
	currentRow = null;	
	
}

function hideColumn(tableId, column){	
	var columnArray = new Array();
	columnArray[0] = column;	
	hideColumns(tableId, columnArray);
}


function filterDateData(oper, value, data) {
	var checkValue = false;

	var dateVal = getDateObject(value, '/');
	var dateData= getDateObject(data, '/');

	if('<' == oper || 'lt' == oper) {
		if(dateData < dateVal) {
			checkValue = true;
		} else {
			checkValue = false;
		}
	}
	else if('>' == oper || 'gt' == oper) {
		if(dateData > dateVal) {
			checkValue = true;
		} else {
			checkValue = false;
		}
	}
	else if('==' == oper || 'eq' == oper) {
		if(dateData == dateVal) {
			checkValue = true;
		} else {
			checkValue = false;
		}
	}
	else if('<>' == oper || 'neq' == oper) {
		if(dateData != dateVal) {
			checkValue = true;
		} else {
			checkValue = false;
		}
	} else {
		checkValue = true;
	}


	return checkValue;
}

function filterNumericData(oper, value, data) {
	var checkValue = false;

	var numVal = parseFloat(value);
//	numVal = isNaN(numVal) ? 0 : numVal;

	var numData = parseFloat(data);
//	numData = isNaN(numData) ? 0 : numData;

	if (isNaN(numVal) || isNaN(numData)) {
		if('=' == oper || 'eq' == oper) {
			checkValue = (("" + data).toUpperCase().indexOf(("" + value).toUpperCase()) != -1);
		}
		else if('<>' == oper || 'neq' == oper){
			checkValue = (("" + data).toUpperCase().indexOf(("" + value).toUpperCase()) == -1);
		}
	} else {
		if('<=' == oper || 'lteq' == oper) {
			if(numData <= numVal) {
				checkValue = true;
			}
		} else if('<' == oper || 'lt' == oper) {
			if(numData < numVal) {
				checkValue = true;
			}
		} else if('>=' == oper || 'gteq' == oper) {
			if(numData >= numVal) {
				checkValue = true;
			}
		} else if('>' == oper || 'gt' == oper) {
				if(numData > numVal) {
					checkValue = true;
				}
		} else if('=' == oper || 'eq' == oper) {
			if(numData == numVal) {
				checkValue = true;
			}
		} else if('<>' == oper || 'neq' == oper) {
			if(numData != numVal) {
				checkValue = true;
			}
		} else {
			checkValue = true;
		}
	}

	return checkValue;
}

function filterTextData(oper, keyword, sortValue, absolute) {
	var checkValue = false;

	switch(oper) {
	case 'eq':
		if(absolute) {
			checkValue = (sortValue.toUpperCase() == keyword.toUpperCase());
		} else {
			var sortValues = sortValue.split(MULTIPLE_TEXT_DATA_SEPARATER);						
			if(sortValues.length != 1) {
				checkValue = (sortValue.toUpperCase().indexOf(keyword.toUpperCase()) != -1);
			} else {			
				checkValue = (sortValue.toUpperCase() == keyword.toUpperCase());
			}
		}
		break;
	case 'neq':
		if(absolute) {
			var sortValues = sortValue.split(MULTIPLE_TEXT_DATA_SEPARATER);
			// This is required for
			if(sortValues.length != 1) {
				for(var i=0; i<sortValues.length; i++) {
					if(sortValues[i].toUpperCase() != keyword.toUpperCase()) {
						checkValue = true;
						break;
					}
				}
			} else {
				checkValue = (sortValue.toUpperCase() != keyword.toUpperCase());
			}
		} else {
			var sortValues = sortValue.split(MULTIPLE_TEXT_DATA_SEPARATER);

			if(sortValues.length != 1) {
				for(var i=0; i<sortValues.length; i++) {
					if(sortValues[i].toUpperCase().indexOf(keyword.toUpperCase()) == -1) {
						checkValue = true;
						break;
					}
				}
			} else {
				checkValue = (sortValue.toUpperCase() != keyword.toUpperCase());
			}
		}
		break;
	default:
		break;
	}

	return checkValue;
}


function getDateObject(dateStr, delimChar) {
	var vDate = new Date();
	if(!isStringEmpty(dateStr) && !isStringEmpty(delimChar)) {
		var arr = dateStr.split(delimChar);
		vDate = new Date(trim(arr[2]), trim(arr[0]), trim(arr[1]));
	}

	return vDate;
}
//function hideColumn(tableId, columnNumber) {
function hideColumns(tableId, hideColumnsArray) {

	var numberOfColumns = hideColumnsArray.length;
	var ndx = 0;
	var $tableObj = $("table#" + tableId);
	var columnNumber = 0;
	for (ndx = 0; ndx < numberOfColumns; ndx ++) {	
		 columnNumber = hideColumnsArray[ndx];
		
		 $('thead > tr > th.headerinfo', $tableObj)
				.filter(':nth-child(' +(columnNumber) + ')').each(function() {
			this.attributes["displaycolumn"].value = "false";
		});

		$('thead  td', $tableObj).filter(':nth-child('
				     + columnNumber + ')').each(function() {
			$(this).hide();
		});
		$('thead  th', $tableObj).filter(':nth-child('
				     + columnNumber + ')').each(function() {
			$(this).hide();
		});
	}
	
	//using jquery to hide a column taking more time than using DOM hierarchy
	var rows = $('tbody  tr', $tableObj).get();
	var rowsNdx = 0;
	var numberOfRows = rows.length;	
	var currentRow = rows[0];
	var childNodeCount = currentRow.childNodes.length;
	if (childNodeCount>1){
		var columnToHide = currentRow.childNodes[0];	

		for (rowsNdx=0; rowsNdx < numberOfRows; rowsNdx++) {
			var currentRow = rows[rowsNdx];
			
			for (ndx = 0; ndx < numberOfColumns; ndx ++) {
				columnNumber = hideColumnsArray[ndx];				
				columnToHide= currentRow.childNodes[columnNumber-1];	
				$(columnToHide).hide();				
			}
		}
	
		rows = null;
		currentRow = null;
		columnToHide = null;
	}
	/*$('tbody  td', $tableObj).filter(':nth-child('
			     + columnNumber + ')').each(function() {
		$(this).hide();
	});*/
}

function showColumn(tableId, column){	
	var columnArray = new Array();
	columnArray[0] = column;	
	showColumns(tableId, columnArray);
}

//function showColumn(tableId, columnNumber) {
function showColumns(tableId, showColumnsArray) {

	var numberOfColumns = showColumnsArray.length;
	var divID;
	var ndx = 0;
	var $tableObj = $("table#" + tableId);
	var columnNumber = 0;
	for (ndx = 0; ndx < numberOfColumns; ndx ++) {
	
		columnNumber = showColumnsArray[ndx];
		

		$("thead > tr > th.headerinfo", $tableObj)
				.filter(':nth-child(' +(columnNumber) + ')').each(function() {
			//this.attributes["style"].value = "display:block;";
			this.style.display = "";
		   this.attributes["displaycolumn"].value = "true";
		  // this.show();
		});

		$('thead  td', $tableObj).filter(':nth-child('
				     + columnNumber + ')').each(function() {
			this.style.display = "";
			//$(this).attributes["displaycolumn"].value = "true";
			//$(this).show();
		});
		$('thead  th', $tableObj).filter(':nth-child('
				     + columnNumber + ')').each(function() {
			this.style.display = "";
			//$(this).attributes["displaycolumn"].value = "true";
			//$(this).show();
		});
	}

	//using jquery to show a column taking more time than using DOM hierarchy	
	var rows = $('tbody  tr', $tableObj).get();
	var rowsNdx = 0;
	var numberOfRows = rows.length;
	var currentRow = rows[0];
	var childNodeCount = currentRow.childNodes.length;
	
	if (childNodeCount>1){
		var columnToHide = currentRow.childNodes[0];

		for (rowsNdx=0; rowsNdx < numberOfRows; rowsNdx++) {
			currentRow = rows[rowsNdx];
			
			for (ndx = 0; ndx < numberOfColumns; ndx ++) {
				columnNumber = showColumnsArray[ndx];		
					
				columnToHide = currentRow.childNodes[columnNumber-1];
				//if (ndx == 0)
				//	alert($(columnToHide).attributes["style"].value);
				columnToHide.style.display = "";
				//$(columnToHide).show();				
			}
		}
		rows = null;
		currentRow = null;
		columnToHide = null;
	}

	/*$('tbody  td', $tableObj).filter(':nth-child('
			     + columnNumber + ')').each(function() {
		$(this).show();
	});*/
}

/* Start of Shopping Cart Integration */
function sendToCart(theForm, Mode, Model){
	if (Mode != "" && Model != "") {
		  theForm.Action.value = Mode;
	      theForm.ModelNbr.value = Model;
	      theForm.submit ();
	}
}
/* End of Shopping Cart Integration */
//touch 1
