﻿/*
* This file contains custom extensions and overrides for
* jQuery validation plug-in 1.6
*
* 2009 Andrey Tselishev
* 2011 Dmitry Zhemkov
*/

// Overrides


jQuery.validator.methods.email = function(value, element) {
	return this.optional(element) || /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{1,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i.test(value);
};

jQuery.validator.methods.helper = {
	getNumericValues: function(pValue, pOtherValue) {
		var otherValue;
		if ($.isString(pOtherValue)) {
			if ($.isNullOrUndefined($(pOtherValue))) {
				console.error('Referenced element is undefined');
				return null;
			}
			otherValue = parseInt($(pOtherValue).val())
			if (!$.isNumber(otherValue)) {
				console.error('Referenced element has no number value');
				return null;
			}
		} else if ($.isNumber(pOtherValue)) {
			otherValue = pOtherValue;
		} else {
			console.error('Parameter is not a number or string');
			return null;
		}
		var value = parseInt(pValue);
		if (!$.isNumber(value)) {
			console.error('Validator applied to a not a number value');
			return null;
		}
		return { value: value, otherValue: otherValue };
	}
};

jQuery.validator.methods.lessThan = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	return values.value < values.otherValue;
};

jQuery.validator.methods.lessThanOrEqualTo = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	return values.value <= values.otherValue;
};

jQuery.validator.methods.lessThanOrNaN = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	if (isNaN(values.value) || isNaN(values.otherValue))
		return true;
	return (values.value < values.otherValue);
};

jQuery.validator.methods.lessThanOrEqualToOrNaN = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	if (isNaN(values.value) || isNaN(values.otherValue))
		return true;
	return (values.value <= values.otherValue);
};

jQuery.validator.methods.moreThan = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	return values.value > values.otherValue;
};

jQuery.validator.methods.moreThanOrEqualTo = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	return values.value >= values.otherValue;
};

jQuery.validator.methods.moreThanOrNaN = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	if (isNaN(values.value) || isNaN(values.otherValue))
		return true;
	return (values.value > values.otherValue);
};

jQuery.validator.methods.moreThanOrEqualToOrNaN = function(value, element, param) {
	var values = jQuery.validator.methods.helper.getNumericValues(value, param);
	if (isNaN(values.value) || isNaN(values.otherValue))
		return true;
	return (values.value >= values.otherValue);
};

jQuery.validator.methods.number = function (value, element) {
	return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:[\s\.,]\d{3})+)(?:[\.,]\d+)?$/.test(value);
}

jQuery(function ($) {
    $.datepicker.regional['en'] = {
	    closeText: 'Done',
	    prevText: 'Prev',
	    nextText: 'Next',
	    currentText: 'Today',
	    monthNames: ['January', 'February', 'March', 'April', 'May', 'June',
	    'July', 'August', 'September', 'October', 'November', 'December'],
	    monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
	    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	    dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
	    dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
	    dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
	    weekHeader: 'Wk',
	    dateFormat: 'mm/dd/yy',
	    firstDay: 1,
	    isRTL: false,
	    showMonthAfterYear: false,
	    yearSuffix: ''
    };
    $.datepicker.setDefaults($.datepicker.regional['en']);

    $.datepicker.regional['de'] = {
	    closeText: 'schließen',
	    prevText: '&#x3c;zurück',
	    nextText: 'Vor&#x3e;',
	    currentText: 'heute',
	    monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni',
	    'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
	    monthNamesShort: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
	    'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
	    dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
	    dayNamesShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
	    dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
	    weekHeader: 'Wo',
	    dateFormat: 'dd.mm.yy',
	    firstDay: 1,
	    isRTL: false,
	    showMonthAfterYear: false,
	    yearSuffix: ''
    };
    $.datepicker.setDefaults($.datepicker.regional['de']);

    $.datepicker.regional['fr'] = {
	    closeText: 'Fermer',
	    prevText: '&#x3c;Préc',
	    nextText: 'Suiv&#x3e;',
	    currentText: 'Courant',
	    monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin',
	    'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
	    monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun',
	    'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],
	    dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
	    dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'],
	    dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
	    weekHeader: 'Sm',
	    dateFormat: 'dd/mm/yy',
	    firstDay: 1,
	    isRTL: false,
	    showMonthAfterYear: false,
	    yearSuffix: ''
    };
    $.datepicker.setDefaults($.datepicker.regional['fr']);

    $.datepicker.regional['it'] = {
	    closeText: 'Chiudi',
	    prevText: '&#x3c;Prec',
	    nextText: 'Succ&#x3e;',
	    currentText: 'Oggi',
	    monthNames: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
		    'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
	    monthNamesShort: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu',
		    'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'],
	    dayNames: ['Domenica', 'Luned&#236', 'Marted&#236', 'Mercoled&#236', 'Gioved&#236', 'Venerd&#236', 'Sabato'],
	    dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab'],
	    dayNamesMin: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'],
	    weekHeader: 'Sm',
	    dateFormat: 'dd/mm/yy',
	    firstDay: 1,
	    isRTL: false,
	    showMonthAfterYear: false,
	    yearSuffix: ''
    };
    $.datepicker.setDefaults($.datepicker.regional['it']);
});


