function setAttributeFilterDisplay(displayValue){
	if (displayValue == '' || displayValue == 'none'){
		var rows = document.getElementsByTagName('tr');
		for (var i=0; i < rows.length; i++) {
			if (rows[i].id == 'attribute_filter') {
				rows[i].style.display = displayValue;
			}
		}
		document.getElementById('attribute_filter_hide').style.display = displayValue;
		document.getElementById('attribute_filter_show').style.display = (displayValue == 'none') ? '' : 'none';
		
	}
}

var rows_highlighted = getElementsByClassName('partrow1');
var rows_nonhighlighted = getElementsByClassName('partrow');
var rows = rows_highlighted.concat(rows_nonhighlighted);
var filters = getElementsByClassName('filter');

function showAllPartRows(){
	for (var i=0; i < rows.length; i++){
		rows[i].style.display = '';
	}
}

function uncheckAllbox(){
	for (var i=0; i < filters.length; i++){
		filters[i].checked =false;
	}
}

function filterhide(attributeId, value)
{	
	var attributeName = 'attribute' + attributeId + '=\\[' + value + '\\]';
	
	for (var i=0; i < rows.length; i++){
		if (value != '' && rows[i].getAttribute('product_attributes').search(attributeName) == -1 ){
			rows[i].style.display = 'none';
		}
	}	
}

function clearFilters()
{
	showAllPartRows();	
	uncheckAllbox();
	$('filterwarning').style.display = 'none';
}

function applyAllFilters(filterPrefix)
{	
	showAllPartRows();
	for (var i=0; i < filters.length; i++){
		if (filters[i].value != ''){
			var filterid = filters[i].name.substring(filterPrefix.length);
			filterhide(filterid, filters[i].value);
			$('filterwarning').style.display = 'block';
		}
	}	
}

function applyCheckboxFilters(filterPrefix)
{	
	showAllPartRows();
	var attributelists = new Array();
	var checkedFilters = new Array();
	
    for (var i=0; i < filters.length; i++){
    
		if (filters[i].checked == true){		  
			var filterid = filters[i].name.substring(filterPrefix.length);
			if (filters[i].value !='') attributelists.push( 'attribute' + filterid  + '=[' + filters[i].value + ']');
			else if (filters[i].value =='') attributelists.push( 'attribute' + filterid  + '=[unknown]');
			checkedFilters.push(filterid);
			$('filterwarning').style.display = 'block';
			
		}	
	}
	checkboxfilterhide(checkedFilters, attributelists);
	
}

function getDistinctCheckedColumns(checkedFilters){
 
    var a = [], i, l = checkedFilters.length;
     var b = checkedFilters.join();
     for( i=0; i<l; i++ ) {
      var item = checkedFilters[i];
       // this loop works for IE and Firefox 
       if  ( b.indexOf(item) == b.lastIndexOf(item) ) 
        {
           a.push(checkedFilters[i]);
         }
        b= b.slice(item.length+1, b.length);
     }
     return a;    
}

function getCheckedNameByColumns(checkedColumnNames,columnID)
{
     var a = [], i, l = checkedColumnNames.length;
    
     for( i=0; i<l; i++ ) 
     {        
          // change this a little on 20080730 
          if( checkedColumnNames[i].indexOf((columnID+"=")) >= 0 ) 
          {            
            a.push(checkedColumnNames[i]);
          }          
     }   
     return a;
}

function checkboxfilterhide(columns, attributeNames)
{
	var checkedColumns = getDistinctCheckedColumns(columns);	

	for (var i=0; i < rows.length; i++)
	{  
	     var match = false;	   
	 
	      for ( var j=0; j<checkedColumns.length; j++)
	      {
    	      // same column with union 
    	      var checkedColumnNames = getCheckedNameByColumns(attributeNames,checkedColumns[j]);

						for (var k=0; k< checkedColumnNames.length; k++)
						{    	         
										var checkedColumnName = checkedColumnNames[k];        	       
										if (checkedColumnName.indexOf('unknown')<=0)
										{
												 if (rows[i].getAttribute('product_attributes').indexOf(checkedColumnName)>0)
														{
															 match = true; 
															 break;	                   
														}	
												 else match = false;  
										}
						        
										// check unknown
									 if (checkedColumnName.indexOf('unknown')>0)
									 {
												if(rows[i].getAttribute('product_attributes').indexOf('attribute'+checkedColumns[j])<=0)
												{    	                    
													 match = true; 
													 break;	                   
												}	
												else match = false;  
										}   
						        	                               	                  
						}   // end of for k
	                         
						if (match == false)
						{
							 var checkboxes = getElementsByClassName('comparecheckbox', 'input', rows[i])
							 for (var k=0; k < checkboxes.length; k++){
									// should only be one, but roll through all just in case
									checkboxes[k].checked = false;
							 }
							 rows[i].style.display = 'none';	                 
							 break;
						}
            
	       } // second nested loop , end of for j
	        
	    }// first nested loop for products, end of for i 
}


function setFilterDisplay(value){
	$('filters2').style.display = value;	
	$('filter_show').style.display = (value == 'none') ? 'inline' : 'none';
	$('filter_hide').style.display = (value == 'none') ? 'none' : 'inline';
}

// client-side sorting 

// need to use global variables here because sort() can't send in extra parameters to compareRows()
var gSortBy = '';
var gSortDirection = '';

