/**
 * Hyperion
 */

var Design = {

	data: {
		init_start: false,
		inspector_open: false,
		vertical_margin: window.vertical_margin ? window.vertical_margin : 500,
		mobile_breakpoint: 600,
		use_mobile_design: true,
		use_mobile_menu: true,
		mobile_active: false,
		click_event: "click"
	},


	init: function(){

		var container_padding = parseInt($('.container').css("padding-bottom"));
		var footer_height = $('.site_footer').outerHeight(true);

		// Reset navigation if Sets and Projects are
		if ( Cargo.Model.DisplayOptions.get("use_set_links") && Cargo.Model.DisplayOptions.get("projects_in_text_nav") ) {
			Cargo.Collection.Navigation.url = Cargo.API.GetNavigationCargoPath(0, 9999);
			Cargo.Collection.Navigation.fetch({reset: true});
		}

		if ( container_padding < footer_height ){
			$('.container').css("padding-bottom", footer_height + "px" );
		}


	},


	mobileInit: function(){

		$('.navigation_toggle').bind("click.mobile dblclick.mobile", function(e){
			if ( e.type == Design.data.click_event ){
				Design.toggleNav();
			}
		});



		$(window).bind("scroll.mobile", function(){

			Design.toggleNav(true);

		});

		if ( Cargo.Helper.GetCurrentPageType() ){
			Design.setVerticalMargin();
		}

	},

	mobileUnbind: function(){
		$('.navigation_toggle').unbind("click.mobile dblclick.mobile");
		$('body').unbind("click.mobile");
		$('body').unbind("scroll.mobile");

		if ( Cargo.Helper.isIOS() ){
			$('body').css("cursor", "")
		}

		if ( Cargo.Helper.GetCurrentPageType() ){
			Design.setVerticalMargin();
		}

	},

	toggleNav: function(closeNav){

		if ( $('.navigation_toggle').is(".active") || closeNav ){

			$(".navigation, .navigation_toggle").removeClass("active");

			$('body').unbind("click.mobile");

		} else {

			$(".navigation, .navigation_toggle").addClass("active");

			if ( Cargo.Helper.isIOS() ){
				$('body').css("cursor", "pointer")
			}

			$('body').bind( "click.mobile", function(e){

				var touchtarget = $(e.target);

				if ( !touchtarget.is('.navigation, .navigation *, .mobile_site_header, .mobile_site_header *') ) {

					Design.toggleNav(true);

				}

			});

		}

	},

	calcBreakpoint: function(){

		// if we have a breakpoint from custom html, return
		if ( window.mobile_breakpoint) {
			Design.data.mobile_breakpoint = window.mobile_breakpoint;
			return;
		}

		// if no thumbnails, then we keep the default and return
		if (  $('#thumbnails .thumbnail').length == 0 ){
			return;
		}

		var thumb_width = Cargo.Model.DisplayOptions.get("thumb_size").w;

		var test_thumb, test_thumb_img, index, two_col_width, margins_padding;

		test_thumb = $('#thumbnails .thumbnail').first();
		test_thumb_img = test_thumb.find(".thumb_image img")

		// if thumb width is undefined, then measure thumbs
		if ( thumb_width == "*" ){

			if ( $('#thumbnails .thumbnail').length > 1 ){

				two_col_width = parseInt(test_thumb_img.attr("width")) + parseInt($('#thumbnails .thumbnail .thumb_image img').eq(1).attr("width"));

			} else {

				two_col_width = parseInt(test_thumb_img.attr("width"))*2;

			}

			thumb_width = two_col_width / 2;

		} else {

			// make sure that thumb_width is set to integer
			thumb_width = parseInt(thumb_width);
			two_col_width = thumb_width * 2;
		}

		// get padding & margin from first thumb
		margins_padding =  (test_thumb.outerWidth(true) - test_thumb.width())*2;

		// get padding & margin from index
		index = $('#thumbnails');

		// get padding & margin from .container
		container = $('body > .container');

		if ( thumb_width > 500){

			// Use single thumb for very large thumbnails
			Design.data.mobile_breakpoint = (index.outerWidth(true) - index.width() ) + (container.outerWidth(true) - container.width() ) + thumb_width + margins_padding;

		} else {

			Design.data.mobile_breakpoint = (index.outerWidth(true) - index.width() ) + (container.outerWidth(true) - container.width() ) + two_col_width + margins_padding;

		}


	},


	testBreakpoint: function(){

		var pages_num
		if ( Cargo.View.hasOwnProperty("Navigation")){
			pages_num = Cargo.View.Navigation.collection.length;
		} else {
			pages_num = Cargo.Collection.Pages.length;
		}

		var usable_width = $(window).width()

		var mobile_breakpoint = window.mobile_breakpoint || Design.data.mobile_breakpoint || 600;

		if ( (usable_width < mobile_breakpoint || screen.width < mobile_breakpoint) && Design.data.use_mobile_design ) {
			$('body').addClass("mobile");

			// bind on first resize
			if ( !Design.data.mobile_active && Design.data.use_mobile_menu && pages_num > 0 ){

				$('body').addClass("mobile_menu");
				Design.mobileInit();
				Design.data.mobile_active = true;

			}

			if ( pages_num < 1){

				$('body').removeClass("mobile_menu");
				Design.mobileUnbind();
				Design.data.mobile_active = false;

			}

		} else {
			$('body').removeClass("mobile");
			Design.toggleNav(true);

			// unbind on first resize
			if ( Design.data.mobile_active && Design.data.use_mobile_menu ){
				$('body').removeClass("mobile_menu");

				Design.mobileUnbind();
				Design.data.mobile_active = false;
			}

		}

	},

	scroll: {

		indexPosition : 0,

		defaultScroll : function() {
			// Configured on setup
		},

		project : function() {

			// Set the data if we were on an index page
			if ( !$('body').is('[data-pagetype]') ) {

				this.indexPosition = $(window).scrollTop();

			}

			$(window).scrollTop(0);

		},

		index : function() {

			$(window).scrollTop(this.indexPosition);

		},

		setup : function() {

			var self = this;

			// Set the default scroll event
			this.defaultScroll = Cargo.Helper.ScrollToTop;

			// Reset helper methods
			Cargo.Helper.ScrollToTop = function() {

				// Only scroll if project/page is open
				if ( Cargo.Helper.GetCurrentPageType() ){

					Design.scroll.defaultScroll();

				}

				// Close mobile nav if on Phone
				if( Design.data.mobile_active){

					Design.toggleNav(true);

				}
			};

		}

	},


	keybindings: function() {

		// Remove previous bindings
		Cargo.Core.KeyboardShortcut.Remove("Escape");
		Cargo.Core.KeyboardShortcut.Remove("Left");
		Cargo.Core.KeyboardShortcut.Remove("Right");

		Cargo.Core.KeyboardShortcut.Add("Left", 37, function() {
			Action.Project.Prev();
			return false;
		});

		Cargo.Core.KeyboardShortcut.Add("Right", 39, function() {
			Action.Project.Next();
			return false;
		});

		Cargo.Core.KeyboardShortcut.Add("Escape", 27, function() {

			// Don't go to index if lightbox is open
			if ( lightbox.isActive ){

				return;

			} else {
				Action.Project.Index();
				return;
			}

		});

	},

	formatThumbnails: function() {

		var thumbs = $("#thumbnails .thumbnail[data-formatted!='true']");



		thumbs.each(function(i) {

			if ($(this).find(".thumb_image img").attr("src") == "/_gfx/thumb_custom.gif") {
				$(this).addClass("default_thumb");
				$(this).css("max-width", "320px");
			}



			$('.thumb_info_wrapper', this).bind("click.thumb_info dblclick.thumb_info", function(e){

				if ( !$(e.target).is('a') && e.type == Design.data.click_event ){

				    Cargo.Event.trigger("add_history", $(this).closest('.thumbnail').find('a[rel="history"]').attr("href"));

				}

			});

		});

		if ( Cargo.Model.DisplayOptions.get("randomize_thumbs") ){
			thumbs.shuffle();
		}

		$("#thumbnails .thumbnail[data-formatted!='true']").attr("data-formatted", "true").css("visibility", "visible");


	},

	setVerticalMargin: function(){
		var vertical_margin,
			top_element

		if ( window.vertical_margin ){

			vertical_margin = window.vertical_margin;

		} else {

			// set vertical margin
			top_element = Cargo.View.ProjectDetail.$el.find(".project_content > *").first();

			if ( top_element.is('.slideshow') ){

				vertical_margin = top_element.find('.slideshow_container').first().offset().top;

			} else {

				vertical_margin = Cargo.View.ProjectDetail.$el.find('.project_content').offset().top;
			}

			if ( Cargo.View.ProjectDetail.$el.find('.project_content > *').not('img, iframe, div, video').length > 1){
				vertical_margin = vertical_margin + 120;
			}

			Cargo.Plugins.elementResizer.setOptions({
				forceVerticalMargin: vertical_margin
			});

		}


		if ( Design.data.vertical_margin !== vertical_margin ){
			Design.data.vertical_margin = vertical_margin
			Cargo.Plugins.elementResizer.refresh();
		}
	},


	formatNavigation: function() {

		if ( Cargo.Model.DisplayOptions.get("use_set_links") ) {

			if ( Cargo.Model.DisplayOptions.get("projects_in_text_nav") === false ) {
				$('.set_link').addClass('no_projects');
			}

			$(".set_link").each(function(i){

				if ( $(this).prev().not(".set_wrapper, .set_link.no_projects").length > 0 ) {
					$(this).addClass("first")
				}

				if ( $(this).next().not(".set_link").length > 0 ) {
					$(this).addClass("last")
				}

			})

		}

	}

};

