

var ENTRY_PHONE = 16;

var maller = {
    google_jsapi_key: "ABQIAAAACHph_9qP9gbkDyykyBGfJBRHj3_1q_ALO3GQBI67TfnZPq-IWhQUWvbz7QDAb0wSswCCuvsetOw5gQ",
    // Переменная, определяющая работает ли ajax
    ajax_working: false,
    unload_check: false,
    get_data: undefined, // пользовательская функция получения данных объекта.
    loaded_data: undefined, // результат выполнения функции get_data после загрузки страницы.

    unload_function: function() {
        if (maller.get_data != undefined) {
            if (!maller.is_equal_objects(maller.loaded_data, maller.get_data())) {
                return true;
            } else {
                return false;
            }
        } else {
            return maller.unload_check;
        }
    },

    STATUS_OK: 200,
    STATUS_ERROR: 500,

    LANGUAGE: "en",
    COUNTRY: "55",
    REGION: "",
    CITY: "",

    // Массив системных ошибок
    error_codes: {
        "403": "Доступ к ресурсу запрещен.",
        "404": "Указанный ресурс не найден.",
        "408": "Сервер не отвечает. Попробуйте повторить запрос через некоторое время.",
        "500": "Внутренная ошибка сервера. Попробуйте повторить запрос через некоторое время."
    },

    // Функция создания копии объекта
    clone_object: function(object) {
        if (typeof(object) != "object")
            return object;

        var newObject = object.constructor();
        for (var objectItem in object) {
            newObject[objectItem] = maller.clone_object(object[objectItem]);
        }

        return newObject;
    },

    // Функция проверки идентичности двух объектов
    is_equal_objects: function(object1, object2) {
        for (var item in object1) {
            if (typeof(object1[item]) == "object" && typeof(object2[item]) == "object") {
                if (!maller.is_equal_objects(object2[item], object1[item])) {
                    return false;
                }
            } else {
                if (object2[item] != object1[item]) {
                    return false;
                }
            }
        }

        for (var item in object2) {
            if (typeof(object1[item]) == "object" && typeof(object2[item]) == "object") {
                if (!maller.is_equal_objects(object1[item], object2[item])) {
                    return false;
                }
            } else {
                if (object1[item] != object2[item]) {
                    return false;
                }
            }
        }

        return true;
    },

    // Возвращает значение атрибута объекта или def, если атрубута нет.
    getattr: function(object, attr, def) {
        if (def == undefined)
            def = null;

        if (object == undefined || !object)
            return def;
        else {
            if (object[attr] != undefined)
                return object[attr];
            else
                return def;
        }
    },

    // Возвращает id объекта
    get_id: function(object, def) {
        return this.getattr(object, "id", def);
    },

    // Определяет пустой ли объект
    empty_object: function(object) {
        for (var item in object)
            return false;

        return true;
    },

    // Преобразует массив в объект по ключу
    list_to_dict: function(l, key) {
        if (key == undefined) {
            key = "id";
        }

        var d = {}
        for (var item in l) {
            if (typeof(l[item]) == "object") {
                d[l[item][key]] = l[item];
            } else {
                d[l[item]] = l[item]
            }
        }

        return d;
    },

    // сохранение данных пользователя
    user_save: function(params) {
        var data = {
            url: "/me/",
            type: "PUT",
            data: params.data
        }

        if (params.success != undefined) {
            data["success"] = params.success;
        }

        if (params.error != undefined) {
            data["error"] = params.error;
        }

        if (params.loading != undefined) {
            data["loading"] = params.loading;
        }

        maller.ajax(data);
    },

    // запрос на выполнение функции
    proc: function(params) {
        var data = {
            url: "/func/",
            type: "GET",
            data: params.data
        }

        if (params.type != undefined) {
            data["type"] = params.type;
        }

        if (params.success != undefined) {
            data["success"] = params.success;
        }

        if (params.error != undefined) {
            data["error"] = params.error;
        }

        if (params.loading != undefined) {
            data["loading"] = params.loading;
        }

        if (params.button != undefined) {
            data["button"] = params.button;
        }

        maller.ajax(data)
    },

    // mall-er ajax-запрос
    ajax: function(params) {
        if (typeof params.button != "undefined") {
            params.button.attr("disabled", true);
        }

        if (typeof params.loading != "undefined") {
            if (typeof params.loading.container != "undefined") {
                params.loading.container.empty().removeClass("loading-error loading-success");
                if (params.loading.small) {
                    params.loading.container.addClass("loading-span-small");
                    var image = $("#loading-image-small").clone().removeAttr("id");
                } else {
                    params.loading.container.addClass("loading-span");
                    var image = $("#loading-image").clone().removeAttr("id");
                }
                image.appendTo(params.loading.container);
            }

            if (typeof params.loading.loading_message != "undefined") {
                var span = $("<span></span>").html(params.loading.loading_message);
                span.appendTo(params.loading.container);
            }
            if (typeof params.loading.permission_message == "undefined") {
                params.loading.permission_message = "У вас недостаточно прав доступа."
            }

            if (typeof params.loading.edit_list != "undefined") {
                params.loading.edit_list.MallerEdit({"loading": true});
            }

        } else {
            params.loading = {};
        }

        var data = {
            url: params.url,
            type: params.type,
            success: function (json) {
                if (typeof params.button != "undefined") {
                    params.button.attr("disabled", false);
                }

                if (typeof params.loading.container != "undefined") {
                    $(params.loading.container).empty();
                }

                $(".error-div").empty();

                if (typeof(json) == "string") {
                    var html = json;
                    if (typeof params.loading.success_message != "undefined") {
                        $(params.loading.container).html(params.loading.success_message)
                                                   .addClass("loading-success");
                    }

                    if (params.success != undefined) {
                        params.success(html);
                    }

                    return;
                }

                switch (json.status)
                {
                    case maller.STATUS_OK:
                        if (typeof params.loading.success_message != "undefined") {
                            $(params.loading.container).html(params.loading.success_message)
                                                       .addClass("loading-success");
                        }

                        if (params.success != undefined) {
                            params.success(json);
                        }

                        // обновление loaded_data
                        if (maller.get_data != undefined) {
                            try {
                                maller.loaded_data = maller.get_data();
                            } catch (e) {
                            }
                        }

                        break;

                    case maller.STATUS_ERROR:
                        if (typeof params.loading.error_message != "undefined") {
                            $(params.loading.container).html(params.loading.error_message)
                                                       .addClass("loading-error");
                        }

                        if (params.popuperror == undefined) {
                            params.popuperror = false;
                        }

                        if (typeof json.errors.entries != "undefined") {
                            for (var entry in json.errors.entries) {
                                maller.show_errors(json.errors.entries[entry], params.popuperror, entry);
                            }
                        } else {
                            maller.show_errors(json.errors, params.popuperror);
                        }

                        if (json.errors.type == "PermissionError") {
                            if (typeof params.loading.container != "undefined") {
                                $(params.loading.container).html(params.loading.permission_message)
                                                           .addClass("loading-error")
                            }
                        }

                        if (params.error != undefined) {
                            params.error(json);
                        }
                        break;
                }
            },
            error: function() {
                if (typeof params.button != "undefined") {
                    params.button.attr("disabled", false);
                }
                if (typeof params.loading.error_message != "undefined") {
                    $(params.loading.container).html("Извините, но у нас произошла ошибка. Попробуйте позже.")
                                               .addClass("loading-error");
                }
                if (params.error != undefined) {
                    params.error();
                }
            }
        };

        if (params.data === undefined) {
            params.data = {}
        }

        if (params.data.type == undefined) {
            params.data.type = "json";
        }

        if (params.type == "GET") {
            if (params.data.expand === undefined && params.data.fields === undefined) {
                params.data.expand = [];
            }

            // Если expand = null, то не передаем этот параметр на сервер.
            if (params.data.expand === null) {
                delete params.data.expand;
            }
        }

        if (params.type != "GET") {
            data["data"] = JSON.stringify(params.data);
        } else {
            if ($.browser.msie) {
                params.data._ie_rnd = Math.random();
            }

            data["data"] = params.data;
        }

        $.ajax(data);
    },

    // Функция отображения ошибок
    show_errors: function(errors, is_popup, entry) {
        if (typeof is_popup == "undefined") {
            is_popup = false;
        }

        if (typeof entry == "undefined") {
            entry = false;
        }

        if (errors.type == "RelationError") {
            is_popup = true;
        }

        var html = "";
        if (typeof errors.message != "undefined") {
            if (is_popup) {
                html += sprintf("%s<br/>", errors.message);
            } else {
                if (entry) {
                    $("#error-" + entry + "-message").html(errors.message)
                                                     .removeClass("hidden");
                } else {
                    $("#error-message").html(errors.message)
                                       .removeClass("hidden");
                }
            }
        } else {
            for (var key in errors.keys) {
                if (is_popup) {
                    html += sprintf("%s<br/>", errors.keys[key]);
                } else {
                    if (entry) {
                        $("#error-" + entry + "-" + key).html(errors.keys[key])
                                                        .removeClass("hidden");
                    } else {
                        $("#error-" + key).html(errors.keys[key])
                                          .removeClass("hidden");
                    }
                }
            }
        }

        if (is_popup && html.length > 0) {
            // Показывать ошибку в всплывающем окне,
            // иначе показать в указанном элементе
            $("#popup-error-dialog-text").html(html);
            var content = sprintf(" \
                <div id='popup-error-dialog' class='dialog-div'> \
                    <div class='dialog-caption'>Сообщение об ошибке</div> \
                    <p id='popup-error-dialog-text'>%s</p> \
                </div> \
            ", html);
            $.fancybox({
                "content": content,
                "scrolling": "no",
                "titleShow": false
            });
        }
    },

    // Функция перенаправления на указанный адрес
    redirect: function(link) {
        if (link == undefined) {
            link = $("#maller-referer").val();
        }

        window.location.assign(link);
    },

    // Функция получения url приложения
    get_url: function(app, data, callback) {
        var url = "";

        if (data === undefined) {
            data = {};
        }

        data["appname"] = app;

        $.ajax({
            url: "/geturl/",
            type: "GET",
            data: data,
            success: function (json) {
                switch (json.status) {
                    case 1:
                        url = json.url;

                        if (callback != undefined) {
                            callback(url);
                        }

                        break;

                    case 2:
                        maller.show_errors(json.errors, true)
                        break;
                }
            }
        });

        return url;
    },

    // Выполнение API функции
    exec_api: function(proc_name, data, callback) {
        maller.get_url("ApiView", {"proc_name": proc_name}, function(url) {
            $.ajax({
                url: url,
                data: data,
                type: "GET",
                success: function(json) {
                    callback(json);
                }
            });
        });
    },

    // Объект, в котором хранится объект, замененный индикатором загрузки
    loading_backup_object: {
        "container": undefined,
        "data": undefined
    },

    // Показать индикатор загрузки
    show_loading: function(container, img_path) {
        maller.hide_loading();

        maller.loading_backup_object.container = container;
        maller.loading_backup_object.data = container.html();

        if ($("#loading-image")) {
            var image = $("#loading-image").clone().removeAttr("id");
            if (img_path)
                image.attr("src", img_path);
            container.html(image);
        }
    },

    // Скрыть индикатор загрузки
    hide_loading: function() {
        if (maller.loading_backup_object.container) {
            maller.loading_backup_object.container.html(maller.loading_backup_object.data);
        } else {
            return false;
        }

        maller.loading_backup_object.container = undefined;
        maller.loading_backup_object.data = undefined;
    },

    // Текстовый редактор
    create_text_editor: function(object) {
        document.domain = "mall-er.com";
        object.tinymce({
            script_url : 'http://static.mall-er.com/js/tiny_mce/tiny_mce.js',
            language: 'en',

            mode:'textareas',
            theme : "advanced",
            skin : "o2k7",
            skin_variant : "silver",
            plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",

            // Theme options
            theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,cut,copy,paste,|,search,replace,|,sub,sup",
            theme_advanced_buttons2 : "bullist,numlist,outdent,indent,|,undo,redo,|,link,unlink,image,|,forecolor,backcolor,|,charmap,|,ltr,rtl,",
            theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid",
            theme_advanced_buttons4 : "formatselect,fontselect,fontsizeselect,|,code,preview,fullscreen",
            theme_advanced_toolbar_location : "top",
            theme_advanced_toolbar_align : "left",
            theme_advanced_statusbar_location : "bottom",
            theme_advanced_resizing : false
        });
    },

    // Рассчитать кратность размера файла
    calc_size: function(size) {
        size = parseInt(size);

        var k = 0;

        var ok = false;
        var tmp_size = size;
        while (!ok) {
            if (tmp_size / 1024 >= 1) {
                k++;
                tmp_size = tmp_size / 1024;
            } else {
                ok = true;
            }
        }

        var new_size = 0;

        if (size >= 1024) {
            var new_size = size / Math.pow(1024, k);
            new_size = new_size.toFixed(2);
            if (new_size - Math.floor(new_size) == 0) {
                new_size = Math.floor(new_size);
            }
        } else {
            new_size = size;
        }

        switch (k) {
            case 0: new_size += " Б"; break;
            case 1: new_size += " кБ"; break;
            case 2: new_size += " мБ"; break;
            case 3: new_size += " гБ"; break;
            case 4: new_size += " тБ"; break;
        }

        return new_size;
    },

    // Из строки GET-параметров сформировать объект, элементами
    // которого являются ключи и их значения
    get_params: function(params) {
        var tmp = new Array();
        var tmp2 = new Array();
        var param = {};

        if (params.length > 0) {
            tmp = params.split('&');
            for (var i = 0; i < tmp.length; i++) {
                tmp2 = tmp[i].split('=');
                param[tmp2[0]] = tmp2[1];
            }
        }

        return param;
    },

    // Добавить к указанной форме параметры referer
    add_referer_to_form: function(object, params) {
        for (var key in params) {
            $("<input type='hidden'>").attr("name", key)
                                      .attr("value", params[key])
                                      .appendTo(object);
        }
    },

    fancybox_content: function(params) {
        var content = $("<div></div>").attr("class", "dialog-div");

        params = jQuery.extend({
            "close_button": true
        }, params || {});

        $("<div></div>").attr("class", "dialog-caption")
                        .html(params.caption)
                        .appendTo(content);

        var div = $("<div></div>").addClass("content-div")
                                  .appendTo(content);

        params.content.appendTo(div);

        var div = $("<div></div>").attr("class", "dialog-buttons")
                                  .appendTo(content);

        for (var item in params.buttons) {
            var a = $("<a></a>").attr("href", "#")
                                .attr("rel", "button-" + item)
                                .html(params.buttons[item].caption)
                                .click(function() {
                                    var item = $(this).attr("rel").replace("button-", "");
                                    params.buttons[item].click();
                                    return false;
                                })
                                .appendTo(div);

            if (params.buttons[item]["class"] != undefined) {
                a.addClass(params.buttons[item]["class"]);
            }
        }

        if (params.close_button) {
            $("<a></a>").attr("href", "#")
                        .html("Закрыть")
                        .click(function() {$.fancybox.close(); return false;})
                        .appendTo(div);
        }

        return content;
    },

    show_auth_dialog: function(caption, referer) {
        var content = $("<div />").addClass("dialog-div auth-dialog")
        $("<span></span>").html("Чтобы воспользоваться этой функцией, Вы должны&nbsp;").appendTo(content);
        $("<a></a>").html("войти")
                    .attr("title", "Войти")
                    .attr("href", "http://accounts.mall-er.com/auth/?" + referer)
                    .appendTo(content);
        $("<span></span>").html("&nbsp;или&nbsp;").appendTo(content);
        $("<a></a>").html("зарегистрироваться")
                    .attr("title", "Зарегистрироваться")
                    .attr("href", "http://accounts.mall-er.com/registration/?" + referer)
                    .appendTo(content);

        $.fancybox({
            "content": maller.fancybox_content({
                content: content,
                caption: caption,
                close_button: false
            }),
            "scrolling": "no",
            "titleShow": false
        });
    }
}



