var comSvcBaseUrl = "/Community/services";
var comMediaBaseUrl = "/Community/media";
var comSiteName = "Dark Custom";
var comPageUrl = "videos.html";

var login = null;

var DarkCustom = (function() {
	// Base configuration.
	var itemsX = 3;
	var itemsY = 4;
	var startIndex = 1;
	var classes = HD.CSS_CLASSES;
	var dateFormat = "ddd, d mmm yyyy";
	var services = HD.ShareWidget.SERVICES;
	var loadingHtml = '<div class="' + classes.LOADING + '"></div>';
	var detailLoadingHtml = '<div class="videoContent">' + loadingHtml + '</div><div class="videoSummary"></div>';
	var siteCategories = ['Dark Custom'];
	var blogUrl = 'blog.html';
	
	return {
		// #darkCustom (the parent container).
		containerEl: null,
		// #galleryContent
		galleryEl: null,
		// #seriesGalleryContent
		seriesGalleryContent: null,
		// #detailContent
		detailEl: null,
		// #detail
		detailContainerEl: null,
		// #seriesName
		seriesNameEl: null,
		// #tags
		tagsEl: null,
		// Categories config.
		categories: [],
		// Whether a deep link is active.
		isDeepLink: false,
		// Whether an overlay is active.
		isOverlayOpen: false,
		// Whether a media request is active.
		isRequestActive: false,
		// Whether this is the initial load.
		isInitialLoad: false,
		// Whether to check the user prior to submitting comments.
		requiresLogin: true,
		// Base view to use on a normal page load (gallery|detail).
		baseView: 'detail',
		// Analytics settings.
		analytics: {
			section: 'Videos'
		},
	
		// Initialize the page.
		init: function() {
			var self = this;
		
			// Preselect common elements.
			this.containerEl = HD.get('darkCustom');
			this.galleryEl = HD.get('galleryContent');
			this.seriesGalleryEl = HD.get('seriesGalleryContent');
			this.detailEl = HD.get('detailContent');
			this.detailContainerEl = HD.get('detail');
			this.seriesNameEl = HD.get('seriesName');
			this.tagsEl = HD.get('tags');
			
			// Update config.
			this.config.main.dao.categories = siteCategories;
			this.config.main.widgets.gallery.blogTemplates = this.templates.gallery.blogTemplates;
			this.config.series.dao.categories = siteCategories;
			this.config.series.widgets.detail.blogTemplates = this.templates.detail.blogTemplates;
			this.config.series.widgets.gallery.blogTemplates = this.templates.gallery.blogTemplates;
			HD.SendFriendWidget.templates.sendFriendInstructionalText = this.templates.sendFriend.sendFriendTemplates.sendFriendInstructionalText;

			// Initialize the session.
			HD.util.DWR.initSession();
			HD.util.DWR.setErrorHandler();
			login = new HD.Login({siteName : comSiteName});
			login.model.init(function() {
				login.model.getUser();
			});
			
			// Preload the data
			this.config.main.dao.preloadedMedia = this.preloadedMedia || null;
			
			HD.GalleryWidget.templates.html = '\
				<div class="${classes.GALLERY} ${classes.WIDGET}">\
					<div class="${classes.CONTROL_PANEL}">\
						<div class="${classes.SORT}">\
							<select class="${hooks.SORTING}">\
								{for sort in config.sorts}\
									{if selectedSort == sort.value || sort.isDefault}\
										<option value="${sort.value}" selected>${sort.name}</option>\
									{else}\
										<option value="${sort.value}">${sort.name}</option>\
									{/if}\
								{/for}\
							</select>\
						</div>\
						<span class="${hooks.PAGING}"></span>\
					</div>\
					<div class="${classes.CONTENT_PANEL}">\
						<div class="{if rows == 1}${classes.LAST}{else}${classes.FIRST}{/if} hdRow">\
						{var rows = Math.ceil(items.length / config.itemsX)}\
						{for item in items}\
							{if item_index > 0 && item_index % config.itemsX == 0}\
								{if rows == (Math.ceil(item_index / config.itemsX) + 1)}\
									</div><div class="hdClear"></div><div class="${classes.LAST} hdRow">\
								{else}\
									</div><div class="hdClear"></div><div class="hdRow">\
								{/if}\
							{/if}\
							<div class="{if item_index % config.itemsX == 0}${classes.FIRST}{/if} hdItemWrapper">${item|facade}</div>\
							{/for}\
							<div class="hdClear"></div>\
						</div>\
					</div>\
					<div class="${classes.CONTROL_PANEL} ${classes.LAST}">\
						<span class="${hooks.PAGING}"></span>\
					</div>\
				</div>';
					
					

			// Initialize the main engine.
			this.engine = new HD.CommunityEngine(this.config.main);
			this.seriesEngine = new HD.CommunityEngine(this.config.series);
			
			// Attach widget observers.
			this.setObservers();
			
			// Attach DOM event listeners.
			this.setListeners();
			
			// Set global templates.
			this.setTemplates();
			
			// Set analytics
			if (this.setAnalytics) {
				this.setAnalytics();
			}
			
			// Create the object to be shared here
			var sharedItem = {
					author : "Dark Custom",
					category : "Dark Custom",
					description : 'Dark Custom | Videos',
					thumbUrl : '',
					title : 'Dark Custom | Videos'
			};
			
			// Initialize the navigation.
			this.initNavigation(this.baseView);

			// Get media.
			setTimeout(function getMedia() {
				if (self.getNavigation() ) {
					var preventSetActiveItem = false;
					if(self.isDeepLink){
						preventSetActiveItem = true;
					}
					self.engine.dao.getMedia(startIndex, null, preventSetActiveItem);
					self.engine.dao.getTags(0);
					// self.engine.dao.getYoutubeMedia(5);
					self.engine.dao.notifyObservers.call(self.engine.dao, "loadShare_Start", sharedItem);
					self.engine.dao.notifyObservers.call(self.engine.dao, "loadSTAF_Start", sharedItem);
				}
				else {
					setTimeout(getMedia, 50);
				}
			}, 50);
			
			// Override copy
			HD.community.Blog.templates.dateLabel = HD.community.Video.templates.dateLabel = HD.community.Photo.templates.dateLabel = "Posted&nbsp;";
			HD.SendFriendWidget.templates.sendFriendInstructionalText = this.templates.sendFriend.sendFriendTemplates.sendFriendInstructionalText;
			HD.util.StarRating.templates.rateThisLabel = "YOUR RATING:&nbsp;";
			HD.util.StarRating.templates.yourRatingLabel = 'YOUR RATING:&nbsp;';
			HD.util.StarRating.templates.ratingLabel     = 'AVG. RATING:&nbsp;';
			HD.community.Blog.templates.moreText = '<img src="/en_US/Media/images/Content/Pictorial/dark_custom_v3/btn-read-more.gif">';
		},
	
		// Engine/widget config.
		config: {
			main: {
				dao: {
					baseUrl : comSvcBaseUrl,
					siteName : comSiteName,
					contentType : 'blog',
					categories : [],
					startIndex : startIndex,
					pageSize : itemsX * itemsY,
					thumbWidth : 160,
					mediaWidth : 420,
					filters : {
						contentSubtype : 'video'
					}
				},
				cluster: {
					baseUrl : comMediaBaseUrl
				},
				view: {
					navigation : 'nav',
					canvas : 'canvas'
				},
				widgets: {
					tags: {
						parent: 'tags',
						type: 'hd_tags_widget',
						renderMode: 'select'
					},
					gallery: { 
						parent: 'galleryContent', 
						type: 'hd_gallery_widget',
						itemsX : itemsX, 
						itemsY : itemsY, 
						contentType : 'both',
						previewLength : 500, 
						dateFormat : dateFormat,
						isShowPopups : true,
						requiresRatingLogin: false,
						showMatrix : true,			
						sorts: [
					        {value: HD.SORTS.NEW_TO_OLD,name:'by date',isDefault: true},
					        {value: HD.SORTS.HIGHEST_RATED,name:'by rating',isDefault: false},
					        {value: HD.SORTS.MOST_COMMENTED,name:'by comment count',isDefault: false}
				        ]
					},
					share: {
						parent: 'share',
						type: 'hd_share_widget',
						getPermalink: function(media) {
							return window.location.href;
						},
						services: [services.FACEBOOK, services.TWITTER, services.MYSPACE, services.BLOGGER, services.WORDPRESS],
						callback: function(service, title, description, thumbnail, permalink) {
							
						},
						standaloneMode : true
					},
					sendFriend: HD.merge({
						parent: 'sendFriend',
						type: 'hd_send_friend_widget',
						standaloneMode : true
					}, sendFriendConfig)
					/*,
					youtube: {
						parent: 'youtubeContent',
						type: 'hd_carousel_widget',
						compact: true,
						contentFeed: 'getYoutube',
						playerWidth : 297,
						playerHeight: 223,
						templates: {
							viewAllText: '<span>Visit Our YouTube Channel</span>',
							viewAllUrl: 'http://www.youtube.com/user/HarleyDavidson'
						}
					}*/
				}
			},
			series: {
				dao: {
					baseUrl : comSvcBaseUrl,
					siteName : comSiteName,
					contentType : 'blog',
					categories : [],
					startIndex : startIndex,
					pageSize : itemsX * itemsY,
					thumbWidth : 160,
					mediaWidth : 420,
					filters : {
						contentSubtype : 'video'
					}
				},
				cluster: {
					baseUrl : comMediaBaseUrl
				},
				view: {
					navigation : 'nav',
					canvas : 'canvas'
				},
				widgets: {
					gallery: { 
						parent: 'seriesGalleryContent', 
						type: 'hd_gallery_widget',
						itemsX : 1, 
						itemsY : 50, 
						contentType : 'both',
						previewLength : 500, 
						dateFormat : dateFormat,
						isShowPopups : true,
						requiresRatingLogin: false,	
						showMatrix : true,			
						sorts: [
					        {value: HD.SORTS.NEW_TO_OLD,name:'by date',isDefault: true}
				        ]
					},
					detail: { 
						parent: 'detailContent', 
						type: 'hd_detail_widget', 
						contentType : 'both', 
						dateFormat : dateFormat,
						requiresRatingLogin: false,
						showYourRatingText: true,
						embedSendFriend: true,
						sendFriendConfig: sendFriendConfig /* dcUtil.js */,
						previewLength : 500, 
						playerHeight: 320,
						playerWidth: 534,
						embedShare: true,
						shareConfig:{
							type: 'hd_share_widget',
							useShareAPI: true,
							services: [services.FACEBOOK, services.TWITTER, services.MYSPACE, services.BLOGGER, services.WORDPRESS],					
							previewLength: 140,		
							getPermalink: function(media, service, config) {						
								var params = { communityName: 'darkcustom' };
								return media.facade.generatePermalink(params);
							}
						}
					},
					memberProfile: { 
						parent: 'memberProfile', 
						type: 'hd_member_widget', 
						title : 'Contributor' 
					}
				}
			}
		},
		
		// Attach observer methods to widgets.
		setObservers: function() {
			var self = this;
			
			// Attach dao/view observer.
			this.engine.addObserver({
				widgets: ['dao', 'view'],
				update: function(eventName, eventData) {
					if (eventName == "getMedia_Start") {
						// Show loading animation.
						var galleryPanelEl = HD.getByClass(classes.CONTENT_PANEL, '*', self.galleryEl)[0] || self.galleryEl;
						galleryPanelEl.innerHTML = loadingHtml;
					}
					else if (eventName == "getMedia_Finish" && self.isInitialLoad) {
						self.isInitialLoad = false;
					}
				}
			});
			this.seriesEngine.addObserver({
				widgets: ['dao', 'view'],
				update: function(eventName, eventData) {
					if (eventName == "getMedia_Start") {
						// Show loading animation.
						var seriesGalleryPanelEl = HD.getByClass(classes.CONTENT_PANEL, '*', self.seriesGalleryEl)[0] || self.seriesGalleryEl;
						seriesGalleryPanelEl.innerHTML = loadingHtml;
					}
				}
			});
		
			// Attach login observer.
			this.engine.addObserver({
				widgets: [login.model],
				update: function(eventName, eventData) {
					if (!self.requiresLogin) {
						if (eventName == "logged_In") {
							var el = HD.get('detail');
							HD.addClass(el, "hdLI");
							HD.removeClass(el, "hdNLI");
						}
						else if (eventName == "notLogged_In") {
							var el = HD.get('detail');
							HD.addClass(el, "hdNLI");
							HD.removeClass(el, "hdLI");
						}
					}
				}
			});
			
			// Attach gallery observer.
			var galleryObserver = {
				widgets: ['gallery', 'dao'],
				update: function(eventName, eventData) {
					if (eventName == "itemSelected" || eventName == "itemChange_Start") {
						HD.util.Player.View.stopAll();
						
						// Update navigation.
						self.setNavigation('detail', eventData.contentType, eventData.mediaId, null, !!eventData);
					}	
				}
			};
			this.engine.addObserver(galleryObserver);
			this.seriesEngine.addObserver(galleryObserver);
			this.seriesEngine.addObserver({
				widgets: ['gallery', 'dao'],
				update: function(eventName, eventData) {
					if (eventName == "getMedia_Start") {
						self.seriesNameEl.innerHTML = 'Other videos in Series';
					}
					// Determine series name if available.
					else if (eventName == "getMedia_Finish") {
						var seriesName = '';
						for (var i = 0; i < eventData.media.length; i++) {
							if (eventData.media[i].city) {
								seriesName = eventData.media[i].city;
								break;
							}
						}
						if (seriesName) {
							self.seriesNameEl.innerHTML = 'Other videos in the &ldquo;' + seriesName + '&rdquo; Series';
						}
					}	
				}
			});
			
			// Attach detail observer.
			var detailObserver = {
				widgets: ['detail', 'dao'],
				update: function(eventName, eventData) {
					if (eventName == "activeItem_Change" && !self.isInitialLoad) {
						HD.util.Player.View.stopAll();
						
						// Update navigation.
						var view = self.getNavigation().view;
						if (view != 'gallery' && !self.isDeepLink && self.baseView != 'detail') {
							self.setNavigation('detail', eventData.contentType, eventData.mediaId, null, !!eventData);
						}
						
						// Determine series.
						if (eventData && eventData.metaTags && eventData.metaTags.series) {
							HD.addClass(self.detailContainerEl, 'hasSeries');
							if (self.isDeepLink) {
								self.seriesEngine.dao.setMetaTags(eventData.metaTags.series, null, false);
							}
						}
						else {
							HD.removeClass(self.detailContainerEl, 'hasSeries');
						}
					}
					else if (eventName == "getMedium_Start") {
						self.isRequestActive = true;
						
						// Show loading animation.
						HD.removeClass(self.detailContainerEl, 'hasSeries');
						self.detailEl.innerHTML = detailLoadingHtml;
					}
					else if (eventName == "getMedium_Finish") {
						self.isRequestActive = false;
						self.isDeepLink = false;
						self.showMedia({ mediaId: eventData.mediaId, contentType: eventData.contentType });
					}
					else if (eventName == "getComments_Finish"){
						self.isRequestActive = false;
					}
					else if (eventName == "itemSelected") {
						self.linkToBlog();
					}
					if(eventName == "authorSelected") {								
						self.showMemberPanel();		
					}
				}
			};
			this.engine.addObserver(detailObserver);
			this.seriesEngine.addObserver(detailObserver);
			this.engine.addObserver({
				widgets: ['dao'],
				update: function(eventName, eventData) {
					if (eventName == "activeItem_Change") {
						// Only grab the series when it is triggered from the main gallery.
						if (eventData && eventData.metaTags && eventData.metaTags.series) {
							self.seriesEngine.dao.setMetaTags(eventData.metaTags.series, null, false);
						}
					}
				}
			});
			this.engine.dao.addObserver(this.seriesEngine.widgets.detail);
			
			
			// Disable video players when overlays are opened.
		    this.engine.addObserver({
				widgets: [HD.util.Common.getObservable()],
		        update: function(eventName, eventData) {	    	
		    		if (eventName == "overlayOpen") {
						isOverlayOpen = true;
						HD.util.Player.View.stopAll();
			        }
					else if (eventName == "overlayClose") {
						setTimeout(function() {
							isOverlayOpen = false;
						}, 50);
					}
		        }
		    });
		},
		
		// Attach DOM event listeners.
		setListeners: function() {
			var self = this;
			
			// Submit a story.
			HD.getByClass('submitStory', 'a', this.containerEl, function(el) {
				el.onclick = function() {
					self.engine.widgets.upload.renderBoth('Select a category', self.engine.dao.config.categories);
				};
			});
			
			// Return to the gallery.
			HD.getByClass('viewGallery', 'a', this.containerEl, function(el) {
				el.onclick = function() {
					self.setNavigation('gallery', 'all', '0');
				};
			});
		},
		
		// Show media detail.
		showMedia: function(eventData) {
			var self = this;
		
			// Switch to the detail view.
			this.setView('detail');
			
			// Set listener for comments link (delay to override hd_photo/hd_video hardcoded function).
			setTimeout(function() {
				HD.getByClass('hdTitle', '*', self.detailEl, function(el) {
					el.onclick = function() {
						self.linkToBlog();
					};
				});
				HD.getByClass('hdCommentsButton', '*', self.detailEl, function(el) {
					el.onclick = function() {
						self.linkToBlog();
					};
				});
				HD.getByClass('hdTag', '*', self.detailEl, function(el) {
					el.onclick = function() {
						self.engine.dao.setTags(this.innerHTML, true);
						self.engine.dao.getMedia(1, null, true);
					};
				});
			}, 50);
		},
	
		// Get the current view.
		getView: function() {
			return this.containerEl.className;
		},
	
		// Set the current view.
		setView: function(view) {
			this.containerEl.className = view;
			HD.util.Player.View.stopAll();
			HD.util.Common.scrollToTop();
		},
		
		// Set the navigation location (loading data as needed).
		setNavigation: function(view, type, id, skipHistory, hasMedia) {
			if (view == 'gallery') {
				this.setView('gallery');
			}
			else if (view == 'detail') {
				var self = this;
				if (!!skipHistory && !this.isDeepLink) {
					this.setView('detail');
				}
				else {			
					if (id == 0){
						id = this.engine.dao.media[0].mediaId;
						type = 'blog';
					}
					// Request the detailed media data (unless a request is active).
					this.showMedia({ mediaId: id, contentType: type });
					if (!this.isRequestActive) {
						if (!hasMedia) {
							if (this.seriesEngine.dao.activeItem != null && this.seriesEngine.dao.activeItem.mediaId == id){
								return;
							}
							this.seriesEngine.dao.getMedium(id, function() {}, type);
						}
						// this.seriesEngine.dao.getComments(id, type);
					}
				}
			}
			// Add history if necessary.
			var newView = view + '/' + type + '/' + id;
			var skipHistory = !!skipHistory || this.getNavigation(null, true) == newView;
			return !skipHistory && YAHOO.util.History.navigate('loc', newView);
		},
		
		// Retrieve the current navigation location.
		getNavigation: function(navState, asString) {
			try {
				var nav = (navState || YAHOO.util.History.getCurrentState('loc') || '').split('/');
				return !!asString ? nav.join('/') : { view: nav[0] || '', type: nav[1] || '', id: nav[2] || '' };
			}
			catch(e) {
				// History manager isn't ready yet.
				return false;
			}
		},
		
		// Initialize the history manager and load initial location.
		initNavigation: function(baseView) {
			var self = this;
			
			// Determine state.
			var state = YAHOO.util.History.getBookmarkedState('loc');
			if (state) {
				state = this.getNavigation(state);
			}
			if (state && state.view == 'detail') {
				this.isDeepLink = true;
			}
			else {
				state = { view: baseView || 'gallery', type: 'init', id: '0' };	
			}
		
			// Initialize history object.
			YAHOO.util.History.register('loc', state.view+'/'+state.type+'/'+state.id, function(view) {
				var prevState = self.getNavigation(view);
				self.setNavigation(prevState.view, prevState.type, prevState.id, false);	
				
				return true;
			});
		
			// Initialize history elements.
		    try {
		        YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
		    } catch (e) {}
		    this.setNavigation(state.view, state.type, state.id, true);
		   
		},
		
		// Set custom templates.
		setTemplates: function() {
			// Custom templates as necessary.
		},
		
		// Set an active show (series).
		setShow: function(tag) {
			// Switch to the detail view.
			HD.removeClass(this.detailContainerEl, 'hasSeries');
			this.detailEl.innerHTML = detailLoadingHtml;
			this.setView('detail');
			this.seriesEngine.dao.setMetaTags(tag, null, true);
		},
		
		// Redirect to the full blog entry.
		linkToBlog: function() {
			//Add the detail info if it's not already there
			var currentURL = window.location.href;
			if (currentURL.indexOf('detail') == -1){
				currentURL += '#loc=detail/blog/' + this.engine.dao.activeItem.mediaId;
			}
			
			window.location.href = currentURL.replace('videos', 'blog');
			
		},
		
		showMemberPanel: function() {
			
			var memberEl = HD.get("memberProfile");	
			if(memberEl){
				HD.removeClass(memberEl, classes.HIDDEN);
				HD.util.Common.showOverlay(memberEl, "", 475, 350, true);
			}
		}
	};
})();

// Load the page.
HD.util.DOM.onDOMReady(function() {
	DarkCustom.init();
});