/**
 * Events
 */

$(function() {


	// prevent double-running of init function
	if ( Design.data.init_start ){
		return
	}
	Design.data.init_start = true;
	$('body').css('visibility', 'hidden');
	Design.keybindings();

	Design.data.use_mobile_design = window.use_mobile_design !== undefined ? window.use_mobile_design : Cargo.Model.DisplayOptions.get("use_mobile_mode");
	Design.data.use_mobile_menu = window.use_mobile_menu !== undefined ? window.use_mobile_menu : Cargo.Model.DisplayOptions.get("use_mobile_menu");



	Design.calcBreakpoint();

	Design.testBreakpoint();
	Design.scroll.setup();
	Design.init();
	Design.formatNavigation();

	if ( !Cargo.Helper.IsSearch() ) {

		Design.formatThumbnails();

	}

	$('body').css('visibility', 'visible');


	Cargo.Event.on("show_index_complete", function(pid) {

		Design.scroll.index();

	});

});

resizeTimeout = null;

$(window).resize(function(){

	Design.testBreakpoint();

	if ( Cargo.Helper.isMobile() ){
		clearTimeout(resizeTimeout);
		resizeTimeout = setTimeout(function(){
			Cargo.Plugins.elementResizer.refresh();
		}, 250)
	}

});


