﻿/// <reference path="common.js" />

/*
* pageflow.js - платформа для построения страниц для портала IDK.ru
*
* Copyright (c) 2011 Лысов Иван
*
*/
function _route(statetype, section, stype) {
    this.Page = statetype;
    this.Section = section;
    this.Type = stype;
}

var _containers = new Array();

var _routeValue = new _route();
var _hasPaging = true;
var _hasOpeners = false;
var _pagerContainer = "#pager";
var _sorting = false;
var _container = "#section";
var _defaultContainer = "#section";

/*
* Для динамической подвязки переходов по кликам и разных операций на гриде используем след схему:
* <table class="grid"> (.grid - здесь: украшает заголовки и ячейки)
*   <thead>...</thead>
*   <tbody>
*       <tr class="row" controller="Main" action="Details" rowid="142" params="Id1,Id2" Id1="1" Id2="2"> Подписываем строку на событие по клику /Main/Details?Id=142
*           <td><a href="http://idk.ru">Перейти на ЭТП</a></td>         Здесь онклик не работает, переход по ссылке
*           <td>Просто инфа</td>                                        Здесь работает
*           <td><div class="action accept" controller="Main" action="Accept"></div></td>                                Срабатывает Ajax запрос, с рефрешем после success
*                                                                                                                       /Main/Accept?Id=142
*           <td><div class="action delete" controller="Main" action="Delete" confirm="Точно удалить?"></div></td>       Срабатывает Ajax запрос с рефрешем после success
*                                                                                                                       Перед ajax'ом confirm dialog с указанным вопросом
*                                                                                                                       /Main/Decline?Id=142
*       </tr>
*       <tr>...</tr>
* </table>
*/
var _rowClass = "row";
var _rowParametersAttribute = "params";

var _rowControllerAttribute = "controller";
var _rowActionAttribute = "action";
var _rowPopupAttribute = "popup";
var _rowIdAttribute = "rowid";
var _rowActionControllerAttribute = "controller";
var _rowActionActionAttribute = "action";
var _rowActionClass = "action";
var _rowActionConfirmAttribute = "confirm";
var _rowActionRedirectAttribute = "redirect";
var _rowActionParametersAttribute = "params";

var _sortClass = "sort-field";
var _sortAttribute = "sort";

var _totalRecordsField = "#total-records";
var _xhr = null;

var _tabClass = "tab";
/*
* Табы второго уровня имеют вид
*   <div id='<_section>-filters' class='filters' [<_forContainerAttribute>='<_targetContainer>']>
*       <div <_stypeAttribute>='<_route.Type>' class='<_tab2Class>'>Первая таба</div> 
*       <div <_stypeAttribute>='<_route.Type>' class='<_tab2Class>'>Вторая таба</div> 
*       <div style='clear:both;height:0'>
*   </div>
* Например:
*   <div id="auction-filters" class="filters">
*       <div class="tab-2 selected" stype="Active">Активные</div>
*       <div class="tab-2" stype="Archive">Архив</div>
*       <div style='clear:both;height:0'>
*   </div>
* Здесь _targetContainer берется по умолчанию
*/

var _forContainerAttribute = "forc";
var _stypeAttribute = "stype";
var _targetContainer = "#section";
var _filtersClass = "filters";
var _tab2Class = "tab-2";

var _selectedClass = "selected";
var _controller = "Main";
var _action = "_Control";
var _sortAttribute = "sort";

var _sectionAttribute = "section";

/*
* Все кнопки-редиректоры помечаем соответствующими классами и аттрибутами
* <button class="<_redirectorClass>" <_redirectorControllerAttribute>="Main" <_redirectorActionAttribute>="Index">На главную</button>
* Например:
* <button class="redirector" controller="Main" action="Index">На главную</button>
*/

var _redirectorClass = "redirector";
var _redirectorControllerAttribute = "controller";
var _redirectorActionAttribute = "action";

