
var validationImages = new Array();
var validationMessageContainers = new Array();
var validationMessages = new Array();
var validationObjects = new Array();
var hidingValidationObj = new Array();

function InsertErrorImage(validationObj)
{
    validationObj.errorImage.insertAfter(validationObj.inputControl);
    validationObj.errorImage.fadeIn(1000);
}

function RemoveErrorImage(validationObj) {
    validationObj.errorImage.fadeOut(1000, function() { validationObj.errorImage.remove(); });
}

function PositionErrorImageAndMessage(validationObj) {
    var imageWidth;

    if (validationObj.errorImageWidth == null) {
        imageWidth = validationObj.errorImage.width();

        if (imageWidth == 0) {
            setTimeout(function() { PositionErrorImageAndMessage(validationObj) }, 100);
            return;
        }
    }
    else
        imageWidth = validationObj.errorImageWidth;

    validationObj.errorImageWidth = imageWidth;    
    var offset = validationObj.inputControl.offset();
    var inputWidth = validationObj.inputControl.width();
    var inputHeight;
    
    if($.browser.safari) {
        if(validationObj.inputControl.css("font-size") == "14px")
            inputHeight = -3;
        else
            inputHeight = -1;
        inputWidth = inputWidth - (imageWidth - 3);
    }
    else if($.browser.msie) {
        if (validationObj.inputControl.css("font-size") == "14px")
            inputHeight = 1;
        else
            inputHeight = 3;
        inputWidth = inputWidth - (imageWidth - 3);
    }
    else {
        if (validationObj.inputControl.css("font-size") == "14px")
            inputHeight = -3;
        else
            inputHeight = -1;
        inputWidth = inputWidth - (imageWidth - 1);
    }

    validationObj.errorImage.css('top', inputHeight);
    validationObj.errorImage.css('left', inputWidth);

    PositionErrorMessage(validationObj);
}

function InsertErrorMessageContainer(validationObj) {
    validationObj.errorMessageContainer.insertAfter(validationObj.inputControl);
}

function RemoveErrorMessageContainer(validationObj) {
    validationObj.errorMessageContainer.remove();
} 

function PositionErrorMessage(validationObj) {
    if(validationObj.errorImage != null) {
        var topRightOffset = new Array(5, 5);
        var errorDivTop = Number((validationObj.errorImage).css('top').replace('px', '')) + topRightOffset[0];
        var errorDivLeft = Number((validationObj.errorImage).css('left').replace('px', '')) + validationObj.errorImageWidth - topRightOffset[1];

        var elementWidth = $(validationObj.errorMessageContainer).width() + Number((validationObj.errorMessageContainer).css('padding-right').replace('px', '')) + +Number((validationObj.errorMessageContainer).css('padding-left').replace('px', ''));
        var farRight = ($(validationObj.errorImage).offset().left + topRightOffset[0] + elementWidth);
        if ($.browser.safari) {
            if (farRight > window.innerWidth)
                errorDivLeft = errorDivLeft - elementWidth; 
        }
        else if ($.browser.msie) {
        if (farRight > document.documentElement.clientWidth)
                errorDivLeft = errorDivLeft - elementWidth; 
        }
        else {
            if (farRight > document.documentElement.clientWidth)
                errorDivLeft = errorDivLeft - elementWidth; 
        }
        
        validationObj.errorMessageContainer.css('top', errorDivTop);
        validationObj.errorMessageContainer.css('left', errorDivLeft);
    }
}

function errorMessageShow(validationObj) {
    if(validationObj.errorMessageTimeout != null)
    {
        clearTimeout(validationObj.errorMessageTimeout);
        validationObj.errorMessageTimeout = null;
    }

    for (var i = 0; i < hidingValidationObj.length; i++) {
            hidingValidationObj[i].inputContainer.css('z-index', '0');
    }
    validationObj.inputContainer.css('z-index', '5');
    validationObj.errorMessageContainer.css('z-index', '100');
    validationObj.errorMessageContainer.slideDown("fast");
}

