
function copy_obj(o) {
    var c = new Object();
    
    for (var e in o) {
        c[e] = o[e];
    }
    return c;
}




function set_tree_cofiguration(settings){
    
    var defaults = jQuery.tree.defaults;
    
    defaults.rules.multitree = 'all';
    
//    defaults.callback.onload = function(tree){
//        tree.open_all();
//    }
    
    
    var onrename = function(node, tree, rollback){
        params = {
            node_id : $(node).attr('id').match(/node-(\d+)/)[1],
            new_label : tree.get_text(node)
        };
        $.get(settings.rename_link, params);    
    }
    
    
    
    if (settings.bind_rename){
        defaults.callback.onrename = onrename;
    };
    
	defaults.callback.onload = function(tree) {
		tree.open_all();
		
		// apply qtip
		$('span.jsmtel_add').qtip({content: 'Dodaj'});
		$('span.jsmtel_edit').qtip({content: 'Edytuj'});
		$('span.jsmtel_del').qtip({content: 'Usuń'});
	}
    
    defaults.callback.onselect = function(node, tree){
//        var tree = $.tree.reference('.js_simple_tree');
//        $(tree).each(function(){
//            
//            $(this).deselect_branch($(this).selected());
//        });
//        return true;
    }
    
    defaults.callback.beforemove = function(node, ref_node, type, tree){
        return !( ($(ref_node).attr('rel') == 'root') && (type != 'inside'));
    };
    
    var onmove = function(node, ref_node, type, tree, rollback){
        data = {
            insert_type : type,
            menu_node : node.id.match(/node-(\d+)/)[1],
            menu_node_ref : ref_node.id.match(/node-(\d+)/)[1]
        }
        
        $.get(settings.move_link, data);
    };
    if (settings.bind_move){
        defaults.callback.onmove = onmove;  
    }
    
    
    var ondelete = function(node, tree, rollback){
        data = {
            node_id: node.id.match(/node-(\d+)/)[1]
        }
        $.get(settings.delete_link, data);
    }
    if (settings.bind_delete){
        defaults.callback.ondelete = ondelete;
    }
	
	defaults.ui.theme_name = "classic";
	// defaults.ui.theme_path = "/site_media/external/jstree/themes/";
	
    
    defaults.types.root = {
        draggable : false
    }
    
    defaults.types.contact = {
        icon : {
            image : "/site_media/admin/img/treeview/formularz_kontaktowy2.png" 
        }
    }
    
    defaults.types.article = {
        icon : {
            image : "/site_media/admin/img/treeview/artykuly.png"
        }
    }
    
    defaults.types.articlecategory = {
        icon : {
            image : "/site_media/admin/img/treeview/sekcja_artykulow.png" 
        }
    }
    
    defaults.types.gallery = {
        icon : {
            image : "/site_media/admin/img/treeview/galeria.png"
        }
    }
    
    defaults.types.news = {
        icon : {
            image : "/site_media/admin/img/treeview/nowosci.png" 
        }
    } 
    
    defaults.types.newscategory = {
        icon : {
            image : "/site_media/admin/img/treeview/sekcje_nowosci.png" 
        }
    } 
}


