/*
-----------------------------------------------
JWHDesigns
Script: jwhUser
Author: Ben Glassman
Organization: Vermont Design Works
Created: 18 Apr 2011
----------------------------------------------- */

jwhUser = {
	ajaxHandler : '/user-ajax',
	initRegisterFormRun : false,
	initLoginFormRun : false,
	favoriteAdded : false,
	loggedIn : false,
	init : function() {
		var self = this;
		self.loginDialog = $('#login-register').dialog({
			autoOpen : false,
			width : 365,
			resizable : false,
			draggable : false
		});
		$('#btn-login, .btn-login').bind('click', function(e) {
			if (this.className.indexOf('login') != -1) {
				e.preventDefault();
				self.loginDialog.dialog('open');
			}			
		});
		if ($('#btn-login').hasClass('logout')) { self.loggedIn = true; }
		if ($('#nav-portfolio').length) {
			$('#nav-portfolio a').each(function() {
				$this = $(this);
				var html = $this.html();
				if ($this.height() > 20) {
					$this.html(html.replace(' &', '<br />&'));
				}
			});
		}
	},
	initRegisterForm : function(validation_options) {
		if (this.initRegisterFormRun) { return false; }
		validation_options.submitHandler = $.proxy(this.ajaxRegisterHandler, this);
		$('#user-register-form').validate(validation_options);
		this.initRegisterFormRun = true;
	},
	initLoginForm : function(validation_options) {
		if (this.initLoginFormRun) { return false; }
		validation_options.submitHandler = $.proxy(this.ajaxLoginHandler, this);
		$('#user-login-form').validate(validation_options);	
		this.initLoginFormRun = true;
	},
	initFavoritesForm : function() {
		var self = this;
		var autoOpen = $('#add-portfolio-item-favorite #auto_open').val() == 1 ? true : false;
		if (!$('#add-portfolio-item-favorite').length) {
			self.favoritesDialog = false;
			return;
		}
		self.favoritesDialog = $('#add-portfolio-item-favorite').dialog({
			autoOpen : autoOpen,
			width : 365,
			resizable : false,
			draggable : false
		});
		$('#add-portfolio-item-favorite-form').validate({
			rules : {
				portfolio_item_project_id : 'required'
			},
			messages : {
				portfolio_item_project_id : 'Please select a project'
			},
			submitHandler : $.proxy(this.ajaxFavoritesHandler, this)
		});
	},
	initPortfolioDetail : function() {
		var self = this;
		// Update the current portfolio item cookie and erase the carousel position cookie if we have switched between portfolio items
		var portfolio_item_id = $('#portfolio_item_id').val();
		if (jwhUtil.readCookie('jwh_portfolio_item_id') != portfolio_item_id) {
			jwhUtil.eraseCookie('jwh_carousel_position');
		}
		jwhUtil.createCookie('jwh_portfolio_item_id', portfolio_item_id);
		$('.btn-add-to-favorites a').bind('click', function(e) {
			e.preventDefault();
			if (self.favoriteAdded) { return false; }
			var portfolio_item_image_id = this.href.match(/#add-portfolio-item-favorite-(\d+)/)[1];
			// User is logged in
			if (self.loggedIn) {
				// If the favorites dialog exists, the user has more than on project, so show the dialog
				if (self.favoritesDialog) {
					$('#portfolio_item_image_id').val(portfolio_item_image_id);
					self.favoritesDialog.dialog('open');
				// If it does not exist, add the favorite directly
				} else {
					self.addFavorite(portfolio_item_image_id);
				}
			} else {
				self.loginDialog.find('input[name="portfolio_item_image_id"]').val(portfolio_item_image_id);
				self.loginDialog.dialog('open');
			}
		});
		var jwh_carousel_position = jwhUtil.readCookie('jwh_carousel_position');
		var start = jwh_carousel_position ? Number(jwh_carousel_position) : 1;
		$('#nav-portfolio-item-images').jcarousel({
			wrap: 'both',
			scroll : 8,
			start : start,
			itemFirstInCallback : jwhUser.itemFirstInCallback
		});
		var nav_portfolio_item_count = $('#nav-portfolio-item-images li').size();
		if (nav_portfolio_item_count < 9) { 
			$('.jcarousel-skin-jwh').addClass('navigation-disabled'); 
			$('.jcarousel-next').css('display', 'none'); 
			$('.jcarousel-prev').css('display', 'none'); 
		};
		// If the sidebar is longer than the content column, set up a scrollpane for the portfolio description
		var sidebar_height = $('#sidebar').height();
		var content_height = $('#content').height();
		if (sidebar_height > content_height) {
			var diff = sidebar_height - content_height + 18;
			var sidebar_details_height = $('#sidebar-portfolio-details').height();
			$('#sidebar-portfolio-details').wrapInner('<div class="scrollpane" />');
			$('#sidebar-portfolio-details')
				.append($('<a class="btn-scrollpane-down" href="#">Down</a>'))
				.append($('<a class="btn-scrollpane-up" href="#">Up</a>'));
			$('#sidebar-portfolio-details .scrollpane').scrollpane({
				height : sidebar_details_height - diff
			});
			$('#sidebar-portfolio-details .scrollpane').find('.btn-design-portfolio').prev().addClass('last');
		}		
/*		$('#nav-portfolio-item-images').jcarousel({
			wrap: 'circular',
			scroll : 1
		}); */
	},
	initMessageForm : function(validation_options) {
		$('#add-comment-form').validate(validation_options);
	},
	initWorktable : function() {
		$('.project-file-category, .project-favorites').expando({
			toggleCallback : function(trigger, targets, item, opts) {
				if (trigger.hasClass(opts.openClass)) {
					jwhUser.addCookieVal('jwh_open_project_folders', targets[0].id);
				} else {
					jwhUser.removeCookieVal('jwh_open_project_folders', targets[0].id);
				}
			},
			loadCallbackAfterClose : function(trigger, targets, opts) {
				jwh_open_project_folders = jwhUtil.readCookie('jwh_open_project_folders');
				if (jwh_open_project_folders) {
					jwh_open_project_folders = jwh_open_project_folders.split(',');
					for (var i = 0; i < jwh_open_project_folders.length; i++) {
						$('#'+jwh_open_project_folders[i]).show().prev().find('.'+opts.triggerClass).removeClass(opts.closedClass).addClass(opts.openClass);
					}
				}
			}
		});
		$('.project h3 .trigger').each(function() {
			$this = $(this);
			var id = this.href.match(/#([-_a-zA-Z0-9]+?)$/)[1];
			var target = $('#'+id);
			$this.data({
				id : id,
				target : target
			});
			$this.removeClass('expanded').addClass('collapsed');
			target.hide();
			$this.bind('click', function(e) {
				e.preventDefault();
				$this = $(this);
				if ($this.hasClass('expanded')) {
					$this.removeClass('expanded').addClass('collapsed');
					$this.data('target').hide();
					jwhUser.removeCookieVal('jwh_open_projects', $this.data('id'));
				} else {
					$this.removeClass('collapsed').addClass('expanded');
					$this.data('target').show();
					jwhUser.addCookieVal('jwh_open_projects', $this.data('id'));
				}
			});
		});
		jwh_open_projects = jwhUtil.readCookie('jwh_open_projects');
		if (jwh_open_projects) {
			jwh_open_projects = jwh_open_projects.split(',');
			for (var i = 0; i < jwh_open_projects.length; i++) {
				$('#'+jwh_open_projects[i]).show().prev().find('.trigger').removeClass('collapsed').addClass('expanded');
			}
		}
	},
	addCookieVal : function(cookie_name, val) {
		var c = jwhUtil.readCookie(cookie_name);
		c = c ? c.split(',') : [];
		var found = false;
		for (var i = 0; i < c.length; i++) {
			if (c[i] == val) {
				found = true;
			}
		}
		if (!found) {
			c.push(val);
			jwhUtil.createCookie(cookie_name, c.join(','));
		}
	},
	removeCookieVal : function(cookie_name, val) {
		var c = jwhUtil.readCookie(cookie_name);
		c = c ? c.split(',') : [];
		var n = [];
		for (var i = 0; i < c.length; i++) {
			if (c[i] != val) {
				n.push(c[i]);
			}
		}
		jwhUtil.createCookie(cookie_name, n.join(','));
	},
	initForwardPortfolioForm : function() {
		var self = this;
		self.forwardPortfolioDialog = $('#forward-portfolio-dialog').dialog({
			autoOpen : false,
			resizable : false,
			draggable : false,
			width : 365
		});
		$('.btn-forward a').bind('click', function(e) {
			e.preventDefault();
			self.forwardPortfolioDialog.dialog('open');
		});
		$('#forward-portfolio-form').validate({
			rules : {
				sender_name : 'required',
				sender_email : {
					required : true,
					email : true
				},
				recipient_name : 'required',
				recipient_email : {
					required : true,
					email : true
				}
			},
			messages : {
				sender_name : 'Your name is required',
				sender_email : 'Your valid email is required',
				recipient_name : 'Recipient name is required',
				recipient_email : 'Valid recipient email is required'
			},
			submitHandler : $.proxy(this.ajaxForwardPortfolioHandler, this)
		});
	},
	initUserImageUploadForm : function() {
		self.uploadFileDialog = $('#upload-file-dialog').dialog({
			autoOpen : false,
			resizable : false,
			draggable : false,
			width: 365
		});
		$('#upload-file-form').validate({
			rules : {
				project_id : 'required',
				project_file_category_id : 'required',
				name : 'required',
				file : {
					required : true,
					accept : 'jpg|jpeg'
				}
			},
			messages : {
				project_id : 'Project is required',
				project_file_category_id : 'Category is required',
				name : 'Name is required',
				file : {
					required : 'File is required',
					accept : 'File must be in JPG format'
				}
			}
		});
		$('.btn-upload-file a').bind('click', function(e) {
			e.preventDefault();
			var matches = this.href.match(/#project-(\d+)-user-image-category-(\d+)/);
			$('#upload-file-form #project_id').val(matches[1]);
			$('#upload-file-form #user_image_category_id').val(matches[2]);
			self.uploadFileDialog.dialog('open');
		});
	},
	initMoveFavoriteForm : function() {
		self.moveFavoriteDialog = $('#move-favorite-dialog').dialog({
			autoOpen : false,
			resizable : false,
			draggable : false,
			width: 365
		});
		$('#move-favorite-form').validate({
			rules : {
				project_id : 'required',
				user_portfolio_item_image_id : 'required'
			},
			messages : {
				project_id : 'Project is required',
				user_portfolio_item_image_id : 'Favorite is required'
			}
		});
		$('.btn-move-favorite').bind('click', function(e) {
			e.preventDefault();
			var matches = this.href.match(/user_portfolio_item_image_id=(\d+)\&project_id=(\d+)/);
			$('#move-favorite-form').find('input[name="project_id"]').attr('checked', false);
			// Favorite
			if (matches) {
				$('#move-favorite-form').find('#user_portfolio_item_image_id').val(matches[1]);
				$('#move-favorite-form').find('#user_image_id').val('0');
				$('#move-favorite-form').find('input[name="project_id"]').attr('checked', false);
				$('#move-favorite-form').find('#project_id_'+matches[2]).attr('checked', true);			
			// User Image
			} else {
				var matches = this.href.match(/user_image_id=(\d+)\&project_id=(\d+)/);
				$('#move-favorite-form').find('#user_portfolio_item_image_id').val('0');
				$('#move-favorite-form').find('#user_image_id').val(matches[1]);
				$('#move-favorite-form').find('#project_id_'+matches[2]).attr('checked', true);			
			}
			self.moveFavoriteDialog.dialog('open');
		});
	},
	initDeleteFavoriteForm : function() {
		self.deleteFavoriteDialog = $('#delete-favorite-dialog').dialog({
			autoOpen : false,
			resizable : false,
			draggable : false,
			width: 365
		});
		$('#delete-favorite-form').validate({
			rules : {
				user_portfolio_item_image_id : 'required'
			},
			messages : {
				user_portfolio_item_image_id : 'Favorite is required'
			}
		});
		$('.btn-cancel').bind('click', function(e) {
			e.preventDefault();
			$('#delete-favorite-form').find('#user_portfolio_item_image_id').val('0');
			$('#delete-favorite-form').find('#user_image_id').val('0');
			self.deleteFavoriteDialog.dialog('close');
		});
		$('.btn-delete-favorite').bind('click', function(e) {
			e.preventDefault();
			var matches = this.href.match(/user_portfolio_item_image_id=(\d+)/);
			if (matches) {
				$('#delete-favorite-form').find('#user_portfolio_item_image_id').val(matches[1]);			
				$('#delete-favorite-form').find('#user_image_id').val('0');
			} else {
				var matches = this.href.match(/user_image_id=(\d+)/);
				$('#delete-favorite-form').find('#user_image_id').val(matches[1]);			
				$('#delete-favorite-form').find('#user_portfolio_item_image_id').val('0');			
			}
			self.deleteFavoriteDialog.dialog('open');
		});
	},
	setLogoutLink : function(url) {
		$('#btn-login').removeClass('login').addClass('logout').attr('href', url).text('Logout');	
	},
	addFavorite : function(portfolio_item_image_id, project_id) {
		var self = this;
		var data = {
			user_mode : 'add_favorite',
			portfolio_item_image_id : portfolio_item_image_id,
			project_id : project_id
		};
		$.getJSON(jwhUser.ajaxHandler, data, function(data, textStatus, jqXHR) {
			if (!data.errors) {
				$(data.confirmation_html).dialog({
					width : 365,
					resizable : false,
					draggable : false
				});
			} else {
				$(data.errors_html).dialog({
					width : 365,
					resizable : false,
					draggable : false
				});			
			}
		});
		self.favoriteAdded = true;
	},
	ajaxFavoritesHandler : function(form) {
		var self = this;
		self.addFavorite($('#portfolio_item_image_id').val(), $('input[name="portfolio_item_project_id"]:checked').val());
		self.favoritesDialog.dialog('close');
	},
	ajaxLoginHandler : function(form) {
		var self = this;
		var data = $(form).serialize();
		var portfolio_item_image_id = self.loginDialog.find('input[name="portfolio_item_image_id"]').val();
		data += '&user_mode=login';
		$.getJSON(jwhUser.ajaxHandler, data, function(data, textStatus, jqXHR) {
			if (!data.errors) {
				// Was the user trying to add a favorite?
				if (portfolio_item_image_id) {
					self.setLogoutLink(data.logout_url);
					$('#btn-login').after(data.worktable_link);
					self.loginDialog.dialog('close');
					// If the user has only 1 project, add the favorite
					if (data.project_ids.length == 1) {
						self.addFavorite(portfolio_item_image_id, data.project_ids[0]);
					// Otherwise, retrieve the project selection dialog and open it
					} else {
						$.get(jwhUser.ajaxHandler, { user_mode : 'list_projects', user_id : data.user_id, portfolio_item_image_id : portfolio_item_image_id }, function(data, textStatus, jqXHR) {
							self.favoritesDialog = $(data).dialog({
								autoOpen : 1,
								width : 365,
								resizable : false,
								draggable : false
							});
						}, 'html');
					}
				// Otherwise, redirect to the worktable
				} else {
					window.location.href = data.login_url;
				}
			} else {
				$errors = $(form).find('.errors');
				if ($errors.length) {
					$errors.html($(data.errors_html).html());
				} else {
					$errors = $(data.errors_html);
					$(form).prepend($errors);
				}
				$errors.slideDown('fast');
			}
		});
	},
	ajaxRegisterHandler : function(form) {
		var self = this;
		var data = $(form).serialize();
		data += '&user_mode=register';
		$.getJSON(jwhUser.ajaxHandler, data, function(data, textStatus, jqXHR) {
			if (!data.errors) {
				window.location.href = data.login_url;
			} else {
				$errors = $(form).find('.errors');
				if ($errors.length) {
					$errors.html($(data.errors_html).html());
				} else {
					$errors = $(data.errors_html);
					$(form).prepend($errors);
				}
				$errors.slideDown('fast');
			}
		});
	},
	ajaxForwardPortfolioHandler : function(form) {
		var self = this;
		var data = $(form).serialize();
		data += '&user_mode=forward_portfolio';
		$.get(jwhUser.ajaxHandler, data, function(data, textStatus, jqXHR) {
			self.forwardPortfolioDialog.dialog('close');
			$(data).dialog({
				autoOpen : true,
				draggable : false,
				resizable : false,
				width: 365
			});
		}, 'html');
	},
	itemFirstInCallback : function(carousel, item, idx, state) {
		jwhUtil.createCookie('jwh_carousel_position', idx);
	}
};

$(document).ready(function() {
	jwhUser.init();
});
