var validationHtmlTemplate = null;
var validationHtmlTemplateV2 = null;
var alertHtmlTemplate = null;
var alertHtmlTemplateV2 = null;
var confirmMessageBox = null;

function endWebServicePost(containerName,submitButtonName)
{
	$("#"+submitButtonName).unbind("click");
}

function setupWebServicePost(containerName,submitButtonName,servicePath,serviceParams,successCallback,errorCallback,validationCallback,confirmMessage)
{
	var container = $("div[id*="+containerName+"]");

	$("div[id*="+submitButtonName+"]").bind("click",function(){
		if($("div[id*="+submitButtonName+"]").hasClass("disabledButton"))
			return;
		
		if(confirmMessage != null && confirmMessage != undefined && confirmMessage.length > 0)
		{
			if(confirmMessageBox == null)
			{
				confirmMessageBox = createOkCancelMessageBox("Are you sure?",confirmMessage,
					function(){
						confirmMessageBox.attr('result','true');
					},
					function(){
						confirmMessageBox.attr('result','false');
					},
					function(event,ui){
						$("div[id*="+submitButtonName+"]").trigger('click');
					});
				return;
			}
			else
			{
				if(confirmMessageBox.attr('result') == 'true')
				{
					confirmMessageBox.dialog('destroy');
					confirmMessageBox = null;
				}
				else
				{
					confirmMessageBox.dialog('destroy');
					confirmMessageBox = null;
					return;
				}
			}
		}
		
		//$("div[id*="+submitButtonName+"]").fadeTo(50,0);
		enableButton(false,$("div[id*="+submitButtonName+"]"));
		var isValid = false;
		
		try
		{
			var eventInfo = {Source:submitButtonName,Event:"click"};
			isValid = validationCallback(container,eventInfo);
		}
		catch(e)
		{
			isValid = false;
		}
				
		if( isValid )
		{
			var formDataString= "eval({";
	
			for(var i=0;i<serviceParams.length;i++) 
			{
				var param = serviceParams[i];
				if(param.id.length > 0 && param.type.length > 0 && param.name.length > 0)
				{
				    var field = getJQueryObjectForField(param.type, param.id);
					if(field.length > 0)
					{
						if(formDataString.length>6)
							formDataString+= ",";
						
						var value = "";
						if(param.type == "textarea")	
						{
							if(field.val() != null && field.val() != undefined)
								value = fixSingleQuotesInText(field.val());
						}
						else if(param.type == "radio")
						{
							value = field.val();
						}
						else if(param.type == "file")
						{
							value = field[0].files[0].getAsDataURL();
						}
						else if(param.type == "checkbox")
						{
							value = field[0].checked;
						}
						else
						{
							if(field[0].value != null && field[0].value != undefined)
								value = fixSingleQuotesInText(field[0].value);
						}
							
						if(value.length == 0)
						{
							if(param.value != null && param.value != undefined)
								value = fixSingleQuotesInText(param.value);	
						}
							
						formDataString += param.name + ": \"" + value + "\"";
					}
				}
				else if(param.name.length > 0 && param.value.length > 0)
				{
					if(formDataString.length>6)
						formDataString+= ",";
						
					if(param.value != null && param.value != undefined)						
						formDataString += param.name + ": \"" + fixSingleQuotesInText(param.value) + "\"";
				}
				else if(param.name.length > 0 && param.value.length == 0)
				{
					if(formDataString.length>6)
						formDataString+= ",";
						
					formDataString += param.name + ": \"\"";
				}
				else if(param.name.length > 0 && param.value != null && param.value != undefined)
				{
					if(formDataString.length>6)
						formDataString+= ",";
						
					formDataString += param.name + ": " + param.value;
				}
			}
			
			formDataString += "})";
			var formData = eval(formDataString);

			$.ajax({
				url:servicePath,
				enctype: 'multipart/form-data',
				type:"POST",
				data:formData,
				success:function(data){
						//$("div[id*="+submitButtonName+"]").fadeTo(500,1,function(){
							//$("div[id*="+submitButtonName+"]").css("opacity","");
							//$("div[id*="+submitButtonName+"]").css("filter","");
							//enableButton(true,$("div[id*="+submitButtonName+"]"));
						//});
			            enableButton(true, $("div[id*=" + submitButtonName + "]"));
            			var result = $.xml2json(data);
						successCallback(result.text);
					},
				error:function(data){
						//$("div[id*="+submitButtonName+"]").fadeTo(500,1,function(){
						    //$("div[id*="+submitButtonName+"]").css("opacity","");
							//$("div[id*="+submitButtonName+"]").css("filter","");
							//enableButton(true,$("div[id*="+submitButtonName+"]"));
						//});
			            enableButton(true, $("div[id*=" + submitButtonName + "]"));
            			var result = $.xml2json(data);
						errorCallback(result.text);
					},
				dataType:"text"
			});
		}
		else
		{
		    enableButton(true, $("div[id*=" + submitButtonName + "]"));
		    //$("div[id*=" + submitButtonName + "]").fadeTo(500, 1, function () {
			//	$("div[id*="+submitButtonName+"]").css("opacity","");
			//	$("div[id*="+submitButtonName+"]").css("filter","");
			//	enableButton(true,$("div[id*="+submitButtonName+"]"));
			//});
		}				
	});
}