/*
* Все кнопки-действия помечаем соответствующими классами и аттрибутами
* <button class="<_doClass>" <_doControllerAttribute>="Main" <_doActionAttribute>="Index" [<_doConfirmAttribute>="Точно?"]>На главную</button>
* Например:
* <button class="redirector" controller="Main" action="Index">На главную</button>
*/

var _doClass = "do";
var _doControllerAttribute = "controller";
var _doActionAttribute = "action";
var _doConfirmAttribute = "confirm";
var _doSuccessAttribute = "success";
var _doSuccessControllerAttribute = "successcontroller";
var _doSuccessActionAttribute = "successaction";


/*
* Все инпуты-автокомплиты помечаем соответствующими классами и аттрибутами
* Добавляем одно смежное скрытое поле после для хранения результата выбора
* <input type="text" class="<_autocompleteClass>" <_autoCompleteControllerAttribute>="Dictionary" <_autocompleteActionAttribute>="ItemsJSON" /><input type="hidden" />
* Например:
* <input type="text" class="auto" controller="Dictionary" action="ItemsJSON" /><input type="hidden" />
*/
var _autocompleteClass = "auto";
var _autoCompleteControllerAttribute = "controller";
var _autocompleteActionAttribute = "action";

/*
* Все кнопки-скрыватели/раскрыватели помечаем соответствующими классами и аттрибутами
* <span class="<_togglerClass>" <_toggleAttribute>="toggling-element-id" <_togglerHiddenTextAttribute>="Показать детали" <_togglerVisibleTextAttribute>="Скрыть детали">Показать детали</span>
* Например:
* <span class="toggler" toggle="toggling-element-id" togglehidden="Показать детали" togglevisible="Скрыть детали">Показать детали</span>
*/
var _togglerClass = "toggler";
var _toggleAttribute = "toggle";
var _togglerHiddenTextAttribute = "togglehidden";
var _togglerVisibleTextAttribute = "togglevisible";
/* Необязательные, для обратной связи */
var _togglerAttribute = "toggler";



/*
* Помечаем поля которые понадобятся нам для RequestCriteria классом <_criteriaFieldClass>
* Добавляем аттрибут <_criteriaFieldAttribute> с названием свойства RequestCriteria
* Все поля и кнопки фильтрации/очистки находятся внутри блока помеченного классом <_filterContainerClass>
* кнопка фильтрации помечена классом <_btnFilterClass>
* кнопка фильтрации помечена классом <_btnFilterClearClass>
* <div class="<_fitlerContainerClass>"|id="<название секции>-section">
*   <input <_criteriaFieldAttribute>="<Название поля критерия, например StartDate>" class="<_criteriaFieldClass>">
*   <input type="text" class="<_autocompleteClass>" <_autoCompleteControllerAttribute>="Dictionary" <_autocompleteActionAttribute>="ItemsJSON" /><input <_criteriaFieldAttribute>="ItemId" class="<_criteriaFieldClass> type="hidden" /> - автокомплит
*   <button class="<_btnFilterClass>">Показать</button>
*   <button class="<_btnFilterClearClass>">Очистить</button>
* </div>
* Например
* <div class="filter">
*   <input criteria="Name" default="Иван" class="criteria-field">
*   <button class="btn-filter">Показать</button>
*   <button class="btn-filter-clear">Очистить</button>
* </div>
*/

var _defaultAttribute = "default";
var _filterContainerClass = "filter";
var _btnFilterClass = "btn-filter";
var _btnFilterClearClass = "btn-filter-clear";
var _criteriaFieldClass = "criteria-field";
var _criteriaFieldAttribute = "criteria";

/*
* Хинты на странице
* <div class="<_hintClass>">
*   <div class="<_hintDialog>" style="[прописываем смещение, ширину, высоту]">Высплывающая подсказка</div>
* </div>
* Например
* <div class="question">
*   <div class="note-dialog">Какой-нибудь текст</div>
* </div>
*/

