/*
Title:      jquery.universaleverything
Description:        
Developer:  Antenna Praxis (http://theantenna.net)
Date:       January 2010 
Version:    0.0.1
Usage:      
Notes:                  
To Do:                  
License:    All licenses held by:
            Universal Everything Ltd
            Registered in England # 0557 4344
            Registered Office - 16 / S7 1PB
*/

(function($) {
	
	var TAG_API  = API+"/tags/",
		TWIT_SHARE = '<iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?count=none&url=%LINK%" style="width:55px; height:20px;"></iframe>',
		FACE_SHARE = '<iframe src="http://www.facebook.com/plugins/like.php?href=%LINK%&amp;layout=button_count&amp;show_faces=true&amp;width=100&amp;action=like&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:21px;" allowTransparency="true"></iframe>',
		months = ["January","Februrary","March","April","May","June","July","August","September","October","November","December"];
	
	$.universaleverything = function(){}
	
	// defaults
	$.universaleverything.defaults = {
		defaultTag:'everything'
	};

	$.fn.universaleverything = function( options )
	{
		// Generic jQuery extension
		var opts = $.extend($.universaleverything.defaults, options), // defaults
			$this = this; // instance
		
		// Instance, private specific
		var $items = $('#items'),
			$temp = $('#temp'),
			$lightbox = $('#lightbox'),
			$window = $(window),
			loadmore,
			hasItems = false,
			firstLaunch,
			scrollTop = 0,
			urlParams;
		
		var parseHash = function(params)
		{
			params = params||{tag:opts.defaultTag};//{tag:urlParams.tag}; // keep old tag unless overwritten
			
			// load params from url
			var hash = location.hash.toString();
			if(hash.indexOf('/')>-1 ){
				var newParams = hash.split('/').slice(1);
				
				$.each(newParams,function(i,param){
					if(param.match(/^UE\d+/)) params.pid = param.slice(2);
					else if(this.length) params.tag = param;
				})
			}
			
			urlParams = params;
		};
		
		var initialize = function()
		{
			// hashchange events / back button
			$(window).bind( 'hashchange', function(e,params){
				
				firstLaunch = params!=undefined;
				var oldTag = urlParams? urlParams.tag : opts.defaultTag;
				
				parseHash(params);
				
				var isItem = urlParams.pid,
					isOpen = $lightbox.hasClass('open');
				
				if( isOpen && !isItem) // going from lb to index
					closeLightbox();
				else if(!isOpen && !isItem) // changing from one index to another
				{
					getItems();
					$('a[href="#/'+oldTag+'"]').removeClass('active');
					$('a[href="#/'+urlParams.tag+'"]').addClass('active');
				}
					
				else if(!isOpen && isItem) // launch lb
				{
					if(firstLaunch) getItems(); // first time: need to get items
					launchLightbox(urlParams.pid);
					
				}
					
			}).trigger('hashchange', {tag:opts.defaultTag} ); // first time
			
			
			// lightbox
			$('#lightbox-close').click(function(e){
				// firstlaunch = normal hash change
				if(!firstLaunch) 
				{
					e.preventDefault();
					window.history.go(-1);
				} 
			});
			$('#lightbox-share').click(function(e){
				e.preventDefault();
				$('#lightbox-sharenav').show();
			});
			$('#lightbox-sharenav').mouseleave(function(e){
				$('#lightbox-sharenav').hide();
			});
			
			
			// START ---------------------------------------------------------------------
			getTags();
			
			return $this;
		};
		
		
		// Get Tags ______________________________
		var getTags = $this.universaleverything.getTags = function()
		{
			//log('getting', TAG_API);
			
			$.ajax({
				   
				type: "GET",
				url: TAG_API,
				cache:true,
				dataType:'json',
				success: function(data){
					
					var $tags = $('.tags').empty();
					
					data.push(
						{"name":"Events","id":"events"}
						//,{"name":"People","id":"people"}
					);
					//data.sort(function(a,b){ return a.name > b.name; });
					
					$.each(data,function(i){
						
						var active = this.id == urlParams.tag,
							$tag = 
								$('<a class="tag" href="#/'+this.id+'" ><span>'+this.name+'</span></a>')
									.addClass(active? 'active' : '')
									.click(function(e){ // filter on tag
								
										var $this = $(this);
										
										if(!$this.hasClass('active')) // filter on this tag
										{
											$('.tag.active').removeClass('active');	
										}
										else // turn off this filter
										{
											location.hash ='#/everything';
											e.preventDefault();
										}
										
										$this.toggleClass('active');
								
									}).appendTo($tags);
									
					});
					
				},
				error: function(){
					log('getTags error',arguments);
				}
			});
			
			return $this;
		}
		
		
		// Get Items ___________________________
		var getItems = $this.universaleverything.getItems = function()
		{
			var page = 1,
				count = 0,
				$target = $('#items-wrapper').empty(),
				autoLaunch = false;
			
			hasItems = false;
			//$items.height('');
			
			$('body').unbind('callback').bind('callback',function(e,data){
				
				//$('.navigation').empty();
				$('#loader').hide();
				
				//log('pipe returned', data); 
				
				// attach new items 
				//var tag = $('a.tag.active').attr('id'), // check if filtered
				//	target = hasItems? $temp : $items;
				
				count = 0;
				
				$.each(data,function(i){

					switch(this.type){

						case 'event':
							var date = new Date(this.pubDate);
							this.niceDate = date.getDate()+' '+months[date.getMonth()]+' '+date.getFullYear();
							this.content = this.name.replace(/\//g,'<br/>').replace(/^([^>]+)<br\/>/,'<b>$1</b><br/>');
							$t = $($.tmpl('event_tmpl', this )).appendTo($target); 
							$('.hr',$t).css({width:$t.width()});
							break;
						
						// case 'person':
						// 	$t = $(tmpl('person_tmpl', this )).appendTo($target); //.click(launchLightbox)
						// 	break;
						
						default: // project
							$t = $($.tmpl('project_tmpl', this )).appendTo($target)
								//.find('a').click(launchLightbox);							
							break;
					}

					count ++;
					$t.hide().delay(count*50).show(); // anim in
					
				});
				
				// check loadmore after anim
				setTimeout(function(){
					loadmore.loadmore.bump();
				},(count*50)+200);
				
			});
			
			loadmore = $('body').loadmore({
				
				ajaxConfig:{dataType:'json', cache:true},
				
				getURL: function(data) // function to determine URL from response data
				{					
					//log('getURL',(!data || data.length ),urlParams.tag);
					return (!data || data.length)? API+"/posts/json/"+(page++)+'/'+(urlParams.tag||"") : false; // 
				},
				
				preload: function() // preload
				{
					//$('.navigation').html('Loading more...');
					$('#loader').show(); 
				},
				
				timeout: function() // timeout
				{
					//$('.navigation').html('Taking longer than usual...');
				},
				
				nomore: function() // nomore
				{
					log('nomore');
					//$('.navigation').html('No more posts');
					$('#loader').hide();
				}
				
			});
				
			return $this;
		}
		
	
		var launchLightbox = function(e)
		{
			//e.preventDefault(); // using hash
			
			if(loadmore) loadmore.loadmore.disabled = true;
			
			// store scrollTop to return on close
			scrollTop = $window.scrollTop();
			$window.scrollTop(0);
			
			// hide items to recover scrollbar
			$('body').css('overflow','hidden');
			
			$('#lightbox-container').html('<img src="'+WWW+'static/gfx/loader.gif"/>');
			$lightbox.addClass('open').css('min-height',$(window).height()).hide().fadeIn(); // .show()
			
			var url = typeof e=='string'? e:$(this).attr('rel');
			
			// load page
			setTimeout(
				function(){
					
					$.ajax({
						url: url,
						data:{ajax:true},
						dataType:'html',
						success: function(html){
							$('#content')
								//.css({marginTop:-$('#content').outerHeight(true)-10000});
								.css({height:0, visibility:"hidden", overflow:'hidden'});
							$('body').css('overflow','');
							fillLightbox(html,url);
							$('#lightbox-container').hide().fadeIn();

						}
					});
					
				},500
			
			)

		}
		
		var fillLightbox = function(html,id)
		{
			var title = $('#lightbox-container').html( html ).find('h2:first')
				.contents().filter(function(){
					return this.nodeType == 3; // Node.TEXT_NODE;
				}).text();
			
			// set share links
			$("#lightbox-share-tw").html( TWIT_SHARE.replace(/%LINK%/,escape(window.location.href)) );
			//$("#lightbox-share-fb").html( FACE_SHARE.replace(/%LINK%/, escape(window.location.href)) );
			$("#lightbox-share-fb").html( FACE_SHARE.replace(/%LINK%/, escape('http://universaleverything.com/'+id)) );
			
			// open external links in copy in new window
			$('#lightbox-container a:not([href^='+WWW+'])').attr('target','_blank');	
		}
		
		var closeLightbox = function(e){
			//e.preventDefault();
			
			// put hidden content back in place
			var $content = 
				$('#content')
					//.css({marginTop:0});
					//.css({height:'auto', overflow:'auto', visibility:'hidden'}); 
			
			// delayed due to #hash change affecting scroll
			setTimeout(function(){
				$window.scrollTop(scrollTop); 
				$lightbox
					.css({top:$window.scrollTop(),height:$window.height()}).fadeOut(function(){
						$lightbox.removeClass('open').css({top:0});
						$('#lightbox-share-tw, #lightbox-share-fb').empty();
					});
				$content.css({visibility:'visible', height:'auto', overflow:'auto'});
			},20);
			
			$('#lightbox-container').empty();
			
			// check for more content
			if(!firstLaunch){
				loadmore.loadmore.disabled = false;
				//loadmore.loadmore.bump();
			}
		}
		
		//
		return initialize();
	};
	
})(jQuery);
