
var category="";
var picture="";

var ajaxServlet = new AjaxServlet('iyp');
ajaxServlet.timeout = 50;

var Logger = new Object();
Logger.Log = function(msg)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.dispatcher.LogDispatcher');
	qs.addParam('msg', msg);
	ajaxServlet.command(qs.build(), new Callback(function(){}));
}

function removeChildren(parentNode)
{
	while (parentNode.firstChild)
		parentNode.removeChild(parentNode.firstChild);
}

function QueryString()
{
	this.params = new Array();
}
QueryString.prototype.addParam = function(name, value)
{
	this.params.push([name,value]);
}
QueryString.prototype.build = function()
{
	var glue = '';
	var str = '';
	for (var i = 0; i < this.params.length; ++i) {
		str += glue + this.params[i][0] + '=' + escape(this.params[i][1]);
		glue = '&';
	}
	return str;
}

// hash as in a url hash #
function makeHistoryHash(query, cityId, categoryId, firstResult, numResults)
{
	// the encoding is just for fun
	// the output could be something more indicative and useful to the user, perhaps something like query=query&cityId=cityId....
	var base = '' + query + ';' + cityId + ';' + categoryId + ';' + firstResult + ';' + numResults;
	var hash = '';
	hash = base;
//	for (var i = 0; i < base.length; ++i)
//		hash += base.charCodeAt(i);
	return hash;
}
function HistoryData(responseXML, searchData)
{
	this.responseString = AjaxServlet.xmlToString(responseXML);
	this.searchData = searchData;
}
HistoryData.prototype.getResponseXML = function()
{
	return AjaxServlet.getXMLDocument(this.responseString);
}


function ACItem_cityToString() { return this.name + ", " + this.cityAbbr + ""; };
function ACItem_stateToString() { return this.name + " (" + this.shortName + ")"; };
function ACItem_categoryToString() { return this.name; };
function makeACItem(node, toString) {
	var acItem = new AutoComplete.Item('');
	var atts = node.attributes;
	for (var i = 0; i < atts.length; ++i)
		acItem[atts.item(i).name] = atts.item(i).value;
	acItem._type = node.nodeName;
	if (acItem.name)
		acItem.value = acItem.name.toUpperCase();
	else if (acItem.text)
		acItem.value = acItem.text.toUpperCase();
	switch (acItem._type)
	{
	case "Category":
		acItem.toString = ACItem_categoryToString;
		acItem.value = acItem.id;
		break;
	case "City":
		acItem.toString = ACItem_cityToString;
		var state_atts;
		acItem.value = acItem.id;
		for (var i = 0; i < node.childNodes.length; ++i) {
		 if(node.childNodes.item(i).nodeName == "State") {
		  state_atts = node.childNodes.item(i).attributes;
		 }
		}
		for (var i = 0; i < state_atts.length; ++i) {
		  if(state_atts.item(i).name == "shortName") {
		  	acItem["cityAbbr"] = state_atts.item(i).value;
		  }
		}
		
		break;
	case "State":
		acItem.toString = ACItem_stateToString;
		break;
	default:
		alert("unknown completion: " + acItem.name);
		throw "unknown completion"; // save the user from 1000 alert boxes
		break;
	}
	return acItem;
}

function showProgress()
{
    document.getElementById('progress').style.display = 'block';
}
function hideProgress()
{
    document.getElementById('progress').style.display = 'none';
}



function Searcher()
{
	this.pageNum = 0;
	this.firstResult = 0;
	this.resultsPerPage = 20;
	this.totalResults = null;
	this.currentSearchType = null;
}
Searcher.prototype.setResultsPerPage = function(num)
{
	var atLeastThisManyResultsRoundedUpToPageSize = this.pageNum*this.resultsPerPage;
	if (atLeastThisManyResultsRoundedUpToPageSize < num) {
		this.pageNum = 0;
		this.firstResult = 0;
	}
	this.resultsPerPage = num;
	this.browseResults();
}
Searcher.prototype.firstPage = function()
{
	this.pageNum = 0;
	this.firstResult = 0;
	
	this.browseResults();
}
Searcher.prototype.gotoPage = function(pageNum)
{
	this.pageNum = pageNum;
	this.firstResult = this.pageNum * this.resultsPerPage;
	this.browseResults();
}
Searcher.prototype.nextPage = function()
{
	this.pageNum++;
	this.firstResult = (this.pageNum)*this.resultsPerPage;
	
	this.browseResults();
}
Searcher.prototype.prevPage = function()
{
	if (this.pageNum > 0)
		this.pageNum--;
	this.firstResult = (this.pageNum)*this.resultsPerPage;
	
	this.browseResults();
}
// browse within the current search
Searcher.prototype.browseResults = function()
{
	switch (this.currentSearchType)
	{
	case "category":
		processCategorySearchById(this.query, this.cityId, this.firstResult, this.resultsPerPage);
		break;
	}
}
// starts a new search
Searcher.prototype.categorySearchById = function(categoryId, cityId)
{
	this.pageNum = 0;
	this.firstResult = 0;
	this.query = categoryId;
	this.cityId = cityId;
	this.currentSearchType = "category";
	processCategorySearchById(categoryId, cityId, this.firstResult, this.resultsPerPage);
}
Searcher.prototype.categorySearchByName = function(categoryName, cityId)
{
	this.pageNum = 0;
	this.firstResult = 0;
	this.query = categoryName;
	this.cityId = cityId;
	this.currentSearchType = "category";
	processCategorySearchByName(categoryName, cityId, this.firstResult, this.resultsPerPage);
}