function validateFieldRequired(container,field)
{
    var result = isValidRequiredField(field);
	if(!result)
		buildErrorMessage(container, getInterpretedField(field), "This field is required.");
		
	return result;
}

function validateEmail(container, field)
{
	if(isValidEmail(field) == false)
	{
		buildErrorMessage(container,field ,"Value must be a valid email address.");
		return false;
	}
	return true;
}

function validateFieldRegEx(container,field,regex)
{
}

function validateFieldConfirm(container,field,sourceField)
{
}

function validateNumber(container,field,min,max,validateMinMax)
{
	var value = field.val();
	var messageField = field;

	if(isNaN(value))
	{
		buildErrorMessage(container,messageField ,"Value must be a valid number.");
		return false;
	}
	else
	{
		if(validateMinMax == true && (value < min || value > max))
		{
			buildErrorMessage(container,messageField ,"Value must be between "+min+" and "+max+".");
			return false;
		}
	}
	return true;
}

function validateFileSizeLimit(container,field,fileSize,sizeLimit)
{
	clearErrorMessages(container);
	var limit = sizeLimit * 1000;
	if(fileSize > limit)
	{
		buildErrorMessage(container,field,"The specified file is over the size limit.");
		return false;
	}
		
	return true;
}

function validateFieldLength(container,field,minLength,maxLength)
{
	var value = field.val();
	var messageField = field;
	
	if(field.attr("type") == "textarea" && field.hasClass("tinymce"))
	{
		value = field.text();
		messageField = $("#"+field.attr("id")+"_container").find(".mceEditor");
	}
	
	if(value.length < minLength || value.length > maxLength)
	{
		buildErrorMessage(container,messageField ,"Value must be between "+minLength+" and "+maxLength+" characters in length.");
		return false;
	}
	
	return true;
}

function buildErrorMessageV2WithRevalidation(container, field, message, validation)
{
	buildErrorMessageV2(container, field, message);
	field.one("blur",function(){
		validation();
	});
}

