﻿var UIServiceProxy = {
    ServiceUrl: '/webservices/UI/UIService.asmx/',
    AddToCart: function(code, quantity, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "AddToCart",
            data: "{code:'" + code + "',quantity:" + quantity + "}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    RemoveFromCart: function(code, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "RemoveFromCart",
            data: "{code:'" + code + "'}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    SetQty: function(code, quantity, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "SetQty",
            data: "{code:'" + code + "',quantity:" + quantity + "}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    Register: function(email, firstName, account, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "Register",
            data: "{email:'" + email + "',firstName:'" + firstName + "',account:" + account + "}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    SetPromotionCode: function(code, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "SetPromotionCode",
            data: "{code:'" + code + "'}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    SignIn: function(email, password, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "SignIn",
            data: "{email:'" + email + "',password:'" + password + "'}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    SetFedexService: function(type, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "SetFedexService",
            data: "{type:'" + type + "'}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    },
    RecordClipClick: function(name, productId, onSuccess, onError) {
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: UIServiceProxy.ServiceUrl + "RecordClipClicks",
            data: "{name:'" + name + "',productId:" + productId + "}",
            dataType: "json",
            success: onSuccess,
            error: onError
        });
    }
};


function ShoppingBag() {
    var sbBag;
    var oNumItems;
    var oLpImage;
    var oLpName;
    var oLpPpu;
    var oLpQty;
    var oLpTotal;
    var oTotal;
    var sbNumItems;
    var oDiscount;
    var oShipping;
    var oTax;

    var sbCloseTimeoutId = null;

    $(function() {
        sbBag = $('.sb-bag');
        oNumItems = $('.o-numitems');
        oLpImage = $('.o-lp-image');
        oLpName = $('.o-lp-name');
        oLpPpu = $('.o-lp-ppu');
        oLpQty = $('.o-lp-qty');
        oLpTotal = $('.o-lp-total');
        oTotal = $('.o-total');
        oDiscount = $('.o-discount');
        oShipping = $('.o-shipping');
        oTax = $('.o-tax');

        $('.sb-bag-close').click(function() {
            if (sbCloseTimeoutId != null) window.clearTimeout(sbCloseTimeoutId);
            sbBag.slideUp('slow');
        });

        sbBag.mouseenter(function() {
            if (sbCloseTimeoutId != null) window.clearTimeout(sbCloseTimeoutId);
        });

        sbBag.mouseleave(function() {
            setBagTimeout();
        });
    });

    function setBagTimeout() {
        //return;
        sbCloseTimeoutId = window.setTimeout(
            function() {
                sbBag.slideUp('slow');
            },
            5000
        );

    }

    var intface = {
        AddToBag: function(code, quantity, callback, btn) {
            if (sbCloseTimeoutId != null) window.clearTimeout(sbCloseTimeoutId);
            if (btn) {
                btn = $(btn);
                preloader.Open(btn);
            }
            UIServiceProxy.AddToCart(code, quantity, function(data) {
                data = data.d;
                oNumItems.html(data.NumItemsInBag);
                oTotal.html(data.TotalSum);
                oLpImage.attr('src', data.LastPurchase.Pic);
                oLpName.html(data.LastPurchase.ProductName);
                oLpPpu.html(data.LastPurchase.PricePerUnit);
                oLpQty.html(data.LastPurchase.Quantity);
                oLpTotal.html(data.LastPurchase.TotalPrice);

                sbBag.slideDown('slow');
                setBagTimeout();

                scrollWin();
                if (btn)
                    preloader.Close();

                if (callback != null && typeof callback == 'function')
                    callback(data.d);
            }, function(req) {
                preloader.Close();
                alert(eval('tmp=' + req.responseText).Message);
            });
        },
        Remove: function(code, callback) {
            UIServiceProxy.RemoveFromCart(code, function(data) {
                data = data.d;
                oNumItems.html(data.NumItemsInBag);

                if (callback != null && typeof callback == 'function')
                    callback(data.d);
            });
        },
        SetQty: function(code, quantity, callback) {
            UIServiceProxy.SetQty(code, quantity, function(data) {
                data = data.d;
                oNumItems.html(data.NumItemsInBag);
                if (callback != null && typeof callback == 'function')
                    callback(data.d);
            });
        },
        SetPromotionCode: function(code, callback) {
            UIServiceProxy.SetPromotionCode(code,
                function(data) {
                    if (callback != null && typeof callback == 'function')
                        callback(data.d);

                }
            );
        },
        SetFedexService: function(type, callback) {
            UIServiceProxy.SetFedexService(type, function(data) {
                var res = data.d;
                if (res.Success) {
                    oTotal.html(res.Total);
                    oTax.html(res.Tax);
                    oDiscount.html(res.Discount);
                    oShipping.html(res.Shipping);
                }
                if (callback != null && typeof callback == 'function')
                    callback(res);

            });
        }
    }

    return intface;
}

