var _forms = [];
var popup = false;
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 IE = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var isMac = is_mac();
var selectText = "please select";

var _timeouts = [];
var _stimeout = 100;

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;}
	getElements();
	separateElements();
	replaceRadios();
	replaceCheckboxes();
	replaceSelects();
	if (!isMac) {
		replaceButtons();
	}
}


// 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++) {
		if (checkboxes[q]._ca)
		{
			var divChkName = checkboxes[q]._ca.id;
		}
		else
		{
			var divChkName = 'myCheckbox' + q;
		}
		checkboxes[q].className = 'outtaHere';
		if(checkboxes[q]._ca)
		{
			var checkboxArea = document.getElementById(divChkName);
		}
		else
		{
			if( $('#'+divChkName).is('div') )
			{
				var checkboxArea = document.getElementById(divChkName);
			}
			else
			{
				var checkboxArea = document.createElement('div');
				checkboxArea.setAttribute('id', divChkName);
			}
		}
				
		checkboxArea.className = ( checkboxes[q].checked ) ? 'checkboxAreaChecked' : 'checkboxArea';	
		checkboxArea.onclick = new Function('rechangeCheckboxes('+q+')');
		if (checkboxLabels[q])
		{
			checkboxLabels[q].onclick = new Function('changeCheckboxes('+q+')');
		}
		
		checkboxes[q].onkeydown = checkEvent;
		checkboxes[q].parentNode.insertBefore(checkboxArea, checkboxes[q]);
		checkboxes[q]._ca = checkboxArea;
		checkboxes[q]._ca.checked = checkboxes[q].checked;
//		if( typeof( checkboxes[q]._ca.checked ) == 'undefined' )
//		{
//			checkboxes[q]._ca.checked = false;
//		}else{
//			checkboxes[q]._ca.checked = checkboxes[q].checked;
//		}
	}

	return true;
}

//checking checkboxes
function checkCheckboxes(who, action) 
{
	var what = checkboxes[who]._ca;
	if(typeof(action) == 'boolean' && action == true) {
		what.className = "checkboxAreaChecked";
		what.checked = true;
		checkboxes[who].checked = false;
	}
	
	if(typeof(action) == 'boolean' && action == false) {
		what.className = "checkboxArea";
		what.checked = false;
		checkboxes[who].checked = true;
	}
//	checkboxes[who].checked = action;
//	$( checkboxes[who]._ca ).click( function(){});
}

//changing checkboxes
function changeCheckboxes(who) 
{
	if( checkboxes[who]._ca.checked ) {
		checkCheckboxes(who, false);
	} else {
		checkCheckboxes(who, true);
	}
}

//rechanging checkboxes
function rechangeCheckboxes(who) 
{
	checkboxes[who].click();
	if( !checkboxes[who]._ca.checked ) {
		checkboxes[who]._ca.className = "checkboxAreaChecked";
		checkboxes[who]._ca.checked = true;
		checkboxes[who].checked = true;	
	} else {
		checkboxes[who]._ca.className = "checkboxArea";
		checkboxes[who]._ca.checked = false;
		checkboxes[who].checked = false;
	}
}

//check event
function checkEvent(e) {
	if (!e) var e = window.event;
	if(e.keyCode == 32 || e.keyCode == 0) {
		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++) {
		// 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);
	}
}

//replacing selects
function replaceSelects()
{	
    for(var q = 0; q < selects.length; q++) 
    {
    	var divSelectNameArea = 'sarea'+q;
    	selects[q]._number = q;

	    if(selects[q]._ca)	
	    {
	    	var selectArea = document.getElementById(divSelectNameArea);
	    }
	    else
	    {	//create and build div structure
			if( $('#'+divSelectNameArea).is('div') )
			{
					var selectArea = document.getElementById(divSelectNameArea);
			}
			else
			{			
					var selectArea = document.createElement('div');
					selectArea.setAttribute('id', divSelectNameArea);
					
					//create span structure
					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 text = document.createTextNode(selectText);
					
					var center = document.createElement("span");
					center.setAttribute('id', "mySelectText"+q);
					center.className = 'center';
					center._q = q;
					
					var button = document.createElement("a");
					button.href = "javascript:showOptions("+q+")";
					button.onkeydown = selectEvent;
					button.className = "selectButton";
					button._q = q;
					
					center.appendChild(text);
					selectArea.appendChild(center);
					selectArea.appendChild(button);
					
					selectArea.className = 'selectArea';
					selectArea.className += ' ' + selects[q].className;
						
					var stWidth = selects[q].offsetWidth + 3;
					stWidth = ( selects[q].offsetWidth == 0 ) ? 255 : stWidth;
					selectArea.style.width = stWidth + 'px';
					
					//hide the select field
					selects[q].className += " outtaHere";
			}
	    }
	    
		//insert select div
		selects[q].parentNode.insertBefore(selectArea, selects[q]);
		selects[q]._ca = selectArea;
				
		//build & place options div
		var divOptionsInvisibleName = "optionsDiv"+q;
		if(selects[q]._options)
		{
			var optionsDiv = document.getElementById(divOptionsInvisibleName);
		}
		else
		{		
				if( $('#'+divOptionsInvisibleName).is('div') )
				{
					var optionsDiv = document.getElementById(divOptionsInvisibleName);
					var tmp = document.createElement("div");
					var tmp2 = document.createElement("div");
					var optionsList = document.createElement("ul");
				}
				else
				{
					var tmp = null;
					var tmp2 = null;
						
					var optionsDiv = document.createElement("div");
					optionsDiv.setAttribute('id', divOptionsInvisibleName );
					
					/* -- */
					var tmp = document.createElement("div");
					tmp.className = "bg-top";
					
					var tmp2 = document.createElement("div");
					tmp.appendChild(tmp2);
					
					optionsDiv.appendChild(tmp);
					optionsDiv._q = q
					
					var optionsList = document.createElement("ul");
					optionsDiv.appendChild(optionsList);
					
					var tmp = document.createElement("div");
					tmp.className = "bg-bottom";
					/* -- */
					
					optionsDiv.className = "optionsDivInvisible";
					optionsDiv.style.width = stWidth + "px";
									
					tmp.appendChild(tmp2);
					
					optionsDiv.appendChild(tmp);
				}
		}
	
		if( typeof(selectArea) == 'object' && optionsDiv != null){
			
			optionsDiv._parent = selectArea;			
			selects[q]._options = optionsList;			
			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);
			}
			
			if(typeof(button) == 'object' && typeof(center) == 'object')	
			{
					button.onmouseover = optionsDiv.onmouseover;
					button.onmouseout  = optionsDiv.onmouseout;
					center.onmouseover = optionsDiv.onmouseover;
					center.onmouseout  = optionsDiv.onmouseout;
			}

			if(typeof(selects[q]._options) == 'object')
			{
					populateSelectOptions(selects[q]);	
			}
			//selectArea.appendChild(optionsDiv);
			if (popup && (popupelem = document.getElementById('TB_window'))) {
				popupelem.appendChild(optionsDiv);
			} else {
				document.getElementsByTagName("body")[0].appendChild(optionsDiv);
			}
		}
	}
	all_selects = true;
}

