
mint.Suggest = mint.Base.extend({
	active: null,

	input: null,
	list: null,
	
	listClass: "",
	activeClass: "",
	
	source: null,
	sourceFunc: function() {},
	
	offsetX: 0,
	offsetY: 0,

	limit: null,
	startFrom: 1,
	
	__constructor: function(options) {
		var that = this;
		
		with(this) {
			setOptions(options);

			input = mint.$(input);
			
			list = mint.createElement("ul", {
				id: options.id || "",
				className: listClass,
				style: {
					position: "absolute"
				}
			})
			
			list.setPos(input.getX()+offsetX, input.getY()+input.getHeight()+offsetY);
			list.hide();
			list.appendTo();
			
			if(mint.isObject(source)) {
				sourceFunc = function() {
					var num = 0, ch = this.input.value.substr(0, 1).toUpperCase();
					
					if(!/[a-z]/i.test(ch)) ch = "_";
					
					with(this) {
						if(input.value.length < startFrom) return;
						
						if(ch && source[ch]) {
							list.clear();
							var reg = new RegExp("^"+input.value+".+$", "i");
							
							for(var i in source[ch]) {
								if(reg.test(source[ch][i])) {
									with(mint.createElement("li")) {
										appendChild(document.createTextNode(source[ch][i]));
										
										addEvent("click", function() {
											input.value = this.innerHTML;
											list.hide();
										});
										
										addEvent('mousemove', function() {
											this.addClass('hover');
											console.log(this.hasClass('hover'));
										});
										
										addEvent('mouseout', function() {
											this.removeClass('hover');
										});
										
										appendTo(list);
									}
									
									num++;
									
									if(limit && num == limit) break;
								}
							}	
						}
						
						num == 0 ? list.hide() : list.show();
					}
				}
			}
			
			
			input.addEvent("keyup", function() {this.value.length < this.startFrom ? that.list.show() : that.list.hide()});
			input.addEvent("keyup", function() {sourceFunc.call(that)});
		}
		
		$(window.html).addEvent('click', function() {
			that.list.hide();
		});
	}
});