/*ToDo: 
!Обязательно либо id либо gid
Опционально применять свойства рекурсивно к вложенным
Все редактируемые свойства свести в 1 место и применять автомат.
*/
var style_editor = function() {
    var ext_win;
    var ext_win_switch;
    var ext_tb;
    var ext_tb_sw;
    var btns;
    var btns_sw;
    var combo;
    var $last_border;
    var editing = false;
    var ext_txt_menu;
    var ext_bg_menu;
    var ui_inited = false;
    var ui_switch_inited = false;
    var ext_win_count = 0;
    // стили по умолчанию для реактируемых элементов, которые есть или были в DOM и сохранялись на сервер
    // для групповых - в единственном экземпляре.
    var default_css = new Array();
    var deploy_css = new Array();
    var just_deployed = false;
    var meshed = false;
    //var is_audio_page = 
    var editor_mode = AuthUserId && AuthUserId == UserId && location.search.indexOf("sed=1") != -1;
    if (DefaultStyle && !editor_mode) return;
    var profile_for_load = editor_mode ? "work" : "deploy";
    var date = new Date();
    var ajax_reload_time;
    // реактируемые элементы, которые есть или были в DOM
    // для групповых: id_attr - массив id.
    var elems_cache = new Array();
    var next_zindex = 3;
    var external_loaded = false;
    var last_cache_cnt = 0;
    var after_load = null;
    
    //var 
    function mesh()
    {	
 	    //if (!index) index = 0;
	    //if ($(obj).hasClass("sed_user") && $(obj).attr("id")) {
		    //if (!editing) {
		    for (var id1 in elems_cache) {
		        if (id1 == "remove" || id1 == "indexOf") continue; // ExtJS Array extensions
		        //if (id1=="tab_inner") 
		        var index = elems_cache[id1].ind;
		        var group = elems_cache[id1].grp;
		        var $obj = get_editable(id1);
		        if (!$obj) continue;
		        //alert(id1 + "  " + $obj);
		        var ofs = $obj.offset();
		        if (!ofs) {
		            continue;
		            //alert("Internal Error: can't get offset, id=" + id1);
		        }
			    var ctrl_left = ofs.left-2;
			    var ctrl_top = ofs.top-2;
			    var ctrl_width = $obj.width();
			    var ctrl_height = $obj.height();
			    var rand = Math.random();
			    var $bq = $("#borderid").clone().prependTo("#sub_bord_cont")
				    .attr("id", "borderid_" + rand)
				    .attr("control_id", id1);
				if (group) $bq.attr("group", "1");
			    $bq.css({
				    "left" : ctrl_left,
				    "top" : ctrl_top,
				    "width" : ctrl_width,
				    "height" : ctrl_height,
				    "border" : "dashed 2px green",
				    "z-index" : index
			    }).show();
		    }
		    //}
		//    index += 1;
	    //}
	    //$(obj).children().each( function() { mesh(this, index); } )
    }
    function my_serialize(obj)
    {
	    var arr = new Array();
	    for (var i in obj) {
		    arr.push(escape(i + ":'" + obj[i] + "'"));
	    }
	    return "{" + arr.join(",") + "}";
    }
    function save_json(obj, profile)
    {    
        var stl = "{}";

        var style_obj = obj;
        var props = new Object();
        props.backgroundColor = style_obj.style.backgroundColor;
        props.color = style_obj.style.color;
        props.fontSize = style_obj.style.fontSize;
        props.fontWeight = style_obj.style.fontWeight;
        props.fontStyle = style_obj.style.fontStyle;
        stl = my_serialize(props);
        
        var $editable = $(obj);//.parent();
        var id = $editable.attr("id");
        var group_str = "&group=";
        if ($editable.attr("gid")) {
            id = $editable.attr("gid");
            group_str += 1; 
        }
        else {
            group_str += 0;         
        }
        var profile_str = "";
        if (profile) {
            profile_str = "&profile=" + profile;
        }
        var qstring = "/style/style.fexec?html_id=" + id + "&style=" + stl + group_str + profile_str
	    $.getScript(qstring);
    }
    
    function save_current(profile) 
    {
        get_editable().each(function() {
            //if ($(this).hasClass("sed_user")) {
                save_json(this, profile);         
            //}
        });
    }
    
    function load_json(profile)
    {
        var profile_param;
        if (profile) {
            profile_param = "&profile=" + profile;
        }
	    $.getScript("/style/style.fexec?user_id=" + UserId + "&get_json=1" + profile_param);
    }

    /*function deploy_profile()
    {
	    $.getScript("/style/style.exec?deploy=1");
    }
    
    function reset_profile()
    {
	    $.getScript("/style/style.exec?reset=1");
    }*/

    function assign_css($target, $source)
    {
	    $target.css("background-color", $source.css("background-color"));
	    $target.css("color", $source.css("color"));
	    $target.css("font-size", $source.css("font-size"));
	    $target.css("font-weight", $source.css("font-weight"));
	    $target.css("font-style", $source.css("font-style"));
    }	
    
    // get_editable() returns all editable elements
    function get_editable(mesh_elem_or_id)
    {
        var is_group = false;
        if (!mesh_elem_or_id) return $("div[editable]");
        var selector = "";
        var control_id = (mesh_elem_or_id.attr && mesh_elem_or_id.attr("control_id")) ?
            mesh_elem_or_id.attr("control_id") : mesh_elem_or_id;
        if (mesh_elem_or_id.attr && mesh_elem_or_id.attr("group")) {
            is_group = mesh_elem_or_id.attr("group");
        }
        else if (!mesh_elem_or_id.attr) {
            is_group = elems_cache[mesh_elem_or_id].grp;        
        }
        selector = "#" + control_id;
        if (is_group) {
            var ar = new Array();
            var ids = elems_cache[control_id].id_attr;
            var sz = ids.length;
            for (var i = 0; i < sz; ++i) {
                ar.push("#" + ids[i]);
            }
            selector = ar.join(",");
        } 
            //("div[editable][gid=" + control_id + "]") ;
//var d1 = new Date();
        var $res = $(selector);
//var d2 = new Date();
//alert(mesh_elem_or_id + ":" + (d2.getTime() - d1.getTime()));        
        if (!$res.size()) return null;
        return $res;    
    }
    
    function recalc_mesh() 
    {
        $("#sub_bord_cont > div.border").each( function() {
            var $this = $(this);
	        var $obj = get_editable($this);
            
            var ofs = $obj.offset();
	        var ctrl_top = ofs.top;
	        var ctrl_left = ofs.left;
	        var ctrl_width = $obj.width();
	        var ctrl_height = $obj.height();
    	    
            $this.css({
                "top" : ctrl_top,
                "left" : ctrl_left,
		        "width" : ctrl_width,
		        "height" : ctrl_height
	        });
        });
    }

    function bg_transp_click(check) 
    {
        if (check.checked) {
            //$("#colorpicker_bg").css("visibility", "hidden");
            //$("#color_bg").css("visibility", "hidden");
            settings_apply('bgtransp');
        }
        else {
            //$("#colorpicker_bg").css("visibility", "visible");
            //$("#color_bg").css("visibility", "visible");  
            settings_apply('bgcolor');
        }
    }

    function load_bg_checkbox_state() 
    {
        var $tester_elem = $("#tester");
        var c = $tester_elem.css("background-color");
        if (c == 'transparent') {
            $("#bg_transp").attr("checked", "checked");
            bg_transp_click($("#bg_transp").get(0));
        }
        else {
            $("#bg_transp").removeAttr("checked");
            bg_transp_click($("#bg_transp").get(0));
            var bgcol = new RGBColor(c);
            $.farbtastic('#colorpicker_bg').setColor(bgcol.toHex()); 
        }	    
    }

    function init_switch_ui() {
        //alert("11");
        if (!ui_switch_inited) {
       	    Ext.QuickTips.init();

            ext_tb_sw = new Ext.Toolbar({
                items: [
                    {
                        id: 'ext_editor_sw',
                        //icon: '/style/images/save.gif', 
                        text: 'ВКЛ',
                        //cls: 'x-btn-icon',
                        tooltip: 'Включить/Выключить редактор',
                        enableToggle: true, 
                        pressed: editor_mode,                       
                        handler: function(obj) {                            
                            if (obj.pressed) {
                                enable_editor("work");//
                                //load_json("work");
                            }
                            else {
                                disable_editor("deploy");
                                //load_json("deploy");
                            }
                        }
                    },
                    '-',
                    {
                        id: 'ext_editor_work_save',
                        //icon: '/style/images/save.gif', 
                        text: 'Публиковать',
                        //cls: 'x-btn-icon',
                        tooltip: 'Опубликовать текущие настройки',
                        handler: function(obj) {
                            save_current("deploy");
                            just_deployed = true;
                        }
                    },
                    /*{
                        id: 'ext_editor_work_reset',
                        //icon: '/style/images/save.gif', 
                        text: 'В черновик',
                        //cls: 'x-btn-icon',
                        tooltip: 'Сохранить текущие настройки в черновик',
                        handler: function(obj) {
                            save_current("work");
                        }
                    },
                    '-',*/
                    {
                        text: 'Загрузить',
                        menu: {
                            items: [
                                /*{
                                    id: 'ext_editor_work_load',
                                    //icon: '/style/images/save.gif', 
                                    style: 'text-align:left',
                                    text: 'Черновик',
                                    //cls: 'x-btn-icon',
                                    tooltip: 'Загрузить черновик',
                                    handler: function(obj) {
                                        load_json("work");
                                    }
                                },*/
                                {
                                    id: 'ext_editor_deploy_load',
                                    //icon: '/style/images/save.gif', 
                                    style: 'text-align:left',
                                    text: 'Опубликованное&nbsp;',
                                    //cls: 'x-btn-icon',
                                    tooltip: 'Загрузить опубликованные настройки',
                                    handler: function(obj) {
                                        for (var i in default_css) {	                            
                                            var ed = get_editable(i);
                                            if (!ed) continue;
                                            ed.css(default_css[i]); 
                                            ed.children().css(default_css[i]);
                                        }                 
                                        after_load = function() {
                                            save_current("work");
                                            recalc_mesh();
                                        }          
                                        load_json("deploy");
                                        just_deployed = false;                                        
                                    }
                                },
                                {
                                    id: 'ext_editor_default_load',
                                    //icon: '/style/images/save.gif', 
                                    style: 'text-align:left',
                                    text: 'По умолчанию',
                                    //cls: 'x-btn-icon',
                                    tooltip: 'Загрузить настройки по умолчанию',
                                    handler: function(obj) {
                                        for (var i in default_css) {
                                            var ed = get_editable(i);
                                            if (!ed) continue;
                                            ed.css(default_css[i]); 
                                            ed.children().css(default_css[i]);
                                        }   
                                        recalc_mesh();      
                                        save_current("work");                   
                                    }
                                }
                            ]                        
                        }
                    }
                ]
            });
	        btns_sw = ext_tb_sw.items.map;            
            ext_tb_sw.render("stb_id");

            ext_win_switch = new Ext.Window({
                //tbar: ext_tb_sw,
                el: 'switchid',
                //bbar: ext_tb_sw,
                plain: true,
                border: false,
                width: 250,
                autoHeight: true,
                //height: 25,
                closable: true,
                closeAction:'hide',
                resizable: false,
                draggable: true,
                pageX: 20,
                pageY: 20,
	            listeners: {
	    	        'beforehide': function() { 
	    	            if (ext_win.isVisible()) ext_win.hide();
	    	            disable_editor("deploy");	    	            
	    	        }
	            }                
            });	
	        //if (ext_win_switch) {
                ext_win_switch.show();  	    
	        //}            	
       }
        ui_switch_inited = true;    
    }
    
    function init_editor_ui(data) {
        if (!ui_inited) {
            $("body").append("<div style='width:0px;height:0px' id='html_helper'></div>");  
            if (!data) {
                $("#html_helper").load("/style/tpl/html_helper.html", {'dump': 1}, function() {
                    init_editor_ui(1);
                }); 
                return;            
            } 
        	
            combo = new Ext.form.ComboBox({
                id: 'ext_tsize',
                store: new Ext.data.SimpleStore({
                    fields: ['name', 'value'],
                    data : [
                        ['12px', '12px'],
                        ['14px', '14px'],
                        ['16px', '16px'],
                        ['18px', '18px'],
                        ['20px', '20px'],
                        ['22px', '22px'],
                        ['24px', '24px']
                    ]
                }),
                displayField:'name',
                typeAhead: true,
                mode: 'local',
                emptyText:'Размер текста',
                selectOnFocus:true,
                triggerAction: 'all',
                width:110,
                listeners: {
                    "select": function(cmb) {
                        settings_apply('tsize', cmb.getValue());
                    }
                }
            });
                     
             ext_txt_menu = new Ext.menu.Menu({        
                items: [
                    {
                        canActivate: false,	
                        hideOnClick: false,		                
                        el: 'farb_txt'
                    }
                ]
            });       
            $("#close_txt_col")
                .bind("click", function() { ext_txt_menu.hide() })
                .bind("mouseenter", function() { $(this).addClass("x-tool-close-over") })
                .bind("mouseleave", function() { $(this).removeClass("x-tool-close-over") });

            ext_bg_menu = new Ext.menu.Menu({        
                items: [
                    {
                        canActivate: false,	
                        hideOnClick: false,		                
                        el: 'farb_bg'
                    }
                ],
	            listeners: {
	    	        'show': load_bg_checkbox_state
	            }                                
            });             
            $("#close_bg_col")
                .bind("click", function() { ext_bg_menu.hide() })
                .bind("mouseenter", function() { $(this).addClass("x-tool-close-over") })
                .bind("mouseleave", function() { $(this).removeClass("x-tool-close-over") });

            ext_tb = new Ext.Toolbar({
                items: [
                    {
                        id: 'ext_save',
                        icon: '/style/images/save.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'Сохранить',
                        handler: settings_save
                    },
                    '-',
                    {
                        id: 'ext_bold',
                        icon: '/style/images/bold.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'Полужирный',
                        enableToggle: true,
                        handler: function(bt) { settings_apply('bold', bt.pressed); }
                    },
                    {
                        id: 'ext_italic',
                        icon: '/style/images/italic.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'Курсив',
                        enableToggle: true,
                        handler: function(bt) { settings_apply('italic', bt.pressed); }
                    },   
                    '-',
                    combo,   
                    '-',
                    {
                        id: 'ext_tcolor',
                        icon: '/style/images/textcolor.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'Цвет текста',
                        //xtype: 'tbsplit',
                        menu: ext_txt_menu
                    },
                    {
                        id: 'ext_bcolor',
                        icon: '/style/images/bgcolor.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'Цвет фона',
                        //xtype: 'tbsplit',
                        menu: ext_bg_menu
                    },
                    '-',
                    {
                        id: 'ext_def',
                        icon: '/style/images/default.gif', 
                        cls: 'x-btn-icon',
                        tooltip: 'По умолчанию',
                        //xtype: 'tbsplit',
                        handler: function(bt) 
                        {                             
                            var cid = $last_border.attr("control_id");
                            /*var $edit_elem = get_editable($last_border);
                            $edit_elem.css(default_css[cid]);
                            $edit_elem.children().css(default_css[cid]);
                            settings_load($edit_elem.eq(0));*/
                            var $tester_elem = $("#tester");
                            var $edit_elem = $(document.createElement("div"));
                            $edit_elem.css(default_css[cid]);
                            settings_load($edit_elem);
                        }

                    } 
                ]                
            });        

            ext_win = new Ext.Window({
                tbar: ext_tb,
                el: 'popupid',
                width: 320,
                autoHeight: true,
                //height: 200,
                closable: true,
                closeAction:'hide',
                resizable: false,
                constrain: true,
	            listeners: {
	    	        'beforehide': function() { 
	    	            editing = false;		
	    	            if ($last_border) $last_border.trigger("mouseout");
	    	        }
	            }
            });		
                        
	        btns = ext_tb.items.map;

            $(window).resize(function(){
                recalc_mesh();
            });       
            
            //в ie дергается без этого 
            $("#farb_txt").bind("mouseover mouseout", function(e) { return e.stopPropagation(); });
            $("#farb_bg").bind("mouseover mouseout", function(e) { return e.stopPropagation(); });

            var color_input_edit = false;
            $('#colorpicker_txt').farbtastic(function() { 
                settings_apply('color'); 
                if (!color_input_edit) {
                    $('#color_txt').attr("value", $.farbtastic('#colorpicker_txt').color);
                }
            }); 
            $('#colorpicker_bg').farbtastic(function() { 
                $("#bg_transp").removeAttr("checked");
                bg_transp_click($("#bg_transp").get(0));            
                settings_apply('bgcolor'); 
                if (!color_input_edit) {
                    $('#color_bg').attr("value", $.farbtastic('#colorpicker_bg').color);
                }
            }); 
            var c;
            $("#color_txt").bind("keyup change", function() {
                c = $("#color_txt").attr("value");
                c = refine_color(c);
                if (c && c.length) {
                    color_input_edit = true;
                    $.farbtastic('#colorpicker_txt').setColor(c); 
                    color_input_edit = false;
                }
            });
            $("#color_bg").bind("keyup change", function() {
                $("#bg_transp").removeAttr("checked");
                bg_transp_click($("#bg_transp").get(0));            
                c = $("#color_bg").attr("value");
                c = refine_color(c);
                if (c && c.length) {
                    color_input_edit = true;
                    $.farbtastic('#colorpicker_bg').setColor(c); 
                    color_input_edit = false;
                }
            });                      
        }
        ui_inited = true;
        mesh_and_bind();         
    } 

    function on_edit_down(event) { 
        $("#sub_bord_cont div.border").unbind("click");
	    var this_elem = this;
        function after_show() { 
	        editing = false;
	        if($last_border) $last_border.trigger("mouseout");
	        $(this_elem).trigger("mouseover");
	        editing = true;
		    settings_load(get_editable($last_border));   
		    $("#sub_bord_cont div.border").bind("click", on_edit_down);     
        }

        /*if (ext_win_count) {
		    $("#sub_bord_cont div.border").bind("mousedown", on_edit_down);     
            return; 	            
        }*/
	    var last_bord = $last_border.get(0);
	    if (ext_win.isVisible() && last_bord != this_elem) {
	        //ext_win.hide();
	        //setTimeout(function() {ext_win.show();}, 300);
	        //ext_win_count++;
	        ext_win.hide(last_bord, function() { 
	            setTimeout(function() {
	                ext_win.show(this_elem, function() { 
	                   // ext_win_count--; 
	                    setTimeout(function() {
	                        after_show();
	                        //
	                    }, 10);    	            
	                }); 
	            }, 10);
	        });
	    }
	    else if (!ext_win.isVisible()) {
	        ext_win.show(this_elem, function() {
	            setTimeout(after_show, 10);
	        });
	    }  
	    else {
            $("#sub_bord_cont div.border").bind("click", on_edit_down); 
	    }
    }   
    
    function mesh_and_bind()
    {    
	    mesh(); 
	    meshed = true;
	        		
	    $("#sub_bord_cont div.border")
		    .bind("mouseover", function(event) { 
			    if (editing) return false;
			    var $this = $(this);
			    $last_border = $this;
			    $this.css({ "border": "dashed 2px aqua" });
			    return false;
		    })
		    .bind("mouseout", function(event) { 
			    if (editing) return false;
			    $(this).css({ "border": "dashed 2px green" });
			    return false;
		    })    	
	        .bind("click", on_edit_down);    
    }
    
    function is_bold(fontWeight) {
		return (fontWeight == "bold" || /^\d+$/.test(fontWeight) && fontWeight > 400);
    }
    
    function settings_load($edit_elem) 
    {
        $("#cbtest").attr("checked", "checked");

	    var $tester_elem = $("#tester");
	    assign_css($tester_elem, $edit_elem);
		
	    btns.ext_bold.toggle(is_bold($tester_elem.css("font-weight")));
	    btns.ext_italic.toggle($tester_elem.css("font-style") == "italic");
	    combo.setValue($tester_elem.css("font-size"));
	    var txtcol = new RGBColor($tester_elem.css("color"));
	    $.farbtastic('#colorpicker_txt').setColor(txtcol.toHex()); 
        load_bg_checkbox_state();		    
    }
    
    function pre_mesh() 
    {
	    init_editor_ui();	    
    }

    function settings_apply(id, extra)
    {
        var $edit_elem = $("#tester");
        switch (id) {
        case 'color':
            var cl = $.farbtastic('#colorpicker_txt').color;
            $edit_elem.css("color", cl);
            //$('#color_txt').attr("value", cl);
            break;
        case 'bgcolor':
            var cl = $.farbtastic('#colorpicker_bg').color;
            $edit_elem.css("background-color", cl);
            //$('#color_bg').attr("value", cl);
            break;
        case 'bgtransp':
            $edit_elem.css("background-color", "transparent");
            break;
        case 'bold':
            $edit_elem.css("font-weight", extra ? "bold" : "normal");
            break;
        case 'italic':
            $edit_elem.css("font-style", extra ? "italic" : "normal");
            break;
        case 'tsize':
            $edit_elem.css("font-size", extra);
            break;
        }
    }

    function settings_save() {
	    //ext_win.hide($last_border.get(0));
	    //editing = false;	
	    //$last_border.trigger("mouseout");
	    var cid = $last_border.attr("control_id");
	    var $edit_elem = get_editable($last_border);//$("#" + cid);
        if (!default_css[cid]) {
            default_css[cid] = new Object()
            default_css[cid].backgroundColor = $edit_elem.css("background-color");
            default_css[cid].color = $edit_elem.css("color");
            default_css[cid].fontSize = $edit_elem.css("font-size");
            default_css[cid].fontWeight = $edit_elem.css("font-weight");
            default_css[cid].fontStyle = $edit_elem.css("font-style");
        }

        var bgcol = $("#bg_transp").get(0).checked ? "transparent" : $.farbtastic('#colorpicker_bg').color;
        var txtcol = $.farbtastic('#colorpicker_txt').color;
        var fsize = combo.getValue();
        var bld = btns.ext_bold.pressed ? "bold" : "normal";
        var it = btns.ext_italic.pressed ? "italic" : "normal";
	    $edit_elem.css("background-color", bgcol);
	    $edit_elem.css("color", txtcol);
	    $edit_elem.css("font-size", fsize);
	    $edit_elem.css("font-weight", bld);
	    $edit_elem.css("font-style", it);
	    $edit_elem.children().css("background-color", bgcol);
	    $edit_elem.children().css("color", txtcol);
	    $edit_elem.children().css("font-size", fsize);
	    $edit_elem.children().css("font-weight", bld);
	    $edit_elem.children().css("font-style", it);
	    save_json($edit_elem.get(0));
	    recalc_mesh();
    }
    
    function cache($el) { return editor_mode ? "w" + $el.width() + "h" + $el.height() : "1"; }
    
    function proc_new_editable() {
        //if (editing) return false;
        var new_elems_found = false;
        var i = 0;
        //var d1 = new Date();
        var ids = "";
        $("div[editable]").each(function() {//:not([cached])
            //$(this).prepend($("<div style='width:0;height:0'></div>"));//
            var $el = $(this);
            var cache_str = cache($el);
            var cached = $el.attr("cached");
            var id_attr = "gid_" + ++last_cache_cnt;
            var ident = null;
            var group = false;
            if ($el.attr("gid")) {
                ident = $el.attr("gid");
                if ($el.attr("id")) 
                    id_attr = $el.attr("id");
                else 
                   $el.attr("id", id_attr);                                   
                group = true;
            }
            else {
                ident = $el.attr("id");
            }
            if (!elems_cache[ident]) new_elems_found = true;
            if (cached && !new_elems_found && !default_css[ident]) {
                return true; // еще этот элемент ни разу не настраивали
            }
            if (!cached) $el.attr("cached", "1");
            if (!cached || (!group && cache_str != cached) || (group && id_attr == elems_cache[ident].id_attr[0] && cache_str != cached)) {
                if (!ident) {
                    alert("Internal Error: no id neither gid is specified for editable element");
                }
                if (ident && !elems_cache[ident]) {
                    //alert
                    (elems_cache[ident]);
                    elems_cache[ident] = { grp: group, ind: i + next_zindex };
                }
                if (group) {
                    if (!elems_cache[ident].id_attr) elems_cache[ident].id_attr = new Array();     
                    elems_cache[ident].id_attr.push(id_attr);  
                }
                assign_css($el, $el.children().eq(0));
                
//                if (ident=="glob_bg" || ident=="sed_content" || ident=="desc_album_desc") 
//                    console.info(ident + "  new:" + cache_str + " old:" + cached);
                //ids += "'" + ident + "' ";       
                i++;     
                                    
                //$el.attr("cached", cache($el));
                //$el.addClass("sed_" + ident);
            }
        });
        next_zindex += i;
        //if (i) alert(i + ":  " + ids);
//        if (i) console.warn(i+ " ids=" + ids);
        //var d2 = new Date();
        //if (i) 
        //alert(d2.getTime() - d1.getTime() );
        //alert(ids);
        if (new_elems_found) if (ext_win && ext_win.isVisible()) ext_win.hide();
        return i;    
    }
    
    function includes()
    {
        if (!external_loaded) {
            $("body").append("<div id='switchid' class='x-hidden' style='text-align:left'><div class='x-window-header'>Редактор</div><div class='x-window-body'><div id='stb_id'></div></div></div>");
            $.requireCss('/style/script/farbtastic/farbtastic.css');
            $.requireCss('/style/script/extjs/resources/css/ext-all.css');
            $.requireJs('/style/script/edit.js', edit_js_loaded);   
        }
    }
    
    function bind_ajax_end() 
    {
        proc_new_editable();
        //========
        $(document).bind("ajax_end", function() {
            $(document).ready( function() {
                if (proc_new_editable()) {
                    style_editor.reload();
                }            
            })
        });
    } 
    
    if (editor_mode) {
        enable_editor();
    }
    else {
        $(document).ready(function() {
           bind_ajax_end();
           load_json("deploy");
        });         
    }
    //$.requireJs('/style/script/rgbcolor.js', all_loaded); 
    //$.requireJs('/style/script/extjs/ext-my.js', all_loaded); 
    
    function refine_color(c) {
        var refine_c = new RGBColor(c);
        return refine_c.toHex();
    }
    
    //$(document).ready(
    function edit_js_loaded() 
    {
        $(document).ready(function() {
            external_loaded = true;
            bind_ajax_end();
            init_switch_ui();
            load_json(profile_for_load);
 /*           $("#tab_1 .tab").bind("click", function(e) { 
                unmesh();
            });  */
        });  
    }//);

    function unmesh()
    {
        $("#sub_bord_cont").empty();
        meshed = false;
    } 

    function enable_editor(profile)
    {
        if (!profile) {
            profile = "work";
        }
        profile_for_load = profile;      
        //if (ext_win_switch) ext_win_switch.show();
        if (!external_loaded) {
//                profile_for_load = editor_mode ? "work" : "deploy";
            includes();
        }
        else {
            ext_win_switch.show();
            btns_sw.ext_editor_sw.toggle(true);
            load_json(profile);
        }
        editor_mode = true;
    }
    function disable_editor(profile)
    {
        if (!profile) {
            profile = "deploy";
        }
        if (ext_win.isVisible()) ext_win.hide();
        for (var i in default_css) {
            var ed = get_editable(i);
            if (!ed) continue;                            
            ed.css(default_css[i]); 
            ed.children().css(default_css[i]); 
        }         
                          
        editor_mode = false;
        editing = false;
        ext_win_count = 0;
        unmesh();
        load_json(profile);                
        profile_for_load = profile;      
    }
            
    var _public = {
        enable_editor: function()
        {
            enable_editor();
        },
        disable_editor: function()
        {
            disable_editor();
        },
        load_callback: function(obj)
        {
            var ar = new Array();
	        for (var i in obj) {
	            //* ???????????????
	            if (!elems_cache[i]) continue;
	            var edit = get_editable(i);
	            if (!edit) continue; 
	            if (!default_css[i]) {
	                default_css[i] = new Object();
	                for (var j in obj[i].style) {
	                    var st = edit.children().eq(0).css(j);
	                    if (j == "fontWeight") {
	                        if (/^\d+$/.test(st) && st > 400) st = "bold";	      
	                        else st = "normal";             
	                    }
	                    default_css[i][j] = st;
	                }
	            }
	            edit.css(obj[i].style);
	            edit.children().css(obj[i].style);
	            edit.attr("cached", "1");
	            
	            if (editor_mode) {
	                var gfirst = edit.eq(0);
	                //if (gfirst.attr("gid")) {
	                    ar.push(gfirst);
	                //}	            
	            }      	            
	        }	

	        if (editor_mode && !meshed) {
	            pre_mesh();
	        }
	        if (editor_mode) {
                $.each(ar, function() { 
                    var $el = this; 
                    var i = $el.attr("gid");
    //    if (i=="glob_bg" || i=="sed_content" || i=="desc_album_desc") 
    //        console.info("[a]" + i + "  new:" + cache($el) + " old:" + $el.attr("cached"));
                    $el.attr("cached", cache($el)) ;
                    
                });	            
	        }
            if (after_load) { after_load(); after_load = null; }                     	        
        },
        bg_transparent: function(check)
        {
	        return bg_transp_click(check);
        }, 
        reload: function()
        {
            //if (ext_win && ext_win.isVisible()) ext_win.hide();
            unmesh();
            load_json(profile_for_load);
        },
        load_work: function()
        {
            load_json("work");
        }
    };
//alert($("b:contains(vladimir_mp3):first").css("font-weight"));
    return _public;

}();
