var containerTag = 'TR'; // can be any tag name

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 selects = document.getElementsByTagName('select');
    for (var i=0;i<selects.length;i++)
        addEventSimple(selects[i],'change',showHideFields)

    var containers = document.getElementsByTagName(containerTag);
    var hiddenFields = new Array;
    for (var i=0;i<containers.length;i++) {
        if (containers[i].getAttribute('rel')) {
            var y = getAllFormFields(containers[i]);
            containers[i].nestedRels = new Array();
            for (var j=0;j<y.length;j++) {
                var rel = y[j].getAttribute('rel');
                if (!rel || rel == 'none') continue;
                containers[i].nestedRels.push(rel);
            }
            if (!containers[i].nestedRels.length) containers[i].nestedRels = null;
            hiddenFields.push(containers[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();
    addEventSimple(document,'click',showHideFields);
}

function setDefaults() {
    var inputs = document.getElementsByTagName('input');
    for (var i=0;i<inputs.length;i++) {
        if (inputs[i].checked && inputs[i].getAttribute('rel'))
            intoMainForm(inputs[i].getAttribute('rel'))
    }
    var selects = document.getElementsByTagName('select');
    for (var i=0;i<selects.length;i++) {
        if (selects[i].options[selects[i].selectedIndex].getAttribute('rel'))
            intoMainForm(selects[i].options[selects[i].selectedIndex].getAttribute('rel'))
    }
}

function showHideFields(e) {
    var evt = e || window.event;
    var evtTarget = evt.target || evt.srcElement;
    if (evtTarget.nodeName == 'LABEL') {
        var relatedFieldName = evtTarget.getAttribute('for') || evtTarget.getAttribute('htmlFor');
        evtTarget = document.getElementById(relatedFieldName);
    }
        
    if (
        !(evtTarget.nodeName == 'SELECT' && e.type == 'change')
        &&
        !(evtTarget.nodeName == 'INPUT' && evtTarget.getAttribute('rel'))
       ) return;

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

    if (evtTarget.type == 'checkbox') {
        if (evtTarget.checked)
            intoMainForm(fieldsToBeInserted);
        else
            intoWaitingRoom(fieldsToBeInserted);
    }
    else if (evtTarget.type == 'radio') {
        removeOthers(evtTarget.form[evtTarget.name],fieldsToBeInserted)
        intoMainForm(fieldsToBeInserted);
    }
    else if (evtTarget.type == 'select-one') {
        fieldsToBeInserted = evtTarget.options[evtTarget.selectedIndex].getAttribute('rel');
        removeOthers(evtTarget.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 addEventSimple(obj,evt,fn) {
    if (obj.addEventListener)
        obj.addEventListener(evt,fn,false);
    else if (obj.attachEvent)
        obj.attachEvent('on'+evt,fn);
}

function removeEventSimple(obj,evt,fn) {
    if (obj.removeEventListener)
        obj.removeEventListener(evt,fn,false);
    else if (obj.detachEvent)
        obj.detachEvent('on'+evt,fn);
}

addEventSimple(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
}


