/**
 * @author Lobchuk N Vitaly
 * @link
 * @copyright Copyright &copy; 2010
 */
(function($) {
    
    
    $.mdnet = {
        version : '1.0',
        enableTrace : false,

        ajaxSettings: {
            timeout: 10000,
            cache: false
        },

        TRACE_ERROR : 'error',
        TRACE_TRACE : 'trace',
        TRACE_INFO : 'info',
        TRACE_LOG : 'log',
        
        clientScript: {

            scripts: ['jquery.js'],
            
            init: function(){
                this.initMap().fixAjax().fixAjaxSetup();
            },

            initMap:function(){
                this.scriptMap.apply(this,$('script[src!=],link[rel=stylesheet][href!=]').map(function(i,item){
                    return (item=$(item)).attr(item.is('script')?'src':'href').replace(/.*?\/([^\/]+)$/,'$1');
                }).toArray());
            },

            scriptMap:function(){
                var scope=this,
                args=arguments;

                if(args.length>0)
                    scope.scripts=scope.scripts.concat($.map(args,function(script){
                        if(-1===$.inArray(script,scope.scripts))
                            return script;
                    }));
                else
                    return scope.scripts||[];
            },
            fixAjax: function(){
                var ajax=$.ajax,
                scriptMap=this.scriptMap;

                $.ajax=function(options) {
                    
                    if(options.data == undefined) options.data = "";
                    
                    if(!options.data) {
                        options.data='scriptMap='+scriptMap().join(",");
                    } else if(-1===options.data.toString().indexOf('scriptMap')) {
                        if(typeof options.data ==  "object")
                            options.data['scriptMap'] = scriptMap().join(",");
                        else options.data += '&scriptMap='+scriptMap().join(",");
                    }
                    return ajax.apply(this,arguments);
                };
            },

            fixAjaxSetup: function(){
                var scriptMap=this.scriptMap;
                $.ajaxSetup({
                    success:function(data){
                        if(data)
                            $.map(data.match(/<(script)[^<>]*?(src)[^<>]*?>/g)||[],function(tag){
                                scriptMap(tag.match(/(src)=(["']).*?\/([^\/]+)\2/)[3]);
                            });
                    },
                    complete:function(xhr,text){
                        if(xhr.responseText)
                            $.map(xhr.responseText.match(/<(script)[^<>]*?(src)[^<>]*?>/g)||[],function(tag){
                                scriptMap(tag.match(/(src)=(["']).*?\/([^\/]+)\2/)[3]);
                            });
                    }
                });
            }
        },
        
        createUrl: function(url) {
            var prefix = '';
            if(url.indexOf("/") == 0)
                prefix = '/';
            
            if(prefix == '') url = '/' + url;
            return prefix + app.language + url;
        },

        /**
         * <strong>Создает диалоговое окно jQuery.</strong>
         * @param id идентификатор окна
         * @param title заголовок окна
         * @param width ширина, если 0 то auto
         * @param height высота, если 0 то auto
         * @param params jQuery настройки окна
         * @return jQuery Dialog 
         */
        /*createDialog: function(id, title, width, height, params) {
            var dialog = $("#" + id);
            
            if(params == undefined)
                params = {};
            
            params['title'] = title;
            params['autoOpen'] = true;
            params['modal'] = true;
            params['position'] = params.position == undefined?['center', 'top']:params.position;
            
            
            params['resizable'] = false;
            params['width'] = width<=0?'auto':width;
            params['height'] = height<=0?'auto':height;
            params['draggable'] = true;
            if (!dialog.length) {
                dialog = $("<div id='" + id + "'></div>");
            }
            dialog.dialog(params);
            return dialog;
        },

        openDialog: function(id) {
            var dialog = $("#" + id);
            if (dialog.length) {
                dialog.dialog("open");
            } else {
                alert("Dialog #" + id + "not found!");
            }
            return false;
        },*/

        alert: function(id, title, text, params, onClose) {
            
            var template = '<p>'+text+'</p>' + 
            '<p align="right"><button type="button">'+t('mdnet', 'Закрыть')+'</button>'
            '</p>';                     
                     
            var dlg = new $.fn.mdialog({
                url: false,
                title:title,
                content: template
            });
            
            dlg.open();         
                     
            $("#"+dlg.getId()+" button:first").click(function(e) {                
                dlg.close();
            });
        },

        confirm: function(id, title, text, params, callback) {     
            
            var template = '<p>'+text+'</p>' + 
            '<p align="right"><button>'+t('mdnet','Да')+'</button><button>'+t('mdnet','Нет')+'</button>'
            '</p>';

            var dlg = new $.fn.mdialog({
                title:title,
                url: false,
                content: template
            });
            
            dlg.open();

            

            var buttons = $("#"+dlg.getId()+" button").click(function(e) {
                var yes = buttons.index(this) === 0;
                dlg.close();
                if(yes) {
                    callback();
                }
                
            });
        },
        
        input: function(id, title, text, callbackOk, callbackCancel) {
            
            var template = '<p>'+text+'</p>' + 
            '<form><input type="text" /><button type="button">'+t('mdnet','Да')+'</button><button type="button">'+t('mdnet','Отмена')+'</button></form>'
            '</p>';                     
                     
            var dlg = new $.fn.mdialog({
                title: title,
                url: false,
                content: template
            });
            
            dlg.open();         
                     
            var buttons = $("#"+dlg.getId()+" button").click(function(e) {
                var yes = buttons.index(this) === 0;
                if(yes) {
                    if($.isFunction(callbackOk))
                        callbackOk(dlg.getContent().find('input').val());
                } else {
                    if($.isFunction(callbackCancel))
                        callbackCancel();
                }
                dlg.close();
            });
        },


        updateContent: function(id, url, callback) {
            $.mdnet.ajaxLoader(true);
            $.mdnet.getHtml(url, 'get', {
                updateContent:true
            }, function(data) {
                $.mdnet.replaceContent(id, data);
                if($.isFunction(callback)) {
                    callback();                    
                }                
                $.mdnet.ajaxLoader(false);
            });
        },

        replaceContent: function(id, data) {
            $('#' + id).html($(data).find('#' + id).html());
            $(document).trigger('onReplaceContent', id);
        },

        isExsist: function(id) {
            var object = $("#" + id);
            if (object.lenght) return true;
            return false;
        },

        /**
         * <strong>Загружает страницу используя HTTP запрос</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param dataType строка, описывает тип данных, которые ожидаются в качестве ответа сервера.<br />
         * - xml: вернет XML документ, который может быть обработан через jQuery<br />
         * - html: вернет HTML как plain text.<br />
         * - script: расценивает ответ как JavaScript и возвращает его как plain text.<br />
         * - json: расценивает ответ как данные в формате JSON и возвращает JavaScript объект.<br />
         * - jsonp: загружает данные в формате JSON используя JSONP.<br />
         * - text: строка plain text.
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        ajax: function (url, type, dataType, params, callback) {
            $.ajax({
                url: url,
                timeout: $.mdnet.ajaxSettings.timeout,
                type: type,
                data: params,
                dataType: dataType,
                cache: $.mdnet.ajaxSettings.cache,
                success : function(data) {
                    callback(data, url);
                },
                error: function(data) {
                    alert("Ошибка во время выполнения запроса.\nВозможные причины:\n\nПлохое соединение с сервером\nОшибка на стороне сервера\n");
                }
            });
        },
        /**
         * <strong>Загружает страницу используя HTTP запрос и ожидает тип данных JSON в качестве ответа сервера.</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        getJson: function (url, type, params, callback) {
            $.mdnet.ajax(url, type, 'json', params, callback)
        },
        /**
         * <strong>Загружает страницу используя HTTP запрос и ожидает тип данных HTML как plain text в качестве ответа сервера.</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        getHtml: function (url, type, params, callback) {
            $.mdnet.ajax(url, type, 'html', params, callback)
        },
        /**
         * <strong>Загружает страницу используя HTTP запрос и ожидает тип данных XML документ в качестве ответа сервера.</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        getXml: function (url, type, params, callback) {
            $.mdnet.ajax(url, type, 'xml', params, callback)
        },
        /**
         * <strong>Загружает страницу используя HTTP запрос и ожидает тип данных JSON(используя JSONP) в качестве ответа сервера.</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        getJsonp: function (url, type, params, callback) {
            $.mdnet.ajax(url, type, 'jsonp', params, callback)
        },
        /**
         * <strong>Загружает страницу используя HTTP запрос и ожидает тип данных Text как plain text в качестве ответа сервера.</strong>
         * @param url url запроса
         * @param type тип запроса, POST или GET
         * @param params данные, передаваемые на сервер.
         * @param callback указывается функция, которая будет вызвана в случае успешного завершения запроса.
         */
        getText: function (url, type, params, callback) {
            $.mdnet.ajax(url, type, 'text', params, callback)
        },
        /**
         * <strong>Отображает индикатор загрузки пока выполняеться AJAX запрос.</strong>
         * @param state показать или убрать индикатор
         * @param timeoutms таймаут после чего индикатор исчезает
         */
        ajaxLoader: function(state, timeoutms) {
            var u = app.resourceUrl + "/js/ajax-loader.gif";
            if (state) {
                var left = ($(document).width() / 2) - 32;
                var top = ($(document).height() / 2) - 32;

                $("body").append("<div id=\"ajaxLoader\" class=\"ui-widget-overlay\" style=\"background-color:white;width: 100%; height: 100%; z-index: 99999;\"><img src=\"" + u + "\" style=\"z-index: 99999999;position:absolute;top:" + top + "px; left:" + left + "px;\"></div>");

                if (timeoutms) {
                    setTimeout(function () {
                        ajaxLoader(false);
                    }, timeoutms);
                }
            } else {
                $("#ajaxLoader").remove();
            }
        },
        
        
        showAjaxError: function(model, ID_ERROR_PREFIX) {
            for(var attribute in model.errors) {                 
                $("#" + ID_ERROR_PREFIX + attribute).html(model.errors[attribute]);
            }
        },
        
        twitch: function(id) {            
            $(id).animate({
                left: '+=40px'
            }, 40, function () {                
                setTimeout(function() {
                    $(id).animate({
                        left: '-=40'
                    }, 40);
                }, 10);
            });
        },
        isFrame: function() {
            return window.frames.length > 0;
        },
        
        reMapFiles: function($, scope){
            var bind=function(fn,context){
                return function(){
                    var ret=fn.apply(context,arguments);
                    return (undefined===ret)?context:ret;
                };
            }, fnScope=function(){
                return scope;
            }, callee=arguments.callee;

            $.each(scope, function(name, context){
                // delegation & recursion
                if('object'===typeof(context) && context && !$.isArray(context))
                    callee($,$.extend(context,{
                        parentScope:fnScope
                    }));
                else if($.isFunction(context))
                    scope[name]=bind(context,scope);
                if($.isFunction(context.init))
                    context.init();
            });
        },

        trace: function(type, value) {
            try {
                if ($.mdnet.enableTrace) {
                    switch (type) {
                        case $.mdnet.TRACE_ERROR:
                            console.error(value);
                            break;
                        case $.mdnet.TRACE_LOG:
                            console.log(value);
                            break;
                        case $.mdnet.TRACE_INFO:
                            console.info(value);
                            break;
                        case $.mdnet.TRACE_TRACE:
                            console.trace(value);
                            break;
                    }
                }
            } catch (exception) {
            }
        },
        
        disableSelection: function(e){
            return $(e).bind(("selectstart"), function(a) {
                a.preventDefault()
            });
        },

        loadByUrlHash: function(id) {
            try {
                var url = location.hash.toString();
                url = url.substr(1, url.length);
                $(id).load('/' + url);
                return false;
            } catch (exception) {
                $.mdnet.trace($.mdnet.TRACE_ERROR, exception);
                return false;
            }
        },
        
        floatRound: function(value, c) {
            value = value.toString();
            var i = value.indexOf('.');
            if(i != -1) {
                var parts = value.split('.');
                var npart = parts[1].substr(0, c);
                return parseFloat(parts[0] + '.' + npart);
            } else return parseFloat(value);  
        }
        
    };
    /*
     * ajax events
     */
    onAjaxStart = function() {
        $.mdnet.ajaxLoader(true);
        
    }

    onAjaxStop = function() {
        $.mdnet.ajaxLoader(false);
    }

    $().ajaxStart(function() {
        $.mdnet.trace($.mdnet.TRACE_INFO, 'Началась загрузка Ajax');
        onAjaxStart();
    }).ajaxStop(function() {
        $.mdnet.trace($.mdnet.TRACE_INFO, 'Завершилась загрузка Ajax');
        onAjaxStop();
    });

    $.mdnet.reMapFiles($, $.mdnet);

    
    
})(jQuery);