function buildAlertMessageV2(container, field, message, isBefore) {
    if (alertHtmlTemplateV2 == null) {
        $.ajax({
            url: "/JSLibrary/WebServicePost/AlertTemplateV2.html",
            enctype: 'multipart/form-data',
            type: "GET",
            data: {},
            async: false,
            success: function (data) {
                alertHtmlTemplateV2 = data;
                buildAlertMessageV2(container, field, message, isBefore);
            },
            error: function (data) {
            },
            dataType: "html"
        });
        return;
    }

    if (field == null || field == undefined)
        field = container;

    var alertFrameId = field.attr("id") + "_AlertFrameV2";
    var existingAlert = $("div[id=" + alertFrameId + "]");
    if (existingAlert.length > 0)
        return existingAlert;

    var alertFrame = document.createElement("div");

    $(alertFrame).attr("rel_err", field.attr("id"));
    $(alertFrame).attr("id", alertFrameId);
    $(alertFrame).addClass("alertFrameV2");
    $(alertFrame).html(alertHtmlTemplateV2);
    $(alertFrame).css("display", "none");

    $(alertFrame).find(".validationAlertV2Text").text(message);
    $(alertFrame).find(".validationAlertV2Button").text("X");
    $(alertFrame).find(".validationAlertV2Button").click(function () {
        $("#" + $(this).parents(".alertFrameV2").attr("rel_err")).removeClass("alertFieldV2");
        $(this).parents(".alertFrameV2").remove();
    });
    $(alertFrame).click(function () {
        $("#" + $(this).attr("rel_err")).removeClass("alertFieldV2");
        $(this).remove();
    });

    if (isBefore)
        container.before(alertFrame);
    else
        container.after(alertFrame);

    $(alertFrame).fadeIn(500);

    if(field != container)
        field.addClass('alertFieldV2');

    return $(alertFrame);
}

function buildErrorMessageV2(container, field, message, isBefore)
{
	if(validationHtmlTemplateV2 == null)
	{
		$.ajax({
			url:"/JSLibrary/WebServicePost/ErrorTemplateV2.html",
			enctype: 'multipart/form-data',
			type:"GET",
			data:{},
			async: false,
			success:function(data){
			    validationHtmlTemplateV2 = data;
					buildErrorMessageV2(container,field,message, isBefore);
				},
			error:function(data){
				},
			dataType:"html"
		});
		return;
    }

    if (field == null || field == undefined)
        field = container;

	var errorFrameId = field.attr("id")+"_ErrorFrameV2";
	var existingError = $("div[id="+errorFrameId+"]");
	if(existingError.length > 0)
		return existingError;

	var errorFrame = document.createElement("div");
	
	$(errorFrame).attr("rel_err",field.attr("id"));
	$(errorFrame).attr("id",errorFrameId);
	$(errorFrame).addClass("errorFrameV2");
	$(errorFrame).html(validationHtmlTemplateV2);
	$(errorFrame).css("display","none");
	
	$(errorFrame).find(".validationErrorV2Text").text(message);
	$(errorFrame).find(".validationErrorV2Button").text("X");
	$(errorFrame).find(".validationErrorV2Button").click(function(){
		$("#"+$(this).parents(".errorFrameV2").attr("rel_err")).removeClass("errorFieldV2");
		$(this).parents(".errorFrameV2").remove();
    });
    $(errorFrame).click(function () {
        $("#" + $(this).attr("rel_err")).removeClass("errorFieldV2");
        $(this).remove();
    });

	if(isBefore)
		container.before(errorFrame);
	else
		container.after(errorFrame);
	
	$(errorFrame).fadeIn(500);
	
	field.addClass('errorFieldV2');
	
	return $(errorFrame);
}

function buildErrorMessage(container,field,message)
{
	if(validationHtmlTemplate == null)
	{
		$.ajax({
			url:"/JSLibrary/WebServicePost/ErrorTemplate.html",
			enctype: 'multipart/form-data',
			type:"GET",
			data:{},
			async: false,
			success:function(data){
					validationHtmlTemplate = data;
					buildErrorMessage(container,field,message);
				},
			error:function(data){
				},
			dataType:"html"
		});
		return;
	}

	var errorFrameId = field.attr("id")+"_ErrorFrame";
	var existingError = $("div[id="+errorFrameId+"]");
	if(existingError.length > 0)
		return existingError;

	var errorFrame = document.createElement("div");
	
	$(errorFrame).attr("id",errorFrameId);
	$(errorFrame).addClass("errorFrame");
	$(errorFrame).html(validationHtmlTemplate);

	var position = field.offset();
	var width = field.width();
	
	$(errorFrame).css("top",(position.top-17)+"px");
	$(errorFrame).css("left",(position.left+width-20)+"px");
	$(errorFrame).css("position","absolute");
	$(errorFrame).css("display","none");
	
	$(errorFrame).find(".validationErrorText").text(message);

	container.append(errorFrame);
	
	$(errorFrame).fadeIn(500);
	
	return $(errorFrame);
}

