var _forms = [];
var inputs = new Array();
var selects = new Array();
var radios = new Array();
var checkboxes = new Array();
var buttons = new Array();
var selects = new Array();
var all_selects = false;
var active_select = null;
var agt = navigator.userAgent.toLowerCase();
//this.ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var isMac = is_mac();
var selectText = "please select";


var _timeouts = [];
var _stimeout = 500;

var IN_CFORMS = true;

var _heightSelect = 22;
var _border = 1;

function is_mac() {
	if (navigator.appVersion.indexOf("Safari") != -1)
	{
		if(!window.getComputedStyle)
		{
   			return true;
  		}
	}
	return false;
}

function init() {
	if(!document.getElementById) {return false;}
	getElements();
	separateElements();
	//replaceSelects();
	//replaceRadios();
	//replaceButtons();
	//replaceCheckboxes();
}

// getting all the required elements
function getElements() {
	for (var nf = 0; nf < document.getElementsByTagName("form").length; nf++) {
		for(var nfi = 0; nfi < document.forms[nf].getElementsByTagName("input").length; nfi++) {
			var tmp = document.forms[nf].getElementsByTagName("input")[nfi];
			if (!tmp.replaced)
			{
				inputs.push(tmp);
			}
		}
		for(var nfs = 0; nfs < document.forms[nf].getElementsByTagName("select").length; nfs++) {
			var tmp = document.forms[nf].getElementsByTagName("select")[nfs];
			if (!tmp.replaced)
			{
				selects.push(tmp);
			}
		}
	}
}

// separating all the elements in their respective arrays
function separateElements() {
	var r = 0; var c = 0; var t = 0; var rl = 0; var cl = 0; var tl = 0; var b = 0;
	for (var q = 0; q < inputs.length; q++) {
		if(inputs[q].type == "radio" && !inputs[q].replaced) {
			radios[r] = inputs[q]; ++r;
		}
		if(inputs[q].type == "checkbox" && !inputs[q].replaced) {
			checkboxes[c] = inputs[q]; ++c;
		}
		if(((inputs[q].type == "submit") || (inputs[q].type == "button")) && !inputs[q].replaced) {
			buttons[b] = inputs[q]; ++b;
		}
	}
}

//replacing selects
function replaceSelects() {
	for(var q = 0; q < selects.length; q++) {
	if (!selects[q].replaced && selects[q].offsetWidth)
	{
		selects[q]._number = q;
			//create and build div structure
			var selectArea = document.createElement("div");
		
			var left = document.createElement("span");
			left.className = "left";
			selectArea.appendChild(left);
		
			var disabled = document.createElement("span");
			disabled.className = "disabled";
			selectArea.appendChild(disabled);
		
			selects[q]._disabled = disabled;
		
			var center = document.createElement("span");
			var button = document.createElement("a");
			var text = document.createTextNode(selectText);
			center.id = "mySelectText"+q;
			center.id = "mySelectText"+q;
			center._q = q;

		
			var stWidth = selects[q].offsetWidth;
			selectArea.style.width = stWidth + "px";

			button.href = "javascript:showOptions("+q+")";
			button.onkeydown = selectEvent;
			button.className = "selectButton";
			button._q = q;
			selectArea.className = "selectArea";
			selectArea.className += " " + selects[q].className;
			selectArea.id = "sarea"+q;
			center.className = "center";
			center.appendChild(text);
			selectArea.appendChild(center);
			selectArea.appendChild(button);
		
			//hide the select field
			selects[q].className += " outtaHere";
			//insert select div
			selects[q].parentNode.insertBefore(selectArea, selects[q]);
			//build & place options div

			var optionsDiv = document.createElement("div");
		
			var optionsList = document.createElement("ul");
			optionsDiv.appendChild(optionsList);
		
			selects[q]._options = optionsList;
	
			optionsDiv.style.width = stWidth - (_border*2) + "px";
			optionsDiv._parent = selectArea;
		
			optionsDiv.className = "optionsDivInvisible";
			optionsDiv.id = "optionsDiv"+q;
			optionsDiv._q = q

			
			optionsDiv.onmouseover = function()
		{
			if(_timeouts[this._q])
			{
				clearTimeout(_timeouts[this._q]);
			}
		}
		optionsDiv.onmouseout = function()
		{
			_elem = document.getElementById("optionsDiv"+this._q);
			if(_elem && _elem.className != "optionsDivInvisible")
				_timeouts[this._q] = setTimeout('showOptions(' + this._q + ')',_stimeout);
		}

		button.onmouseover = optionsDiv.onmouseover;
		button.onmouseout = optionsDiv.onmouseout;
		center.onmouseover = optionsDiv.onmouseover;
		center.onmouseout = optionsDiv.onmouseout;

	
			populateSelectOptions(selects[q]);	
			//selectArea.appendChild(optionsDiv);
			document.getElementsByTagName("body")[0].appendChild(optionsDiv);
			selects[q].replaced = true;
		}
	}
	all_selects = true;
}

