Вход Регистрация
Файл: plugins/searchsys/static/script.js
Строк: 339
<?php
SEARCHSYS 
= {};

SEARCHSYS.Observer = function( context )
{
    
this.events = {};
    
this.context = context;
};

SEARCHSYS.Observer.PROTO = function()
{
    
this.bind = function(eventName, callback, context)
    {
        
context = context || false;

        if ( !
this.events[eventName] )
        {
            
this.events[eventName] = [];
        }

        
this.events[eventName].push({
            
callback: callback,
            
context: context
        
});
    };

    
this.trigger = function( eventName, eventObj )
    {
        var 
self = this;

        
eventObj = eventObj || {};

        if ( !
this.events[eventName] )
        {
            return 
false;
        }

        $.
each(this.events[eventName], function(i, o)
        {
            
o.callback.call(o.context || self.context, eventObj);
        });
    };

    
this.unbind = function( eventName )
    {
        
this.events[eventName] = [];
    };
}

SEARCHSYS.Observer.prototype = new SEARCHSYS.Observer.PROTO();

SEARCHSYS.State = function( data )
{
    
data = data || {};
    
this.state = data;

    
this.observer = new SEARCHSYS.Observer(this);
}

SEARCHSYS.State.PROTO = function()
{
    
this.mergeState = function( state )
    {
        $.
extend(this.state, state);

        
this.observer.trigger('change');
    };

    
this.setState = function( state )
    {
        
state = state || {};
        
this.state = state;

        
this.observer.trigger('change');
    };

    
this.getState = function()
    {
        return 
this.state;
    };
};

SEARCHSYS.State.prototype = new SEARCHSYS.State.PROTO();

SEARCHSYS.UserState = function( data )
{
    
data = data || {};
    
this.state = data;

    
this.observer = new SEARCHSYS.Observer(this);

    
this.searchedKWs = [];

    
this.addKeyword = function( kw )
    {
        
this.searchedKWs.push(kw);
    };

    
this.isSearched = function( kw )
    {
        for ( var 
i = 0; i < this.searchedKWs.length; i++ )
        {
            if ( 
kw.search(this.searchedKWs[i]) === 0 )
            {
                return 
true;
            }
        }

        return 
false;
    };

    
this.find = function( filter )
    {
        var 
out = [], cache, self = this;
        
cache = this.getState();

        $.
each(cache, function(id, item)
        {
            var 
found = $.isFunction(filter)
                ? 
filter.call(self, item, id)
                : 
true

            
if ( found ) {
                
out.push(item);
            }
        });

        return 
out;
    };
};

SEARCHSYS.UserState.prototype = new SEARCHSYS.State.PROTO();