function compareRows(productRowA, productRowB){
	var result = 0;
	
	// numerical sort
	if (gSortBy == 'price'){
		result = stripCommas( $(gSortBy + '_' + productRowA.id).innerHTML ) 
			- stripCommas( $(gSortBy + '_' + productRowB.id).innerHTML );
	}
	
	// lexical sort
	if (gSortBy == 'product_code' || gSortBy == 'manufacturer' || gSortBy == 'system_name'){
		if ( $(gSortBy + '_' + productRowA.id).innerHTML > $(gSortBy + '_' + productRowB.id).innerHTML){
			result = 1;
		}
		else if ( $(gSortBy + '_' + productRowA.id).innerHTML < $(gSortBy + '_' + productRowB.id).innerHTML){
			result = -1;
		}
	}
	
	if (gSortDirection == 'descending'){
		result = -result;
	}
	
	return result;
}

function sortProducts(sortBy, sortDirection){

	if (sortDirection == 'toggle' && gSortBy == sortBy){
		gSortDirection = (gSortDirection == 'descending' ? 'ascending' : 'descending');
	}
	else {
		gSortDirection = (sortDirection == 'descending' ? 'descending' : 'ascending');
	}
	gSortBy = sortBy;
	
	
	if ($('pleasewait')) {
		$('pleasewait').style.display = 'inline';
	}  // display "please wait" notice

	// change sort indicators
	var sortLinks = getElementsByClassName('sortlink');
	for (var i=0; i < sortLinks.length; i++){
		sortLinks[i].style.fontWeight = 'normal';
		sortLinks[i].innerHTML = sortLinks[i].innerHTML.replace(/ [\u25b2\u25bc]/,''); // removes down- or up-pointing filled triangle
	}
	$('sort_' + sortBy).style.fontWeight = 'bold';
	$('sort_' + sortBy).innerHTML = $('sort_' + sortBy).innerHTML + ' ' + currentSortArrow(sortBy);

	window.setTimeout("doSort()", 1); // finish this function but trigger doSort

}

function doSort(){	
	rows_nonhighlighted = mergesort(rows_nonhighlighted);
   
	// write sorted rows to parts table	
	var oldTableBody = $('partsbody');
	var newTableBody = document.createElement('tbody');
	newTableBody.setAttribute('id','partsbody');
	
	for (var i=0; i < rows_highlighted.length; i++){
		newTableBody.appendChild(rows_highlighted[i].cloneNode(true));
	}
	
	for (var i=0; i < rows_nonhighlighted.length; i++){
		newTableBody.appendChild(rows_nonhighlighted[i].cloneNode(true));
	}
	
	// I can't get assignment to innerHTML to work in IE7, so I use replaceChild() instead
	//document.getElementById('partsbody').innerHTML = newTableBody.innerHTML;
	oldTableBody = oldTableBody.parentNode.replaceChild(newTableBody, oldTableBody);
   
	// new sort means new row references (for filters)
	// new rows will get double size of it,need to do 
	rows_highlighted = getElementsByClassName('partrow1');
    rows_nonhighlighted = getElementsByClassName('partrow');
    rows = rows_highlighted.concat(rows_nonhighlighted);
	filters = getElementsByClassName('filter');

 	// hide "please wait" notice
	if ($('pleasewait')) {
		$('pleasewait').style.display = 'none';
	}

}

function currentSortArrow(sortBy){
	var result = '';
	if (gSortBy == sortBy){
		if (gSortDirection == 'descending'){
			result = '\u25bc';  // down-pointing filled triangle
		}
		if (gSortDirection == 'ascending'){
			result = '\u25b2';  // up-pointing filled triangle
		}
	}
	return result;
}

/* need to implement mergesort here because IE6 Array.sort() is too slow */
function mergesort(arr)
{
   var left = new Array();
   var right = new Array();
   var len = arr.length;

   if (len <= 1) return arr;

   var middle = Math.floor(len / 2);
   for (var i = 0; i < middle; i++) left.push(arr[i]);
   for (var i = middle; i < len; i++) right.push(arr[i]);

   left = mergesort(left);
   right = mergesort(right);

   return merge(left, right);
}

function merge(left, right)
{
   var retval = new Array();
   while(left.length > 0 && right.length > 0)
   {
      if (compareRows(left[0], right[0]) <= 0) retval.push(left.shift());
      else retval.push(right.shift());
   }

   if (left.length > 0) return retval.concat(left);
   if (right.length > 0) return retval.concat(right);

   return retval;
}

function toggleCheckAllCompare(){

	var checkboxes = getElementsByClassName('comparecheckbox');
	var numberChecked = 0;

	for (var i = 0; i < checkboxes.length; i++){
		if (checkboxes[i].checked) numberChecked++;
	}
	
	// if all checked, then uncheck all; otherwise check all
	for (var i = 0; i < checkboxes.length; i++){
		checkboxes[i].checked = (numberChecked != checkboxes.length);
	}	
}

//********************************************
//Summary   check all hidden attribute value
//********************************************
function checkNextSbiling(o,name)
{
    var nodes = o.nextSibling.nextSibling.childNodes;
    for(var i=0;i<nodes.length;i++)
    {
       nodes[i].childNodes[0].checked = o.checked;
    }
    applyCheckboxFilters(name)
}
