var Slackers = {};
Slackers.Module = {};
Slackers.gbl = {};

Slackers.SetGlobals = function(){
	Slackers.gbl.EL = {
		MASK : $('#mask')
	};
};

Slackers.gbl.Mask = function(){
	var self = this;
	this.init = function(){
		self.el = Slackers.gbl.EL.MASK;
	};
	this.show = function(callback){
		var docHeight = $(document).height();
		self.el.height(docHeight);
		self.el.show();
		self.el.fadeTo(300, .5, function(){
			if(callback){
				callback.apply(callback);
			}
		});
	};
	this.hide = function(callback){
		self.el.fadeOut(200, function(){
			if(callback){
				callback.apply(callback);
			}
		});
	};
	
	this.init();
};

Slackers.Module.UpcomingShows = function(){
	var self = this;
	
	this.init = function(){
		try{
			self.renderToolTips();
		}catch(e){
			console.warn(e);
		}
	};
	
	this.renderToolTips = function(){
		var eventLinks = $('.module.upcoming-shows .event');
		var show = function(){
			$(this).find('.show-dtls-wrp').fadeIn(300);
		};
		
		var hide = function(){
			$(this).find('.show-dtls-wrp').fadeOut(100);
		};
		
		eventLinks.hoverIntent({
			sensitivity: 1,
			interval: 100,
			over: function(){show.apply(this)},
			out: function(){hide.apply(this)},
			timeout: 300
		});
	};
	
	
	this.renderCalendar = function(JSONResp){
		var shows = JSONResp;
		var oCalendar = Dom.get('upcoming-calendar');
		var oShowList = document.createElement('ul');
		
		for(show in shows){
			var show = shows[show];
			var oLi = document.createElement('li');
			
			var oDate = document.createElement('div');
			Dom.addClass(oDate, 'date');
			oDate.appendChild(document.createTextNode(show.short_date));
			oDate = Slackers.Util.wrap(oDate, 'a', 'shows.php');
			oLi.appendChild(oDate);
			
			var oCity = document.createElement('div');
			Dom.addClass(oCity, 'city');
			oCity.appendChild(document.createTextNode(show.venue_info.adr['x-calconnect-city']));
			oCity = Slackers.Util.wrap(oCity, 'a', 'shows.php');
			
			oLi.appendChild(oCity);
			
			var oShowDtls = document.createElement('div');
			Dom.addClass(oShowDtls, 'show-dtls');
			
			var oShowDtls = document.createElement('div');
			Dom.addClass(oShowDtls, 'show-dtls');
			oShowDtlList = document.createElement('ul');
			
			oDtlDate = Slackers.Util.wrap(document.createTextNode(show.long_date), 'li');
			
			var oDtlVenueName = Slackers.Util.wrap(document.createTextNode(show.venue_info.adr['x-calconnect-venue-name']), 'li');
			var oDtlVenueAddr = document.createElement('div');
			oDtlVenueAddr.appendChild(Slackers.Util.wrap(document.createTextNode(show.venue_info.adr['x-calconnect-street']), 'div'));
			var outZip = show.venue_info.adr['x-calconnect-postalcode'].length > 0 ? show.venue_info.adr['x-calconnect-postalcode'] : '';
			oDtlVenueAddr.appendChild(Slackers.Util.wrap(document.createTextNode(show.venue_info.adr['x-calconnect-city'] + ', ' + show.venue_info.adr['x-calconnect-region'] + ' ' + outZip), 'div'));
			oDtlVenueAddr = Slackers.Util.wrap(oDtlVenueAddr, 'li');
			
			oShowDtlList.appendChild(oDtlDate);
			oShowDtlList.appendChild(oDtlVenueName);			
			oShowDtlList.appendChild(oDtlVenueAddr);
			
			oShowDtls.appendChild(oShowDtlList);
			
			oShowList.appendChild(oLi);
			
			new Slackers.Widget.ToolTip("show-details", { 
				context:oLi, 
				text:oShowDtls,
				hideDelay:0,
				autodismissdelay:20000,
				container:oLi,
				xy : ['0','0'],
				width:'217px'
			});
		}
		oCalendar.appendChild(oShowList);
	};
	
	if($('.module.upcoming-shows').length > 0) this.init();
	
};