//
// Customs
//

jQuery.validator.addMethod('notFirstValue', function (value, element) {
    if ($('#' + element.id).parents('li:first').hasClass('mandatory'))
        return (value != $("#" + element.id + " option:first").val())
    else return true;
});

jQuery.validator.addMethod('locationIdIsNotEmpty', function (value, element) {
    var locationId = $('#LocationId').val();
    var locationIdIsValid = !(locationId == '00000000-0000-0000-0000-000000000000' || locationId == null || locationId == '');
    return locationIdIsValid;
});

jQuery.validator.addMethod('greaterThanStartDate', function (value, element, params) {
    if ($('#' + element.id).val()) {
        var startDate = $('#' + params.startDateId).data("tDatePicker").value();
        var endDate = $('#' + element.id).data("tDatePicker").value();
        return (startDate < endDate);
    } else return true;
});

jQuery.validator.addMethod('multipleOfZeroPointFive', function (value, element) {
    var val = value.replace(',','.');
    return (val % 0.5 == 0);
});

// returns TRUE, if the value is a valid date in the given location format
jQuery.validator.addMethod('dateCheck', function (value, element, params) {
    if ($('#'+element.id).val()) {
        var currentLanguage = params.language;
        var check = false;

        switch (currentLanguage) {
            case 'en':
                var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
                if (re.test(value)) {
                    var adata = value.split('/');
                    var mm = parseInt(adata[0], 10);
                    var dd = parseInt(adata[1], 10);
                    var yyyy = parseInt(adata[2], 10);
                    var xdata = new Date(yyyy, mm - 1, dd);
                    if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == dd))
                        check = true;
                    else
                        check = false;
                } else
                    check = false;
                break;
            case 'it':
            case 'fr':
                var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
                if (re.test(value)) {
                    var adata = value.split('/');
                    var gg = parseInt(adata[0], 10);
                    var mm = parseInt(adata[1], 10);
                    var aaaa = parseInt(adata[2], 10);
                    var xdata = new Date(aaaa, mm - 1, gg);
                    if ((xdata.getFullYear() == aaaa) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == gg))
                        check = true;
                    else
                        check = false;
                } else
                    check = false;
                break;
            case 'de':
                var re = /^\d{1,2}\.\d{1,2}\.\d{4}$/;
                if (re.test(value)) {
                    var adata = value.split('.');
                    var gg = parseInt(adata[0], 10);
                    var mm = parseInt(adata[1], 10);
                    var aaaa = parseInt(adata[2], 10);
                    var xdata = new Date(aaaa, mm - 1, gg);
                    if ((xdata.getFullYear() == aaaa) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == gg))
                        check = true;
                    else
                        check = false;
                } else
                    check = false;
                break;
            default:
                break;
        }
        return check;
    } else return !$('#'+element.id).parents('li:first').hasClass('mandatory');
});
