window.onload = doDocumentReady;

// empty DOM for data xml
var oDeviceDoc = Sarissa.getDomDocument(); 
oDeviceDoc.setProperty("SelectionLanguage", "XPath"); // set xpath for IE

// set base xpath to use for searching the data dom
var baseXpath = "//dvc";

// XSL processor
var deviceTableProcessor = new XSLTProcessor();
var xslDoc = Sarissa.getDomDocument();
// for debugging only
var x2s = new XMLSerializer();

var defaultProduct = "";
var defaultEmailServer = "";
var defaultCountry = "";
var defaultNetwork = "";
var defaultDevice = "";

var defaultStartNum = "1";

var curProduct = "";
var curEmailServer = "";
var curCountry = "";
var curNetwork = "";
var curDevice = "";

var curStartNum = "";


var certifiedMsg = "Good Certified Combinations\n\nThe Good application has been optimized to run on these device/ROM/carrier combinations. Technical support is available.";
var authorizedMsg = "Good Authorized Combinations\n\nThe Good application is expected to work on these combinations but has not been optimized for them. Technical support is available, but Good Technology cannot guarantee that it will be able to provide a solution to the problems that users may encounter.";

var noXSLLoad = "Your browser could not dynamically load the device data. This page requires either Internet Explorer 6.x or Mozilla Firefox 1.5 to work.";

function doDocumentReady()
{
	initBindings();
//alert("initBindings");
	loadXsl();
//alert("loadXsl");
	loadData();
//alert("loadData");
	initFilters();
//alert("initFilters");	
}

function initBindings()
{
	// $("select[id='chooseProduct']").change(function () { initFilters()});
	// $("select[id='chooseEmailServer']").change(function () { initFilters()});
	$("select[id='chooseCountry']").change(function () { initFilters()});

//	$("select[id=document.getElementById('chooseCountry')]").change(function () { initFilters()});

	$("select[id='chooseNetwork']").change(function () { initFilters() });
	$("select[id='chooseDevice']").change(function () {  initFilters()});
	initStartNum();
	$("#bResetFilters").click(function () {  resetFilters()});
}

function initTableBindings()
{
	$(".rDetail").hide();
	$(".rData").click(function () { doDetails(this)} );
	// use td since bg colors of rows are flakey
	$(".rData").hover( 
		function(){ doHiliteRow(this, true) }
		, function(){ doHiliteRow(this, false) }
	 );
	$(".knownIssueText").click(function() {goKB(this); return false; });
}

function initStartNum() {
	curStartNum = (document.getElementById('startNum').value);
	if (document.getElementById('startNum').value == null || document.getElementById('startNum').value == "") {
		document.getElementById('startNum').value = "0";
		curStartNum = "0";
	}
//alert("curStartNum is : " + curStartNum);
}

function resetStartNum() {
	curStartNum = "0";
	document.getElementById('startNum').value = "0";
}

function initFilters()
{
	// curProduct = (chooseProduct.selectedIndex == -1) ? "" : chooseProduct[chooseProduct.selectedIndex].value;
	// curEmailServer = (chooseEmailServer.selectedIndex == -1) ? "" : chooseEmailServer[chooseEmailServer.selectedIndex].value;
//	curCountry = (chooseCountry.selectedIndex == -1) ? "" : chooseCountry[chooseCountry.selectedIndex].value;

	curCountry = (document.getElementById('chooseCountry').selectedIndex == -1) ? "" : document.getElementById('chooseCountry')[document.getElementById('chooseCountry').selectedIndex].value;

	// curNetwork = (chooseNetwork.selectedIndex == -1) ? "" : chooseNetwork[chooseNetwork.selectedIndex].value;
	curNetwork = (document.getElementById('chooseNetwork').selectedIndex == -1) ? "" : document.getElementById('chooseNetwork')[document.getElementById('chooseNetwork').selectedIndex].value; 
//	curDevice = (chooseDevice.selectedIndex == -1) ? "" : chooseDevice[chooseDevice.selectedIndex].value;
	curDevice = (document.getElementById('chooseDevice').selectedIndex == -1) ? "" : document.getElementById('chooseDevice')[document.getElementById('chooseDevice').selectedIndex].value;

//	updateFiltersAndData();
	updateFiltersOnly();
}

function updateStartNum(newStartNum) {
	document.getElementById('startNum').value = newStartNum ;
//	document.getElementById('startNum').value = newStartNum+20;
	//alert("curStartNum is now : " + document.getElementById('startNum').value);
	updateFiltersAndData();
}

