var loadingPic = document.getElementById("loadingGif");
var gotUrlVals = false;

function showLoading(){
    if (loadingPic) 
        loadingPic.style.display = "inline";
}

function hideLoading(){
    if (loadingPic) 
        loadingPic.style.display = "none";
}

// constructor and initialization

function UcProductSelector(selectorTarget, searchBoxTarget, resultTarget, proxy, token, productId, domain){
    this._selectorTarget = selectorTarget;
    this._searchBoxTarget = searchBoxTarget;
    this._resultTarget = resultTarget;
    
    this._proxy = proxy + "?token=" + token;
    this._headers = new Array();
    this._headers["merchantToken"] = this._headers["clientToken"] = token;
    this._dimensionCache = new Array();
    this._productCache = null;
    this._valueIds = new Array();
    this._productId = productId;
    this._query = '';
    this._searchMax = 99;
    document.domain = domain;
    __ucObjAdd(this);
}

UcProductSelector.initialize = function(){
    var s = "Please enter Model Number: <input type='text' id='__ucQStr'/>";
    s += "<input type='submit' size='50' value='Go' onclick=\"UcProductSelector.search(" + this.__ucObjId + ", document.getElementById('__ucQStr').value, 0); return false;\"/>";
    document.getElementById(this._searchBoxTarget).innerHTML = s;
    var self = this;
    
    window.onload = function(){
        self.getNextDimension();
    }
}

UcProductSelector.clearResults = function(){
    document.getElementById(this._resultTarget).innerHTML = '';
}

// service calls and response handlers

UcProductSelector.getNextDimension = function(){
    var params = new Array();
    params["guid"] = this._productId;
    params["values"] = this.getValueIds();
    serviceCall(this._proxy, "getDimensionInfo", params, this._headers, this.adaptResponseHandler(UcProductSelector.processGetDimensionInfoResponse), this.adaptErrorHandler(this.errorHandler));
}

UcProductSelector.processGetDimensionInfoResponse = function processGetDimensionInfoResponse(self, response){
    self.addCacheEntry(response);
    self.renderDimensionDropdowns();
    if (response.dimension == "Manufacturer" && gotUrlVals) {
        self.getSelectCkie();
        
    }
    
}

UcProductSelector.getProductList = function(){
    var params = new Array();
    params["guid"] = this._productId;
    params["values"] = this.getValueIds();
    serviceCall(this._proxy, "getProductList", params, this._headers, this.adaptResponseHandler(UcProductSelector.processGetProductListResponse), this.adaptErrorHandler(this.errorHandler));
}

UcProductSelector.processGetProductListResponse = function(self, response){
    self._productCache = response;
    self.renderDimensionDropdowns();
}

UcProductSelector.getProduct = function(objId, select){
    showLoading();
    UcProductSelector.getProductById(objId, parseInt(select.options[select.selectedIndex].value));
    if (select.selectedIndex == 0) 
        hideLoading();
}

UcProductSelector.getProductById = function(objId, productId){
    __ucObjGet(objId).getProductInfo(productId);
}

UcProductSelector.getProductInfo = function(productId){
    createCookie("cmsSelector", productId, 1);
    var params = new Array();
    params["guid"] = this._productId;
    params["productId"] = productId;
    serviceCall(this._proxy, "getProductInfo", params, this._headers, this.adaptResponseHandler(UcProductSelector.processGetProductInfoResponse), this.adaptErrorHandler(this.errorHandler));
}

UcProductSelector.processGetProductInfoResponse = function(self, response){
    self.renderProductInfo(response);
}

UcProductSelector.queryProductList = function(query, start){
    var params = new Array();
    params.guid = this._productId;
    params.query = this._query = query;
    params.start = start;
    params.max = this._searchMax;
    
    serviceCall(this._proxy, "queryProductList", params, this._headers, this.adaptResponseHandler(UcProductSelector.processQueryProductListHandler), this.adaptErrorHandler(this.errorHandler));
}

