var main_panel_id="content";

var first=true;
var prev_cursor=false;
var xhttp=null;
var menu_pos=false;

var loading=false;
var blocked=false;


var prev_block_id=false;
var prev_top=false;
var prev_number=false;
var prev_height=false;


var work_block_id=false;
var work_top=false;
var work_number=false;
var work_height=false;
var scripts_count=0;

var panel_no_scroll=true;

/*handlers*/
var on_post_error=null;
var on_post_success=null;
var after_panel_load=null;
var additional_accept=null;
var panel_destructor=null;
var on_post_message=null;

var last_request=new Array();

/*
for testing only !!!!!!
*/
$(document).ready(function(){
    try
    {
        if( $.tooltip )
        {
            $(".tooltip_area").tooltip({
bodyHandler: function() {
                    return $(this).children().filter("span").html();
                },
showURL: false
            });
        }

    }
    catch(e)
    {
        _sys_error("initialize tooltip" , "for testing_only",  e);
    }

});


/*
/// for testing only !!!!!!
*/


/*
вызывается в onclick, на меню, в админ части

@top    -расстояние по вертикали блока меню, относительно блока анимации
@height -высота блока анамации
@id     -идентификатор блока меню, куда производится перемещение блока анимации
@number -номер строки блока меню, начиная с еденицы
@url    -url с которого необходимо произвести загрузку информации
*/
function menu_click(id, number, url, js)
{
    
    if(!loading)
    {
        if(panel_destructor)
        {
            panel_destructor();
            panel_destructor=null;
        }
        addHash(id, number);
        loginFormHide();
        loading=true;
        start_load(id, number);
        start_request(url,getPagerParams(menuIdToHash('cursor_'+id+'_'+number)),js);
    }
}


function load_panel(url, params, js)
{
    if(!loading)
    {
        loginFormHide();
        loading=true;
        block_panel();
        start_request(url, params, js);
    }
}

/*
производит POST запрос на указанный URL без блокировки и разблокировки экрана (Возвращать тип "message").
*/
function load_message(url, params, js)
{
    save_request(url, params, js, 'message');
    if(js && !js.no)
    {
        load_scrips(url, params, js);
        return;
    }

    try
    {
        $("#error").hide();
        xhttp=$.ajax(
        {
type:       "POST",
url:        url,
data:       params,
success:    parse_xml,
error:      load_error
        }
        );
    }
    catch(e)
    {
        _sys_error("load_message" , "AJAX call",  e);
    }
}


function load_scrips(url, params, js)
{
    try
    {
        for(k in js)
        {
            scripts_count++;
        }



        for(k in js)
        {
            getScript(js[k],    script_loaded(url, params, js));
        }


    }
    catch(e)
    {
        _sys_error("load_scrips" , "load remote scripts",  e);
    }
}


function script_loaded(url, params, js)
{
    if(--scripts_count ==0 )
    {
        js=null;
        js=new Object();
        js.no=true;
        start_request(url, params, js)
    }

}


/*
производит POST запрос на указанный URL.
*/
function start_request(url, params, js)
{
    if(!js||!js.no)
    {
    save_request(url, params, js);
    }

    if(js && !js.no)
    {
        load_scrips(url, params, js);
        return;
    }

    try
    {
        $("#error").hide();
        xhttp=$.ajax(
        {
type:       "POST",
url:        url,
data:       params,
success:    load_success,
error:      load_error
        }
        );
    }
    catch(e)
    {
        _sys_error("start_request" , "AJAX call",  e);
    }


}


function start_load(id, number)
{
    block_panel();
    moveSlideTab(id, number);
}


function moveSlideTab(menu, item, hash)
{
    if(typeof(hash)!='undefined')
    {
        document.location.hash='#'+hash;
        if(!isset(window.tabLocation))
        {
            window.tabLocation={};
        }
        window.tabLocation.hashOld=hash;
    }
    if(typeof(menu)=='undefined'||menu==0 || $('#top'+menu).length==0)
    {
        $("#a_block").css("display", "none");
        if(prev_cursor)
        {
            $(prev_cursor).css("visibility", "hidden");
            var a=$(prev_cursor).parent().children()[1];
            $(a).removeClass("over");
        }
        first=true;
        return;
    }
    if(typeof(item)=='undefined')
    {
        item=1;
    }

    if(menu_pos==false)
    {
        menu_pos=new Array();
        menu_pos['top']=$('.line_shadow').offset().top;
    }
    if(typeof(menu_pos['top'+menu])=='undefined')
    {
        menu_pos['top'+menu]=new Array();
        menu_pos['top'+menu]['top']=$('#top'+menu).offset().top+176+129-menu_pos['top'];
        menu_pos['top'+menu]['height']=$('#top'+menu).height()+18;
    }
    move_block(menu_pos['top'+menu]['top'], menu_pos['top'+menu]['height'], 'top'+menu, item);
}


