/**
 * jQuery-Plugin "filterlist"
 * 
 * @version: 1.0, 09.11.2009
 * 
 * @author: Eli Insua
 *          elijahi@arc90.com
 *
 * 
 * @example: 	$('#selector').filterlist({
					url: function (element) { return 'datasource.php?q=' + element.val(); },
					resetUrl: 'datasource.php'
					dataType: 'json',
					success: function(data) { onSuccess(data) },
					timeout: 200,
					minChars: 3
				});
 * 
 */

(function(jQuery) {
    jQuery.fn.filterlist = function(options){

        var settings = jQuery.extend({ url: "datasource.php", // string or function that returns one
                                       resetUrl: "datasource.php",
                                       dataType: "json", 
                                       success: null, 
									   before: null,
                                       timeout: 200,
                                       minChars: 5
                                     }, options);        

        jQuery(this).each(function() {

            // store off the element (local scope)
            var _element = jQuery(this);

            // each element gets its own timer (probably not requried)
            var elementsTimer = null;

            jQuery(this).bind("filterlist.clear", function() {
                // reset timer
                clearTimeout(elementsTimer);

                // clear the element's value
                //_element.val('');

				// get the default dataset
				jQuery.ajax({
				       dataType: settings.dataType,
				       success: settings.success,
				       url: (jQuery.isFunction(settings.resetUrl)) ? settings.resetUrl(_element) : settings.resetUrl
				});
            });

            // track keyup
            jQuery(this).keyup(function() {
                // reset timer
                clearTimeout(elementsTimer);

				if (_element.val().length >= settings.minChars) {
					
					// Call the before action, if any
					(jQuery.isFunction(settings.before)) ? settings.before() : null;
					
					// set the timer again, when it expires make the request
					setTimeout(function() {
						jQuery.ajax({
						    dataType: settings.dataType,
						    success: settings.success,
							error: function(XMLHttpRequest, textStatus, errorThrown) 
										{
											alert(textStatus);
										},
						    url: (jQuery.isFunction(settings.url)) ? settings.url(_element) : settings.url + _element.val()
						});
                    }, settings.timeout);
                }
            });
        });

        // chainable
        return this;
    };
})(jQuery);