Cargo.Event.on("slideshow_on", function(el, obj) {

	$(el).find('.slideshow_thumbnails').addClass("clear");

	$('.slideshow .video_component').each(function(){

		$(this).css({
			width: $('object', this).attr("width") + "px",
			height: $('object', this).attr("height") + "px",
			"data-elementresizer-child": "data-elementresizer-child",
		});

	});


	Cargo.Plugins.elementResizer.refresh();

	// Add classes for slideshow if nav is active
	if ( Cargo.Model.DisplayOptions.get("slide_text_nav").enabled ) {

		if ( Cargo.Model.DisplayOptions.get("slide_nav_position") == "top" ){

			el.addClass("slideshow_navigation_on_top");

		} else {

			el.addClass("slideshow_navigation_on_bottom");

		}

	}

});

Cargo.Event.on("pagination_complete", function() {

	Design.formatThumbnails();

});

Cargo.Event.on("fullscreen_destroy_hotkeys", function() {

	Design.keybindings();

});


Cargo.Event.on("project_load_start", function(pid) {


	Design.scroll.project();

});

Cargo.Event.on("element_resizer_init", function(plugin) {
	plugin.setOptions({
	    minimumHeight: 25,
	    centerElements: Cargo.Model.DisplayOptions.get("center_images"),
		adjustElementsToWindowHeight: Cargo.Model.DisplayOptions.get("scale_images"),
		forceVerticalMargin: Design.data.vertical_margin
	});
});



