var _forms = document.getElementsByTagName('form');
var inputs = new Array();
var selects = new Array();
var labels = new Array();
var radios = new Array();
var radioLabels = new Array();
var checkboxes = new Array();
var checkboxLabels = new Array();
var buttons = new Array();
var selects = new Array();
var all_selects = false;
var active_select = null;
var serverID;
var agt = navigator.userAgent.toLowerCase();
//this.ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var isMac = is_mac();
var selectText = "please select";

var IN_CFORMS = true;

function is_mac() {
	if (navigator.appVersion.indexOf("Safari") != -1)
	{
		if(!window.getComputedStyle)
		{
   			return true;
  		}
	}
	return false;
}

function init() {
	if(!document.getElementById) {return false;}
	// gets all the elements
	getElementsForms();
	// puts the elements in seperate arrays
	separateElements();
	replaceSelects();
	if (!isMac) {
		replaceButtons();	
	}
/*
	if(document.documentElement)
	{
		document.documentElement.onkeydown = function(e){
			if (initSelectKeyChooseOptions(e)){
				return false;
			}
		}
	}	else
	{
		window.onkeydown = function(e){
			if (initSelectKeyChooseOptions(e)){
				return false;
			}
		}
	}
*/
}


// getting all the required elements
// input gets input fields
// selects gets the select box

function getElementsForms() {
	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 nfl = 0; nfl < document.forms[nf].getElementsByTagName("label").length; nfl++) {labels.push(document.forms[nf].getElementsByTagName("label")[nfl]);}
		for(var nfs = 0; nfs < document.forms[nf].getElementsByTagName("select").length; nfs++) {
			var tmp = selects.push(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") {
			radios[r] = inputs[q]; ++r;
			for(var w = 0; w < labels.length; w++) {
				if((inputs[q].id) && labels[w].htmlFor == inputs[q].id)
				{
					radioLabels[rl] = labels[w];
					++rl;
				}
			}
		}
		if(inputs[q].type == "checkbox") {
			checkboxes[c] = inputs[q]; ++c;
			for(var w = 0; w < labels.length; w++) {
				if((inputs[q].id) && (labels[w].htmlFor == inputs[q].id))
				{
					checkboxLabels[cl] = labels[w];
					++cl;
				}
			}
		}
		if((inputs[q].type == "submit") || (inputs[q].type == "button")) {
			buttons[b] = inputs[q]; 
			++b;
		}
	}
}

//replacing radio buttons
function replaceRadios() {
	for (var q = 0; q < radios.length; q++) {
		if (!radios[q].replaced) {
			radios[q].className = "outtaHere";
			var radioArea = document.createElement("div");
			if(radios[q].checked) {
				radioArea.className = "radioAreaChecked";
			}
			else
			{
				radioArea.className = "radioArea";
			}
			radioArea.id = "myRadio" + q;
			radios[q].parentNode.insertBefore(radioArea, radios[q]);
			radios[q]._ra = radioArea;
	
			radioArea.onclick = new Function('rechangeRadios('+q+')');
			if (radioLabels[q])
			{
				radioLabels[q].onclick = new Function('rechangeRadios('+q+')');
			}
			radios[q].replaced = true;
		}
	}
	return true;
}

//checking radios
function checkRadios(who) {
	var what = radios[who]._ra;
	for(var q = 0; q < radios.length; q++) {
		if((radios[q]._ra.className == "radioAreaChecked")&&(radios[q]._ra.nextSibling.name == radios[who].name))
		{
			radios[q]._ra.className = "radioArea";
		}
	}
	what.className = "radioAreaChecked";
}

//changing radios
function changeRadios(who) {
	if(radios[who].checked) {
		for(var q = 0; q < radios.length; q++) {
			if(radios[q].name == radios[who].name) {
				radios[q].checked = false;
			} 
			radios[who].checked = true; 
			checkRadios(who);
		}
	}
}

//rechanging radios
function rechangeRadios(who) {
	if(!radios[who].checked) {
		for(var q = 0; q < radios.length; q++) {
			if(radios[q].name == radios[who].name)	{
				radios[q].checked = false; 
			}
			radios[who].checked = true; 
			checkRadios(who);
		}
	}
}

//replacing checkboxes
function replaceCheckboxes() {
	for (var q = 0; q < checkboxes.length; q++) {
		if (!checkboxes[q].replaced) {

		checkboxes[q].className = "outtaHere";
		var checkboxArea = document.createElement("div");
		if(checkboxes[q].checked) {
			checkboxArea.className = "checkboxAreaChecked";
		}
		else {
			checkboxArea.className = "checkboxArea";
		}
		checkboxArea.id = "myCheckbox" + q;
		checkboxes[q].parentNode.insertBefore(checkboxArea, checkboxes[q]);
		checkboxes[q]._ca = checkboxArea;
		checkboxArea.onclick = new Function('rechangeCheckboxes('+q+')');
		if (checkboxLabels[q])
		{
			checkboxLabels[q].onclick = new Function('changeCheckboxes('+q+')');
		}
		
		checkboxes[q].onkeydown = checkEvent;
		checkboxes[q].replaced = true;
		}
	}
	return true;
}

