﻿//String.prototype.namespace = function(separator){
//  this.split(separator || '.').inject(window, function(parent, child) {
//    var o = parent[child] = { }; return o;

/*
ar myClass = function()
{
/* here starts the private 'body' /
var birthtime = new Date();
return {
/ here starts the public ‘body’ 
name:”a Simple Class Instance”,
whatsYourName:function()
{
alert(’Hello, I am ‘+this.name);
alert(’I was born on ‘+birthtime.toLocaleString());
}
}
};
*/
var Display_Errors = {}
var base_public_folder = "../Public/";
var Check =
{
    forNull: function(value, message)
    {
        if (value == null || value == undefined)
            throw message;
    },
    forEmptyString: function(value, message)
    {

        if (value == null || value.length == 0)
            throw message;
    },
    forElement: function(value, message)
    {

        if (value && value.nodeType == 1)
            return true;
        else
            throw message;
    }
}
//ClientSide Validation-------------------------------------------------------------
function ValidateForm(form)
{

    var valid = true;

    $("input.required,input.email,input.social,input.date,select.required,textarea.required").each(function(i)
    {
        if (!ValidateField(this))
            valid = false;
    });



    return valid;
}
function ValidateField(elem)
{
    hideErrors(elem);
    var errors = [];
    var count = 10;
    for (var name in errMsg)
    {
        //if (count-- > 0) alert("className: " + elem.className + " errMsg Name: " + name);
        var re = new RegExp("(^|\\s)" + name + "(\\s|$)");
        if (re.test(elem.className) && !errMsg[name].test(elem))
        {

            if (name == "required")
            {
                var required = errMsg[name].msg.replace("{0}", UserFriendly(elem.name));            
                errors.push(required);
            }
            else
                errors.push(errMsg[name].msg);
        }
        else
        {
            showValid(elem);
        }
    }
    if (errors.length > 0)
    {
        showErrors(elem, errors);
    }
    return errors.length == 0;
}
function UserFriendly(name)
{
    var strResult = "";
    var split = name.split('_');
    if (split.length > 0)
    {
        for (var i = 0; i < split.length; i++)
        {
            if (split[i].length > 0)
            {
                if (i == 0 && split[i].length == 1)
                {
                    if (split[i] == "p")
                        strResult += "Permanent ";
                    if (split[i] == "l")
                        strResult += "Local ";
                }
                else
                {
                    if (split[i] == "grad")
                        split[i] = "Graduate School";
                    var current = split[i];
                    Check.forNull(current, "current was null");
                    strResult += current.substring(0,1).toUpperCase() + current.substring(1, current.length) + " ";

                }
            }
        }

    }
    else
    {
        strResult = name.substring(0,1).toUpperCase() + name.substring(1, name.length);
    }
    return strResult;
}
function showValid(elem)
{
    if (elem.value != '')
    {
        var next = elem.nextSibling;
        if (next && (next.nodeName != "IMG" || next.className != "required_image"))
        {
            $(elem).after("<img src='" + base_public_folder + "images/validation_valid.gif' class='required_image' />");
        }
        else
        {
            $(next).attr("src", base_public_folder + "images/validation_valid.gif");
        }
    }
}
function hideErrors(elem)
{
   var fr_name = UserFriendly(elem.name);
    var removals = [];
    if ($("#client_errors").length > 0)
    {
        $("#client_errors li").each(function(i, item)
        {
            var result = $(this).text();
            if (result.search(fr_name) != -1)
            {
                removals.push(this);
            }
        });
        for(var j = 0; j < removals.length; j++)
        {
            $(removals[j]).remove();
        }
        if ($('#client_errors li').length <= 0)
        {
            $("#errors_summary").remove();
        } 
    }
   //TODO: hide individual errors and see if its already in here before adding
    var next = elem.nextSibling;
    if ($(elem).hasClass("required"))
    {
        $(next).attr("src", base_public_folder + "images/validation_required.gif");
        // $j(elem.parentNode).before("<img src='../../content/images/validation_valid.gif' class='required_image' />");
        //next = document.createElement("img");
        //next.className = "required_image";
        //next.attributes.setNamedItem(
        //elem.parentNode.insertBefore(next, elem.nextSibling);
    }
    else
    {
        if ($(next).hasClass("required_image"))
        {
            $(next).remove();
        }
    }

}

