/**
 * Глобальный обьект, хранит глобальные настройки и методы
 *
 * @class Globals
 */
Globals = {};

/**
 * Глобальный флаг отладки
 *
 * @property DEBUG
 * @type Boolean
 * @static
 * @final
 */
Globals.DEBUG = true;

/**
 * Конфиг yuiloader-a
 *
 * @property YUILoaderConfig
 * @type Object
 * @static
 */
Globals.YUILoaderConfig = {
    base: 'lib/public/yui/'
};

/**
 * Возвращает yuiloader обьект, синглтон
 *
 * @method getLoader
 * @return {Object} yuiloader
 */
Globals.getLoader = function(){
    return {};

    if (Globals._loader) {
        return Globals._loader;
    }
    else {
        var loader = new YAHOO.util.YUILoader(Globals.YUILoaderConfig);
        $A(Globals.JSModules).each(loader.addModule.bind(loader));
        Globals._loader = loader;
        return loader;
    }
}

/**
 * Подключить один и более модулей
 *
 * @method require
 * @param {Object} what массив имён модулей. возможно просто передатьвать имена
 *  модулей через запятую
 */
Globals.require = function(what){
    return;

    var a = (typeof what === "string") ? arguments : what;
    with (Globals.getLoader()) {
        require(a);
        insert();
    }
}

/**
 * Модули, добавляемые к yuiloader-у, при его создании
 * <dl>
 *     <dt>name:</dt>       <dd>required, the component name</dd>
 *     <dt>type:</dt>       <dd>required, the component type (js or css)</dd>
 *     <dt>path:</dt>       <dd>required, the path to the script from "base"</dd>
 *     <dt>requires:</dt>   <dd>the modules required by this component</dd>
 *     <dt>optional:</dt>   <dd>the optional modules for this component</dd>
 *     <dt>supersedes:</dt> <dd>the modules this component replaces</dd>
 *     <dt>rollup:</dt>     <dd>the number of superseded modules required for automatic rollup</dd>
 *     <dt>fullpath:</dt>   <dd>If fullpath is specified, this is used instead of the configured base + path</dd>
 *     <dt>skinnable:</dt>  <dd>flag to determine if skin assets should automatically be pulled in</dd>
 * </dl>
 * @property JSModules
 * @type Array
 * @static
 * @final
 *//*
Globals.JSModules = [{
    name: 'Tree',
    type: 'js',
    fullpath: 'lib/public/public/Tree.js',
    requires: ['treeview']
}, {
    name: 'TreeEditable',
    type: 'js',
    fullpath: 'lib/public/TreeEditable.js',
    requires: ['Tree']
}, {
    name: '#Calendar.CSS',
    type: 'css',
    fullpath: 'lib/public/calendar/calendar.css'
}, {
    name: 'Calendar',
    type: 'js',
    fullpath: 'lib/public/calendar/calendar.js',
    requires: ['#Calendar.CSS']
}, {
    name: 'FormValidation',
    type: 'js',
    fullpath: 'lib/public/FormValidation.js'
}, {
    name: 'Exception',
    type: 'js',
    fullpath: 'lib/public/Exception.js'
}, {
    name: 'prototype',
    type: 'js',
    fullpath: 'lib/public/Exception.js'
}];
*/
/**
 * Устанавливает дефолтные значение виджета DataTable. Вызывать один раз до
 * создания DataTable
 *
 * @method setDataTableDefaults
 */
Globals.setDataTableDefaults = function(){
    if (!YAHOO || !YAHOO.widget || !YAHOO.widget.DataTable)
        return;
    with (YAHOO.widget.DataTable) {

        CLASS_TABLE = "std";// удалено в yui 2.5.0 <-
        CLASS_HEADER = "stdHeader";
        //CLASS_BODY = "";
        CLASS_EVEN = "stdRow";
        CLASS_ODD = "stdRow";

        //CLASS_LABEL = "stdTableHeader";
        //CLASS_LINER = "stdTableHeader";

        MSG_LOADING = "Подождите. Идёт обработка запроса... <img src='pic/wait.gif'/>";
        //CLASS_LOADING = "";
        MSG_ERROR = "Ошибка обработки данных.";
        //CLASS_ERROR = "";

        MSG_EMPTY = "Не найдено записей";
        //CLASS_EMPTY = "";
    }
}