function errorMessageHide(validationObj) {
    hidingValidationObj.push(validationObj);
    validationObj.errorMessageContainer.css('z-index', '99');
    validationObj.errorMessageTimeout = setTimeout(function() {
        validationObj.errorMessageContainer.fadeOut("slow", function() { var tempObj = hidingValidationObj.pop(); });
    }, 400);  
}

function SetEvents(validationObj)
{
    validationObj.errorImage.mouseover(function() { errorMessageShow(validationObj); });
    validationObj.errorImage.mouseout(function() { errorMessageHide(validationObj); });
    validationObj.errorMessageContainer.mouseover(function() { errorMessageShow(validationObj); });
    validationObj.errorMessageContainer.mouseout(function() { errorMessageHide(validationObj); });
    validationObj.eventsWiredUp = true;
}

function CheckBoxListValidate(sender, args)
{
    if($("#" + sender.controltovalidate).find("input[checked]").length > 0)
        args.IsValid=true;
    else
        args.IsValid=false;
    
    return;
}

function CustomFieldCompareValidate(sender, args) {
    if ($(sender).attr("initialvalue") != null && $(sender).attr("initialvalue") != $("#" + sender.controltovalidate).val()) {
        sender.initialvalue = $(sender).attr("initialvalue");
        sender.errormessage = $(sender).attr("errormessage");
        sender.controltocompare = $(sender).attr("controltocompare");
        sender.controlhookup = $(sender).attr("controltocompare");
        args.IsValid = CompareValidatorEvaluateIsValid(sender);
        checkForChange(sender.getAttribute("id"), args.IsValid, sender.validationGroup);
    }
}

function CustomRequiredFieldValidate(sender, args) {
    sender.initialvalue = $(sender).attr("initialvalue");
    sender.errormessage = $(sender).attr("errormessage");
    args.IsValid = RequiredFieldValidatorEvaluateIsValid(sender);
    checkForChange(sender.getAttribute("id"), args.IsValid, sender.validationGroup);

    return;
}

function CustomRegularExpressionValidate(sender, args)
{
    if ($(sender).attr("initialvalue") != null && $(sender).attr("initialvalue") != $("#" + sender.controltovalidate).val())
    {
        sender.validationexpression = $(sender).attr("validationexpression");
        sender.errormessage = $(sender).attr("errormessage");
        args.IsValid = RegularExpressionValidatorEvaluateIsValid(sender);
        checkForChange(sender.getAttribute("id"), args.IsValid, sender.validationGroup);
    }
    
    return;
}

function checkForChange(validatorId, valid, validationgroup) {
    var validationObj = GetValidationObject(validatorId);
    ToggleInvalid(validatorId, valid);
    CheckForInvalid(validationObj);
}

function ToggleInvalid(validatorId, isValid) {
    var validationObj = GetValidationObject(validatorId);
    validationObj.isValid = isValid;

    if (!isValid) {
        InsertErrorImage(validationObj);
        InsertErrorMessageContainer(validationObj);
        if(!validationObj.eventsWiredUp)
            SetEvents(validationObj);

        if (!validationObj.initialized) {
            PositionErrorImageAndMessage(GetValidationObject(validatorId));
            validationObj.initialized = true;
        }
    }
    else {
        RemoveErrorImage(validationObj);
        RemoveErrorMessageContainer(validationObj);
        validationObj.eventsWiredUp = false;
    }
}

function CheckForInvalid(validationObj) {
    var valid = true;

    for (var i in validationObjects) {
        if (valid == true && validationObjects[i].inputControl == validationObj.inputControl && validationObjects[i].isValid == false) {
            valid = false;
        }
    }

    if(valid)
        validationObj.inputControl.removeClass('SGinvalid');
    else
        validationObj.inputControl.addClass('SGinvalid'); 
}

function ValidationObject() {
    this.inputControl = null;
    this.inputContainer = null;
    this.errorMessageTimeout = null;
    this.errorImage = null;
    this.errorImageWidth = null;
    this.errorMessageContainer = null;
    this.errorMessage = null;
    this.eventsWiredUp = false;
    this.initialized = false;
    this.isValid = true;
}

