
(function($) {
    var ajaxTimeout;
    var closeTimeout;
    var lastRequest; 
    $.fn.advancedSearchField = function(options) {
        var settings = $.extend({}, $.fn.advancedSearchField.defaults, options); 
        this.before('<input type="hidden" name="search-last" id="search-last" value="">').focus(function() {
            if (closeTimeout) {
                clearTimeout(closeTimeout); 
            }
            $(this).bind('keyup', updateSearch); 
            updateSearch();
        }).blur(function() {
        $(this).unbind('keyup', updateSearch);
        closeTimeout = setTimeout(closeSearch, 500);
    }).after('<div id="search-result" class="result-block"><span class="arrow"><span></span></span><div id="server-search">' + settings.messageLoading + '</div><p id="search-info" class="result-info">-</p></div>').next().hide(); 
        function closeSearch()
        { $('#s').hideTip(); $('#search-result').fadeOut(); }; function updateSearch() {
            var result = $('#search-result'); var s = $.trim($('#s').val()); if (s.length == 0)
            { $('#s').showTip({ content: settings.tipFocus }); result.fadeOut(); }
            else if (s.length < settings.minSearchLength)
            { $('#s').showTip({ content: settings.tipTooShort }); result.fadeOut(); }
            else {
                var last = $('#search-last');
                var lastS = last.val();
                var info = $('#search-info');
                $('#s').hideTip();
                result.fadeIn(); 
                if (lastS != s) {
                    $('#search-last').val(s); 
                    if (ajaxTimeout) {
                        clearTimeout(ajaxTimeout); 
                    }
                    result.children().not('.arrow, #server-search, #search-info').remove(); 
                    if (settings.enableNavSearch) {
                        result.children('.arrow:first').after('<h2>' + settings.titleTemplateResult + '</h2>' + searchInNav(s) + '<hr>'); 
                        if ($.fn.accessibleList && (settings.moreButtonAfter > 0 || settings.matchesPerPage > 0)) {
                            result.children('ul:first').accessibleList({ 'moreAfter': settings.moreButtonAfter, 'pageSize': settings.matchesPerPage, 'after': function()
                            { $('#s').focus(); } 
                            });
                        } 
                    }
                    $('#search-info').addClass('loading').text(settings.messageLoading);
                    var date = new Date(); 
                    if (!lastRequest || lastRequest < date.getTime() - noUpdateDelay) {
                        var delay = settings.firstRequestDelay; 
                    }
                    else {
                        var delay = settings.nextRequestDelay; 
                    }
                    ajaxTimeout = setTimeout(sendRequest, delay);
                } 
            } 
        }; function searchInNav(s) {
            var keywords = s.toLowerCase().split(/\s+/);
            var nbKeywords = keywords.length;
            var links = $('nav a');
            var matches = []; 
            links.each(function(i) {
                var text = $(this).text().toLowerCase();
                var textMatch = true; 
                for (var i = 0; i < nbKeywords; ++i) {
                    if (text.indexOf(keywords[i]) == -1) {
                        textMatch = false;
                        break; 
                    } 
                }
                if (textMatch) {
                    matches.push(this); 
                }
            });
            var nbMatches = matches.length; 
            if (nbMatches > 0) {
                var output = '<p class="results-count"><strong>' + nbMatches + '</strong> match' + ((nbMatches > 1) ? 'es' : '') + '</p>';
                output += '<ul class="small-files-list icon-html">'; 
                for (var m = 0; m < nbMatches; ++m) {
                    var link = $(matches[m]);
                    var text = link.text();
                    var path = [text]; 
                    for (var i = 0; i < nbKeywords; ++i) {
                        text = text.replace(new RegExp('(' + keywords[i] + ')', 'gi'), '<strong>$1</strong>'); 
                    }
                    var parent = link; 
                    while ((parent = parent.parent().parent().prev('a')) && parent.length > 0) {
                        path.push(parent.text()); 
                    }
                    output += '<li><a href="' + matches[m].href + '">' + text + '<br><small>' + path.reverse().join(' > ') + '</small></a></li>';
                }
                return output + '</ul>';
            }
            else {
                return '<p class="results-count">' + settings.messageNoMatches + '</p>'; 
            } 
        }; function sendRequest() {
        var url = $('#s').parents('form:first').attr('action'); 
            if (!url || url == '') {
                url = document.location.href.match(/^([^#]+)/)[1]; 
            }
            var date = new Date();
            var timer = date.getTime();
            $('#server-search').load(url, { 's': $('#search-last').val(), 'country': $('#country').val(), 'timer': timer }, function(responseText, textStatus, XMLHttpRequest) {
                if (textStatus == 'success' || textStatus == 'notmodified') {
                    $('#search-info').removeClass('loading').html(settings.messageSearchDone); 
                }
                else {
                    $('#server-search').html('<p class="error-message">' + settings.messageErrorFull + '</p>');
                    $('#search-info').removeClass('loading').html(settings.messageError);
                }
                _gaq.push(['_trackEvent', 'Buscador', 'Ciudad', $('#search-last').val()]);
            });
        }; return this;
    };     
})(jQuery);
