﻿window.fast.iform = function(mcfg) {

    var id = null;
    var obj = null;
    var self = this;

    function form() {
        var res = null;
        if (obj) {
            res = obj;
        } else if (id) {
            res = $(id);
        } else {
            res = $(document.forms[0]);
        }
        return res;
    }
    this.selectForm = function(form) {
        if (typeof form == "string") {
            id = form;
        } else if (form) {
            obj = $(form);
        };
    };
    this.selectForm(mcfg);

    this.focus = function(field) {
        form().e[field].focus();
    };
    function setState(fields, state) {
        fields = (fields.length && (fields.tagName != "SELECT") ? fields : [fields]);
        for (var i = 0, l = fields.length; i < l; i++) {
            fields[i].disabled = !state;
        }
    }
    this.disable = function(field) {
        if (typeof field == "undefined") {
            setState(form().e.elements, false);
        } else {
            setState(form().e[field], false);
        }
    }

    this.enable = function(field) {
        if (typeof field == "undefined") {
            setState(form().e.elements, true);
        } else {
            setState(form().e[field], true);
        }
    }

    this.setDataFromJSON = function(obj) {
        for (field in obj) {
            self.set(field, obj[field]);
        }
    }

    this.getDataAsJSON = function() {
        var fl = self.getFields();
        var all = {};
        for (var i = 0, l = fl.length; i < l; i++) {
            all[fl[i]] = self.get(fl[i]);
        }
        return all;
    };

    this.getDataAsQueryString = function() {
        var field_collection = self.getDataAsJSON();

        var data = null;

        for (field in field_collection) {
            if (typeof field_collection[field] != "function") {
                if (data) {
                    data += "&";
                } else {
                    data = "";
                }
                if (typeof field_collection[field] == "string") {
                    data += (field + "=" + encodeURI(field_collection[field]).replace(/&/g, "%26"));
                } else {
                    if (field_collection[field].length == 0) {
                        data += (field + "=");
                    } else {
                        for (var count = 0; count < field_collection[field].length; count++) {
                            if (data && count) {
                                data += "&";
                            }
                            data += (field + "=" + encodeURI(field_collection[field][count]).replace(/&/g, "%26"));
                        }
                    }
                }
            }
        }

        return data;

    };

    this.validate = function(data) {
        var result = true;
        fields:
        for (field in data.rules) {
        
            rules:
            for (rule in data.rules[field]) {
				var value = self.get(field);
                if (rule == "value" && value != "" ) {
                    result = (data.rules[field].value == value );
                };
                if (rule == "mandatory") {
                    result = (value != "");
                };
                if (rule == "email" && value != "" ) {
                    result = value.match(/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i) ? true : false;
                };
                if (rule == "regexp" && value != "" ) {
                    result = (value.match(data.rules[field].regexp) ? true : false);
                };
                if (!result) {
                    if (data.actions && data.actions[field]) {
						var action = data.actions[field];
						if( typeof action == "string" ) {
	                        alert(action);
	                       try {
								self.focus(field);
							} catch (e) {}; 
	                    } else {
							if( action.message ) {
								alert(action.message);
							};
							if( action.focus ) {
								try {
									self.focus(field);
								} catch (e) {}; 
							};
							if( action.applyClass ) {
								$(form().e[field]).addClass(action.applyClass);
							};
	                    }; 
                    };
                    break fields;
                };
            };
        };
        return result;
    };

    this.getFields = function() {
        var el = form().e.elements;
        var f = new Array();
        for (var i = 0, l = el.length; i < l; i++) {
            if (el[i].name && el[i].tagName != "FIELDSET" && f.indexOf(el[i].name) == -1) {
                f.push(el[i].name);
            }
        }
        return f;
    }

    this.get = function(field) {
        var f = form().e[field], v = new Array();
        var type = f.type || f[0].type;
        if (f.length) {
            switch (type) {
                case "checkbox":
                case "radio":
                    for (i = 0, l = f.length; i < l; i++) {
                        if (f[i].checked) {
                            v.push(f[i].value);
                        };
                    };
                    break;
                case "select-one":
                case "select-multiple":
                    for (var i = 0, l = f.options.length; i < l; i++) {
                        if (f[i].selected) {
                            v.push(f[i].value);
                        };
                    };
                    break;
                default:
                    for (i = 0, l = f.length; i < l; i++) {
                        v.push(f[i].value);
                    };
                    break;
            };
        } else {
            switch (type) {
                case "checkbox":
                case "radio":
                    if (f.checked) {
                        v = f.value;
                    };
                    break;
                default:
                    v = f.value;
                    break;
            };
        };
        return v;
    };
    this.set = function(field, value) {
        var f = form().e[field];
        var type = f.type || f[0].type;
        if (f.length) {
            value = (typeof value == "string") ? value.split(",") : value;
            switch (type) {
                case "checkbox":
                case "radio":
                    for (i = 0, l = f.length; i < l; i++) {
                        f[i].checked = (value.indexOf(f[i].value) != -1);
                    };
                    break;
                case "select-one":
                case "select-multiple":
                    for (var i = 0, l = f.options.length; i < l; i++) {
                        f[i].selected = (value.indexOf(f[i].value) != -1);
                    };
                    break;
                default:
                    for (var i = 0, l = f.length; i < l; i++) {
                        f[i].value = value.join(",");
                    };
                    break;
            };
        } else {
            value = (typeof value == "string") ? value : value.join(",");
            switch (type) {
                case "checkbox":
                case "radio":
                    f.checked = (f.value == value);
                    break;
                case "select-one":
                case "select-multiple":
                    f.selected = (f.value == value);
                    break;
                default:
                    f.value = value;
                    break;
            };
        };
    };
};
window.fast.form = new window.fast.iform();