function GetValidationObject(validatorId)
{
    var validationObj = null;

    if(validationObjects[validatorId] == null)
    {
        validationObj = new ValidationObject();
        validationObjects[validatorId] = validationObj;
    }
    else
        validationObj = validationObjects[validatorId];
        
    return validationObj;
}

function RegisterValidationErrorImageById(validatorId, controlId, errorImageId)
{
    jQuery(
        function() {
        var validationObj = GetValidationObject(validatorId);
        validationObj.inputControl = $("#" + controlId);
        validationObj.inputControl.wrap('<span class="SGValidationContainer"></span>');
        validationObj.inputContainer = $($(validationObj.inputControl).parent().get(0));
        validationObj.errorImage = $("#" + errorImageId);
        validationObj.errorImage.addClass("SGerror");
        validationObj.errorImage.addClass("hiddenElement");
    }
    );
}

function RegisterValidationErrorMessageById(validatorId, controlId, errorMessageContainerId)
{
    jQuery(
        function()
        {
            var validationObj = GetValidationObject(validatorId);
            validationObj.inputControl = $("#" + controlId);
            validationObj.errorMessageContainer = $("#" + errorMessageContainerId);
            validationObj.errorMessageContainer.addClass("SGerrorMessage");
            validationObj.errorMessageContainer.addClass("hiddenElement");
        }
    );
}

function RegisterValidationErrorMessage(validatorId, controlId, errorMessage)
{
    if($("#divSGError").length == 0)
    {
        jQuery(
            function() {
            var bodyObj = $("body").append('<div id="divSGError" class="SGerrorMessage SGerrorMessageBox hiddenElement"></div>');

            var validationObj = GetValidationObject(validatorId);
            validationObj.inputControl = $("#" + controlId);
            validationObj.errorMessageContainer = bodyObj.find("#divSGError").eq(0).clone();
            validationObj.errorMessage = errorMessage;
            validationObj.errorMessageContainer.html(errorMessage);
            }
        );
    }
}

function RegisterValidationErrorImage(validatorId, controlId)
{
    if($("#imgSGerror").length == 0)
    {
        jQuery(
            function() {
            var bodyObj = $("body").append('<img id="imgSGerror" src="/images/red-exclamation.gif" class="SGerror hiddenElement" alt="Validation Error" style="height: 16px; width: 16px;" />');

            var validationObj = GetValidationObject(validatorId);
            validationObj.inputControl = $("#" + controlId);
            validationObj.inputControl.wrap('<span class="SGValidationContainer"></span>');
            validationObj.inputContainer = $($(validationObj.inputControl).parent().get(0));
            validationObj.errorImage = bodyObj.find("#imgSGerror").eq(0).clone();
        }
        );
    }
}

function RegisterByServerValidation(validatorId, controlId, errorMessage, validationGroup)
{
    jQuery(
        function() {
            var validationObj = GetValidationObject(validatorId);
            RegisterValidationErrorMessage(validatorId, controlId, errorMessage);
            RegisterValidationErrorImage(validatorId, controlId)
            checkForChange(validatorId, false, validationGroup)
        }
    );
}

function textCounter(field, cntfield, maxlimit) {
    var numbreaks;
    numbreaks = field.value.substring(0, maxlimit).match(new RegExp('\n', 'g'));
    if (numbreaks == null)
        numbreaks = 0;
    else
        numbreaks = numbreaks.length;

    if ((field.value.length + numbreaks) > maxlimit) // if too long...trim it!
        field.value = field.value.substring(0, (maxlimit - numbreaks));
    else // otherwise, update 'characters left' counter
        cntfield.innerHTML = maxlimit - (field.value.length + numbreaks);
}

function textCounterById(fieldId, cntfieldId, maxLimit) {
    textCounter(document.getElementById(fieldId), document.getElementById(cntfieldId), maxLimit);
}