var _hintOpened = false;
var _hints = null;
var _hintClass = "question";
var _hintDialog = "note-dialog";

/*
* Поля ввода даты
*/

var _datePickerClass = "datetime";

/*
* Поля фильтрации которые не сбрасываются
*/

var _independentCriteriaClass = "independent-criteria-field";

/*
* Поле с секцией <input type='hidden' id='query-section' value='<%: Request.QueryString["Section"] %>
* Поле с типом <input type='hidden' id='query-type' value='<%: Request.QueryString["Type"] %>
*/

var _querySectionFieldId = "query-section";
var _queryTypeFieldId = "query-type";

/*
* Для открытия в это же окне, после загрузки
*/

var _aOpenerClass = "opener";
var _aOpenerCaptionClass = "opener-caption";
var _aStypeAttribute = "stype";
var _aCaptionAttribute = "caption";

/*
* Для валидации полей при добавлении
*/

var _validatorCaptionClass = "valid-caption";
var _validatorNotValidCaption = "Не выбрано";
var _validatorValidClass = "valid";
var _validatorControlToValidAttribute = "text";

/*
* Если в первой ячейке есть указанный класс - выводит при наведении
*/
var _divActionsClass = "div-actions";

function _tabclicked() { }

var _requestCriteria = new RequestCriteria();

function _onLoad() {

    _bindIndependentCriteria();
    _bindDatePickers();
    _bindHints();
    _bindTabs();
    _bindRedirectors();
    _bindDos();
    _bindAutocomplete();
    _bindFilters();
    _bindTogglers();
    _bindMultiSelects();

    if ($("#" + _querySectionFieldId).length > 0 && $("#" + _querySectionFieldId).val() != "") {
        _routeValue.Section = $("#" + _querySectionFieldId).val();
    }
    if ($("#" + _queryTypeFieldId).length > 0) {
        _routeValue.Type = $("#" + _queryTypeFieldId).val();
    }

    _loadSection(_routeValue.Section, _routeValue.Type);
}

function _bindIndependentCriteria() {
    $("." + _independentCriteriaClass).change(function () {

        _requestCriteria.Page = 1;
        _search();
    });
}

function _bindDatePickers() {
    $("." + _datePickerClass).datepicker();
}

function _bindRedirectors() {
    $("." + _redirectorClass).each(function () {
        $(this).click(function () {
            Redirect($(this).attr(_redirectorControllerAttribute), $(this).attr(_redirectorActionAttribute));
        });
    });
}

var __a;

function _bindDos() {
    $("." + _doClass).each(function () {
        $(this).click(function () {
            __a = $(this);
            if (!$(this).attr(_doConfirmAttribute) || $(this).attr(_doConfirmAttribute) && confirm($(this).attr(_doConfirmAttribute))) {
                $.ajax({
                    type: "POST",
                    url: Action($(this).attr(_doControllerAttribute), $(this).attr(_doActionAttribute)),
                    error: ShowError,
                    success: function (res) {
                        $(__a).attr(_doSuccessAttribute) && alert($(__a).attr(_doSuccessAttribute));
                        $(__a).attr(_doSuccessControllerAttribute) && $(__a).attr(_doSuccessActionAttribute) && Redirect($(__a).attr(_doSuccessControllerAttribute), $(__a).attr(_doSuccessActionAttribute));
                    }
                });
            }
        });
    });
}

function _bindAutocomplete() {
    $("." + _autocompleteClass).each(function () {
        $(this).autocomplete({
            source: Action($(this).attr(_autoCompleteControllerAttribute), $(this).attr(_autocompleteActionAttribute)),
            minLength: 2,
            select: function (event, ui) {

                $(this).siblings("input").val(ui.item.id);
                $(this).siblings("input").attr("text" ,ui.item.value);
            }
        });
    });
}

