/**
 * USER
 */

	
	/**
	 * Credentials
	 * @param {Object} username
	 * @param {Object} password
	 */
	var Credentials = base2.Base.extend({
		constructor: function(username, password) {
			this.Username = username;
			this.Password = password;
		}
	});


	/**
	 * Login form
	 * @param {Object} options
	 */
	var LoginForm = Popup.extend({
		constructor: function(options) {
			this.SetOptions(options);
			this.SetEvents();
		},

		SetOptions: function(options) {
			this.Defaults = {
				Container: "#actions",
				ButtonText: "My Saved Holiday Planner",
				ElementID: "btnLogin",
				EmailField: "#loginEmail",
				PasswordField: "#loginPassword",
				Channel: GBPCHANNELS.PureTasmania,
				Template: "templates/gbp_login.html"
			}

			this.Options = jQuery.extend({}, this.Defaults, options);
		},


		SetEvents: function() {
			var object = this;
			jQuery("#" + this.Options.ElementID + " .btn1 a").live("click", function() {
				var anchor = jQuery(this);
				var item = anchor.parent().parent();
				var p = item.find('.popup');
				if (!p.hasClass('popup-active'))
				{
					item.find('.popup').removeClass('popup-active').end().find('.btn1 a').removeClass('active');
				}
				anchor.toggleClass('active');
				if (anchor.hasClass('active')) {
					p.addClass('popup-active').hide();
					p.stop(true,false).css({display: "block", opacity: 0}).animate({opacity: 1});
				} else {
					p.stop(true,false).animate({opacity: 0}, 500, "swing", function() {
						jQuery(this).css({ display: "none"});						
					});
				}

				return false;
			});

			// Submit the login
			jQuery("#" + this.Options.ElementID + " .btn2 a").live("click", function() {
				object.Submit();

				return false;
			});
			
			
			// Link to Register 
			jQuery("#" + this.Options.ElementID + " .lnkRegister a").live("click", function(event) {
				
				var btnRegister = jQuery("#btnRegistration");
				var registerPopup = btnRegister.find(".popup").css({ display: "block"}).addClass("popup-active");
				var registerAnchor = registerPopup.parent().prev().find("a").addClass("active");
				
				registerPopup.animate({opacity: 1})
				
				return false;
			});
		},

		/**
		 * Appends the login form markup into the specified container
		 * @param {Object} jQContainer
		 */
		Render: function(jQContainer) {
			var template = LoadTemplate("templates/gbp_login.html");
			template = template.replace("%BUTTONTEXT%", this.Options.ButtonText);

			var item = jQuery(template);
			item.attr("id", this.Options.ElementID);

			jQContainer.append(item);

		},

		Submit: function() {
			var element = jQuery("#" + this.Options.ElementID);
			var email = element.find(this.Options.EmailField).val();
			var password = element.find(this.Options.PasswordField).val();

			if (this.ValidForm()) {
				var credentials = new Credentials(email, password);
				var loginResponse = userManager.Login(credentials, this.ShowUserDetails);
				
				if (loginResponse.Result && loginResponse.Value.Result) {
					user = loginResponse.Value.User;
					userManager.SetUser(user);
				} else {
					ShowError("Could not log user in: " + loginResponse.Message);
				}
			}
		},

		/**
		 * Check to see if the form is valid
		 */
		ValidForm: function() {
			var element = jQuery("#" + this.Options.ElementID);
			var email = element.find(this.Options.EmailField).val();
			var password = element.find(this.Options.PasswordField).val();
			var passwordConfirm = element.find(this.Options.PasswordField).val();
			
			
			return (email != "" && password != "");


		}

	});


	/**
	 * User Object 
	 * @param {Object} options
	 */
	var User = base2.Base.extend({
		constructor: function(options) {
			this.SetOptions(options);
		},
		
		SetOptions: function(options) {
			this.Defaults = {
				APILogin: GBPServiceUrl + "/user/login",
				Channel: GBPCHANNELS.PureTasmania
			}

			this.Options = jQuery.extend({}, this.Defaults, options);


		},
		
		
		Clear: function() {
		}
	});


	var UserManager = base2.Base.extend({
		constructor: function(options) {
			this.SetOptions(options);
			
			this.loginForm = new LoginForm();
			this.loginForm.Load();
			
			this.registrationForm = new RegistrationForm();
			this.registrationForm.Load();
			
			this.GetCurrentUser();
			
		},
		
		loginForm: null,
		
		registrationForm: null,
		
		SetOptions: function(options) {
			this.Defaults = {
				APIUser: GBPServiceUrl + "/user",
				APILogin: GBPServiceUrl + "/user/login",
				APILogout: GBPServiceUrl + "/user/logout",
				APIRegister: GBPServiceUrl + "/user",
				TemplateUserDetails: "templates/gbp_login_userdetails.html",
				TemplateLogoutButton: "templates/gbp_logout.html",
				Container: "#actions"
			}
			
			this.Options = jQuery.extend({}, this.Defaults, options);
		},
		
		/**
		 * Log in a user with the specified credentials
		 * @param {Object} username
		 * @param {Object} password
		 */
		Login: function(credentials, callback) {
			var url = this.Options.APILogin;
			var data = credentials;

			var response = new APIHandler({
				Url: url,
				Method: APIMETHODS.POST,
				Data: JSON.stringify(data),
				Async: false,
				Callback: callback
			}).Response;

			if (response.Result && response.Value.Result) {
				var user = response.Value.User;
				Notify("You are now logged in <strong>" + user.Firstname + "</strong>", "User Account");
			}

			return response;
		},

		/**
		 * Logs out the currently logged in user
		 */
		Logout: function(callback) {
			var url = this.Options.APILogout;
			
			var response = new APIHandler({
				Url: url,
				Method: APIMETHODS.GET,
				Async: false,
				Callback: callback
			}).Response;
			
			if (response.Result) {
				location.reload();
			}

			return response;

		},
		
		/**
		 * Register a new user with the specified registration details
		 * @param {Object} registration
		 * @param {Object} callback
		 */
		Register: function(registration, callback) {
			
			var url = this.Options.APIRegister;
			var data = registration;
			
			var response = new APIHandler({
				Url: url,
				Method: APIMETHODS.POST,
				Data: JSON.stringify(data),
				Async: false,
				Callback: callback
			}).Response;
			
			
			
			return response;
			
		},
		
		/**
		 * Checks with the backend to find out if a user is logged in
		 * @param {Object} callback
		 */
		GetCurrentUser: function(callback) {
			var url = this.Options.APIUser;
			var response = new APIHandler({
				Url: url,
				Method: APIMETHODS.GET,
				Async: false,
				Callback: callback
			}).Response;
			
			if (response.Result) {
				user = response.Value.User;
				this.SetUser(user);

				return response.Value;
			} else {
				ShowError(response.Message);
				return null;
			}
		},
		
		/**
		 * Set User 
		 */
		SetUser: function(user) {
			var object = this;
			if (user != null) {
				//Hide login/registration button
				this.loginForm.Hide();
				this.registrationForm.Hide();
				
				
				//Show user details
				var template = LoadTemplate(this.Options.TemplateUserDetails);
				
				var item = template;
				var fullname = user.Firstname + " " + user.Lastname;
				item = item.replace("%FULLNAME%", fullname);
				item = jQuery(item);
				
				jQuery(this.Options.Container).append(item);
				
				//Show Logout Button
				var logoutTemplate = LoadTemplate(this.Options.TemplateLogoutButton);
				item = logoutTemplate;
				item = jQuery(item);
				// Set logout action
				item.click(function() {
					var response = object.Logout();
					if (response.Result) {
						Notify("Good bye. You are now logged out", "User Account");
						object.SetUser(null);
						
					}
					return false;
					
				});
				
				jQuery(this.Options.Container).append(item);
				
				
			} else {
				this.ShowAuthOptions();
			}
		},

		ShowAuthOptions: function() {
			this.loginForm.Show();
			this.registrationForm.Show();
			
			//Remove User Details
			jQuery(this.Options.Container).find("#userDetails").remove();
			jQuery(this.Options.Container).find("#userLogout").remove();
			
			//Clear Login
			jQuery(this.Options.Container).find("#loginPassword").val(""); 
		}
	})

	
	/**
	 * Registration Details to send to EndPoint
	 */
	var RegistrationDetails = base2.Base.extend({
		constructor: function() {
			
		},
		Firstname: null,
		Lastname: null,
		Email: "chrisb@deepend.com.au",
		Password:"TestPassword",
		Username:"cbellman",
		Country:"Australia",
		City:"Sydney",
		Phone:"912345678",
		DateOfBirth:"",
		TermsAgreement: false,
		SpecialOffers:false,
		
		IsValid: function() {
			if (this.Firstname == null || this.Firstname == "") return false;
			if (this.Lastname == null || this.Lastname == "") return false;
			if (this.Email == null || this.Lastname == "") return false;
			if (this.Password == null || this.Password == "") return false;
			if (this.Country == null || this.Country == "") return false;
			if (this.City == null || this.City == "") return false;
			if (this.Phone == null || this.Phone == "") return false;
			//if (this.DateOfBirth == null || this.DateOfBirth == "") return false;
			
			return true;
		}
		
	});
	
	
	/**
	 * Registration Object
	 * @param {Object} options
	 */
	var Registration = base2.Base.extend({
		constructor: function(options) {
			this.SetOptions(options);
		},
		
		SetOptions: function(options) {
			this.Defaults = {
				APIRegister: GBPServiceUrl + "/user"
			}

			this.Options = jQuery.extend({}, this.Defaults, options);
		},

		Details: new RegistrationDetails(),


		Register: function() {
			var url = this.Options.APIRegister;

			var data = this.Details;

			var response = new APIHandler({
				Url: url,
				Data: data
			})
		}

	});
	
	
	var RegistrationForm = Popup.extend({
		constructor: function(options) {
			this.SetOptions(options);
			this.SetEvents();
		},
		
		SetOptions: function(options) {
			this.Defaults = {
				APIRegister: GBPServiceUrl + "/user",
				Channel: GBPChannel.PureTasmania,
				Container: "#actions",
				ElementID: "btnRegistration",
				Template: "templates/gbp_registration.html"
			}
			
			this.Options = jQuery.extend({}, this.Defaults, options);
		},
		
		SetEvents: function() {
			var object = this;
			jQuery("#" + this.Options.ElementID + " .btn1 a").live("click", function() {
				
				var anchor = jQuery(this);
				var item = anchor.parent().parent();
				var p = item.find('.popup');
				/*
				if (!p.hasClass('popup-active'));
				{
					item.find('.popup').removeClass('popup-active').end().find('.btn1 a').removeClass('active');
				}*/
				//p.toggleClass('popup-active');
				anchor.toggleClass('active');
				
				if (anchor.hasClass('active')) {
					p.addClass('popup-active').hide();
					p.stop(true,false).css({display: "block", opacity: 0}).animate({opacity: 1});
				} else {
					p.stop(true,false).fadeOut();
				}
				return false;
			});
			
			// Submit the registration
			jQuery("#" + this.Options.ElementID + " .btn2 a").live("click", function() {
				object.Submit();
				
				return false;
			});
		
			
		},
		
		SetDatePickerEvent: function() {
				
			// Datepicker
			jQuery("#" + this.Options.ElementID + " .datepicker").each(function(){
				var a = jQuery('.trigger', this);
				var today = Date.today();
				
				jQuery(this).append('<div class="datepopup"></div>');
				jQuery('.datepopup', this).datepicker({
					changeMonth: false,
					changeYear: false,
					yearRange: '-70:0',
					//defaultDate: today.toString('yy MM dd'),
					inline: true,
					dateFormat: 'dd MM yy',
					onSelect: function(date, inst){
						a.find('span').html(date.toUpperCase()).end().
							parents('.datepicker').
								removeClass('datepicker-active').
								find('input[type="hidden"]').val(date).end();
					}
				});
				jQuery('.trigger', this).click(function(){
					jQuery(this.parentNode).toggleClass('datepicker-active');
					return false;
				});
			});
		},			
		
		Submit: function() {
			var element = jQuery("#" + this.Options.ElementID);

			if (this.ValidForm()) {
				
				var registration = new RegistrationDetails();
				registration.Firstname = element.find("#registrationFirstname").val();
				registration.Lastname = element.find("#registrationLastname").val(); 
				registration.Email  = element.find("#registrationEmail").val();
				registration.Username = registration.Email;
				registration.Password = element.find("#registrationPassword").val();
				registration.Country = element.find("#registrationCountry").val();
				registration.City = element.find("#registrationCity").val();
				registration.Phone = element.find("#registrationPhone").val();
				registration.SpecialOffers = element.find("#registrationUpdates").attr("checked");
				registration.TermsAgreement = element.find("#registrationAgreeTerms").attr("checked");
				
				/*
				var day = element.find("#registrationDOBDay").val();
				var month = element.find("#registrationDOBMonth").val();
				var year = element.find("#registrationDOBYear").val();
				registration.DateOfBirth = Date.parse(year + "/" + month + "/" + day).toString("yyyy/MM/dd");
				registration.DateOfBirth = Date.parse(jQuery("#date1 span", this.Popup).html());
				*/
				
				
				if (registration.IsValid()) {
					userManager.Register(registration);
				}
			}		
		},
		
		
		ValidForm: function() {
			return true;
		}
	});
	
	
	
	/**
	 * Item shown when a user logs in
	 * @param {Object} options
	 */
	var UserDetails = base2.Base.extend({
		constructor: function(options) {
			this.SetOptions(options);
		},

		SetOptions: function(options) {
			this.Defaults = {
				
			};
			
			this.Options = jQuery.extend({}, this.Defaults, options);
			
			
			
		}
	});
	
	
	
	/**
	 * Button Popup.
	 * @param {Object} options
	 */
	var ButtonPopup = base2.Base.extend({
		constructor: function(options) {
			this.SetOptions(options);
			this.SetEvents();			
		},
		
		SetOptions: function(options) {
			
		},
		
		SetEvents: function() {
		}
		
	})
	

