/*
 * eContent.MetaSearch - Query - Plugin
 */


;(function($) {

    var _lastSearchText = '',
		_loading = false,
		_loadAgain = false,
		_searchTimerId = -1;

    $.EcMetaSearch = {
        MinSearchTextLength: 3,
        WebserviceUrl: '',
        WebserviceOptions: {},
        Loader: null,
        ParameterCategory: "Category",
        ParameterSearchText: "SearchText",
        SearchStartDelay: 500,
        Defaults: {
            SearchText: null,
            SearchTextControlId: null,
            Category: null,
            CategoryProvider: null,
            OnSuccess: null,
            BeforeShowResult: null,
            Force: false,
            WebserviceOptions: {}
        }
    }

    $.fn.extend({
        EcStartMetaSearch: function(settings) {
            settings = $.extend({}, $.EcMetaSearch.Defaults, settings);
            return this.each(function() {
                if (_searchTimerId != -1)
                    clearTimeout(_searchTimerId);
                var $this = $(this);
                _searchTimerId = setTimeout(function() { $this.EcStartMetaSearchNow(settings) }, $.EcMetaSearch.SearchStartDelay);
            });
        },
        EcStartMetaSearchNow: function(settings) {
            settings = $.extend({}, $.EcMetaSearch.Defaults, settings);
            return this.each(function() {
                var $this = $(this);
                var searchText = settings.SearchText;
                if (searchText == null && settings.SearchTextControlId != null)
                    searchText = $('#' + settings.SearchTextControlId).val();
                searchText = MinifySearchText(searchText);
                if (searchText != '' && !IsSearchTextComplete(searchText)) {
                    $(this).empty();
                    return;
                }
                if (!settings.Force && searchText != '' && searchText == _lastSearchText)
                    return;
                if (_loading) {
                    _loadAgain = true;
                    return;
                }
                _lastSearchText = searchText;
                _loading = true;
                if (!_loadAgain) {
                    $(this).empty();
                    if ($.EcMetaSearch.Loader != null)
                        $(this).html($.EcMetaSearch.Loader);
                }
                _loadAgain = false;

                var category = '';
                if (!IsSearchTextComplete(searchText)) {
                    category = settings.Category;
                    if (category == null && settings.CategoryProvider != null)
                        category = settings.CategoryProvider();
                }

                var parameter = {};
                parameter[$.EcMetaSearch.ParameterSearchText] = searchText;
                parameter[$.EcMetaSearch.ParameterCategory] = category;
                parameter = $.extend({}, $.EcMetaSearch.WebserviceOptions, parameter);
                parameter = $.extend({}, settings.WebserviceOptions, parameter);
                $.ajax({
                    url: $.EcMetaSearch.WebserviceUrl,
                    data: parameter,
                    type: "POST",
                    cache: false,
                    success: function(html) {
                        if (settings.BeforeShowResult != null)
                            settings.BeforeShowResult();
                        $this.html(html);
                        _loading = false;
                        if (_loadAgain)
                            $this.EcStartMetaSearch(settings);
                        else if (settings.OnSuccess != null)
                            settings.OnSuccess();
                    }
                });
            });
        },
        EcCheckSearchText: function() {
            var value = $(this).val();
            return IsSearchTextComplete(MinifySearchText(value));
        }
    });

    function MinifySearchText(searchText) {
        return searchText.replace(/[^A-Za-z0-9\u00dc\u00fc\u00c4\u00e4\u00d6\u00f6]/g, " ").replace(/\s+/g, " ").trim();
    }

    function IsSearchTextComplete(searchText) {
        return searchText != '' && searchText.length >= $.EcMetaSearch.MinSearchTextLength;
    }


})(jQuery);