function set_social_links(uri, title) {
    var raw_uri = uri ? uri : location.href;
    var uri = encodeURIComponent(raw_uri);
    var title = title ? title : document.title;

    $("#social-buttons > .net > a.twitter").attr("href", sprintf("https://twitter.com/share?url=%s", uri, title));
    $("#social-buttons > .net > a.facebook").attr("href", sprintf("http://www.facebook.com/sharer.php?u=%s", uri, title));
    $("#social-buttons > .net > a.vkontakte").attr("href", sprintf("http://vkontakte.ru/share.php?url=%s", uri));
    $("#social-buttons > .net > a.odnoklassniki").attr("href", raw_uri);
    $("#social-buttons > .net > a.mailru").attr("href", sprintf("http://connect.mail.ru/share?share_url=%s", uri));

    
}

$(function () {
    $("body").ajaxStart(function() {
        maller.ajax_working = true;
    });

    $("body").ajaxStop(function() {
        maller.ajax_working = false;
        maller.hide_loading();
    });

    $("body").ajaxError(function(e, xhr, settings, exception) {
        maller.ajax_working = false;
        maller.hide_loading();
        maller.show_errors({"message": maller.error_codes[xhr.status]}, true);
    });

    // Установка базовых настроек компонента datepicker
    
        var regional = 'en-GB';
    

    try {
        $.datepicker.setDefaults(
            $.extend(
                {
                    showMonthAfterYear: false,
                    changeMonth: true,
                    changeYear: true,
                    yearRange: '-100:+0',
                    showOn: 'both',
                    buttonImage: '/gmedia/images/calendar.png',
                    buttonImageOnly: true
                },
                $.datepicker.regional[regional]
            )
        );
    } catch (e) {
    }

    $("#logout-button").click(function() {
        maller.proc({
            data: {
                "proc_name": "logout_user"
            },
            success: function() {
                location.reload();
            }
        });

        return false;
    });

    var container = $("#social-buttons");
    var idiv = $("<div class='net' />").appendTo(container);
    $("<a href='#' target='_blank' class='twitter' />").html("&nbsp;").appendTo(idiv);
    $("<a href='#' target='_blank' class='facebook' />").html("&nbsp;").appendTo(idiv);
    $("<a href='#' target='_blank' class='vkontakte' />").html("&nbsp;").appendTo(idiv);
    $("<a href='#' target='_blank' class='mailru' />").html("&nbsp;").appendTo(idiv);
    $("<a href='#' target='_blank' class='odnoklassniki' />").html("&nbsp;").appendTo(idiv)
        .click(function () { ODKL.Share(this); return false; });

    var sf_a = $("<a href='#' class='send_friend' title='Отправить другу' />").html("&nbsp;").appendTo(idiv).click(function () {
        
            var pathname = location.pathname + "#send_friend";
            maller.show_auth_dialog("Внимание", sprintf("host=%s&path=%s", location.host, pathname));
        
        return false;
    });

    if (location.hash == "#send_friend") { sf_a.click(); }

    $.requireScript("http://stg.odnoklassniki.ru/share/odkl_share.js", function() { });
    set_social_links();

    
        var container = $("#social-buttons");
        var idiv = $("<div class='favorite' />").appendTo(container);
        var img = $("<img />").attr("title", "Добавить в избранное")
                              .attr("src", "/gmedia/images/isnt_fav.png")
                              .appendTo(idiv);

        img.click(function () {
            var pathname = location.pathname + "#favorites";
            maller.show_auth_dialog("Внимание", sprintf("host=%s&path=%s", location.host, pathname));
        });

        if (location.hash == "#favorites") { img.click(); }
    
});

