var _selectHeight = 25;



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 agt = navigator.userAgent.toLowerCase();

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 initCastomForms() {

	if(!document.getElementById) {return false;}

	getElements();

	separateElements();

	replaceSelects();



	var _selects = document.getElementsByTagName('select');

	var _SelctClassName = [];

	if (_selects) {

		for (var i = 0; i < _selects.length; i++) {

			if (_selects[i].className != '' && _selects[i].className != 'outtaHere')

				_SelctClassName[i] = ' drop-'+_selects[i].className;

		}

		for (var i = 0; i < _SelctClassName.length; i++) {

			var _selectDrop = document.getElementById('optionsDiv'+i);

			if (_selectDrop) {

				if (_SelctClassName[i]) 

					_selectDrop.className += _SelctClassName[i];

			}

		}

	}

}

// 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++) {inputs.push(document.forms[nf].getElementsByTagName("input")[nfi]);}

		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++) {selects.push(document.forms[nf].getElementsByTagName("select")[nfs]);}

	}

}

// 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++) {

		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+')');

		}

	}

	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++) {

		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 = checkboxArea.onclick2 = new Function('rechangeCheckboxes('+q+')');

		if (checkboxLabels[q])

		{

			checkboxLabels[q].onclick = new Function('changeCheckboxes('+q+')');

		}

		

		checkboxes[q].onkeydown = checkEvent;

	}

	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

}





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;

		

		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.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);

		

		//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 + "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>";

		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;

		if (me.options[w].title.indexOf('image') != -1) {

			optionTxt = document.createElement('img');

			optionSpan = document.createElement('span');

			optionTxt.src = me.options[w].title;

			optionSpan = document.createTextNode(me.options[w].text);

		} else {

			optionTxt = document.createTextNode(me.options[w].text);

		}

		

		optionLink.href = "javascript:showOptions("+me._number+"); selectMe('"+me.id+"',"+w+","+me._number+");";

		if (me.options[w].title.indexOf('image') != -1) {

			optionLink.appendChild(optionTxt);

			optionLink.appendChild(optionSpan);

		} else {

			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";

	}

}



//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;

	var optionSpan;

	if (selectField.options[linkNo].title.indexOf('image') != -1) {

		newText = document.createElement('img');

		newText.src = selectField.options[linkNo].title;

		optionSpan = document.createElement('span');

		optionSpan = document.createTextNode(selectField.options[linkNo].text);

	} else {

		newText = document.createTextNode(selectField.options[linkNo].text);

	}

	if (selectField.options[linkNo].title.indexOf('image') != -1) {

		if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);

		textVar.replaceChild(newText, textVar.childNodes[0]);	

		textVar.appendChild(optionSpan);	

	} else {

		if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);

		textVar.replaceChild(newText, textVar.childNodes[0]);	

	}

	if (selectField.onchange && all_selects)

		{

			eval(selectField.onchange());

		}

}

//showing options

function showOptions(g) {

		_elem = document.getElementById("optionsDiv"+g);

		var divArea = document.getElementById("sarea"+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.indexOf("optionsDivInvisible") != -1) {

			_elem.style.left = "-9999px";

			_elem.style.top = findPosY(divArea) + _selectHeight + 'px';

			_elem.className = _elem.className.replace('optionsDivInvisible','');

			_elem.className += " optionsDivVisible";

			/*if (_elem.offsetHeight > 200)

			{

				_elem.style.height = "200px";

			}*/

			_elem.style.left = findPosX(divArea) + 'px';

			

			active_select = _elem;

			if(document.documentElement)

			{

				document.documentElement.onclick = hideSelectOptions;

			}

			else

			{

				window.onclick = hideSelectOptions;

			}

		}

		else if(_elem.className.indexOf("optionsDivVisible") != -1) {

			_elem.style.height = "auto";

			_elem.className = _elem.className.replace('optionsDivVisible','');

			_elem.className += " optionsDivInvisible";

		}

		

		// for mouseout

		/*_elem.timer = false;

		_elem.onmouseover = function() {

			if (this.timer) clearTimeout(this.timer);

		}

		_elem.onmouseout = function() {

			var _this = this;

			this.timer = setTimeout(function(){

				_this.style.height = "auto";

				_this.className = _this.className.replace('optionsDivVisible','');

				if (_elem.className.indexOf('optionsDivInvisible') == -1)

					_this.className += " optionsDivInvisible";

			},200);

		}*/

}



function hideSelectOptions(e)

{

	if(active_select)

	{

		if(!e) e = window.event;

		var _target = (e.target || e.srcElement);

		if(isElementBefore(_target,'selectArea') == 0 && isElementBefore(_target,'optionsDiv') == 0)

		{

			active_select.className = active_select.className.replace('optionsDivVisible', '');

			active_select.className = active_select.className.replace('optionsDivInvisible', '');

			active_select.className += " optionsDivInvisible";

			active_select = false;



			if(document.documentElement)

			{

				document.documentElement.onclick = function(){};

			}

			else

			{

				window.onclick = null;

			}

		}

	}

}



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 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 = initCastomForms;
