(function(jQuery) {
    $.fn.lsvalidate = function(options) {
        //append error style to head
        var image1 = jQuery('<img />').attr('src', '/include/jquery/images/busy.gif');
        lsvalStyles = '<style type="text/css">'
        lsvalStyles += 'tr.error td { border-style: solid none solid none; border-width: 1px; border-color: #6E1422!important; background-color: #FEC7AF!important; border-collapse: separate!important; }'
        lsvalStyles += '';
        lsvalStyles += '</style>';
        jQuery('head').append(lsvalStyles);
        //Define regular expressions for various input types
        emailReg = /^([a-zA-Z0-9_.-.'.+])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
        dateReg = /^\d{2}(\/)\d{2}\1\d{4}$/;
        usPhoneReg = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;
        isNumericReg = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
        usZipReg = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
        isDateReg = /^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/;
        //Get the form ID
        theFormID = "#" + this.get()[0].id;
        //Start the Check on submition
        jQuery(theFormID).submit(function(event) {
            checkboxError = ""; 
            jQuery("#submitErrors").remove();
            formIDInputs = jQuery(theFormID + " :input");
            var firstAlert = "";
            var finalAlert = "";
            $.each(formIDInputs, function(i, n) {
                var elemTitle = this.title;
                var elemID = '#' + this.id;
                var elemVal = jQuery(elemID).val();
                //Validate that it has a value (required if title is present)
                if (elemTitle != '') {
                    if (!elemVal) {
                        if (!firstAlert) { firstAlert = elemID; }
                        finalAlert = finalAlert + "<li>" + elemTitle + "</li>";
                        errorItem(elemID);
                    }
                }
                //Validate Email format
                if ((jQuery(this).hasClass("validemail") || jQuery(this).hasClass("valid_email")) && !emailReg.test(elemVal) && elemVal) {
                    if (!firstAlert) { firstAlert = elemID; }
                    finalAlert = finalAlert + "<li>Valid Email (example joe@site.com)</li>";
                    errorItem(elemID);
                }
                //Validate Date format
                if ((jQuery(this).hasClass("validdate") || jQuery(this).hasClass("valid_date")) && !isDateReg.test(elemVal) && elemVal) {
                    if (!firstAlert) { firstAlert = elemID; }
                    finalAlert = finalAlert + "<li>Valid Date (example: 07/01/2009)</li>";
                    errorItem(elemID);
                }
                //Validate Zip Code
                if ((jQuery(this).hasClass("validezip") || jQuery(this).hasClass("valid_zip")) && !usZipReg.test(elemVal) && elemVal) {
                    if (!firstAlert) { firstAlert = elemID; }
                    finalAlert = finalAlert + "<li>Valid Zip Code Format</li>";
                    errorItem(elemID);
                }
                //Validate Is Number
                 if ((jQuery(this).hasClass("validenum") || jQuery(this).hasClass("valid_num")) && !isNumericReg.test(elemVal) && elemVal) {
                    if (!firstAlert) { firstAlert = elemID; }
                    finalAlert = finalAlert + "<li>Must be a number</li>";
                    errorItem(elemID);
                }              
                //Validate group of checkbox
                if ( jQuery(this).parent().hasClass("checkone") || jQuery(this).parent().parent().hasClass("checkone") ) {
                   somethingchecked = 0;                    
                   jQuery(this).parent().children().each ( function() {
                        if ( $(this).attr('checked') ) { somethingchecked = 1;}
	                });
		            if ( somethingchecked == 0  ) {
		                if (!firstAlert) { firstAlert = elemID; }
		                    if(!checkboxError) { 
		                        checkboxError =  "<li>Missing Required Check Boxes<br/>(Check at least one per area)</li>";
		                        finalAlert = finalAlert + checkboxError; 
		                    }
		                errorItem(elemID);
		             }
                 }              
            });
            if (finalAlert) {
                //stop the Submit
                event.preventDefault();
                var divOffset = jQuery(firstAlert).offset().top - 20;
                jQuery('html,body').animate({ scrollTop: divOffset }, 1000, function() {
                finalAlert = "The following highlighed areas require at least one selection or valid value:<ul style='margin-left:30px;'>" + finalAlert + "</ul>";
                finalAlertfooter = "<p style='color:red;'>Remember to <strong>RE-SUBMIT</strong> your form after you have made the highlighted corrections.</p>";
                finalAlert = "<div id='submitErrors' title='Submission Errors' style='dispaly:none;top:0px;text-align:left;' >" + finalAlert + finalAlertfooter + "</div>";
                jQuery("body").append(finalAlert);
                jQuery("#submitErrors").dialog({ resizable: false });
                });
                checkboxError = "";
            }
            else {
                processingDialog = "<div id='processingDialog' title='Processing your form...'><p style='text-align:left;font-size:14px;font-height:1.1em;'><img src='/include/jquery/images/busy.gif' style='margin-bottom:30px;margin-right:10px;' align='left' /> Please do not click the back button or reload this page...</p></div>"
                jQuery("body").append(processingDialog);
                jQuery("#processingDialog").dialog({ resizable: false, modal: true, closeOnEscape: false, draggable: false, resizable: false, height: 120 });
                jQuery('.ui-dialog-titlebar-close').css({ 'visibility': 'hidden' });
            }
            return true;
        });
        function errorItem(elemID) {
            jQuery(elemID).parent().parent().addClass("error");
            jQuery(elemID).focus(function() { jQuery(this).parent().parent().removeClass("error"); jQuery("#submitErrors").remove(); })
        }

    };
})(jQuery);