var shopingBag = ShoppingBag();

function NumericUpDown(inpId, upId, downId, initValue, callback, context) {

    var inputElm = $('#' + inpId);
    var upElm = $('#' + upId);
    var downElm = $('#' + downId);
    var curValue = initValue;

    inputElm.attr('readonly', 'readonly');
    inputElm.val(initValue);
    upElm.click(
                    function() {
                        inputElm.val(++curValue);
                        triggerEvent();
                    }
                );

    downElm.click(
                    function() {
                        if (curValue > 1) {
                            inputElm.val(--curValue);
                            triggerEvent();
                        }
                    }
                );

    function triggerEvent() {
        if (callback != null && typeof callback == 'function') {
            callback(context, curValue);
        }
    }
}

function Tabs(selector) {
    var titlesCont = $('> ul', selector);
    var titles = $('> li', titlesCont);
    var bodies = $('> div > div', selector);

    var curTabIndex = 0;

    for (var index = 0; index < titles.length; index++) {
        var title = titles[index];
        title.index = index;
        $(title).click(onTitleClick);
    }

    selectTab(0);

    function onTitleClick() {
        selectTab(this.index);
    }

    function selectTab(index) {
        bodies.hide();
        $(bodies[index]).show();
        titlesCont.removeClass('tab' + (curTabIndex + 1));
        curTabIndex = index;
        titlesCont.addClass('tab' + (curTabIndex + 1));
        titles.removeClass('selected');
        $(titles[index]).addClass('selected');

    }
}

function QuickPurchase(qtySelector, btnSelector, codeSelector) {
    var codeInpt = $(codeSelector);
    var qtyInpt = $(qtySelector);
    var btn = $(btnSelector);

    btn.click(function() {
        var code = codeInpt.val();
        var qty = qtyInpt.val();
        if (qty > 1000 || qty < 1) {
            alert('Not a valid quantity.');
            qtyInpt.val(1);
            return;
        }
        preloader.Open(btn, -130, 5);
        shopingBag.AddToBag(code, qty, preloader.Close);
    });
}

function RegisterationBox(selector, validationGroup, account) {
    var inpEmail = $('.email', selector);
    var inpFname = $('.fname', selector);
    var errorMessage = $('.error', selector);
    var btn = $('.btn', selector);

    btn.click(onClick);

    function onContMouseLeave(event) {
        setCloseTimeout();
    }

    function onClick(event) {
        event.preventDefault();

        if (validationGroup) {
            Page_ClientValidate(validationGroup);

            if (!Page_IsValid)
                return;
        }

        var email = inpEmail.val() || '';
        var fname = inpFname.val() || '';

        preloader.Open(btn,-140);
        
        UIServiceProxy.Register(email, fname, account, onSuccess, onError);

        function onSuccess() {
            preloader.Close();
            window.location = btn.attr('href');
        }

        function onError(response) {
            preloader.Close();
            errorMessage.show();
            var message = eval('temp = ' + response.responseText).Message;
            errorMessage.html(message);
        }
    }
}
function DropDownBoxList() {

    var ddls = {};
    
    function onOpen(selector) {
        for (var key in ddls) {
            if (key != selector) {
                ddls[key].Close();
            }
        }
    }
    
    return {
        Register: function(selector) {
            ddls[selector] = DropDownBox(selector, onOpen);
        }
    }
}
var ddlList = DropDownBoxList();
function DropDownBox(selector,onOpen) {

    var openBtn = $('.openBtn', selector);
    var closeBtn = $('.closeBtn', selector);
    var cont = $('.cont', selector);
    var intvl = null;
    var isOpened = false;
    var inFocus = false;

    openBtn.click(onOpenBtnClick);
    closeBtn.click(close);
    cont.mouseenter(onContMouseEnter);
    cont.mouseleave(onContMouseLeave);
    $('input', cont).focus(onInputFocus);
    $('input', cont).blur(onInputBlur);

    function onOpenBtnClick(event) {
        if (isOpened) {
            close();
        } else {
            open();
        }
        openBtn.blur();
    }

    function open() {
        cont.slideDown('fast');
        setCloseTimeout();
        isOpened = true;
        openBtn.addClass('opened');
        if (onOpen != null && typeof onOpen == 'function')
            onOpen(selector);
    }

    function close() {
        cont.slideUp('fast');
        window.clearTimeout(intvl);
        intvl = null;
        isOpened = false;
        openBtn.removeClass('opened');

    }

    function onContMouseEnter(event) {
        if (intvl != null) {
            window.clearTimeout(intvl);
        }
    }

    function onInputFocus() {
        inFocus = true;
        if (intvl != null) {
            window.clearTimeout(intvl);
        }
    }
    function onInputBlur() {
        inFocus = false;
    }

    function onContMouseLeave(event) {
        if(!inFocus)
            setCloseTimeout();
    }

    function setCloseTimeout() {
        intvl = window.setTimeout(
                    close,
                    5000
                );
    }

    return {
        Close: function() { close(); }
    }
}

