
function iSelect(obj, userInput) {	
		
	iSelect.zIndex++;
	this.optionArrow = new Image();
	this.optionArrow.src = "images/opt_arrow.gif";
	
	this.optionArrow.iSelect = this;	
	this.options = new Array();
	this.selectedIndex = -1;
	this.value = "";
	this.disableOptions = false;
	
	if(!userInput) {
		this.enableInput = true;
	} else {
		this.enableInput = false;
	}
	
	this.defaultSelectedIndex = -1;
	this._inhibitBlur = false;
	
	this.baseName = "";
	
	
	this.maxHeight = 260;
	
	/* Events */
	
	this.events = new Object();
	
	this.events.onchange = null;
	this.events.onclick = null;
	
	this.eventsInhibit = true;
	this.eventsAllowTheSame = true;
	
	// i inne 
	
	this.previousInputValue = "";
	this.preserveFirst = 1; // Ilosc opcji zostajacych na poczatku 
	
	
	
	if(obj) {
		if(this.baseName == "") this.baseName = obj.name;
				
		switch(obj.tagName) {
			case "SELECT":
				this.setOnSelect(obj);
				
			break;
			
			case "INPUT":
				this.setOnInput(obj);
				
			break;
			
			default:
				throw("Params should be null, input or select html dom element");
				return false;
			break;
			
		}
	}	
}

iSelect.zIndex = 0; // zmianna static - iSelect ostatni będzie przykrywał wcześniejsze 

iSelect.prototype._setOptArrow = function() {
	
	this.input.parentNode.appendChild(this.optionArrow);
	this.input.parentNode.style.position = "relative";
	
	//this.optionArrow.className="help";
	
	this.optionArrow.style.position = "absolute";
	this.optionArrow.style.top = this.input.offsetTop+1 + 'px';
	
	//this.optionArrow.style.left = 0;
	
	this.optionArrow.style.left = this.input.offsetWidth - this.optionArrow.offsetWidth - 1 + 'px';
	
	//this.input.style.width = this.input.offsetWidth - this.optionArrow.offsetWidth;
	this.optionArrow.className = this.className;	
}

iSelect.prototype._setOptArrow2 = function() {
	this.optionArrow.style.textAlign = 'right';
	this.optionArrow.style.verticalAlign = 'top';
	this.optionArrow.style.display = 'inline';
	this.optionArrow.style.height = this.input.offsetHeight-5+'px';
	this.optionArrow.style.marginTop = 4+'px';
	this.optionArrow.style.borderTop = "none";
	this.optionArrow.style.cursor = "pointer";
	this.optionArrow.style.borderRight = "none";
	this.optionArrow.style.borderBottom = "none";
	
	this.container.appendChild(this.optionArrow);
	
	this.input.style.width = this.input.offsetWidth - this.optionArrow.offsetWidth + "px";
	this.optionArrow.style.position='relative';
	this.optionArrow.style.left = "-4px";
	if(window.addEventListener) {
		// FF
	
		this.optionArrow.style.top = "0px";
	} else {
		this.optionArrow.style.top = "1px";
	}
	
	this.optionArrow.className = this.className;			
}

iSelect.prototype._setOptBox = function() {
	
	this.optionBox = document.createElement("DIV");
	this.optionBox.style.position = 'absolute';
	this.optionBox.style.top = this.input.offsetHeight;
	this.optionBox.style.left = "0px";
	this.optionBox.style.backgroundColor ="#d4effc";
	this.optionBox.style.width = this.input.offsetWidth + this.optionArrow.offsetWidth +0 + "px";
	this.optionBox.style.borderTop = "none";
	this.optionBox.style.borderLeft = "#b1d1e7 1px solid";
	this.optionBox.style.borderRight = "#b1d1e7 1px solid";
	this.optionBox.style.borderBottom = "#b1d1e7 1px solid";
	this.optionBox.style.display = 'none';
	this.optionBox.style.textAlign = "left";
	this.optionBox.style.verticalAlign = "top";
	this.optionBox.className = this.className;
	
	
	//this.optionBox.style.zIndex = 1;
	
	this.optionBox.style.overflowY = 'auto';
	
	this.optionBox.style.zIndex = 100;
	
	this.container.appendChild(this.optionBox);
	
	this.optionContainer = document.createElement('TABLE');
	this.optionContainer.style.width="100%";
	this.optionContainer.style.height="0%";
	//this.optionContainer.style.border = "solid 1px red";
	this.optionBox.appendChild(this.optionContainer);
	
	this.optionBox.className = this.className;
	this.optionContainer.className = this.className;	
}