//collecting select options
function populateSelectOptions(me) {
	me._options.innerHTML = "";
	
	for(var w = 0; w < me.options.length; w++) {
		
		var optionHolder = document.createElement('li');
		var optionLink = document.createElement('a');
		var optionTxt = document.createTextNode(me.options[w].text);
		
		optionLink.href = "javascript:showOptions("+me._number+"); selectMe('"+me.id+"',"+w+","+me._number+");";
		optionLink.appendChild(optionTxt);
		optionHolder.appendChild(optionLink);
		me._options.appendChild(optionHolder);
		//check for pre-selected items
		if(me.options[w].selected) {
			selectMe(me.id,w,me._number);
		}
	}
	if (me.disabled) {
		me._disabled.style.display = "block";
	}
	else {
		me._disabled.style.display = "none";
	}
}

//select event
function selectEvent(e) {
	if (!e) var e = window.event;
	var thecode = e.keyCode;
	switch(thecode){
		case 40: //down
			var fieldId = this.parentNode.parentNode.id.replace(/sarea/g, "");
			var linkNo = 0;
			for(var q = 0; q < selects[fieldId].options.length; q++) {if(selects[fieldId].options[q].selected) {linkNo = q;}}
			++linkNo;
			if(linkNo >= selects[fieldId].options.length) {linkNo = 0;}
			selectMe(selects[fieldId].id, linkNo, fieldId);
			break;
		case 38: //up
			var fieldId = this.parentNode.parentNode.id.replace(/sarea/g, "");
			var linkNo = 0;
			for(var q = 0; q < selects[fieldId].options.length; q++) {if(selects[fieldId].options[q].selected) {linkNo = q;}}
			--linkNo;
			if(linkNo < 0) {linkNo = selects[fieldId].options.length - 1;}
			selectMe(selects[fieldId].id, linkNo, fieldId);
			break;
		default:
			break;
	}
}

//selecting me
function selectMe(selectFieldId,linkNo,selectNo) {
	selectField = selects[selectNo];
	for(var k = 0; k < selectField.options.length; k++) {
		if(k==linkNo) {
			selectField.options[k].selected = true;
		}
		else {
			selectField.options[k].selected = false;
		}
	}
	
	//show selected option
	textVar = document.getElementById("mySelectText"+selectNo);
	var newText = document.createTextNode(selectField.options[linkNo].text);
	textVar.replaceChild(newText, textVar.childNodes[0]);
	if (selectField.onchange && all_selects)
			{
				eval(selectField.onchange());
			}
}

//showing options
function showOptions(g) {
		_elem = document.getElementById("optionsDiv"+g);
		if (active_select && active_select != _elem) {
			active_select.className = "optionsDivInvisible";
			active_select.style.height = "auto";
		}
		if(_elem.className=="optionsDivInvisible") {
			_elem.style.left = "-9999px";
			_elem.style.top = findPosY(_elem._parent) + _heightSelect + 'px';
			if (_elem._parent.parentNode.className.indexOf('s101_profile-form') != -1) {
				_elem.style.top = findPosY(_elem._parent) + 24 + 'px';
			}
			_elem.className = "optionsDivVisible";
			if (_elem._parent.parentNode.className.indexOf('s101_profile-form') != -1) {
				_elem.className ="optionsDivVisible differentSelect";
			}
			if (_elem.offsetHeight > 200)
			{
				_elem.style.height = "200px";
			}
			_elem.style.left = findPosX(_elem._parent) +'px';
			
			active_select = _elem;
		}
		else if(_elem.className=="optionsDivVisible") {
			_elem.style.height = "auto";
			_elem.className = "optionsDivInvisible";
		}
		//_elem.onmouseout = hideOptions;
}

function findPosY(obj) {
	var posTop = 0;
	while (obj.offsetParent) {posTop += obj.offsetTop; obj = obj.offsetParent;}
	return posTop;
}
function findPosX(obj) {
	var posLeft = 0;
	while (obj.offsetParent) {posLeft += obj.offsetLeft; obj = obj.offsetParent;}
	return posLeft;
}


window.onload = init;