
/*
FILE CONCAT ADD FILE
PATH: /ft/resources/client/modules/alerts/Preferences.js
*/

var Preferences = function() {}

Preferences.prototype.BUFFER_CONTENT_TYPE = 'text/javascript';
Preferences.prototype.BUFFER_URL_DEFAULT = SiteRules.getURL('/resources/buffer/alerts/Preferences.asp');
Preferences.prototype.BUFFER_URL_TWITTER = SiteRules.getURL('/resources/buffer/alerts/Twitter.asp');

Preferences.prototype.DEFAULT_ERROR_MESSAGE = 'This feature is not currently available.'
Preferences.prototype.DEFAULT_SUCCESS_MESSAGE = 'Delivery preferences have been updated.';

Preferences.prototype.DELIVERY_STATUS = 'deliveryStatus';

Preferences.prototype.EMAIL_SELECTED = 'emailSelected';

Preferences.prototype.PREVIEW_WIDTH = 775;
Preferences.prototype.PREVIEW_HEIGHT = 750;

Preferences.prototype.TEMPLATE_EXAMPLE_IC = '/investorsChronicle/resources/server/alerts/TemplateExample.asp?img=';
Preferences.prototype.TEMPLATE_EXAMPLE_FT = '/ft/resources/server/alerts/TemplateExample.asp?img=';

Preferences.prototype.TWITTER_ERROR_MESSAGE = 'The username or password you entered is incorrect.';
Preferences.prototype.TWITTER_SUCCESS_MESSAGE = 'Confirmed.  Please save preferences to begin receiving Twitter alerts.';

Preferences.prototype.VACATION = 'vacation';

Preferences.prototype.confirmTwitter = function(ev, el) {
	if (ev) { ev.cancel(); }

	var oParams = {
		 'isTwitter': true
		,'username':  WSDOM.Element.get('twitterUsername').value
		,'password':  WSDOM.Element.get('twitterPassword').value
	};

	this.loadContentBuffer(oParams);
}

Preferences.prototype.init = function() {
	WSDOM.Events.add(WSDOM.Element.get('twitterConfirmInnerButton'), 'click', this.confirmTwitter, this);
	WSDOM.Events.add(WSDOM.Element.get('savePreferencesInnerButton'), 'click', this.savePreferences, this);

	var templateExampleLinks = WSDOM.Element.parseSelector('A.templateExample', WSDOM.Element.get('wsod'));
	WSDOM.Events.add(templateExampleLinks, 'click', this.displayTemplateExample, this);

	this.previousTwitterUsername = WSDOM.Element.get('twitterUsername').value || '';
}

Preferences.prototype.displayTemplateExample = function(ev, el) {
	if (ev) { ev.cancel(); }

	el.blur();

	var oImage = new Image(),
    	sType = (el.getAttribute('exampleType'));

	switch (sType) {
		case 'htmlExampleCompany':
			oImage.src = SiteRules.getURL('/resources/image/alerts/priceHTML.png')
			break;

		case 'textExampleCompany':
			oImage.src = SiteRules.getURL('/resources/image/alerts/priceTXT.png')
			break;

		case 'htmlExampleKeyword':
			oImage.src = SiteRules.getURL('/resources/image/alerts/keywordHTML.png')
			break;

		case 'textExampleKeyword':
			oImage.src = SiteRules.getURL('/resources/image/alerts/keywordTXT.png')
			break;

		case 'htmlExamplePortfolio':
			oImage.src = SiteRules.getURL('/resources/image/alerts/portfolioHTML.png')
			break;

		case 'textExamplePortfolio':
			oImage.src = SiteRules.getURL('/resources/image/alerts/portfolioTXT.png')
			break;

		case 'htmlExampleCompanyIC':
			oImage.src = ('/ft/resources/image/InvestorsChronicle/alerts/IC_alerts_price_html.png')
			break;

		case 'textExampleCompanyIC':
			oImage.src = ('/ft/resources/image/InvestorsChronicle/alerts/IC_alerts_price_text.png')
			break;
		case 'htmlExamplePortfolioIC':
			oImage.src = ('/ft/resources/image/InvestorsChronicle/alerts/IC_alerts_portfolio_html.png')
			break;

		case 'textExamplePortfolioIC':
			oImage.src = ('/ft/resources/image/InvestorsChronicle/alerts/IC_alerts_portfolio_text.png')
			break;
	}

	if (this.showExampleWindow) {
		this.showExampleWindow.close();
	}

	var sURL = (SiteRules.isInvestorsChronicle()) ? this.TEMPLATE_EXAMPLE_IC : this.TEMPLATE_EXAMPLE_FT;

	this.showExampleWindow = window.open(
		sURL + oImage.src,
		'alertExample',
		'width=' + (this.PREVIEW_WIDTH) + ',height=' + (this.PREVIEW_HEIGHT) + ',status=no,toolbar=no,resizable=yes,location=no,menubar=no,scrollbars=yes'
	);
}

