﻿function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}

(function(){
	var small = "(a|an|and|as|at|but|by|en|for|if|in|of|on|or|the|to|v[.]?|via|vs[.]?)";
	var punct = "([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^_`{|}~-]*)";
  
	this.titleCaps = function(title){
		var parts = [], split = /[:.;?!] |(?: |^)["Ò]/g, index = 0;
		
		while (true) {
			var m = split.exec(title);

			parts.push( title.substring(index, m ? m.index : title.length)
				.replace(/\b([A-Za-z][a-z.'Õ]*)\b/g, function(all){
					return /[A-Za-z]\.[A-Za-z]/.test(all) ? all : upper(all);
				})
				.replace(RegExp("\\b" + small + "\\b", "ig"), lower)
				.replace(RegExp("^" + punct + small + "\\b", "ig"), function(all, punct, word){
					return punct + upper(word);
				})
				.replace(RegExp("\\b" + small + punct + "$", "ig"), upper));
			
			index = split.lastIndex;
			
			if ( m ) parts.push( m[0] );
			else break;
		}
		
		return parts.join("").replace(/ V(s?)\. /ig, " v$1. ")
			.replace(/(['Õ])S\b/ig, "$1s")
			.replace(/\b(AT&T|Q&A)\b/ig, function(all){
				return all.toUpperCase();
			});
	};
    
	function lower(word){
		return word.toLowerCase();
	}
    
	function upper(word){
	  return word.substr(0,1).toUpperCase() + word.substr(1);
	}
})();

function ValidateEmails(source, arguments) {
    var emails = arguments.Value.split(",");
    var emailRegex = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
    
    arguments.IsValid = true;
    
    for (var i = 0; i < emails.length; i++) {
        if (!emailRegex.test(trim(emails[i]))) {
            arguments.IsValid = false;
            break;
        }
    }
}

function ValidatePickupDate(source, arguments) {
    var todaysDate = new Date();
    var monthfield = arguments.Value.split("/")[0];
    var dayfield = arguments.Value.split("/")[1];
    var yearfield = arguments.Value.split("/")[2];
    
    if (yearfield.length == 2)
        yearfield = "20" + yearfield;
        
    var pickupDate = new Date(yearfield, monthfield-1, dayfield);
    var todaysDateOnly = new Date(todaysDate.getFullYear(), todaysDate.getMonth(), todaysDate.getDate());
    
    arguments.IsValid = true;
    if (pickupDate < todaysDateOnly)
        arguments.IsValid = false;
}

function ValidateDeliveryDate(source, arguments) {
    var todaysDate = new Date();
    var monthfield = arguments.Value.split("/")[0];
    var dayfield = arguments.Value.split("/")[1];
    var yearfield = arguments.Value.split("/")[2];
    
    if (yearfield.length == 2)
        yearfield = "20" + yearfield;
        
    var deliveryDate = new Date(yearfield, monthfield-1, dayfield);
    var todaysDateOnly = new Date(todaysDate.getFullYear(), todaysDate.getMonth(), todaysDate.getDate());

    arguments.IsValid = true;
    if (deliveryDate < todaysDateOnly)
        arguments.IsValid = false;
}

function ValidateDate(source, arguments) {
    var validformat = /^\d{2}\/\d{2}\/\d{4}$/; //Basic check for format validity
    var MMDDYYformat = /^\d{2}\/\d{2}\/\d{2}$/;
    
    arguments.IsValid = true;
    if (!validformat.test(arguments.Value) && !MMDDYYformat.test(arguments.Value))
        arguments.IsValid = false;
    else { 
        var monthfield = arguments.Value.split("/")[0];
        var dayfield = arguments.Value.split("/")[1];
        var yearfield = arguments.Value.split("/")[2];
        
        if (yearfield.length == 2)
            yearfield = "20" + yearfield;
        var dayobj = new Date(yearfield, monthfield-1, dayfield);
        
        if ((dayobj.getMonth()+1 != monthfield) || (dayobj.getDate() != dayfield) || (parseInt(dayobj.getFullYear()) != parseInt(yearfield)))
            arguments.IsValid = false;
    }
}

function ValidateZIPCodeLength(source, arguments) {
    arguments.IsValid = true;
    
    if (arguments.Value.length != 5)
        arguments.IsValid = false;
}