UcProductSelector.processQueryProductListHandler = function(self, response){
    self.renderSearchResults(response);
}

// UI callback methods

UcProductSelector.selectDimensionValue = function(objId, select, index){
    showLoading();
    var self = __ucObjGet(objId);
    if (self.setSelectedValue(select, index)) {
        self.getNextDimension();
        return true;
    }
    hideLoading();
    return false;
}

UcProductSelector.selectLeafDimensionValue = function(objId, select, index){
    showLoading();
    var self = __ucObjGet(objId);
    if (self.setSelectedValue(select, index)) {
        self.getProductList();
        return true;
    }
    hideLoading();
    return false;
}

UcProductSelector.search = function(objId, query, start){
    showLoading();
    var self = __ucObjGet(objId);
    self.queryProductList(query, start);
}

// Rendering methods

UcProductSelector.renderDimensionDropdowns = function(){
    var s = "<table>";
    for (var i = 0; i < this._dimensionCache.length; i++) {
        var entry = this._dimensionCache[i];
        var dimensionInfo = entry.value;
        var selectedId = entry.selected;
        
        var dimensionName = dimensionInfo.dimension;
        var values = dimensionInfo.values;
        var isLeaf = dimensionInfo.isLeaf;
        var onchange = isLeaf ? "return UcProductSelector.selectLeafDimensionValue(" + this.__ucObjId + ", this, " + i + ");" : "return UcProductSelector.selectDimensionValue(" + this.__ucObjId + ", this, " + i + ");";
        
        s += "<tr><td class='generic-text'>Select " + dimensionName + "</td><td class='generic-text'>";
        if (dimensionName == "System Type") 
            s += "<select class='selectoroptionbox' id='sysType' onchange='" + onchange + "'>";
        else 
            s += "<select class='selectoroptionbox' onchange='" + onchange + "'>";
        s += "<option value='-1'>--- Select ---</option>";
        for (var j = 0; j < values.length; j++) {
            var valueName = values[j].value;
            var valueId = values[j].id;
            s += "<option ";
            if (valueId == selectedId) {
                s += "selected='true' ";
            }
            s += "value='" + valueId + "'>" + valueName + "</option>";
        }
        s += "</select></td></tr>";
    }
    
    if (this._productCache != null) {
        s += this.renderProductDropdown();
    }
    s += "</table>";
    
    document.getElementById(this._selectorTarget).innerHTML = s;
    
    if (dimensionName == "System Type") {
        getURLSearchVals();
		
    }
    hideLoading();
}

UcProductSelector.renderProductDropdown = function(){
    var values = this._productCache.products;
    var s = "";
    s += "<tr><td class='generic-text'>Select Your Model</td>";
    s += "<td class='generic-text'><select class='selectoroptionbox' onchange='UcProductSelector.getProduct(" + this.__ucObjId + ", this)'>";
    s += "<option value='-1'>--- Select ---</option>";
    for (var i = 0; i < values.length; i++) {
        var valueName = values[i].name;
        var valueId = values[i].id;
        s += "<option value='" + valueId + "'>" + valueName + "</option>";
    }
    s += "</select></td></tr>";
    hideLoading();
    return s;
}

