

var W3CDOM = (document.createElement && document.getElementsByTagName);

var tpPFamilies  = new Array();
var tpProductsInFamilies = new Array();
var tpProductIds = new Array();


var tpPFilters = new Array();


var tpRowPrefix = "tpProduct_";
var tpFamilyRowPrefix = "tpFamily_";


var tpLFDef = [7, 0, 0];
// var tpLF    = [7, 0, 0];
var tpLF    = [0,0,0];


var tpProductRows = new Array();
var tpFamilyRows = new Array();
var tpLoadedRows = false;

function tpSH( e, f ) {
	if (!W3CDOM) return;
	if  ( null == e ) return;
	var o = document.getElementById( e );
	if ( o ) f ? o.style.display='' : o.style.display='none' ;
	return;
}


function tpSHo1(o,f){ (o)?(f?o.style.display='':o.style.display='none'):0; }
function tpSHo ( o, f ) {
	if ( o ) 
		o.style.display = (f) ? '' : 'none';
	return;
}

function tpSetClass( o, c) { if ( o ) o.className = c; }


function tpCheckFilter( mask, filter ) {
	var r = true;
	
	var v = false;
	var c = false;
	var m = 0;
	var f = 0;
	
	var maskLen = mask.length;
	for ( i = 0; i < maskLen; i++ ) {
		v = false;
		m = mask[i];
		f = filter[i];
		if ( tpLFDef[i] == m ) {
			v = true;
		} else if ( (tpLFDef[i] == 0) && ( m != 0 ) && ( 0 == f ) ) {
			// for selects the default is zero. when the mask is non-zero, don't show product that have 'nothing' set
			v = false;
		} else if ( (tpLFDef[i] != 0) && ( m == 0 ) ) {
			// for checkboxes the default is non-zero. when the mask is zero, show all products
			v = true;
		} else {
			c = (m & f);
			if ( 0 != c )
				v = true;
		}
		r = r && v;
	}
	return r;
}



function tpLoadRows( productPrefix, familyPrefix ) {

	var  familyProducts;
	var cnt=0;
	for( i=0; i<tpPFamilies.length; i++ ) {
		tpFamilyRows[i] = document.getElementById( familyPrefix + tpPFamilies[i] );
		familyProducts = tpProductsInFamilies[i];
		for( j=0; j < familyProducts.length; j++ ) {
			tpProductRows[cnt] = document.getElementById( productPrefix + familyProducts[j] );
			cnt++;
		}
	}
	tpLoadedRows = true;
	return;
}

function tpLoadRows2( productPrefix ) {
	var o;
	for( j=0; j < tpProductIds.length; j++ ) {
		o = document.getElementById( productPrefix + tpProductIds[j] );
		if ( o ) {
			o.tpProductId = tpProductIds[j];
			tpProductRows[j] = o;
		}
	}
	tpLoadedRows = true;
	return;
}


function tpApplyFilter( mask ) {
	if ( !tpLoadedRows ) tpLoadRows( tpRowPrefix, tpFamilyRowPrefix );
	var i = 0;
	
	for( i=0; i < tpFamilyRows.length; i++ ) tpSHo( tpFamilyRows[i], true );
	for( i=0; i < tpProductRows.length; i++ ) tpSHo( tpProductRows[i], true );
	
	var show = false;
	var cntVisible = 0;
	var cnt=0;
	for( i=0; i<tpPFamilies.length; i++ ) {
		familyProducts = tpProductsInFamilies[i];
		cntVisible = 0;
		for( j=0; j < familyProducts.length; j++ ) {
			show = tpCheckFilter( mask, tpPFilters[cnt] );
			if ( show ) {
				cntVisible++;
			} else {
				document.getElementById("tpChk_" + familyProducts[j]).checked = false;
			}
			tpSHo( tpProductRows[cnt],  show);  // hide or show
			
			tpSetClass( tpProductRows[cnt], ( 1 == (cntVisible & 1) ) ? 'contentAlternateRowColorOdd' :  'contentAlternateRowColorEven' ) ; 
			cnt++;
		}
		tpSHo( tpFamilyRows[i], (cntVisible > 0) ); // hide or show the family header row
	}
	return;
}



