YAHOO.namespace('sendgm');

YAHOO.sendgm.SignupView = function(initFilter) {
	
	var _private = {};
	var _public = {};

	_private.addContactTypeIdListeners = function(element) {
		if (element) {
			YAHOO.util.Event.addListener(element, 'change', function(e) {
				_private.changeContactTypeId();
			});
			YAHOO.util.Event.addListener(element, 'click', function(e) {
				_private.changeContactTypeId();
			});
		}
	};
	
	_private.getContactTypeId = function() {
		if (_private.contactTypeId) {
			return _private.contactTypeId.value;
		}
		else if (_private.contactTypeIdEmail && _private.contactTypeIdEmail.checked) {
			return 1;
		}
		else if (_private.contactTypeIdPhone && _private.contactTypeIdPhone.checked) {
			return 2;
		}
		else if (_private.contactTypeIdSms && _private.contactTypeIdSms.checked) {
			return 3;
		}
	};
	
	_private.changeContactTypeId = function() {
		var contactTypeId = _private.getContactTypeId();
		if (contactTypeId==1) {
			_private.contactValueLabel.innerHTML = 'Email Address:';
			_private.contactValue.value = '';
			_private.contactValueTip.innerHTML = '(such as kent@yahoo.com)';
			_private.verifyMessage.innerHTML = 'Enter the <i>Verify Code</i> we just emailed you...';
			_private.joinMessage.innerHTML = 'Check the groups to join via email...';
		}
		else if (contactTypeId==2) {
			_private.contactValueLabel.innerHTML = 'Phone Number:';
			_private.contactValue.value = '';
			_private.contactValueTip.innerHTML = '(such as 316-555-1212)';
			_private.verifyMessage.innerHTML = 'Calling your phone number now. Enter the <i>Verify Code</i> from the phone call...';
			_private.joinMessage.innerHTML = 'Check the groups to join via voice phone...';
		}
		else if (contactTypeId==3) {
			_private.contactValueLabel.innerHTML = 'Mobile Number:';
			_private.contactValue.value = '';
			_private.contactValueTip.innerHTML = '(such as 316-555-1212)';
			_private.verifyMessage.innerHTML = 'Enter the <i>Verify Code</i> we just texted you...';
			_private.joinMessage.innerHTML = 'Check the groups to join via texts to your mobile phone...';
		}
	}
	
	_private.showError = function(errorText) {
		if (errorText) {
			_private.errorElement.innerHTML = errorText;
		}
		YAHOO.util.Dom.setStyle(_private.errorElement, 'display', errorText ? '' : 'none');
	}

	_private.initiateContactAction = function() {
		var contactTypeId = _private.getContactTypeId();
		var postData = '';
		postData += 'step=initiate-contact-action';
		postData += '&Contact.AccountName=' + initFilter.accountName;
		postData += '&Contact.ContactTypeId=' + contactTypeId;
		postData += '&Contact.ContactValue=' + encodeURIComponent(_private.contactValue.value);
		postData += '&Contact.FirstName=' + encodeURIComponent(_private.firstName.value);
		postData += '&Contact.LastName=' + encodeURIComponent(_private.lastName.value);
		YAHOO.util.Connect.asyncRequest(
			'POST', 
			'/service/index.jsp', 
			{
				success: function(o) {
					_private.contactId = o.responseText.trim();
					_private.setStepIndex(_private.stepIndex+1);
				}, 
				failure: function(o) {
					var response = o.responseText.trim();
					var errorText = response.startsWith('!!!') ? response.substring(3) : response;
					_private.showError(errorText);
				}
			},
			postData
		);
	}
	
	_private.verifyContactAction = function() {
		if (_private.verifyCodeInput.value && _private.verifyCodeInput.value.length==5) {
			var postData = '';
			postData += 'step=verify-contact-action';
			postData += '&contactId=' + _private.contactId;
			postData += '&verifyCode=' + encodeURIComponent(_private.verifyCodeInput.value);
			YAHOO.util.Connect.asyncRequest(
				'POST', 
				'/service/index.jsp', 
				{
					success: function(o) {
						_private.setStepIndex(_private.stepIndex+1);
					}, 
					failure: function(o) {
						var response = o.responseText.trim();
						var errorText = response.startsWith('!!!') ? response.substring(3) : response;
						_private.showError(errorText);
					}
				},
				postData
			);
		}
		else {
			_private.showError('Must specify a 5 digit verify code');
		}
	}
	
	_private.addRemoveContactGroups = function() {
		var inputs = YAHOO.util.Selector.query('#select-groups-container input');
		var addContactGroupIdsCsv = '';
		var removeContactGroupIdsCsv = '';
		for (var i=0; i<inputs.length; i++) {
			var contactGroupId = inputs[i].id.substring('contact-group-id-'.length);
			if (inputs[i].checked) {
				addContactGroupIdsCsv += (addContactGroupIdsCsv ? ',' : '') + contactGroupId;
			}
			else {
				removeContactGroupIdsCsv += (removeContactGroupIdsCsv ? ',' : '') + contactGroupId;
			}
		}
		
		var postData = '';
		postData += 'step=add-remove-contact-groups';
		postData += '&contactId=' + _private.contactId;
		postData += '&addContactGroupIdsCsv=' + addContactGroupIdsCsv;
		postData += '&removeContactGroupIdsCsv=' + removeContactGroupIdsCsv;
		YAHOO.util.Connect.asyncRequest(
			'POST', 
			'/service/index.jsp', 
			{
				success: function(o) {
					_private.setStepIndex(_private.stepIndex+1);
				}, 
				failure: function(o) {
					var response = o.responseText.trim();
					var errorText = response.startsWith('!!!') ? response.substring(3) : response;
					_private.showError(errorText);
				}
			},
			postData
		);
	}
	
	_private.beforeSetStepIndex = function(newStepIndex) {
		if (newStepIndex>_private.stepIndex) {
			switch (_private.stepIndex) {
				case 0:
					_private.initiateContactAction();
					break;
				case 1:
					_private.verifyContactAction();
					break;
				case 2:
					_private.addRemoveContactGroups();
					break;
				case 3:
					break;
			}
		}
		else {
			_private.setStepIndex(newStepIndex);			
		}
	}
	
	_private.setStepIndex = function(newStepIndex) {
		YAHOO.util.Dom.setStyle(_private.stepContentElements[_private.stepIndex], 'display', 'none');
		
		_private.stepIndex = newStepIndex<0 ? 0 : (newStepIndex>=_private.stepContentElements.length ? _private.stepContentElements.length -1 : newStepIndex);
	
		_private.showError();
		
		YAHOO.util.Dom.setStyle(_private.stepContentElements[_private.stepIndex], 'display', '');
		
		if (newStepIndex==2) {
			var viewportHeight = YAHOO.util.Dom.getViewportHeight();
			var selectGroupsContainerRegion = YAHOO.util.Dom.getRegion('select-groups-container');
			var selectGroupsWizardStepFtRegion = YAHOO.util.Dom.getRegion('select-groups-wizard-step-ft');
			var wizardFtRegion = YAHOO.util.Dom.getRegion('wizard-ft');
			var height = viewportHeight - selectGroupsContainerRegion.top - selectGroupsWizardStepFtRegion.height - wizardFtRegion.height;
			YAHOO.util.Dom.setStyle('select-groups-container', 'height', height + 'px');
		}
		
		YAHOO.util.Dom.setStyle('prev-button', 'display', _private.stepIndex==0 || _private.stepIndex>=(_private.stepContentElements.length-1) ? 'none' : '');
		YAHOO.util.Dom.setStyle('next-button', 'display', _private.stepIndex==(_private.stepContentElements.length-1) ? 'none' : '');
	};
	
	_private.resizeToParentWidth = function(input) {
		var region = YAHOO.util.Dom.getRegion(input.parentNode);
		YAHOO.util.Dom.setStyle(input, 'width', region.width + 'px');
	};
	
	_private.addCheckUncheckAllGroupsListener = function(linkId, check) {
		YAHOO.util.Event.addListener(linkId, 'click', function(e) {
			YAHOO.util.Event.stopEvent(e);
			for (var i=0; i<_private.groupCheckboxes.length; i++) {
				_private.groupCheckboxes[i].checked = check;
			}
			return false;
		});
	};
	
	_private.init = function() {
		_private.errorElement = YAHOO.util.Dom.get('error');
		_private.stepIndex = 0;
		_private.stepContentElements = YAHOO.util.Selector.query('li.wizard-step');
		
		_private.contactTypeId = YAHOO.util.Dom.get('contact-type-id');
		_private.contactTypeIdEmail = YAHOO.util.Dom.get('contact-type-id-email');
		_private.contactTypeIdSms = YAHOO.util.Dom.get('contact-type-id-sms');
		_private.contactTypeIdPhone = YAHOO.util.Dom.get('contact-type-id-phone');
		_private.contactValue = YAHOO.util.Dom.get('contact-value');
		_private.resizeToParentWidth(_private.contactValue);
		_private.contactValueLabel = YAHOO.util.Dom.get('contact-value-label');
		_private.contactValueTip = YAHOO.util.Dom.get('contact-value-tip');
		
		_private.firstName = YAHOO.util.Dom.get('first-name');
		_private.resizeToParentWidth(_private.firstName);

		_private.lastName = YAHOO.util.Dom.get('last-name');
		_private.resizeToParentWidth(_private.lastName);
		
		_private.verifyMessage = YAHOO.util.Dom.get('verify-message');
		_private.verifyCodeInput = YAHOO.util.Dom.get('verify-code');

		_private.joinMessage = YAHOO.util.Dom.get('join-message');

		YAHOO.util.Event.addListener('prev-button', 'click', function(e) {
			YAHOO.util.Event.stopEvent(e);
			_private.beforeSetStepIndex(_private.stepIndex-1);
			return false;
		});
		
		YAHOO.util.Event.addListener('next-button', 'click', function(e) {
			YAHOO.util.Event.stopEvent(e);
			_private.beforeSetStepIndex(_private.stepIndex+1);
			return false;
		});
		
		YAHOO.util.Event.addListener('restart-link', 'click', function(e) {
			YAHOO.util.Event.stopEvent(e);
			_private.verifyCodeInput.value = '';
			_private.beforeSetStepIndex(0);
			return false;
		});

		_private.addContactTypeIdListeners(_private.contactTypeId);
		_private.addContactTypeIdListeners(_private.contactTypeIdEmail);
		_private.addContactTypeIdListeners(_private.contactTypeIdPhone);
		_private.addContactTypeIdListeners(_private.contactTypeIdSms);

		_private.groupCheckboxes = YAHOO.util.Selector.query('#select-groups-container input');
		_private.addCheckUncheckAllGroupsListener('check-all-groups-link', true);
		_private.addCheckUncheckAllGroupsListener('uncheck-all-groups-link', false);

		_private.changeContactTypeId(false);
	}

	_private.init();
	
	return _public;
}