UcProductSelector.renderProductInfo = function(response){
    var product = response.products[0];
    var mappings = product.mappings;
    var values = product["mappings"];
    var dimensions = response.dimensions;
    var valueUrl, valueSale, valueImage;
    var altprod = false;
    
    var i;
    var s = "";
    
    
    
    
    if (mappings.length != 0) {
        s += "<table border=0 cellspacing=0 cellpadding=0 width=534>";
        s += "<tr><td colspan='4'>Memory Products Compatible with <strong>'"
        if (dimensions[1] == "Manufacturer") 
            s += product.values[1] + ' ';
        s += product.name + "':</td></tr><tr><td height=5 width=117></td><td height=5 width=230></td><td height=5 width=149></td><td height=5 widht=58></td></tr>";
        for (i = 0; i < mappings.length; i++) {
            var valueDesc = mappings[i].standardDescription;
            var valueNum = mappings[i].merchantNumber;
            var valueUrl = mappings[i].merchantUrl;
            var value_custom4 = values[i]["custom4"];
            var valuesaletext = "";
            var buynowtext = "";
            valueImage = values[i]["custom2"] != null ? values[i]["custom2"] : "http://lib.stores.yahoo.net/lib/computermemorystore/no-image.gif";
            if (values[i]["custom3"] != null) {
                valueSale = values[i]["custom3"] != null ? values[i]["custom3"] : "See Site";
                valuesaletext += "<span class='style78 style118'>Sale Price: </span><span class='style3rd style5'>$" + valueSale + "</span>";
                buynowtext += "<form method='post' action='http://order.store.yahoo.net/cgi-bin/wg-order?computermemorystore+" + value_custom4 + "'>";
                buynowtext += "<input name='vwitem' type='hidden' value='" + value_custom4 + "'>";
                buynowtext += "<INPUT TYPE='IMAGE' SRC='/lib/computermemorystore/btn_buynow.gif' VALUE='Computer Memory Store' border='0' valign='bottom'>";
                buynowtext += "<input type='hidden' name='.autodone' value='http://www.computer-memory-store.com/results.html' /></form>";
                valueUrl = values[i]["merchantUrl"];
            }
            else {
                valueSale = values[i]["custom3"] != null ? values[i]["custom3"] : "See Site";
                valuesaletext += "<span class=style78 style118>See Site</span>";
                buynowtext += "<a href=" + valueUrl + " class=TahomaTextSMU>Click Here</a>";
                //valueUrl = values[i]["custom4"];
            }
			s += '<tr><table class="listProduct" width="534" cellpadding="0" cellspacing="0"><tbody><tr><td width="153" align="center" class="prImg"><a href='+valueUrl+'><img src=http://lib.stores.yahoo.net/lib/computermemorystore/'+ valueImage +' width=64 height=64 align=center border=0 hspace=0 vspace=0></a></td><td class="prNameCode"  width="300"><table><tbody><tr><td class="prName"><a href='+ valueUrl +' class=TahomaTextSMU>'+ valueDesc +' Memory</a></td></tr><tr><td class="prCode"><strong>CMS Part#:</strong>'+ valueNum +'</td></tr></tbody></table></td><td><table width="200" align="right" class="prPrice"><tbody><tr><td class="prSalePrice">';
			s += valuesaletext +'</td></tr></tbody></table></td><td class="prBuyBtn">'+ buynowtext +'</td></tr></tbody></table></tr>';
            //s += "<tr><td align=center valign=middle width=117><a href=" + valueUrl + "><img src=http://lib.stores.yahoo.net/lib/computermemorystore/" + valueImage + " width=64 height=64 align=center border=0 hspace=0 vspace=0></a></td><td><a href=" + valueUrl + " class=TahomaTextSMU>" + valueDesc + " Memory</a></td><td>" + valuesaletext + "</td><td>" + buynowtext + "</td></tr>";
            //s += "<tr><td height=5 widht=117></td><td height=5 widht=230></td><td height=5 widht=149></td><td height=5 widht=58></td></tr><tr><td width=117 height=1 bgcolor=CCCCCC align=left valign=middle><img src=http://lib.store.yahoo.net/lib/computermemorystore/white10spacer.gif width=10 height=1></td><td width=230 height=1 align=left bgcolor=CCCCCC class=TahomaTextSMU></td><td width=149 height=1 align=left bgcolor=CCCCCC class=TahomaTextSMU></td><td width=58 height=1 bgcolor=CCCCCC></td></tr>";
            //s += "<tr><td height=5 widht=117></td><td height=5 widht=230></td><td height=5 widht=149></td><td height=5 widht=58></td></tr>";
        }
        s += "</table>";
    }
    else {
        s += "<table border=0 cellspacing=0 cellpadding=0 width=591><tr><th colspan='3'>No matching products were found</th></tr></table>";
    }
    s += '<br/><table class="cmsSpecTable" id="specs" width="591" border="0"><tr><td colspan="2" class="SpecTableHeaderRow"><h2>' + product.name + ' Specifications</h2></td></tr>';
    for (i = 0; i < dimensions.length; i++) {
        var dimension = dimensions[i];
        var value = product.values[i];
        if (value != null) {
            s += '<tr><td "SpecTableColumn1" bgcolor="#F0F7FF">' + dimension + '</td><td class="SpecTableColumn2">' + value + '</td></tr>';
        }
        
        
    }
    s += '</table>';
    document.getElementById(this._resultTarget).innerHTML = s;
    hideLoading();
}