iSelect.prototype.fixBoxSize = function() {
	
	this._show();
	
	if(this.optionContainer.offsetHeight<this.maxHeight) {
		this.optionBox.style.height = this.optionContainer.offsetHeight + 'px';
	} else {
		this.optionBox.style.height = this.maxHeight + 'px';
	} 
	
	this._hide();
}

iSelect.prototype.addPosition = function(text, value, className) {
	if(!this.optionContainer) {
		throw("iSelect:addPosition no table defined");
		return false;
	}
	
	this.disableOptions = false;
	
	var current_option_idx = this.options.length;
	this.options[current_option_idx] = {
		"text": 	text,
		"TEXT":		text.toUpperCase(),
		"value": 	value,
		"DOM_textnode": null
	};
	
	var row = this.optionContainer.insertRow(-1);
	var cell = row.insertCell(-1);
	cell.style.verticalAlign = 'top';
	cell.style.textAlign = 'left';
	cell.style.padding = "1px 2px";
	cell.style.cursor = "pointer";
	cell.value = value;

	var node = document.createTextNode(text);
	cell.appendChild(node);
	cell.className = this.className+' '+className;
	
	this.options[current_option_idx]['DOM_textnode'] = node;
	
	//this.fixBoxSize(); - za wolno działa !!!
	
	if(window.addEventListener) {
	// FF
		cell.addEventListener('mouseover', doOver, false);
		cell.addEventListener('mouseout', doOut, false);
		cell.addEventListener('click', doClick, false);
	
	} else {
		row.attachEvent('onmouseover', doOver);
		row.attachEvent('onmouseout', doOut);
		row.attachEvent('onclick', doClick);
		row.attachEvent('onclick', doClick);
	}
	

	if(row.rowIndex == this.selectedIndex) {
		cell.style.backgroundColor = "#559";
		cell.style.color = "white";
	}
	
	
	
	
	var sel = this;
	
	function doOver() {
		//sel._inhibitBlur=true;
		cell.style.backgroundColor = "#559";
		cell.style.color = "white";
		
		if(
			sel.selectedIndex >=0 && 
			sel.optionContainer.rows[sel.selectedIndex] && 
			sel.optionContainer.rows[sel.selectedIndex]!=cell.parentNode
		) 
		{
			sel.optionContainer.rows[sel.selectedIndex].cells[0].style.backgroundColor = "";
			sel.optionContainer.rows[sel.selectedIndex].cells[0].style.color= "";
		}
	}
	
	function doOut() {
		//sel._inhibitBlur = false;
		cell.style.backgroundColor = "";
		cell.style.color = "";
		
	}
	
	function doClick(e) {
		sel._inhibitBlur = false;
		
		var fromElement;
		e['target'] ? fromElement = e['target']: fromElement = e['srcElement']
		
		sel._hide();
		sel.input.focus();
		sel._setValue(fromElement);
		
	}
	
	return row.rowIndex;
		
}

iSelect.prototype.changePositionText = function(idx, txt) {
	this.options[idx].text = txt;
	this.options[idx].DOM_textnode.nodeValue = txt;
	if(this.selectedIndex == idx) {
		this.input.value = txt;
	}
	
}