function updateFiltersOnly() 
{
	initNetworkFilter();
	initCountryFilter();
	initDeviceFilter();
	
		resetStartNum();
}

function updateFiltersAndData()
{
	// initProductFilter();
	// initEmailServerFilter();
	initNetworkFilter();
	initCountryFilter();
	initDeviceFilter();
	initStartNum();
//	resetStartNum();
	// toggleEmailServerFilter();
	doDeviceTable();
}

function loadXsl()
{
    //direct load
	/*xslDoc.async=false;
	xslDoc.load("xsl/devices.xsl");
	var result = checkValidDom(xslDoc);
	//alert("Load XSL: " + result + "\n" + x2s.serializeToString(xslDoc))
	if (result== true) 
		deviceTableProcessor.importStylesheet(xslDoc);
	else
		alert(noXSLLoad);
		*/

	// xmlhttp via var
	//alert("trying to loadXsl " +aXSLPath);
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", aXSLPath, false);
	xmlhttp.send(null);
	//xslDoc = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
   	xslDoc= xmlhttp.responseXML;
    var result = checkValidDom(xslDoc);
	//alert(x2s.serializeToString(xslDoc));
	deviceTableProcessor.importStylesheet(xslDoc);

}

function loadData()
{
	 //direct load
	 oDeviceDoc.async=false;
	//oDeviceDoc.load("data/devices.xml");
	//var result = checkValidDom(oDeviceDoc);
	//alert("Load XML Data: " + result + "\n" + x2s.serializeToString(oDeviceDoc))
	
	// xmlhttp via var
	//alert("trying to loadXml" + aPath);
    var xmlhttp = new XMLHttpRequest();
	xmlhttp.open("GET",aXMLPath, false);
	xmlhttp.send(null);
    //oDeviceDoc = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml");
    oDeviceDoc= xmlhttp.responseXML;
	var result = checkValidDom(oDeviceDoc);
    //alert("after loading xml " +oDeviceDoc);
    //alert(x2s.serializeToString(oDeviceDoc));

}

function checkValidDom(oDomDoc)
{
	if(Sarissa.getParseErrorText(oDomDoc) == Sarissa.PARSED_OK)
	{
		// The document was parsed/loaded just fine, go on
		return true;
	} 
	else{
		// The document was not loaded correctly! Inform the user:
		alert("Error loading XML: " + Sarissa.getParseErrorText(oDomDoc));
		return false;
	};
}


<!-- ----------------------------------------------------------- -->
<!-- INITIALIZE AND RESET FILTER WIDGETS  -->
<!-- ----------------------------------------------------------- -->

function resetFilters()
{
	// curProduct = defaultProduct;
	// curEmailServer = defaultEmailServer;
	curCountry = defaultCountry;
	curNetwork = defaultNetwork;
	curDevice = defaultDevice;
//	updateFiltersAndData();

	curStartNum = defaultStartNum;

	updateFiltersOnly();
	removeDeviceTable();
}

function initProductFilter()
{
	var xPath = baseXpath + getPredicate("product") + "/Prod/text()";
	var aProductVals = new Array;
	collectUniqueValues(oDeviceDoc, xPath, aProductVals);
	if (aProductVals.length > 0)
	{
		resetOptions(chooseProduct);
	 addOption(chooseProduct, "All", "", curProduct);
	 addOptions(chooseProduct, aProductVals, curProduct);
	}
}

function initEmailServerFilter()
{
	//alert("initEmailServerFilter");
	var xPath = baseXpath + getPredicate("emailServer") + "/ESrv/text()";
	var aEmailServerVals = new Array;
	collectUniqueValues(oDeviceDoc, xPath, aEmailServerVals);
	if (aEmailServerVals.length > 0)
	{
		resetOptions(chooseEmailServer);
		addOption(chooseEmailServer, "All", "", curEmailServer);
		addOptions(chooseEmailServer, aEmailServerVals, curEmailServer);
	}
}


function initNetworkFilter()
{
	//alert("initNetworkFilter");
	
	var xPath = baseXpath + getPredicate("network") + "/Ntwk/text()";
	var aNetworkVals = new Array;
	collectUniqueValues(oDeviceDoc, xPath, aNetworkVals);
	if (aNetworkVals.length > 0)
	{
//		resetOptions(chooseNetwork);
		resetOptions(document.getElementById('chooseNetwork'));
//		addOption(chooseNetwork, "All", "", curNetwork);
		addOption(document.getElementById('chooseNetwork'), "All", "", curNetwork);
//		addOptions(chooseNetwork, aNetworkVals, curNetwork);
		addOptions(document.getElementById('chooseNetwork'), aNetworkVals, curNetwork);
	}
}

