
    YlJ = YAHOO.lang.JSON,
    YuC = YAHOO.util.Connect,
    Dom = YAHOO.util.Dom,
    Event = YAHOO.util.Event,
    Lang = YAHOO.lang,
    UA = YAHOO.env.ua;
    
    
var Form = {
    parameters : {},
    errorMsg : '',
    callback : {
        success : function(o) {
            if(o.responseText != undefined) {
                if(o.argument[0]){
                    var data = this.parseResponse(o);
                    o.argument[0].call(o.argument[1], data);
                }

            }
        },
        failure : function(o) {
            this.showError('Ошибка соединения ' + o.statusText);
        }
    },

    parseResponse: function(o){
        if(o.responseText != undefined) {
            try{
                var data;
                if(o.getResponseHeader['Content-Type'] == 'application/json'){
                    data = YlJ.parse(o.responseText);
                    if(data.error != undefined) {
                        this.showError(data.error);
                    }
                } else {
                    data = o.responseText;
                }
                return data;
                
            }catch(e) {
                this.showError(e.message + '<br/>' + o.responseText);
            }
        }
        return o.responseText;
    },


    showError : function(error) {
        if (error != undefined)
            this.errorMsg = error;

        var globalMessageEl = Dom.get('global-message');
        globalMessageEl.className = 'error';
        globalMessageEl.innerHTML = this.errorMsg;
        showElement(globalMessageEl, this.errorMsg != '');
        
    },

    showErrors : function(errors) {
        var globalMessageEl = Dom.get('global-message');
        globalMessageEl.className = 'error';

        this.errorMsg = '<ul>';
        for(var i=0; i<errors.length; i++){
            this.errorMsg += '<li>' + errors[i] + '</li>';
        }
        this.errorMsg += '</ul>';
        
        globalMessageEl.innerHTML = this.errorMsg;
        showElement(globalMessageEl, this.errorMsg != '');

    },

    markFieldOnError: function(field, error){
        showElement(field + '_msg', error != '');
        Dom.get(field + '_msg').innerHTML = error;
        if(error == '') {
            Dom.removeClass(field, 'required');
        } else {
            Dom.addClass(field, 'required');
        }
    },

    showNotice : function(notice) {
        var globalMessageEl = Dom.get('global-message');
        globalMessageEl.className = 'info';
        globalMessageEl.innerHTML = notice;
        showElement(globalMessageEl, notice != '');

    },
	
    hideError : function() {
        showElement('error', false);
    },

    checkNotEmpty : function(elements, labels) {
        this.errorMsg = "";
        for ( var i = 0; i < elements.length; i++) {
            var el = Dom.get(elements[i]);
            Dom.removeClass(el, 'required');
            if (el && Yl.trim(el.value) == '') {
                this.errorMsg += "<li>Необходимо заполнить поле \"" + labels[i]	+ "\"</li>";
                Dom.addClass(el, 'required');
            }
        }

        return this.errorMsg == "";
    },
	
    clearFields : function(elements) {
        for ( var i = 0; i < elements.length; i++) {
            var el = Dom.get(elements[i]);
            Dom.removeClass(el, 'required');
            if (el && el.value) {
                el.value = '';
            }
        }
    },
	
    jsonRequest: function(url, callback, scope, params, form){
        if(form != undefined)
            YuC.setForm(Dom.get(form));
		
        var data = '';
        if(params != null) {
            if(typeof(params) == 'object') {
                for(var i in params) {
                    data += i + '=' + params[i] + '&';
                }
            } else if(typeof(params) == 'string'){
                data = params;
            }
        }
        this.callback.argument = [callback, scope];
        this.callback.scope = this;
        YuC.asyncRequest('POST', url, this.callback, data);
    },

    checkAll: function (checked, name) {
        var checkboxList = document.getElementsByName(name);
        for(var i=0; i<checkboxList.length; i++){
            if(checkboxList[i].checked != undefined)
                checkboxList[i].checked = checked;
        }
    },

    getCheckedCount: function(name){
        var checkboxList = document.getElementsByName(name);
        var count = 0;
        for(var i=0; i<checkboxList.length; i++){
            if(checkboxList[i].checked)
                count++;
        }

        return count;
    },

    disableCheckboxes: function(name, disabled){
        var checkboxList = document.getElementsByName(name);
        for(var i=0; i<checkboxList.length; i++){
            checkboxList[i].disabled = disabled;
            if(disabled) {
                checkboxList[i].checked = false;
            }
        }
    },

    validate: function(fields){
        var res = true;
        for(var i=0; i<fields.length; i++){
            var el = Dom.get(fields[i].id);
            if(el){
                this.markFieldOnError(fields[i].id, '');
                for(var j=0; j<fields[i].rules.length; j++){
                    if(ValidationRules[fields[i].rules[j]]){
                        if(!ValidationRules[fields[i].rules[j]].call(this, el.value)){
                            res = false;
                            this.markFieldOnError(fields[i].id, Messages[fields[i].message[j]]);
                            break;
                        }
                    }
                }
            }
        }
        return res;
    },

    createDateSelectElement: function(container, prefix, selDate){
        var days = [];
        var val;
        for(var i=1; i<=31; i++){
            val = (i.toString().length == 1) ? '0' + i : i.toString();
            days.push({text:i.toString(), value:val});
        }
        var cbDays = new ComboBox(prefix + 'Day',
            {items:days, selectedValue:selDate.getDate(), container:container, width:30});

        var month = [];
        for(var i=1; i<=12; i++){
            val = (i.toString().length == 1) ? '0' + i : i.toString();
            month.push({text: i.toString(), value:val});
        }
        var cbMonth = new ComboBox(prefix + 'Month',
            {items:month, selectedValue:selDate.getMonth()+1, container:container, width:30});

        var years = [];
        var date = new Date();
        var currYear = date.getFullYear();
        for(var i=2008; i<=currYear + 1; i++){
            years.push({text:i.toString(), value:i});
        }

        var cbYear = new ComboBox(prefix + 'Year',
            {items:years, selectedValue:selDate.getFullYear(), container:container, width:40});

        return {d:cbDays, m:cbMonth, y:cbYear};
    },

    createCalendar: function(dateInputEl, dateHiddenEl, btnEl, callback, scope){
        YAHOO.util.Event.on(btnEl, 'click', function(){
            if (!this._dialog) {
                // Hide Calendar if we click anywhere in the document other than the calendar
                YAHOO.util.Event.on(document, "click", function(e) {
                    if(this._dialog != null) {
                        var el = YAHOO.util.Event.getTarget(e);
                        var dialogEl = this._dialog.element;
                        if (el != dialogEl && !YAHOO.util.Dom.isAncestor(dialogEl, el) && el != btnEl && !YAHOO.util.Dom.isAncestor(btnEl, el)) {
                            this._dialog.hide();
                        }
                    }
                }, this, true);

                this._dialog = new YAHOO.widget.Dialog("container", {
                    width:'200px',
                    height:'210px',
                    visible:false,
                    context:["show", "tl", "bl"],
                    draggable:false,
                    close:true,
                    zIndex:9999
                });
                this._dialog.setHeader('Укажите дату');
                this._dialog.setBody('<div id="cal"></div>');
                this._dialog.render(document.body);

                this._dialog.showEvent.subscribe(function() {
                    if (YAHOO.env.ua.ie) {
                        // Since we're hiding the table using yui-overlay-hidden, we
                        // want to let the dialog know that the content size has changed, when
                        // shown
                        this._dialog.fireEvent("changeContent");
                    }
                });
            }

            // Lazy Calendar Creation - Wait to create the Calendar until the first time the button is clicked.
            if (!this._calendar) {
                var navConfig = {
                    strings : {
                        month: "Месяц",
                        year: "Год",
                        submit: "OK",
                        cancel: "Отмена",
                        invalidYear: "Введите корректную дату"
                    },
                    monthFormat: YAHOO.widget.Calendar.SHORT,
                    initialFocus: "year"
                };

                this._calendar = new YAHOO.widget.Calendar("cal", {
                    iframe:false,          // Turn iframe off, since container has iframe support.
                    hide_blank_weeks:true,  // Enable, to demonstrate how we handle changing height, using changeContent
                    navigator:navConfig
                });
                this.localizeCalendar(this._calendar);
                this._calendar.render();

                this._calendar.selectEvent.subscribe(function() {
                    if (this._calendar.getSelectedDates().length > 0) {
                        var selDate = this._calendar.getSelectedDates()[0];
                        YAHOO.util.Dom.get(dateInputEl).value = YAHOO.util.Date.format(selDate, {
                            format:DateFormat.LONG
                        }, 'ru');
                        YAHOO.util.Dom.get(dateHiddenEl).value = YAHOO.util.Date.format(selDate, {
                            format:DateFormat.XML
                        }, 'ru');
                    } else {
                        YAHOO.util.Dom.get(dateInputEl).value = "";
                    }
                    this._dialog.hide();
                    this._isChange = true;
                    if(callback != undefined) {
                        callback.call(scope);
                    }
                }, this, true);

                this._calendar.renderEvent.subscribe(function() {
                    // Tell Dialog it's contents have changed, which allows
                    // container to redraw the underlay (for IE6/Safari2)
                    this._dialog.fireEvent("changeContent");
                });
            }

            var seldate = this._calendar.getSelectedDates();

            if (seldate.length > 0) {
                // Set the pagedate to show the selected date if it exists
                this._calendar.cfg.setProperty("pagedate", seldate[0]);
                this._calendar.render();
            }

            this._dialog.show();
        }, this, true);
    },

    localizeCalendar: function(cal){
        with(cal.cfg){
            setProperty("DATE_FIELD_DELIMITER", ".");
            setProperty("MDY_DAY_POSITION", 1);
            setProperty("MDY_MONTH_POSITION", 2);
            setProperty("MDY_YEAR_POSITION", 3);
            setProperty("MD_DAY_POSITION", 1);
            setProperty("MD_MONTH_POSITION", 2);
            setProperty("MONTHS_SHORT",   ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"]);
            setProperty("MONTHS_LONG",    ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]);
            setProperty("WEEKDAYS_1CHAR", ["В", "П", "В", "С", "Ч", "П", "С"]);
            setProperty("WEEKDAYS_SHORT", ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"]);
            setProperty("WEEKDAYS_MEDIUM",["Вос", "Пон", "Вт", "Ср", "Чет", "Пят", "Суб"]);
            setProperty("WEEKDAYS_LONG",  ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"]);
        }

        return cal;
    }
}

function showElement(el, show) {
    Dom.setStyle(el, 'display', (show) ? 'block' : 'none');
}

function setInnerHtml(el, html) {
    Dom.get(el).innerHTML = html;
}

/**
    * @method createInputElement
    * @description Creates an <code>&#60;input&#62;</code> element of the
    * specified type.
    * @private
    * @param {String} p_sType String specifying the type of
    * <code>&#60;input&#62;</code> element to create.
    * @param {String} p_sName String specifying the name of
    * <code>&#60;input&#62;</code> element to create.
    * @param {String} p_sValue String specifying the value of
    * <code>&#60;input&#62;</code> element to create.
    * @param {String} p_bChecked Boolean specifying if the
    * <code>&#60;input&#62;</code> element is to be checked.
    * @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    * one-html.html#ID-6043025">HTMLInputElement</a>}
    */
function createInputElement(p_sType, p_sName, p_sValue, p_bChecked) {

    var oInput,
    sInput;

    if (Lang.isString(p_sType) && Lang.isString(p_sName)) {

        if (UA.ie) {

            /*
                    For IE it is necessary to create the element with the
                    "type," "name," "value," and "checked" properties set all
                    at once.
                */

            sInput = "<input type=\"" + p_sType + "\" name=\"" +
            p_sName + "\"";

            if (p_bChecked) {

                sInput += " checked";

            }

            sInput += ">";

            oInput = document.createElement(sInput);

        }
        else {

            oInput = document.createElement("input");
            oInput.name = p_sName;
            oInput.type = p_sType;

            if (p_bChecked) {

                oInput.checked = true;

            }

        }

        oInput.value = p_sValue;

    }

    return oInput;

}

function expandit(curobj){
    folder=curobj.nextSibling.style;
    if (folder.display=="none")
        folder.display="";
    else
        folder.display="none";
}

YAHOO.util.DateLocale['ru'] = YAHOO.lang.merge(YAHOO.util.DateLocale, {
    a: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
    A: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
    b: ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Август', 'Сен', 'Окт', 'Ноябрь', 'Декабрь'],
    B: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
    c: '%Y.%b.%d %H:%M (%a)',
    p: ['', ''],
    P: ['', ''],
    x: '%Y.%m.%d',
    X: '%H %M'
});
