var hg_legordulok = [], legordulok_bezar;

var dcE = function(str) { return d.createElement(str); };

function Legordulo(os) {
	var self = this;
	this.tarto = null;
	this.beallitasok = {
		normal		: false,
		over			: false,
		aktiv			: false,
		urlek			: false,
		szelesseg	: false,
		maxelem		: 8,

		kiegeszit	: true,
		karakter	: 10,
		befejezes	: '...',
		magassag	: 19,

		felirat		: true
	};

	this.szulo = $(os);
	this.szuloszelesseg = this.szulo.offsetWidth;
	this.menupontok = null;
	this.aktualis = 0;
	this.azonosito = 'legordulo_' + os;
	this.kijelolt = null;
	this.nyitva = false;

	var konstruktor = function(parameterek) {
		self.szulo_beolvas();

		if (parameterek.length == 2) {
			var initobject = parameterek[1];
			for (var i in initobject) {
				self.beallitasok[i] = initobject[i];
			}
		}

		self.letrehoz();
	}(arguments);
}



Legordulo.prototype.allapotsor = function() {
	window.status = '';
	return true;
}
Legordulo.prototype.legordulok_bezar = function() {
	for (var i = 0; i < hg_legordulok.length; i++) {
		if (hg_legordulok[i].nyitva) {
			hg_legordulok[i].bezar();
		}
	}
}
Legordulo.prototype.bill = function(e) {
	var esemeny = (!e) ? window.event : e;
	var targ, kod;

	if (esemeny.target) {
		targ = esemeny.target;
	}
	else if (esemeny.srcElement) {
		targ = esemeny.srcElement;
	}
	if (targ === undefined) {
		return false;
	}
	if (targ.id == this.azonosito) {
		targ = $('a_' + this.azonosito);
	}
	if (esemeny.keyCode) {
		kod = esemeny.keyCode;
	}
	else if (esemeny.which) {
		kod = esemeny.which;
	}
	if (kod === undefined) {
		return false;
	}
	targ.obj.elemfokusz(kod);
	return true;
}

Legordulo.prototype.ertek_beallit = function(cim) {
	var _obj;
	if (this.beallitasok.kiegeszit) {
		var _jo = false;
		var _poz = this.beallitasok.karakter;
		var _utolsojo = _poz;
		_obj = $('teszt_a_' + this.azonosito);
		_obj.style.display = 'inline';
		var _elsoproba = true;
		var _str = cim;
		while (_jo === false) {
			if (!_elsoproba) {
				_str = cim.substr(0, _poz) + this.beallitasok.befejezes;
			}
			_obj.childNodes[0].nodeValue = _str;
			if (_obj.offsetHeight > this.beallitasok.magassag) {
				_poz--;
				if (_poz === 0) {
					_jo = true;
				}
				if (_poz == _utolsojo) {
					_str = cim.substr(0, _poz) + this.beallitasok.befejezes;
					_jo = true;
				}
				_elsoproba = false;
				continue;
			}
			if (_obj.offsetWidth <= this.szuloszelesseg) {
				_utolsojo = _poz;
				_poz++;
				if (_elsoproba) {
					break;
				}
			}
			if (_obj.offsetWidth > this.szuloszelesseg) {
				if (_poz == (_utolsojo + 1)) {
					_jo = true;
				}
				else {
					_poz--;
				}
			}
			_elsoproba = false;
			if (_poz === 0) {
				_jo = true;
			}
		}
		_obj.style.display = 'none';
		_obj = $('a_' + this.azonosito);
		_obj.childNodes[0].nodeValue = _str;
	}
	else {
		_obj = $('a_' + this.azonosito);
		_obj.childNodes[0].nodeValue = cim;
	}
}

