/*jslint white:false plusplus:false browser:true nomen:false */
/*globals $, window, console, jwplayer, FB, lang, _gaq, JbUI */
/*globals TAG, GET, POST, Storage, URLMaker, log */

var jawbone = {
	contentURL: null,
	init: function() {
		this.util.init();
		this.google.init();
		this.facebook.init();
		this.productShelf.init();
		this.footer.init();
	},
	runtimeInit: function() {
		this.util.setBrowserClass();
	},
	setConstants: function(initObj) {
		this.contentURL = initObj.contentURL;
	},
	util: {
		isBadIE: false,
		init: function() {
			this.setNav();
			this.browserUpgradeCheck();
		},
		runtimeInit: function() {
			this.setBrowserClass();
		},
		setBrowserClass: function() {
			if ($.browser.msie) {
				$('html').addClass('ie' + parseInt($.browser.version,10));
			}
			if ($.browser.webkit && navigator.userAgent.indexOf("Mobile") !== -1) {
				$.browser.mobile = true;
				$('html').addClass('mobile');
			}
		},
		setNav: function() {
			var nav, sectionName, elementName, target, hash;
			nav = $('#main-header');
			switch(window.location.pathname.split("/")[1]) {
				case "headsets":
					nav.find(".headsets").addClass("active");
				break;
				case "speakers":
					nav.find(".speakers").addClass("active");
				break;
				case "thoughts":
					nav.find(".thoughts").addClass("active");
				break;
				case "support":
				case "knowledgebase":
					nav.find(".support").addClass("active");
				break;
				case "apps":
				case "companion":
					nav.find(".apps").addClass("active");
				break;
			}
			if (!window.location.pathname.split("/")[1]) {
				nav.find(".home").addClass("active");
			}
			sectionName = window.location.pathname.split("/")[3];
			elementName = "#product-" + sectionName;
			target = $(elementName);
			if (target.length !== 0) {
				target.find('.product-nav').find('.' + sectionName).addClass('active');
				return;
			}
			target = $('#product-content');
			if (target.length !== 0) {
				hash = window.location.hash.split("#")[1];
				if (hash) {
					$('#' + hash).find('.product-nav').find('.main').addClass("active");
				} else if (window.location.pathname.split("/")[1] !== 'headsets'){
					target.find('.product-nav').find('.main').addClass('active');
				}
			}
		},
		browserUpgradeCheck: function() {
			var browserVersion = parseInt($.browser.version,10), browserData = {}, firefox = null, firefoxVersion = null;
			if ($.browser.mozilla) {
				firefox = navigator.userAgent.split(" ")[navigator.userAgent.split(" ").length-1].split("/");
				if (firefox[0] === 'Firefox') {
					firefoxVersion = parseInt(firefox[1],10);
				}
			}
			if ($.browser.msie && browserVersion < 8) {
				browserData.browserString = "Microsoft Internet Explorer " + $.browser.version;
				browserData.upgradeURL = "http://windows.microsoft.com/en-US/internet-explorer/products/ie/home";
				this.browserUpgradeOutput(browserData);
			}
			if (firefoxVersion && firefoxVersion < 4) {
				browserData.browserString = "Mozilla Firefox " + firefox[1];
				browserData.upgradeURL = "http://www.mozilla.com/en-US/firefox/new/";
				this.browserUpgradeOutput(browserData);
			}
		},
		browserUpgradeOutput: function(obj) {
			var upgradeElement = new $.element('div',{id:"upgrade-browser"}, lang('www_js.browser_upgrade_copy',obj.browserString, obj.upgradeURL));
			$('#main-header').after(upgradeElement);
			$('#upgrade-browser').fadeIn({duration: 500});
		},
		isValidEmail: function(email) {
			var reg = /^([A-Za-z0-9_\-\.\+])+\@([A-Za-z0-9_\-\.\+])+\.([A-Za-z]{2,4})$/;
			return reg.test(email);
		},
		clone: function(obj) {
			// Handle the 3 simple types, and null or undefined
			if (null === obj || "object" !== typeof obj) { return obj; }
			var copy, len, i, attr;
			// Handle Date
			if (obj instanceof Date) {
				copy = new Date();
				copy.setTime(obj.getTime());
				return copy;
			}
			// Handle Array
			if (obj instanceof Array) {
				copy = [];
				len = obj.length;
				for (i = 0; i < len; ++i) {
					copy[i] = this.clone(obj[i]);
				}
				return copy;
			}
			// Handle Object
			if (obj instanceof Object) {
				copy = {};
				for (attr in obj) {
					if (obj.hasOwnProperty(attr)) { copy[attr] = this.clone(obj[attr]); }
				}
				return copy;
			}
			throw new Error("Unable to copy obj! Its type isn't supported.");
		}
	},
	productShelf: {
		allProducts: null,
		timeout: null,
		init: function() {
			this.setEventListeners();
			var $this = this;
		},
		setEventListeners: function() {
			var shelf, $this, arrows, viewAll, eventTrackingObj;
			shelf = $('#product-shelf');
			if (shelf.length === 0) { return false; }
			$this = this;
			// shelf items
			shelf.find('.shelf-item').each(function(){
				var el = this;
				$(this).mouseenter(function(){
					$this.timeout = window.setTimeout(function(){
						$this.shelfMenuHandler(el,'over');
					},300);
				});
				$(this).mouseleave(function() {
					if ($this.timeout) {
						clearTimeout($this.timeout);
						delete $this.timeout;
					}
					$this.shelfMenuHandler(el,'out');
				});
			});
			// prev-next arrows
			arrows = shelf.find(".shelf-arrow");
			arrows.each(function(){
				if ($(this).hasClass('next')) {
					$(this).click(function(){
						$this.shelfAnimate(this,'next');
					});
				} else {
					$(this).click(function(){
						$this.shelfAnimate(this,'prev');
					});
				}
			});
			// view all products button
			viewAll = shelf.find(".all-products");
			viewAll.click(function(){
				$this.viewAllHandler();
			});
		},
		shelfMenuHandler: function(el,mode) {
			var tools, shelfImage, itemOffset, leftTarget;
			tools = $(el).find('.tools');
			shelfImage = $(el).find('.shelf-image');
			itemOffset = $(el).attr("data-offset");
			switch (mode) {
				case "over":
					$(el).addClass("top");
					if (itemOffset) {
						tools.css("left",itemOffset + "px");
					} else {
						tools.css("left","auto");
					}
					tools.fadeIn();
					shelfImage.animate({
						"width":"170",
						"bottom": "-10",
						"left": "0"
					},function(){
						tools.show();
						if (itemOffset) {
							tools.css("left",itemOffset + "px");
						} else {
							tools.css("left","auto");
						}
					});
				break;
				case "out":
					$(el).removeClass("top");
					tools.fadeOut(function(){
						tools.css("left","-999em");
					});
					leftTarget = 20;
					if (itemOffset) {
						leftTarget = "auto";
					}
					shelfImage.animate({
						"width":"120",
						"bottom": "0",
						"left": leftTarget
					});
				break;
				
			}
		},
		shelfAnimate: function(el,mode) {
			var $this, shelf, icon1, icon2;
			$this = this;
			shelf = $('#product-shelf');
			icon1 = shelf.find(".icon");
			icon2 = shelf.find(".icon2");
			shelf.addClass("animate");
			$(el).css("visibility","hidden");
			switch (mode) {
				case "next":
					icon1.css("position","absolute");
					icon2.css("position","absolute");
					icon2.css("width", shelf.width());
					icon2.css("left",icon1.width());
					icon2.show();
					icon1.animate({
						"left": -shelf.width()
					},1000);
					icon2.animate(
						{
							"left": 0
						},
						1000,
						function(){
							icon1.hide();
							$(el).css("visibility","visible");
							shelf.removeClass("animate");
						}
					);
				break;
				case "prev":
					icon1.css("position","absolute");
					icon2.css("position","absolute");
					icon1.show();
					icon1.animate({
						"left": 0
					},1000);
					icon2.animate({
						"left": icon1.width()
					},1000,function(){
						icon2.hide();
						$(el).css("visibility","visible");
						shelf.removeClass("animate");
					});
				break;
			}
		},
		viewAllHandler: function() {
			var $this = this;
			if (!$this.allProducts) {
				$.ajax({
					url: "/www/ajax/all-products",
					success: function(xhr) {
						$this.allProducts = xhr;
						$this.viewAllSlider(xhr);
					}
				});
			} else {
				return false;
			}
		},
		viewAllSlider: function(xhr) {
			var $this, shelf, shelf1, shelf2;
			$this = this;
			shelf = $('#product-shelf');
			shelf1 = shelf.find('.shelf-carousel');
			shelf.addClass('animate');
			shelf.append(xhr);
			shelf2 = shelf.find(".shelf-carousel.main");
			shelf2.css("position","absolute");
			shelf2.css("left", shelf.width());
			shelf1.css("position","absolute");
			shelf1.animate({
				left: -shelf.width()
			},function(){
				shelf1.hide();
			});
			shelf2.animate({
				left: 0
			},function(){
				shelf.removeClass("animate");
				$this.setEventListeners();
			});
			// analytics
			jawbone.google.setShelfListeners();
		}
	},
	footer: {
		init: function() {
			this.setListeners();
			this.setFooterDate();
		},
		setListeners: function() {
			var $this = this;
			$('#locale-switcher').click(function(e){
				e.preventDefault();
				$this.localeSwitcher(this);
			});
		},
		localeSwitcher: function(el) {
			window.location.href = $(el).attr('href') + "?service=www&redirect=" + window.location.href.split("?")[0];
		},
		setFooterDate: function() {
			var date = new Date;
			date = date.getFullYear();
			$("#footer-date").html(date);
		}
	},
	facebook: {
		init: function() {
			this.setLikeButton();
		},
		setLikeButton: function() {
			var $this, fbScript;
			if ($('#social-media').length === 0) { return false; }
			$this = this;
			window.fbAsyncInit = function() {
				FB.init({
					appId: '189126087764607',
					status: true,
					cookie: true,
					xfbml: true
				});
				$this.setFrameListener();
			};
			fbScript = new $.element('script',{
				type: "text/javascript",
				src: document.location.protocol + '//connect.facebook.net/en_US/all.js',
				async: true
			});
			$('#fb-root').append(fbScript);
		},
		setFrameListener: function() {
			var $this, target, lag;
			if ($.browser.msie && parseInt($.browser.version,0) === 8) {
				$('#social-media').fadeIn();
			}
			target = $('#social-media').find('.facebook').find('iframe');
			if (target.length === 0) {
				$this = this;
				lag = window.setTimeout(function() {
					$this.setFrameListener();
				}, 100);
				return;
			}
			target.load(function(e){
				$('#social-media').fadeIn();
			});
		},
		test: function() {
			(function(d, s, id) {
				var js, fjs = d.getElementsByTagName(s)[0];
				if (d.getElementById(id)) {return;}
				js = d.createElement(s); js.id = id;
				js.src = "//connect.facebook.net/en_US/all.js#appId=241555349197329&xfbml=1";
				fjs.parentNode.insertBefore(js, fjs);
			}(document, 'script', 'facebook-jssdk'));
		}
	},
	google: {
		init: function() {
			this.setEventListeners();
		},
		setEventListeners: function() {
			this.setMainNavListeners();
			this.setShelfListeners();
			// this.setHomePageSliderListeners();
			// this.setEmailOptInListeners();
			// this.setFooterListeners();
		},
		setMainNavListeners: function() {
			var $this = this;
			$('#main-header').find('a').click(function(e) {
				e.preventDefault();
				var eventTrackingObj = {
					category: "Main Nav",
					action: $(this).attr('data-ga'),
					label: "Click",
					el: this
				};
				$this.eventTracking.trackSingle(eventTrackingObj);
			});
		},
		setShelfListeners: function() {
			var $this, eventTrackingObj, shelf;
			$this = this;
			eventTrackingObj = {};
			eventTrackingObj.category = "Product Shelf";
			shelf = $('#product-shelf').find('.shelf-carousel');
			if (shelf.hasClass('main') || (shelf.length > 1 && $(shelf[1]).hasClass('main'))) {
				eventTrackingObj.action = "Main Shelf";
			}
			if (shelf.length === 1 && shelf.hasClass('jambox')) {
				eventTrackingObj.action = "Speaker Shelf";
			}
			if (shelf.length === 1 && shelf.hasClass('headsets')) {
				eventTrackingObj.action = "Headset Shelf";
			}
			if (shelf.length === 1 && shelf.hasClass('era')) {
				eventTrackingObj.action = "Era Shelf";
			}
			if (shelf.length === 1 && shelf.hasClass('iconhd')) {
				eventTrackingObj.action = "Icon HD Shelf";
			}
			if (shelf.length === 2 && shelf.hasClass('icon')) {
				eventTrackingObj.action = "Icon Shelf";
			}
			shelf.find("a").click(function(e) {
				e.preventDefault();
				var localTrackingObj = jawbone.util.clone(eventTrackingObj);
				localTrackingObj.el = this;
				localTrackingObj.label = $(this).attr("data-ga");
				$this.eventTracking.trackSingle(localTrackingObj);
			});
			$('#product-shelf').find('.all-products').click(function(){
				var localTrackingObj = jawbone.util.clone(eventTrackingObj);
				localTrackingObj.label = "All Products";
				$this.eventTracking.trackSingle(localTrackingObj);
			});
		},
		setHomePageSliderListeners: function() {
			var $this = this;
			$('#slideDiv').find('a').click(function(e) {
				e.preventDefault();
				var eventTrackingObj = {
					category: "Homepage Carousel",
					action: $(this).attr("rel").split(": ")[0],
					label: $(this).attr("rel").split(": ")[1],
					el: this
				};
				$this.eventTracking.trackSingle(eventTrackingObj);
			});
		},
		setFooterListeners: function() {
			// var eventObj = {};
			// twttr.events.bind('follow', function(){
			//	// eventObj = {
			//	//	category: "Twitter Intent",
			//	//	action: "Follow",
			//	//	label: window.location.pathname
			//	// };
			//	// console.log(eventObj);
			// });
		},
		setEmailOptInListeners: function() {
			var $this = this;
			$('#opt-in-form').submit(function(e){
				e.preventDefault();
				var eventTrackingObj = {
					category: "Email Opt-In",
					action: "Show Form",
					label: ""
				};
				$this.eventTracking.trackSingle(eventTrackingObj);
			});
			$('body').delegate(
				"#optinForm",
				"submit", {
					category: "Email Opt-In",
					action: "Sumbit Form",
					label: ""
				},
				$this.eventTracking.trackSingle
			);
		},
		eventTracking: {
			trackSingle: function (obj) {
				var data, linkLagger;
				data = null;
				if (obj.data) {
					data = obj.data;
				} else {
					data = obj;
				}
				obj.value = obj.value || 0;
				_gaq.push(['_trackEvent', obj.category, obj.action,obj.label, obj.value]);
				if (obj.el) {
					linkLagger = window.setTimeout(function() {
						window.location.href = obj.el.href;
					}, 100);
				}
			},
			trackMulti: function (objArray) {
				var $this = this;
				$(objArray).each(function(index) {
					this.trackSingle(objArray[index]);
				});
			}
		}
	},

	// new
	video: {
		youtube: function(options) {
			if (!options) { options = {}; }
			if (!options.src) { return false; }
			var iframe = new $.element('iframe', {
				src: options.src + '?wmode=transparent',
				width: options.width,
				height: options.height,
				frameborder: 0
			});
			return iframe;
		},
		play: function(options) {
			jwplayer(options.target).setup({
				file: options.path,
				width: options.width,
				height: options.height,
				controlbar: 'bottom',
				autostart: 'true',
				wmode: 'transparent',
				dock: true,
				plugins:
					'/swf/jwplayer/plugins/sharingdl/sharingdl.swf',
					'sharingdl.link': options.path,
					'sharingdl.code': options.path,
					'sharingdl.download': options.path,
					'sharingdl.title': '',
				flashplayer: "/swf/jwplayer/player.swf",
				skin: '/swf/jwplayer/skins/jawbone-skin/jawbone-skin.xml',
				events: {
					onComplete: function() {
						// var eventTrackingObj = {
						//	category: "Video",
						//	action: $this.data[vidId].trackingId,
						//	label: "Complete"
						// };
						// jawbone.google.eventTracking.trackSingle(eventTrackingObj);
					},
					onPause: function() {
						// var eventTrackingObj = {
						//	category: "Video",
						//	action: $this.data[vidId].trackingId,
						//	label: "Pause"
						// };
						// jawbone.google.eventTracking.trackSingle(eventTrackingObj);
					},
					onPlay: function() {
						// var eventTrackingObj = {
						//	category: "Video",
						//	action: $this.data[vidId].trackingId,
						//	label: "Play"
						// };
						// jawbone.google.eventTracking.trackSingle(eventTrackingObj);
					}
				}
			});
		}
	}
};