function move_block(top, height, id, number)
{
    work_block_id=id;
    work_top=top;
    work_number=number;
    work_height=height;

    try
    {
        if(first)
        {
            first=false;

            prev_block_id=work_block_id;
            prev_top=work_top;
            prev_number=work_number;
            prev_height=work_height;


            $("#a_block").css("top", top);
            $("#a_block").css("height", height);
            $("#a_block").css("display", "block");
            $("#cursor_"+id.substr(3)+"_"+number).css("visibility", "visible");

            var a=$("#cursor_"+id.substr(3)+"_"+number).parent().children()[1];
            $(a).addClass("over");

            prev_cursor="#cursor_"+id.substr(3)+"_"+number;
            return;
        }

        $("#a_block").animate({top: top, height:height}, 500, "easein",
        function()
        {

            if(prev_cursor)
            {
                $(prev_cursor).css("visibility", "hidden");
                var a=$(prev_cursor).parent().children()[1];
                $(a).removeClass("over");
            }

            $("#cursor_"+id.substr(3)+"_"+number).css("visibility", "visible");
            var a=$("#cursor_"+id.substr(3)+"_"+number).parent().children()[1];
            $(a).addClass("over");
            prev_cursor="#cursor_"+id.substr(3)+"_"+number;
        }
        );
    }
    catch(e)
    {
        _sys_error("move_block" , "moving animation block",  e);
    }
}


function cancel_load()
{
    loading=false;
    xhttp.abort();
    unblock_panel();

    try
    {
        $("#a_block").css("top", prev_top);
        $("#a_block").css("height", prev_height);
        $("#a_block").css("display", "block");

        $(prev_cursor).css("visibility", "hidden");
        var a=$(prev_cursor).parent().children()[1];
        $(a).removeClass("over");

        $("#cursor_"+prev_block_id.substr(3)+"_"+prev_number).css("visibility", "visible");
        a=$("#cursor_"+prev_block_id.substr(3)+"_"+prev_number).parent().children()[1];
        $(a).addClass("over");
        prev_cursor="#cursor_"+prev_block_id.substr(3)+"_"+prev_number;


    }
    catch(e)
    {
        _sys_error("cancel_load" , "moving back animation block",  e);
    }

}



function load_error(e)
{
    loading=false;
    show_error(e);
    cancel_load();
}

function show_error(msg)
{
    $("#error").fadeIn();
    $("#error_msg").html(msg);
}



function load_success(data)
{
    loading=false;
    if($('status', data).text()=="authorize")
    {
        panel_no_scroll = true;
    }
    unblock_panel();
    parse_xml(data);

}