var searcher = new Searcher();




// recurses until the first text (or CDATA) node and returns its value
function getTextContent(node)
{
//alert(node.nodeName + ';' + node.nodeType + ';' + node.nodeValue);
	var TEXT_NODE = 3;
	var CDATA_NODE = 4;
	if (node.nodeType == TEXT_NODE | node.nodeType == CDATA_NODE)
		return node.nodeValue;
	if (node.firstChild)
		return getTextContent(node.firstChild);
	return null;
}

// shared by all autocomplete commands
/**
@param reqId a (usually unique) identifier for this request, passed back in the response
@param which ex "City" for "CityAutoCompleteCommand"
*/
function processAutoComplete(which, text, reqId, func, instance)
{
    var qs = new QueryString();
    qs.addParam('command', 'org.code514.yp.application.dispatcher.'+which+'AutoCompleteDispatcher');
    qs.addParam('text', text);
    qs.addParam('reqId', reqId);
    ajaxServlet.command(qs.build(), new Callback(resultAutoComplete, null, new Callback(func, instance)));
}
function resultAutoComplete(responseXML, callbackHelper)
{
    if (responseXML) {
        var items = new Array();
        var nodes = AjaxServlet.evalXPath(responseXML, "/Result/AutoComplete/Completion");
//        alert(AjaxServlet.xmlToString(responseXML));
        var text = AjaxServlet.evalXPath(responseXML, "/Result/AutoComplete/@text")[0].nodeValue;
        var reqId = AjaxServlet.evalXPath(responseXML, "/Result/AutoComplete/@reqId")[0].nodeValue;
//      alert(nodes.length);
        if (nodes.length) {
            for (var i = 0; i < nodes.length; ++i) {
                var node = nodes[i].firstChild;
                if (!node) continue;
                var acItem = makeACItem(node);
                items.push(acItem);
            }
        }
        callbackHelper.call(text, items, reqId);
    }
}


function processBasicSearch(query, cityId, firstResult, numResults)
{
//Logger.Log('processBasicSearch;query='+query);
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.command.CategorySearchCommand');
	qs.addParam('query', query);
	qs.addParam('cityId', cityId);
	qs.addParam('numResults', numResults);
	qs.addParam('firstResult', firstResult);
	ajaxServlet.command(qs.build(), new Callback(resultBasicSearch, null, [query,cityId,firstResult,numResults]));
}

function resultKeywordSearch(responseXML)
{
	if (responseXML) {
		var node = document.getElementById('searchResults');
		AjaxServlet.replaceNodeByTransform(node, responseXML, 'xslt/searchresult.xslt.xml');
		
		var query = AjaxServlet.evalXPath(responseXML, "/Result/Search/@query")[0].nodeValue;
		var cityId = AjaxServlet.evalXPath(responseXML, "/Result/Search/@cityId")[0].nodeValue;
		var firstResult = AjaxServlet.evalXPath(responseXML, "/Result/Search/@resultsOffset")[0].nodeValue;
		var numResults = AjaxServlet.evalXPath(responseXML, "/Result/Search/@resultsPerPage")[0].nodeValue;
		dhtmlHistory.add(makeHistoryHash(query, cityId, null, firstResult, numResults), new HistoryData(responseXML, {query:query,cityId:cityId,firstResult:firstResult,numResults:numResults}));
	}
    hideProgress();
}


