/*****************************************/
/** Usable Forms 2.0, November 2005     **/
/** Written by ppk, www.quirksmode.org  **/
/**                                     **/
/** added support for rel="rel1|rel2"   **/
/** by Amin Mohadjer on May 22, 2007    **/
/*****************************************/

var containerTag = 'TR';
document.write('<style>.accessibility{display: none}</style>');
var waitingRoom = document.createElement('div');
var hiddenFormFieldsPointers = new Object();
var disabledFormFieldsPointers = new Object();

function prepareForm()
{
	document.forms[0].onsubmit = function() { return false;}    // Disable Enter key (fix for Opera)
	replicateSelectOptions();
	if (document.getElementById('zip'))
		document.getElementById('zip').value = '';
	if (document.getElementById('single_family'))
		document.getElementById('single_family').checked = true;
	
	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)
		
		if (x[i].getAttribute('displaySelectionAt'))
		    addEvent(x[i], 'change', displaySelection);
		    
		var parentId = x[i].getAttribute('parent');
		if (!parentId) continue;
		var parent = document.getElementById(parentId);
		if (parent.type == 'select-one')
		{
			if (parent.selectedIndex == 0 || parent.disabled) x[i].disabled = true;
			addEvent(parent, "change", updateChild);
		} 
	}

	var x = document.getElementsByTagName(containerTag);

	var hiddenFields = new Array;
	var disabledFields = new Array;

	for (var i=0;i<x.length;i++)
	{
		if (x[i].getAttribute('rel'))
			hiddenFields.push(x[i]);
		
		if (x[i].getAttribute('rel2'))
			disabledFields.push(x[i]);
	}

	while (disabledFields.length)
	{
		var rel2 = disabledFields[0].getAttribute('rel2');
		if (!disabledFormFieldsPointers[rel2])
			disabledFormFieldsPointers[rel2] = new Array();
		var rel2Index = disabledFormFieldsPointers[rel2].length;
		disabledFormFieldsPointers[rel2][rel2Index] = disabledFields[0];
		disableFields(disabledFields.shift().getAttribute('rel2'));
	}

	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);
	preparePage();
}

function replicateSelectOptions()
{
	var els = document.getElementsByTagName('select');
	var refSelect;
	for(var i=0;i<els.length;i++)
	if (els[i].getAttribute('refSelect'))
	{
		refSelect = document.getElementById(els[i].getAttribute('refSelect'));
		var selIndex = refSelect.selectedIndex;		    
		for(var j=0;j<refSelect.options.length;j++)
				els[i].appendChild(refSelect.options[j].cloneNode(true));
		els[i].selectedIndex = selIndex;
	}
}

function displaySelection(e)
{
	if (!e) var e = window.event;
	var tg = e.target || e.srcElement;
	
	if (tg.getAttribute('displaySelectionAt'))
	    document.getElementById(tg.getAttribute('displaySelectionAt')).innerHTML = tg.options[tg.selectedIndex].value;	
}

function disableFields(rel2)
{
	if (!rel2) return;
	var relations = rel2.split('|');       
	for(var k=0;k<relations.length;k++)    
	{                                      
		relation = relations[k];             
		if (relation == 'none') return;
		var elements = disabledFormFieldsPointers[relation];
		for (var i=0;i<elements.length;i++)
		{
			var flds = getFormFieldsForNode(elements[i]);
			for (var j=0;j<flds.length;j++)
			{
				flds[j].disabled = true;
			}
		}
	}
}

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'));
		if (y[i].checked && y[i].getAttribute('rel2'))
			enableFields(y[i].getAttribute('rel2'));
	}

	var z = document.getElementsByTagName('select');
	for (var i=0;i<z.length;i++)
	{
		if (z[i].selectedIndex != -1 && z[i].options[z[i].selectedIndex].getAttribute('rel'))   // updated by Amin Mohadjer for case when select is empty
			intoMainForm(z[i].options[z[i].selectedIndex].getAttribute('rel'));
		if (z[i].selectedIndex != -1 && z[i].options[z[i].selectedIndex].getAttribute('rel2'))   // updated by Amin Mohadjer for case when select is empty
			enableFields(z[i].options[z[i].selectedIndex].getAttribute('rel2'));
	}
}

function enableFields(rel2)
{
	if (!rel2) return;
	var relations = rel2.split('|');       
	for(var k=0;k<relations.length;k++)    
	{                                      
		relation = relations[k];             
		if (relation == 'none') return;
		var elements = disabledFormFieldsPointers[relation];
		for (var i=0;i<elements.length;i++)
		{
			var flds = getFormFieldsForNode(elements[i]);
			for (var j=0;j<flds.length;j++)
			{
				//if (flds[j].type != 'select-one' || (flds[j].type == 'select-one' && !flds[j].getAttribute('parent')) || (flds[j].type == 'select-one' && flds[j].selectedIndex > 0))
					flds[j].disabled = false;
			}
		}
	}
}

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'))
		&& 
		!(tg.nodeName == 'INPUT' && tg.getAttribute('rel2'))
	   ) return;

	var fieldsToBeInserted = tg.getAttribute('rel');
	var fieldsToBeToggled = tg.getAttribute('rel2');

	if (tg.type == 'checkbox')
	{
		if (tg.checked)
		{
			intoMainForm(fieldsToBeInserted);
			enableFields(fieldsToBeToggled);
		}
		else
		{
			disableFields(fieldsToBeToggled);
			intoWaitingRoom(fieldsToBeInserted);
		}
	}
	else if (tg.type == 'radio')
	{
		disableOthers(tg.form[tg.name],fieldsToBeToggled);		
		removeOthers(tg.form[tg.name],fieldsToBeInserted);
		intoMainForm(fieldsToBeInserted);
		enableFields(fieldsToBeToggled);
	}
	else if (tg.type == 'select-one')
	{
		fieldsToBeInserted = tg.options[tg.selectedIndex].getAttribute('rel');
		fieldsToBeToggled = tg.options[tg.selectedIndex].getAttribute('rel2');
		if (!fieldsToBeInserted && !fieldsToBeToggled) return;        // added by Amin Mohadjer
		disableOthers(tg.form[tg.name],fieldsToBeToggled);		
		removeOthers(tg.options,fieldsToBeInserted);
		intoMainForm(fieldsToBeInserted);
		enableFields(fieldsToBeToggled);
	}
}

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 disableOthers(others,fieldsToBeToggled)
{
	for (var i=0;i<others.length;i++)
	{
		var show = others[i].getAttribute('rel2');
		if (show == fieldsToBeToggled) continue;
		disableFields(show);
	}
}

function intoWaitingRoom(relation)
{
	if (!relation) return;
	var relations = relation.split('|');
	for(var k=0;k<relations.length;k++) 
	{
		relation = relations[k];
		if (relation == 'none') return;
		var elements = hiddenFormFieldsPointers[relation];
		for (var i=0;i<elements.length;i++)
			waitingRoom.appendChild(elements[i]);
	}
}

function intoMainForm(relation)
{
	if (!relation) return;
	var relations = relation.split('|');
	for(var k=0;k<relations.length;k++)
	{
		relation = relations[k];
		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);
		}
	}
}

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
}

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;
}
