/**
 * Account Management module for methods that interact with Registration SOAP services
 * @class actions
 * @author jferrer
 */

AccountManagement.actions = (function(){
	/**
	 * Finds all form fields of a specified type and creates a JSON object representation of those fields
	 * @param	{type}	 Registration service type to parse [profile|email|password|address]
	 * @param	{formid} target container for jquery selector
	 * @param   {arrEmptyProps} array of property names to send as empty values to server
	 * @type	{object}
	 */
	function _serializeRegistrationServicesData(type,formid,arrEmptyProps) {
		var n,
			v,
			re  = new RegExp("^"+type+"_(.*)$"),
			fields,
			obj = {};

		if (typeof(formid)!='undefined'&&formid!==null) {
			fields = $("#"+formid).find(":input[id^='"+type+"']");
		}
		else {
			fields = $(":input[id^='"+type+"']");
		}

		fields.each(function() {
			n = this.id.match(re)[1].split("_")[0];
			v = bam.string.escapeHTML(this.value)||'';
				if (obj[n] === undefined) {
					if(this.type !== 'radio' || (this.type==='radio' && !!this.checked)){
						obj[n] = v;
					}
				}
				else {
					if (this.type != 'radio') {
						if (typeof(obj[n]) == "string" ) {
							var tmp = obj[n];
							obj[n] = [];
							obj[n].push(tmp);
						}
						obj[n].push(v);
					}
				}
		});

		if (typeof(arrEmptyProps)!='undefined'){
			var lenArrEmptyProps = arrEmptyProps.length,
				i = 0;
			do {
				n = arrEmptyProps[i];
				if (typeof(obj[n])=='undefined') obj[n] = [''];
				i++;
			}
			while (i<lenArrEmptyProps);
		}

		return obj;
	}

	function _parseServiceError(serviceOperation, status){
		var errors = {};
		//out = serviceOperation + ' ' + status.code + ' ' + status.message;

		if (status.detailList){
			for (var i = 0; i < status.detailList.length; i++){
				//out = "Status Detail (messageKey) = " + status.detailList[i].message; // status.detailList[i].messageKey; let's use messageKey for placing error message next to form field
				errors[status.detailList[i].messageKey] = status.detailList[i].message;
			}
		}
		return errors;
	}

	function __isDoSubmit(doSubmit){
		if (!!StatusManager.isCriteriaChecked() && !!doSubmit)
				return doSubmit;
			else 
				__isDoSubmit(doSubmit);
	}
	

	var _module = {
		/**
		 * save personal information
		 */
		savePersonalInfo : function(doSubmit) {
			doSubmit = doSubmit || false;

			if (!!doSubmit){
				StatusManager.onSuccess(
					function() {
						var form = $('#form_personalInformation');
						form.unbind();
						form.submit();
						return true;
					}
				);
			}
			else {
				StatusManager.onSuccess(
					function() {
						AccountManagement.message.display('<p>Your Personal Information has been saved!</p>','#profile_personalInformation','success');
						return true;
					}
				);
			}

			if (StatusManager.get('isAddressSubmission')===null) {
				StatusManager.remove('isAddressSubmission');
			
				StatusManager.set('Address');
				objProps = _serializeRegistrationServicesData('address');
				
				if (objProps.id === '') {
					AddressService.add(objProps,
						function(addressId) {
							AddressService.setShipping(addressId, 
								function(){
									StatusManager.update("Address","success");
								}, 
								function(){
									var errors = _parseServiceError(serviceOperation, status);
									StatusManager.update("Address",errors);
								}
							);
						},
						function(serviceOperation, status){
							var errors = _parseServiceError(serviceOperation, status);
							StatusManager.update("Address",errors);
						}
					);
				}
				else {
					AddressService.update(objProps, true,
						function(){
							StatusManager.update("Address","success");
						},
						function(serviceOperation, status){
							var errors = _parseServiceError(serviceOperation, status);
							StatusManager.update("Address",errors);
						}
					);
				}
			} 


			StatusManager.set('Profile');

			var objProps = _serializeRegistrationServicesData('profile','profile_personalInformation');
			ProfileService.save(objProps,
				function() {
					StatusManager.update("Profile","success");
				},
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#profile_personalInformation'});
				}
			);

			return false;
		},
		
		/**
		 * save fan informatino
		 */
		saveFanInfo : function(doSubmit) {
			doSubmit = doSubmit || false;

			StatusManager.onError(
				function(e) {
					return AccountManagement.validation.handleFormValidationErrors({
						e: e,
						formContainer : '.profile_fanInformation',
						msgContainer  : '.msg',
						labelTags     : '.labelBlock',
						scrollTo      : 'msgContainer'
					});
				}
			);
			if (!!doSubmit){
				StatusManager.onSuccess(
					function() {
						var form = $('#form_fanInformation');
						form.unbind();
						form.submit();
						return true;
					}
				);
			}
			else {
				StatusManager.onSuccess(
					function() {
						AccountManagement.message.display('<p>Your Fan Information has been saved!</p>','#profile_fanInformation','success');
						return true;
					}
				);
			}

			$("#wrp-messages").html('');

			StatusManager.set("Profile");
			var objProps = _serializeRegistrationServicesData('profile','profile_fanInformation',['favoriteTeam','leastFavoriteTeam','favoritePlayer']);
			ProfileService.save(objProps,
				function() {
					StatusManager.update("Profile","success");
				},
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#profile_fanInformation'});
				}
			);

			return false;
		},

		/**
		 * save nickname
		 */
		 saveNickname : function() {
			var objProps = _serializeRegistrationServicesData('profile','form_nickname'), params = null, callback = null;
				if (arguments.length===1&&typeof arguments[0]==='object' ){
					params = arguments[0];
					if (!!params.success && typeof params.success==='function')	{ callback=params.success; }
				}
				else if (!!this.success && typeof this.success==='function') { callback=this.success; }
	
			ProfileService.save(objProps,
				function(){
					AccountManagement.message.reset('#form_nickname .msg');
					bam.popModule.exit();
					$("span#profile_nickname").html(objProps.nickname);
					AccountManagement.message.display('<p>Your Nickname has been updated!</p>','#profile_personalInformation','success');
					if (!!callback) { callback(objProps.nickname); }
				},
				//error
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#popup_nickname'});
				}
			);
		 },
	
		 /**
		 * save email
		 */
		 saveEmail : function() {
			var objProps = _serializeRegistrationServicesData('email');
			EmailService.update(objProps,false,
				function(){
					$("span#email_address").html(objProps.address);
					bam.popModule.exit();
					AccountManagement.message.reset('#form_email .msg');
					AccountManagement.message.display('<p>Your Email has been updated!</p>','#profile_accountInformation','success');
				},
				//error
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#form_email'});
				}
			);
		 },

		/**
		 * save password
		 */
		 savePassword : function() {
			var email      =  $("#email_address").html();
			var currentpwd = $("#currentpwd").val();
			var password   = $("#password").val();
			
			if ( !bam.validation.isEmpty(currentpwd) && !bam.validation.isEmpty(password) ) {
				PasswordService.update(email, currentpwd, password, 
					function(){
						AccountManagement.message.reset('#form_password .msg');
						bam.popModule.exit();
						AccountManagement.message.display('<p>Your Password has been updated!</p>','#profile_personalInformation','success');
					},
					function(source,msg){
						AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#popup_password'});
					}
				);
			}
		 },

		/**
		 * Save Avatar. Will be deprecated when PhotoUploadService is done.
		 */
		saveAvatar : function() {
			var objProps = _serializeRegistrationServicesData('profile','form_avatar');
			ProfileService.save(objProps,
				function(){
					if (!!bam.popModule) { bam.popModule.exit(); }
					
					//$('#curAvatar').attr('src','http://mlb.mlb.com/images/account/avatars/200x200/'+objProps.avatar);
					AM.loaders.loadAvatar();
					
					AM.message.reset('#form_avatar .msg');
					AM.message.display('<p>Your Avatar has been updated!</p>','#profile_personalInformation','success');
				},
				//error
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#form_avatar'});
				}
			);
			
		},
		

		/**
		 * Save privacy settings
		 */
		 savePrivacy : function() {
			function _serializePrivacySettings(){
				var re          = new RegExp("^community_(.*)$"),
					_arrPrivacy = [];

				$('select[id^="community_"]').each(
					function(){
						var n, v, el, 
							obj = {};
							
							el = $(this);
							n  = this.id.match(re)[1].split("_")[0];
							obj.name  = n;
							obj.level = el.val();
							_arrPrivacy.push(obj);
					}
				);

				return _arrPrivacy;
			}

			var arrPrivacy = _serializePrivacySettings();

			CommunityService.savePrivacySettings(arrPrivacy, 
				function() { 
					AccountManagement.message.display('<p>Your Privacy Settings have been saved!</p>','#profile_privacy','success');
					//bam.popModule.exit();
				},
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#profile_privacy'});
				}
			);

		 },

		/**
		 * Unblock a user
		 */
		 unblockUser : function(ipid,nickname) {
			FriendService.unblock(ipid, 
				function(){
					AccountManagement.message.display('<p>'+nickname+' has been unblocked</p>','#profile_blockedList','success');
					$('#bu_'+ipid).remove();
				},
				function(source,msg){
					AccountManagement.validation.handleServerErrors({source:source,msg:msg,formContainer:'#profile_blockedList'});
				}
			);
		 }
	};
	return _module;
})();