function buildAlertMessage(container,field,message)
{
	if(alertHtmlTemplate == null)
	{
		$.ajax({
			url:"/JSLibrary/WebServicePost/AlertTemplate.html",
			enctype: 'multipart/form-data',
			type:"GET",
			data:{},
			async: false,
			success:function(data){
					alertHtmlTemplate = data;
					buildAlertMessage(container,field,message);
				},
			error:function(data){
				},
			dataType:"html"
		});
		return;
	}

	var alertFrameId = field.attr("id")+"_AlertFrame";
	var existingAlert = $("div[id="+alertFrameId+"]");
	if(existingAlert.length > 0)
		return existingAlert;

	var alertFrame = document.createElement("div");
	
	$(alertFrame).attr("id",alertFrameId);
	$(alertFrame).addClass("alertFrame");
	$(alertFrame).html(alertHtmlTemplate );

	var position = field.offset();
	var width = field.width();
	
	$(alertFrame).css("top",(position.top-17)+"px");
	$(alertFrame).css("left",(position.left+width-20)+"px");
	$(alertFrame).css("position","absolute");
	$(alertFrame).css("display","none");
	
	$(alertFrame).find(".validationAlertText").text(message);

	container.append(alertFrame);
	
	$(alertFrame).fadeIn(500);
	
	return $(alertFrame);
}

function clearAlertMessages(container,field)
{
	container.find(".alertFrame").replaceWith("");
}

function clearErrorMessages(container)
{
	container.find(".errorFrame").replaceWith("");
}

function clearErrorMessagesV2()
{
	$(".errorFrameV2").each(function(){
		$(this).remove();
	});
	
	$(".errorFieldV2").each(function(){
		$(this).removeClass('errorFieldV2');
	});
}

function clearAlertMessagesV2() {
    $(".alertFrameV2").each(function () {
        $(this).remove();
    });

    $(".alertFieldV2").each(function () {
        $(this).removeClass('alertFieldV2');
    });
}

function enableButton(isEnabled,button)
{
	if(isEnabled)
	{
		if(button.hasClass("disabledButton"))
			button.removeClass("disabledButton");
	}
	else
	{
		if(!button.hasClass("disabledButton"))
			button.addClass("disabledButton");
//		button.unbind("click");
	}
}

