﻿///<reference path="global.js" />
///<reference path="effects.js" />
///<reference path="controls.js" />
///<reference path="server.js" />
$utils = {
    init: function () {
        var wrap = $G.GET(".wrap:0");
        if (wrap)
            $FX.Page.wrap = wrap;
        $CS.init(document.body);
        for (var i in $utils) {
            if ($utils[i].init)
                $utils[i].init();
        }
    },
    delivery: {
        step: function (n) {
            window.scrollTo(0, $G.GetTopLeft($G.GET("#cart_form")).y);
            if (n == 2) {
                if ($utils.delivery.validate1().length > 0)
                    return;
                var step = $G.GET("#step2");
                if (step) {
                    step.style.display = "block";
                    step.style.height = "auto";
                }
                //                var a = $G.GET("#a-step2");
                //                if (a) { a.style.display = "none"; }
                var st1 = $G.GET("#step1");
                if (st1) {
                    st1.style.height = $G.GET(st1, "div:0").offsetHeight + "px";
                    $FX.Time(500).Interval(10).AnimateStyle(st1, "height", -st1.offsetHeight, 0, function () {
                        $G.GET("#step1").style.display = "none";
                        //                        var a = $G.GET("#a-step1");
                        //                        if (a) { a.style.display = ""; }
                        //window.scrollTo(0, $G.GetTopLeft($G.GET("#step2")).y);
                    }, null, "set-step-2");
                }

            }
            else {
                var step = $G.GET("#step1");
                if (step) {
                    step.style.display = "block";
                    step.style.height = "0px";
                    $FX.Time(500).Interval(10).AnimateStyle(step, "height", $G.GET(step, "div:0").offsetHeight + 17, $G.GET(step, "div:0").offsetHeight + 17, function () {
                        //                        $G.GET("#a-step2").style.display = "";
                        $G.GET("#step1").style.height = "auto";

                    }, null, "set-step-2");
                }
                //                var a = $G.GET("#a-step1");
                //                if (a) { a.style.display = "none"; }
                var st1 = $G.GET("#step2");
                if (st1) {
                    st1.style.height = $G.GET(st1, "div:0").offsetHeight + "px";
                    $FX.Time(500).Interval(10).AnimateStyle(st1, "height", -st1.offsetHeight, 0, function () {
                        $G.GET("#step2").style.display = "none";
                    }, null, "set-step-1");
                }

            }
        },
        changetype: function (text) {
            var change = $G.Get.ByClass($G.GET("#cart_form"), "changetype");
            for (var i = 0; i < change.length; i++) {
                change[i].innerHTML = change[i].innerHTML.toString().replace(/(доставки|самовывоза)/gi, text);
            }
        },
        refill: function () {
            $utils.Interact({ action: "GetShopParams" }, function (req) {
                $utils.delivery.params = req;
                $utils.delivery.recalc();
            }, null, "/Handlers/utils.ashx");
        },
        clearErrors: function () {
            var errors = $G.Get.ByClass($G.GET("#cart_form"), "error");
            for (var i = 0; i < errors.length; i++) {
                errors[i].style.display = "none";
            }
        },
        validate1: function () {
            var errors = [];
            $utils.delivery.validated1 = true;
            $utils.delivery.clearErrors();
            var c = $CS.get("pay.username");
            if (c && c.getValue().trim().length < 2)
                errors.push({ c: c, text: "Заполните поле &laquo;Представьтесь&raquo;." });
            c = $CS.get("pay.phone");
            var c2 = $CS.get("pay.email");
            if ((c && c.getValue().trim().length < 2) && (c2 && c2.getValue().trim().length < 2))
                errors.push({ c: c2, text: "Заполните хотя бы одно из полей &laquo;Телефон&raquo; или &laquo;E-mail&raquo;." });
            else {
                if (c && !/^[\+]?[0-9\-\(\)]{7,}$/gi.test(c.getValue())
                    && (c2 && c2.getValue().trim().length < 2)) {
                    errors.push({ c: c, text: "Поле &laquo;Телефон&raquo; заполнено не корректно." });
                }
                if (c2 && !/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/gi.test(c2.getValue())
                    && (c && c.getValue().trim().length < 2)) {
                    errors.push({ c: c2, text: "Поле &laquo;E-mail&raquo; заполнено не корректно." });
                }
            }
            c = $CS.get("delivery.delivery-type");
            if (c && c.getValue().toString() == "0")
                errors.push({ c: c, text: "Выберите способ отгрузки." });
            if (c && c.getValue() == "1") {
                c2 = $CS.get("delivery.d1.shop");
                if (c2 && +c2.getValue() < 1)
                    errors.push({ c: c2, text: "Выберите удобный Вам магазин." });
            }
            else if (c && c.getValue() == "2") {
                c = $CS.get("delivery.d2.address");
                if (c && c.getValue().trim().length < 2)
                    errors.push({ c: c, text: "Заполните поле &laquo;Адрес&raquo;." });
            }

            for (var i = 0; i < errors.length; i++) {
                var err = $G.GET(errors[i].c.obj, "up:1,next:1,.error:0");
                if (err) {
                    err.innerHTML = errors[i].text;
                    err.style.display = "";
                }
            }
            return errors;
        },
        validate2: function () {
            var errors = [];
            $utils.delivery.validated2 = true;
            if ($CS.get("pay.client-type").getValue() == "2") {
                var company = $CS.get("pay.company");
                for (var i = 0; i < company.options.length; i++) {
                    var c = company.options[i];
                    if (c.getValue().trim() == "") {
                        var label = "";
                        if (c.name == "inn" || c.name == "kpp") {
                            label = "Заполните поля &laquo;ИНН&raquo; и&nbsp;&laquo;КПП&raquo;."
                        }
                        else if (c.name == "address") {
                            label = "Заполните поле &laquo;Юридический&nbsp;адрес&raquo;.";
                        }
                        else {
                            label = "Заполните поле &laquo;" + $G.GET(c.obj, "prev:1").innerHTML.trim().replace(/\:$/gi, "").replace(/\s+/gi, "&nbsp;") + "&raquo;.";
                        }
                        errors.push({ c: c, text: label });
                    }
                    else {
                        if (c.name == "inn" && !/^[0-9]{10}$/gi.test(c.getValue().trim()))
                            errors.push({ c: c, text: "ИНН заполнен не корректно." });
                        if (c.name == "kpp" && !/^[0-9]{9}$/gi.test(c.getValue().trim()))
                            errors.push({ c: c, text: "КПП заполнен не корректно." });
                        if (c.name == "rs" && !/^[0-9]{20}$/gi.test(c.getValue().trim()))
                            errors.push({ c: c, text: "Расчетный счет заполнен не корректно." });
                        if (c.name == "ks" && !/^[0-9]{20}$/gi.test(c.getValue().trim()))
                            errors.push({ c: c, text: "Корреспондентский счет заполнен не корректно." });
                        if (c.name == "bik" && !/^[0-9]{9}$/gi.test(c.getValue().trim()))
                            errors.push({ c: c, text: "БИК заполнен не корректно." });
                    }
                }
                for (var i = 0; i < errors.length; i++) {
                    var err;
                    if (["bik", "inn", "kpp"].contains(errors[i].c.name)) {
                        err = $G.GET(errors[i].c.obj, "up:2,next:1,.error:0");
                    }
                    else {
                        err = $G.GET(errors[i].c.obj, "up:1,next:1,.error:0");
                    }
                    if (err) {
                        err.innerHTML = errors[i].text;
                        err.style.display = "";
                    }
                }
            }
            return errors;
        },
        send: function () {
            if ($utils.delivery.hold)
                return;
            if ($utils.delivery.validate2().length > 0)
                return;
            var params = {};
            params.comment = $CS.get("delivery.comment").getValue();
            params.needmaster = $CS.get("delivery.d2.need-master").checked();
            params.noelevator = $CS.get("delivery.d2.no-elevator").checked();
            params.deliverytype = $CS.get("delivery.delivery-type").getTitle();
            params.clientname = $CS.get("pay.username").getValue();
            params.clientphone = $CS.get("pay.phone").getValue();
            params.clientemail = $CS.get("pay.email").getValue();
            params.clienttype = $CS.get("pay.client-type").getTitle();
            params.paytype = $CS.get("pay.pay-type").getTitle();
            params.shop = $CS.get("delivery.d1.shop").getTitle();
            params.far = $CS.get("delivery.d2.far").getTitle();
            params.distance = $CS.get("delivery.d2.distance").getValue().toString();
            params.floor = $CS.get("delivery.d2.floor").getValue().toString();
            params.date = $CS.get("delivery.date").getValue();
            params.address = $CS.get("delivery.d2.address").getValue();
            params.company = {};
            params.company.name = $CS.get("pay.company.name").getValue();
            params.company.inn = $CS.get("pay.company.inn").getValue();
            params.company.kpp = $CS.get("pay.company.kpp").getValue();
            params.company.rs = $CS.get("pay.company.rs").getValue();
            params.company.bik = $CS.get("pay.company.bik").getValue();
            params.company.bank = $CS.get("pay.company.bank").getValue();
            params.company.ks = $CS.get("pay.company.ks").getValue();
            params.company.address = $CS.get("pay.company.address").getValue();
            params.fullPrice = $utils.delivery.params.summ.toString();

            var ps = [];
            for (var i in params) {
                if ($G.IsString(params[i])) {
                    ps.push(i + ":'" + params[i].replace(/'/gi, "\\'") + "'");
                }
                else if (params[i] === true || params[i] === false) {
                    ps.push(i + ":" + (params[i] ? "true" : "false"));
                }
                else {
                    var _p = [];
                    for (var j in params[i]) {
                        _p.push(j + ":'" + params[i][j] + "'");
                    }
                    ps.push("company:{" + _p.join(",") + "}");
                }
            }
            $utils.Interact({ action: "FinishOrder", options: "{" + ps.join(",") + "}" }, function (req) {
                if (req.ok) {
                    $G.GET("#cart_form").style.display = "none";
                    $G.GET("#message").style.display = "";
                    $G.GET("#message,span:0").innerHTML = req.orderId;
                    $G.GET("#main_title").innerHTML = "Поздравляем!";
                    $shop.clearCart('shop', $G.Get.ById('shopBasket'), $G.Get.ById('shoppingCart'), {});
                    window.scrollTo(0, 0);
                }
            }, { Show: function () { $G.GET("#orderBtn").innerHTML = "..."; $utils.delivery.hold = true; }, Hide: function () { $G.GET("#orderBtn").innerHTML = "Заказать"; $utils.delivery.hold = false; } }, "/Handlers/utils.ashx");
        },
        init: function () {
            $utils.delivery.refill();
            $utils.delivery.hide($CS.get("delivery.d1"));
            $utils.delivery.hide($CS.get("delivery.d2"));
            $utils.delivery.clearErrors();
            if ($CS.get("delivery")) {
                var del = $CS.get("delivery.d1").options.concat($CS.get("delivery.d2").options).concat($CS.get("delivery").options).concat([$CS.get("pay.username"), $CS.get("pay.phone"), $CS.get("pay.email")]);
                for (var i = 0; i < del.length; i++) {
                    if (del[i].cType != "compound") {
                        del[i].addOnChange(function () {
                            if ($utils.delivery.validated1)
                                $utils.delivery.validate1();
                        });
                    }
                }
                var except = ["username", "phone", "email"];
                del = $CS.get("pay.company").options.concat($CS.get("pay").options);
                for (var i = 0; i < del.length; i++) {
                    if (del[i].cType != "compound" && !except.contains(del[i].name)) {
                        del[i].addOnChange(function () {
                            if ($utils.delivery.validated2)
                                $utils.delivery.validate2();
                        });
                    }
                }
            }
            var ch = ["delivery.delivery-type", "delivery.d2.far", "delivery.d2.distance", "delivery.d2.need-master", "delivery.d2.no-elevator", "delivery.d2.floor"];
            for (var i = 0; i < ch.length; i++) {
                var c = $CS.get(ch[i]);
                if (c) {
                    c.addOnChange($utils.delivery.recalc);
                }
            }

            var type = $CS.get("delivery.delivery-type");
            if (type) {
                type.addOnChange(function () {
                    $utils.delivery.show($CS.get("delivery").get("d" + this.getValue()), ["distance"]);
                    if (this.getValue() == "1") {
                        $utils.delivery.hide($CS.get("delivery").get("d2"));
                        $utils.delivery.changetype("самовывоза");
                    }
                    else {
                        $utils.delivery.changetype("доставки");
                        $utils.delivery.hide($CS.get("delivery").get("d1"));
                    }
                } .bind(type));
            }
            type = $CS.get("delivery.d2.far");
            if (type) {
                type.addOnChange(function () {
                    $CS.get("delivery.d2").get("distance").obj.style.display = (this.getValue() == "1" ? "" : "none");
                    if ($G.GET("#distance")) {
                        $G.GET("#distance").style.display = (this.getValue() == "1" ? "" : "none");
                    }
                    $G.GET($CS.get("delivery.d2").get("distance").obj, "prev:1").style.display = this.getValue() == "1" ? "" : "none";
                } .bind(type));
            }
            $utils.Interact({ cache: true, action: "GetShops" }, function (req) {

                var opts = [];
                for (var i = 0; i < req.length; i++) {
                    opts.push({ text: req[i].title + " (" + req[i].metro + ")", value: req[i].id });
                }
                var shops = $CS.get("delivery.d1.shop");
                if (shops) {
                    shops.shops = req;
                    shops.formList(opts);
                    shops.set("Выберите магазин", -1);
                    shops.addOnChange(function () {
                        for (var i = 0; i < this.shops.length; i++) {
                            if (this.shops[i].id.toString() == this.getValue().toString()) {
                                $G.GET(this.obj, "up:1,next:1,span:1").innerHTML = this.shops[i].address;
                                break;
                            }
                        }
                    } .bind(shops));
                }

            }, null, "/handlers/utils.ashx");
            var ctype = $CS.get("pay.client-type");
            if (ctype) {
                ctype.addOnChange(function () {
                    if (this.getValue() == "1") {
                        $G.GET("#pay-1").style.display = "";
                        $G.GET("#pay-2").style.display = "none";
                    }
                    else {
                        $G.GET("#pay-1").style.display = "none";
                        $G.GET("#pay-2").style.display = "";
                    }
                } .bind(ctype));
            }
        },
        hide: function (cmpd) {
            if (cmpd) {
                for (var i = 0; i < cmpd.options.length; i++) {
                    cmpd.options[i].obj.style.display = "none";
                    var label = $G.GET(cmpd.options[i].obj, "prev:1");
                    if (label && label.tagName.toLowerCase() == "label") {
                        label.style.display = "none";
                    }
                    var d = $G.GET("#" + cmpd.options[i].name);
                    if (d) {
                        d.style.display = "none";
                    }
                }
            }
        },
        show: function (cmpd, except) {
            if (cmpd) {
                for (var i = 0; i < cmpd.options.length; i++) {
                    if (!except.contains(cmpd.options[i])) {
                        cmpd.options[i].obj.style.display = "";
                        var label = $G.GET(cmpd.options[i].obj, "prev:1");
                        if (label && label.tagName.toLowerCase() == "label") {
                            label.style.display = "";
                        }
                        var d = $G.GET("#" + cmpd.options[i].name);
                        if (d) {
                            d.style.display = "";
                        }
                    }
                }
                if (cmpd.name == "d2" && cmpd.get("far").getValue() == "1") {
                    cmpd.get("distance").obj.style.display = "";
                    $G.GET(cmpd.get("distance").obj, "prev:1").style.display = "";
                    $G.GET("#distance").style.display = "";
                }
                else if (cmpd.name == "d2") {
                    cmpd.get("distance").obj.style.display = "none";
                    $G.GET(cmpd.get("distance").obj, "prev:1").style.display = "none";
                    $G.GET("#distance").style.display = "none";
                }
            }
        },
        recalc: function () {


            var summ = 0;
            var del = $CS.get("delivery");
            if (del) {
                if ($utils.delivery.params.fullPrice == 0) {
                    $G.GET("#cart_form").style.display = "none";
                    return;
                }
                var dt = del.get("delivery-type");
                if (dt.getValue() == "2") {
                    summ += $utils.delivery.params.deliveryPrice;
                    var dfar = del.get("d2").get("far");
                    if (dfar.getValue() == "0") {
                        $G.GET(dfar.obj, "up:1,next:1,span:0").innerHTML = "+" + $utils.delivery.params.deliveryPrice + " руб.";
                        $G.GET(del.get("d2").get("distance").obj, "up:1,next:1,span:0").innerHTML = "+0 руб.";
                    }
                    else {
                        var _v = (+del.get("d2").get("distance").getValue()) * $utils.delivery.params.deliveryLongPrice;
                        $G.GET(dfar.obj, "up:1,next:1,span:0").innerHTML = "+" + summ + " руб.";
                        summ += _v;
                        $G.GET(del.get("d2").get("distance").obj, "up:1,next:1,span:0").innerHTML = "+" + _v + " руб.";
                    }
                    var ne = del.get("d2").get("no-elevator");
                    if (ne.checked()) {
                        var _v = (+del.get("d2").get("floor").getValue()) * $utils.delivery.params.floorPrice * $utils.delivery.params.doorCount;
                        $G.GET(del.get("d2").get("floor").obj, "up:1,next:1,span:0").innerHTML = "+" + _v + " руб.";
                        summ += _v;
                    }
                    else {
                        $G.GET(del.get("d2").get("floor").obj, "up:1,next:1,span:0").innerHTML = "+0 руб.";
                    }
                    var ms = del.get("d2").get("need-master");
                    if (ms.checked()) {
                        summ += $utils.delivery.params.masterPrice;
                    }
                }
                $G.GET("#full-price").innerHTML = "Итого: " + (summ + $utils.delivery.params.fullPrice) + " руб.";
                $G.GET("#full-price2").innerHTML = "Итого: " + (summ + $utils.delivery.params.fullPrice) + " руб.";
                $utils.delivery.params.summ = summ + $utils.delivery.params.fullPrice;
            }
        }
    },
    cache: {},
    defaultPreloader: { Show: function () { }, Hide: function () { } },
    Interact: function (postdata, onSuccess, preloader, handler, reqname) {
        if (!preloader) preloader = $utils.defaultPreloader;
        if (preloader) { preloader.Show(); };
        var name = "";
        if (postdata.cache) {
            var p = [];
            for (var i in postdata) {
                if (postdata[i] != null) {
                    p.push(i);
                    p.push(postdata[i].toString().replace(/[^a-z0-9\-\_]+/gi, ""));
                }
            }
            name = p.join("-");
        }
        if (postdata && postdata.cache && $utils.cache[name] != null) {
            if (preloader) { preloader.Hide(); };
            if (onSuccess)
                onSuccess($utils.cache[name]);
            else
                return $utils.cache[name];
        }
        else {
            $server.Send(handler || $utils.handler || "utils.ashx", function (req) {
                if ($G.HTML.GETVars("debug"))
                    debugger

                var obj = null;
                try { obj = eval("(" + req.responseText + ")"); }
                catch (e) { }

                if (this.preloader) { this.preloader.Hide(); };
                if (obj && this.func) {
                    if (this.postdata.cache)
                        $utils.cache[name] = obj;
                    this.func(obj);
                }
            } .bind({ name: name, func: onSuccess, preloader: preloader, postdata: postdata }), (preloader ? preloader.Hide : function () { }), postdata, true, reqname);
        }
    }
}
addDOMLoadEvent($utils.init);
