
    var PLUCKSearch = PLUCKSearch ? PLUCKSearch : function() {
        var private = {
            title: "PLUCK Search Implementation",
            serverUrl: serverUrl,
            UID: "uid",
            currentPage: 1,
            debug: function(str) {
                if (debug)
                    console.log(str);
                //alert(str);
            },
            debugobj: function(obj) {
                if (debug)
                    console.dir(obj);
            },
            searchUser: function(searchString, page) {
                private.debug("searchUser: getting stuff from pluck");
                private.currentPage = page;
                var requestBatch = new RequestBatch();
                var searchPage = new SearchAction("User", searchString, 10, private.currentPage);
                requestBatch.AddToRequest(searchPage);
                requestBatch.BeginRequest(private.serverUrl, private.renderUserSearch);
            },
            renderUserSearch: function(responseBatch) {
                private.debug("renderUserSearch");
                private.debugobj(responseBatch);
                if (responseBatch.Messages[0].Message === 'ok') {
                    // success from pluck, lets process the data
                    for (var i = 0; i < responseBatch.Responses.length; i++) {
                        var response = responseBatch.Responses[i];

                        if (response.SearchResult != null) {
                            if (private.searchResultPageHandler != null) {
                                private.searchResultPageHandler(response.SearchResult, response.SearchResult.SearchString);
                            }
                            else {
                                private.debug("No SearchResultPageHandler defined and response " + i + " is a SearchResult");
                            }
                        }
                    }
                }
            },
            searchResultPageHandler: function(searchPage, SearchString) {
                private.debug('searchResult');
                private.debugobj(searchPage);
                public.showResults(searchPage.SearchResults, searchPage.NumberOfSearchResults, SearchString);
            },
            addFriend: function(friendKey) {
                private.debug('adding Friend ' + friendKey);
                var requestBatch = new RequestBatch();
                var addFriend = new AddFriendAction(new UserKey(friendKey));
                requestBatch.AddToRequest(addFriend);
                requestBatch.BeginRequest(private.serverUrl, private.renderFriends);  // reusing renderFriends since it'll redraw the friend list.
            },
            renderFriends: function(responseBatch) {
                private.debug("renderFriends");
                private.debugobj(responseBatch);
            }
        };


        var public = {
            getTitle: function() {
                return private.title;
            },
            firstRun: function(InitialLocationSearchString) {
                private.searchUser(InitialLocationSearchString, 1);
            },
            getItStarted: function(joinedQuery, page) {
                private.searchUser(joinedQuery, page);
            },
            getItStartedOriginal: function() {
                var el = document.getElementById("quickSearch");
                private.searchUser(el.value, 1);
            },
            userDetails: function(user) {
                var detailsHtml = "";
                var MAX_DUMP_DEPTH = 10;

                function dumpObj(obj, name, indent, depth) {
                    if (depth > MAX_DUMP_DEPTH) {
                        return indent + name + ": Maximum Depth Reached<br />";
                    }
                    if (typeof obj == "object") {
                        var child = null;
                        var output = indent + name + "<br />";
                        indent += "&nbsp;&nbsp;";
                        for (var item in obj) {
                            try {
                                child = obj[item];
                            } catch (e) {
                                child = "<Unable to Evaluate>";
                            }
                            if (typeof child == "object") {
                                output += dumpObj(child, item, indent, depth + 1);
                            } else {
                                output += indent + item + ": " + child + "<br />";
                            }
                        }
                        return output;
                    } else {
                        return obj;
                    }
                }
                detailsHtml += "User :" + dumpObj(user, "User", "", 0) + " <br />";

                return detailsHtml;
            },
            showResults: function(userArray, totalItems, SearchString) {
                private.debug("showResults");
                var friendHtml = "";
                for (var i = 0; i < userArray.length; i++) {
                    var user = userArray[i];
                    var detailsView = public.userDetails(user).replace(/'/g, "\\'");
                    friendHtml += "<div class='MyGroupItem'>";
                    friendHtml += " <div id='icon'><img class='friendPhoto' src='" + user.AvatarPhotoUrl + "' /></a></div>";
                    friendHtml += " <div class='info'>";
                    friendHtml += "      <span class='user'><a href='ViewPersona.aspx?userid=" + user.UserKey.Key + "'>" + user.DisplayName + "</a></span>";
                    //friendHtml += "      <span class='friendLocation'> (" + user.Location + ")</span> <span onclick=\"PLUCKSearch.addFriend('" + user.UserKey.Key + "');\" id='friendRemove'> (" + "invite friend" + ")</span><br>";
                    friendHtml += "      <span class='friendLocation'> (" + user.Location + ")</span><br>";
                    var aboutMe = user.AboutMe;
                    if (aboutMe.length > 100) {
                        aboutMe = aboutMe.substr(0, 100) + "...";
                    }
                    friendHtml += "<span class='status'>" + aboutMe + "</span>";
                    friendHtml += "</div>";
                    friendHtml += "</div>";
                }
                var elUser = document.getElementById("MyGroupList");
                elUser.innerHTML = friendHtml;
                var elUser = document.getElementById("SearchCount");
                elUser.innerHTML = totalItems;

                var detailsView = public.userDetails(userArray, 0);
                var userHtml = "";
                userHtml += "<div id='userReturn'>";
                userHtml += detailsView;
                userHtml += "</div>";
                //var elUser = document.getElementById("SearchResults");
                //elUser.innerHTML = elUser.innerHTML + userHtml;
                
                var numberOfPages = Math.ceil(totalItems / 10);
                //alert(numberOfPages);
                var pagerHTML = "";
                   
                if (numberOfPages > 8) {
                    
                    for (i = 1; i < 4; i++) {
                        pagerHTML += '<a href="javascript:void(0);" onclick="PLUCKSearch.getItStarted(\'' + SearchString + '\',\'' + i + '\')">' + i + '</a> | ';
                    }
                    pagerHTML += ' ... ';
                    topPages = numberOfPages - 3;
                    for (i = topPages; i < numberOfPages; i++) {
                        pagerHTML += '<a href="javascript:void(0);" onclick="PLUCKSearch.getItStarted(\'' + SearchString + '\',\'' + i + '\')">' + i + '</a> | ';
                    }
                }
                else {
                    for (p = 1; p <= numberOfPages; p++) {
                        pagerHTML += '<a href="javascript:void(0);" onclick="PLUCKSearch.getItStarted(\'' + SearchString + '\',\'' + p + '\')">' + p + '</a> | ';
                    }
                }

                document.getElementById("pagination").innerHTML = pagerHTML;
            },
            addFriend: function() {
                private.debug("addFriendQuick");
                var el = document.getElementById("quickAdd");
                private.addFriend(el.value);
            },
            reportAbuse: function(index) {
                // report abuse
            }
        }
        private.debug("Doing Something : " + public.getTitle());
        return public;
    } ();



    var requestBatch = new RequestBatch();
    var userKey = new UserKey(currentProfileID);
    requestBatch.AddToRequest(userKey);

    requestBatch.BeginRequest(serverUrl, myCallbackMethod);

    function myCallbackMethod(responseBatch) {
        //console.dir(responseBatch);
        var User = responseBatch.Responses[0].User;
        LocationSplit = User.Location.split(",");
        UserCity = LocationSplit[0];
        var InitialLocationSearchString = "Location:" + UserCity;
        //document.getElementById("SearchParameterUsed").innerHTML = UserCity;
        PLUCKSearch.firstRun(InitialLocationSearchString);
    }
    


    function quickSearch() {
        var requestBatch = new RequestBatch();
        var userKey = new UserKey(currentProfileID);
        requestBatch.AddToRequest(userKey);

        requestBatch.BeginRequest(serverUrl, myCallbackMethod);

        function myCallbackMethod(responseBatch) {
            //var User = responseBatch.Responses[0].User;
            //LocationSplit = User.Location.split(",");
            //UserCity = LocationSplit[0];
 
            //var InitialLocationSearchString = "Location:" + UserCity;
            function andMaker() {
                if (joinedQuery == "") {
                    and = "";
                }
                else {
                    and = " AND ";
                }
            }
            
            var joinedQuery = "";
            if (document.getElementById("runnerName").value != "") {
                andMaker();
                joinedQuery += and + "DisplayName:" + document.getElementById("runnerName").value + " OR l:" + document.getElementById("runnerName").value + " OR f:" + document.getElementById("runnerName").value;
            }
            if (document.getElementById("runnerProvince").value != "") {
                andMaker();
                joinedQuery += and + "Location:" + document.getElementById("runnerProvince").value;
            }
            if (document.getElementById("runnerCity").value != "") {
                andMaker();
                joinedQuery += and + "Location:" + document.getElementById("runnerCity").value;
            }
            if (document.getElementById("runnerDistance").value != "") {
                andMaker();
                joinedQuery += and + "runDistance:" + document.getElementById("runnerDistance").value;
            }
            if (document.getElementById("runnerRunsOn").value != "") {
                andMaker();
                joinedQuery += and + "daysIRun:" + document.getElementById("runnerRunsOn").value;
            }
            if (document.getElementById("runnerRunsDuring").value != "") {
                andMaker();
                joinedQuery += and + "timeOfRunWeekdays:" + document.getElementById("runnerRunsDuring").value;
                andMaker();
                joinedQuery += and + "timeOfRunWeekends:" + document.getElementById("runnerRunsDuring").value;
            }
            if (document.getElementById("runnerKeywords").value != "") {
                andMaker();
                joinedQuery += and + "Tags:" + document.getElementById("runnerKeywords").value;
            }
            //document.getElementById("SearchParameterUsed").innerHTML = joinedQuery;
            PLUCKSearch.getItStarted(joinedQuery,'1');
        }
    }
    