function _bindHints() {
    var _hints = $("." + _hintClass);
    var _hintDialogs = $("." + _hintDialog);
    if (_hints.length > 0) {
        $(document).click(function (e) {
            if (_hintOpened) {
                _hintDialogs.hide();
                _hintOpened = false;
            }
            if ($(e.target).hasClass(_hintClass)) {
                $(e.target).find("." + _hintDialog).show();
                _hintOpened = true;
            }
        });
    }
}



function _bindFilters() {
    $("." + _btnFilterClass).each(function () {
        $(this).click(function () {
            var section = $(this).attr(_sectionAttribute);
            var filterContainer = section ? $("#" + section.toLowerCase() + "-filter") : $(this).parents("." + _filterContainerClass);
            $.each(filterContainer.find("." + _criteriaFieldClass)
                    , function () {
                        if ($(this).attr(_criteriaFieldAttribute)) {
                            if ($(this).is("select[multiple]"))
                                _requestCriteria[$(this).attr(_criteriaFieldAttribute)] = $(this).multiselect("getChecked").map(function () { return this.value; }).get();
                            else
                                _requestCriteria[$(this).attr(_criteriaFieldAttribute)] = $(this).val();
                        }
                    }
                    );
            _requestCriteria.Page = 1;
            _search();
        });
    });

    $("." + _btnFilterClearClass).each(function () {
        $(this).click(function () {

            var section = $(this).attr(_sectionAttribute);
            var filterContainer = section ? $("#" + section.toLowerCase() + "-filter") : $(this).parents("." + _filterContainerClass);

            _clearFilter(filterContainer);
        });
    });
}

var _onBeforeClearFilter = null;

function _clearFilter(obj) {
    if ($("." + _filterContainerClass).length > 0) {

        _onBeforeClearFilter && _onBeforeClearFilter();

        if (obj) {


            $.each(obj.find("." + _criteriaFieldClass)
                    , function () {
                        if ($(this).is("select[multiple]"))
                            $(this).multiselect("uncheckAll");
                        else {
                            var value = $(this).attr(_defaultAttribute) || "";
                            $(this).val(value);
                        }
                    }
                );
            $.each(obj.find("." + _autocompleteClass)
                    , function () {
                        var value = $(this).attr(_defaultAttribute) || "";
                        $(this).val(value);
                    }
                );
            $.each(obj.find(".valid-caption")
                    , function () {
                        $(this).text("");
                    }
                );
        }
        else {
            $.each($("." + _filterContainerClass), function () {
                _clearFilter($(this));
            });
        }
    }
}

function _bindTogglers() {
    $("." + _togglerClass).each(function () {
        $(this).click(function () {
            var toggling = $("#" + $(this).attr(_toggleAttribute));
            if ($(toggling).is(":hidden")) {
                $(toggling).show();
                $(this).text($(this).attr(_togglerVisibleTextAttribute));
            } else {
                $(toggling).hide();
                $(this).text($(this).attr(_togglerHiddenTextAttribute));
            }
        });
    });
}

var _onBindTabs = null;
var _onBindTabs2 = null;

var _arrTabPanels = new Array();

function _tab2Clicked(e) {
    if ($(e.target).hasClass(_tab2Class)) {
        var _this = e.target;

        var parentSection = $(_this).parent().attr(_sectionAttribute);
        if (!_containers[parentSection]) {
            if ($(_this).parent().attr(_forContainerAttribute)) {
                _containers[parentSection] = "#" + $(_this).parent().attr(_forContainerAttribute);
            }
        }

        if (!$(e.target).is("a") && $(_this).attr(_stypeAttribute)) {
            _clearFilter();
            _requestCriteria = new RequestCriteria();
            _requestCriteria.Page = 1;
            _hideFilters();

            _routeValue.Section = $(_this).parent().attr(_sectionAttribute) || _routeValue.Section;

            $(_this).parent().find("." + _tab2Class).removeClass(_selectedClass);
            $(_this).addClass(_selectedClass);
            _routeValue.Type = $(_this).attr(_stypeAttribute);

            _onBindTabs2 && _onBindTabs2();

            if (_routeValue.Type == TYPE_FILTER) {
                $("#" + _routeValue.Section.toLowerCase() + "-filter").show();
            }
            else
                _search();
        }
    }
}

