var Autocompletor = {

    input: Global.MessageInput,
    values: [],
    suggestions: [],
    ite: 0,
    lastCaret: null,

    autocompete_keys: [Global.KEY.TAB],


    __exec: function(key){
        var code = key.charCode ? key.charCode : key.keyCode ? key.keyCode : key.which;
        if( jQuery.inArray(code, Autocompletor.autocomplete_keys) >= 0 ){
            Autocompletor.complete(Global.MessageInput);
            return false;
        }

        return true;
    },

    reset: function(){
        Autocompletor.ite = 0;
        Autocompletor.lastCaret = null;
    },

    set: function(values){
        Autocompletor.values = values;
    },

    buildCaret: function(start, end, ite){
        Autocompletor.lastCaret = {
            'start': start,
            'end': end
        };
    },

    getCaret: function(input){
        if( Autocompletor.lastCaret == null ){
            var caret = $(input).caret();
            Autocompletor.buildCaret(caret.start, caret.end, 0);
        }
        return Autocompletor.lastCaret;
    },

    complete: function(input){
        var inputText = $(input).val();
        var caret = Autocompletor.getCaret(input);

        var startText = inputText.substr(0, caret.start);
        var endText = inputText.substr(caret.end);

        var last = startText.split(/\b/g).pop().trim();

        var res = Autocompletor.find(last);
        if( res != null && res != undefined ){
            res = res + ' ';
            startText = startText.substr(0, startText.length - last.length);

            Autocompletor.lastCaret.end = Autocompletor.lastCaret.start + res.length;
            
            $(input).val(startText + res + endText);

            var endCaret = caret.start + res.length - last.length;
            $(input).caret(endCaret , endCaret);
        }
    },

    find : function(start){

        Autocompletor.suggestions = [];

        for(var i = 0; i < Autocompletor.values.length; i++){
            var name = Autocompletor.values[i];

            if( name.substr(0, start.length).toLowerCase() == start.toLowerCase()){
                Autocompletor.suggestions.push(name);
            }
        }

        if( Autocompletor.suggestions.length == 0 ){
            return null;
        }
        else{
            Autocompletor.suggestions.sort();
        }

        if( Autocompletor.ite >= Autocompletor.suggestions.length ){
            Autocompletor.ite = 0;
        }

        return Autocompletor.suggestions[Autocompletor.ite++];
    }
};