function fixSingleQuotesInText(text)
{
	if(text != null && text != undefined)
	{
		var value = text.replace(/[\r\n]+/g, "");
		value = value.replace("'","\\'");
		value = value.replace( /"/g, "'" );
		return value;
	}
	
	return "";
}

function getJQueryObjectForField(type,id)
{
    if (type == "select" || type == "textarea") {
        return $(type + "[id*=" + id + "]");
    }
    else if (type == "radio") {
        return $("input[type=" + type + "][name*=" + id + "]:checked");
    }
    else if (type == "unknown") {
        return $("#" + id);
    }
    else {
        return $("input[type=" + type + "][id*=" + id + "]");
    }	
}

function createPopupMessageBox(title,message,height,width,left,top)
{
	var dialogFrame = document.createElement("div");
	$(dialogFrame).html("<div result='' class='messageboxCenter'>"+message+"</div>");
	$(dialogFrame).dialog({
			title:title,
			resizable: false,
			closeOnEscape: true,
			height:height,
			position:[left,top],
			width:width
		});
	return $(dialogFrame);
}

function createOkCancelMessageBox(title,message,okFunction,cancelFunction,closeFunction)
{
	var dialogFrame = document.createElement("div");
	$(dialogFrame).html("<div result='' class='messageboxCenter'>"+message+"</div>");
	$(dialogFrame).dialog({
			title: title,
			bgiframe: true,
			modal: true,
			resizable: false,
			height:250,
			close: function(event, ui) { closeFunction(event,ui); },
			buttons: {
				'Cancel': function() {
					cancelFunction();
					$(this).dialog('close');
				},
				'Ok': function() {
					okFunction();
					$(this).dialog('close');
				}				
			}
		});
	return $(dialogFrame);
}

function createOkMessageBox(title,message,okFunction,closeFunction)
{
	var dialogFrame = document.createElement("div");
	$(dialogFrame).html("<div result='' class='messageboxCenter'>"+message+"</div>");
	$(dialogFrame).dialog({
			title: title,
			bgiframe: true,
			resizable: false,
			height:250,
			close: function(event, ui) { closeFunction(event,ui); },
			buttons: {
				'Ok': function() {
					$(this).dialog('close');
					okFunction();
				}				
			}
		});
	return $(dialogFrame);
}

function IsNullOrEmpty(str){
	return str == null || str == '' || str == undefined;
}

function getInterpretedField(field) {
    var messageField = field;

    if (field.attr("type") == "textarea" && field.hasClass("tinymce"))
        messageField = $("#" + field.attr("id") + "_container").find(".mceEditor");

    return messageField;
}

function isValidPassword(field) {
    return true;
}

function isValidRequiredField(field) {
    var value = field.val();
    var messageField = field;

    if (field.attr("type") == "textarea" && field.hasClass("tinymce")) {
        value = field.text();
        messageField = $("#" + field.attr("id") + "_container").find(".mceEditor");
    }

    if (value.length > 0) {
        var defaultValue = "";
        if (field.attr("type") == "textarea") {
            defaultValue = field.attr("default");
        }
        else if (field.attr("type") == "text") {
            defaultValue = field.attr("default");
        }
        else if (field.attr("type") == "password") {
            defaultValue = field.attr("default");
        }
        else {
            defaultValue = field.attr("defaultValue");
        }

        if (defaultValue == undefined || defaultValue == null) {
            return true;
        }

        if (value != defaultValue) {
            return true;
        }

        return false;
    }

    return false;
}

function isValidEmail(field) {
    var filter = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if (!filter.test(field.val()))
        return false;

    return true;
}

function hasErrorsV2() {
    if ($(".errorFieldV2").length > 0)
        return true;

    return false;
}

function hasErrorV2(field) {
    if (field.hasClass("errorFieldV2"))
        return true;

    return false;
}

function isValidNumber(field, min, max, validateMinMax) {
    var value = field.val();

    if (isNaN(value)) {
        return false;
    }
    else {
        if (validateMinMax == true && (value < min || value > max)) {
            return false;
        }
    }
    return true;
}

function isValidPostalCode(field, country) {

    if (country == "UNITED STATES") {
        var filter = /^\d{5}(-\d{4})?$/;
        if (!filter.test(field.val()))
            return false;
    }
    else if (country == "CANADA") {
        var filter = /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/;
        if (!filter.test(field.val()))
            return false;
    }
    
    return true;
}

function isValidPhoneNumber(field) {
    var filter = /^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/;
    if (!filter.test(field.val()))
        return false;
    return true;
}

function isValidLength(field, minLength, maxLength)
{
    var value = field.val();

    if (field.attr("type") == "textarea" && field.hasClass("tinymce")) {
        value = field.text();
        messageField = $("#" + field.attr("id") + "_container").find(".mceEditor");
    }

    if (value.length < minLength || value.length > maxLength) {
        return false;
    }

    return true;
}

function IsValidCCNum(ccnum) {
    
    if (typeof ccnum === 'undefined' || ccnum == null || ccnum.length < 15)
        return false;
    var checksum = 0;
    var factor = 0;
    if (ccnum.length % 2) {
        factor = 1;
    }
    else {
        factor = 2;
    }
    for (var i = 0; i < ccnum.length; i++) {
        var digit = ccnum.charAt(i);
        if(isNaN(digit))
          return false;
        if (digit * factor > 9) {
            checksum += (digit * factor) - 9;
        }
        else {
            checksum += digit * factor;
        }
        factor = (factor % 2) + 1;
    }
    if (checksum % 10)
        return false;
    return true;
}

function getSSLLink(path) {
    return path;
    //return 'https://' + location.host + path;
}