function initCountryFilter()
{
	
	var xPath = baseXpath + getPredicate("country") + "/Ctry/text()";
	//alert(xPath);
	var aCountryVals = new Array;
	collectUniqueValues(oDeviceDoc, xPath, aCountryVals);
	if (aCountryVals.length > 0)
	{
//		resetOptions(chooseCountry);
		resetOptions(document.getElementById('chooseCountry'));
//		addOption(chooseCountry, "All", "", curCountry);
		addOption(document.getElementById('chooseCountry'), "All", "", curCountry);
//		addOptions(chooseCountry, aCountryVals, curCountry);
		addOptions(document.getElementById('chooseCountry'), aCountryVals, curCountry);
	}
}

function initDeviceFilter()
{
	//alert("initDeviceFilter");	
	var xPath = baseXpath + getPredicate("device") + "/Dvc/text()";
	//alert(xPath);
	var aDeviceVals = new Array;
	collectUniqueValues(oDeviceDoc, xPath, aDeviceVals);
	if (aDeviceVals.length > 0)
	{
//		resetOptions(chooseDevice);
		resetOptions(document.getElementById('chooseDevice'));
//		addOption(chooseDevice, "All", "", curDevice);
		addOption(document.getElementById('chooseDevice'), "All", "", curDevice);
//		addOptions(chooseDevice, aDeviceVals, curDevice);
		addOptions(document.getElementById('chooseDevice'), aDeviceVals, curDevice);
	}
}

function getPredicate(context)
{
	var predicate = new Array();
	
//	if (context !="emailServer" && curEmailServer != null && curEmailServer != "") predicate.push("ESrv='" + curEmailServer + "' ");
	if (context !="country" && curCountry != null && curCountry != "") predicate.push("Ctry='" + curCountry + "' ");
	if (context !="network" && curNetwork != null && curNetwork != "")  predicate.push("Ntwk='" + curNetwork + "' ");
	if (context !="device" && curDevice != null && curDevice != "")  predicate.push("Dvc='" + curDevice + "' ");
//	if (context !="product" && curProduct != null && curProduct != "") predicate.push("Prod='" + curProduct + "' ");
	
	var predicateStr = "";
	if (predicate.length > 0)
	{
		predicateStr += "[";
		for (var i =0; i < predicate.length; i++)
		{
			predicateStr += predicate[i];
			if (i < predicate.length - 1) predicateStr += " and ";
		}
		predicateStr += "]";
	}
//alert("predicateStr is : " + predicateStr);
	return predicateStr;
}

<!-- ----------------------------------------------------------- -->
<!-- toggleEmailServerFilter  -->
<!-- ----------------------------------------------------------- -->
// handle disabling of email server filter

function toggleEmailServerFilter()
{
	 var curProduct = chooseProduct[chooseProduct.selectedIndex].value;
	 if (curProduct == "Good Defense")
	 	{
			$("#emailLabel").hide();
			$("#emailValue").hide();
		}
	else
		{
			$("#emailLabel").show();
			$("#emailValue").show();
		}
}

<!-- ----------------------------------------------------------- -->
<!-- DO DEVICE TABLE  -->
<!-- ----------------------------------------------------------- -->
function doDeviceTable()
{
	//alert("doDeviceTable" + getPredicate());
//	deviceTableProcessor.setParameter(null, "curProduct", curProduct);
//	deviceTableProcessor.setParameter(null, "curEmailServer", curEmailServer);
	deviceTableProcessor.setParameter(null, "curCountry", curCountry);
	deviceTableProcessor.setParameter(null, "curNetwork", curNetwork);
	deviceTableProcessor.setParameter(null, "curDevice", curDevice);

	deviceTableProcessor.setParameter(null, "startNum", curStartNum);



	// alert("doDeviceTable Transform");
	var result = deviceTableProcessor.transformToDocument(oDeviceDoc);
	// alert(x2s.serializeToString(result));
	e("deviceTable").innerHTML = x2s.serializeToString(result);
	initTableBindings(); // assign interactions
}

<!-- ----------------------------------------------------------- -->
<!-- REMOVE DEVICE TABLE  -->
<!-- ----------------------------------------------------------- -->
function removeDeviceTable()
{
	deviceTableProcessor.setParameter(null, "curCountry", curCountry);
	deviceTableProcessor.setParameter(null, "curDevice", curDevice);
	deviceTableProcessor.setParameter(null, "curNetwork", curNetwork);

	deviceTableProcessor.setParameter(null, "startNum", curStartNum);

	e("deviceTable").innerHTML = "";
}