function tpUpdateFilter( o, xbyte ) {
	var mask;
	if ( o.tagName.toUpperCase() == 'SELECT' ) {
		mask = o.options[o.selectedIndex].value;
		tpLF[xbyte] = Number( mask );
	} else if ( ( o.tagName.toUpperCase() == 'INPUT' ) && ( o.type.toUpperCase() == 'CHECKBOX' ) ) {
		mask = o.value;
		mask = Number( mask );
		// 'all' handling for checkboxes
		if ( tpLFDef[xbyte] == mask ) {		
			if ( o.checked ) 
				tpLF[xbyte] = mask;
		} else {
			tpLF[xbyte] = tpLF[xbyte] ^ Number( mask );
		}
		tpSetCheckboxFilters( tpLF[xbyte] );
	} else {
		return;
	}
	
	tpApplyFilter( tpLF );
	
	return;	
}


function gup( name ) {
	// escape brackets that may confuse regexp
	name = name.replace("[","\\[").replace("]","\\]");
	var regexS = "[\?&]" + name + "=([0-9-]*)";
	var regex = new RegExp( regexS );
	var results = regex.exec( window.location.search );
	if( results == null )
		return "";
	else
		return results[1];
}

function parseQueryString( key ) {
	var val = gup( key );
	return val.split( "-" );
}

function tpFilterProducts( setClass ) {
	if ( !tpLoadedRows ) tpLoadRows2( tpRowPrefix );
	for( i=0; i < tpProductRows.length; i++ ) 
		tpSHo( tpProductRows[i], false );
	
	var selectedProducts = parseQueryString( 'compare' );
	
	var show = false;
	var cntVisible = 0;
	// TODO: find a more efficient way
	for( i=0; i < selectedProducts.length; i++ ) {
		for( j=0; j < tpProductRows.length; j++ ) {
// igohn - (2007/11/14)
if (tpProductRows[j] != null && tpProductRows[j].tpProductId != null) {
			show = (tpProductRows[j].tpProductId == selectedProducts[i]);
			if ( show ) {
				cntVisible++;
				tpSHo( tpProductRows[j], true );
				if ( true == setClass )
					tpSetClass( tpProductRows[j], ( 1 == (cntVisible & 1) ) ? 'contentAlternateRowColorEven' :  'contentAlternateRowColorOdd' ) ; 
				break;
			}
}
		}
	}
}

function tpSaveState( link ) {
	// TODO: make this robust
	var qs = "" + document.location.search;
	var linkqs = link.search;
	if ( linkqs == null || linkqs == "" ) 
		link.href = link.href + qs;
	else
		link.href = link.href  + "&" + qs.slice(1);
	return true;
}

// attach filter to "back to products" link
function tpSaveFilterState( link ) {
	// TODO: make this robust
	var linkqs = link.search;
	var filter = gup("tpFilter");
	if ( linkqs == null || linkqs == "" ) 
		link.href = link.href + "?tpFilter=" + filter;
	else
		link.href = link.href  + "&" + "?tpFilter=" + filter;
	return true;
}


function tpHash2Filter(hash) {
	var hashn = Number( hash );
	tpLF[0] = (hashn & 0x000000ff);
	tpLF[1] = (hashn & 0x0000ff00) >> 8;
	tpLF[2] = (hashn & 0x00ff0000) >> 16;
}

function tpSetSelectSelection( name, value ) {
	var o = document.getElementById(name);
	if ( !o ) return;
	if ( o.tagName.toUpperCase() != 'SELECT' ) return;
	for ( i=0; i<o.options.length; i++ ) 
		o.options[i].selected = (o.options[i].value == value); 
}
