﻿/// <reference path="jquery-1.2.6.js" />
var prefix = "#masterPage_pageContentRegion_";
var summaryBox = prefix + "summaryBox_ctl00_";
var summaryBoxFork = summaryBox + "fork";
var summaryBoxWheelset = summaryBox + "wheelset";
var summaryBoxWeight = summaryBox + "weight";
var summaryBoxSubtotal = summaryBox + "subtotal";
var summaryBoxPanel = prefix + "summaryBoxPanel";

function Item(getMethod, updateMethod, controlName) {
    this.getMethod = getMethod ? getMethod : "";
    this.updateMethod = updateMethod ? updateMethod : "";
    this.controlName = controlName ? controlName : "";
    this.dropDownName = controlName;
    this.imageName = controlName;
    this.containerName = controlName;

    var me = this;
    
    this.SelectedValue = function() {
        return $(me.dropDownName).val();
    };
}

Item.prototype = {
    getMethod: "",
    updateMethod: "",
    controlName: "",
    dropDownName: "",
    imageName: "",
    containerName: "",
    units: "g",
    showAddSub: true,
    showSingleItem: true,
    prefix: null,
    controlSuffix: null,
    imageSuffix: null,
    containerSuffix: null,

    Init: function() {
        var me = this;

        if (!me.pageLogic) {
            throw ("PageLogic not defined");
        }

        me.prefix = me.prefix != null ? me.prefix : me.pageLogic.prefix;
        me.controlSuffix = me.controlSuffix != null ? me.controlSuffix : me.pageLogic.controlSuffix;
        me.imageSuffix = me.imageSuffix != null ? me.imageSuffix : me.pageLogic.imageSuffix;
        me.containerSuffix = me.containerSuffix != null ? me.containerSuffix : me.pageLogic.containerSuffix;

        me.dropDownName = me.dropDownName ? me.prefix + me.dropDownName + me.controlSuffix : "";
        me.imageName = me.imageName ? me.prefix + me.imageName + me.imageSuffix : "";
        me.containerName = me.containerName ? me.prefix + me.containerName + me.containerSuffix : "";

        var selectObj = $(me.dropDownName);

        if (selectObj) {
            selectObj.bind("change", me, me.OnUpdate);
            selectObj.bind("keypress", me, me.OnUpdate);
            selectObj.bind("LoadComplete", me, me.OnLoadComplete);
            selectObj.bind("UpdateComplete", me, me.OnUpdateComplete);
        }
    },

    Load: function() {
        var me = this;
        var dropDownObj = $(me.dropDownName);

        if (me.getMethod) {
            // disable the drop down and display loading text.
            dropDownObj.addOption("-1", "Loading...", true).attr("disabled", "disabled");

            // clear the previously selected item
            me.selectedItem = null;

            // disable dependencies
            if (me.dependentItems) {
                $.each(me.dependentItems, function() {
                    $(this.dropDownName).addOption("-1", "Loading...", true).attr("disabled", "disabled");
                });
            }

            var action = {
                success: function(msg) {
                    $(me.dropDownName).data("items", msg.d);
                    me.LoadDropDownItems();
                    dropDownObj.triggerHandler("LoadComplete", me);
                },
                error: function(e) {
                    //alert("Load failed: " + me.controlName);
                    dropDownObj.triggerHandler("LoadComplete", me);
                }
            };

            me.pageLogic.ExecuteCall(me.getMethod, me.getParameters, action);
        }
        else {
            dropDownObj.triggerHandler("LoadComplete", me);
        }
    },

    OnLoadComplete: function(e) {
        var me = e ? e.data : this;

        me.UpdateContainer();
        me.OnUpdate();
    },

    OnUpdate: function(e) {
        var me = e ? e.data : this;

        me.UpdateItem();
    },

    OnUpdateComplete: function(e) {
        var me = e ? e.data : this;

        me.UpdateSelectedItem();
        me.UpdateDropDownItems();
        me.UpdateImage();
        me.LoadDependentItems();
    },

    UpdateItem: function() {
        var me = this;
        var dropDownObj = $(me.dropDownName);
        var selectedValue = dropDownObj.val();
        var data = dropDownObj.data("items");

        if (me.updateMethod && data && data.length > 0) {
            var action = {
                success: function(msg) {
                    dropDownObj.triggerHandler("UpdateComplete", me);
                },
                error: function(e) {
                    //alert("Update failed: " + me.controlName);
                    dropDownObj.triggerHandler("UpdateComplete", me);
                }
            };

            me.pageLogic.ExecuteCall(me.updateMethod, me.updateParameters, action);
        }
        else {
            dropDownObj.triggerHandler("UpdateComplete", me);
        }
    },

    AddDependentItem: function(itemName, item) {
        var me = this;

        if (me.dependentItems) {
            me.dependentItems[itemName] = item;
        }
    },

    ClearDependentItems: function() {
        var me = this;

        me.dependentItems = {};
    },

    LoadDependentItems: function() {
        var me = this;

        if (me.dependentItems) {
            $.each(me.dependentItems, function() {
                this.Load();
            });
        }
    },

    UpdateImage: function() {
        var me = this;

        if (me.imageName && me.selectedItem && me.selectedItem.Image) {
            $(me.imageName).attr("src", me.pageLogic.appRoot + me.pageLogic.imagePath + me.selectedItem.Image);
        }
    },

    UpdateContainer: function() {
        var me = this;

        if (me.containerName) {
            var containerObj = $(me.containerName);
            var data = $(me.dropDownName).data("items");

            if (data && data.length > 0 && (me.showSingleItem || data.length != 1)) {
                containerObj.show();
            }
            else {
                containerObj.hide();
            }
        }
    },

    ///////////////////////////////////////////////////////////////////////////
    // DropDown functions
    ///////////////////////////////////////////////////////////////////////////

    LoadDropDownItems: function() {
        var me = this;
        var data = $(me.dropDownName).data("items");

        if (data) {
            var selectObj = $(me.dropDownName);
            var currentManufacturer = "";

            // remove all items
            selectObj.removeOption(/./);

            // enable the drop down
            selectObj.attr("disabled", "");

            for (index in data) {
                var item = data[index];

                if (item.Selected) {
                    me.selectedItem = item;
                }

                if (item.Manufacturer != currentManufacturer && index > 0) {
                    selectObj.addOption(-index, "------------------------------", false);
                }

                currentManufacturer = item.Manufacturer;
                selectObj.addOption(item.Id, item.Description, item.Selected);
            }

            // TJH 3-6-2009 Adding options seems to reset the selected item.
            // We add it once more here to ensure it is selected
            if (me.selectedItem) {
                selectObj.addOption(me.selectedItem.Id, me.selectedItem.Description, true);
            }
        }
    },

    UpdateDropDownItems: function() {
        var me = this;
        var selectObj = $(me.dropDownName);
        var data = selectObj.data("items");

        if (data) {
            var selectedValue = selectObj.val();

            for (index in data) {
                if (me.selectedItem && me.selectedItem.Id) {
                    if (data[index].Id == me.selectedItem.Id) {
                        selectObj.addOption(data[index].Id, data[index].Description);
                    }
                    else {
                        var price = ((data[index].SalePrice - me.selectedItem.SalePrice) * data[index].Quantity);
                        var weight = ((data[index].Weight - me.selectedItem.Weight) * data[index].Quantity).toFixed(2);
                        var sub = "";
                        var add = "";

                        if (me.showAddSub || selectedValue > 0) {
                            sub = "Subt ";
                            add = "Add ";
                        }

                        if (price == 0) {
                            price = "";
                        }
                        else {
                            price = (price < 0) ? sub + FormatCurrency(Math.abs(price)) : add + FormatCurrency(price);
                            price = " (" + price + ")";
                        }
                        if (weight == 0) {
                            weight = "";
                        }
                        else {
                            weight = (weight < 0) ? sub + Math.abs(weight) : add + weight;
                            weight = " [" + weight + me.units + "]";
                        }

                        description = data[index].Description + weight + price;
                        selectObj.addOption(data[index].Id, description);
                    }
                }
            }

            if (selectedValue) {
                selectObj.selectOptions(selectedValue);
            }
        }
    },

    UpdateSelectedItem: function() {
        var me = this;
        var selectedValue = $(me.dropDownName).val();
        var data = $(me.dropDownName).data("items");

        if (data) {
            for (index in data) {
                if (data[index].Id == selectedValue) {
                    me.selectedItem = data[index];
                    return;
                }
            }
        }
    }
};