function test_info() {
    
        maller.show_auth_dialog("Внимание", "host=accounts.mall-er.com&path=/")
    
}

jQuery.MallerEditor = {
    instance_id: 1,
    init: function(options) {
        var self = this;
        this.each(function() {
            var defaults = {"width": "640px", "height": "200px"}
            this.Config = jQuery.extend(defaults, options || {});
            this.Config.instance_id = jQuery.MallerEditor.instance_id++;
            $(this).addClass("hidden");
            jQuery.MallerEditor.ckeditor($(this));
        });

        return this;
    },
    ckeditor: function(object) {
        var config = object[0].Config;
        var self = this;

        var height = parseInt(config.height.replace("px", "")) + 156;
        config.placeholder = $("<div></div>").css("min-height", sprintf("%spx", height)).insertAfter(object)

        if (object.length == 0) {
            return false;
        }

        if (object.attr("id") == "") {
            object.attr("id", "editor" + config.instance_id)
        }

        config.instance = object.attr("id");
        var next_element = object.next() || object;

        config.toolbar_Full = [
            ['Source','NewPage','Preview','-'],
            ['Undo','Redo', '-', 'Cut','Copy','Paste','PasteText','-'],
            ['Find','Replace','-','SelectAll','RemoveFormat'],
            ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
            ['NumberedList','BulletedList','-','Outdent','Indent','TextColor','BGColor'],
            ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
            ['BidiLtr', 'BidiRtl'],
            ['Image'],
            ['Link','Unlink'],
            ['Table','HorizontalRule','SpecialChar','Maximize'],
            '/',
            ['Styles','Format','Font','FontSize'],
        ]

        // Подгружаем скрипты ckeditor динамически
        $.requireScript("/media/js/components/upload.js", function() {
            $.requireScript("http://static.mall-er.com/js/fileuploader.js", function() {
                $.requireScript("http://static.mall-er.com/js/ckeditor/ckeditor.js", function() {
                    $.requireScript("http://static.mall-er.com/js/ckeditor/adapters/jquery.js", function() {
                        object.wrap("<div />");
                        object.bind("instanceReady.ckeditor", function() {
                            config.placeholder.remove();
                            object.parent().show();
                            var uploader_div = $("<div></div>").html("<img src='/gmedia/images/bottom_add_product.png' />Добавить изображение в текст").insertAfter(object.parent());
                            uploader_div.UploadObject({
                                "type": "photos",
                                "photos": [],
                                "multiple": false,
                                "standart": true,
                                "onComplete": function(id) {
                                    CKEDITOR.instances[config.instance].insertHtml('<img src="/photo/' + id + '/?uploaded=true" />');
                                }
                            }).addClass("ckeditor")
                            $(".uploaded-files", uploader_div).css("display", "none");
                        });

                        object.ckeditor(config);
                        object.parent().hide();
                    });
                });
            });
        });
    }
}

