//  FormSerializer v1.0 by Bj�rn Rosell
//  Find more scripts here: www.prototypeDHTML.net
//
//  uses : toSource v1.0
//
//  Currently limited to RadioButtons, Texareas, Textfields and Checkboxes.
//  todo: Select-boxes, hidden, password

function FormSerializer(elmName) {
    this.elmName = elmName;
    this.fieldFilter = new FieldFilter();
}

FormSerializer.prototype.setFieldFilter = function(f) {
    this.fieldFilter = f;
}

FormSerializer.prototype.getFormByName = function(elmName) {
    var d = document;
    if (d.layers) for (var i = 0; i < d.forms.length; i++) if (d.forms[i].name == elmName) return d.forms[i];
    return (d.forms ? d.forms[elmName] : d.all ? d.all[elmName] : d.getElementById(elmName));
}

// Currently used for (and limited to) booking page 1, quickbook page and login page.
FormSerializer.prototype.getSubmitFormQuery = function() {                       
    var form = this.getFormByName(this.elmName);
    var str = '';
    var elements = form.elements;
    for (var i = 0; i < elements.length; i++) {
        var el = elements[i];
        if (el.name != null && el.name != '') {
            var value = null;
            if (el.type == 'radio') {
               if (el.checked) value = el.value;
            } else {
                value = escape(el.value);
            }
            if (value != null) {
                str += (str != '' ? '&' : '') + el.name + '=' + value;
            }
        }
    }
    return str;
}

FormSerializer.prototype.serializeToObject = function() {
    var form = this.getFormByName(this.elmName);
    var o = {}
    var p = form.elements;
    for (var i = 0; i < p.length; i++) {
        var name = p[i].name;
        if (this.fieldFilter.isAccepted(name)) {
            if (name != '') {
                switch (p[i].type) {
                    case 'select-one':
                        //o[p[i].name] = p[i].value;
                        var options = p[i].options;
                        for (var j = 0; j < options.length; j++) {
                            if (options[j].selected) o[p[i].name] = options[j].value;
                        }
                        break;
                    case 'textarea':
                    case 'text': {
                        o[p[i].name] = p[i].value;
                        break;
                    }
                    case 'hidden': {
                        o[p[i].name] = p[i].value;
                        break;
                    }
                    case 'radio': {
                        if (p[i].checked) o[name] = p[i].value;
                        break;
                    }
                    case 'checkbox': {
                        o[name] = p[i].checked;
                        break;
                    }
                }
            }
        }
    }
    return o;
}

FormSerializer.prototype.serialize = function() {                       
    return this.serializeToObject().toSource();
}
FormSerializer.prototype.populateFromObject = function(o) {
    var form = this.getFormByName(this.elmName);
    var p = form.elements;
    for (var i = 0; i < p.length; i++) {
        var name = p[i].name;
        if (this.fieldFilter.isAccepted(name)) {
            var value = o ? o[name] : '';
            switch (p[i].type) {
                case 'select-one':
                    var options = p[i].options;
                    for (var j = 0; j < options.length; j++) {
                        if (value == options[j].value) p[i].selectedIndex = j;
                    }
                    break;
                case 'textarea':
                case 'text': {
                    if (value != null) p[i].value = value;
                    break;
                }
                case 'radio': {
                    if (value == p[i].value) p[i].click();
                    break;
                }
                case 'checkbox': {
                    p[i].checked = value;
                    break;
                }
            }
        }
    }
}

FormSerializer.prototype.populate = function(s) {
    eval('this.populateFromObject(' + s + ')');
}

function FieldFilter() {
}

FieldFilter.prototype.isAccepted = function(name) {
    var accepted;
    accepted = name != "BookingCollection";
    return accepted;
}

/*
FormRestorer.store = function(aForms, fFilter) {  // Accepts list of forms. If none is passed, all forms on document is stored
    var o = this.getStoreCollection(aForms,fFilter);
    for (var item in o) {
        if (typeof(o[item]) == 'function') continue;
        //alert(item + ':' + o[item]);
        Cookie.set(item, o[item] + '', FormRestorer.options.cookieExpires);
    }
}

FormRestorer.storeInSingleCookie = function(groupName, aForms, fFilter) {
    var o = this.getStoreCollection(aForms, fFilter);
    if (!o.toSource) {
        alert('You have to include "tosource.js"');
        return;
    }
    //alert(o.toSource());
    Cookie.set(groupName, o.toSource(), FormRestorer.options.cookieExpires);
}

FormRestorer._restore = function(aForms, oGroup) {  // Accepts an array of forms. (nothing -> all forms on document)
    this.forms = aForms;
    if (this.forms.length == 0) this.forms = document.forms;
    var a = new Array();
    for (var j=0; j < this.forms.length; j++) {
        var p = this.forms[j];
        for (var i = 0; i < p.length; i++) {
            var value = (oGroup ? oGroup[p[i].name] : Cookie.get(p[i].name));
            //alert(value);
            switch (p[i].type) {
                case 'textarea':
                case 'text': {
                    if (value != null) p[i].value = value;
                    break;
                }
                case 'radio': {
                    value = parseInt(value);
                    if (value == -1) break;
                    var buts = document.all[p[i].name];
                    if (buts && buts[value]) buts[value].checked = true;
                    break;
                }
                case 'checkbox': {
                    p[i].checked = value;
                    break;
                }
            }
        }
    }
}

FormRestorer.restore = function(aForms) { // Accepts list of forms. If none is passed, all stored forms on document is restored
    FormRestorer._restore(aForms);
}

FormRestorer.restoreFromSingleCookie = function(groupName, aForms) { // Accepts list of forms. If none is passed, all stored forms on document is restored
    eval('o = ' + Cookie.get(groupName));
    FormRestorer._restore(aForms, o);
}

FormRestorer.options = {
    cookieExpires: new Date(new Date().getTime() + (3600000 * 24 * 30));
}
*/

