
function DirectorySearch(dirSearchWidth, contextPath, departmentListHref, detailsHref, searchHref) {

    var searchPrintResultsHTMLHref = exportContextPath + "/printResultsHTML";
    var searchPrintResultsPDFHref = exportContextPath + "/printResultsPDF";
    var searchExportResultsCSVHref = exportContextPath + "/export.csv";

    // for inner methods
    var that = this;
    var searchTabView;
    
    this.init = function() {
        searchTabView = new YAHOO.widget.TabView('dirsearchTabset');
        loadDepartments();
        // look for spid
        var spidPattern = /spid\=([0-9a-z]+)/;
        var spid = document.location.search.match(spidPattern);
        if(spid) {
            try {
                that.getDetails(spid[1], false);

            } catch(ex) { 
                alert(ex);
            }
        }
    }
    YAHOO.util.Event.on(window, "load", this.init);

    function loadDepartments() {

        var callback = {
            success: function(o) {
                var departments = YAHOO.lang.JSON.parse(o.responseText);
                addDepartments(departments);
            },
            failure: function(o) {
                var departmentSelect = documents.getElementById("searchDepartmentList");
                departmentSelect.add(new Option(o.reponseText), null);
            },
            timeout: 1000 * 60 * 10
        }

        // submit the request above callback
        var url = departmentListHref.replace(/&amp;/g, "&");
        var cObj = YAHOO.util.Connect.asyncRequest('GET', url, callback);
    }

    function addDepartments(departments) {
        var departmentSelect = document.getElementById("searchDepartmentList");
        // remove the "loading..." option
        departmentSelect.remove(0);
        // sort and add the new options
        departmentSelect.options[0] = new Option("(All Departments)", "");
        for(var i=0;i <departments.length; i++) {
            var department = departments[i];
            departmentSelect.options[i+1] = new Option(department.ou, department.departmentNumber);
        }
    }

    this.submitOnEnter = function(searchField, evt) {

        var keycode = window.event?window.event.keyCode:evt.which;

        if (keycode && keycode == 13) {
            that.search(searchField.form);
            return false;
        }
        else {
            return true;
        }
    }

    var lastSearchForm;

    this.search = function(form) {
        lastSearchForm = form;
        var resultsBody = document.getElementById("searchResults");
        
        // enable results tab, disable details tab
        searchTabView.getTab(2).set("disabled", false);
        searchTabView.getTab(3).set('disabled', true);

        // set the view to the results tab and show loading gif
        removeChildren(resultsBody);
        resultsBody.appendChild(loadingImage());
        searchTabView.set("activeIndex", 2);

        // submit the search form 
        var request = new AsyncJSONRequest(resultsBody);
        request.handleJSON = function(resultList){
            showResults(resultsBody, resultList);
        }
        var url = searchHref.replace(/&amp;/g, "&");
        request.setForm(form);
        request.post(url);
    
        return false;
    }

    function showResults(resultsBody, resultList) {
        // if only one result - go right to details
        if(resultList.length == 1 && !resultList[0]['private']) {
            that.getDetails(resultList[0].spid, resultList[0].edit);
        }
        // turn results into last, first and sort  
        resultList.sort(compareListName);
        // remove loading image
        removeChildren(resultsBody);
        // render results in template
        var template = (dirSearchWidth == "thin")? new DirectoryResultsThin(resultsBody): new DirectoryResults(resultsBody);
        template.render(resultList, loggedIn, contextPath);
    }

    function compareListName(a, b) {
        a.firstName = a.eduPersonNickname!=null?a.eduPersonNickname:a.givenName;
        a.lastName = a.uncPreferredSurname!=null?a.uncPreferredSurname:a.sn;
        b.firstName = b.eduPersonNickname!=null?b.eduPersonNickname:b.givenName;
        b.lastName = b.uncPreferredSurname!=null?b.uncPreferredSurname:b.sn;

        if(a.lastName > b.lastName) {
            return 1;
        } else if(b.lastName > a.lastName) {
            return -1;
        }
        if(a.firstName > b.firstName) {
            return 1;
        } else if(b.firstName > a.firstName) {
            return -1;
        }
        return 0;
    }

    this.printResultsHTML = function() {
        var form = lastSearchForm;
        form.action = searchPrintResultsHTMLHref;
        form.method = "GET";
        form.target = "_blank";
        form.submit();
    }

    this.printResultsPDF = function() {
        var form = lastSearchForm;
        var title = prompt("You may give a title if you like:", "Contact List");
        var titleField = form.elements['reportTitle'];
        if(!titleField) {
            titleField = document.createElement("input");
            titleField.setAttribute("type", "hidden");
            titleField.setAttribute("name", "reportTitle");
            form.appendChild(titleField);
        }
        titleField.setAttribute("value", title);
        form.action = searchPrintResultsPDFHref;
        form.method = "GET";
        form.target = "_blank";
        form.submit();
    }

    this.exportResultsCSV = function() {
        var form = lastSearchForm;
        form.action = searchExportResultsCSVHref;
        form.method = "GET";
        form.target = "_blank";
        form.submit();
    }

    this.getDetails = function(spid, editable) {
        var detailsBody = document.getElementById("searchDetails");
        var directoryDetails = new DirectoryDetails(detailsBody);

        // set the view to the details tab and show loading gif
        searchTabView.getTab(3).set("disabled", false);
        removeChildren(detailsBody);
        detailsBody.appendChild(loadingImage());
        searchTabView.set("activeIndex", 3);

        // setup and submit the request
        var request = new AsyncJSONRequest(detailsBody);
        request.handleJSON = function(detailsJSON){
            var ldapPerson = new LdapPerson(detailsJSON);
            removeChildren(detailsBody);
            directoryDetails.render(ldapPerson, editable, contextPath);
            // setup link
            YAHOO.util.Event.on("dirEntryPermalink", "click",  function() {
                document.getElementById("dirEntryPermalink").select();  
            });
        }
        var url = detailsHref.replace(/&amp;/g, "&");
        request.post(url, "spid=" + spid);
    }
}