function PageLogic() {
}

PageLogic.prototype = {
    buildId: 0,
    appRoot: "",
    styleCode: "",
    imagePath: "",
    prefix: "",
    controlSuffix: "",
    imageSuffix: "",
    containerSuffix: "",
    store: "",
    items: {},
    factoryWheels: {},
    customWheels: {},

    Init: function() {
        var me = this;

        for (index in me.items) {
            me.items[index].Init();
        }

        switch (me.styleCode.replace(/^\s+|\s+$/g, "")) {
            case "R":
                me.store = "Road";
                break;
            case "C":
                me.store = "Cyclocross";
                break;
            case "TT":
                me.store = "TimeTrial";
                break;
            case "M":
            case "HT":
            case "ST":
            case "XC":
            case "AM":
            case "FR":
            case "DH":
            case "DJ":
            case "29":
                me.store = "Mountain";
                break;
            case "SS":
                me.store = "SingleSpeed";
                break;
            case "TK":
                me.store = "Track";
                break;
        }


        me.InitCustomWheels();
        me.InitFactoryWheels();
    },

    InitCustomWheels: function() {
        var me = this;

        for (index in me.customWheels) {
            me.customWheels[index].pageLogic = me;
            me.customWheels[index].Init();
        }
    },

    InitFactoryWheels: function() {
        var me = this;

        for (index in me.factoryWheels) {
            me.factoryWheels[index].pageLogic = me;
            me.factoryWheels[index].Init();
        }
    },

    CreateItem: function(getMethod, updateMethod, controlName) {
        var me = this;

        me.items[controlName] = new Item(getMethod, updateMethod, controlName);
        me.items[controlName].pageLogic = me;

        return me.items[controlName];
    },

    LoadUrl: function(urlStem) {
        var me = this;

        location = me.appRoot + urlStem + "?stylecode=" + me.styleCode + "&buildid=" + me.buildId;
    },

    ExecuteCall: function(webServiceFunction, parameters, actions) {
        var me = this;

        var url = "WSLogicService.asmx/" + webServiceFunction;
        var data = me.GetParameters(parameters);

        if (actions == undefined) {
            actions = {};
        }

        return me.AjaxRequest(url, data, actions);
    },

    AjaxRequest: function(url, data, actions) {
        var me = this;

        url = me.appRoot + "/Tests/" + url;
        needsUpdate = true;

        var request = $.ajax({
            type: "POST",
            url: url,
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            async: true,
            cache: false,
            success: actions.success,
            error: actions.error
        });

        return request;
    },

    GetParameters: function(parameters) {
        var me = this;

        var newParameters = {};
        newParameters.buildId = me.buildId;

        if (parameters) {
            for (param in parameters) {
                if (typeof (parameters[param]) == "function") {
                    newParameters[param] = parameters[param]();
                }
                else {
                    newParameters[param] = parameters[param];
                }
            }
        }

        return me.GetStringFromJSON(newParameters);
    },

    // requires json2.js
    GetStringFromJSON: function(json) {
        return JSON.stringify(json).replace("''", "'");
    }
};

