/*****************************************/

/** Usable Forms 2.0, November 2005     **/

/** Written by ppk, www.quirksmode.org  **/

/** Instructions for use on my site     **/

/**                                     **/

/** You may use or change this script   **/

/** only when this copyright notice     **/

/** is intact.                          **/

/**                                     **/

/** If you extend the script, please    **/

/** add a short description and your    **/

/** name below.                         **/

/*****************************************/



var containerTag = 'TR';



var compatible = (

	document.getElementById && document.getElementsByTagName && document.createElement

	&&

	!(navigator.userAgent.indexOf('MSIE 5') != -1 && navigator.userAgent.indexOf('Mac') != -1)

	);



if (compatible)

{

	document.write('<style>.accessibility{display: none}</style>');

	var waitingRoom = document.createElement('div');

}



var hiddenFormFieldsPointers = new Object();



function prepareForm()

{

	if (!compatible) return;

	var marker = document.createElement(containerTag);

	marker.style.display = 'none';



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

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

		addEvent(x[i],'change',showHideFields)



	var x = document.getElementsByTagName(containerTag);

	var hiddenFields = new Array;

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

	{

		if (x[i].getAttribute('rel'))

		{

			var y = getAllFormFields(x[i]);

			x[i].nestedRels = new Array();

			for (var j=0;j<y.length;j++)

			{

				var rel = y[j].getAttribute('rel');

				if (!rel || rel == 'none') continue;

				x[i].nestedRels.push(rel);

			}

			if (!x[i].nestedRels.length) x[i].nestedRels = null;

			hiddenFields.push(x[i]);

		}

	}



	while (hiddenFields.length)

	{

		var rel = hiddenFields[0].getAttribute('rel');

		if (!hiddenFormFieldsPointers[rel])

			hiddenFormFieldsPointers[rel] = new Array();

		var relIndex = hiddenFormFieldsPointers[rel].length;

		hiddenFormFieldsPointers[rel][relIndex] = hiddenFields[0];

		var newMarker = marker.cloneNode(true);

		newMarker.id = rel + relIndex;

		hiddenFields[0].parentNode.replaceChild(newMarker,hiddenFields[0]);

		waitingRoom.appendChild(hiddenFields.shift());

	}

	

	setDefaults();

	addEvent(document,'click',showHideFields);

}



function setDefaults()

{

	var y = document.getElementsByTagName('input');

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

	{

		if (y[i].checked && y[i].getAttribute('rel'))

			intoMainForm(y[i].getAttribute('rel'))

	}



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

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

	{

		if (z[i].options[z[i].selectedIndex].getAttribute('rel'))

			intoMainForm(z[i].options[z[i].selectedIndex].getAttribute('rel'))

	}



}



function showHideFields(e)

{

	if (!e) var e = window.event;

	var tg = e.target || e.srcElement;



	if (tg.nodeName == 'LABEL')

	{

		var relatedFieldName = tg.getAttribute('for') || tg.getAttribute('htmlFor');

		tg = document.getElementById(relatedFieldName);

	}

		

	if (

		!(tg.nodeName == 'SELECT' && e.type == 'change')

		&&

		!(tg.nodeName == 'INPUT' && tg.getAttribute('rel'))

	   ) return;



	var fieldsToBeInserted = tg.getAttribute('rel');



	if (tg.type == 'checkbox')

	{

		if (tg.checked)

			intoMainForm(fieldsToBeInserted);

		else

			intoWaitingRoom(fieldsToBeInserted);

	}

	else if (tg.type == 'radio')

	{

		removeOthers(tg.form[tg.name],fieldsToBeInserted)

		intoMainForm(fieldsToBeInserted);

	}

	else if (tg.type == 'select-one')

	{

		fieldsToBeInserted = tg.options[tg.selectedIndex].getAttribute('rel');

		removeOthers(tg.options,fieldsToBeInserted);

		intoMainForm(fieldsToBeInserted);

	}

}



function removeOthers(others,fieldsToBeInserted)

{

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

	{

		var show = others[i].getAttribute('rel');

		if (show == fieldsToBeInserted) continue;

		intoWaitingRoom(show);

	}

}



function intoWaitingRoom(relation)

{

	if (relation == 'none') return;

	var Elements = hiddenFormFieldsPointers[relation];

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

	{

		waitingRoom.appendChild(Elements[i]);

		if (Elements[i].nestedRels)

			for (var j=0;j<Elements[i].nestedRels.length;j++)

				intoWaitingRoom(Elements[i].nestedRels[j]);

	}

}



function intoMainForm(relation)

{

	if (relation == 'none') return;

	var Elements = hiddenFormFieldsPointers[relation];

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

	{

		var insertPoint = document.getElementById(relation+i);

		insertPoint.parentNode.insertBefore(Elements[i],insertPoint);

		if (Elements[i].nestedRels)

		{

			var fields = getAllFormFields(Elements[i]);

			for (var j=0;j<fields.length;j++)

			{

				if (!fields[j].getAttribute('rel')) continue;

				if (fields[j].checked || fields[j].selected) 

					intoMainForm(fields[j].getAttribute('rel'));

			}

		}

	}

}



function getAllFormFields(node)

{

	var allFormFields = new Array;

	var x = node.getElementsByTagName('input');

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

		allFormFields.push(x[i]);

	var y = node.getElementsByTagName('option');

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

		allFormFields.push(y[i]);

	return allFormFields;

}



/** ULTRA-SIMPLE EVENT ADDING **/



function addEvent(obj,type,fn)

{

	if (obj.addEventListener)

		obj.addEventListener(type,fn,false);

	else if (obj.attachEvent)

		obj.attachEvent("on"+type,fn);

}



addEvent(window,"load",prepareForm);





/** PUSH AND SHIFT FOR IE5 **/



function Array_push() {

	var A_p = 0

	for (A_p = 0; A_p < arguments.length; A_p++) {

		this[this.length] = arguments[A_p]

	}

	return this.length

}



if (typeof Array.prototype.push == "undefined") {

	Array.prototype.push = Array_push

}



function Array_shift() {

	var A_s = 0

	var response = this[0]

	for (A_s = 0; A_s < this.length-1; A_s++) {

		this[A_s] = this[A_s + 1]

	}

	this.length--

	return response

}



if (typeof Array.prototype.shift == "undefined") {

	Array.prototype.shift = Array_shift

}