Slackers.Module.FeaturedPhotos = function(){
	var self = this;
	var photos;
	var oCarousel = $('#fp-carousel');
	var photoLarge = $('#featured-photos').find('.photo-large');
	var mask = new Slackers.gbl.Mask();
	
	this.init = function(){
		self.start();
		self.initEvents();
	};	
	this.initEvents = function(){
		oCarousel.find('a').bind('click', function(event){
			if(!$(this).parent().hasClass('photo-credit')){
				event.preventDefault();
				self.showPhotoLarge.apply(this);
			}
		});
		
		photoLarge.find('.close').bind('click', function(){
			self.hidePhotoLarge();
		});
	};
	this.start = function(){
		var curPhoto;
		photos = oCarousel.find('li');
		curPhoto = oCarousel.find('.slctd')[0];
		var nextPhoto, prevPhoto;
		var getNextAndPrev = function(){
			for(var i = 0; i < photos.length; i++){
				var photo = photos[i];
				if(photos[i] === curPhoto){
					nextPhoto = i != photos.length-1 ? photos[i+1] : photos[0];
					prevPhoto = i != 0  ? photos[i-1] : photos[photos.length-1];
				}
			}	
		};
		
		self.interval = setInterval(function(){
			getNextAndPrev();	
			$(curPhoto).removeClass('slctd');
			curPhoto = nextPhoto;
			$(nextPhoto).addClass('slctd');
		}, 5000);				
	};
	
	this.pause = function(){
		clearInterval(self.interval);
	};
	
	this.showPhotoLarge = function(){
		self.pause();
		var newImage = $(this).find('img').attr('src');
		photoLarge.find('img').attr('src', newImage);
		photoLarge.show();
		//mask.show(function(){photoLarge.show();});
		
	};
	this.hidePhotoLarge = function(){
		mask.hide(function(){photoLarge.hide()});
		self.start();
	};
	
	if(oCarousel){
		try{
			this.init();
		}catch(e){
			console.warn(e);
		}
	}
};