function showErrors(elem, errors)
{
    var next = elem.nextSibling;
    if (next && (next.nodeName != "IMG" || next.className != "required_image"))
    {
        
        $(elem).after("<img src='" + base_public_folder + "images/validation_error.gif' class='required_image' />");
        // $(elem.parentNode).before("<img src='" + base_public_folder + "images/validation_error.gif' class='required_image' />");
        //next = document.createElement("img");
        //next.className = "required_image";
        //next.attributes.setNamedItem(
        //elem.parentNode.insertBefore(next, elem.nextSibling);
    }
    else if (!next)
    {
      
        $(elem).after("<img src='" + base_public_folder + "images/validation_error.gif' class='required_image' />");
    }
    else
    {
        $(next).attr("src", base_public_folder + "images/validation_error.gif");
    }

    if ($("#client_errors").length > 0)
    {
        for (var i = 0; i < errors.length; i++)
        {
            $("#client_errors").append("<li><img class='image_required' src='" + base_public_folder + "images/validation_error.gif' />" + errors[i] + "</li>");
        }
    }
    else
    {
        $("#main").prepend("<div id='errors_summary'><h3 id='header_errors'>Please correct the following errors.</h3><ol id='client_errors'></ol></div>");
        $("#client_errors").append("<li><img class='image_required' src='" + base_public_folder + "images/validation_error.gif' />" + errors[0] + "</li>");
    }
    /*
    for (var i = 0; i < errors.length; i++)
    {
    var li = document.createElement("li");
    li.innerHTML = errors[i];
    next.appendChild(li);
    } */
}
var Validator =
{
    getInputByName: function(name)
    {
        Check.forEmptyString(name, "Name passed to getInputByName was empty");
        var results = [];
        results.numChecked = 0;

        $("input").each(function(i)
        {
            if (this.name == name)
            {
                results.push(this);
            }
            if (this.checked)
            {
                results.numChecked++;
            }
        });
        return results;
    },
    checkRequired: function(elem)
    {

        Check.forElement(elem, "Element passed to checkRequired was null or not a dom element.");
        //alert("Element value passed to required: " + elem.value);
        if (elem.type == "checkbox" || elem.type == "radio")
            return Validator.getInputByName(elem.name).numChecked;
        else if (elem.nodeName == "SELECT")
        {
            //TODO: figure out a way to handle selects
        }
        else
        {
            //alert(elem.name + " with value: " + elem.selectedValue + " has default value " + elem.defaultValue);
            return elem.value.length > 0
        }
    },
    checkEmail: function(elem)
    {
        Check.forElement(elem, "Element passed to checkEmail was null or not a dom element.");
        //alert("Element value passed to email: " + elem.value);
        return elem.value.length == 0 ||
        /^[a-z0-9_+.-]+\@([a-z0-9-]+\.)+[a-z0-9]{2,4}$/i.test(elem.value);
    },
    checkPhone: function(elem)
    {
        Check.forElement(elem, "Element passed to Validator.checkPhone was null or not a dom element.");
        //alert("Element value passed to phone: " + elem.value);
        var m = /^\(?\d{3}\)\s\d{3}-\d{4}$/.exec(elem.value);
        // If it is, seemingly, valid - force it into the specific
        // format that we desire: (123) 456-7890
        return elem.value.length == 0 || m !== null;
    },
    checkDate: function(elem)
    {
        Check.forElement(elem, "Element passed to Validator.checkDate was null or not a dom element.");
        //alert("Element value passed to date: " + elem.value);
        return elem.value.length == 0 || /^\d{2}\/\d{2}\/\d{4}$/.test(elem.value);
    },
    checkSocial: function(elem)
    {
        Check.forElement(elem, "Element passed to Validator.checkSocial was null or not a dom element.");
        //alert("Element value passed to social: " + elem.value);
        return elem.value.length == 0 || /^\d{3}-\d{2}-\d{4}$/.test(elem.value);
    }

}

var errMsg =
{
    required:
    {
        msg: "{0} is required.",
        test: function(obj) { return Validator.checkRequired(obj); }
    },
    email:
    {
        msg: "Not a valid email.",
        test: function(obj) { return Validator.checkEmail(obj); }
    },
    phone:
    {
        msg: "Not a valid phone number. Valid Example: (806)-999-9999",
        test: function(obj) { return Validator.checkPhone(obj); }
    },
    date:
    {
        msg: "Not a valid date. Valid Example: MM/DD/YYYY",
        test: function(obj) { return Validator.checkDate(obj) }
    },
    social:
    {
        msg: "Not a valid social. Valid Example: 999-99-9999",
        test: function(obj) { return Validator.checkSocial(obj) }
    }
}
//----------------------------------------------------------------------------------

