﻿/*******************************************************************************
	TITLE: 			Cat Chow Care Search Plugin
	
	AUTHOR:			Nathan Koch
	
	VERSION:		1.0
	
	REQUIRES:		jQuery v1.3.2
	
	EXPECTS:		Container Element wrapped around form fields and results
	
	OPTIONS:		searchField - text field used for input | Selector
					submitButton - submit field used for submission | Selector
					resultsList - ID of a newly created UL where the results are output | String
					root - the base root of the site.
					
	CALLBACKS: 		resultsFound - fired when results are found
					resultsNotFound - fired when results are not found
					resultsUpdated - fired when the results markup is updated (takes resultsList)
					
	DESCRIPTION:	Drives the Cat Chow Resources Library widget on the home page
	
*******************************************************************************/

(function($) {
    $.fn.extend({
        catChowCareSearch: function(options) {
            // DEFAULTS
            var defaults = {
                resultsFound: function(resultsList) { },
                resultsNotFound: function(resultsList, searchText, searchPath) { },
                resultsUpdated: function(resultsList) { },
                searchField: "input:text",
                resultsListId: "search-results",
                searchDelay: 300,
				root: "/"
            };
            var options = $.extend(defaults, options);
            return this.each(function() {
				
                // VARIABLES
				console.log(options.root);
                var container = $(this);
                var searchField = $(container).find(options.searchField);
                var resultsList = $('<ul id="%ELEM_ID%" />'.replace("%ELEM_ID%", options.resultsListId)).appendTo($(this));
                var searchDelayer;
                var clearFlag = false;

                // FUNCTIONS
                delayTimer = function(delay) {
                    var timer;
                    return function(fn) {
                        timer = clearTimeout(timer);
                        if (fn)
                            timer = setTimeout(function() {
                                fn();
                            }, delay);
                        return timer;
                    }
                };

				parseResults = function(searchResults, searchText) {
					if (searchResults.length) {
                        options.resultsFound.call(this, resultsList);
                        clearResults();
						iterateResults(searchResults);
                    } else {
						var searchPath = root + "SearchResults.aspx?search=%TEXT%".replace("%TEXT%", searchText);
                        options.resultsNotFound.call(this, resultsList, searchText, searchPath);
                    }
                    options.resultsUpdated.call(this, resultsList);
				};
				
                iterateResults = function(searchResults) {
					$.each(searchResults, function() {
						var url = this.MediaDetailUrl;
                        var subject = this.Subject;
                        var boldSubject = boldResult(subject);
                        appendResult(url, boldSubject);
                    });
                };

                boldResult = function(haystack) {
                    var searchTerms = $(searchField).val().split(" ");
                    var replacedText = haystack;
                    $.each(searchTerms, function() {
                        if (this.length > 1) {
                            var needle = this;
                            var pattern = new RegExp(needle, "ig"); // the pattern we are searching against
                            replacedText = replacedText.replace(pattern, "<strong>$&</strong>"); // Bold the matched words
                        }
                    });
                    return replacedText;
                };

                appendResult = function(url, text) {
					var finalUrl = url.replace("~/","");
					var linkHtml = '<a href="%PATH%"></a>'.replace('%PATH%', root + finalUrl);
          			console.log(linkHtml);
					var path;
					$("<li />")
						.appendTo(resultsList)
						.html(linkHtml)
						.find('a')
						.html(text);
                };

                clearResults = function() {
                    $(resultsList).html("");
                }
                
                clearSearch = function(el) {
                    //clear search first time it is clicked
                    if(clearFlag == false){
                        el.val("");
                    }
                    clearFlag = true;
                }

                search = function() {
					var searchText = $(searchField).val();
                    CatChow.Web.AjaxUtility.Search(searchText, function(result) {
						console.log("Cat Care Search Results for " + searchText, result.value);
						parseResults(result.value, searchText);
                    });
                };

				checkValidKeypress = function(keyCode) {
					// if spacebar or backspace or arrow keys
					if (keyCode == 32 || keyCode == 37 || keyCode == 38 || keyCode == 39 || keyCode == 40) {
						return false;
					} else {
						return true;
					}
				};

                // EVENT LISTENERS
                $(searchField).focus(function(event) {
                    clearSearch($(this));
                    clearResults();
                });
                $(searchField).click(function(event) {
                    clearSearch($(this));
                    clearResults();
                });
                $(searchField).keyup(function(event) {
                    var el = this;
                    searchDelayer(function() {
                        var validKeypress = checkValidKeypress(event.which);
						if (validKeypress) {
                            if (el.value.length > 2) {
                                search();
                            }
                        }
                    });
                });


                // TRIGGERED ON PLUGIN LOAD
                searchDelayer = delayTimer(options.searchDelay); // wrap any code that needs to be buffered in an inputDelayer function
                search(); // fire the search when the plugin is loaded
                // TODO get data from the SE exposed in the markup to eliminate performance bottleneck
                
            });
        }
    });
})(jQuery);