function InputsBinder() {
    var bindedInputs = [];

    function bindInputs(src, trg, enableOnStrart) {
        var eventName;
        var enabled = enableOnStrart;
        switch (src[0].tagName) {
            case 'INPUT':
            case 'TEXTAREA':
                eventName = 'keyup';
                break;
            case 'SELECT':
                eventName = 'change';
                break;
        }

        if (enableOnStrart)
            enable();
        src.bind(eventName, onEvent);
        
        function onEvent() {
            if (enabled) {
                trg.val(src.val());
                trg.trigger(eventName)
            }
        }

        function enable() {
            if (trg[0] && src[0]) {
                trg.val(src.val());
                trg[0].disabled = true
                enabled = true;
            }
        }

        function disable() {
            if (trg[0] && src[0]) {
                trg[0].disabled = false
                enabled = false;
            }
        }

        var ipublic = {
            enable: enable,
            disable: disable
        };
        return ipublic;

    }

    var ipublic = {
        Register: function(src, trg, enable) {
            src = $(src);
            trg = $(trg);
            if (src.length == 0 || trg.length == 0) return;
            bindedInputs.push(bindInputs(src, trg));
        },
        Enable: function() {
            $(bindedInputs).each(function() { this.enable(); });
        },
        Disable: function() {
            $(bindedInputs).each(function() { this.disable(); });
        }
    };

    return ipublic;
}

function StateControl(countryDDlSelector, stateSelContSelector, stateInptContSelector) {

    var countryDDl = $(countryDDlSelector);
    var stateSelCont = $(stateSelContSelector);
    var stateSel = $('select', stateSelCont);
    var stateInptCont = $(stateInptContSelector);
    var stateInpt = $('input', stateInptCont);
    var countryCode = stateSel.attr('Country');

    toggleStateInputs();

    stateSel.change(function() {
        stateInpt.val(stateSel.val());
        stateInpt.trigger('keyup');
    });

    countryDDl.change(function() {
        clear();
        toggleStateInputs();
    });

    function toggleStateInputs() {
        var selCountryCode = countryDDl.val();

        if (countryCode == selCountryCode) {
            stateSelCont.show();
            stateInptCont.hide();

        } else {
            stateSelCont.hide();
            stateInptCont.show();
        }
    }

    function clear() {
        stateSel.val('');
        stateInpt.val('');
        stateInpt.trigger('keyup');
        stateSel.trigger('change');
    }
}

function Preloader() {
    var ploader;
    $(function() {
        ploader = $('#preloader');
    });

    return {
        Open: function(btn, offsetX, offsetY) {
            var btn = $(btn);
            var pos = btn.offset();
            if (offsetX)
                pos.left += offsetX;
            if (offsetY)
                pos.top += offsetY;
            
            ploader.css({ 'display': 'block', 'top': (pos.top + 2) + 'px', 'left': (pos.left + $(btn).width() + 10) + 'px' });

        },
        Close: function() {
            ploader.css('display', 'none');
        }
    };
}

var preloader = Preloader();

