var loadingPic = document.getElementById("loadingGif");
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 = 20;
    document.domain = domain;
    __ucObjAdd(this);
}

UcProductSelector.initialize = function(){
    var s = "<input type='text' id='__ucQStr'/>";
    s += "<input type='submit' 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();
}

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){
    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 + ");";
        if (dimensionName == "System Type") 
            dimensionName = "Device Type";
        s += "<tr><td class='generic-text'>Select " + dimensionName + "</td><td>";
        if (dimensionName == "Device 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;
            if (valueName == "Desktop/Server" || valueName == "Motherboard" || valueName == "Notebook") 
                continue;
            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;
    var type;
    if (dimensionName == "Device Type") {
        select = document.getElementById("sysType");
        type = window.location.search;
        if (type) {
            if (type.substring(0, 1) == '?') {
                type = type.substring(1);
            }
            select.options[0].selected = false;
            switch (type) {
                case "camera":
                    select.options[1].selected = true;
                    break;
                case "pda":
                    select.options[2].selected = true;
                    break;
                case "mp3":
                    select.options[3].selected = true;
                    break;
                case "phone":
                    select.options[2].selected = true;
                    break;
                default:
					hideLoading();
                    return;            }
            return UcProductSelector.selectDimensionValue(1, select, 0);
        }
        
    }
    hideLoading();
}

UcProductSelector.renderProductDropdown = function(){
    var values = this._productCache.products;
    var s = "";
    s += "<tr><td class='generic-text'>Select Your Model</td>";
    s += "<td><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, specificImage;
    var altprod = false;
    
    var i;
    var s = "";
    
    if (mappings.length != 0) {
        s += "<table width='525px' border=0 cellspacing=0 cellpadding=0 style='padding-left:30px;'>";
        s += "<tr><td colspan='4' class='BodyText'>Compatible Products for <strong>" + product.name + "</strong></td></tr>";
        for (i = 0; i < mappings.length; i++) {
            var valueDesc = mappings[i].merchantDescription;
            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]["custom1"]!=null) specificImage=values[i]["custom1"]; else specificImage=null;
            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?flashmemory-store+" + value_custom4 + "'>";
                buynowtext += "<input name='vwitem' type='hidden' value='" + value_custom4 + "'>";
                buynowtext += "<INPUT TYPE='IMAGE' SRC='/lib/flashmemory-store/buynow2.jpg' VALUE='Flash Memory Store' border='0' valign='bottom'>";
                buynowtext += "<input type='hidden' name='.autodone' value='http://www.flash-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><td style='padding:10px;'><a href=" + valueUrl + ">";
			if(specificImage!=null)
				s+="<img src=http://us.st12.yimg.com/us.st.yimg.com/I/"+specificImage+"align=center border=0 hspace=0 vspace=0>";
			else
				s+="<img src=http://lib.stores.yahoo.net/lib/computermemorystore/" + valueImage +" width=64 height=64 align=center border=0 hspace=0 vspace=0>";
			s += "</a></td><td width='190px'><a href=" + valueUrl + " class=TahomaTextSBB>" + valueDesc + "</a></td><td width='160px' align='center'>" + valuesaletext + "</td><td>" + buynowtext + "</td></tr>";
            s += "<tr><td height='5px' colspan='4' class='TahomaTextSMU' align='left' background='http://lib.store.yahoo.net/lib/flashmemory-store/icons-bgdot.gif'></td></tr>";
        }
        
        s += "</table><br/><br/>";
    }
    else {
        s += "<table border=0 cellspacing=0 cellpadding=0 width=591><tr><th colspan='3'>No matching products were found</th></tr></table>";
    }
    s += '<table class="SpecTable" 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 = '';
    
    if (products.length != 0) {
        s += "<table border=0 cellspacing=0 cellpadding=0 width=591>";
        s += "<tr valign=bottom class='style3lg'>";
        s += "<th>";
        s += "Results for '" + this._query + "'";
        s += "</td>";
        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='#' onclick='UcProductSelector.getProductById(" + this.__ucObjId + "," + productId + ");'>" + productName + "</a></td></tr>";
        }
        s += '</table>';
        
        s += "<table>";
        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 += "</table>";
    }
    else {
        s += "<tr><td>No products matching this query were found.</td></tr>";
    }
    
    document.getElementById(this._resultTarget).innerHTML = s;
    hideLoading();
}

// Helper methods

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.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.flash-memory-store.com/proxy', 'bb058650-4ca1-11dd-ae16-0800200c9a66', '07a9974d-d063-49f1-a923-9db3df7d4cd3', 'flash-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];
    }
}