function _bindTabs() {
    $("." + _tabClass).click(function (e) {
        if (!$(e.target).is("a") && $(this).attr(_sectionAttribute)) {
            _clearFilter();
            _requestCriteria = new RequestCriteria();
            _loadSection($(this).attr(_sectionAttribute));
        }
    });

    for (var i = 0; i < _arrTabPanels.length; i++) {
        $("#" + _arrTabPanels[i]).click(_tab2Clicked);
    }
    $("." + _filtersClass).click(_tab2Clicked);

}

function _hideFilters() {
    $("." + _filterContainerClass).each(function () {
        if ($(this).attr(_togglerAttribute)) {
            $("#" + $(this).attr(_togglerAttribute)).text($("#" + $(this).attr(_togglerAttribute)).attr(_togglerHiddenTextAttribute));
        }
        $(this).hide();
    });
}

function _loadSection(section, type) {
    _requestCriteria.Page = 1;
    _hideFilters();

    $("." + _tabClass).removeClass(_selectedClass);
    $("." + _tabClass + "[" + _sectionAttribute + "=" + section + "]").addClass(_selectedClass);
    $("." + _filtersClass).hide();

    _routeValue.Section = section;
    _requestCriteria.Page = 1;

    _tabclicked && _tabclicked();

    $("#" + section.toLowerCase() + "-" + _filtersClass).show();
    $("." + _tab2Class).removeClass(_selectedClass);

    if (type) {
        _routeValue.Type = type;
        $("#" + section.toLowerCase() + "-" + _filtersClass + " ." + _tab2Class + "[" + _stypeAttribute + "=" + type.toString() + "]").addClass(_selectedClass);
    }
    else {
        $("#" + section.toLowerCase() + "-" + _filtersClass + " ." + _tab2Class + ":first").addClass(_selectedClass);
        _routeValue.Type = $("#" + section.toLowerCase() + "-" + _filtersClass + " ." + _tab2Class + ":first").attr(_stypeAttribute);
    }
    _search();
}

var _beforesearch = null;

function _search() {

    _beforesearch && _beforesearch();

    $("." + _independentCriteriaClass).each(function () {
        if ($(this).is("input[type=checkbox]")) {
            _requestCriteria[$(this).attr(_criteriaFieldAttribute)] = $(this).is(":checked");
        }
        else
            _requestCriteria[$(this).attr(_criteriaFieldAttribute)] = $(this).val();
    });

    _container = _containers[_routeValue.Section] || _defaultContainer;

    StartLoading(_container);
    if (_xhr)
        _xhr.abort();

    _xhr = $.ajax({
        type: "POST",
        url: Action(_controller, _action),
        data: JSON.stringify({
            c: _requestCriteria,
            r: _routeValue
        }),
        contentType: "application/json; charset=utf-8",
        success: function (res) {
            StopLoading();
            $(_container).html(res);
            if (_hasPaging)
                _pager();
            if (_hasOpeners)
                _openers();
            _bindGridEvents(_container);
            _bindSorting();
        },
        error: function (res) {
            if (res.statusText != "abort") {
                StopLoading();
                var w = window.open(null, 'Error', 'width=950,height=700,top=200,location=no,menubar=no,resizable=yes,scrollbars=yes');
                w.document.write(res.responseText);
            }
        }

    });
}

function _openers() {
    $("." + _aOpenerClass).click(function () {
        var caption = $("#" + _routeValue.Section.toString().toLowerCase() + "-filters").find("." + _aOpenerCaptionClass);

        caption.html($(this).text());
        caption.attr(_stypeAttribute, $(this).attr(_aStypeAttribute));
        caption.siblings("." + _tab2Class).removeClass(_selectedClass);
        caption.addClass(_selectedClass);

        _routeValue.Type = $(this).attr(_aStypeAttribute);

        _search();
    });
}

