﻿/// <reference path="../Javascript/jQueryIntellisense.js"/>
/*
* jQuery facetTextboxFilter Plugin
* Caudill Web
* @requires jQuery v.1.4+
*/

(function ($) {

    $.fn.facetTextboxFilter = function (options) {

        this.each(function () {

            // Config
            var defaults = {}; // set defaults in vb
            var config = $.extend(defaults, options);

            // Private variables
            var keyUpTimeout;

            // Named elements
            var self = this, $self = $(this);
            var $facetSearch = $self.parents(".FacetSearchContainer");
            var facetSearch = $facetSearch[0];
            var $textboxContainer = $("div.TextboxContainer", self);
            var $textbox = $("input[type=text]", self);
            var $showFilterButton = $("a.ShowFilterButton", self);
            var $clearFilterButton = $("a.ClearFilterButton", self);

            // Wire up events

            $self
                .bind("clear", clear)
                .bind("dataBind", dataBind)
                .bind("keydown", keyDown)
                .bind("keyup", keyUp);
            $clearFilterButton.bind("click", clearFilterButton_Click);
            $showFilterButton.bind("click", showFilterButton_Click);

            // Public functions, properties

            self.getId = config.id;
            self.getTitle = config.title;

            self.getState = function () {
                return $textbox.val();
            }

            self.restoreState = function (state) {
                if (state) {
                    $.each(state.filters, function (i, filterState) {
                        // Find the state entry corresponding to this filter
                        if (filterState.id == config.id && filterState.value && filterState.value.length > 0) {
                            $textbox.val(filterState.value);
                            $textboxContainer.show();
                            $showFilterButton.hide();
                        } // if 
                    }) // each
                } // if
            }

            // Event handlers

            function dataBind(event) {
                // Need to handle event just to stop propagation
                if (event) event.stopPropagation();
            }

            function showFilterButton_Click(event) {
                $textboxContainer.show();
                $showFilterButton.hide();
                event.preventDefault();
                return false;
            }

            function clearFilterButton_Click(event) {
                if ($textbox.val() && $textbox.val().length > 0) {
                    clear();
                    triggerSearch();
                }
                // Hide textbox, show "narrow by" button
                $textboxContainer.hide();
                $showFilterButton.show();
                event.preventDefault();
                return false;
            }

            function clear(event) {
                $textbox.val("");
                if (event) event.stopPropagation();
            }

            function keyDown(event) {
                lastKeyPressCode = event.keyCode;
                switch (event.keyCode) {
                    case 13:
                        event.preventDefault();
                }
            }

            function keyUp(event) {
                event.preventDefault();
                lastKeyPressCode = event.keyCode;
                switch (event.keyCode) {
                    case 9:
                    case 13:
                        // tab or return: search immediately
                        triggerSearch();
                    default:
                        // any other key - wait for further keypresses
                        if ($textbox.val().length >= 3) {
                            if (keyUpTimeout) clearTimeout(keyUpTimeout);
                            keyUpTimeout = setTimeout(function () {
                                triggerSearch();
                            }, config.delay);
                        };
                }
            }

            function triggerSearch() {
                // Tell our wrapper to perform search
                var t = setTimeout(function () {
                    if ($facetSearch.length > 0) {
                        // we are inside a facetsearch - trigger our parent only
                        $facetSearch.trigger("stateChanged");
                    }
                    else {
                        // we aren't inside a facetsearch - trigger all facetsearches on the page
                        $(".FacetSearchContainer").trigger("stateChanged");
                    }
                }, 1); // Perform search asynchronously (so that other stuff, like the checkbox getting checked, happens without a delay)
            }

            function checkQueryString() {
                // Allow values to be set from the querystring (on first load)
                // e.g. ?searchtext=smith
                var queryValue = $.query.get(config.id);
                if (queryValue) {
                    // The querystring has a value for us; once we've databound, select that value
                    $textbox.val(queryValue);
                }
            }

            // Initialize
            if (facetSearch) {
                var state = facetSearch.restoreState();
                self.restoreState(state);
            }
            checkQueryString();
            if (!facetSearch) {
                // we are not inside a facetsearch - for now just trigger a search on all facetsearch's as we always have a value
                //  TODO - there has to be a more elegant way to do this 
                triggerSearch();
            }
            $self.data("ready", true); // Always ready

        }); // each

        return this; // don't break the chain

    }; // $.fn.facetTextboxFilter

})(jQuery);



