// Classes for the link and the visible dropdown
var eS_selectclass = 'enhance'; 				// class to identify selects
var eS_boxclass = 'selectparent'; 				// parent element
var eS_triggeron = 'enhancedtriggeractive'; 	// class for the active trigger link
var eS_triggeroff = 'enhancedtrigger';			// class for the inactive trigger link
var eS_dropdownclosed = 'dropdownreplacement'; 	// closed dropdown
var eS_dropdownopen = 'enhanceddropdownvisible';// open dropdown

var eS_listclass = 'turnintoselect';			// class to identify ULs

function enhanceSelect()
{
/*
	Turn all selects into DOM dropdowns
*/
	var sels, i, hiddenfield, j, trigger, replaceUL, newli, newa, uls, newform, newselect, newopt, selectedOpt;
	var count = 0;
	var toreplace = new Array();
	var replaceULs = new Array();

	sels = document.getElementsByTagName('select');
	for (i = 0; i < sels.length; i++)
	{
		if (checkClass(sels[i], eS_selectclass))
		{
			for (j = 0; j < sels[i].getElementsByTagName('option').length; j++)
			{
				if (sels[i].getElementsByTagName('option')[j].selected)
				{
					selectedOpt = j;
					break;
				}
			}

			hiddenfield = document.createElement('input');
			hiddenfield.name = sels[i].name;
			hiddenfield.type = 'hidden';
			hiddenfield.id = sels[i].id;
			hiddenfield.value = sels[i].options[selectedOpt].value;
			sels[i].parentNode.insertBefore(hiddenfield, sels[i])
			trigger = document.createElement('a');
			trigger.href = '#';
			trigger.className = eS_triggeroff;
			trigger.onclick = function(){eS_showSel(this);return false;}
			trigger.appendChild(document.createTextNode(sels[i].options[selectedOpt].text));
			sels[i].parentNode.insertBefore(trigger,sels[i]);
			replaceUL=document.createElement('ul');
						
			for (j = 0; j < sels[i].getElementsByTagName('option').length; j++)
			{
				newli = document.createElement('li');
				newa = document.createElement('a');
				newa.href = '#';
				newli.v = sels[i].getElementsByTagName('option')[j].value;
				newli.elm = hiddenfield;
				newli.istrigger = trigger;
				newa.appendChild(document.createTextNode(
				sels[i].getElementsByTagName('option')[j].text));
				newli.onclick = function(){ 
					var txt=this.getElementsByTagName('a')[0].firstChild.nodeValue;		
					eS_setVal(this.v,this.elm,this.istrigger,txt);return false;
					}
				newli.appendChild(newa);
				replaceUL.appendChild(newli);
			}
			
			replaceUL.className = eS_dropdownclosed;
			toreplace[count] = sels[i];
			replaceULs[count] = replaceUL;
			count++;
		}
	}
	
	for (i = 0; i < count; i++)
	{
		var div = document.createElement('div');
		div.appendChild(replaceULs[i]);
		div.className = eS_boxclass;
		toreplace[i].parentNode.insertBefore(div,toreplace[i])
		toreplace[i].parentNode.removeChild(toreplace[i])
	}
	
/*
	Turn all ULs with the class defined above into dropdown navigations
*/	
	count = 0;
	toreplace.length = 0;
	replaceULs.length = 0;

	uls = document.getElementsByTagName('ul');
	for (i = 0; i < uls.length; i++)
	{
		if (checkClass(uls[i], eS_listclass))
		{
			newform = document.createElement('form');
			newselect = document.createElement('select');
			alla = uls[i].getElementsByTagName('a');
			for (j = 0; j < alla.length; j++)
			{
				newopt=document.createElement('option');
				newopt.setAttribute('value', alla[j].href);	
				newopt.appendChild(document.createTextNode(alla[j].innerHTML));	
				newselect.appendChild(newopt);
			}
			newform.appendChild(newselect);
			replaceULs[count] = newform;
			toreplace[count] = uls[i];
			count++;
		}
	}
	for (i = 0; i < count; i++)
	{
		toreplace[i].parentNode.insertBefore(replaceULs[i], toreplace[i])
		toreplace[i].parentNode.removeChild(toreplace[i])
		replaceULs[i].getElementsByTagName('select')[0].onchange = function()
			{
				self.location = this.options[this.selectedIndex].value;
			}
	}
}

/*
	Show or hide the replacement UL
*/
function eS_showSel(o){
	var drop = o.parentNode.getElementsByTagName('ul')[0];
	
	if (checkClass(o, eS_triggeron))
	{
		juggleClass(o, eS_triggeron, 0)
		juggleClass(o, eS_triggeroff, 1)
		juggleClass(drop, eS_dropdownopen, 0)
	}
	else
	{
		if (o.getElementsByTagName('span')[0])
		{
			o.removeChild(o.getElementsByTagName('span')[0]);
		}
		
		juggleClass(o, eS_triggeroff, 0);
		juggleClass(o, eS_triggeron, 1);
		juggleClass(drop, eS_dropdownopen, 1);
	}
}

/*
	Set the value when a link in the UL gets clicked
*/
function eS_setVal(val,el,o,txt)
{
	el.value = val;
	o.firstChild.nodeValue = txt;
	eS_showSel(o);
}

// Help functions to check for a class and to add or remove a class
function juggleClass(o,c,s)
{
	o.className = s == 1 ? o.className + ' ' + c : o.className.replace(' ' + c, '');	
}
function checkClass(o,c)
{
	var re = new RegExp('\\b' + c + '\\b');
	
	return re.test(o.className);
}

// Check if DOM is avaiable, and if so, start enhanceSelect
if (document.getElementById && document.createTextNode)
{
	window.onload = enhanceSelect;
}