Legordulo.prototype.letrehoz = function() {
	var ak = [], i, j = 0;

	this.onchange = this.szulo.onchange;
	this.szulo.onchange = null;
	var div_tarto = dcE('div');
	div_tarto.id = this.azonosito;
	div_tarto.style.zIndex = 9000 - hg_legordulok.length;
	div_tarto.style.width = this.szuloszelesseg + 'px';
	this.tarto = div_tarto;
	this.stilusvalt({stilus: 'normal'});

	var div_balszel = dcE('div');
	div_balszel.className = 'balszel';
	var div_kozep = dcE('div');
	div_kozep.className = 'kozep';
	div_kozep.id = 'kozep_' + this.azonosito;
	var div_jobbszel = dcE('div');
	div_jobbszel.className = 'jobbszel';

	var a = dcE('a');
	a.href = '#';
	a.obj = this;
	a.hideFocus = true;
	a.id = 'a_' + this.azonosito;
	a.className = 'blokk';
	a.onclick = function() {
		this.obj.stilusell(true);
		this.obj.stilusvalt({stilus: 'aktiv'});
		this.obj.kinyitbezar();
		return false;
	};
	a.onfocus = a.onmouseover = this.allapotsor;
	a.ondragstart = null;
	if (this.beallitasok.over !== false) {
		a.onmouseover = function() { this.obj.stilusvalt({stilus: 'over'}); this.obj.allapotsor(); return true; };
		a.onmouseout = function() { this.obj.stilusvalt({stilus: 'normal'}); return true; };
	}
	a.appendChild(document.createTextNode(this.menupontok[this.aktualis][1]));
	ak[ak.length] = a;

	var ul = dcE('ul');
	ul.className = 'legordulo_nemlatszik';
	ul.id = 'ul_' + this.azonosito;
	if (this.beallitasok.szelesseg !== false) {
		ul.style.width = this.beallitasok.szelesseg + 'px';
	}

	div_tarto.appendChild(div_balszel);
	div_tarto.appendChild(div_kozep);
	div_tarto.appendChild(div_jobbszel);
	div_tarto.appendChild(a);
	div_tarto.appendChild(ul);

	this.szulo.style.position = 'absolute';
	this.szulo.style.display = 'none';
	this.szulo.style.visibility = 'hidden';
	this.szulo.parentNode.insertBefore(div_tarto, this.szulo.nextSibling);
	hg_legordulok[hg_legordulok.length] = this;

	if (this.beallitasok.kiegeszit) {
		a = dcE('a');
		a.href = '#';
		a.className = 'blokk legordulo_nemlatszik';
		a.style.display = 'none';
		a.id = 'teszt_a_' + this.azonosito;
		a.appendChild(document.createTextNode(this.menupontok[this.aktualis][1]));
		ak[ak.length] = a;
		var div_teszt = dcE('div');
		div_teszt.style.position = 'absolute';
		div_teszt.style.background = 'none';
		div_teszt.appendChild(a);
		div_tarto.appendChild(div_teszt);
	}
	var szelesseg = this.szuloszelesseg - stilusertek(ak[0], 'paddingLeft', 'padding-left', true) - stilusertek(ak[0], 'paddingRight', 'padding-right', true) - stilusertek(ak[0], 'marginLeft', 'margin-left', true) - stilusertek(ak[0], 'marginRight', 'margin-right', true) + 'px';
	div_kozep.style.width = szelesseg;
	for (i = 0; i < ak.length; i++) {
		ak[i].style.width = szelesseg;
	}

	this.menupontok_letrehoz(ul);
	this.ertek_beallit(this.menupontok[this.aktualis][1]);

	if (this.beallitasok.maxelem !== false && this.szulo.options.length > this.beallitasok.maxelem && ul.style.overflow === '') {
		var magassag = 0;
		var elemek = ul.getElementsByTagName('a');
		j = 0;
		for (i in elemek) {
			if (elemek[i].offsetHeight !== undefined) {
				magassag += elemek[i].offsetHeight;
				j++;
				if (j == this.beallitasok.maxelem) {
					break;
				}
			}
		}
		ul.style.overflow = 'auto';
		ul.style.height = magassag + 'px';
	}
	if (this.beallitasok.szelesseg === false) {
		ul = $('ul_' + this.azonosito);
		a = $('a_' + this.azonosito);
		ul.style.width = (a.offsetWidth - 2) + 'px';
	}
}

Legordulo.prototype.menupontok_letrehoz = function(ul) {
	var j = 0, li;

	for (var i in this.menupontok) {
		if (i >= 0) {
			li = dcE('li');
			li.appendChild(this.ujmenupont(this.menupontok[i], j));
			ul.appendChild(li);
			j++;
		}
	}
}

