jQuery(document).ready(function($) {
	var canRun = $('body').is('#photos') || $('body').is('#set');
	if (canRun) {
		window.Stream = {
			// constructor
			init : function() {
				window.Stream = this;
				this.updateContents();
				this.attachGeneralHandlers();
				return this;
			},
			updateContents : function() {
				GeneralUtils.setContentWidth();
				if ($('body').is('.in_progress')) {
					GeneralUtils.setThumbnailsPositions();
				}
			},
			faceboxTemplate : '<a title="View photos that __NAME__ appears in&hellip;" href="/photos/__USER_ID__/you">__NAME__</a>',
			mataNameDiv : '<div class="meta"><div class="name">__META_NAME__</div></div>',
			nameDiv : '<div class="name">__META_NAME__</div>',
			addNamesAndFaceboxes : function(correctMatches, imageMd5s, data) {
				$(correctMatches).each(function() {
					var match = this;
					/*
					 * find image that has this facebox on current page run
					 * through all images and find facebox, then add name
					 */
					$(imageMd5s).each(function() {
						var md5 = this;
						if ($('#' + md5 + '-container' + ' #' + match).length > 0) {
							/* we have found facebox to update */
							var nameeData = data.nameeData;
							Stream.updateNameAndFacebox(nameeData, md5);

						}
					})

				})

			},
			updateNameAndFacebox : function(nameeData, imageMd5) {
				if (imageMd5 == null || imageMd5 == undefined) {
					imageMd5 = nameeData.imageMd5;
				}
				var id = '#' + nameeData.faceboxId;
				$(id).attr('href', '/photos/' + nameeData.userId + '/you');
				$(id).attr('title', nameeData.screenName);
				$(id).addClass('named');
				$(id).removeClass('name');
				var selector = '#' + imageMd5 + '-container';
				var newEntry = Stream.createNewNameEntry(nameeData);
				Stream.addName(newEntry, selector);
			},
			addName : function(newEntry, selector) {
				
				var photoSelector = selector + ' .photo';

				var nameSelector = selector;

				/* stream page */
				var counter = 0;
				if ($('body').is('#photos')) {
					nameSelector = selector + ' .meta .name';
					var metaSelector = photoSelector + ' .meta';
					if ($(nameSelector + ':last').length > 0) {
						var div = Stream.nameDiv;
						div = div.replace('__META_NAME__', newEntry);
						$(nameSelector + ':last').after(div);
					} else {
						var div = Stream.mataNameDiv;
						div = div.replace('__META_NAME__', newEntry);
						$(photoSelector).append(div);
					}
					$(nameSelector).each(function() {
						var elem = this;
						$(elem).html($(elem).html().replace(',', ''));
					})
					$(selector).each(function() {
						var elem = this;
						$(elem).html($(elem).html().replace('and', ''));
					})

					var length = $(nameSelector).length;
					$(nameSelector).each(function() {
						var elem = this;
						if (length != 0 && counter + 2 != length && counter + 1 != length) {
							$(elem).after(',');
						}
						if (counter + 2 == length) {
							$(elem).after(' and ');
						}
						counter = counter + 1;
					})
				}

				if ($('body').is('#photo')) {
					nameSelector = '#photo #hit #meta a';
					var emSelector = '#photo #hit #meta em';
					if ($(nameSelector).length > 0) {
						$(nameSelector + ':last').after(newEntry);
					} else {
						$(emSelector).after(newEntry);
					}
					$('#meta em').text("In this photo: ");
					var nameSelector = '#meta';
					$(nameSelector).each(function() {
						var elem = this;
						$(elem).html($(elem).html().replace(',', ''));
						$(elem).html($(elem).html().replace('and', ''));
					})

					var length = $(nameSelector + ' a').length;
					$(nameSelector + ' a').each(function() {
						var elem = this;
						if (length != 0 && counter + 2 != length && counter + 1 != length && counter != length) {
							$(elem).after(',');
						}
						if (counter + 2 == length) {
							$(elem).after(' and ');
						}
						counter = counter + 1;
					})

				}

			},
			createNewNameEntry : function(nameeData) {
				var template = Stream.faceboxTemplate;
				template = template.replace('__USER_ID__', nameeData.userId);
				template = template.replace('__NAME__', nameeData.screenName);
				template = template.replace('__NAME__', nameeData.screenName);
				return template;
			},

			attachGeneralHandlers : function() {
				$(window).resize(function() {
					GeneralUtils.setContentWidth();
				});

				$('ul.face_container, ul.mugshot, .photo_wrapper').bind('mouseenter mouseleave', function(e) {
					$(this).toggleClass('hover');
				});

				$('.embed-link').live('click', function() {
					var url = $(this).attr('href');
					ModalUtils.getAjaxJson(url, function(data) {
						var token = data.tinyUrlToken;
						var modalForm = ModalUtils.retrieveHtmlTemplateById("modal-share");
						ModalUtils.replaceIdAttributes(modalForm);
						var bodyValue = $.trim(modalForm.find('#embed-body').val());
						bodyValue = bodyValue.replace(/__TOKEN__/g, token);
						bodyValue = bodyValue.replace(/__ID__/g, "id");
						modalForm.find('#embed-body').val(bodyValue);
						var tokenUrl = modalForm.find('#token-url');
						tokenUrl.attr('href', tokenUrl.attr('href') + token);
						modalForm.find('#token-text').append(token);
						var tokenUrlMail = modalForm.find('#token-url-mail');
						tokenUrlMail.attr('href', tokenUrlMail.attr('href') + token);
						modalForm.find('#locations .post').each(function() {
							var self = $(this);
							self.attr('href', self.attr('href') + token);
						});
						ModalUtils.createAndResizeModal(modalForm, true);
					});
					return false;
				});
			}

		}.init();
	}
});