function strtime(d) {
    // function LeadingZero
    function lz(val) {
        val = val + "";
        if (val.length == 1) { return "0" + val; }
        else { return val; }
    }
    var date = new Date(parseInt(d + "") * 1000);
    return sprintf("%s.%s.%s %s:%s:%s", lz(date.getDate()), lz(date.getMonth() + 1), date.getFullYear(), lz(date.getHours()), lz(date.getMinutes()), lz(date.getSeconds()));
}

function checkValue(object, config) {
    if (object.val() != config.value) {
        config.value = object.val();
        config.func();
        config.focused = false;
    }
    if (config.focused) {
        setTimeout(function() {
            checkValue(object, config)
        }, 100);
    }
};

jQuery.MallerInput = {
    init: function(func) {
        this.each(function() {
            this.Config = {
                "func": func
            }

            jQuery.MallerInput.input($(this));
        });

        return this;
    },
    input: function(object) {
        var config = object[0].Config;
        var self = this;
        config.value = object.val();

        $(object).focus(function() {
            config.focused = true;
            checkValue(object, config)
        })
        .blur(function() {
            config.focused = false;
        })
        .keypress(function() {
            config.func();
        })
        .keyup(function() {
            config.func();
        })
        .change(function() {
            config.func();
        })
    }
}

