/* Depends on prototype.js, LT.DropDownDiv, and LT.Form being loaded to work */
if (typeof LT == "undefined") LT = {};

LT.UserSearchDiv = function ( param ) {
    this._initialize( param );
};

LT.UserSearchDiv.dropDownInstrumented = new Hash();

LT.UserSearchDiv.instrumentDiv = function ( param ) {
    var div = $(param.id_group);

    if ( ! div ) {
        return ;
    }

    if (! LT.UserSearchDiv.dropDownInstrumented.get(param.id_group)) {
        LT.DropDownDiv.instrumentDiv( param.id_group );

        LT.UserSearchDiv.dropDownInstrumented.set( param.id_group, true );
    }

    //should use hash merge instead but only available in prototype 1.6+
    new LT.UserSearchDiv( {
                            div:param.div,
                            id:param.id,
                            id_group:param.id_group,
                            role:param.role,
                            onSuccessSearch:param.onSuccessSearch,
                            onSuccessSubmit:param.onSuccessSubmit,
                            wantUser:param.user,
                            wantVisitor:param.visitor,
                            wantGroup:param.group,
                            isOkToHide:param.isOkToHide
                     } );
};

LT.UserSearchDiv.prototype._initialize = function( param ) {
    var div = param.div;
    var id = param.id;
    var id_group = param.id_group;
    this.onSuccessSearch = param.onSuccessSearch;
    this.onSuccessSubmit = param.onSuccessSubmit;
    this.wantUser = param.wantUser;
    this.wantVisitor = param.wantVisitor;
    this.wantGroup = param.wantGroup;
    this.role = param.role;
    this.isOkToHide = param.isOkToHide;

    var submit_list = $( id + "SubmitList" );
    var search_textbox = $( id + "User_search_autocomplete");
    var search_dropdown = $( id + "User_search_autocomplete_choices");

    var message_div = $( id_group + "MessageDiv" );
    var submit_div = $( id_group + "SubmitListTr" );
    var submit_form = $( id_group + "SubmitForm" );
    var search_indicator = $( id_group + "Indicator");
    var search_all_domains_yes = $( id_group + "AllDomainsYes");

    this.submit_controls = $( id_group + "SubmitControls" );
    this.submit_group_controls = $( id_group + "SubmitGroupControls" );

    this.div = div;

    this.message_div = message_div;
    this.submit_div = submit_div;
    this.submit_form = submit_form;
    this.submit_list = submit_list;

    this.submit_list_users = {};
    this.submit_list_visitors = {};
    this.submit_list_groups = {};

    this.search_textbox = search_textbox;
    this.search_dropdown = search_dropdown;
    this.search_indicator = search_indicator;
    this.search_all_domains_yes = search_all_domains_yes;

    this._instrumentLookupForm();
    this._instrumentSubmitForm();
};

LT.UserSearchDiv.prototype._instrumentLookupForm = function () {
    var self = this;

    var obj = new Ajax.CachedAutocompleter( self.search_textbox, self.search_dropdown, "/misk5/ajax_getuser_list", {
      paramName: "autocomplete_parameter", 
      minChars: 3,
      frequency: 1,
      indicator: self.search_indicator.id,
      updateElement: function(e) {},
      tokens: [';',',','\n'],
      callback: function(obj,queryString) {
        if ( self.search_all_domains_yes.checked ) {
            queryString += "&all_domains=1";
        } else {
            queryString += "&all_domains=0";
        }

        return queryString;
      },
      updateElement: function(li) {
        var obj = {};
        obj.name = li.getAttribute("lname");
        obj.id = li.getAttribute("lid");

        if (li.getAttribute("ltype") == "user") {

            self._addUserToSubmitList( obj );

            if (typeof LT.UserSearchDiv.UserMap == "undefined") LT.UserSearchDiv.UserMap = new Hash();
            LT.UserSearchDiv.UserMap.set( obj.id, obj.name.replace(/ <.+$/,'') );

        } else if (li.getAttribute("ltype") == "group") {

            self._addGroupToSubmitList( obj );

            if (typeof LT.UserSearchDiv.GroupMap == "undefined") LT.UserSearchDiv.GroupMap = new Hash();
            LT.UserSearchDiv.GroupMap.set( obj.id, obj.name );

        } else {

            self._addVisitorToSubmitList( obj );

            if (typeof LT.UserSearchDiv.VisitorMap == "undefined") LT.UserSearchDiv.VisitorMap = new Hash();
            LT.UserSearchDiv.VisitorMap.set( obj.id, obj.name );

        }

        self.search_textbox.value = "";
      },
      parameters: "list="+self.role
    });
};

LT.UserSearchDiv.prototype._instrumentSubmitForm = function () {
    var self = this;

    this.submit_form.observe(
        "submit",
        function (event) {
            self._submitViaAjax();
            
            /* We don't want to actually submit the form */
            Event.stop(event);
        }
    );
};

