﻿String.prototype.trim = function() {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};

var addClass = function(el, cls) {
    if (el.className.lastIndexOf(cls) == -1) {//make sure we don't add error if it's already there ;)
        el.className = el.className + " " + cls;
    }
}
var removeClass = function(el, cls) {
    el.className = el.className.replace(" " + cls, "");
}

var validations = {

    isPostalcode: function(str) {
        var filter = /^([0-9]){5}$/
        return filter.test(str)
    },
    isPhone: function(str) {
        var filter = /^([0-9+]){10}$/;
        return filter.test(str);
    },
    isEmail: function(str) {
        var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2,4})+$/;
        return filter.test(str);
    },
    isMonth: function(str) {
        var filter = /^([0-9]){2}$/;
        return filter.test(str);
    },
    isYear: function(str) {
        var filter = /^([0-9]){4}$/;
        return filter.test(str);
    },
    isFilled: function(str) {
        return (str.trim() == "") ? false : true;
    },
    isChecked: function(a) {
        var i = a.length;
        while (i--)
        {
            if (a[i] === true) { return true; }
        }
        return false;
    }
}

var validate = function(o,fields) {
    var valid = true,
        errorClass = 'error';

    for (var prop in o) {
        var item = o[prop];
        if (item.required) {
            var conditions = item.condition.split(' '),
                                i = conditions.length;
            while (i--) {

                if (typeof (fields[item.node]) != 'undefined' && item.content == fields[item.node]) {
                    addClass($(item.node), errorClass);
                    valid = valid && false;
                }
                else {
                    if (!validations[conditions[i]](item.content)) {
                        addClass($(item.node), errorClass);
                        valid = valid && false;
                    }
                    else {
                        removeClass($(item.node), errorClass);
                        valid = valid && true;
                    }
                }
            }
        }
    }

    return valid;
}

var utils = {
    brands: [],
    models: [],
    dealers: [],
    populateBrands: function(url, target) {
        new Ajax.Request(url,
        {
            method: 'get',
            onSuccess: function(transport) {
                utils.brands = transport.responseJSON;
                utils.addBrandOptions(target, utils.brands);
                updateFields();
            },
            onFailure: function() { /* handle with care */ }
        });
    },
    populateDealers: function(url) {
        new Ajax.Request(url,
            {
                method: 'get',
                onSuccess: function(transport) {
                    utils.dealers = transport.responseJSON;
                },
                onFailure: function() { /* handle with care */ }
            });
    },
    addSelectOption: function(selectObj, text, value, isSelected) {
        if (selectObj != null && selectObj.options != null) {
            selectObj.options[selectObj.options.length] = new Option(text, value, false, isSelected);
        }
    },

    addBrandOptions: function(target, collection) {
        var c = collection || utils.brands;
        $A(c).each(function(s, index) {
            utils.addSelectOption($(target), s["Name"], s["Name"], false);
        });
    },
    addYears: function(target, from, to) {
        for (var i = from, j = to; i <= j; i++) {
            utils.addSelectOption($(target), i, i, false);
        }
    }
}