<!-- ----------------------------------------------------------- -->
<!-- DO DEVICE TABLE  -->
<!-- ----------------------------------------------------------- -->
function doDetails(srcElement)
{
	var detailElement = e(srcElement.id + "-detail");
	var curDisplay = detailElement.style.display;
	if (curDisplay == "none" )
	{
		$(srcElement).find("td").removeClass("cData_over");
		$(srcElement).find("td").addClass("cData_expanded"); // need to apply to cell as bg colors on rows don't work in IE
		$(srcElement).find("td:eq(0)").addClass("cRowController_expanded");
		$("tr[id='" + srcElement.id + "-detail']").show();
	}
	else
	{
		$(srcElement).find("td").removeClass("cData_over");
		$(srcElement).find("td").removeClass("cData_expanded");
		$(srcElement).find("td:eq(0)").removeClass("cRowController_expanded");
		$("tr[id='" + srcElement.id + "-detail']").hide();
	}
}

function doHiliteRow(e, bool)
{
	(bool == true) ? $(e).find("td").addClass("cData_over") : $(e).find("td").removeClass("cData_over");
}

function describeCategory(srcElement)
{
	var msg = "Unknown support type.";
	var cat = getText(srcElement);
	if (cat == "Certified")
		msg = certifiedMsg;
	else if (cat == "Authorized")
		msg = authorizedMsg ;
	alert(msg);
}

function goKB(srcElement)
{
	var re = /\,/gi;
	var str = getText(srcElement);
	var kb = str.replace(re, "+OR+");
	
	var url= "http://search.good.com/search?q=" + kb + "&site=my_collection&output=xml_no_dtd&client=my_collection&y=16&x=39&proxystylesheet=my_collection&sp-q=";
	window.open( url, "kb");
}


<!-- ----------------------------------------------------------- -->
<!-- COLLECT VALUES FROM XPATH EXPRESSIONS  -->
<!-- ----------------------------------------------------------- -->
function collectUniqueValues(oDomDoc, xPath, aValues)
{
	var objNodeList = oDomDoc.selectNodes(xPath);
	//alert("collectUniqueValues " + xPath + ": " + objNodeList.length);
	var oValues = new Object;
	// use assoc array to grab unique values; just care about the key really
	for(i=0;i<objNodeList.length;i++)
	{
		var val = normalizeString(x2s.serializeToString(objNodeList[i]));
		oValues[val]= val;
	}
	for (key in oValues)
	{
		aValues.push(oValues[key]);
	}
	aValues.sort(mixedAlphaSort);
}

function mixedAlphaSort(sA, sB)
{
	var x = sA.toLowerCase();
    var y = sB.toLowerCase();
    return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
<!-- ----------------------------------------------------------- -->
<!-- MANAGE SELECT WIDGETS -->
<!-- ----------------------------------------------------------- -->
function resetOptions (oSelect)
{
	oSelect.options.length = 0;
}

function addOptions(oSelect, aValues, sCurVal)
{
	//alert("addOptions " + oSelect + " " + aValues);
	for (var i = 0; i <aValues.length; i++)
	{
		addOption(oSelect, aValues[i], aValues[i], sCurVal);
	}
}

function addOption (oSelect, sText, sValue, sCurVal)
{
	var oOption = document.createElement("OPTION");
	oOption.text = sText;
	oOption.value = sValue;
	oOption.id = sValue;
	if (sValue==sCurVal) oOption.selected=true;
	oSelect.options.add(oOption);
	
}



// /////////////////////////////////////////////////////////////
// Accelerator for getting elemenets by id
// /////////////////////////////////////////////////////////////
function e(elementId)
{
		return document.getElementById(elementId);
}

function getText(e)
{
	return (typeof e.text == "undefined") ? e.innerText : e.text;
}

// /////////////////////////////////////////////////////////////
// Class manipulation; replace by jquery?
// /////////////////////////////////////////////////////////////

function containsClass(srcElement, cName)
{
	if (srcElement==null) return;
	var curClass = srcElement.className;
	return (curClass.indexOf(cName) > -1);
}

function addClass(srcElement,addedClass)
{
	if (srcElement==null) return;
	var curClass = srcElement.className + " "; // add space in case class def doesn't have it
	if (curClass.indexOf(" " + addedClass + " ") < 0) srcElement.className += " " + addedClass + " ";
}

function removeClass (srcElement, removedClass)
{
	if (srcElement==null) return;
	var curClass = srcElement.className+ " "; // add space in case class def doesn't have it
	var re = new RegExp(removedClass, "i");
	srcElement.className=curClass.replace(re, "");
}