function processCategorySearchById(categoryId, cityId, firstResult, numResults)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.command.CategorySearchCommand');
	qs.addParam('categoryId', categoryId);
	qs.addParam('cityId', cityId);
	qs.addParam('numResults', numResults);
	qs.addParam('firstResult', firstResult);
	ajaxServlet.command(qs.build(), new Callback(resultCategorySearch));
    showProgress();
}
function processCategorySearchByName(categoryName, cityId, firstResult, numResults)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.command.CategorySearchCommand');
	qs.addParam('categoryName', categoryName);
	qs.addParam('cityId', cityId);
	qs.addParam('numResults', numResults);
	qs.addParam('firstResult', firstResult);
	ajaxServlet.command(qs.build(), new Callback(resultCategorySearch));
    showProgress();
}
function resultCategorySearch(responseXML)
{
	if (responseXML) {
		// if we had originally seached by something other than id, let's subsequently do it by id instead until the next new search
		var categoryId = AjaxServlet.evalXPath(responseXML, "/Result/Search/@categoryId")[0].nodeValue;
		searcher.query = categoryId;
		var node = document.getElementById('searchResults');
		AjaxServlet.replaceNodeByTransform(node, responseXML, 'xslt/searchresult.xslt.xml');
		
		var cityId = AjaxServlet.evalXPath(responseXML, "/Result/Search/@cityId")[0].value;
		var firstResult = AjaxServlet.evalXPath(responseXML, "/Result/Search/@resultsOffset")[0].nodeValue;
		var numResults = AjaxServlet.evalXPath(responseXML, "/Result/Search/@resultsPerPage")[0].nodeValue;
		dhtmlHistory.add(makeHistoryHash(null, cityId, categoryId, firstResult, numResults), new HistoryData(responseXML, {categoryId:categoryId,cityId:cityId,firstResult:firstResult,numResults:numResults}));
	}
    hideProgress();
}



function processLogin(username, password)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.dispatcher.LoginDispatcher');
	qs.addParam('username', username);
	qs.addParam('password', password);
	ajaxServlet.command(qs.build(), new Callback(resultLogin));
    showProgress();
}
function resultLogin(responseXML)
{
	if (responseXML) {
		if (AjaxServlet.evalXPath(responseXML, "/Result/User").length) {
			AjaxServlet.replaceNodeByTransform(document.getElementById('NavContainer'), responseXML, 'xslt/Nav.xslt.xml');
			while (document.getElementById('MainContainer').firstChild) document.getElementById('MainContainer').removeChild(document.getElementById('MainContainer').firstChild);
		} else {
			AjaxServlet.replaceNodeByTransform(document.getElementById('MainContainer'), responseXML, 'xslt/login.xslt.xml');
		}
	}
    hideProgress();
}

function processLogout()
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.dispatcher.LogoutDispatcher');
	ajaxServlet.command(qs.build(), new Callback(resultLogout));
    showProgress();
}
function resultLogout(responseXML)
{
	if (responseXML) {
		removeChildren(document.getElementById('NavContainer'));
		AjaxServlet.replaceNodeByTransform(document.getElementById('MainContainer'), responseXML, 'xslt/login.xslt.xml');
	}
    hideProgress();
}


function processViewListing(phoneNumber)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.command.ViewListingCommand');
	qs.addParam('phoneNumber', phoneNumber);
	ajaxServlet.command(qs.build(), new Callback(resultViewListing));
    showProgress();
}
function resultViewListing(responseXML)
{
	if (!responseXML || AjaxServlet.evalXPath(responseXML, "/Result/Error").length || !AjaxServlet.evalXPath(responseXML, "/Result/User").length) {
		AjaxServlet.replaceNodeByTransform(document.getElementById('NotificationContainer'), responseXML, 'xslt/error.xslt.xml');
	} else {
		removeChildren(document.getElementById('NotificationContainer'));
		AjaxServlet.replaceNodeByTransform(document.getElementById('NavContainer'), responseXML, 'xslt/Nav.xslt.xml');
		AjaxServlet.replaceNodeByTransform(document.getElementById('MainContainer'), responseXML, 'xslt/EditListing.xslt.xml');
		initTextArea();
	}
    hideProgress();
}

function processViewProfile(id)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.command.ViewProfileCommand');
	qs.addParam('id', id);
	ajaxServlet.command(qs.build(), new Callback(resultViewProfile));
    showProgress();
}

function resultViewProfile(responseXML)
{
	if (responseXML) {
        window.viewProfileResponseXML = responseXML;
		var node = document.getElementById('searchResults');
		AjaxServlet.replaceNodeByTransform(node, responseXML, 'xslt/viewprofile.xslt.xml');
	}
    hideProgress();
}


