if (typeof $DomainPicker == "undefined") var $DomainPicker = {

    tree_index: null,
    multiple_select: false,/* indicates if multiple nodes can be selected*/
    user_picker: false,/* indicates if object will display users to select*/
    users_picked : Array(),
    domains_picked : Array(),
    dp_callback: null,
    dp_retname: false,/* indicates if callback receives domain names too.*/
    recips_pick_all:true,/* indicates which action should be displayed on users picker */
    dlg_buttons_tree :
            {
                "Ok": function() {
                    if ($DomainPicker.dp_callback) {
                            $DomainPicker.getElementsPicked($DomainPicker.dp_callback);
                    } else {
                        $(this).dialog("close");
                    }
                }
            },
    dlg_buttons_users :
            {
                "Ok": function() {
                    if ($DomainPicker.dp_callback) {
                            $DomainPicker.getElementsPicked($DomainPicker.dp_callback);
                    } else {
                        $(this).dialog("close");
                    }
                },
                "Back to the Tree View": function() {
                    $DomainPicker.displayDomainsTree();
                }
            },

    set_retname: function() {
        this.dp_retname=true;  
    },
            
    load: function(multiple_select, tree_index, callback,user_picker) {
        this.tree_index = tree_index;
        this.multiple_select = multiple_select;
        this.dp_callback = callback;        
        if(! this.recips_pick_all){
            $("#action").html('Select None');
        }

        if(user_picker){
            this.user_picker = user_picker;
        }else{
            this.user_picker = false;
        }
        //display dialog
        $U.ajaxDialog(
            'domain_picker',
            (user_picker) ? 'Select Users' : 'Domain Picker',
            570,
            function () {
                $DomainPicker.getDomainsTree(0);
            },
            $DomainPicker.dlg_buttons_tree
        );
  	},

    getElementsPicked: function (callback){
        var elements_picked = new Array();
        var retname=this.dp_retname;
        if (this.user_picker){
            for(x in this.users_picked){
                if ( this.users_picked[x].id != -1){
                    elements_picked.push(this.users_picked[x]);
                }
            }
        }else{
            $("#dtree-root").find('li').each(
                function (i) {
                    nnid = $(this).find('a').attr('title');
                    
                    if ($("#a-" + nnid).find('span').hasClass("selectedNode")) {
                        if (retname){
                            nname=$("#a-" + nnid).find('span').html();
                            elem={nnid:nnid, nname:nname};
                            elements_picked.push(elem);
                        }
                        else{
                            elements_picked.push(nnid);
                        }
                            
                    }
                }
            );
        }
        //this.users_picked = Array();
        $U.closeAjaxDialog();
        callback(elements_picked);
    },

    /*
     * request the domains tree
     */
    getDomainsTree: function(nid) {
        $Client.req(
            "DomainsTree",
            "get",
            {domain: nid},
            function (data) {
                $DomainPicker.showDomainsTree(nid, data);
            }
        );
    },

    /*
     * shows the domain tree
     */
    showDomainsTree: function(nid, tree) {
        var root_id;
        if (nid == 0) {
            root_id = this.tree_index;
            if (tree[root_id]['type'] == 'location' && this.user_picker) {
                this.getDomainUsers(root_id);
            } else {
                this.displayDomainsTree();
                $Tree.reset();
                $Tree.tree = tree;
                $Tree.show_empty_branches = true;
                $Tree.node_html_callback = function(nid) {
                    return $DomainPicker.getNodeHtml(nid);
                };
                $Tree.lazy_load_callback = function(e) { $DomainPicker.lazyLoadCallback(e); };
                $("#dtree").empty();
                $Tree.writeTree($("#dtree"), root_id);
                $('#dtree').show();
            }
        } else {
            root_id = nid;
            if ($Tree.tree[root_id]['parent_id'] > 0) {
                root_id = $Tree.tree[root_id]['parent_id'];
            }
            $("#dtree-" + root_id).empty();
            $Tree.appendTree(tree);
            $Tree.writeTree($("#dtree"), root_id);
        }

        // use domains_picked to highlight nodes already selected
        for (var x in this.domains_picked) {
            id = "#dtree-" + root_id + " a#a-" + this.domains_picked[x];
            $(id).find('span').toggleClass("selectedNode");
        }

    },

    lazyLoadCallback: function(e) {
        if ($(e).hasClass('collapsable')) {
            if ($(e).find('ul').html() == '') {
                nid = $(e).find('ul').attr('rel');
                $DomainPicker.getDomainsTree(nid);
            }
        }
    },


    /*
     * writes a tree node
     */
    getNodeHtml: function(nid) {

        var location_icon = " <span class=\"fg-icon-home\" />";
        var user_icon = "";
        if (this.user_picker){
            dname = '&nbsp;<span class="">' + $Tree.tree[nid]['name'] + '</span>';
            user_icon = '<a class="edit-link" onclick="$DomainPicker.getDomainUsers(' + nid + ')" title="Users and groups" name="#"><span class="fg-icon-person"/></a>';
        }else{
            dname = '&nbsp;<a title="' + nid + '" id="a-' + nid + '" name="#" onclick="$DomainPicker.pickerSelectThis(' + nid + ')"><span class="">' + $Tree.tree[nid]['name'] + '</span></a>';
        }
        dname = dname + user_icon;
        if ($Tree.tree[nid]['level'] == 0) {
            return dname;
        } else {
            if ($Tree.tree[nid]['childs'].length > 0) {
                return dname;
            } else {
                if ($Tree.tree[nid]['type'] == 'location') {
                    return location_icon + dname;
                } else {
                    return dname;
                }
            }
        }
    },

    pickerSelectThis: function(nid) {
        //if multiple select is not allowed before selecting a new node
        //deselect previously selected nodes
        if (! this.multiple_select){
            this.domains_picked = Array();
            $("#tree_view_container").find('span').removeClass("selectedNode");
        }
        this.domains_picked.push(nid);
        $("#a-" + nid).find('span').toggleClass("selectedNode");
        add_class = false;
        if ($("#a-" + nid).find('span').hasClass("selectedNode")) add_class = true;
        if ($("#dtree-" + nid)) {
            //only select descendants if multiple select is allowed
            if (this.multiple_select){
                $("#dtree-" + nid).find('li').each(
                    function (i) {
                        nnid = $(this).find('a').attr('title');
                        if (add_class) {
                            $("#a-" + nnid).find('span').addClass("selectedNode");
                        } else {
                            $("#a-" + nnid).find('span').removeClass("selectedNode");
                            //remove id from array
                            tmp = Array();
                            for(var x in this.domains_picked){
                                if (nid != this.domains_picked[x]){
                                     tmp.push(nid);
                                }
                            }
                            this.domains_picked = Array();
                            this.domains_picked = tmp;
                        }
                    }
                );
            }
        }
    },


    /*
     * request the domains tree
     */
    getDomainUsers: function(id) {
        $('#assetlist').html('');
        $("#domain_user_container").show();
        $("#tree_view_container").hide();
        var params = {domain_id: id , filter_me : false};
        $Client.req(
            "DomainsTree",
            "getUsersInfoByDomain",
            params,
            function (data) {
                $DomainPicker.showDomainUsers(data);
            }
        );
    },

    /*
     * shows the domain tree
     */
    showDomainUsers: function(data) {

        if (data.length > 0){
            $('#assetlist').show();
            $('#user_list_empty').hide();
        }else{
            $('#assetlist').hide();
            $('#user_list_empty').show();
        }

        for(x in data) {
            var this_u = data[x];
            var u_id = this_u['id'];
            //check if user was already selected
            var change = false;
            var i = 0;
            while(i< this.users_picked.length && !change){
                if ( this.users_picked[i].id == u_id){
                    change = true;
                }
                i++;
            }

            $Tpls.load('#recipient_template');
            $Tpls.repl('recipient_id', u_id);
            $Tpls.repl('recipient_name',this_u['name']);
            if (change){
                $Tpls.repl('on_click','$DomainPicker.unpick_recipient('+u_id+')');
            }else{
                $Tpls.repl('on_click','$DomainPicker.pick_recipient('+u_id+')');
            }
            $('#assetlist').append($Tpls.get());
            if (change){
                var a_obj = '#recip_'+u_id;
                $(a_obj).addClass("recip_picked");
                //$(a_obj).css("font-weight","bold");
            }
        }
 
        $('#ajax_dlg').dialog('option', 'buttons', $DomainPicker.dlg_buttons_users);

    },

    pick_recipient: function(id){
        var a_obj = '#recip_'+id;
        $(a_obj).addClass("recip_picked");//$(a_obj).css("font-weight","bold");

        $(a_obj).attr('onclick',"");
        $(a_obj).unbind('mouseup');//mouseup
        $(a_obj).mouseup(function(event) { $DomainPicker.unpick_recipient(id); });

        this.users_picked.push({'id':[id],'name':$(a_obj).html()} );
    },

    unpick_recipient: function(id){

        var a_id = 'recip_'+id;
        $("#"+a_id).removeClass("recip_picked");//$("#"+a_id).css("font-weight","normal");
        $("#"+a_id).unbind('mouseup');
        $("#"+a_id).mouseup(function(event) { $DomainPicker.pick_recipient(id); });
        //remove id from recipients list
        var removed = false;
        var i = 0;
        while(i< this.users_picked.length && !removed){
            if (this.users_picked[i].id== id){
                this.users_picked[i].id = -1;
                this.users_picked[i].name = "";
                removed = true;
            }
            i++;
        }
        this.recips_pick_all = true;
        //reset select all link
        $("#action").html('Select All');
    },

    displayDomainsTree: function(){
        $("#domain_user_container").hide();
        $("#tree_view_container").show();
        $('#ajax_dlg').dialog('option', 'buttons', $DomainPicker.dlg_buttons_tree);
    },

    resetUsersPicker: function(){
        this.users_picked = Array();
    },
    
    resetDomainsPicker: function(){
        this.domains_picked = Array();
    },
    toggle_check_all: function(){

        var text_id = '';
        var parts = null;
        if (this.recips_pick_all) {
            //select all recipients
            $("#assetlist a").each(function(i,e) {
                text_id = $(e).attr('id');
                parts = text_id.split('recip_');
                //if the recipient was not already selected pick it
                if(! $(e).hasClass("recip_picked")) {
                    $DomainPicker.pick_recipient(parts[1]);
                }
            })
            this.recips_pick_all = false;
            //reset select all link
            $("#action").html('Select None');
        } else {
            $("#assetlist a").each(function(i,e) {
                text_id = $(e).attr('id');
                parts = text_id.split('recip_');
                $(e).removeClass("recip_picked");
                $DomainPicker.unpick_recipient(parts[1]);
            })
            this.recips_pick_all = true;
            //reset select all link
            $("#action").html('Select All');
        }
    }
}