///////////////////////////////////////////////////////////////////////////////
// Misc functions
///////////////////////////////////////////////////////////////////////////////

function InitScrollControl(divName) {
    $(window).scroll(function() {
        var offset = 15;
        var top = $(window).scrollTop() + offset;

        if (top < 150) {
            top = 150 + offset;
        }

        $(divName).animate({ top: top + "px" }, { queue: false, duration: 100 });
    });

    $(divName).disableTextSelect();
}

function FormatCurrency(num) {
    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num))
        num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++)
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
    return (((sign) ? '' : '-') + '$' + num + '.' + cents);
}

function SetVisibility(selectName, isVisible) {
    selectObj = $(selectName);
    
    if (isVisible) {
        selectObj.show();
    }
    else {
        selectObj.hide();
    }
}

///////////////////////////////////////////////////////////////////////////////

var needsUpdate = true;

function InitSummaryBox(pageLogic) {
    $(summaryBoxPanel).ajaxStop(function() {
        if (needsUpdate) {
            UpdateSummaryBox(pageLogic);
        }
    });
}

function UpdateSummaryBox(pageLogic) {
    var url = "WSLogicService.asmx/GetCompleteBikeSummary";
    var data = pageLogic.GetParameters();
    var actions = {
        success: function(msg) {
            if (msg.d) {
                $(summaryBoxFork).text(msg.d.Fork);
                $(summaryBoxWheelset).text(msg.d.Wheelset);
                $(summaryBoxWeight).text(msg.d.TotalPounds);
                $(summaryBoxSubtotal).text(FormatCurrency(msg.d.TotalPrice));
            }
        }
    };

    pageLogic.AjaxRequest(url, data, actions);
    needsUpdate = false;
}

///////////////////////////////////////////////////////////////////////////////
// Debugging
///////////////////////////////////////////////////////////////////////////////

function DebugResult(result) {
    for (item in result) {
        if (item == "responseText" || item == "responseXML")
            alert("result[" + item + "]: " + result[item]);
    }
}

function DebugObject(obj) {
    if (obj) {
        $.each(obj, function() {
            alert("obj[" + item + "]: " + obj[item]);
        });
    }
}