﻿/// <reference path="../zw_Runtime.js" />
/// <reference path="../jquery.js" />
/// <reference path="../jquery.common.js" />
/// <reference path="../UC/zw_History.js" />

var AjaxHelper = (function ZAjaxHelper() {
    return {
        parseControlPropertiesToUrl: function(control) {
            var properties = AjaxHelper.parseControlProperties(control);
            var url = webUrl.param(properties);
            return url;
        },
        parseControlProperties: function(control) {
            var result = { };

            AjaxHelper.parseControlPropertiesTo(control, result);

            return result;
        },
        parseControlPropertiesTo: function(control, properties) {
            var attributes = $(control).get(0).attributes;
            var prefix = Constants.AjaxController.ControlPropertiesPrefix;

            for (var i = 0; i < attributes.length; i++) {
                var attr = attributes[i];

                var name = attr.nodeName;
                if (name.indexOf(prefix) == 0) {
                    properties[name] = attr.nodeValue.replace("%20", " ");
                }
            }
        }
    };
})();


/// Принцип работы пейджинга (и любого аякс-обновления контролов через ZetaControlRefresher/ZetaHistory):
/// Любое обновление проходит в 2 этапа:
///     1) Изменение адресной строки (например, был: http://localhost/zhurnal_test/, стал: http://localhost/zhurnal_test/?ordersbysales_page=10 - в FF,Chrome,Opera
///                                                                                  стал: http://localhost/zhurnal_test/#?ordersbysales_page=10 - в IE  )
///             изменить адресную строку можно вызовом: ZetaHistory.setState("?ordersbysales_page=10"); //при этом все ранее выставленные параметры обнулятся 
///                                                 или ZetaHistory.setParameters({page: 2}); //при этом изменится только параметр page, остальные параметры сохранят свои значения
///             
///     2) По событию "изменение url" стартует обновление контрола в соответствии с изменившимися параметрами.
///             На этом шаге на сервер отправляется запрос вида:
///                    http://localhost/mvcget/Ajax/LoadControl?ordersbysales_page=10&SiteTemplatesID=123-123-123&HeaderTemplateId=567-234-12
///             Откуда берутся параметры запроса?
///                 а) из адресной строки (ordersbysales_page=10).
///                 б) из свойств контрола (SiteTemplatesID=123-123-123&HeaderTemplateId=567-234-12).
///
/// Чтобы скрипт мог считать параметры контрола, необходимо, чтобы контрол выглядел следующим образом:
///     <div id="zw_ordersbysales" cp_uniquekey="ordersbysales" cp_SiteTemplatesId="023-230-13" ...>
///     </div>
///     параметры контрола объявляются с префиксом "cp_" (Control Parameters),
///     уникальное имя контрола, которое передается при регистрации, должно быть объявлено в параметре cp_uniquekey 
///
/// При обновлении контрола содержимое будет записано в <div cp_uniquekey="ordersbysales" /> (по параметру - cp_uniquekey)
///
/// Что необходимо сделать для добавления новых контролов?
///     а) добавить к div'у контрола атрибут cp_uniquekey (содержащий уникальный в рамках страницы ключ контрола)
///     б) добавить к div'у контрола  все свойства контрола, необходимые для его перерисовки, с префиксом cp_ (cp_SiteTemplatesId="023-230-13" и т.д.)
///         пункты а) и б) можно осуществить вызвав метод: ZetaWeb.Controls.AddControlFieldsToAttributes(this, this); из контрола
///     в) Закодировать этап 1 из пунктов выше (добиться, чтобы при щелчках по нужным кнопкам/ссылкам вызывались функции  ZetaHistory.setState или ZetaHistory.setParameters)
///     г) Зарегистрировать контрол: ZetaControlRefresher.registerControl(uniqueKey)
///     д) Для того, чтобы параметры записались в свойство контрола
///                 public string Filter {get;set;}
///             можно из конструктора контрола вызвать функцию: ZetaWeb.Controls.TrySetObjectPropertiesFromRequest(this, "");
var ZetaControlRefresher = (function ZetaControlRefresherClass() {
    var _initialized = false;

    var _refreshControl = function (changedParameterName, parameters) {
        var controlUniqueKey = changedParameterName.substr(0, changedParameterName.indexOf("_"));

        var control = controls.findByUniqueKey(controlUniqueKey);

        AjaxHelper.parseControlPropertiesTo(control, parameters);
        var currentUrl = "?" + UrlHelper.cleanQuery(document.location.href);
        parameters[Constants.AjaxController.RawUrlField] = currentUrl;
        control.load(MvcActions.AjaxController.LoadControl(), parameters, function () {
            webSettings.runHandlers();
        });
    };

    var _registerControl = function (controlUniqueKey) {
        ZetaHistory.registerHandler(controlUniqueKey + "_", _refreshControl);
    };

    var _changeHistoryOnLinkClick = function () {
        var elem = $(this);
        var href = elem.attr('href');

        ZetaHistory.setQuery(href);
        return false;
    };

    return {
        Init: function () {
            if (_initialized)
                return;
            _initialized = true;

            $("[" + controls.uniqueKeyAttribute() + "]").each(function (i, elem) {
                var uniqueKey = controls.uniqueKey(elem);
                _registerControl(uniqueKey);
            });
        },
        Refresh: function (uniqueKey) {
            _refreshControl(uniqueKey + "_", ZetaHistory.getCurrentParameters());
        },
        RefreshById: function (controlId) {
            var uniqueKey = controls.uniqueKey($(controlId));
            this.Refresh(uniqueKey);
        },

        BindLinkToHistoryChange: function (link) {
            ///	<summary>
            ///		при нажатии на ссылку урл браузера обновится до текущего значения ссылки
            ///	</summary>
            ///	<param name="link" type="jQuery">
            ///		Ссылка на объект <a href="" />
            ///	</param>
            link.live("click", _changeHistoryOnLinkClick);
        },


        SubmitControl: function (control) {
            ///	<summary>
            ///		Парсит все инпуты в контроле и пишет их в урл
            ///	</summary>
            ///	<param name="control" type="jQuery">
            ///		Контрол
            ///	</param>

            var form = control.find(":input");
            var serializedForm = form.serializeArray();
            var data = {};
            $.each(serializedForm, function (i, val) { data[val.name] = val.value; });

            var name = controls.uniqueKey(control);
            data[name + "_page"] = "";
            ZetaHistory.setParameters(data);
        }
    };
})();

