jQuery.validator.addMethod('identifier', function(value, element) {
	return this.optional(element) || /^[\w-]+$/i.test(value);
}, 'Letters, numbers, underscores or hyphens are allowed');

jQuery.validator.addMethod('decimalCheck', function(value, element, param) {
  var re = new RegExp('^\\d+\\.\\d{' + param + '}$');
  return re.test(value);
}, jQuery.format('The value should be the decimal number with {0} digits after decimal point'));

jQuery.validator.addMethod('ipAddress', function(value, element) {
	return this.optional(element) || /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(value);
}, 'The IP address format is 0-255.0-255.0-255.0-255');

jQuery.validator.addMethod("lessThanEqualToIP", function(value, element, param) {
	var result = true;
	var value2 = $(param).val();

	if (value && value2)
	{
		var ipInt1 = ConvertIPToInteger(value);
		var ipInt2 = ConvertIPToInteger(value2);
		
		if (ipInt1 != -1 && ipInt2 != -1) result = ipInt1 <= ipInt2;
	}
	
	return result;
}, 'The minimum IP address should be less than or equal to the maximum IP address');

function ConvertIPToInteger(ipAddress)
{
	var result = -1;
	var regExp = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; 
	regExp.exec(ipAddress);

	var octet1 = parseInt(RegExp.$1), octet2 = parseInt(RegExp.$2),
		octet3 = parseInt(RegExp.$3), octet4 = parseInt(RegExp.$4);
	
	if (!isNaN(octet1) && !isNaN(octet2) && !isNaN(octet3) && !isNaN(octet4))
		result = octet1 * 16777216 + octet2 * 65536 + octet3 * 256 + octet4;
	
	return result;
}

// lessThanEqualToDateTime should be used with anytime.js
jQuery.validator.addMethod("lessThanEqualToDateTime", function(value, element, params) {
  var result = true;

  // The time from and time to should be specified
  if ($.trim(value).length > 0 && $.trim($(params).val()).length > 0)
  {
    var converter = new AnyTime.Converter(dateTimePickerSettings);
    var startDate = converter.parse(value);
    var endDate = converter.parse($(params).val());
    result = startDate <= endDate;
  }

  return result;
}, 'The minimum date and time should be less than or equal to the maximum date and time');

jQuery.validator.addMethod("date", function(value, element) {
	return this.optional(element) || ParseDate(value) != null;
}, 'The date is not valid');

jQuery.validator.addMethod("lessThanEqualToDate", function(value, element, param) {
	var result = true;
	var value2 = $(param).val();

	if (value && value2)
	{
		var parsedDate = ParseDate(value);
		var parsedDate2 = ParseDate(value2);
		result = parsedDate != null && parsedDate2 != null && parsedDate <= parsedDate2;
	}
	
	return result;
}, 'The minimum date should be less than or equal to the maximum date');

function ParseDate(value)
{
	var parsedDate = null;

	try
	{
		var format = $.datepicker.regional[""].dateFormat;
		parsedDate = $.datepicker.parseDate(format, value);
	}
	catch (ex) {}
	
	return /^(?:[0-9]{2}\/[0-9]{2}\/[0-9]{4})$/.test(value) && parsedDate != null ? parsedDate : null;
}