Cargo.Event.on("project_load_complete", function(pid) {


	if ( (Cargo.Model.DisplayOptions.get("thumbs_below_pages") && Cargo.Helper.GetCurrentPageType() == "page") ){
		$('.project_nav_wrapper').addClass("hidden");
	} else {
		$('.project_nav_wrapper').removeClass("hidden");
	}

	if ( Design.data.mobile_active ){
		Design.toggleNav(true);
	}

	if ( Cargo.View.ProjectDetail !== undefined ) {

		var imgs,
			randomImgIndex,
			bgColorString

		// setup background color
	    if ( $('#site_bg_color', Cargo.View.ProjectDetail.$el).length > 0 ){
		    bgColorString = "body { background-color: " + Cargo.Model.Project.GetBgColor() + "}";
			$('#site_bg_color', Cargo.View.ProjectDetail.$el).text(bgColorString);
	    }

		// Remove active state on Set link if thumbnails are hidden
		if ( (Cargo.Helper.GetCurrentPageType() =="page" && !Cargo.Model.DisplayOptions.get("thumbs_below_pages") && Cargo.Helper.IsOnSet()) ||	$('.splash', Cargo.View.ProjectDetail.$el).length > 0) {

			$('.set_link.active').removeClass("active");

		}

		Design.setVerticalMargin();


		// setup splash page

		if ( $('.splash', Cargo.View.ProjectDetail.$el).length > 0){

			$('#thumbnails').hide();
			Cargo.View.ProjectDetail.$el.find('.entry').hide();
			Cargo.View.ProjectDetail.$el.find(".splash img").hide();

			// select random image in the splash
			$('.splash', Cargo.View.ProjectDetail.$el).each(function(){

				Cargo.View.ProjectDetail.$el.append($(this));


				if ( $(this).is('a') && !$(this)[0].attributes.href ) {

					$(this).css("cursor", "pointer").attr("rel", "show_index");

				};

				imgs = $('img', this);

				randomImgIndex = Math.floor( Math.random() * imgs.length );

				$(this).css("background-image", "url(" + imgs.eq( randomImgIndex ).attr("src_o") + ")");

			});

		}


	}

});

Cargo.Event.on("navigation_reset", function() {
	Design.testBreakpoint();
    Design.formatNavigation();
});

Cargo.Event.on("reseed_project_complete", function(){
	Design.testBreakpoint();
	Design.formatThumbnails();
});

Cargo.Event.on("project_collection_reset", function() {
	Design.testBreakpoint();
	Design.formatThumbnails();
});

// Re-trigger start page active state after nav is reloaded
Cargo.Event.on("navigation_reset project_load_complete", function(){
    if ( $('body').is('.start_project') || Cargo.Helper.IsOnStartProject() ) {
        $('#menu_' + Cargo.Helper.GetStartProjectId() ).addClass("active");
    }
});


Cargo.Event.on("inspector_open", function() {
	Design.data.inspector_open = true;
	Design.data.click_event = "dblclick";
});


/**
 * Shuffling
 * http://css-tricks.com/snippets/jquery/shuffle-dom-elements/
 */

(function($){

	$.fn.shuffle = function() {

		var allElems = this.get(),
			getRandom = function(max) {
				return Math.floor(Math.random() * max);
			},
			shuffled = $.map(allElems, function(){
				var random = getRandom(allElems.length),
					randEl = $(allElems[random]).clone(true)[0];
				allElems.splice(random, 1);
				return randEl;
			});

		this.each(function(i){
			$(this).replaceWith($(shuffled[i]));
		});

		return $(shuffled);

	};

})(jQuery);