function _bindSorting() {
    $("." + _sortClass).click(function () {
        _requestCriteria.IsAscending = _requestCriteria.IsAscending ? false : true;
        _requestCriteria.SortField = $(this).attr(_sortAttribute) || "Default";
        _search();
    });
}

function _pager() {
    var totalRecords = 0;
    if ($(_totalRecordsField).length > 0) {
        totalRecords = $(_totalRecordsField).val();
    }
    if (parseInt(totalRecords) > parseInt(_requestCriteria.PageSize))
        $(_pagerContainer).pagination(totalRecords, { callback: _pageClicked, items_per_page: _requestCriteria.PageSize, current_page: _requestCriteria.Page - 1 });
}

function _pageClicked(page) { //0 based
    _requestCriteria.Page = page + 1;
    _search();
}

var _onRowBind = null;

function _bindGridEvents(container) {
    // Невидимый блок в первой ячейке
    $.each($(container).find("tr." + _rowClass),
        function () {
            $(this).mouseover(function () {
                $(this).find("." + _divActionsClass).show();
            });
            $(this).mouseout(function () {
                $(this).find("." + _divActionsClass).hide();
            });
        });

        $.each($(container).find("tr." + _rowClass),
            function () {
                $(this).click(function (e) {
                    _onRowBind && _onRowBind(e);
                    if ($(e.target).hasClass(_rowActionClass)) {
                        var t = $(e.target);

                        var data = {};
                        var query = new Array();
                        if (t.attr(_rowActionParametersAttribute)) {
                            var params = t.attr(_rowActionParametersAttribute).split(",");
                            for (var i = 0; i < params.length; i++) {
                                if (params[i] == "Id") {
                                    data["Id"] = $(this).attr(_rowIdAttribute);
                                    query.push("Id=" + $(this).attr(_rowIdAttribute));
                                }
                                else {
                                    data[params[i]] = t.attr(params[i]);
                                    query.push(params[i] + "=" + t.attr(params[i]));
                                }
                            }
                        }
                        else {
                            data["Id"] = $(this).attr(_rowIdAttribute);
                            query.push("Id=" + $(this).attr(_rowIdAttribute));
                        }

                        if (t.attr(_rowActionRedirectAttribute)) {
                            Redirect(t.attr(_rowActionControllerAttribute), t.attr(_rowActionActionAttribute) + "?" + query.join("&"));
                        }
                        else {
                            if (!t.attr(_rowActionConfirmAttribute) || confirm(t.attr(_rowActionConfirmAttribute))) {
                                $.ajax({
                                    type: "POST",
                                    url: Action(t.attr(_rowActionControllerAttribute), t.attr(_rowActionActionAttribute)),
                                    data: data,
                                    success: function (res) {
                                        if (res.Error)
                                            alert(res.Error);
                                        _search();
                                    },
                                    error: ShowError
                                });
                            }
                        }
                    }
                    else if (!$(e.target).is("a")) {
                        if ($(this).attr(_rowActionAttribute) &&
                            $(this).attr(_rowControllerAttribute) &&
                            $(this).attr(_rowIdAttribute)) {

                            var query = new Array();
                            if ($(this).attr(_rowParametersAttribute)) {
                                var params = $(this).attr(_rowParametersAttribute).split(",");
                                for (var i = 0; i < params.length; i++) {
                                    if (params[i] == "Id") {
                                        query.push("Id=" + $(this).attr(_rowIdAttribute));
                                    }
                                    else {
                                        query.push(params[i] + "=" + $(this).attr(params[i]));
                                    }
                                }
                            }
                            else {
                                query.push("Id=" + $(this).attr(_rowIdAttribute));
                            }

                            if ($(this).attr(_rowPopupAttribute)) {
                                var w = window.open(Action($(this).attr(_rowControllerAttribute), $(this).attr(_rowActionAttribute) + "?" + query.join("&")), 'au' + $(this).attr(_rowIdAttribute), 'width=700,height=500,top=200,location=no,menubar=no,resizable=yes,scrollbars=yes');
                            }
                            else {
                                Redirect($(this).attr(_rowControllerAttribute), $(this).attr(_rowActionAttribute) + "?" + query.join("&"));
                            }
                        }
                    }
                });
            }
        );
}