iSelect.prototype._setValue = function(element) {	
	if(element.tagName == 'TD') {
		element = element.parentNode;
	}
	
	this.setSelectedIndex(element.rowIndex);
	this._setIndexedValue();
}

iSelect.prototype._setIndexedValue = function() {
	if(this.options[this.selectedIndex]) {
		this.input.value = this.options[this.selectedIndex].text;
		this.inputSelected.value = this.options[this.selectedIndex].value;
	} else {
		//throw("_setIndexedValue: no suche index in options");
		this.inputSelected.value = '';
		return false;
	}	
	
	this.value = this.input.value;
	this._callHandler("onchange");
	
	// W IE sztuczne wywołanie onchange
	
	if(this.input.fireEvent) {
		this.input.fireEvent("onchange");
	}
	
	
}

iSelect.prototype._show = function() {
	if(this.disableOptions) return false;
	if(!this.optionBox) return false;
	this.optionBox.style.display = 'block';
	this.setSelectedIndex(this.selectedIndex);	
	
}


iSelect.prototype.setSelectedIndex = function(idx) {
	//alert('setSelectedIndex');
	for(var i=0; i<this.optionContainer.rows.length; i++) {
		this.optionContainer.rows[i].cells[0].style.backgroundColor = "";
		this.optionContainer.rows[i].cells[0].style.color= "";
	}
	this.selectedIndex = idx;
	
	if(this.selectedIndex >=0 && this.optionContainer.rows[this.selectedIndex]) {
		this.optionContainer.rows[this.selectedIndex].cells[0].style.backgroundColor = "#559";
		this.optionContainer.rows[this.selectedIndex].cells[0].style.color= "white";
	}
	
	this.optionBox.scrollTop = this.optionBox.scrollHeight*idx/this.options.length;	
}

iSelect.prototype.resetValue  = function() {
	this.setSelectedIndex(-1);
	this.value = "";
	this.input.value="";
}

iSelect.prototype.setSelectedIndexNext = function() {
	var idx = this.selectedIndex+1;
	if(idx >= this.options.length) {
		this.setSelectedIndex(this.options.length-1)
	} else {
		this.setSelectedIndex(idx);
	}
}

iSelect.prototype.setSelectedIndexPrevious = function() {
	var idx = this.selectedIndex - 1;
	if(idx<0) {
		this.setSelectedIndex(0);
	} else {
		this.setSelectedIndex(idx);
	}
}

iSelect.prototype._hide = function() {
	if(!this.optionBox) return false;
	this.optionBox.style.display = 'none';
}

iSelect.prototype._isBoxShow = function() {
	if(!this.optionBox) return false;
	if(this.optionBox.style.display == 'none') {
		return false;
	} else {
		return true;
	}
	
}
	
iSelect.prototype._setArrowControl = function() {
	if(window.addEventListener) {
		// FF
		this.optionArrow.addEventListener('click', doClick, false);
		this.optionArrow.addEventListener('blur', doBlur, false);
		this.input.addEventListener('blur', doBlur, false);
		
		this.optionBox.addEventListener('mouseover', doOverBox, false);
		this.optionBox.addEventListener('mouseout', doOutBox, false);
		
	} else {
		this.optionArrow.attachEvent('onclick', doClick);	
		this.optionArrow.attachEvent('onblur', doBlur);
		
		this.optionBox.attachEvent('onmouseover', doOverBox);
		this.optionBox.attachEvent('onmouseout', doOutBox);
		
		
		this.optionBox.attachEvent('onclick', doClickBox);
		
		this.input.attachEvent('onblur', doBlur);
	}
	
	var sel = this;
	function doClick(e) {
		if(sel._isBoxShow()) {
			sel._hide();
		} else {
			sel._show();
			sel.input.focus();
		}
		
	}
	
	function doBlur(e) {
		if(sel._inhibitBlur) { 
			return true;
		}
		var fromElement;
		e['target'] ? fromElement = e['target']: fromElement = e['srcElement'];
		
		sel._hide();
		sel.value = sel.input.value;
		//sel._callHandler("onchange");
		
	}
	
	function doOverBox(e) {
		sel._inhibitBlur = true;
	}
	
	function doOutBox(e) {
		sel._inhibitBlur = false;
		//sel.input.focus();
	}
	
	function doClickBox(e) {
		sel._inhibitBlur = false;
	}
	
}

