dojo.provide("ecnext.manta.ScreennamePopupController");

dojo.require("ecnext.JsonService");

dojo.declare("ecnext.manta.ScreennamePopupController", null , {
	widgets: null,
	customerJsonService: null,

	userId: '',
	password: '',
	auxMsgData: {},

	constructor: function(kwArgs) {
		this.customerJsonService = new ecnext.JsonService({uri: '/api/customer'});
		this.auxMsgData= {};
	},

	createWidgets: function(kwArgs) {
		var screennamePopup = dojo.byId('choose_screenname_popup');
		if (!screennamePopup) {
			this._mkScreennamePopup();
		}

		this.widgets = {
			screennamePopup: dojo.byId('choose_screenname_popup'),
			screennameForm: dojo.byId('screenname-form'),
			screennameFormError: dojo.byId('screenname-form-error'),
			emailContainer: dojo.byId('screenname-form-email-container')
		};

		if (kwArgs) {
			if ('cid' in kwArgs) {
				this.setCid(kwArgs.cid);
			}

			if ('hasConfirmedEmail' in kwArgs) {
				this.setHasConfirmedEmail(kwArgs.hasConfirmedEmail);
			}

			if ('screenname' in kwArgs) {
				this.setScreenname(kwArgs.screenname);
			}

			if ('email' in kwArgs) {
				this.setEmail(kwArgs.email);
			}
		}

		this._listen();
		this._updateFormState();
	},

	_mkScreennamePopup: function() {
		var tmpDiv = document.createElement('div');
		document.body.appendChild(tmpDiv);

		tmpDiv.innerHTML = this._popupHtml;
		var screennamePopup = dojo.byId('choose_screenname_popup');
		document.body.appendChild(screennamePopup);

		// Cleanup
		document.body.removeChild(tmpDiv);
	},
	
	setAuxMsgData: function(data) {
		console.warn('setAuxMsgData:'+data);
		this.auxMsgData= data;
	},
	addAuxMsgData: function(data) {
		for(var k in data) {
			if(!k in auxMsgData) {
				this.auxMsgData[k]= data[k];
			}
		}
	},
	updateAuxMsgData: function(data) {
		for(var k in data) {
			this.auxMsgData[k]= data[k];
		}
	},

	_augmentMsgData: function(msg) {
		console.warn('Augmenting JSON message.');
		var aux= false;
		if (this.userId) {
			msg['userId'] = this.userId;
			msg['password'] = this.password;
		}
		for(var k in this.auxMsgData) {
			if(!k in msg) {
				aux= true;
				msg[k]= this.auxMsgData[k];
			}
		}
		if(aux) {
			console.warn('Augmented JSON message with auxMsgData.');
		}
		return msg;
	},

	setUserId: function(userId) {
		this.userId = userId;
	},

	setPassword: function(password) {
		this.password = password;
	},

	setCid: function(cid) {
		var formNode = this.widgets.screennameForm;
		formNode.cid.value = cid;
	},

	hasConfirmedEmail: function(hasConfirmedEmail) {
		var formNode = this.widgets.screennameForm;
		return formNode.hasConfirmedEmail.value == '1' ? true : false;
	},

	setHasConfirmedEmail: function(hasConfirmedEmail) {
		var formNode = this.widgets.screennameForm;
		formNode.hasConfirmedEmail.value = hasConfirmedEmail ? '1' : '0';

		this._updateFormState();
	},

	setScreenname: function(screenname) {
		var formNode = this.widgets.screennameForm;
		formNode.screenname.value = screenname;
		formNode.new_screenname.value = screenname;

		this._updateFormState();
	},

	getScreenname: function(next) {
		var formNode = this.widgets.screennameForm;
		var screenname = formNode.screenname.value || '';
		return screenname;
	},

	setEmail: function(email) {
		var formNode = this.widgets.screennameForm;
		formNode.new_alertdest.value = email;

		this._updateFormState();
	},

	showPopup: function(event, showTooltipArgs) {
		var errDiv = this.widgets.screennameFormError;
		errDiv.style.display = 'none';
		this._updateFormState();
		showTooltip(event, 'choose_screenname_popup', showTooltipArgs);
	},

	_listen: function() {
		var formNode = this.widgets.screennameForm;

		dojo.connect(formNode.new_screenname,
			"onkeyup", dojo.hitch(this, "_updateFormState"));

		dojo.connect(formNode.new_alertdest,
			"onkeyup", dojo.hitch(this, "_updateFormState"));

		dojo.connect(this.widgets.screennameForm.screenname_submit,
			"onclick", dojo.hitch(this, "_submit"));
	},

	_updateFormState: function() {
		var formNode = this.widgets.screennameForm;
		var screenname = this.getScreenname();
		if (screenname) {
			formNode.new_screenname.value = screenname;
			formNode.new_screenname.disabled = true;
		}

		var submitDisabled = false;

		var alertDest = formNode.new_alertdest.value;

		var emailContainerDisplay = 'none';
		if (!this.hasConfirmedEmail()) {
			emailContainerDisplay = '';
			if (!alertDest.match(/@/)) {
				submitDisabled = true;
			}
		}
		this.widgets.emailContainer.style.display = emailContainerDisplay;

		formNode.screenname_submit.disabled = submitDisabled;
	},

	_submit: function() {
		var screenname = this.getScreenname();

		if (screenname) {
			this._submitAlertDestination();
		}
		else {
			this._submitScreenname();
		}
	},

	_submitScreenname: function() {
		var form = this.widgets.screennameForm;
		var newScreenname = form.new_screenname.value || '';

		var errDiv = this.widgets.screennameFormError;
		if (newScreenname) {
			errDiv.style.display = 'none';
			form.screenname_submit.disabled = true;
			var prevSubmitValue = form.screenname_submit.value;
			form.screenname_submit.value = 'Saving...';

			var dResult = this._sendSetScreennameMsg(newScreenname);
			var _this = this;
			dResult.addBoth(function(response) {
				form.screenname_submit.disabled = false;
				form.screenname_submit.value = prevSubmitValue;
				return response;
			});

			dResult.addCallback(function(result) {
				form.screenname.value = newScreenname;
				if (!_this.hasConfirmedEmail()) {
					_this._submitAlertDestination();
				}
				else {
					_this._finish();
				}
				return result;
			});

			dResult.addErrback(function(error) {
				errDiv.innerHTML = 'There was an internal error adding your screen name.  If you continue to experience problems please contact the support desk.';
				if ("response" in error && error.response.exceptionClassName == 'NonUniqueScreennameException') {
					errDiv.innerHTML = 'Sorry, but that screen name is already in use.  Try again?';
				}
				errDiv.style.display = '';
				return error;
			});
		}
		else {
			errDiv.innerHTML = 'You must enter a screenname to continue.';
			errDiv.style.display = '';
		}
	},

	_sendSetScreennameMsg: function(newScreenname) {
		var msg = {
			action: 'setScreenname',
			screenname: newScreenname
		};

		msg= this._augmentMsgData(msg);

		var dResult = this.customerJsonService.sendMessage({msg: msg});

		return dResult;
	},

	_submitAlertDestination: function() {
		var form = this.widgets.screennameForm;
		var newAlertDest = form.new_alertdest.value || '';

		var errDiv = this.widgets.screennameFormError;
		if (newAlertDest) {
			errDiv.style.display = 'none';
			form.screenname_submit.disabled = true;
			var prevSubmitValue = form.screenname_submit.value;
			form.screenname_submit.value = 'Saving...';

			var dResult = this._sendSetAlertDestinationMsg(newAlertDest);
			var _this = this;
			dResult.addBoth(function(response) {
				form.screenname_submit.disabled = false;
				form.screenname_submit.value = prevSubmitValue;
				return response;
			});

			dResult.addCallback(function(result) {
				form.alertdest.value = newAlertDest;
				_this.setHasConfirmedEmail(true);
				console.dir({result: result});
				_this._finish();
				return result;
			});

			dResult.addErrback(function(error) {
				errDiv.innerHTML = 'There was an internal error adding your email address.  If you continue to experience problems please contact the support desk.';
				//if ("response" in error && error.response.exceptionClassName == 'NonUniqueScreennameException') {
				//	errDiv.innerHTML = 'Sorry, but that screen name is already in use.  Try again?';
				//}
				errDiv.style.display = '';
				return error;
			});
		}
		else {
			errDiv.innerHTML = 'You must enter an email address to continue.';
			errDiv.style.display = '';
		}
	},

	_finish: function() {
		 hideTooltip(null, 'choose_screenname_popup');
		 dojo.publish("ecnext-screenname-popup-success", [this]);
	},

	_sendSetAlertDestinationMsg: function(newAlertDest) {
		var formNode = this.widgets.screennameForm;
		var msg = {
			action: 'addAlertDestination',
			alertdest: newAlertDest,
			type: 'companyqa',
			cid: this._getCid()
		};

		msg= this._augmentMsgData(msg);

		var dResult = this.customerJsonService.sendMessage({msg: msg});

		return dResult;
	},

	_getCid: function() {
		var formNode = this.widgets.screennameForm;
		return formNode.cid.value;
	},

	_popupHtml: '\
<div style="left: 320px; top: 583px; display: none;" id="choose_screenname_popup" class="popup">\
	<div style="width: 300px;" class="inner">\
		<a href="#" onclick="hideTooltip(null, \'choose_screenname_popup\'); return false;" class="close-icon">x</a><div class="choose-screenname-popup">\
	<div class="h1"><strong class="big">Choose a Screen Name</strong></div>\
	<p>\
	You must have a screen name to ask a question or post a comment on Manta.com. Your screen name is different from your Manta user ID and will appear next to all your questions and comments. </p>\
\
	<p class="warning" id="screenname-form-error" style="display: none;">This is where errors go!</p>\
\
	<form id="screenname-form" name="screenname-form">\
		<input type="hidden" value="" name="cid"/>\
		<input type="hidden" value="1" name="hasConfirmedEmail"/>\
		<input type="hidden" value="" name="screenname"/>\
		<input type="hidden" value="" name="alertdest"/>\
		<table>\
			<tbody>\
				<tr>\
					<td><label for="screenname"><strong>screen name</strong> (exactly how it will appear)</label></td>\
				</tr>\
				<tr>\
					<td><input type="text" value="" name="new_screenname" style="width: 280px;"/></td>\
				</tr>\
			</tbody>\
			<tbody id="screenname-form-email-container" style="display: none;">\
				<tr>\
					<td><label for="alertdest">An email with a link to activate your registration will be sent to the following address:</label></td>\
				</tr>\
				<tr>\
					<td><input type="text" value="stsmith@ecnext.com" name="new_alertdest" style="width: 280px;"/></td>\
				</tr>\
				<tr>\
					<td>(or enter a new email address for your profile)</td>\
				</tr>\
			</tbody>\
			<tbody><tr>\
				<td style="text-align: right;"><input type="button" onclick="" value="Add" name="screenname_submit"/></td>\
			</tr>\
		</tbody></table>\
	</form>\
</div>	</div>\
</div>',

	zLastFunction: function() {}
});