/**
 * Оповестить пользователя об ошибках, инициированных в back-end-е
 *
 * @method parseErrors
 * @param {Array} первый элемент - текст ошибки, второй - код ошибки
 */
Globals.parseErrors = function() {
    if (arguments.length > 0 && arguments[0] != null) {
        Globals._errors = $A(arguments);
    }
};

Globals.onload = Event.observe.curry(document, 'dom:loaded');

/**
 * Оповестить пользователя об предупреждениях, инициированных в back-end-е
 *
 * @method parseWarnings
 * @param {Array} первый элемент - текст ошибки, второй - код ошибки
 */
Globals.parseWarnings = function(){
    if (arguments.length > 0 && arguments[0] != null) {
        Globals._warnings = $A(arguments);
    }
};

Globals.onload(function(){

    template = "<tr><td>#{code}</td><td>&nbsp</td><td>#{text}</td></tt>";

    if (Object.isArray(Globals._errors)) {
        var body = ["<table>"];
        body.push(template.interpolate({
                text: "Описание",
                code: "Код ошибки"
        }))
        Globals._errors.each(function(error, i){
            body.push(template.interpolate({
                i: i,
                text: error[0],
                code: error[1]
            }));
        });
        body.push('</table>');

        Message.showModal('Ошибка', body.join(''), function(){history.back(-1)});
    }

    if (Object.isArray(Globals._warnings)) {
        var body = ["<table>"];
        Globals._warnings.each(function(error, i){
            body.push(template.interpolate({
                text: error[0],
                code: error[1]
            }));
        });
        body.push('</table>');

        Message.showModal('Уважаемый!', body.join(''));
    }

});

function dispatchException(message, type, attr){
    if(typeof Message != 'undefined' && Message.showModal) {
        Message.showModal('Ошибка', message);
    } else {
        alert(message);
    }
}

/**
 * @class Module
 */
var Module = Class.create({
    /**
     * @constructor
     * @param {Object} what массив имён или имена подключаемых модулей
     */
    initialize: function(what){
        var a = (typeof what === "string") ? arguments : what;

        Globals.onload(this.create.bind(this).curry(a));
        if (this.destroy)
            Event.observe(window, "unload", this.destroy.bind(this));
    }
});

/**
 * Устанавливается в true по событию 'dom:loaded'
 *
 * @property isDomLoaded
 * @static
 * @type Boolean
 */
Globals.isDomLoaded = false;
Globals.onload(function(){
    Globals.isDomLoaded = true
});

/**
 * Создаёт класс, наследуемый от Module и возвращает его instance
 *
 * @param {Object} поля создаваемого класса
 * @method
 * @return {Object} экземпляр класса
 * @static
 */
Module.create = function(){
    if (arguments.length == 0)
        throw "Can't create Module, check params"
    var params = $A(arguments);
    var classObject = params.pop();
    classObject = Class.create(Module, classObject);
    return new classObject(params);
}

/*
if (YAHOO && YAHOO.util && YAHOO.util.DateLocale) {
 YAHOO.util.DateLocale['ru'] = YAHOO.lang.merge(YAHOO.util.DateLocale,{
        a: ["Вос", "Пон", "Вто", "Сре", "Чет", "Пят", "Суб"],
        A: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
        b: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Ауг", "Сеп", "Окт", "Ноя", "Дек"],
        B: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
        c: '%a %d %b %Y %T %Z',
        p: ['AM', 'PM'],
        P: ['am', 'pm'],
        r: '%I:%M:%S %p',
        x: '%d.%m.%Y',
        X: '%T'
 });
}
*/