PageLoader = {
    is_loading: false
}

Overlay = {
    show: function() {
        $('#loading-overlay').height($(document).height());
        $('#loading-overlay').show();
    },
    hide: function() {
        $('#loading-overlay').hide();
    }
}

Loader = {
    show: function() {
        $('#page_loading').show();
        Overlay.show();
    },
    hide: function() {
        $('#page_loading').hide();
        Overlay.hide();
    }
}

MessageBox = {

    removeClass: function() {
        $('#gm_message_block').removeClass("ok error");
    },

    showError: function(txt) {
        this.removeClass();
        this.show();
        $('#gm_message_block').addClass("error");
        $('#gm_message_text').html(txt);
    },

    showSuccess:function (txt) {
        this.removeClass();
        this.show();
        $('#gm_message_block').addClass("ok");
        $('#gm_message_text').html(txt);
    },

    show: function() {
        $('#gm_message_block').show();
    },

    hide: function() {
        $('#gm_message_block').hide();
    }
}

$.fn.ajaxLink = function(options) {
   
    if (PageLoader.is_loading) {
        alert('Страничка загружается - подождите');
        return false;
    }



    options = $.extend({
        url:   this.attr('href'),
        target: '#main_page',
        dataType: 'html',
        cache: false,
        loader_hide: true
    }, options || {})

    page_place   = $(options.target);

    if(options.target == '#main_page'){
        aj_url = options.url;
        aj_url = aj_url.replace(/^http:\/\/.*?\//,'/');
    }

    if (options.confirm) {
        send = confirm(options.confirm);
    } else {
        send = true;
    }
    if (send) {
        PageLoader.is_loading = true;
        Loader.show();

        options = $.extend({
                url: options.url,
                dataType: options.dataType,
                cache: false,
                success: function(html) {
                    $(options.target).html(html)
                    if(options.loader_hide){
                        Loader.hide();
                    }
                    page_place.show();
                    PageLoader.is_loading = false;
                    if (options.script) {
                        eval(options.script);
                        //CloneInterfaceUpdater.redrawAllHolders();
                    }

                    if(options.target == '#main_page'){
                        document.location = '#'+aj_url;
                        $.historyLoad(aj_url);
                    }
                    //

                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    alert('Page Error Loading')
                    Loader.hide();
                    page_place.show();
                    PageLoader.is_loading = false;
                },
                complete: function (XMLHttpRequest, textStatus) {
                    var r = XMLHttpRequest.getResponseHeader('Hard-Redirect');                    
                    if (r) {
                        document.location = r;
                    }
                }

            }, options || {});
        $.ajax(options);
    }
    
}

$.fn.ajaxLinkJson = function(options) {
        
   
    options = $.extend({
       url: this.attr('href'),
       cache: false,
       dataType: 'json',
       success: function(json, code) {
            Loader.hide();
            
            if(json.script){
                eval(json.script);
            }

            if (json.error) {
                MessageBox.showError(json.error);
            }else {
                MessageBox.showSuccess(json.success);
            }

            if (this.script) {
                eval(this.script);
            }
       },
       error: function(XMLHttpRequest, textStatus, errorThrown) {
           Loader.hide();
           alert('Page Error Loading');
       }
    }, options || {});

    if (options.confirm) {
        send = confirm(options.confirm);
    } else {
        send = true;
    }

    if (send) {
        $('#gm_message_block').hide();
        Loader.show();
        $.ajax(options);
    }
}

$.fn.ajaxLinkJE = function (options) {
    url = this.attr('href');
    page_loading = $('#page_loading')
    page_loading.show()
    $('#loading-overlay').show();
    $.ajax({
        url: url,
        dataType:'json',
        complete: function(r, code) {
            alert(r.getResponseHeader('X-JSON') + ' -' + code);
            obj = eval("(" + r.getResponseHeader('X-JSON') + ")");
            
            $('#error_block').show();

            if (obj.error) {                
                $('#gm_message').attr('style', 'color:red');
                $('#gm_message').html(obj.error);                
            }else {
                $('#gm_message').attr('style', 'color:green');
                $('#gm_message').html(obj.success);                
            }
            page_loading.hide();
            $('#loading-overlay').hide();
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert('Page Error Loading')
            PageLoader.is_loading = false;
            page_loading.hide();
            $('#loading-overlay').hide();
        }
    });   
}