var EMAIL_LOCAL_PART_MAX_LENGTH = 64;
var DOMAIN_NAME_MAX_LENGTH = 255;

var emailLocalPartPattern = "([!#$%&'*+\/=?^_`{|}~a-zA-Z0-9-]+)(\.[!#$%&'*+\/=?^_`{|}~a-zA-Z0-9-]+)*";
var domainNamePattern = "(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)[.])*(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)[.])([a-zA-Z]{2,7})";

var emailLocalPartRegEx = new RegExp("^" + emailLocalPartPattern + "$");
var domainNameRegEx = new RegExp("^" + domainNamePattern + "$");


// This function will add an email address into the multisection object
// Two parameters are accepted:
//	scrObj: The source input text field
//	trgSelect: The target section box.

function addEmail(srcAddressObj, srcNameObj, trgSelect) {
    var isValidEmailAddress = true;
    if((srcAddressObj != null) && (srcNameObj != null))
    {
        var emailAddressText = jQuery.trim(srcAddressObj.value);
        var displayNameText = jQuery.trim(srcNameObj.value);
        var savedEmailAddressText = emailAddressText;
        var savedDisplayNameText = displayNameText;

        var displayNameText = displayNameText + " (" + emailAddressText + ")";
        var compareDisplayName = displayNameText.toLowerCase();

        isValidEmailAddress = validateEmailAddress(emailAddressText, displayNameText);
        if (isValidEmailAddress)
        {
            for (var i=0; i<trgSelect.options.length; i++)
            {
                var o = trgSelect.options[i];
                var oText = (o.text + "").toLowerCase();
                if (oText > compareDisplayName+"")
                {
                    trgSelect.options[i] = new Option(displayNameText, emailAddressText, false, false);
                    displayNameText = o.text + "";
                    emailAddressText = o.value + "";
                    compareDisplayName = displayNameText.toLowerCase();
                }
            }
            trgSelect.options[trgSelect.options.length] = new Option(displayNameText, emailAddressText, false, false);
            savedEmailAddressText = "";
            savedDisplayNameText = "";
        }
        srcAddressObj.value = savedEmailAddressText;
        srcNameObj.value = savedDisplayNameText;
    }

    return isValidEmailAddress;
}

function getEmails(srcSelect, trgObj) {
	var emails = "";
	var sep = "";
	var n = srcSelect.options.length - 1;
	for (var i=n; i >= 0; i--)
	{
		emails = emails + sep + srcSelect.options[i].text;
		sep = ";";
	}
    trgObj.value = emails;
}

function removeEmails(srcSelect) {
	var current = 0;
	var totalLen = srcSelect.options.length;
	for (var i=0; i < totalLen; i++)
	{
		var obj = srcSelect.options[i];
		if (!obj.selected)
		{
			if (current != i)
			{
			  // Move values up
				srcSelect[current] = new Option(obj.text, obj.value, false, false);
			}
			current = current + 1;
		}
	}
	for (var i=totalLen-1; i>=current; i--)
	{
		srcSelect[i] = null;
	}
}

function validateEmailAddress(emailAddress, displayNameText) {
    var isValid = true;
    if (emailAddress.length == 0 || displayNameText.lenght == 0 ) {
        alert("This invited guest cannot be added. Either the display name or email address is blank.")
        return false;
    }

    isValid = isValidEmailAddress(emailAddress);
    if (!isValid) {
        alert("Guest Email Address must be a valid email.");
    }

    return isValid;
}

function isValidEmailAddress(emailAddress) {
    var isValid = true;

    var atPos = emailAddress.lastIndexOf("@");

    if (atPos < 0) {
        isValid = false;
    } else {
        var emailLocalPart = emailAddress.substr(0, atPos);
        isValid = isValidEmailLocalPart(emailLocalPart);

        if (isValid) {
            var domainName = emailAddress.substr(atPos + 1);
            isValid = isValidDomainName(domainName);
        }
    }

    return isValid;
}

function isValidEmailLocalPart(emailLocalPart) {
    if (emailLocalPart.length < 1 || emailLocalPart.length > EMAIL_LOCAL_PART_MAX_LENGTH) {
        return false;
    }

    return emailLocalPartRegEx.test(emailLocalPart);
}

function isValidDomainName(domainName) {
    if (domainName && (domainName.length < 1 || domainName.length > DOMAIN_NAME_MAX_LENGTH)) {
        return false;
    }

    return domainNameRegEx.test(domainName);
}