UcProductSelector.renderSearchResults = function(response){
    var first = response.first;
    var count = response.count;
    var total = response.total;
    
    var products = response.products;
    var s = '';
    
    var urlSearch = this._query;
    urlSearch = urlSearch.replace(/ /g, "+");
    
    if (products.length != 0) {
        s += "<table class='selectorResults' border=0 cellspacing=0 cellpadding=0 width=534>";
        s += "<tr valign=bottom class='style3lg'>";
        s += "<th>";
        s += "Results for '" + this._query + "'";
        s += "</th>";
        s += "</tr>";
        
        for (var i = 0; i < products.length; i++) {
            var productId = products[i]["id"];
            var productName = products[i]["name"];
            s += "<tr><td><a href='#" + i + "' onclick='UcProductSelector.getProductById(" + this.__ucObjId + "," + productId + ");'>" + productName + "</a></td></tr>";
        }
        s += '</table>';
        
        s += "<table class='selectorResults'>";
        s += "<tr>";
        if (first >= this._searchMax) {
            var c = "UcProductSelector.search(" + this.__ucObjId + ",'" + this._query + "'," + (first - this._searchMax) + ");";
            s += "<td><a href='#' onclick=\"" + c + "\">Previous</a></td>";
        }
        s += "<td>" + (first + 1) + " - " + (first + count) + " out of " + total + "</td>";
        if ((first + count) < total) {
            var c = "UcProductSelector.search(" + this.__ucObjId + ",'" + this._query + "'," + (first + this._searchMax) + ");";
            s += "<td><a href='#' onclick=\"" + c + "\">Next</a></td>";
        }
        s += "</td>";
        s += "</tr>";
        s += "<tr>"
        s += "<td>"
        s += "<br><br><div class='questions'><h3>Not finding what you're looking for?</h3><p> To try searching all of CMS for <strong>'" + this._query + "'</strong> <a href='http://search.store.yahoo.net/cgi-bin/nsearch?catalog=computermemorystore&query=" + urlSearch + "&.autodone=http%3A%2F%2Fwww.computer-memory-store.com%2Fnsearch.html'>Click Here</a></p></div></td></tr>";
        s += "</table>";
    }
    else {
        s += "<tr><td>No products matching <strong>'" + this._query + "'</strong> were found.<br> <div class='caution'><h2>To try searching all of CMS for <strong>'" + this._query + "'</strong> <a href='http://search.store.yahoo.net/cgi-bin/nsearch?catalog=computermemorystore&query=" + urlSearch + "&.autodone=http%3A%2F%2Fwww.computer-memory-store.com%2Fnsearch.html'>Click Here</a></h2></div></td></tr>";
    }
    
    document.getElementById(this._resultTarget).innerHTML = s;
    hideLoading();
}

// Helper methods
function getURLSearchVals(){
    gotUrlVals = true;
    var type, selectorNum, i = 0;
    var selector = true;
    type = window.location.search;
    if (type) {
        if (type.substring(0, 1) == '?') {
            type = type.substring(5, 6);
        }
        type *= 1;
        if (type > 0 && type < 7) {
            select = document.getElementById("sysType");
            select.options[type].selected = true;
            return UcProductSelector.selectDimensionValue(1, select, 0);
        }
    }
    else 
        ucProdSel.getSelectCkie();
}

