function applyConfigObject(o,c){
	if(o && c && typeof c == 'object'){
        for(var p in c){
            o[p] = c[p];
		}
    }
    return o;
}

var ProtoSpotlight = Class.create();													//create new class
ProtoSpotlight.prototype = {															//class prototype

	bindTo			: null,
	url				: null,
	//array cu {record: record, el: el}
	resultItems		: [],
	//indexul div-ului curent
	currentItem		: -1,
	
	initialize: function(config){
		
		applyConfigObject(this, config);
		
		this.inputFieldReference = $(this.bindTo);
		
		this.createSpotlightUI();
		this.inputFieldReference.observe('focus', this.onFocus.bindAsEventListener(this));
		this.inputFieldReference.observe('blur', this.onBlur.bindAsEventListener(this));
		this.inputFieldReference.observe('keyup', this.onKeyup.bindAsEventListener(this));
		this.inputFieldReference.observe('keydown', this.onKeydown.bindAsEventListener(this));
	},//end initialize
	
	onFocus: function(e){
		
	},
	
	onBlur: function(e){
		this.hideResult();
	},
	
	onKeyup: function(e){
		var key = e.keyCode;
		switch(key){
			//up key
			case 38:
				this.moveUp();
				break;
			//down key
			case 40:
				this.moveDown();
				break;
			//esc key
			case 27:
				this.hideResult();
				break;
			//enter key
			case 13:
				if (this.currentItem > -1){
					if (this.resultItems[this.currentItem].record.url){
						window.location = this.resultItems[this.currentItem].record.url;
					}//end if
				}//end if
				break;
			default:
				var query = this.inputFieldReference.value;
				if (this.url && query){
					new Ajax.Request(this.url,{
						method: "get",
						parameters:{
							query:query
						},
						onSuccess: this.onSuccess.bind(this)
					});
				}else{
					this.hideResult();
				}
				
		}//end switch
		
		
	},
	
	onKeydown: function(e){
		
	},
	
	onMouseOver: function(e){
		var el = Event.element(e);
		
		if (!el.hasClassName("spotlight-result-item")){
			el = el.up('.spotlight-result-item')
		}
		var className = el.className;
		var index = className.match(/spotlight-index(.+?)/i);
		this.currentItem = index[1];
		this.selectItem(this.currentItem);
	},
	
	onMouseDown: function(e){
		var el = Event.element(e);
		
		if (!el.hasClassName("spotlight-result-item")){
			el = el.up('.spotlight-result-item')
		}
		var className = el.className;
		var index = className.match(/spotlight-index(.+?)/i);
		this.currentItem = index[1];
		window.location = this.resultItems[this.currentItem].record.url;
	},
	
	onSuccess: function(transport){
		var response = transport.responseText;
		var resultObject = response.evalJSON();
		this.items = resultObject;
		this.createResultItems();
	},
	
	createResultItems: function(){
		this.resultReference.descendants().each(function(el){
			el.remove();
		});
		
		this.resultItems = [];
		this.currentItem = -1;
		var index = 0;
		for(var i=0; i<this.items.length; i++){
			var title = this.items[i].title;
			var rows = this.items[i].rows;
			
			//create title element
			var div = document.createElement("div");
			Element.extend(div);
			div.addClassName("spotlight-result-title");
			div.innerHTML = title;
			this.resultReference.appendChild(div);
			
			for(var j=0; j<rows.length; j++){
				var record = rows[j];
				var div = document.createElement("div");
				Element.extend(div);
			
				div.addClassName("spotlight-result-item spotlight-index"+index);
				div.innerHTML = this.renderer(record);
				
				div.observe('mouseover',this.onMouseOver.bindAsEventListener(this));
				div.observe('mousedown',this.onMouseDown.bindAsEventListener(this));
				
				this.resultItems.push({record: record, el: div});
				this.resultReference.appendChild(div);
				index++;
			}//end for
			
		}//end for
		
		if (this.resultItems.length){
			this.showResult();
		}else{
			this.hideResult();
		}
		
	},
	
	renderer: function(record){
		return "no renderer";
	},
	
	createSpotlightUI: function(){
		
		var inputDimmensions = this.inputFieldReference.getDimensions();
		var inputPosition = this.inputFieldReference.cumulativeOffset();
		
		var div = document.createElement("div");
		Element.extend(div);
		
		div.addClassName("spotlight-result");
		
		div.setStyle({
			width: inputDimmensions.width+"px",
			left: inputPosition[0]+"px",
			top: inputPosition[1]+inputDimmensions.height+"px"
		});
		document.body.appendChild(div);
		
		this.resultReference = div;
	},
	
	moveUp: function(){
		if (this.currentItem > 0){
			this.currentItem--;
			this.selectItem(this.currentItem);
		}
	},
	
	moveDown: function(){
		if (this.currentItem < this.resultItems.length-1){
			this.currentItem++;
			this.selectItem(this.currentItem);
		}
	},
	
	
	selectItem: function(index){
		this.removeSelectClass();
		this.resultItems[this.currentItem].el.addClassName("spotlight-selected");
	},
	
	removeSelectClass: function(){
		for (var i=0; i<this.resultItems.length; i++){
			this.resultItems[i].el.removeClassName("spotlight-selected");
		}
	},
	
	showResult: function(){
		this.resultReference.removeClassName("spotlight-hidden");
		this.resultReference.addClassName("spotlight-visible");
	},
	
	hideResult: function(){
		this.resultReference.removeClassName("spotlight-visible");
		this.resultReference.addClassName("spotlight-hidden");
	}
}