$.fn.menu_tree = function(options){
    var defaults = {
        bind_rename : false,
        bind_move : true,
        bind_delete : true
    }

    var settings = $.extend({}, defaults, options);
    
    
    set_tree_cofiguration(settings);
    
    var new_tree = $(this).tree();
    
    var menu_node = null;
    
    function bind_node_events(){
       $(".add_node_inside").live('click', add_node_event);
       $('.edit_node').live('click', edit_node_event);
       $('span.delete_node').live('click', delete_node_event);
       $.tree.focused().lock(false);
    };

    function unbind_node_events(){
       $(".add_node_inside").die('click', add_node_event);
       $('.edit_node').die('click', edit_node_event);
       $('span.delete_node').die('click', delete_node_event);
       $.tree.focused().lock(true);
    };
    
    
// dodawanie pozycji do menu
            
    var menu_add_form = $("#add_node_overlay").overlay({
        api : true,
        onBeforeLoad : function(){
            unbind_node_events();
            request_data = {target_node_id : $(menu_node).attr('id').match(/node-(\d+)/)[1]};
            $.getJSON(settings.add_link, request_data, function(data){
                $("#add_node_overlay .wrap").html(data.add_node_content);
                $("#menu-add").bind('submit', add_node_submit);
            });
        },
        onClose : function(){
            bind_node_events();
        }
    });
  
    var add_node_event = function(){
        menu_node = $(this).parents('li:first');
        selected_tree = $.tree.reference(menu_node);
        selected_tree.focus();
        
        menu_add_form.load();
    };
    
    var add_node_submit = function(){
        post_data  = $(this).serialize();
        post_data += "&target_node_id=" + $(menu_node).attr('id').match(/node-(\d+)/)[1];
        $.getJSON(settings.add_link, post_data, function(data){
            if(data.success){
                var tree = $.tree.focused();
                tree.lock(false);
                var new_node = {
                    attributes: { id : "node-" + data.node_id, rel : "default"},
                    data: data.label 
                }
                var created_node = tree.create(new_node, menu_node, 'inside');
                
                var extra_content = '';
                extra_content += '<div class="jsmte_links">';
                extra_content += '  <span class="jsmtel_add add_node_inside" rel="#overlay"></span>';
                extra_content += '  <span class="jsmtel_edit edit_node"></span>';              
                extra_content += '  <span class="jsmtel_del delete_node"></span>';
                extra_content += '  <div class="clear"><!-- IE6 FIX --></div>';
                extra_content += '</div>';
                extra_content += '<div class="clear"><!-- IE6 FIX --></div>';
                
                
                $('a', tree.get_node(created_node)).after(extra_content);
                menu_add_form.close();
//                tree.rename(created_node, '<span><span>' + data.label + '</span></span>');
                $('a', created_node).html('<ins>&nbsp;</ins>&nbsp;<span><span>' + data.label + '</span></span>&nbsp;');
                $('a', created_node).addClass('jsmt_node');
                tree.select_branch(created_node);
				
				// apply qtip
				$('span.jsmtel_add').qtip({content: 'Dodaj'});
				$('span.jsmtel_edit').qtip({content: 'Edytuj'});
				$('span.jsmtel_del').qtip({content: 'Usuń'});
            } else {
                $("#add_node_overlay .wrap").html(data.add_node_content);
                $("#menu-add").bind('submit', add_node_submit);
            }
            return false;
        });
        return false;
    };
    
    
// edycja pozycji w menu
    var menu_edit_form = $("#edit_node_overlay").overlay({
        api : true,
        onBeforeLoad : function(){
            unbind_node_events();
            request_data = {node_id : $(menu_node).attr('id').match(/node-(\d+)/)[1]};
            request_data['node_type'] = $(menu_node).attr('rel');
            $.getJSON(settings.edit_link, request_data,  function(data){
                $("#edit_node_overlay .wrap").html(data.add_node_content);
                $("#menu-edit").bind('submit', edit_node_submit);
            });
        },
        onClose : function(){
            bind_node_events();
        }
    });
    
    var edit_node_event = function(){
        menu_node = $(this).parents('li:first');
        selected_tree = $.tree.reference(menu_node);
        selected_tree.focus();
        menu_edit_form.load();
    };
    
    
    var edit_node_submit = function(){
        post_data  = $(this).serialize();
        post_data += "&node_id=" + $(menu_node).attr('id').match(/node-(\d+)/)[1];
        post_data += '&node_type=' + $(menu_node).attr('rel');
        $.getJSON(settings.edit_link, post_data, function(data){
            if(data.success){
                tree = $.tree.focused();
                tree.lock(false);
                tree.rename(menu_node, data.label);
                $('a:first', menu_node).html('<ins>&nbsp;</ins>&nbsp;<span><span>' + data.label + '</span></span>&nbsp;');
                menu_edit_form.close();
            }else{
                $("#edit_node_overlay .wrap").html(data.add_node_content);
                $("#menu-edit").bind('submit', edit_node_submit);
            }
        });
        return false;
    };
// usuwanie pozycji z menu
    var menu_delete_form = $("#delete_node_overlay").overlay({
        api : true,
        onBeforeLoad : function(){
            unbind_node_events();
        },
        onClose : function(){
            bind_node_events();
        }
    });
    
    $("#delete_node_overlay a.cancel").live('click', function(){
        var tree = $.tree.focused();
        tree.lock(false);
        menu_delete_form.close();
    });
    
    $("#delete_node_overlay a.confirm").live('click', function(){
        selected_tree = $.tree.reference(menu_node);
        selected_tree.lock(false);
        selected_tree.focus();
        selected_tree.remove(menu_node);
        menu_delete_form.close();
    });
    
    var delete_node_event = function(){
        menu_node = $(this).parents('li:first');
        menu_delete_form.load();
    };
    
    
// usuwanie pozycji z menu
//    var delete_node_event = function(){
//        deleted_node = $(this).parents('li:first');
//        selected_tree = $.tree.reference(deleted_node);
//        selected_tree.focus();
//        selected_tree.remove(deleted_node);
//    };
    
    bind_node_events();
};


$.fn.menu_tree_apps = function(options){
    var defaults = {
        bind_rename : true,
        bind_move : true
    }

    var settings = $.extend({}, defaults, options);
    
    
    set_tree_cofiguration(settings);
    
    $(this).tree();
            
    var add_link = null;
    
    var add_to_tree = $('.overlay').overlay({
        api : true,
        onBeforeLoad : function(){
            $('a.js_add_to_menu').die();
            $('.wrap').load($(add_link).attr('href'), function(){
                $('.js_simple_tree').tree();
            });
        },
        onClose : function(){
            $('a.js_add_to_menu').live('click', showOverlay);  
        }
    });
    
    function showOverlay(){
        add_link = this;
        add_to_tree.load();
        return false;
    };
    
    $('a.js_add_to_menu').live('click', showOverlay);
    
    $('a.js_menu_popup_submit').live('click', function(){
        var tree = $.tree.focused();
        var params = '';
		
        var selected_node = tree.selected;
        if (selected_node) {
        
            params += 'selected_node=' + $(selected_node).attr('id').match(/node-(\d+)/)[1];
            
            $.getJSON($(this).attr('href'), params, function(data){
                var new_node = {
                    attributes: {
                        id: "node-" + data.node_id,
                        rel: data.node_type
                    },
                    data: data.label
                }
                var created_node = tree.create(new_node, selected_node, 'inside');
                tree.rename(created_node);
            });
        };
        return false;
    });
    
};