LT.UserSearchDiv.prototype._addUserToSubmitList = function (user) {
    var self = this;

    if ( this.submit_list_users[ user.id ] ) {
        return;
    }

    var list = this.submit_list;

    var li = document.createElement("li");

    

    li.__userData = user;
 
    if ( this.submit_controls ) {
        var controls = this.submit_controls.cloneNode(true);
        controls.id = controls.id + user.name;

        controls.getElementsBySelector("input").each(
            function (input) {
                input.name = input.name + user.id;
                input.value = self.role;
            }
        );

        li.appendChild(controls);
    }

    var button = document.createElement("a");
    button.style.cursor = "pointer";
    // button.className = "iconButton";
    var img = document.createElement("img");
    img.style.verticalAlign = "middle";
    img.title = "Remove";
    img.src = "/assets/c1/images/icon/icon_delete.gif";
    button.appendChild( img );
    //button.appendChild( document.createTextNode("Remove") );

    $(button).observe(
        "click",
        function (event) {
            self._removeFromSubmitList( self.submit_list_users, li.__userData, li);
                    
            Event.stop(event);
        }
    );

    li.appendChild(button);
    
    li.appendChild( document.createTextNode( user.name ) );
    li.appendChild( LT.Form.makeHiddenInput( "user_id", user.id ) );

    list.appendChild(li);

    list.show();
    this.submit_div.show();

    this.submit_list_users[ user.id ] = true;
};

LT.UserSearchDiv.prototype._addVisitorToSubmitList = function (visitor) {
    if ( this.submit_list_visitors[ visitor.id ] ) {
        return;
    }

    var list = this.submit_list;

    var li = document.createElement("li");

    li.appendChild( document.createTextNode( visitor.name + " (visitor)" ) );
    li.appendChild( LT.Form.makeHiddenInput( "visitor_id", visitor.id ) );

    li.__visitorData = visitor;

    var button = document.createElement("button");
    button.className = "iconButton";
    button.appendChild( document.createTextNode("Remove") );

    var self = this;

    $(button).observe(
        "click",
        function (event) {
            self._removeFromSubmitList( self.submit_list_visitors, li.__visitorData, li);
                    
            Event.stop(event);
        }
    );

    li.appendChild(button);

    list.appendChild(li);

    list.show();
    this.submit_div.show();

    this.submit_list_visitors[ visitor.id ] = true;
};

LT.UserSearchDiv.prototype._addGroupToSubmitList = function (group) {
    var self = this;

    if ( this.submit_list_groups[ group.id ] ) {
        return;
    }

    var list = this.submit_list;

    var li = document.createElement("li");

    li.appendChild( document.createTextNode( group.name + " (group)" ) );
    li.appendChild( LT.Form.makeHiddenInput( "group_id", group.id ) );

    li.__groupData = group;
 
    if ( this.submit_group_controls ) {
        var controls = this.submit_group_controls.cloneNode(true);
        controls.id = controls.id + group.name;

        controls.getElementsBySelector("input").each(
            function (input) {
                input.name = input.name + group.id;
                input.value = self.role;
            }
        );

        li.appendChild(controls);
    }

    var button = document.createElement("button");
    button.className = "iconButton";
    button.appendChild( document.createTextNode("Remove") );

    $(button).observe(
        "click",
        function (event) {
            self._removeFromSubmitList( self.submit_list_groups, li.__groupData, li);
                    
            Event.stop(event);
        }
    );

    li.appendChild(button);

    list.appendChild(li);

    list.show();
    this.submit_div.show();

    this.submit_list_groups[ group.id ] = true;
};

LT.UserSearchDiv.prototype._removeAllFromSubmitList = function ( li ) {
    if (li.__userData)
        this._removeFromSubmitList( this.submit_list_users, li.__userData, li);

    if (li.__visitorData)
        this._removeFromSubmitList( this.submit_list_visitors, li.__visitorData, li);

    if (li.__groupData)
        this._removeFromSubmitList( this.submit_list_groups, li.__groupData, li);
}

LT.UserSearchDiv.prototype._removeFromSubmitList = function ( list, data, li) {
    list[ data.id ] = false;

    var list = this.submit_list;
    list.removeChild(li);

    var self = this;

    if ( ! list.hasChildNodes() ) {
        var func = function () {
            self.submit_div.hide();
            list.hide();
        };

        if (! self.isOkToHide ) {
            func();
        } else {
            if ( self.isOkToHide()) {
                func();
            }
        }
    }
};

LT.UserSearchDiv.prototype._submitViaAjax = function () {
    var self = this;

    new Ajax.Request(
        this.submit_form.action, {
            parameters: this.submit_form.serialize(true),
            onSuccess:  function (req) {
                self._handleSubmitResponse( req.responseText );
            }
        }
    );
};

LT.UserSearchDiv.prototype._handleSubmitResponse = function (response_text) {
    var response = eval( "(" + response_text + ")" );

    if ( response && response.success ) {
        this._showSuccessMessage( response.count_string );
        this._clearSubmitList();

        if ( this.onSuccessSubmit ) {
            this.onSuccessSubmit( response );
        }
    }
    else if ( response && response.error ) {
        alert(response.error);
    }
    else {
        alert(response);
    }
};

LT.UserSearchDiv.prototype._showSuccessMessage = function (count_string) {
    this.message_div.innerHTML =
        "<p>You have successfully sent this document to " + count_string + ".</p>";

    this.message_div.show();
};

LT.UserSearchDiv.prototype._clearSubmitList = function () {
    var list = this.submit_list;

    while ( list.hasChildNodes() ) {
        this._removeAllFromSubmitList( list.firstChild );
    }
};