SEARCHSYS.userSelector = (function() {

    var 
_cache = new SEARCHSYS.UserState();
    var 
ajaxTimeout, syncing = false;

    var 
node, esel2;
    var 
_settings = {};

    var 
formatResult, formatSelection, getData, syncData, getDataFromCache, highlightTerm, getGroupSettings, normalizeText;

    
getGroupSettings = function( group ) {
        return 
_settings.groups[group] || _settings.groupDefaults;
    };

    
highlightTerm = function( term, text ) {
        var 
match = text.toUpperCase().indexOf(term.toUpperCase()),
            
tl=term.length,
            
markup = [];

        if ( 
match < 0 ) {
            
markup.push(text);
        } else {
            
markup.push(text.substring(0, match));
            
markup.push("<span class='esel2-match'>");
            
markup.push(text.substring(match, match + tl));
            
markup.push("</span>");
            
markup.push(text.substring(match + tl, text.length));
        }

        return 
markup.join("");
    };

    
formatResult = function( data, container, query ) {
        if ( 
data.type == "msg" )
            return 
'<div class="peep_small">' + data.text + '</div>';

        if ( !
data.id )
            return 
'<div class="peep_small peep_remark">' + data.text + '</div>';

        var 
html = $(data.html);
        
html.find(".us-ddi-text").html("<span>" + highlightTerm(query.term, data.text) + "</span>");

        return 
html;
    };

    
formatSelection = function( data, container ) {
        
document.location.href = data.url;
        return 
data.text;
    };

    
syncData = function( term, callback ) {
        
syncing = true;
        $.
getJSON(_settings.rspUrl, {term: term, context: _settings.context}, function( data ) {
            
syncing = false;
            if ( $.
isFunction(callback) ) callback(data);
            
_cache.mergeState(data);
        });
    };

    
normalizeText = function (term) {
        if (
term == null) {
            return 
term;
        }
        var 
accentMap = {
            
"à": "a", "á": "a", "â": "a", "ã": "a", "ä": "a",
            
"è": "e", "é": "e", "ê": "e",           "ë": "e",
            
"ì": "i", "í": "i", "î": "i", "ñ": "n", "ï": "i",
            
"ò": "o", "ó": "o", "ô": "o", "õ": "o", "ö": "o",
            
"ù": "u", "ú": "u", "û": "u",           "ü": "u",
            
"ý": "y",                     "ÿ": "y"
        
};
        var 
ret = "";
        for (var 
i = 0; i < term.length; i++) {
            
ret += accentMap[ term.charAt(i) ] || term.charAt(i);
        }

        return 
ret;
    };

    
getDataFromCache = function( term, count ) {
        
count = count || 10;
        var 
tmp;
        
        var 
out = [], groups = {}, orderedGroups = [], state = _cache.find(function( item ) {
            
tmp = normalizeText(item.text).toUpperCase().indexOf(term.toUpperCase());
            if ( 
tmp < 0 ) {
                
tmp = normalizeText(item.info).toUpperCase().indexOf(term.toUpperCase());
                if ( 
tmp < 0 ) {
                    return 
false;
                }
                return 
true;
            }

            return 
true;
        });

        
state.reverse();

        var 
groupsCount = 0, lastGroup, val = esel2.val();

        $.
each(state, function(id, item) {
            if ( $.
inArray(item.id.toString(), val) >= 0 || count == 0 ) {
                return;
            }
            
count--;

            if ( 
item.group ) {
                if ( !
groups[item.group] ) {
                    
groups[item.group] = {
                        
text: item.group,
                        
children: []
                    };
                    
groupsCount++;
                    
lastGroup = item.group;
                }

                
groups[item.group].children.push(item);
            } else {
                
out.push(item);
            }
        });

        if (
out.length > 0 || groupsCount > 0) {
            
_settings.groups = _settings.groups || {};

            $.
each(_settings.groups, function(groupName, groupSettings) {
                if ( !
groups[groupName] && groupSettings.alwaysVisible && groupSettings.noMatchMessage ) {
                    
groups[groupName] = {
                        
text: groupName,
                        
children: [{
                            
text: PEEP.getLanguageText(groupSettings.noMatchMessage.prefix, groupSettings.noMatchMessage.key, {
                                
"term": term
                            
}),
                            
type: 'msg'
                        
}]
                    };

                    
groupsCount++;
                }
            });
        }

        $.
each(groups, function( i, group ) {
            
orderedGroups.push(group);
        });

        
orderedGroups.sort(function(a, b) {
            var 
sA = getGroupSettings(a.text);
            var 
sB = getGroupSettings(b.text);

            return 
sA.priority - sB.priority;
        });

        if ( 
lastGroup ) {
            var 
temp = groupsCount == 1 && !getGroupSettings(lastGroup).alwaysVisible ? groups[lastGroup].children : orderedGroups;

            $.
each(temp, function(id, group) {
                
out.unshift(group);
            });
        }

        return 
out;
    };

    
getData = function( options ) {
        var 
state = getDataFromCache(options.term);

        var 
sync = $.trim(options.term) && !_cache.isSearched(options.term);

        if ( 
sync ) {

            if ( 
ajaxTimeout ) {
                
window.clearTimeout(ajaxTimeout);
            }

            
ajaxTimeout = window.setTimeout(function() {
                
_cache.addKeyword(options.term);
                
syncData(options.term);
            }, 
300);
        }

        if ( (!
sync || state.length) && !syncing ) {
            
options.callback({
                
results: state
            
});
        }
    };

    return {
        
init: function( selector, settings, options, data ) {

            if ( $.
isPlainObject(data) ) {
                
_cache.setState(data);
            }

            
_settings = settings;

            
node = $(selector);

            
node.esel2($.extend(options, {
                
"query": getData,
                
"formatResult": formatResult,
                
"formatSelection": formatSelection,
                
"formatNoMatches": function( term ) {
                    return 
PEEP.getLanguageText('searchsys', 'selector_no_matches', {
                        
"term": term
                    
});
                },
                
"formatSearching": function() {
                    return 
PEEP.getLanguageText('searchsys', 'selector_searching');
                },
                
formatInputTooShort: function (input, min) {
                    return 
PEEP.getLanguageText('searchsys', 'input_too_short', {chars : (min - input.length) });
                },
                
"postRender": function(term) {
                    var 
items = esel2.results.find(".esel2-result").length;
                    if ( 
items > 0 )
                    {
                        
esel2.results.append("<li class='esel2-more-results'><a href='" + _settings.viewAllUrl + "?term=" + encodeURIComponent(term) + "'>" + PEEP.getLanguageText('searchsys', 'view_all_results') + "</a></li>");
                    }
                    var 
$resultsCont = esel2.results.parent();
                    if (
$resultsCont.css('background-color') == 'transparent')
                    {
                        
$resultsCont.css('background-color', $('#floatbox_prototype .floatbox_container .peep_bg_color').css('background-color'));
                    }
                }
            }));

            
node.next(".us-field-fake").hide();

            
esel2 = node.data().esel2;

            
node.get(0).focus = function() {
                
esel2.focusSearch();
            };

            
_cache.observer.bind('change', function()
            {
                
esel2.updateResults();
            });

            return 
esel2;
        }
    }
})();

SEARCHSYS.UserSelectorFormElement = function( id, name ) {
    var 
formElement = new PeepFormElement( id, name );

    
formElement.init = function( selector, settings, options, data ) {
        
formElement.esel2 = SEARCHSYS.userSelector.init(selector, settings, options, data);
    };

    
formElement.resetValue = function() {
        
formElement.esel2.data([]);
    };

    
formElement.getValue = function() {
        return 
formElement.esel2.val();
    };

    
formElement.setValue = function( val ) {
        
formElement.esel2.data(val);
    };

    return 
formElement;
};
?>
Онлайн: 0
Реклама