/*
* Функция для осуществления визуальной валидации на страницах добавления/редактирования
*/

function _bindValidateCaptions() {
    $("." + _validatorCaptionClass).each(function () {
        var control = $("#" + $(this).attr(_validatorControlToValidAttribute));
        if (control.is("select")) {
            if (control.find("option:selected").val() == "") {
                $(this).removeClass(_validatorValidClass);
                $(this).text(_validatorNotValidCaption);
            }
            else {
                $(this).addClass(_validatorValidClass);
                $(this).text(control.find("option:selected").text());
            }
        }
        else if (control.is("input[type=text]")) {
            if (control.val() == "") {
                $(this).removeClass(_validatorValidClass);
                $(this).text(_validatorNotValidCaption);
            }
            else {
                $(this).addClass(_validatorValidClass);
                $(this).text(control.val());
            }
        }
        else if (control.is("input[type=hidden]")) {
            if (control.val() == "") {
                $(this).removeClass(_validatorValidClass);
                $(this).text(_validatorNotValidCaption);
            }
            else {
                $(this).addClass(_validatorValidClass);
                $(this).text(control.val());
            }
        }
        else if (control.is("span")) {
            if (control.text() == "") {
                $(this).removeClass(_validatorValidClass);
                $(this).text(_validatorNotValidCaption);
            }
            else {
                $(this).addClass(_validatorValidClass);
                $(this).text(control.text());
            }
        }
    });
}

/*
* Функция для красивой обработки <select multiple='multiple'>...</select>
* Используется jquery.multiselect.js
* (http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/)
*/
function _bindMultiSelects() {
    $("select[multiple]").each(function () {
        $(this).multiselect();
    });
}

/* 
* Функция для визуальной валидации на странице (превращает красную звездочку в зеленую ок)
*/

_divRequiredFieldClass = "required-field";
_divRequiredFieldOKClass = "ok";
_divRequiredFieldControlToValidateAttribute = "text";
_divRequiredFieldControlToValidateSelectorAttribute = "selector";


function _bindRequiredFieldValidation() {
    $("." + _divRequiredFieldClass).each(function () {
        var control = false;
        if ($(this).attr(_divRequiredFieldControlToValidateAttribute)) {
            control = $("#" + $(this).attr(_divRequiredFieldControlToValidateAttribute));
        }
        else if ($(this).attr(_divRequiredFieldControlToValidateSelectorAttribute)) {
            control = $(this).siblings($(this).attr(_divRequiredFieldControlToValidateSelectorAttribute));
        }
        if (control) {
            if (control.is("select")) {
                if (control.find("option:selected").val() == "") {
                    $(this).removeClass(_divRequiredFieldOKClass);
                }
                else {
                    $(this).addClass(_divRequiredFieldOKClass);
                }
            }
            else if (control.is("input[type=text]")) {
                if (control.val() == "") {
                    $(this).removeClass(_divRequiredFieldOKClass);
                }
                else {
                    $(this).addClass(_divRequiredFieldOKClass);
                }
            }
            else if (control.is("input[type=hidden]")) {
                if (control.val() == "") {
                    $(this).removeClass(_divRequiredFieldOKClass);
                }
                else {
                    $(this).addClass(_divRequiredFieldOKClass);
                }
            }
            else if (control.is("span")) {
                if (control.text() == "") {
                    $(this).removeClass(_divRequiredFieldOKClass);
                }
                else {
                    $(this).addClass(_divRequiredFieldOKClass);
                }
            }
        }
    });
}