//checking checkboxes
function checkCheckboxes(who, action) {
	var what = checkboxes[who]._ca;
	if(action == true) {
		what.className = "checkboxAreaChecked";
		what.checked = true;
	}
	if(action == false) {
		what.className = "checkboxArea";
		what.checked = false;
	}
}

//changing checkboxes
function changeCheckboxes(who) {
	if(checkboxes[who].checked) {
		checkCheckboxes(who, false);
	}
	else {
		checkCheckboxes(who, true);
	} 
}

//rechanging checkboxes
function rechangeCheckboxes(who) {
	var tester = false;
	if(checkboxes[who].checked == true) {
		tester = false;
	}
	else {
		tester = true;
	}
	checkboxes[who].checked = tester;
	checkCheckboxes(who, tester);
}

//check event
function checkEvent(e) {
	if (!e) var e = window.event;
	if(e.keyCode == 32) {
		for (var q = 0; q < checkboxes.length; q++) {
			if(this == checkboxes[q]) {
				changeCheckboxes(q);
			}
		}
	} //check if space is pressed
}

// replacing buttons
function replaceButtons() {
	for (var i = 0; i < buttons.length; i++) {
		if (!buttons[i].replaced) {
		// button holder
		var buttonHolder = document.createElement("div");
		buttonHolder.className = "buttonSubmit";		
		buttons[i].parentNode.appendChild(buttonHolder);
		
		// left image
		var buttonLeft = document.createElement("span");
		buttonLeft.className = "left";
		buttonHolder.appendChild(buttonLeft);
		
		// append button into holder
		buttonHolder.appendChild(buttons[i]);
		
		//right image
		var buttonRight = document.createElement('span');
		buttonRight.className = "right";
		buttonHolder.appendChild(buttonRight);
		buttons[i].replaced = true;
	
		}
	}
}

//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;
		selects[q]._q = q;
		
		selects[q].onkeyup = function(e){
			_elem = document.getElementById("optionsDiv"+this._q);
			if(_elem){
				if(true || _elem.className == "optionsDivInvisible"){
					selectMe('',this.selectedIndex,this._q);
				}
				
				if (!e)
					var e = window.event;
				var thecode = e.keyCode;
				if(thecode == 13){
					showOptions(this._q);
				}
			}
		}
		
		var center = document.createElement("span");
		var button = document.createElement("a");
		var text = document.createTextNode(selectText);
		center.id = "mySelectText"+q;
		
		var stWidth = selects[q].offsetWidth;
		selectArea.style.width = stWidth + "px";
		if (selects[q].parentNode.className.indexOf("type2") != -1){
			button.href = "javascript:showOptions("+q+",true)";
		}
		else {
			button.href = "javascript:showOptions("+q+",false)";
		}
		//button.onkeydown = selectEvent;
		button.className = "selectButton";
		selectArea.className = "selectArea";
		selectArea.className += " " + selects[q].className;
		selectArea.id = "sarea"+q;
		center.className = "center";
		center.appendChild(text);
		selectArea.appendChild(center);
		selectArea.appendChild(button);
		
		selectArea._q = q;
		selectArea.onclick = function(){
			if(selects[this._q])
			{
				selects[this._q].focus();
			}
		}
		
		//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.innerHTML += "<div class='select-top'><div></div></div>";
		optionsDiv.appendChild(optionsList);
		
		selects[q]._options = optionsList;
		
		//optionsDiv.style.width = stWidth - 4 + "px";
		optionsDiv.style.width = stWidth + "px";
		optionsDiv._parent = selectArea;
		
		optionsDiv.className = "optionsDivInvisible";
		optionsDiv.id = "optionsDiv"+q;
		
		populateSelectOptions(selects[q]);
		optionsDiv.innerHTML += "<div class='select-bottom'><div class='select-bottom-left'></div><div class='select-bottom-right'></div></div>";
		//selectArea.appendChild(optionsDiv);
		document.getElementsByTagName("body")[0].appendChild(optionsDiv);
		initSelectOptions(q);
		selects[q].replaced = true;
		}
	all_selects = true;
	}
}

function closeAllSelects(){
	var _div = document.getElementsByTagName('div');
	for (var i=0; i<_div.length; i++){
		if (_div[i].id.indexOf('optionsDiv') != -1){
			_div[i].className = 'optionsDivInvisible';
		}
	}
}
//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];
	
	if(selectField){
		selectField.selectedIndex = linkNo;
	}