jawbone.user = {
	vitals: null,
	loc: null,
	defaultImage: '/images/user/default-user.png',
	loginLightbox: null,
	loginErrorBox: null,
	passwordLightbox: null,
	passwordErrorBox: null,
	createAccountLightbox: null,
	createErrorBox: null,
	createTestSet: null,
	createErrorKeys: {},
	init: function() {
		this.setLoginLinks();
	},
	runtimeInit: function() {
		this.checkUser();
	},

	// checks/set top nav user box
	checkUser: function() {
		var $this, localVitals;
		$this = this;
		if (!JbUI.Utility.cookie('user')) {
			Storage.removeAll();
			$('#jawbone-user').css("visibility","visible");
			return false;
		}
		localVitals = Storage.get('jawbone-user');
		if (!localVitals || Storage.get("jawbone-user-token") !== JbUI.Utility.cookie("user")) {
			GET('/user/signin/check', {}, function(response) {
				if (response.rc === 0) {
					$this.vitals = response.data;
					$this.loc = response.loc[1];
					Storage.set('jawbone-user', JSON.stringify(response.data));
					Storage.set('jawbone-user-loc', response.loc[0]);
					Storage.set('jawbone-user-token', JbUI.Utility.cookie('user'));
					$this.setUser();
				} else if (response.rc === 1) {
					$('#jawbone-user').css("visibility","visible");
				}
			});
		} else {
			$this.vitals = JSON.parse(Storage.get('jawbone-user'));
			$this.loc = Storage.get('jawbone-user-loc');
			$this.setUser();
		}
		return true;
	},
	setUser: function() {
		if (!this.vitals) { return false;}
		var userInfo  = TAG('a',{'href':'/user/settings','class':'user-link', 'data-ga':'User Name'}, this.vitals.name);
		userInfo += TAG('ul',{'class':'user-tools'},
			TAG('li',{'class':'settings'},
				TAG('a',{'href':'/user/settings', 'data-ga':'Account Settings'}, lang('www_js.user_login_settings'))
			) +
			// TAG('li', {'class':'devices'},
			//	TAG('a', {'href':'http://mytalk.jawbone.com/jb2/mytalk/?wicket:bookmarkablePage=:com.jawbone.mytalk.account.MyAccountDevices', 'data-ga': 'Devices'}, lang('www_js.user_login_devices'))
			// ) +
			TAG('li',{'class':'sign-out'},
				TAG('a',{'href':'#','onclick':'return jawbone.user.logOut();', 'data-ga': 'Log Out'}, lang('www_js.user_login_sign_out'))
			)
		);
		$('#jawbone-user').html(userInfo);
		$('#jawbone-user').css("visibility","visible");
	},
	resetUser: function(arg) {
		Storage.removeAll();
		this.checkUser();
	},
	logOut: function() {
		var $this = this;
		GET('/user/signin/logout', {}, function() {
			delete $this.vitals;
			delete $this.loc;
			Storage.removeAll();
			var lag = window.setTimeout(function() {
				window.location.href = "/";
			},0);
		});
		return false;
	},

	// login lightbox/form
	setLoginLinks: function() {
		var $this = this;
		$('#log-in-link').click(function(e){
			e.preventDefault();
			$this.setLoginLightbox();
		});
		$("#create-account-link").click(function(e){
			e.preventDefault();
			$this.setCreateLightbox();
		});
	},
	setLoginLightbox: function(email) {
		var $this = this;
		if (!$this.loginLightbox) {
				this.loginLightbox = new $.lightbox({
					height: 300,
					width: 500
				});
				$this.doAnalytics('login','Launch Lightbox');
		} else {
			$this.loginLightbox.open();
			if (email) {
				$('#jawbone-login-email').val(email);
				$('#jawbone-login-email').blur();
				$('#jawbone-login-password').focus();
			}
			return;
		}
		$.ajax({
			url: '/www/ajax/login-form',
			dataType: 'html',
			success: function(response) {
				$this.loginLightbox.update(response);
				$this.setLoginListeners();
				if (email) {
					$('#jawbone-login-email').val(email);
					$('#jawbone-login-email').blur();
					$('#jawbone-login-password').focus();
				}
			}
		});
	},
	setLoginListeners: function() {
		var $this = this;
		$("#jawbone-login-form").submit(function(e){
			e.preventDefault();
			$this.validateLoginForm(this);
		});
		$("#jawbone-login-email,#jawbone-login-password").focus(function(e){
			$this.loginFocusBlur(e);
		});
		$("#jawbone-login-email,#jawbone-login-password").blur(function(e){
			$this.loginFocusBlur(e);
		});
		$("#jawbone-forgot-password").click(function(e){
			e.preventDefault();
			$this.setPasswordLightbox();
		});
	},
	validateLoginForm: function(el) {
		var $this, errorString, errorItems, testGroup, errorGroup, inputType;
		$this = this;
		errorString = '';
		errorItems = '';
		testGroup = $('#jawbone-login-email,#jawbone-login-password');
		errorGroup = [];
		inputType = '';
		testGroup.each(function(){
			if (!$this.testValid(this)) {
				errorGroup.push(this);
			}
		});
		
		if (errorGroup.length === 0) {
			if ($this.loginErrorBox) {
				$this.loginErrorBox.toggleError();
				$this.loginErrorBox.update(lang('www_js.user_validation_logging_in'));
				$this.loginLightbox.updateSize();
			}
			POST(
				$(el).attr('action'),
				JbUI.Utility.serializeForm(el),
				function(response) {
					$this.postLoginHandler(response);
				}
			);
		} else {
			$(errorGroup).each(function(){
				$(this).blur();
				inputType = $(this).data().inputType;
				// TODO: refactor this to use the same system that account creation does
				switch (inputType) {
					case "email":
						errorItems +=  TAG('li',{}, lang('www_js.user_validation_email'));
					break;
					case "password":
						errorItems +=  TAG('li',{}, lang('www_js.user_validation_password'));
					break;
				}
			});
			errorString = TAG('ol',{'class':'message-list'}, errorItems);
			$this.loginDisplayErrors(errorString);
			$this.doAnalytics('login','Validation Error');
		}
	},
	loginDisplayErrors: function(str) {
		var $this = this;
		if ($this.loginErrorBox) {
			$this.loginErrorBox.update(str);
			$this.loginLightbox.updateSize();
		} else {
			$this.loginErrorBox = new $.pagedialog({
				target: $('#jawbone-login-email').parent('fieldset'),
				error: true,
				message: str,
				showCloseButton: false
			});
			if (this.loginLightbox) {
				$this.loginLightbox.updateSize();
			}
		}
	},
	postLoginHandler: function(response) {
		var $this, responseBody, errorString, lag, goHome, i, len, urlsToAvoid;
		$this = this;
		// want to not have to parse this if possible
		responseBody = JSON.parse(response.body);
		errorString = '';
		urlsToAvoid = ["/user/reset?reset_token"];
		if (responseBody.rc === 0) {
			$this.doAnalytics('login','Success');
			len = urlsToAvoid.length;
			for (i = 0; i < len; i++) {
				if (window.location.href.indexOf(urlsToAvoid[i]) !== -1) {
					goHome = true;
				}
			}
			lag = window.setTimeout(function() {
				if (goHome) {
					window.location.href = "/";
				} else {
					window.location.reload();
				}
			},100);
		} else {
			errorString += TAG('ol',{'class':'message-list'},
				TAG('li', {}, responseBody.error.msg)
			);
			$this.loginDisplayErrors(errorString);
		}
	},

	// retrieve password lightbox/form
	setPasswordLightbox: function() {
		var $this = this;
		if ($this.passwordLightbox) {
			$this.passwordLightbox.open();
			return false;
		} else {
			$this.passwordLightbox = new $.lightbox({
				height: 300,
				width: 600
			});
			$this.doAnalytics('forgot-password','Launch Lightbox');
		}
		$.ajax({
			url: "/www/ajax/get-password-form",
			success: function(response) {
				$this.passwordLightbox.update(response);
				$this.setForgotPasswordListeners();
			}
		});
	},
	setForgotPasswordListeners: function(iframe) {
		var $this = this;
		$('#jawbone-password-form').submit(function(e){
			e.preventDefault();
			$this.validatePasswordForm(this);
		});
		$('#jawbone-password-email').focus(function(e){
			$this.loginFocusBlur(e);
		});
		$('#jawbone-password-email').blur(function(e){
			$this.loginFocusBlur(e);
		});
		if (!iframe) {
			$('#jawbone-password-retry').click(function(e){
				e.preventDefault();
				$this.passwordResetRetry();
			});
		}
	},
	validatePasswordForm: function(el) {
		var $this, passwordEmail;
		$this = this;
		passwordEmail = $('#jawbone-password-email');
		passwordEmail.blur();
		if (passwordEmail.parent("fieldset").hasClass("error")) {
			$this.passwordDisplayErrors(lang(passwordEmail.data().errorkey));
			return false;
		}		
		POST(
			$(el).attr("action"),
			JbUI.Utility.serializeForm(el),
			function(response) {
				$this.postPasswordResetHandler(response);
			},
			function(response) {
				$this.postPasswordResetHandler(response);
			}
		);
	},
	postPasswordResetHandler: function(response) {
		var $this = this;
		if (response.rc === 0) {
			$('#jawbone-password-sent-to').html($('#jawbone-password-email').val());
			$("#jawbone-password-form").fadeOut(function(){
				$("#jawbone-password-conf").fadeIn();
			});
			$this.doAnalytics('forgot-password','Success');
		} else if (response.rc === 1) {
			$this.passwordDisplayErrors(lang('www_js.user_login_email_notfound'));
			$('#jawbone-password-email').parent('fieldset').removeClass('valid').addClass('error');
			$this.doAnalytics('forgot-password','Not Found');
		}
	},
	passwordResetRetry: function() {
		var $this = this;
		$this.passwordLightbox.destroy();
		$this.passwordLightbox = null;
		$this.setPasswordLightbox();
	},
	passwordDisplayErrors: function(str) {
		var $this = this;
		if ($this.passwordErrorBox) {
			$this.passwordErrorBox.update(str);
			$this.passwordLightbox.updateSize();
		} else {
			$this.passwordErrorBox = new $.pagedialog({
				target: $('#jawbone-password-email').parent('fieldset'),
				error: true,
				message: str,
				showCloseButton: false
			});
			if ($this.loginLightbox) {
				$this.loginLightbox.updateSize();
			}
		}
		$this.doAnalytics('forgot-password','Validation Error');
	},
	
	// create account lightbox/form
	setCreateLightbox: function() {
		var $this = this;
		if ($this.createAccountLightbox) {
			$this.createAccountLightbox.open();
			return false;
		} else {
			$this.createAccountLightbox = new $.lightbox({
				// width: 600,
				width: 450,
				height: 500
			});
			$this.doAnalytics('create','Launch Lightbox');
		}
		$.ajax({
			url: "/www/ajax/get-account-form",
			success: function(response) {
				$this.createAccountLightbox.update(response);
				$this.createAccountLightbox.updateSize();
				$this.setCreateListeners();
			}
		});
	},
	setCreateListeners: function() {
		var $this = this;
		$this.createTestSet = $("#jawbone-create-account-form").find('input[type="text"],input[type="password"]');
		$this.createTestSet.each(function(){
			$(this).focus(function(e){
				$this.loginFocusBlur(e,false);
			});
			$(this).blur(function(e){
				$this.loginFocusBlur(e,false);
				$this.createSpecialValidation($(this));
			});
		});
		$("#jawbone-create-account-form").submit(function(e){
			e.preventDefault();
			$this.validateCreateForm(this);
		});
	},
	createSpecialValidation: function(el) {
		var $this = this;
		
		// collect error keys for invalid fields
		if (el.parent('fieldset').hasClass('error')) {
			$this.createErrorKeys[el.attr("id")] = el.data().errorkey;
		} else if (el.parent('fieldset').hasClass('valid')) {
			delete $this.createErrorKeys[el.attr("id")];
		}
		
		switch (el.attr("id")) {
			case "new-account-confirm-email":
				if (el.val() !== $('#new-account-email').val()) {
					el.parent('fieldset').removeClass('valid');
					el.parent('fieldset').addClass('error');
					if (!$this.testValid(el[0])) {
						$this.createErrorKeys[el.attr("id")] = el.data().errorkey;
					} else {
						$this.createErrorKeys[el.attr("id")] = "www_js.user_validation_mismatched_email";
					}
				}
			break;
			case "new-account-confirm-password":
				if (el.val() !== $('#new-account-password').val()) {
					el.parent('fieldset').removeClass('valid');
					el.parent('fieldset').addClass('error');
					if (!$this.testValid(el[0])) {
						$this.createErrorKeys[el.attr("id")] = el.data().errorkey;
					} else {
						$this.createErrorKeys[el.attr("id")] = "www_js.user_validation_mismatched_password";
					}
				}
			break;
		}
		
		$this.createDisplayError();
	},
	createDisplayError: function() {
		var $this, i, isEmpty, errorString, errorItem;
		$this = this;
		isEmpty = JbUI.Utility.isEmptyObject($this.createErrorKeys);
		errorString = '';
		errorItem = '';
		
		// build error string if applicable
		for (i in $this.createErrorKeys) {
			if ($this.createErrorKeys.hasOwnProperty(i)) {
				errorItem += TAG('li', {}, lang($this.createErrorKeys[i]));
			}
		}
		errorString += TAG('ol', {'class':'message-list'}, errorItem);
		
		if ($this.createErrorBox && !isEmpty) {
			$this.createErrorBox.update(errorString,false);
			$this.createErrorBox.setToError();
			$this.createAccountLightbox.updateSize();
		} else if (!$this.createErrorBox && !isEmpty) {
			$this.createErrorBox = new $.pagedialog({
				target: $('#jawbone-create-account-form'),
				message: errorString,
				error: true,
				showCloseButton: false
			});
			$this.createAccountLightbox.updateSize();
		} else if ($this.createErrorBox && isEmpty) {
			$this.createErrorBox.toggleError();
			$this.createErrorBox.update(lang('www_js.user_validation_complete'));
			$this.createAccountLightbox.updateSize();
		}
		
	},
	validateCreateForm: function(el) {
		var $this = this;
		$this.createTestSet.blur();
		if (!JbUI.Utility.isEmptyObject($this.createErrorKeys)) {
			$("#jawbone-create-account-button").attr("disabled", null);
			$this.createErrorBox.setToError();
			$this.createErrorBox.show();
			$this.doAnalytics('create','Validation Error');
			return false;
		} else {
			$("#jawbone-create-account-button").attr("disabled","disabled");
		}
		POST(
			$(el).attr('action'),
			JbUI.Utility.serializeForm(el),
			function(response) {
				$this.createPostHandler(response);
			}
		);
	},
	createPostHandler: function(response) {
		var $this, responseBody, email_address, lag;
		$this = this;
		responseBody = JSON.parse(response.body);
		if (responseBody.rc === 0) {
			email_address = $('#new-account-email').val();
			$('#account-creation-email').html(email_address);
			$('#jawbone-resend-conf-email').click(function(e){
				e.preventDefault();
				$this.resendConfEmail(email_address);
			});
			$('#jawbone-create-account-wrapper').fadeOut(function(){
				$('#jawbone-create-account-confirm').fadeIn(function(){
					$this.createAccountLightbox.width(600);
					$this.createAccountLightbox.updateSize();
				});
			});
			$this.createAccountLightbox.addCloseCallback(function(){
				window.location.reload();
			});
			$this.doAnalytics('create','Success');
		} else {
			$("#jawbone-create-account-button").attr("disabled",null);
			$this.createErrorKeys.create_error = responseBody.error.msg;
			$this.createDisplayError();
			lag = window.setTimeout(function() {
				delete $this.createErrorKeys.create_error;
				$('#email-in-use').click(function(e){
					e.preventDefault();
					$this.setLoginLightbox($('#new-account-email').val());
				});
			},0);
		}
	},

	// user analytics
	doAnalytics: function(type,label) {
		var eventObj = {};
		eventObj.category = "User";
		switch (type) {
			case "create":
				eventObj.action = "Create Account";
				eventObj.label = label;
			break;
			case "login":
				eventObj.action = "Log In";
				eventObj.label = label;
			break;
			case "forgot-password":
				eventObj.action = "Forgot Password";
				eventObj.label = label;
			break;
			
		}
		jawbone.google.eventTracking.trackSingle(eventObj);
	},

	// utility stuff, maybe move later
	loginFocusBlur: function(e,bool) {
		jawbone.user.loginFocusBlur.apply(this, arguments);
	},
	testValid: function(el) {
		el = $(el);
		var inputType = el.data().inputType;
		switch (inputType) {
			case "name":
				if (el.val()) {
					return true;
				}
			break;
			case "email":
				return jawbone.util.isValidEmail(el.val());
			case "password":
				if (el.val() && el.val().length >= 5) {
					return true;
				} else {
					return false;
				}
			break;
		}
	},
	resendConfEmail: function(email) {
		console.log(email);
	},
	
	// old stuff, not sure if we need
	image: function(image,modifier,version) {
		image = image || this.defaultImage;
		if (image.indexOf('http') !== 0) {
			if(image.indexOf("/") !== 0) {
				image = '/' + image;
			}
			if (version) {
				return URLMaker.versioned_url('/mod/' + modifier + image);
			} else {
				return URLMaker.web_url('/mod/' + modifier + image);
			}
		} else {
			return image;
		}
	}
};
jawbone.user.loginFocusBlur =  function(e,bool,parentSelector) {
    var $this, currentTarget, trigger, parent;
    $this = this;
    currentTarget = $(e.currentTarget);
    trigger = $(e.currentTarget);
    parentSelector = JbUI.Utility.isEmptyString(parentSelector) ? "fieldset" : parentSelector;
    parent = trigger.parent(parentSelector);
    log.log(parent);
    switch (e.type) {
        case "focus":
            if (typeof bool === "undefined") {
                trigger.prev('label').hide();
            }
            parent.removeClass("error");
            parent.removeClass("valid");
        break;
        case "blur":
            if (typeof bool === "undefined") {
                if (!currentTarget.val()) {
                    trigger.prev('label').show();
                } else {
                    trigger.prev('label').hide();
                }
            }
            if (this.testValid(currentTarget)) {
                parent.addClass("valid");
            } else {
                parent.addClass("error");
            }
        break;
    }
};

$(document).ready(function() {
	jawbone.init();
	jawbone.user.init();
});

(function(){
	jawbone.runtimeInit();
	jawbone.user.runtimeInit();
}());

