	/**
	 * 
	 * Javascript Member class
	 * 
	 * @name ModuleMember
	 * @author Vincent Cantin Bellemre
	 * @since 2008-01-11
	 * @version 1.0.0
	 * @package reptileframework
	 * 
	 */
	
	var Member = 
	{
		alertPage 					: null,
		ERROR_CLASS_NAME 			: 'error_login',
		NO_ERROR_CLASS_NAME		 	: 'no_error_login',
		FORM_ID 					: 'member_form',
		SHIPPING_PREFIX 			: 'member_shipping_',
		BILLING_PREFIX 				: 'member_',
		API_CALL_SAVE 				: 'member.saveFields',
		API_CALL_EMAIL				: 'member.validateEmail',
		VALIDATION_ERROR_KEY		: 'member.error_validation',
		ERROR_SHOW_MESSAGE_FIELDS 	: false,
		ERROR_SHOW_RED_FIELDS 		: true,
		
		/*
		 * @param Form loginForm
		 * Validate and authentify loginfrom form
		 */
		loginSubmit : function(loginForm)
		{
			var errors 				= false;
			var validatorsElements 	= Array('email','password');
			
			validatorsElements.each
			(
				function(item)
				{
					inputForm = loginForm[item];
					
					if(inputForm.value == '')
					{
						$(inputForm).addClassName(Member.ERROR_CLASS_NAME);
						errors = true;
					}
					else
					{
						$(inputForm).removeClassName(Member.ERROR_CLASS_NAME);
					}
				}
			);
	
			ErrorReturnUrl = new Element('input',{type:'hidden',value : location.href,name : 'error_return_url'});

			loginForm.insert(ErrorReturnUrl);
			
			if(!errors)
			{
				loginForm.submit();		
			}
		},
		
		/*
		 * Copy values from billing
		 * @param Form currentForm
		 */
		_shippingCopy : function(currentForm)
		{
			$(currentForm).getElements().each
			(
				function(inputElement)
				{
					var fieldExploded = inputElement.name.split(Member.SHIPPING_PREFIX);
					
					if(fieldExploded.length == 2)
					{
						var billingFieldKey 	= Member.BILLING_PREFIX + fieldExploded[1]; 
						var billingField 		= currentForm[billingFieldKey];
						var shippingField 		= inputElement;
						
						if(!Object.isUndefined(billingField) && billingField !== null)
						{
							if($(billingField).match('input') || $(billingField).match('select'))
							{
								shippingField.value = billingField.value;							
							}
						}
					}
				}		
			);
		},
		
		/*
		 * Erase shipping values
		 * @param Form currentForm
		 */
		_shippingErase : function(currentForm)
		{
			$(currentForm).getElements().each
			(
				function(inputElement)
				{
					var fieldExploded = inputElement.name.split(Member.SHIPPING_PREFIX);
					
					if(fieldExploded.length == 2)
					{
						if($(inputElement).match('input'))
						{
							inputElement.value = '';
						}
						else
						{
							if($(inputElement).match('select'))
							{
								inputElement.selectedIndex = 0;									
							}
						}
					}
				}		
			);
		},
		
		/*
		 * Input handler
		 * @param {bool} shippingIsSame
		 */
		shippingIsSame : function(shippingIsSame)
		{
			if(shippingIsSame.checked)
			{
				Member._shippingCopy(shippingIsSame.form);
			}
			else
			{
				Member._shippingErase(shippingIsSame.form);
			}
		},
		
		/*
 		 * PHP Validation for the current form
		 * @param Form currentForm
		 */
		saveFields : function(currentForm, addParameters)
		{
			/*
			 * Ajax validation & submit
			 * */
			API.call(Member.API_CALL_SAVE,currentForm.serialize(true),Member._validateFields.curry(currentForm));
		},
		
		/*
		 * Remove all input errors
		 * @param Form currentForm 
		*/
		_removeFieldsErrors : function(currentForm)
		{
			$(currentForm).getElements().each
			(
				function(currentInput)
				{
					Member._showFieldError(currentInput,false);
				}			
			);
		},
			
		/*
 		 * Ajax response trigged by saveFields
		 * @param Form currentForm
		 */
		_validateFields : function(currentForm)
		{	
			if(!Object.isUndefined(this.responseJSON.errors) && this.responseJSON.errors.length > 0)
			{
				Member._removeFieldsErrors(currentForm);
				
				var errorDiv 		= new Element('div').addClassName('error_div');
				errorDiv.id 		= 'error_div';
				var errorMessage 	= new Element('div').addClassName('error_message').update(PHPVars.get(Member.VALIDATION_ERROR_KEY));
				errorDiv.insert(errorMessage);
				
				var errorUl = new Element('ul');
				
				$H(this.responseJSON.errors).each
				(
					function element(pair)
					{
						var parameters = $H(pair.value).get('parameters');
						
						if(!Object.isUndefined(parameters))
						{							
							if(Member.ERROR_SHOW_RED_FIELDS)
							{
								$A(parameters.fields).each
								(
									function(field)
									{
										Member._showFieldError($(currentForm)[field],true);									
									}
								);		
							}

							if(Member.ERROR_SHOW_MESSAGE_FIELDS)
							{
								$A(parameters.messages).each
								(
									function(message)
									{
										var errorField = new Element('li').addClassName('error_field').update(message);
										errorUl.insert(errorField);
									}
								);								
							}
						}
					}
				);
			
				errorDiv.insert(errorUl);					
				
				Site.popAlert(errorDiv);
				Site.closeAlert.bind(Site).delay(5);
			}
			else
			{
				location.href = currentForm['redirect_success'].value;
			}
		},
		
		validateEmailAjax : function(currentInput)
		{
			API.call(Member.API_CALL_EMAIL,{email : currentInput.value},Member._validateEmailAjax.curry(currentInput));
		},

		_validateEmailAjax : function(currentInput)
		{
			if(this.responseJSON.validation == false)
			{
				Site.popAlert(this.responseJSON.validation_message);
			}
		},
		
		/*
		 * Disable member and password fields
		 * when user doesn't want to update them
		 * @param Form loginForm
		 * @param bool disabledField
		 */
		disableCredentials : function(loginForm,disabledField)
		{
			$A(['member_email','member_email_confirm','member_password','member_password_confirm']).each
			(
				function(fieldKey)
				{
					if(disabledField)
					{
						$(loginForm[fieldKey]).setAttribute('disabled','disabled');											
					}
					else
					{
						$(loginForm[fieldKey]).removeAttribute('disabled');											
					}
				}
			);
		},
		
		/*
		 * Display error for element 
		 * @param Element currentInput
		 * @param bool isError
		 */
		
		_showFieldError : function (currentInput, isError)
		{
			if (!Object.isUndefined(currentInput) && typeof(currentInput) == 'object') 
			{
				if (isError) 
				{
					var addClassName 			= Member.ERROR_CLASS_NAME;
					var removeClassName 		= Member.NO_ERROR_CLASS_NAME;
				}
				else 
				{
					var addClassName 			= Member.NO_ERROR_CLASS_NAME;
					var removeClassName 		= Member.ERROR_CLASS_NAME;
				}
				
				currentInput.addClassName(addClassName);
				currentInput.removeClassName(removeClassName);
			}
			else
			{
				Site.log(currentInput);
			}
		},

		/*
		 * Assigning form values from JSON
		 * @param Object memberObject
		 * @param Form currentForm
		 */ 
		assignProperties : function(memberObject, currentForm)
		{
			Site.log(memberObject);
			
			$H(memberObject).each
			(
				function(pair)
				{
					var currentElement 	= currentForm[pair.key];
					var currentValue 	= pair.value;
					
					if(!Object.isUndefined(currentElement) && currentElement !== null)
					{
						Member._setMemberField(currentElement,currentValue);
					}
				}
			);
		
			Plugins.triggerEvent('onMemberLoad',$H(memberObject));
		},
		
		/*
		 * Set value to a HTML element depending of the type
		 * @param {Object} currentElement
		 * @param {Object} currentValue
		 */
		_setMemberField : function(currentElement, currentValue)
		{
			currentElement = $(currentElement);
			
			if(currentElement.match('input'))
			{
				if(currentElement.type == 'checkbox')
				{
					return currentElement.checked = (currentValue == 1);					
				}
				else
				{
					return currentElement.value = currentValue;					
				}
			}
			else
			{
				if(currentElement.match('select'))
				{
					Site.log(currentElement);
					Site.log(currentValue);
					return currentElement.value = currentValue;
				}
			}
		}
	};
	