Slackers.Module.Comments = function(){
	var self = this;
	
	var ELS = {
		VIEW_COMMENT : $('.home .read_comments'),
		ADD_COMMENT : $('.home .comment_add a'),
		COMMENT_FORM : $('#comment-form')
	};
	
	this.init = function(){
		self.initEvents();
		//self.preloadCommentForms();
	};
	
	this.initEvents = function(){
		//read comments
		ELS.VIEW_COMMENT.bind('click', function(event){
			event.preventDefault();
			
			var commentContainer = $(this).closest('.blog-entry').find('.comment-container');
			var commentsLoaded = $(commentContainer).html().length > 0;
								
			$(this).closest('li').hide(); //hide read comments link
			
			if(!commentsLoaded){
				self.loadComments.apply(this, [commentContainer]);
			}else{
				self.showComments.apply(this, [commentContainer]);
			}
		});
		
		//add coments
		/*ELS.ADD_COMMENT.live('click', function(event){
			event.preventDefault();
			self.showAddCommentForm.apply(this);
		});
		
		//form submissions
		ELS.COMMENT_FORM.live('submit', function(event){
			event.preventDefault();
			self.handleAddCommentSubmit.apply(this);
		});*/
	};
	
	this.preloadCommentForms = function(){
		jQuery.each(ELS.ADD_COMMENT, function(){
			var addContainer = $(this).closest('.blog-entry').find('.add-comment-container');
			
			var content = $(this).attr('href');
			if(!content || content == null){
				return;
			}
			addContainer.load(content + ' #comment-form', function(){
				$(addContainer).find('#edit-comment').val('Comment');
				$(addContainer).find('#edit-subject').val('Subject');
				
				//clear field on initial focus
				$(addContainer)
					.find('#edit-comment')
					.one('focus', function(){
						$(this).val(''); 
						$(this).css('color', 'black');
					});
				$(addContainer)
					.find('#edit-subject')
					.one('focus', function(){
						$(this).val(''); 
						$(this).css('color', 'black');
					});
			});
		});
	};
	
	this.loadComments = function(commentContainer){
		var ev = this; //event scope
		var content = $(this).attr('href');
		if($(commentContainer).length > 0){
			if(content.indexOf('#') != -1){
				var loadURL = content.split('#').join(' #');
			}
			try{
				self.addLoadingStatus.apply(this, [commentContainer]);
				commentContainer.load(loadURL, function(){
					self.removeLoadingStatus.call(ev);
					self.showComments.apply(ev, [commentContainer]);
				});
			}catch(e){
				console.warn(e);
				commentContainer.html('Error loading comments.  Please try again later.');
			}
		}
	};
	
	this.showComments = function(commentContainer){
		var ev = this; //scope = event target
		if($(commentContainer).length > 0){
			$(commentContainer).slideDown();
		}
		
		var postURL = $(this).closest('.blog-entry').find('.entry-title a').attr('href');
		var addURL = '/comment/reply/' + postURL.split('/node/')[1];
		
		var addCommentLink = $('<span class="comment_add"><a href="' + addURL + '">add comment </span></a> ');
		addCommentLink.appendTo(commentContainer);
		
		//preload add comment form since these didn't load in the other preload method
		var preloadForm = function(){
			var addContainer = $(ev).closest('.blog-entry').find('.add-comment-container');
			var content = $(ev).closest('.blog-entry').find('.comment_add a').attr('href');

			if(!content || content == null){
				return;
			}
			addContainer.load(content + ' #comment-form', function(){
				$(addContainer).find('#edit-comment').val('Add Comment');
				$(addContainer).find('#edit-subject').val('Subject');
				
				//clear field on initial focus
				$(addContainer)
					.find('#edit-comment')
					.one('focus', function(){
						$(this).val(''); 
						$(this).css('color', 'black');
					});
				$(addContainer)
					.find('#edit-subject')
					.one('focus', function(){
						$(this).val(''); 
							$(this).css('color', 'black');
					});
			});
			
			
		}
		//preloadForm();
		
		$('<a href="#" class="hide-comments">hide comments</a>')
			.insertAfter(addCommentLink)
			.bind('click', function(event){
				event.preventDefault();
				self.hideComments.apply(ev, [commentContainer]);
			});
	};
	
	this.hideComments = function(commentContainer){
		$(commentContainer).slideUp();
		//unhide read comments link
		$(this)
			.closest('.blog-entry')
			.find('.read_comments')
			.closest('li')
			.show();
		
		$(commentContainer).find('.hide-comments').remove(); //remove hide comments link
	};
	
	this.showAddCommentForm = function(){
		var addContainer = $(this).closest('.blog-entry').find('.add-comment-container');
		if(addContainer.length > 0){			
			addContainer.fadeIn();
		}
	};	
	
	this.handleAddCommentSubmit = function(){
		var oForm = this; //scope = form
		var addContainer = $(this).closest('.blog-entry').find('.add-comment-container').slideUp();
		
		var attachErrors = function(error){
			var errorConsole = $('.error-console').length == 0 ? $('<div class="error-console"></div>') : $('.error-console');
			errorConsole.html(''); //clear any present errors first

			//attach error and reshow form
			$(errorConsole)
				.append(document.createTextNode(error))
				.prependTo(addContainer);
			addContainer.slideDown();

		};
		var reloadComments = function(){
			var oCommentContainer = $(oForm).closest('.blog-entry').find('.comment-container');
			self.hideComments(oCommentContainer);
						
			var loadScope = $(oForm).closest('.blog-entry').find('.read_comments');
			self.loadComments.apply(loadScope, [oCommentContainer]);
			
			self.showComments.apply(oForm, [oCommentContainer]);
		};
		var connect = function(){
			self.addLoadingStatus.apply(oForm);
			jQuery.ajax(
				{
					url : $(oForm).attr('action'),
					type : 'POST',
					data : $(oForm).serialize(),
					success : function(resp){
						console.log('add comment xhr call success');
						//check for errors returned by drupal
						if(resp.indexOf('sessionMsgs') != -1){
							attachErrors('Comment field must not be empty');
						}else{
							reloadComments();
						}
					},
					error : function(resp){
						attachErrors(resp);
						console.warn(resp);
					},
					complete : function(){
						self.removeLoadingStatus.apply(oForm);
					}
				}
			);
		};
		
		var validate = function(){
			var hasErrors = false;
			var editval = $(oForm).find('#edit-comment').val();
			var subjectval = $(oForm).find('#edit-subject').val();
			
			if(editval == 'Add Comment' || editval.length == 0) hasErrors = true;
			
			if(subjectval == 'Subject') $(oForm).find('#edit-subject').val(''); //clear the subject value if it's the default one
			
			if(hasErrors){
				attachErrors('Comment field must not be empty');
			}else{
				connect();
			}
			
		};
		
		validate();
	}
	
	this.addLoadingStatus = function(){
		var loading = $('<div class="loading">Loading&#133;</div>');		
		
		$(this)
			.closest('.blog-entry')
			.append(loading);
	};
	
	this.removeLoadingStatus = function(){
		//remove loading status spinner
		$(this)
			.closest('.blog-entry')
			.find('.loading')
			.fadeOut(function(){
				$(this).remove();
		});
	}
	
	try{
		this.init();
	}catch(e){
		console.warn(e);
	}
}

