﻿
/// <reference path="Required/jquery-ui.min-vsdoc.js" />

/// <reference path="Required/jquery.min-vsdoc.js" />

/// <reference path="Required/jquery.unobtrusive-ajax.min.js" />

/// <reference path="Required/jquery.validate.min-vsdoc.js" />

/// <reference path="Required/jquery.validate.unobtrusive.js" />

//#region "Date Range Validator"
(function ($) {
    // #region 'Validatior.addMethod's
    $.validator.addMethod('rangeDate', function (value, element, param) {
        if (!value) {
            return true; // not testing 'is required' here!
        }
        try {
            var dateValue = $.datepicker.parseDate("mm/dd/yy", value);
        }
        catch (e) {
            return false;
        }
        return param.min <= dateValue && dateValue <= param.max;
    });

    $.validator.addMethod('requiredif',
        function (value, element, parameters) {
            var id = '#' + parameters['dependentproperty'];

            // get the target value (as a string, 
            // as that's what actual value will be)
            var targetvalue = parameters['targetvalue'];
            targetvalue =
              (targetvalue == null ? '' : targetvalue).toString();

            // get the actual value of the target control
            // note - this probably needs to cater for more 
            // control types, e.g. radios
            var control = $(id);
            var controltype = control.attr('type');
            var actualvalue =
                controltype === 'checkbox' ?
                control.is(':checked').toString():
                control.val();

            // if the condition is true, reuse the existing 
            // required field validator functionality
            if (targetvalue === actualvalue)
                return $.validator.methods.required.call(
                  this, value, element, parameters);

            return true;
        }
    );
        // #endregion

    //#region 'validatior.unbtrusive.adapters.add's
    $.validator.unobtrusive.adapters.add('rangedate', ['min', 'max'], function (options) {
        var params = {
            min: $.datepicker.parseDate("mm/dd/yy", options.params.min),
            max: $.datepicker.parseDate("mm/dd/yy", options.params.max)
        };
        options.rules['rangeDate'] = params;
        if (options.messages) {
            options.messages['rangeDate'] = options.message;
        }
    });

    $.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'targetvalue'], function (options) {
        options.rules['requiredif'] = {
            dependentproperty: options.params['dependentproperty'],
            targetvalue: options.params['targetvalue']
        };
        options.messages['requiredif'] = options.message;
    });

    $.validator.unobtrusive.adapters.addBool("checkedrequired", "required");
    //#endregion
} (jQuery));

$(document).ready(function () {
    function getDateYymmdd(value) {
        if (value == null)
            return null;
        return $.datepicker.parseDate("mm/dd/yy", value);
    }
    $('.date').each(function () {
        var minDate = getDateYymmdd($(this).data("val-rangedate-min"));
        var maxDate = getDateYymmdd($(this).data("val-rangedate-max"));
        
        $(this).datepicker({
            dateFormat: "mm/dd/yy",
            minDate: minDate,
            maxDate: maxDate,
            changeMonth: true,
            changeYear: true,
            yearRange: '1900:' + ((maxDate)? maxDate : new Date()).getFullYear(),
            onClose: function () {
                $('.date').valid();
            }
        });
    });
});
//#endregion

//#region Fixes MVC3's numeric validation message
(function ($) {
    // Walk through the adapters that connect unobstrusive validation to jQuery.validate.
    // Look for all adapters that perform number validation
    $.each($.validator.unobtrusive.adapters, function () {
        if (this.name === "number") {
            // Get the method called by the adapter, and replace it with one
            // that changes the message to the jQuery.validate default message
            // that can be globalized. If that string contains a {0} placeholder,
            // it is replaced by the field name.
            var baseAdapt = this.adapt;
            this.adapt = function (options) {
                var fieldName = new RegExp("The field (.+) must be a number").exec(options.message)[1];
                options.message = $.validator.format($.validator.messages.number, fieldName);
                baseAdapt(options);
            };
        }
    });
} (jQuery));

//#endregion