Legordulo.prototype.ujmenupont = function(ertekek, szam) {
	var cim = ertekek[1];
	var ertek = ertekek[0];
	var a = dcE('a');
	a.href = (this.beallitasok.urlek) ? ertek : '#';
	a.hideFocus = true;
	a.obj = this;
	a.cim = cim;
	a.ertek = ertek;
	a.szam = szam;
	a.disabled = ertekek[2];
	if (!this.beallitasok.urlek) {
		a.onfocus = a.onmouseover = this.allapotsor;
		a.onclick = function() { if (!this.disabled) { this.obj.ertek_atad(this); } return false; };
	}
	a.ondragstart = null;
	a.appendChild(d.createTextNode(cim));
	return a;
}

Legordulo.prototype.szulo_beolvas = function() {
	this.menupontok = [];
	for (var i = 0; i < this.szulo.options.length; i++) {
		if (i === 0 || this.szulo.options[i].selected) {
			this.aktualis = i;
		}
		this.menupontok[this.menupontok.length] = [this.szulo.options[i].value, this.szulo.options[i].text, this.szulo.options[i].disabled];
	}
};

Legordulo.prototype.elemfokusz = function(kod) {
	if (kod == 27) {
		this.bezar();
	}
	var karakter = String.fromCharCode(kod).toLowerCase();
	var megvan = false;
	for (var i = 0; i < this.szulo.options.length; i++) {
		if (this.szulo.options[i].text.charAt(0).toLowerCase() == karakter) {
			megvan = i;
			break;
		}
	}
	if (megvan !== false) {
		if (this.kijelolt !== null) {
			this.kijelolt.className = '';
			this.kijelolt.onmouseover = null;
		}
		var elem = $('ul_' + this.azonosito).getElementsByTagName('a')[megvan];
		elem.scrollIntoView();
		elem.className = 'kijelolt';
		elem.onmouseover = function() {
			this.className = '';
			this.onmouseover = null;
		};
		this.kijelolt = elem;
	}
};

Legordulo.prototype.menupontok_frissit = function() {
	var ul = $('ul_' + azonosito), a;

	while (undefined !== (a = ul.getElementsByTagName('a')[0])) {
		a.click = a.onfocus = a.ondragstart = null;
		ul.removeChild(a.parentNode);
	}
	this.szulo_beolvas();
	this.menupontok_letrehoz(ul);
	this.ertek_beallit(this.menupontok[this.aktualis][1]);
};

Legordulo.prototype.stilusvalt = function(parameterek) {
	if (this.beallitasok[parameterek.stilus] !== false) {
		this.tarto.className = 'legordulo ' + this.beallitasok[parameterek.stilus];
	}
};

Legordulo.prototype.stilusell = function(bekapcsol) {
	if (!this.beallitasok.over || (bekapcsol && this.tarto.className != 'legordulo ' + this.beallitasok.over)) {
		return false;
	}
	var _obj = $(this.azonosito).getElementsByTagName('a')[0];
	if (bekapcsol) {
		_obj.onmouseout_bizt = _obj.onmouseout;
		_obj.onmouseout = null;
		_obj.onmouseover_bizt = _obj.onmouseover;
		_obj.onmouseover = null;
	}
	else {
		_obj.onmouseout = _obj.onmouseout_bizt;
		_obj.onmouseover = _obj.onmouseover_bizt;
		this.stilusvalt({stilus: 'normal'});
	}
	return true;
};

Legordulo.prototype.kinyitbezar = function() {
	if (this.nyitva) {
		this.bezar();
	}
	else {
		this.kinyit();
	}
};
Legordulo.prototype.kinyit = function() {
	this.nyitva = true;
	$('ul_' + this.azonosito).className = 'legordulo_latszik';
	legordulok_bezar = this.legordulok_bezar;
	setTimeout(function() { document.getElementsByTagName('body')[0].onclick = legordulok_bezar; }, 20);
	document.onkeydown = this.bill;
};
Legordulo.prototype.bezar = function() {
	document.onkeydown = null;
	this.nyitva = false;
	$('ul_' + this.azonosito).className = 'legordulo_nemlatszik';
	document.getElementsByTagName('body')[0].onclick = null;
	this.stilusell(false);
};

Legordulo.prototype.ertek_atad = function(obj) {
	this.ertek_beallit(obj.cim);
	this.ertek = obj.ertek;
	this.szulo.selectedIndex = obj.szam;
	this.bezar();
	if (this.onchange !== null && typeof(this.onchange) == 'function') {
		this.onchange();
	}
};