iSelect.prototype._prepareInputKeys = function() {
	
	// keyUp , keyPress keyDown , reakcje zarówno na strzałki jak i na pisanie ....
	
	var sel = this;
	if(window.addEventListener) {
	// FF
		this.input.addEventListener("click", doClick, false)	
		this.input.addEventListener("keyup", doKeyUp, false);
		this.input.addEventListener("keypress", doKeyPress, false);
		
		this.input.onkeypress = function(e) {
			var code = e.witch ? e.witch : e.keyCode;
			if(!sel.enableInput) { 
				
				if(code == 9) { 
					//trace("TAB");
				} else {
					return false;
				}
			}
			
			
			switch(code) {
				case 13:
					return false;
				break;
				
				case 40:
				case 38:
					return false;
				break;
				
				case 27:
					
					//sel.input.value = sel.enteredValue;
					//sel._hide();
					//trace(sel.enteredValue);
				break;
				
			}
		}
		
	} else {
	// IE
		this.input.attachEvent("onkeyup", doKeyUp);
		this.input.attachEvent("onclick", doClick);
		
		this.input.onkeypress = function(e) {
			
			var code = window.event.keyCode;
			//trace("x: " + code);
			switch(code) {
				case 13:
					if(sel._isBoxShow()) {
						sel._setIndexedValue();
						sel._hide();
					}
					return false;
				break;
				
				case 40:
				case 38:
					return false;
				break;
				
				case 27:
					if(sel.defaultSelectedIndex >-1) {
						sel.setSelectedIndex(sel.defaultSelectedIndex);
						sel._setIndexedValue();
					} else {
						sel.input.value = sel.enteredValue;
						sel._hide();
					}
				break;
				
			}
		}		
	}
	
	
	
	
	function doKeyUp(e) {
		if(window.event) {
			var code = window.event.keyCode;
			
		} else {
			var code = e.witch ? e.witch : e.keyCode;
		}
			
		if((code>47 && code<58) || (code>64 && code<98)) {
			sel._doSelectHint();
		} else {
			if(window.event) {
				switch(code) {
					case 40:
						if(!sel._isBoxShow()) 
							sel._show();
						else 
							sel.setSelectedIndexNext();
					break;
			
					case 38:
						if(sel._isBoxShow()) 
							sel.setSelectedIndexPrevious();
					break;
					
				}
			} else {
				// FF
				switch(code) {
					case 27:
						if(sel.defaultSelectedIndex) {
							sel.setSelectedIndex(sel.defaultSelectedIndex);
							sel._setIndexedValue();
						} else if(sel.enteredValue) {
							sel.input.value = sel.enteredValue;
							sel._hide();
						} else {
							sel.setSelectedIndex(0);
							sel._setIndexedValue();
							sel._hide();							
						}
					break;
				}
			}
		}
	}
	
	function doClick(e) {
		sel._doSelectHint();
	}
	
	function doKeyPress(e) {
		
		if(window.event) {
			var code = window.event.keyCode;
		} else {
			var code = e.witch ? e.witch : e.keyCode;
		}
		
		switch(code) {
			case 40:
				if(!sel._isBoxShow()) 
					sel._show();
				else 
					sel.setSelectedIndexNext();
			break;
			
			case 38:
			if(sel._isBoxShow()) 
				sel.setSelectedIndexPrevious();
			break;
			
			case 13:
				if(sel._isBoxShow()) {
					sel._setIndexedValue();
					sel._hide();
				}
			break;
			
			case 27:
				//sel.input.value = sel.enteredValue;
				//sel._hide();
			break;
			
			default:
				//sel._doSelectHint();
		}
		
	}
		
	
}

