/*jslint strict:true, evil: true, onevar: true, nomen: false  */ /*global $, jQuery, console, hbx, window, ndm, document, each  */

"use strict";

/*
    Function: jQuery.fn.CG_validate
    Form validation for cases where there is more than one form on the screen
    The form object itself is passed to the validator by id or class
*/

var CG_ajaxFormValid = true,
    CG_ajaxform_posted = false;

jQuery.fn.CG_validator = function(options) {
    $(this).each(function(){
        var validOptions = jQuery.extend({
            errorElement:"span",
            errorClass:"error",
            ajaxSubmit:false
            },options||{}),

            formValid = true,

            CG_checkAlpha = function(fieldObj){

            },

            CG_checkDecimal = function(fieldObj){
                /*  Rules - must be only numbers and one single dot
                    Dot can't be at beginning
                */
                var fieldVal = $(fieldObj).val(),
                    dotSegs = fieldVal.split(".");

                if((parseInt($(fieldObj).val(),10) || $(fieldObj).val() < 1) && dotSegs.length < 3){
                    return true;
                }else{
                    return false;
                }
            },

            CG_checkDigits = function(fieldObj){
                if(parseInt($(fieldObj).val(),10) && $(fieldObj).val().indexOf(".") === -1){
                    return true;
                }else{
                    return false;
                }
            },

            CG_checkEmail = function(fieldObj){
                /*  Rules - must have an @ and a dot
                    Dot can't be at end, @ can't be at beginning
                */
                var fieldVal = $(fieldObj).val();
                if(fieldVal.indexOf("@") !== -1 && fieldVal.indexOf(".") !== -1 && fieldVal.substring(0,1)!== "@" && fieldVal.substring(fieldVal.length-1)!== "."){
                    return true;
                }else{
                    return false;
                }
            },

            CG_checkMoney = function(fieldObj){
                /*  Rules
                    If it has a dot it must be followed by 2 numbers
                    Dot can't be at beginning
                */
                var fieldVal = $(fieldObj).val(),
                    dollarSegs = fieldVal.split("."),
                    validDot = true;

                if(dollarSegs.length === 2 && dollarSegs[1].length !== 2){
                    validDot = false;
                }

                if(parseFloat($(fieldObj).val()) !== "NaN" && dollarSegs[0].length > 0 && validDot){
                    return true;
                }else{
                    return false;
                }
            },

            CG_checkPhone = function(fieldObj){
                /*  Rules supplied by Drive  */
                var fieldVal = $(fieldObj).val();

                var AusLndlnePtrn = /^(\+61|0)([2,3,7,8])(\d{8})$/;
                var AusMobPtrn = /^(\+61|0)(4\d)(\d{7})$/;
                var OvrseasPtrn = /^(\+\d{1,3})(\d{6,15})$/;
                var AusSpecPtrn = /((1300|1800)(\d{6}))$/;

                if(!AusLndlnePtrn.test(fieldVal) && !AusMobPtrn.test(fieldVal) && !OvrseasPtrn.test(fieldVal) && !AusSpecPtrn.test(fieldVal)){
                    return false;
                }else{
                    return true;
                }
            },

            CG_checkSelect = function(fieldObj){
                var fieldVal = $(fieldObj).val();
                if(fieldVal === "" || fieldVal === "--"){
                    return false;
                }else{
                    return true;
                }
            },

            CG_checkLengthMin = function(fieldObj,minLength){
                if($(fieldObj).val().length < minLength){
                    return false;
                }else{
                    return true;
                }
            },

            CG_checkLengthMax = function(fieldObj,maxLength){
                if($(fieldObj).val().length > maxLength){
                    return false;
                }else{
                    return true;
                }
            },

            CG_checkRequired = function(fieldObj){
                if($(fieldObj).val() !== ""){
                    return true;
                }else{
                    return false;
                }
            },

            CG_checkNotZero = function(fieldObj){
                if(parseFloat($(fieldObj).val()) !== 0){
                    return true;
                }else{
                    return false;
                }
            },

            CG_showInlineError = function(fieldObj,errTyp){
                //Check if an error already exists
                var messages = validOptions.messages,
                    labelObj = $(fieldObj).parent("label"),
                    errorObjs = $(labelObj).find(validOptions.errorElement+"."+validOptions.errorClass),
                    msgTxt = errTyp,
                    msgDef = messages[fieldObj.attr("id")];

                if(msgDef !== "NULL" && msgDef !== "undefined"){
                    if(typeof(msgDef) === "string"){
                        msgTxt = msgDef;
                    }else{
                        if(msgDef[errTyp] !== "NULL" && msgDef[errTyp] !== "undefined"){
                            msgTxt = msgDef[errTyp];
                        }
                    }
                }

                if(errorObjs.length > 0){
                    errorObjs.eq(0).text(msgTxt);
                }else{
                    $(labelObj).append('<'+validOptions.errorElement+' class="'+validOptions.errorClass+'">'+msgTxt+'</'+validOptions.errorElement+'>');
                }
            },

            CG_checkFieldValidInline = function(fieldObj){
                var fieldTyp = $(fieldObj).attr("itype"),
                    fieldReq = $(fieldObj).attr("required"),
                    fieldMin = $(fieldObj).attr("minlength"),
                    fieldMax = $(fieldObj).attr("maxfldlength"),
                    fieldZero = $(fieldObj).attr("zeroallowed"),
                    fieldValid = true;

                if(fieldReq || fieldReq === "true"){
                    fieldValid = CG_checkRequired(fieldObj);
                    if(!fieldValid){ CG_showInlineError($(fieldObj),"required"); return false; }
                }

                if(fieldMin !== ""){
                    fieldValid = CG_checkLengthMin(fieldObj,fieldMin);
                    if(!fieldValid){ CG_showInlineError($(fieldObj),"minlength"); return false; }
                }

                if(fieldMax !== ""){
                    fieldValid = CG_checkLengthMax(fieldObj,fieldMax);
                    if(!fieldValid){ CG_showInlineError($(fieldObj),"maxfldlength"); return false; }
                }

                if(fieldZero === "false"){
                    fieldValid = CG_checkNotZero(fieldObj);
                    if(!fieldValid){ CG_showInlineError($(fieldObj),"zeroallowed"); return false; }
                }


                if(fieldReq === "true" || $(fieldObj).val() !== ""){
                    switch(fieldTyp){
                        case "alpha":
                            fieldValid = CG_checkAlpha(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "digits":
                            fieldValid = CG_checkDigits(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "decimal":
                            fieldValid = CG_checkDecimal(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "email":
                            fieldValid = CG_checkEmail(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "money":
                            fieldValid = CG_checkMoney(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "phone":
                            fieldValid = CG_checkPhone(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        case "select":
                            fieldValid = CG_checkSelect(fieldObj);
                            if(!fieldValid){ CG_showInlineError($(fieldObj),fieldTyp); }
                            break;
                        default:
                            break;
                    }
                }

                if(fieldValid){
                    $(fieldObj).parent("label").find(validOptions.errorElement+"."+validOptions.errorClass).remove();
                }
                return fieldValid;
            },

            CG_checkForErrorsOnSubmit = function(formObj){
                var errorsFound = false,
                    formFields = $(formObj).find("input,textarea,select");

                $(formFields).each(function(){
                    if(!CG_checkFieldValidInline($(this))){
                        errorsFound = true;
                    }
                });
                if(errorsFound){
                    formValid = false;
                }else{
                    formValid = true;
                }
                return formValid;
            },

            rules = validOptions.rules;

        //Handle the submit
        $(this).submit(function(){
            //Check all the fields are valid and only submit if OK
            if(validOptions.ajaxSubmit){
                CG_ajaxFormValid = CG_checkForErrorsOnSubmit($(this));
                return false;
            }else{
                return CG_checkForErrorsOnSubmit($(this));
            }
        });

        //Use the rules and the messages to determine the errors
        jQuery.each(rules,function(fieldID,fieldRules){
            //Loop through the fieldRules and apply the events to the field object
            $("#"+fieldID).eq(0).attr({
                "required":"false",
                "minlength":"",
                "maxfldlength":"",
                "zeroallowed":"true",
                "itype":""
            });

            jQuery.each(fieldRules,function(ruleID,ruleVal){
                switch(ruleID){
                    case "required":
                        $("#"+fieldID).attr("required",ruleVal);
                        break;
                    case "minlength":
                        $("#"+fieldID).attr("minlength",ruleVal);
                        break;
                    case "maxlength":
                        $("#"+fieldID).attr("maxfldlength",ruleVal);
                        break;
                    case "zeroallowed":
                        $("#"+fieldID).attr("zeroallowed",ruleVal);
                        break;
                    case "digits":
                        $("#"+fieldID).attr("itype","digits");
                        break;
                    case "decimal":
                        $("#"+fieldID).attr("itype","decimal");
                        break;
                    case "alpha":
                        $("#"+fieldID).attr("itype","alpha");
                        break;
                    case "email":
                        $("#"+fieldID).attr("itype","email");
                        break;
                    case "money":
                        $("#"+fieldID).attr("itype","money");
                        break;
                    case "phone":
                        $("#"+fieldID).attr("itype","phone");
                        break;
                    case "select":
                        $("#"+fieldID).attr("itype","select");
                        break;
                }
            });

            $("#"+fieldID).blur(function(){
                CG_checkFieldValidInline($(this));
            });
        });
    });
};

