//-------------------- liveForm.js

function LiveForm( formName, url, options ) {
   this.form       = document.getElementsByName(formName)[0];
   this.options    = options;
   this.url        = url;
   this.controls = new Array();
   for (var i=0; i < this.form.elements.length; i++) {
        this.controls[this.form.elements[i].name] = this.form.elements[i];
   }
}

LiveForm.prototype = {

    update: function(query, callback) {

        // call LiveForm_onUpdate "event" in calling page
        if (typeof (window.LiveForm_onUpdate) == 'function') {
            window.LiveForm_onUpdate(this);
        }

        query = (!this.options.requestParameters ? '' : this.options.requestParameters.join('&') + '&') +
                (!query || query == '' ? '' : query + '&') +
                jQuery(this.form).serialize();

        var thisObj = this;
        if (typeof (callback) == 'function') {
            fn = function(data, textStatus) { thisObj.ajaxUpdate(data, textStatus); callback(this, data, textStatus); };
        } else {
            fn = function(data, textStatus) { thisObj.ajaxUpdate(data, textStatus); };
        }

        jQuery.post(this.url, query, fn, "xml");

    },

    ajaxUpdate: function(data, textStatus) {

        for (var i = 0; i < data.getElementsByTagName('control').length; i++) {
            var controlEl = data.getElementsByTagName('control')[i];
            var controlName = controlEl.getAttribute('name');
            var control = this.controls[controlName];

            if (control) {

                if (control.type == 'select-one') {
                    this.updateOptions(control, controlEl);
                }

                var container = document.getElementById(controlEl.getAttribute('containerElement'));
                var show = !(controlEl.getAttribute('show') == 'false');

                if (typeof (window.LiveForm_onToggleShow) == 'function' && container) {
                    // call LiveForm_onToggleShow "event" in calling page
                    window.LiveForm_onToggleShow(container, show);
                }

            }
        }

        // call LiveForm_onUpdate "event" in calling page
        if (typeof (window.LiveForm_onUpdateComplete) == 'function') {
            window.LiveForm_onUpdateComplete(this, data);
        }

    },

    updateOptions: function(control, controlEl) {
        var slaveOptions = this.createOptions(controlEl);

        var selectedOptions = [];

        // preserve selected options if possible
        for (var i = 0; i < control.options.length; i++) {
            if (control.options[i].selected && control.options[i].value != '') {
                selectedOptions.push(control.options[i].value);
            }
        }

        control.length = 0;
        var optionsObj = control.options;
        for (var i = 0; i < slaveOptions.length; i++) {
            for (var j = 0; j < selectedOptions.length; j++) {
                if (slaveOptions[i].value == selectedOptions[j]) {
                    slaveOptions[i].selected = true;
                }
            }
            optionsObj.add(slaveOptions[i]);
        }
    },

    createOptions: function(controlEl) {
        var newOptions = [];
        var entries = controlEl.getElementsByTagName('option');
        for (var i = 0; i < entries.length; i++) {
            var text = this.getElementContent(entries[i]);
            var value = entries[i].getAttribute('value');
            newOptions.push(new Option(text, value));
        }
        return newOptions;
    },

    getElementContent: function(element) {
        return element.text != undefined ? element.text : element.textContent;
    }

};


