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) {
                    Loader.hide();
                    $.fn.showPopup({title:'Ошибка', html:'При загрузке страницы произошла ошибка.<br>Попробуйте еще раз.<br>Если ошибка будет повторяться, пожалуйста, обратитесь к администраторам.'});
                    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();
           $.fn.showPopup({title:'Ошибка', html:'При загрузке страницы произошла ошибка.<br>Попробуйте еще раз.<br>Если ошибка будет повторяться, пожалуйста, обратитесь к администраторам.'});
       }
    }, 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) {
            Loader.hide();
            $.fn.showPopup({title:'Ошибка', html:'При загрузке страницы произошла ошибка.<br>Попробуйте еще раз.<br>Если ошибка будет повторяться, пожалуйста, обратитесь к администраторам.'});
            PageLoader.is_loading = false;
            page_loading.hide();
        }
    });   
}

$.fn.showPopup = function (options) {
    options = $.extend({
       title: '',
       html: '',
       pure: false,
       url: false,
       hide_prev_popup: true,
       auto_ajax_link: false,
       data: {}
    }, options || {});

    if(options.hide_prev_popup){
        $('#popup_holder_div').remove();
    }

    var holder = $('#popup_holder_div');
    if (!holder[0]) {
        holder = document.createElement('div');
        holder.id = 'popup_holder_div';
        holder = $(holder);
        $('.box').prepend(holder);
    }

    if(options.url){
        $.fn.ajaxLink({
            url: options.url,
            data : options.data,
            success: function(html) {
                options.url = false;
                options.data = {};
                options.html = html;
                $.fn.showPopup(options);
                PageLoader.is_loading = false;
            }
        });
        return;
    }
    
    if(!options.pure){
        options.html = '<div class="popupDetailWraper">'
        +'<div class="popupDetail">'
            +'<div class="content">'
                +'<h2>'+options.title+'</h2>'
                +'<div class="popupDetailClose">'
                    +'<a href="#" onclick="$(\'.popupDetailWraper\').remove();Overlay.hide();return false;"><img src="/i/user/pdClose.gif" alt=""/></a>'
                +'</div>'
                +options.html
             +'</div><del>&nbsp;</del>'
            +'</div>'
        +'</div>';
    }

    holder.html(options.html);
    if(options.auto_ajax_link){

        var def_onclick = function(){
            $('.popupDetailWraper').remove();
            Overlay.hide();
            $(this).ajaxLink();
            return false;
        }

        holder.find('a').each(function(){
            if ( this.onclick ) return;
            this.onclick = def_onclick;
        });
    }
    Loader.hide();
    Overlay.show();
    var j_data_div = $('.popupDetailWraper');
    var top_offset = ($(window).height() - j_data_div.height()) / 2;
    if (top_offset < 0) { top_offset = 0 }
    if ($(window).height() > j_data_div.height()) {
        j_data_div.css({'top' : top_offset });
    } else {
        j_data_div.css({'position' : 'absolute', 'top' : ( top_offset + $(document).scrollTop() ) });
    }
}


/**
 * Returns the value of the field element.
 */
$.fieldValue = function(el, successful) {
	var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
	if (typeof successful == 'undefined') successful = true;

	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
		(t == 'checkbox' || t == 'radio') && !el.checked ||
		(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
		tag == 'select' && el.selectedIndex == -1))
			return null;

	if (tag == 'select') {
		var index = el.selectedIndex;
		if (index < 0) return null;
		var a = [], ops = el.options;
		var one = (t == 'select-one');
		var max = (one ? index+1 : ops.length);
		for(var i=(one ? index : 0); i < max; i++) {
			var op = ops[i];
			if (op.selected) {
				var v = op.value;
				if (!v) // extra pain for IE...
					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
				if (one) return v;
				a.push(v);
			}
		}
		return a;
	}
	return el.value;
};


$.fn.fieldValue = function(successful) {
	for (var val=[], i=0, max=this.length; i < max; i++) {
		var el = this[i];
		var v = $.fieldValue(el, successful);
		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
			continue;
		v.constructor == Array ? $.merge(val, v) : val.push(v);
	}
	return val;
};

$.fn.formToArray = function(semantic) {
	var a = [];
	if (this.length == 0) return a;

	var form = this[0];
	var els = semantic ? form.getElementsByTagName('*') : form.elements;
	if (!els) return a;
	for(var i=0, max=els.length; i < max; i++) {
		var el = els[i];
		var n = el.name;
		if (!n) continue;

		if (semantic && form.clk && el.type == "image") {
			// handle image inputs on the fly when semantic == true
			if(!el.disabled && form.clk == el) {
				a.push({name: n, value: $(el).val()});
				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
			}
			continue;
		}

		var v = $.fieldValue(el, true);
		if (v && v.constructor == Array) {
			for(var j=0, jmax=v.length; j < jmax; j++)
				a.push({name: n, value: v[j]});
		}
		else if (v !== null && typeof v != 'undefined')
			a.push({name: n, value: v});
	}

	if (!semantic && form.clk) {
		// input type=='image' are not found in elements array! handle it here
		var $input = $(form.clk), input = $input[0], n = input.name;
		if (n && !input.disabled && input.type == 'image') {
			a.push({name: n, value: $input.val()});
			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
		}
	}
	return a;
};