function processUpdateListing(listing_id, version, listing_name, listing_phone, listing_city, listing_state, listing_zip, listing_street,
								bronzedata_categories,
								bronzedata_date,
								silverdata_date,silverdata_website, silverdata_email, silverdata_productsAndServices, silverdata_logo_url, silverdata_categories,
								golddata_date,golddata_abstract, golddata_faxNumber, golddata_cellNumber, golddata_tollFreeNumber,
								golddata_auxNumbers,
								golddata_businessHours, golddata_paymentMethod, golddata_slogan,
								golddata_galleryimages,
								golddata_categories
								)
{
	var qs = new QueryString();
	qs.addParam('command', 'org.code514.yp.application.dispatcher.UpdateListingDispatcher');
	qs.addParam('listing_id', listing_id);
	qs.addParam('version', version);
	qs.addParam('listing_name', listing_name);
	qs.addParam('listing_phone', listing_phone);
	qs.addParam('listing_city', listing_city);
	qs.addParam('listing_state', listing_state);
	qs.addParam('listing_zip', listing_zip);
	qs.addParam('listing_street', listing_street);
	for (var i = 0; i < bronzedata_categories.length; ++i)
		qs.addParam('bronzedata_categories', bronzedata_categories[i]);
	qs.addParam('bronzedata_date', bronzedata_date);
	qs.addParam('silverdata_date', silverdata_date);
	qs.addParam('silverdata_website', silverdata_website);
	qs.addParam('silverdata_email', silverdata_email);
	qs.addParam('silverdata_productsAndServices', silverdata_productsAndServices);
	qs.addParam('silverdata_logo_url', silverdata_logo_url);
	for (var i = 0; i < silverdata_categories.length; ++i)
		qs.addParam('silverdata_categories', silverdata_categories[i]);
	qs.addParam('golddata_date', golddata_date);
	qs.addParam('golddata_abstract', golddata_abstract);
	qs.addParam('golddata_faxNumber', golddata_faxNumber);
	qs.addParam('golddata_cellNumber', golddata_cellNumber);
	qs.addParam('golddata_tollFreeNumber', golddata_tollFreeNumber);
	for (var i = 0; i < golddata_auxNumbers.length; ++i)
		qs.addParam('golddata_auxNumbers', golddata_auxNumbers[i]);
	qs.addParam('golddata_businessHours', golddata_businessHours);
	qs.addParam('golddata_paymentMethod', golddata_paymentMethod);
	qs.addParam('golddata_slogan', golddata_slogan);
	for (var i = 0; i < golddata_galleryimages.length; ++i)
		qs.addParam('golddata_galleryimages', golddata_galleryimages[i]);
	for (var i = 0; i < golddata_categories.length; ++i)
		qs.addParam('golddata_categories', golddata_categories[i]);
	ajaxServlet.command(qs.build(), new Callback(resultUpdateListing));
    showProgress();
}
function resultUpdateListing(responseXML)
{
	if (!responseXML || AjaxServlet.evalXPath(responseXML, "/Result/Error").length || !AjaxServlet.evalXPath(responseXML, "/Result/User").length) {
		AjaxServlet.replaceNodeByTransform(document.getElementById('NotificationContainer'), responseXML, 'xslt/error.xslt.xml');
	} else {
	    removeChildren(document.getElementById('NotificationContainer'));
		AjaxServlet.replaceNodeByTransform(document.getElementById('NavContainer'), responseXML, 'xslt/Nav.xslt.xml');
		AjaxServlet.replaceNodeByTransform(document.getElementById('MainContainer'), responseXML, 'xslt/EditListing.xslt.xml');
		initTextArea();
	}
    hideProgress();
}

function CustomReplaceNodeByTransform(node, XML, XSLTPath){
	var xmlDoc = getXMLDocument(XML);
	if(document.implementation && document.implementation.createDocument){
		// Mozilla
	
		var xsltProcessor = new XSLTProcessor();
		
		// load the xslt file
		var myXMLHTTPRequest = new XMLHttpRequest();
		myXMLHTTPRequest.open("GET", XSLTPath, false);
		myXMLHTTPRequest.send(null);
		
		// get the XML document
		var xslStylesheet = myXMLHTTPRequest.responseXML;
		xsltProcessor.importStylesheet(xslStylesheet);
		xsltProcessor.setParameter(null, "category", category);
		xsltProcessor.setParameter(null, "picture", picture);
		
		//transform
		 var resultDocument = xsltProcessor.transformToFragment(xmlDoc, document);
		var myParent = node.parentNode;
		myParent.replaceChild(resultDocument, node);
		
	}else if(window.ActiveXObject){
		// IE
		// Load XSL
		xsl = new ActiveXObject("MSXML2.FreeThreadedDomDocument.3.0");
		xsl.async = false;
		xsl.load(XSLTPath);
		var xslt = new ActiveXObject("Msxml2.XSLTemplate");
		xslt.stylesheet = xsl;
		
		xslProc = xslt.createProcessor();
           xslProc.input = xmlDoc;
           xslProc.addParameter("category", category);
           xslProc.addParameter("picture", picture);
           xslProc.transform();
		
		// Transform
		node.innerHTML=xslProc.output;
		if(xmlDoc.parseError.reason != "") {
			alert(xmlDoc.parseError.reason);
			alert(xmlDoc.parseError.srcText);
		}
	}else{
		// Browser unknown
		alert("Browser unknown");
	}
}
