var validationHtmlTemplate = null;
var alertHtmlTemplate = 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+"]"));
						});
						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+"]"));
						});
						var result = $.xml2json(data);
						errorCallback(result.text);
					},
				dataType:"text"
			});
		}
		else
		{
			$("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 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
		{
			defaultValue = field.attr("defaultValue");
		}

		if(defaultValue == undefined || defaultValue == null)
		{
			return true;
		}
			
		if(value != defaultValue)
		{
			return true;
		}
		
		
		buildErrorMessage(container,messageField ,"This field is required.");
		return false;		
	}

	buildErrorMessage(container,messageField ,"This field is required.");
	return false;
}

function validateEmail(container, field)
{
	var filter = /^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/;
	if(!filter.test(field.val()))
	{
		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 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 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
	{
		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);
}