/**
 * sets the dropdown menu default option based on which contact form the user is trying to access
 */
Slackers.Module.Contact = function(){
	var self = this;
	var url = window.location.href;
	
	this.init = function(){
		self.setOption();
	};
	
	this.setOption = function(){
		var query = window.location.search;
		var oMenu = $('#edit-cid');
		if(oMenu.length == 0){
			return;
		}
		if(query.indexOf('feedback') != -1){
			oMenu.find("option[value='2']").attr('selected', 'selected');
		}else if(query.indexOf('book') != -1){
			oMenu.find("option[value='1']").attr('selected', 'selected');
		}
		
	}
	if(url.indexOf('/contact') != -1){
		this.init();
	}
};

Slackers.Module.MyspaceBlogs = function(){
	var self = this;
	var oBlogMod = $('#myspace-blogs');
	
	this.init = function(){
		self.initEvents();
	};
	
	this.initEvents = function(){
		oBlogMod.find('h4').hoverIntent({
			sensitivity: 1,
			interval: 100,
			over: function(){self.show.apply(this)},
			out: function(){self.hide.apply(this)},
			timeout: 300
		});
	};
	
	this.show = function(){
		var oDiv = $(this).nextAll('.m-blog')[0]
		$(oDiv)
			.find('p')
			.slideDown('fast');
	};
	
	this.hide = function(){
		var oDiv = $(this).nextAll('.m-blog')[0];
		$(oDiv)
			.find('p')
			.slideUp('fast');
	}
	
	if($(oBlogMod).length > 0) this.init();
};

Slackers.Nav = function(){
	var self = this;
	
	this.init = function(){
		self.initEvents();
	};
	
	this.initEvents = function(){
		var oPlaylists = $('#secondary-nav .dd-menu');
		oPlaylists
			.find('a')
			.bind('click', function(){
				if($(this).attr('type') == 'application/xspf+xml') return false;
			});
			
		oPlaylists.hoverIntent({
			sensitivity: 1,
			interval: 50,
			over: function(){self.show.apply(this)},
			out: function(){self.hide.apply(this)},
			timeout: 300
		});
	};
	
	this.show = function(){
		$(this).find('.sub').show();
	}
	
	this.hide = function(){
		$(this).find('.sub').hide();
	}
	
	this.init();
};

Slackers.RateAlbum = function(){
	var self = this;
	
	this.init = function(){
		jQuery.getScript('/js/jquery.rating.js', function(){
			self.initRating();
		});
	};
	
	this.initRating = function(){
		$('.fan-rating .rate input').rating();
	};
	
	this.init();
};

Slackers.Video = function(config){
	var self = this;
	var target = config.target;
	var url = config.url;
	var vidPanel = config.panel;

	this.init = function(){
		self.initEvents();
	};
	
	this.initEvents = function(){
		if(target){
			target.bind('click', function(event){
				event.preventDefault();
				self.open();
			});
		}
		
		vidPanel
			.find('.close')
			.bind('click', function(){
				self.close();
			});
	};
	
	this.embed = function(){
		
	};
	
	this.open = function(){
		if(vidPanel){
			vidPanel.show();
		}
	};
	
	this.close = function(){
		vidPanel.hide();
	};
	
	this.init();
};

jQuery(function(){
	if (!("console" in window) || !("firebug" in console)){
	    	var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
		    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

		    window.console = {};
		    for (var i = 0; i < names.length; ++i)window.console[names[i]] = function(){};
	}
		
	Slackers.SetGlobals();
	
	var nav = new Slackers.Nav();
	var featuredPhotos = new Slackers.Module.FeaturedPhotos();
	var comments = new Slackers.Module.Comments();
	var mblogs = new Slackers.Module.MyspaceBlogs();	
	var shows = new Slackers.Module.UpcomingShows();
});