jQuery.MallerDataObject = {
    init: function(options) {
        this.each(function() {
            this.Config = jQuery.extend({"limit": 10}, options || {});
            jQuery.MallerDataObject.create($(this))
        });

        return this;
    },
    create: function(object) {
        var config = object[0].Config;
        var self = this;

        config.skip = 0;
        config.is_working = true;
        config.query(config.limit, config.skip);

        if (config.trigger) {
            $(config.trigger).unbind("scroll").bind("scroll", function () {
                if (object.innerHeight() - (config.trigger.scrollTop() + config.trigger.innerHeight()) < parseInt(config.offset)) {
                    if (!config.is_working) {
                        config.is_working = true;
                        config.skip += config.limit;
                        config.query(config.limit, config.skip);
                    }
                }
            });
        } else {
            $(window).unbind("scroll").bind("scroll", function () {
                var bottom = object.innerHeight() + object.position().top;
                if (bottom - window.scrollY < window.innerHeight + parseInt(config.offset)) {
                    if (!config.is_working) {
                        config.is_working = true;
                        config.skip += config.limit;
                        config.query(config.limit, config.skip);
                    }
                }
            });
        }
    }
}

jQuery.fn.extend({
    MallerEditor : jQuery.MallerEditor.init,
    MallerInput : jQuery.MallerInput.init,
    MallerDataObject : jQuery.MallerDataObject.init
});

