/**
 * Autocomplete plugin for jQuery
 *
 * @author Marcin Gibas <marcingib@gmail.com>
 * @date 07/15/2009
 */

jQuery.fn.autocomplete = function(url,options) {
    $(this).each(function() {

        if(opts==undefined) opts={}

        var defs = {
            minChars: 3,
            hspacing: 11,
            loader: 'C Z E K A J',
            noitems: 'nic nie znaleziono',
            action:function(it) {
                return;
            },
            form: $('form')
        }

        var opts = {}
        jQuery.extend(opts,defs,options);
    
        var elem = $(this);
        var box = $('<div />').addClass('autocomplete')
        .css('display','none')
        .css('position','absolute')
        .css('width',elem.width())
        .css('top',elem.position().top + elem.height()+opts.hspacing+'px')
        .css('left',elem.position().left)

        elem.parent().append(box);
        elem.data('autocomplete_box',box);

        elem.focus(function() {
            opts.form.keypress(function(key) {
                if(key.which==13) return false;
            })
            return;
        }).blur(function() {
            opts.form.unbind('keypress');
            hideme = function() {
                box.hide();
            }
            setTimeout('hideme()',300);
        }).keyup(function(key) {
            if(key.which==38) { //up
                var items = box.data('items');
                var selected = box.data('selected');
                if(selected==null) {
                    selected = items.length-1;
                } else {
                    selected = (selected-1) % items.length;
                    if(selected==-1) selected = items.length-1;
                }
                box.data('selected',selected);
                for(var i=0;i<items.length;i++) {
                    items[i].removeClass('hover');
                    if(i == selected) items[i].addClass('hover');
                }
                return false;
            }
            if(key.which==40) { //down
                var items2 = box.data('items');
                var selected2 = box.data('selected');
                if(selected2==null) {
                    selected2 = 0;
                } else {
                    selected2 = (selected2+1) % items2.length;
                }
                box.data('selected',selected2);
                for(var ii=0;ii<items2.length;ii++) {
                    items2[ii].removeClass('hover');
                    if(ii == selected2) items2[ii].addClass('hover');
                }
                return false;
            }
            if(key.which==13) { //enter
                var items3 = box.data('items');
                var selected = box.data('selected');
                if(selected!=null) {
                    items3[selected].click();
                    box.hide();
                }
                return false;
            }
            var str = $(this).val();
            if(str.length>=opts.minChars) {
                if(box.data('old_val') == str) {
                    box.show();
                    return;
                };
                box.html(opts.loader).show();
                $.get(url,{
                    q:str
                },function(ret) {
                    if(ret.result) {
                        box.data('old_val',str);
                        box.html('');
                        if(ret.count==0) {
                            box.html(opts.noitems);
                        }
                        var ti = new Array();
                        for(var i=0;i<ret.items.length;i++) {
                            var I = ret.items[i];
                            var item = $('<div></div>')
                            .html(I.html)
                            .css('cursor','pointer')
                            .addClass('autocomplete_item')
                            .hover(function() {
                                $(this).addClass('hover');
                            },function() {
                                $(this).removeClass('hover');
                            })
                            .click(function() {
                                return opts.action( $(this).data('item') );
                            })
                            .data('item',I)
                            .appendTo(box);
                            ti.push(item);
                        }
                        box.data('items',ti);
                        box.data('selected',null);
                    }
                    return;
                },'json');
            } else {
                box.hide();
            }
            return;
        });
    });
};