/*
	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());
	}
	selectActiveOption(selectNo,linkNo);
	document.getElementById('formID').action = domains[linkNo];
	
}
//showing options
function showOptions(g, type2) {
//		closeAllSelects();
		_elem = document.getElementById("optionsDiv"+g);
		if (active_select && active_select != _elem) {
           // active_select.className = active_select.className.replace('optionsDivVisible', '')
			active_select.className = "optionsDivInvisible";
			active_select.style.height = "auto";
		}

		if(_elem.className=="optionsDivInvisible") {
			_elem.style.left = "-9999px";
			_elem.style.top = findPosY(_elem._parent) + 22 + 'px';
			if (type2){
				_elem.style.top = findPosY(_elem._parent) + 16 + 'px';
			}
			_elem.className = "optionsDivVisible";
			_elem.style.left = findPosX(_elem._parent) + 'px';
			
			active_select = _elem;
			
			if(document.documentElement)
			{
				document.documentElement.onclick = hideSelectOptions;				
			}
			else
			{
				window.onclick = hideSelectOptions;
			}
		}
		else if(_elem.className=="optionsDivVisible") {
			_elem.style.height = "auto";
			_elem.className = "optionsDivInvisible";
		}
		//_elem.onmouseout = djn b uel
;
}

function hideSelectOptions(e)
{
	if(active_select)
	{
		if(!e) e = window.event;
		var _target = (e.target || e.srcElement);
		
//		var server = String(parseInt(_target.href.substring(49,50))+1);
//		if(server != 'NaN')
//			window.location = 'http://s'+server+'.'+domainBaseURL;
		
		//alert(_target.tagName + ' ' + _target.id + ' ' + _target.className);
		if ((_target.id.indexOf('optionsDiv')!=-1)/* || (_target.parentNode.id.indexOf('optionsDiv')!=-1) || (_target.parentNode.parentNode.id.indexOf('optionsDiv')!=-1)*/){return false;}
		if(isElementBefore(_target,'selectArea') == 0 && isElementBefore(_target,'optionsDiv') == 0)
		{
			//active_select.className = active_select.className.replace('optionsDivVisible', '');
			active_select.className = "optionsDivInvisible";
			active_select.style.height = "auto";
		}
			if(document.documentElement)
			{
				document.documentElement.onclick = function(){};
			}
			else
			{
				window.onclick = null;
			}
			//active_select = false;
	}
	
}

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;
}

function isElementBefore(_el,_class)
{
	var _parent = _el;	
	do
	{
		_parent = _parent.parentNode;
	}
	while(_parent && _parent.className != null && _parent.className.indexOf(_class) == -1)
	
	if(_parent.className && _parent.className.indexOf(_class) != -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
	
}

/*
function initSelectKeyChooseOptions(e){
	if (!e) var e = window.event;
	var thecode = e.keyCode;
	var _obj = getActiveOptionBlock();
	var _lis = [];
	//document.title = thecode;
	if (_obj){
		_lis = $(_obj).getElements('li');
		_obj._activeindex = -1;
		for (var i=0; i<_lis.length; i++){
			if ($(_lis[i]).hasClass('active')){
				$(_lis[i]).removeClass('active')
				_obj._activeindex = i;
			}
		};
	}
	if (_obj && _lis.length){
		switch(thecode){
			case 40: //down
				if (_obj._activeindex == -1){
					$(_lis[0]).addClass('active');
				} else if (_obj._activeindex+1 < _lis.length){
					$(_lis[_obj._activeindex+1]).addClass('active');
				}
				break;
			case 38: //up
				if (_obj._activeindex == -1){
					$(_lis[0]).addClass('active');
				} else if (_obj._activeindex-1 >= 0){
					$(_lis[_obj._activeindex-1]).addClass('active');
				}
				break;
			case 13: //enter
				if (_obj._activeindex == -1){
					closeAllSelects();
				} else {
					$(_lis[_obj._activeindex]).addClass('active');
					var _href = $(_lis[_obj._activeindex]).getElement('a').href;
					eval(_href);
					closeAllSelects();
				}
				break;
			default:
				return false;
				break;
		}
		return true;
	}
}
*/

function clearSelectOptions(_i)
{
	var _div = document.getElementById('optionsDiv'+_i);
	if(_div)
	{
		var _lis = _div.getElementsByTagName('li');
		for (var i=0; i<_lis.length; i++)
		{
			_lis[i].className = _lis[i].className.replace('active','');
		}		
	}	
}

function selectActiveOption(_i,_si)
{
	clearSelectOptions(_i);

	var _div = document.getElementById('optionsDiv'+_i);
	if(_div)
	{
		var _lis = _div.getElementsByTagName('li');
		if(_lis[_si] && _lis[_si].className.indexOf('active') == -1)
		{
			_lis[_si].className += ' active';
			_div._selectedIndex = _si;
		}
	}
}

function initSelectOptions(_i)
{
	var _div = document.getElementById('optionsDiv'+_i);
	if(_div)
	{
		var _lis = _div.getElementsByTagName('li');
		for (var i=0; i<_lis.length; i++)
		{
			_lis[i]._q = _i;
			_lis[i].onmouseover = function()
			{
				clearSelectOptions(this._q);
			}
			_lis[i].onmouseout = function()
			{
				selectActiveOption(this._q,selects[this._q].selectedIndex);
			}
		}

		selectMe('',selects[_i].selectedIndex,_i);

	}	
}

function getActiveOptionBlock(){
	var _div = document.getElementsByTagName('div');
	for (var i=0; i<_div.length; i++){
		if (_div[i].className.indexOf('optionsDivVisible')!=-1){
			return _div[i];
		}
	}
}
window.onload = init;

