/**
 *
 * @author Mark White
 *
 * Requires (in dependancy order)
 * --------
 * - /js/lib/fairfax/utils.js
 * - /js/lib/fairfax/form-validation.js
 * - /js/lib/soapclient21.js
 *
 */
 
 
function WebServiceEmailer(options)
{
	if (options === undefined)
	{
		options = {};	
	}
	
// ----------------------------------------------------------------------------------------------------- Private

// ------------------------------------------------------------------------- Variables

	// Get a reference to this object since inner functions are annonymous
	var that = this;
	

	var webService = 'http://localhost/siteAFRBranch/UtilsWsWrapper.aspx';
	
	var templateNumber = 1;
	
	var errorContainerId = 'emailing-error';
	var successPage = 'emailpage_success.aspx';
	var emailFormId = 'email-form';
	
	var emailSubjectName = 'emailSubject';
	var emailAddressesName = 'emailAddresses';
	var yourNameName = 'yourName';
	var yourEmailAddressName = 'yourEmailAddress';
	var yourMessageaName = 'yourMessage';
	var submitButtonName = 'submitButton';
	var clearButtonName = 'clearButton';
	
	var maxMessageLength = 400;
	var messageCharRemainId = 'message-char-remaining';
	
	var dialogueFocuserId = 'dialogue-focuser';
	var loadingMsgId = 'loading-msg';
	
	var formValidation = null;
	
	var templateOptions = null;
	
// ------------------------------------------------------------------------- Functions

	/*
	 * Initilises object variables with the passed value if
	 * specified, otherwise the default.
	 */
	function _setOption(passedValue, defaultValue)
	{	
		return passedValue ? passedValue : defaultValue;
	}

	/*
	 *
	 */
	function _UpdateMsgCharCount(e)
	{
		var theTarget = e.target ? e.target : e.srcElement;

		if (theTarget.value.length >= maxMessageLength)
		{
			theTarget.value = theTarget.value.substr(0, maxMessageLength);
		}
		
		document.getElementById(messageCharRemainId).innerHTML = maxMessageLength - theTarget.value.length;
	}
	
	/*
	 *
	 */
	function _ClearClick(e)
	{
		var emailFields = formValidation.GetFields(emailFormId);
		formValidation.ClearErrors(emailFields);
		
		document.getElementById(messageCharRemainId).innerHTML = maxMessageLength;
	}
	
	/*
	 *
	 */
	function _SubmitClick(e)
	{		
		var emailFields = formValidation.GetFields(emailFormId);
		var allValid = formValidation.ValidateForm(emailFields);
		
		if (allValid)
		{
			var soapObject = _PackageForm(emailFields);
			
			//console.dir(soapObject);
			
			_SendEmail(soapObject);
		}
		
		return false;
	}

	/*
	 *
	 */
	function _PackageForm(emailFields)
	{
		
		var soapObject = {};
		soapObject.template = templateNumber;


		if (templateOptions)
		{
			soapObject.options = []; 		
			
			for (var i = 0; i < templateOptions.length; i++)
			{
				soapObject.options[i] = {};
				soapObject.options[i].__name = 'TemplateOption';
				
				soapObject.options[i].name = templateOptions[i].name;
				soapObject.options[i].value = templateOptions[i].getValueFunction();
			}
		}
		
		
		soapObject.to = [];
		soapObject.from = {};
		
	
		for (var i = 0; i < emailFields.length; i++)
		{
		
			switch (emailFields[i].name)
			{
				case emailSubjectName:
					soapObject.subject = emailFields[i].value;
					break;
				case emailAddressesName:
					soapObject.to = Utils.ParseMultiEmailAddresses(emailFields[i].value);
					break;
				case yourNameName:
					soapObject.from.name = emailFields[i].value;
					break;
				case yourEmailAddressName:
					soapObject.from.address = emailFields[i].value;
					break;
				case yourMessageaName:
					soapObject.body = emailFields[i].value;
					break;
			}	
		}
		
		return soapObject;
	}
	
	
	
	
	/*
	 *
	 */
	function _SendEmail(soapObject)
	{
		_ShowLoading();
		
		var pl = new SOAPClientParameters();
		pl.add('mail', soapObject);
		
		SOAPClient.invoke(webService, 'SendMail', pl, true, Utils.Bind(that, _SendMail_Callback));
		
		return false;
	}
	
	/*
	 *
	 */
	function _SendMail_Callback(r)
	{
		_HideLoading();
		
		if (r > 0)
		{
			window.location = successPage;
		}
		else
		{
			document.getElementById(errorContainerId).style.display = 'block';
		}
	}
	
	
		
// -------------------------------------------------------- Status

	/*
	 *
	 */
	function _ShowLoading()
	{
		_ShowDialogueFocuser();
		
		document.getElementById(loadingMsgId).style.display = 'block';
	}
	
	function _HideLoading()
	{
		_HideDialogueFocuser();	
		
		document.getElementById(loadingMsgId).style.display = 'none';
	}

	/*
	 * 
	 */
	function _ShowDialogueFocuser()
	{						
		var pageSize = Utils.getPageSize();

		document.getElementById(dialogueFocuserId).style.width = pageSize.pageWidth + 'px';
		document.getElementById(dialogueFocuserId).style.height = pageSize.pageHeight + 'px';

		document.getElementById(dialogueFocuserId).style.display = 'block';
		
	}
	
	/*
	 * 
	 */
	function _HideDialogueFocuser()
	{
		document.getElementById(dialogueFocuserId).style.display = 'none';
	}
	


// ----------------------------------------------------------------------------------------------------- Public

// ------------------------------------------------------------------------- Functions


	/*
	 *
	 */
	this.WebServiceEmailer = function(options)
	{

	// --------------------------------------------- Init Variables Options
	
		webService           = _setOption(options.webService, webService);
	
		templateNumber       = _setOption(options.templateNumber, templateNumber);
		
		errorContainerId     = _setOption(options.errorContainerId, errorContainerId);
		successPage          = _setOption(options.successPage, successPage);
		emailFormId          = _setOption(options.emailFormId, emailFormId);
		
		emailSubjectName     = _setOption(options.emailSubjectName, emailSubjectName);
		emailAddressesName   = _setOption(options.emailAddressesName, emailAddressesName);
		yourNameName         = _setOption(options.yourNameName, yourNameName);
		yourEmailAddressName = _setOption(options.yourEmailAddressName, yourEmailAddressName);
		yourMessageaName     = _setOption(options.yourMessageaName, yourMessageaName);
		submitButtonName     = _setOption(options.submitButtonName, submitButtonName);
		clearButtonName      = _setOption(options.clearButtonName, clearButtonName);
		
		maxMessageLength     = _setOption(options.maxMessageLength, maxMessageLength);
		messageCharRemainId  = _setOption(options.messageCharRemainId, messageCharRemainId);
		
		dialogueFocuserId    = _setOption(options.dialogueFocuserId, dialogueFocuserId);
		loadingMsgId         = _setOption(options.loadingMsgId, loadingMsgId);
				
		templateOptions      = _setOption(options.templateOptions, templateOptions);
	
	// --------------------------------------------- Init Object	
	
		var emailForm = document.getElementById(emailFormId);
		emailForm[submitButtonName].onclick = Utils.BindAsEventListener(this, _SubmitClick);
		
		if (emailForm[clearButtonName])
		{
			emailForm[clearButtonName].onclick = Utils.BindAsEventListener(this, _ClearClick);
		}
		
		emailForm[yourMessageaName].onkeyup = Utils.BindAsEventListener(this, _UpdateMsgCharCount);
				
		// Initilise the message character count
		var e = {};
		e.target = emailForm[yourMessageaName];
		_UpdateMsgCharCount(e);
		
	// ---------------------------------------------- Add Custom Error Messages
	
		formValidation = new FormValidation();
			
		if (options.customErrorMsgs)
		{
			for (var i = 0; i < options.customErrorMsgs.length; i++)
			{
				this.AddCustomErrorMsg(options.customErrorMsgs[i].fieldName, options.customErrorMsgs[i].validationTypeId, options.customErrorMsgs[i].msg)
			}
		}
		
	};
	
	/*
	 *
	 */
	this.AddCustomErrorMsg = function(fieldName, validationTypeId, msg)
	{
		formValidation.AddCustomErrorMsg(fieldName, validationTypeId, msg);
	};
	
	
// ---------------------------------------------- Call the constructor
	
	this.WebServiceEmailer(options)

	
};