//collecting select options
function populateSelectOptions(me) {
	me._options.innerHTML = "";
	var anySel = false;
	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);
			anySel = true;
		}
	}
	if (!anySel) {
		selectMe(me.id,0,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) {
		var _elem = document.getElementById("optionsDiv"+g);		
		var arrayPageScroll = getPageScroll(_elem._parent);		
		var arrayPageSize = getPageSize(_elem._parent);
	 	var t = 0;		
		if (active_select && active_select != _elem) {
			active_select.className = "optionsDivInvisible";
			active_select.style.height = "auto";
		}
		
		if(_elem.className=="optionsDivInvisible") {
			_elem.style.left = "-9999px";
			_elem.className = "optionsDivVisible";	
			t = findPosY(_elem, arrayPageScroll, arrayPageSize) + 30;
			_elem.style.top = t + 'px';
			_elem.style.left = findPosX(_elem, arrayPageScroll, arrayPageSize) + 'px';
			if (_elem.offsetHeight > 200)
			{
				_elem.style.height = "200px";
			}
			active_select = _elem;
		}
		else if(_elem.className=="optionsDivVisible") {
			_elem.style.height = "auto";
			_elem.className = "optionsDivInvisible";
		}
		
		if(!popup){
			_elem.style.position = "absolute";
		}
		else{
			pos = (arrayPageScroll[1] == 0 ) ? 'fixed': 'absolute';
			_elem.style.position = pos;
			$(document).ready(function(){
				$(this).scroll(function(){
					_elem.style.top = t + getPageScroll(_elem._parent) + 'px';
				});
			});
		}	
}

function findPosY(obj, arrayPageScroll, arrayPageSize) {
	var posTop = 0;
	var _top = 0;
	var _obj = obj._parent;
	if(!popup){
		while (_obj.offsetParent) { posTop += _obj.offsetTop; _obj = _obj.offsetParent; }	
	}
	else{
		_top = Math.round( ( arrayPageSize[3] / 100) - 7 );
		posTop = _obj.offsetTop + _top + _obj.offsetParent.offsetTop + arrayPageScroll[1];
	}
	
	return posTop;
}

function findPosX(obj, arrayPageScroll, arrayPageSize) {
	var _obj 	= obj._parent;
	var posLeft = 0;
	var lft 	= 0;
	var sel 	= document.getElementsByTagName("select")[0];
	var only_IE = document.getElementById("TB_window");
	
	if(!popup){ 
		while (_obj.offsetParent) { posLeft += _obj.offsetLeft; _obj = _obj.offsetParent; }
	}
	else{
		while (_obj.offsetParent) { posLeft += _obj.offsetLeft; _obj = _obj.offsetParent; }
		if (IE) posLeft += only_IE.offsetLeft;
	}
	
	return posLeft;
}

function reload(p)
{
	_forms = [];
	popup=false;
	if(p){
		scroll(0,0);
		popup = true;
	}
	inputs = new Array();
	selects = new Array();
	labels = new Array();
	radios = new Array();
	radioLabels = new Array();
	checkboxes = new Array();
	checkboxLabels = new Array();
	buttons = new Array();
	selects = new Array();
	all_selects = false;
	active_select = null;
	agt = navigator.userAgent.toLowerCase();
	//this.ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
	isMac = is_mac();
	//selectText = "please select";
	_timeouts = [];
	//_stimeout = 100;
	//IN_CFORMS = true;
	init();
}
//window.onload = init;
//$(window).load(function () { init(); });
function getPageSize(self){
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;

	if (self.innerHeight) {	// all except Explorer
		if(document.documentElement.clientWidth){
			windowWidth = document.documentElement.clientWidth; 
		} else {
			windowWidth = self.innerWidth;
		}
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}

	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}

function getPageScroll(self){

	var xScroll, yScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
		xScroll = self.pageXOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
		xScroll = document.documentElement.scrollLeft;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
		xScroll = document.body.scrollLeft;	
	}

	arrayPageScroll = new Array(xScroll,yScroll) 
	return arrayPageScroll;
}