iSelect.prototype._doSelectHint = function() {
	var inpText = this._getInputTypedString();
	var idx = this.findByText(inpText.startText);
	if(idx!==false) {
		this._showOn(idx);
	} else {
		this.setSelectedIndex(-1);
		this._setIndexedValue();
		this._hide();
	}
		
}

iSelect.prototype._getInputTypedString = function() {
	
	if(this.input.selectionStart) {
		// FF
		var start = this.input.selectionStart;
		var end = this.input.selectionEnd;
			
	} else if(document.selection) {
		// IE
		this.input.focus();
		var range = document.selection.createRange();
		// Start == End
				
		var txt = "";
		var start = 0;			
		while(true) {
			range.moveStart("character", -1);
			if(txt == range.text) break;
			txt = range.text;
			start++;
		}
		

		range.moveStart("character", start);
			
		var txt = "";
		var end=0;
		while(true) {
			
			range.moveEnd("character", 1);
			if(txt == range.text) break;
			txt = range.text;
			end++;
		}
		end = this.input.value.length - end;
		range.moveEnd("character", end);
			
				
	} else {
		// ?? :(
	}
	
	// get startText, selText and endText
	var startText = this.input.value.substr(0,start);
	var selText = this.input.value.substr(start,end-start);
	var endText = this.input.value.substr(end);
	//trace(startText + ' - ' + selText + ' - ' + endText);
	
	return {
		"startText": 	startText,
		"selText": 		selText,
		"endText":		endText,
		"start":		start,
		"end":			end
	}
}

iSelect.prototype.findByText = function(text) {
	var TEXT = text.toUpperCase();
	for(var i=0; i<this.options.length; i++) {
		if(this.options[i].TEXT.substr(0, text.length) == TEXT) return i;
	}
	return false;
}



iSelect.prototype._showOn = function(idx) {
	this.optionBox.scrollTop = this.optionBox.scrollHeight*idx/this.options.length;
	this.setSelectedIndex(idx);
	this._show();
}


iSelect.prototype.setOnInput = function(oInput) {
	this.input = oInput; 
	this.input.contentEditable = this.enableInput;
	//this.input.disabled = !this.enableInput;
	//this.input.style.zIndex = 1;
	this.container = this.input.parentNode;
	this.container.style.position = "relative";	
	
	this.container.style.zIndex = iSelect.zIndex;
	
	//this.container.style.zIndex =  100;
	
	this._setOptArrow2(0,0);
	this._setOptBox();
	this._setArrowControl();
	this.className = this.input.className;
	
	this.inputSelected = document.createElement("INPUT");
	this.inputSelected.type = "hidden";
	
	if(this.enableInput) {
		this.inputSelected.name = this._addSelSufix(this.baseName);
	} else {
		this.inputSelected.name = this.baseName;
		}
	
	this.container.appendChild(this.inputSelected);	
	this._prepareInputKeys();
	this.value = this.input.value;
		
}

iSelect.prototype._addSelSufix = function(str) {
	var re = new RegExp(/(.*)\[(.*)\]$/);
	
	if(str.match(re)) {
		return RegExp.$1 + '[' + RegExp.$2 +'_sel' +']';
	} else {
		return str + "_sel";
	}	
}