window.onbeforeunload = function () {
    if (maller.unload_function()) {
        return "Присутствуют несохраненные изменения.\nЖелаете продолжить закрытие страницы?";
    }
}

window.onload = function () {
    // обновление loaded_data
    if (maller.get_data != undefined) {
        try {
            maller.loaded_data = maller.get_data();
        } catch (e) {
        }
    }
};

// Обновление информации о соединении
function update_connection() {
    maller.proc({
        "data": {
            "proc_name": "update_connection"
        }
    });

    setTimeout("update_connection()", 180000);
}
setTimeout("update_connection()", 1000);

function add_basket(position_id, product_id, shop_id, count) {
    function _create(el, id) {
        el.each(function () {
            if ($(".in-basket", el).length == 0) {
                var tr = $("<tr />").addClass("in-basket").appendTo(el);
                $("<span />").css("color", "green").html("В корзине").appendTo(tr).wrap("<td></td>");
                $("<a href='#' />").css("color", "#aaa").html("Удалить").appendTo(tr).wrap("<td></td>").click(function () { return delete_basket(id); });
            }
        });
    }

    function _add_basket(_data, show) {
        maller.ajax({
            "url": "/basket/",
            "type": "POST",
            "data": _data,
            "success": function (json) {
                _create($(sprintf(".basket-%s", json.position)), json.position);
                _create($(sprintf(".basket-%s", json.product)), json.product);

                if (json.count == 0) { $("#basket-info").css("display", "none"); } else { $("#basket-info").css("display", "block"); }
                $("#basket-count").html(json.count_text);
                if (show && !count) {
                    alert("Товар успешно добавлен в корзину")
                }
            }
        });
    }

    var data = {};
    data["count"] = (count != undefined) ? count : 1;

    if (position_id) {
        data["position_id"] = position_id;
        _add_basket(data, true);
    } else {
        var content = $("<div />");

        var shops_select = $("<select />").css("width", "290px").attr("disabled", true).appendTo(content);
        $("<option value='0' />").html("Загрузка данных...").appendTo(shops_select);

        var count_span = $("<span />").html("Количество").appendTo(content);
        var count_input = $("<input />").css({"margin-left": "10px", "width": "209px"}).val("1").appendTo(content);

        maller.ajax({
            "url": sprintf("/%s/positions/", product_id),
            "type": "GET",
            "data": {
                "expand": "pricelist.firm",
                "limit": 10
            },
            "success": function (json) {
                if (json.count == 0) {
                    alert("По данному товару нет предложений");
                    return;
                }

                var positions = [];

                for (var item in json.positions) {
                    var elem = json.positions[item];
                    var firm = elem.pricelist.firm;

                    if (shop_id && shop_id != firm.id)
                        continue;

                    positions[elem.id] = sprintf("%s - %s", firm.brandname ? firm.brandname : firm.name,
                                                            elem.pricelist.name);
                }

                shops_select.empty();
                shops_select.removeAttr("disabled");

                for (var item in positions) {
                    $("<option />").val(item).html(positions[item]).appendTo(shops_select);
                }

                $.fancybox({
                    "content": maller.fancybox_content({
                        "caption": "Выберите поставщика товара",
                        "content": content,
                        "buttons": [{
                            "caption": "Добавить",
                            "click": function () {
                                data["position_id"] = shops_select.val();
                                data["count"] = count_input.val();
                                _add_basket(data);
                                $.fancybox.close();
                            }
                        }]
                    }),
                    "onStart": function() {
                        this.content.css("width", "300px");
                    }
                });
            }
        });
    }

    return false;
}

function delete_basket(position_id, callback) {
    var data = {};
    if (position_id)
        data["position_id"] = position_id;

    maller.ajax({
        "url": "/basket/",
        "type": "DELETE",
        "data": data,
        "success": function (json) {
            if (json.count == 0) { $("#basket-info").css("display", "none"); } else { $("#basket-info").css("display", "block"); }
            $("#basket-count").html(json.count_text);
            $(sprintf(".basket-%s .in-basket", position_id)).remove();

            if (callback) callback(json.count);
        }
    });

    return false;
}