function output_xml(data)
{
    if(data)
    {
        try
        {
            data=data.replace(/#001;/g,   '#');
            data=data.replace(/#002;/g,   '<');
            data=data.replace(/#003;/g,   '>');
            data=data.replace(/#004;/g,   '&');


            return data;
        }
        catch(e)
        {
            return "";
        }
    }
    return "";
}


function save_block_pos()
{
    prev_block_id=work_block_id;
    prev_top=work_top;
    prev_number=work_number;
    prev_height=work_height;
}


function redesign()
{
    datePickerController.create();
    textareaResizer();
    correctPNG();
    initializeTooltips();
    
    add_fields_validator=new FormValidator();
    add_fields_validator.scan();
}


function get_additional_message(additional)
{
    if(additional && additional.length && additional[0].firstChild && additional[0].firstChild.nodeValue)
    {
        additional=additional[0].firstChild.nodeValue;
        return output_xml(additional);
    }
    return false;
}


function prepare_content(nodes)
{
    if(!nodes)
    return false;

    var content='';
    for (k=0; k<nodes.length; k++)
    {
        if(nodes[k] && nodes[k].firstChild && nodes[k].firstChild.nodeValue)
        content+=(nodes[k].firstChild.nodeValue);
    }

    return output_xml(content);
}

function _get_element_value(tree, name)
{
    var node=tree.getElementsByTagName(name);
    if(node && node.length)
    {
        return node;
    }
    return false;
}

function parse_xml(data)
{
    try
    {
        //Information about PHP errors
        if(typeof(data)=='string')
        {
            var startXml=data.toString().indexOf("<?xml version='1.0' encoding='UTF-8'?>");
            if(startXml!=0)
            {
                if(startXml<0)
                {
                    log(data.toString());
                    data="";
                }
                else
                {
                    log(data.toString().substr(0,startXml));
                    data=data.toString().substr(startXml);
                }

            }
        }
        //End of information about PHP errors
        
        
        var status      =   $('status', data).text();
        var additional  =   $('additional', data).text();
        if($('langugage_data', data).length>0)
        {
            eval('window.langugage_data='+$('langugage_data', data).text());
        }

        ////////////////////DEBUG///////////////////
        var debug_node  =   $('debug', data).text();

        if(typeof(log)=='function'&&debug_node)
        {
            log(prepare_content(debug_node));
        }
        ////////////////////////////////////////////

        if(status)
        {
            var content ='';
            $('content', data).each(function(o){content+=$(this).text();})
            content=output_xml(content);
            
            switch(status)
            {
            case "error":

                if(on_post_error)
                {
                    on_post_error(content);
                    on_post_error=null;
                    on_post_success=null;
                }
                else
                {
                    //displayMessageEx(content, true);
                    show_error(content);
                    //load_error();
                }


                break;
            case "message":
                if(on_post_message)
                {
                    if(!on_post_message(content)!=1)
                    {
                        on_post_message=null;
                    }
                }
                break;
            case "authorize":

                if(loginFormShow)
                {
                    loginFormShow(content);
                }

                break;
            case "output":
                if(on_post_success)
                {
                    if(on_post_success(content)!=1)
                    {
                        on_post_success=null;
                    }
                }
                else
                {
                    save_block_pos();

                    //fill new content

                    $("#"+main_panel_id).html(content);

                    redesign();

                    if(after_panel_load)
                    {
                        after_panel_load();
                        after_panel_load=null;
                    }
                    
                    if(additional_accept && additional)
                    {
                        //try{
                            additional_accept(additional)
                        //}catch(e){alert(additional_accept);_sys_error("parse_xml:additional" , "parsing xml object",  e.message);}
                        additional_accept=null;
                    }
                    
                }
                try{
                if(window.after_redirect_message)
                {
                displayMessageEx(window.after_redirect_message);
                window.after_redirect_message=false;
                }
                }catch(e){alert("window.after_redirect_message: "+e.message);}
                try{
                if(window.after_redirect_error)
                {
                displayMessageEx(window.after_redirect_error,true);
                window.after_redirect_error=false;
                }
                }catch(e){alert("window.after_redirect_error: "+e.message);}
                break;

            default:
                alert("UNKNOWN response: "+status);
            }  
        }

    }
    catch(e)
    {
        //console.log(e);
        load_error("crash");
        _sys_error("parse_xml" , "parsing xml object",  e.message);
    }
}



function block_panel()
{
    blocked=true;

    $("#"+main_panel_id).block();
    $('#block_msg').css('opacity',0.5);
    $('input.loading_btn').css({'backgroundImage': 'url('+block_btn_img[1].src+')'});

}

function unblock_panel()
{
    if(!blocked)
    return;
    blocked=false;
    try
    {
        $("#"+main_panel_id).unblock();
        //scrolling after panel loading
        if(typeof(panel_no_scroll)=='undefined'||panel_no_scroll==false)
        {
            var topPos=$("#"+main_panel_id).offset().top;
            if($(document).scrollTop()>topPos)
            {
                $.scrollTopEx(topPos);
            }
        }
        if(panel_no_scroll=='one')
        {
        panel_no_scroll=false;
        }
    }
    catch(e){}
}


function _sys_error(a, b, c)
{
    printStackTrace();
    show_error(a+"   "+b+"   "+c);
    /*alert(a);
    alert(b);
    alert(c);*/
}

function initializeTooltips()
{
    /*tooltips*/
    $(".tooltip_area").tooltip({
bodyHandler: function() {
            return $(this).children().filter("span:last").html();
        },
showURL: false
    });
    /*__tooltips*/
}


function save_request(url, params, js, type)
{
    last_request['url'] = url;
    last_request['params'] = params;
    last_request['js'] = js;
    last_request['type'] = type;
    last_request['blocked'] = blocked;
    last_request['panel_no_scroll'] = panel_no_scroll;

    last_request['on_post_error'] = on_post_error;
    last_request['on_post_success'] = on_post_success;
    last_request['after_panel_load'] = after_panel_load;
    last_request['additional_accept'] = additional_accept;
    last_request['panel_destructor'] = panel_destructor;
    last_request['on_post_message'] = on_post_message;

}


function restore_request()
{
    on_post_error = last_request['on_post_error'];
    on_post_success = last_request['on_post_success'];
    after_panel_load = last_request['after_panel_load'];
    additional_accept = last_request['additional_accept'];
    panel_destructor = last_request['panel_destructor'];
    on_post_message = last_request['on_post_message'];
    blocked = last_request['blocked'];
    panel_no_scroll = last_request['panel_no_scroll'];


    if(last_request['type']=='message')
    {
        load_message(last_request['url'], last_request['params'], last_request['js'])
    }
    else
    {
        start_request(last_request['url'], last_request['params'], last_request['js']);
    }

}