iSelect.prototype.setOnSelect = function(oSelect) {
	if(!oSelect || typeof oSelect != 'object' || oSelect.tagName != "SELECT") {
		//throw("setOnSelect param must be a html dom select tag");
		return false;	
	}
	
	this.input = document.createElement("INPUT");
	this.input.type = "text";
	oSelect.parentNode.appendChild(this.input);
	if(this.enableInput) {
		this.input.name = this.baseName;
	} else {
		this.input.name = this._addSelSufix(this.baseName);
	}
	
	this.input.className = oSelect.className;
	this.input.contentEditable = this.enableInput;
	this.input.tabIndex = oSelect.tabIndex;
	
	
	//this.input.disabled = !this.enableInput;
	this.setOnInput(this.input);	
	this.addFromSelect(oSelect);
	
	
	this.grabHandlers(oSelect);
	
	oSelect.parentNode.removeChild(oSelect);
	
	if(oSelect.title && oSelect.title !="") {
		this.enteredValue = oSelect.title;
		this.input.value =  oSelect.title;
	} else {
		this._setIndexedValue();
	}

	this.previousInputValue = this.input.value;
	this.eventsInhibit = false;	
	this.fixBoxSize();
	
	
}

iSelect.prototype.addFromSelect = function(oSelect) {
	
	if(!oSelect.options[0]) { 
		this.disableOptions = true;
		return false;
	}
	if(oSelect.options[0].title == "user") {
		this.enteredValue = oSelect.options[0].childNodes[0].nodeValue;
		var i=1;
	} else {
		var i=0;
	}
	for( ; i<oSelect.options.length; i++) {
		var rowIndex = this.addPosition(oSelect.options[i].childNodes[0].nodeValue, oSelect.options[i].value, oSelect.options[i].className);
		if(oSelect.options[i].selected) {			
			this.setSelectedIndex(rowIndex);
			this.defaultSelectedIndex = rowIndex;
		}
	}
}

iSelect.prototype.grabHandlers = function(oSrc) {
	for(ev in this.events) {
		if(oSrc[ev]) {
			this.events[ev] = oSrc[ev];
		}
	}	
}


iSelect.prototype._callHandler = function(handler) {
	if(this.eventsInhibit) return false;
	
	if(this.events[handler]) {
		switch(handler) {
			case "onchange":
				if(this._checkChange() || this.eventsAllowTheSame) {
					this.enteredValue = this.input.value; 
					this.events[handler]('xxxx');
				}
			break;
			
			default:
				this.events[handler](this);
			break;
		}
	}
}

iSelect.prototype._checkChange = function() {
	if(this.input.value != this.previousInputValue) { 
		this.previousInputValue = this.input.value;
		return true;
	}
	
	return false;
	
}


iSelect.prototype.clearOptions = function() {
	this.selectedIndex = -1;
	
	while(this.optionContainer.rows.length>this.preserveFirst) {
		this.optionContainer.deleteRow(-1);
		this.options.pop();
	}
	
	//this.options = new Array();
	this.input.value = "";
	this.setSelectedIndex(this.preserveFirst-1);
	this._setIndexedValue();
	this.disableOptions = true;
		
}

// OPCJE INTEGRACJI Z BAZĄ WYRAŻEŃ UMIEŚCIY W SELEKCIE 


iSelect.prototype.createOptions = function(xDoc) {
	
	
	if(xDoc == null) {
		var list = null;
	} else {
		var list = new PhrasesList(xDoc);
	}
	
	this.clearOptions();
	this.resetValue();
	if(!list || !list.islist || list.itemsNumber==0) {
		// Brak listy
		this.setSelectedIndex(this.preserveFirst-1);
		this._setIndexedValue(); 
		return 0;
	} else {
		// Jest lista
		
	}	

	for(var i=0; i<list.itemsNumber; i++) {
		var ldata = list.getNthItem(i);
		trace(ldata.phrase + ' ' + ldata.src);
		this.addPosition(ldata.phrase, ldata.prog, ldata.src=='user' ? 'mark' : '');
	}
	
	
	this.fixBoxSize();
	this.disableOptions = false;
	this.setSelectedIndex(this.preserveFirst-1);
	this._setIndexedValue();
}	