UcProductSelector.getSelectCkie = function getSelectCkie(){
    var ckie = readCookie("cmsSelector");
    ckie *= 1;
    if (ckie) {
        showLoading();
        this.getProductInfo(ckie);
        hideLoading();
    }
}

UcProductSelector.errorHandler = function errorHandler(error){
    document.getElementById(this._selectorTarget).innerHTML = error;
}

UcProductSelector.adaptResponseHandler = function(handler){
    var self = this;
    window.__ucResponseHandler = function __ucResponseHandler(response){
        handler(self, response);
    }
    return window.__ucResponseHandler;
}

UcProductSelector.adaptErrorHandler = function(handler){
    window.__ucErrorHandler = function __ucErrorHandler(response){
        handler(response);
    }
    return window.__ucErrorHandler;
}

UcProductSelector.addCacheEntry = function(value){
    var entry = new Object();
    entry.value = value;
    entry.selected = -1;
    this._dimensionCache.push(entry);
}

UcProductSelector.getValueIds = function(){
    var ids = new Array();
    for (var i = 0; i < this._dimensionCache.length; i++) {
        ids.push(this._dimensionCache[i].selected);
    }
    return ids;
}

UcProductSelector.setSelectedValue = function(select, index){
    var entry = this._dimensionCache[index];
    var id = parseInt(select.options[select.selectedIndex].value);
    if (id >= 0) {
        if (entry.selected != null) {
            this.clearResults();
            this._productCache = null;
            while (this._dimensionCache[this._dimensionCache.length - 1] != entry) {
                this._dimensionCache.pop();
            }
        }
        entry.selected = id;
        return true;
    }
    else {
        return false;
    }
}

// register instance methods
UcProductSelector.prototype.getSelectCkie = UcProductSelector.getSelectCkie;
UcProductSelector.prototype.initialize = UcProductSelector.initialize;
UcProductSelector.prototype.clearResults = UcProductSelector.clearResults;
UcProductSelector.prototype.getProductInfo = UcProductSelector.getProductInfo;
UcProductSelector.prototype.getProductList = UcProductSelector.getProductList;
UcProductSelector.prototype.getNextDimension = UcProductSelector.getNextDimension;
UcProductSelector.prototype.setSelectedValue = UcProductSelector.setSelectedValue;
UcProductSelector.prototype.getValueIds = UcProductSelector.getValueIds;
UcProductSelector.prototype.addCacheEntry = UcProductSelector.addCacheEntry;
UcProductSelector.prototype.adaptResponseHandler = UcProductSelector.adaptResponseHandler;
UcProductSelector.prototype.adaptErrorHandler = UcProductSelector.adaptErrorHandler;
UcProductSelector.prototype.renderProductDropdown = UcProductSelector.renderProductDropdown;
UcProductSelector.prototype.renderDimensionDropdowns = UcProductSelector.renderDimensionDropdowns;
UcProductSelector.prototype.renderProductInfo = UcProductSelector.renderProductInfo;
UcProductSelector.prototype.queryProductList = UcProductSelector.queryProductList;
UcProductSelector.prototype.renderSearchResults = UcProductSelector.renderSearchResults;

//---------------------------------------------------
// Main

var ucProdSel = new UcProductSelector('_ucselector', '_ucsearch', '_ucresults', 'http://upgradeconsultant.computer-memory-store.com/proxy', 'a3fa209f-f448-400d-a710-85482fdaca33', '07a9974d-d063-49f1-a923-9db3df7d4cd3', 'computer-memory-store.com');
ucProdSel.initialize();

//document.domain = 'computer-memory-store.com';

function __ucObjAdd(obj){
    if (window.__ucObjCache == undefined) {
        window.__ucObjCache = new Array();
    }
    obj.__ucObjId = __ucObjCache.length + 1;
    window.__ucObjCache.push(obj);
}

function __ucObjGet(ucObjId){
    if (window.__ucObjCache == undefined) {
        return undefined;
    }
    else {
        return window.__ucObjCache[ucObjId - 1];
    }
}