Preferences.prototype.getData = function() {
	return null;
}

Preferences.prototype.setData = function(sData) {
	sData = sData || '';

	this.getData = function() {
		return sData;
	}

	return this.getData();
}

Preferences.prototype.loadContentBuffer = function(oData) {
	oData = oData || {};

	var cbMethodForOnLoad = (oData.isTwitter) ? this.onLoadForTwitter : this.onLoad,
		cbURL = (oData.isTwitter) ? this.BUFFER_URL_TWITTER : this.BUFFER_URL_DEFAULT,
		sSerializedData = Common.getSerializer().serialize(oData);

	var contentBuffer = new ContentBuffer();
		contentBuffer.abortRequests();
		contentBuffer.load(
			{
				 contentType: this.BUFFER_CONTENT_TYPE
				,context:     this
				,data:        { serializedData:sSerializedData }
				,onload:      cbMethodForOnLoad
				,onerror:     this.onError
				,preventEval: true
				,url:         cbURL
			}
		);
}

Preferences.prototype.renderVacationStopSelectMenus = function() {
	var aVacationStopContainers = [ WSDOM.Element.get('vacationStopDatesContainer_1'), WSDOM.Element.get('vacationStopDatesContainer_2') ]
		,endYear = 1
		,oData = this.getData()
		,startOrEndDate
		,startOrEndYear
		,startYear = 0
		,today = new Date()
		,todayYear = today.getFullYear();

	this.dateSelects = {};

	for (var i = 0; i < aVacationStopContainers.length; i++) {
		if (oData && !oData.vacationOn) {
			startOrEndDate = today;
		}
		else {
			if (0 == i) {
				// Stop sending on:
				startOrEndDate = (oData && oData.vacationStart) ? new Date(oData.vacationStart.replace(/(\d{4})(\d{2})(\d{2})/,'$1/$2/$3')) : today;
			}
			else {
				// Resume sending on:
				startOrEndDate = (oData && oData.vacationEnd) ? new Date(oData.vacationEnd.replace(/(\d{4})(\d{2})(\d{2})/,'$1/$2/$3')) : today;
			}
		}

		startOrEndYear = startOrEndDate.getFullYear();

		if (startOrEndYear != todayYear) {
			startYear = todayYear - startOrEndYear;
			endYear = 0;
		}

		this.dateSelects[i] = new DateSelector(		
			{
				 container:   aVacationStopContainers[i]
				,date:        new Date(startOrEndDate)
				,debug:       0
				,endYear:     endYear
				,fieldName:   'vacation' + (i ? 'End' : 'Start')
				,monthFormat: '!mmm'
				,startYear:   startYear
			}
		);
	}
}

Preferences.prototype.onLoad = function(cb) {
	var deserializedResults = Common.getSerializer().deserialize(cb.getResult()) || false;
	// console.log('results', deserializedResults);

	var errorModuleContainer = WSDOM.Element.parseSelector('DIV.errorModuleContainer', WSDOM.Element.get('wsod'), 'first'),
		statusMessageContainer = WSDOM.Element.get('statusMessageContainer');

	WSDOM.Element.setHTML(errorModuleContainer, '');
	WSDOM.Element.setHTML(statusMessageContainer, '');

	if (deserializedResults) {
		var sErrorMessage = (deserializedResults.suspendedAddress && deserializedResults.suspendedAddress.message) ? deserializedResults.suspendedAddress.message : '';
		WSDOM.Element.setHTML(errorModuleContainer, sErrorMessage);

		if (deserializedResults.bIsTwitterApplicable) {
			this.renderTwitterStatus(deserializedResults.bIsTwitterConfirmed);
		}

		if (deserializedResults.customerProfile.errorMessage) {
			alert(deserializedResults.customerProfile.errorMessage);
		}
		else {
			WSDOM.Element.setHTML(statusMessageContainer, this.DEFAULT_SUCCESS_MESSAGE);
		}
	}
}

Preferences.prototype.onLoadForTwitter = function(cb) {
	var bIsConfirmed = Common.getSerializer().deserialize(cb.getResult()) || false;

	this.renderTwitterStatus(bIsConfirmed);
}

Preferences.prototype.onError = function(cb) {
	var deserializedResults = Common.getSerializer().deserialize(cb.getResult()) || {};
	// console.log('error', deserializedResults);

	WSDOM.Element.setHTML(WSDOM.Element.get('statusMessageContainer'), this.DEFAULT_ERROR_MESSAGE);
}

Preferences.prototype.renderTwitterStatus = function(bIsConfirmed) {
	bIsConfirmed = bIsConfirmed || false;

	var sMessage = (1 == bIsConfirmed) ?
		[ '<span class="isSuccess">', this.TWITTER_SUCCESS_MESSAGE, '</span>' ].join('')
		:
		[ '<span class="isError">', this.TWITTER_ERROR_MESSAGE, '</span>' ].join('');

	var twitterStatusMessageContainer = WSDOM.Element.get('twitterStatusMessageContainer');

	WSDOM.Element.setHTML(twitterStatusMessageContainer, '');
	WSDOM.Element.setHTML(twitterStatusMessageContainer, sMessage);
}

Preferences.prototype.savePreferences = function(ev, el) {
	if (ev) { ev.cancel(); }

	var elForm = WSDOM.Element.get('preferencesForm')
		,aEmailAddresses = WSDOM.Element.parseSelector('INPUT.emailAddress', elForm)
		,aErrorMessages = []
		,bIsError = false
		,currentEmail
		,currentEmailValue
		,elChecked = WSDOM.Element.parseSelector('INPUT[checked=.`true`]', elForm)
		,emailAddress
		,emailAddressValue
		,emailPreferenceParent
		,iTodaysDate
		,oCurrentInput
		,oParams = {}
		,sTwitterUsername = WSDOM.Element.get('twitterUsername').value || ''
		,sTwitterPassword = WSDOM.Element.get('twitterPassword').value || ''
		,vacationEnd
		,vacationStart;

	if (
		(sTwitterUsername.length && !sTwitterPassword.length) ||
		(sTwitterPassword.length && !sTwitterUsername.length)
	) {
		aErrorMessages.push('Twitter username or password is missing.');
		bIsError = true;
	}
	else {
		oParams['twitterUsername'] = sTwitterUsername;
		oParams['twitterPassword'] = sTwitterPassword;
	}

	for (var i = 0; i < elChecked.length; i++) {
		oCurrentInput = elChecked[i];

		oParams[oCurrentInput.getAttribute('name')] = oCurrentInput.value;

		if (this.EMAIL_SELECTED == oCurrentInput.name) {
			emailPreferenceParent = WSDOM.Element.getParent(oCurrentInput, 'FIELDSET');
			emailAddress = WSDOM.Element.parseSelector('INPUT.emailAddress', emailPreferenceParent, 'first');

			emailAddressValue = trim(emailAddress.value);

			if (!emailAddressValue.length) {
				aErrorMessages.push('The selected email address is missing.');
				bIsError = true;
			}
			else {
				oParams[oCurrentInput.getAttribute('name')] = emailAddressValue;  // Select which email address to use
			}
		}
		else if ((this.DELIVERY_STATUS == oCurrentInput.name) && (this.VACATION == oCurrentInput.value)) {
			iTodaysDate = Math.floor(jsToMsDate(new Date()));

			vacationStart = WSDOM.Element.parseSelector('INPUT[name="vacationStart"]', elForm, 'first');
			vacationEnd =   WSDOM.Element.parseSelector('INPUT[name="vacationEnd"]', elForm, 'first');

			oParams.vacationStart = Math.floor(jsToMsDate(new Date(vacationStart.value)));
			oParams.vacationEnd =   Math.floor(jsToMsDate(new Date(vacationEnd.value)));

			if (iTodaysDate > oParams.vacationStart || iTodaysDate > oParams.vacationEnd) {
				aErrorMessages.push('Vacation dates must not be before today\'s date.');
				bIsError = true;
			}
			else if (oParams.vacationStart > oParams.vacationEnd) {
				aErrorMessages.push('The vacation "resume" date must not be before the "stop" date.');
				bIsError = true;
			}
			else if (oParams.vacationStart == oParams.vacationEnd) {
				aErrorMessages.push('The vacation "resume" date must not be the same as the "stop" date.');
				bIsError = true;
			}
		}
	}

	for (var i = 0; i < aEmailAddresses.length; i++) {
		currentEmail = aEmailAddresses[i];
		currentEmailValue = trim(currentEmail.value);

		if (currentEmailValue.length) {
			if (!Common.validateEmail(currentEmailValue)) {
				aErrorMessages.push('The email address "' + currentEmailValue + '" is not valid.');
				bIsError = true;
			}
			else {
				if (currentEmail.getAttribute('emailName')) {
					oParams[currentEmail.getAttribute('emailName')] = currentEmailValue;
				}
				else {
					oParams[currentEmail.getAttribute('name')] = currentEmailValue;  // Set the email preference(s)
				}
			}
		}
	}

	if (!bIsError) {
		var goAhead = true;

		if (this.previousTwitterUsername.length && !sTwitterUsername.length) {
			oParams['bDeleteTwitter'] = true;

			goAhead = confirm( 'Are you sure you want to stop receiving Twitter alerts?' );
		}

		if (goAhead) {
			// console.log(oParams);

			this.loadContentBuffer({
				 'action': 'save'
				,'params': oParams
			});
		}
	}
	else {
		if (aErrorMessages.length) {
			alert('Correct the following errors:\n\n' + aErrorMessages.join('\n'));
		}
	}
}
