
/**********************************
*
* MAIN "CLASS"
*
***********************************/

var App = function(){
	var app = this;
	//this.post = null;
	this.posts = [];
	this.currentPostId = "";
	this.socialPostList = [];
	this.rev = 0;	//KEEP TRACK OF HOW MANY TIMES THE SCROLL EVENT IS TRIGGERED, TO ONLY TRIGGER CERTAIN CALC. ON rev%5==0 
	
	app.getFacebookLikes = function(link, callback){
		
		$.getJSON("https://api.facebook.com/method/fql.query?query=select like_count from link_stat where url='" + link + "'&format=json&callback=?", 
			function(result){
				if(result[0].like_count && result[0].like_count > 0){
					callback(result[0].like_count);
				} 
			});
	}
	
	app.getTwitterCount = function(link, callback){
		$.getJSON("http://urls.api.twitter.com/1/urls/count.json?url=" + link + "&callback=?", 
			function(result){ 
				if(result.count && result.count > 0){
					callback(result.count);
				}
			}
		);
	}
	
	app.addSocialButtons = function(post){
		var id = post.attr("id");
		var shareElements = post.find(".share-bubble .content"); //app.post.find(".share-elements");
		var link = post.attr("rel")
		
		var tb = new TwitterButton(link);
		shareElements.append(tb.obj);
	    
	    var gb = new GoogleButton(link);
	    shareElements.append(gb.obj);
	    gapi.plusone.go(document.getElementById(id));
	    
	    var fb = new FacebookButton(link);
	    shareElements.append(fb.obj);
	    FB.XFBML.parse(document.getElementById(id));
	    
	    app.addSocialInteractivity(post);
	    
	}
	
	app.addSocialInteractivity = function(post){
		//REMOVE LISTENERS FROM WHOLE LIST
	    $(".social-media .button a").unbind();
	    
	    //ADD HOVER EVENT
	    var bubble = post.find(".share-bubble");
	    bubble.sticky = false;
	    
	    post.find(".social-media .button a").click(function(event){
	    	bubble.sticky = !bubble.sticky;
	    	return false;	
	    });
	    
	    post.find(".social-media .button a").hover(function(event) {
	    	if(!bubble.is(":visible")){
	    		bubble.find(".content .social-button").hide();
	    		bubble.find(".content ." + $(this).attr("rel") ).show();
				bubble.show();
				bubble.offset({left: parseInt($(this).offset().left)+35, top: parseInt($(this).offset().top + ($(this).outerHeight() - bubble.outerHeight())*.5) });
	    	}
	  	}, function(event){
	  		if(bubble.is(":visible") && !bubble.sticky){
				bubble.hide();
	  		}	
	  	});
	}
	
	app.populateSocialShare = function(post){
		var id = post.attr("id");
		//ONLY ADD IF NOT ALREADY ADDED
		if(this.socialPostList.indexOf(id) < 0){
			var permalink = post.attr("rel");
			var socMedCont = post.find(".entry-utility .social-media");
			socMedCont.empty();
			
			socMedCont.append('<div class="button f-button"><a rel="f-button" href=""></a></div>');
			
			app.getFacebookLikes(permalink, function(count){
				$('<div class="counter"><span>' + count + '</span></div>').insertAfter(socMedCont.find(".f-button"));
			});
			
			socMedCont.append('<div class="button g-button"><a rel="g-button" href=""></a></div>');
			socMedCont.append('<div class="button t-button"><a rel="t-button" href=""></a></div>');
			app.getTwitterCount(permalink, function(count){
				$('<div class="counter"><span>' + count + '</span></div>').insertAfter(socMedCont.find(".t-button"));
			});
			
			var commentsCount = parseInt(post.find(".comments-link a").text());

			if(commentsCount != NaN && commentsCount > 0){
				post.find(".comments-link").addClass("score");
			}
			
			//SET TIMEOUT TO BALANCE SERVERLOAD
			setTimeout(function(){
				app.addSocialButtons(post);
			}, 1000);
			
			this.socialPostList.push(id);
		}

	};

	app.checkPos = function(){
		
		//LIMIT THE CHECKS TO MINIMIZE LOAD
  		if(app.rev%5==0){
  			$(".post").each(function(idx){
  				app.posts[idx][1] = ($(this).offset().top + $(this).outerHeight()*.5);
	  		});
	  	
  			var closest = 10000000;
  			var idx = 0;
  			var dist = NaN;
  			for(var i=0; i<app.posts.length; i++){
  				
  				//OPTIMIZE THIS, MAKE MORE ACCURATE
				dist = Math.abs($(window).scrollTop() - app.posts[i][1]);
				if(dist < closest){
					idx = i;
					closest = dist;
				}
  			}
  			
  			if(app.currentPostId != app.posts[idx][0]){
  				app.currentPostId = app.posts[idx][0];
  				var post = $("#" + app.currentPostId);
  				if(app.socialPostList.indexOf(app.posts[idx][0]) < 0){
	  				app.populateSocialShare(post);
	  			}
  				
  				//REMOVE
  				//$(".post").css("border", "none");
  				//post.css("border", "1px solid red");
  				
  				app.addSocialInteractivity(post);
  			}
  		}
  		app.rev = (app.rev+1)%1000;
	};
	
	app.init = function(){
		
  		$(".post").each(function(idx){
  			app.posts[idx] = [$(this).attr("id"), $(this).offset().top + $(this).outerHeight()*.5];
	  	});
	  	
  		$(window).scroll(function(event){
  			app.checkPos();
	  	});
	  	
	};
	
};


/**********************************
*
* TWITTER BUTTON
*
***********************************/

var TwitterButton = function(link){
	var tb = this;
	tb.obj = {};
	
	tb.create = function(link){
		tb.obj = '<div class="social-button t-button"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" data-url="' + link + '" data-via="geekinc">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>'
	}
	tb.create(link);
};


/**********************************
*
* GOOGLE BUTTON
*
***********************************/


var GoogleButton = function(link){
	var gb = this;
	gb.obj = {};
	
	gb.create = function(link){
		gb.obj = '<div class="social-button g-button"><g:plusone size="medium" href="' + link + '"></g:plusone></div>';
	}
	gb.create(link);
};


/**********************************
*
* FACEBOOK BUTTON
*
***********************************/


var FacebookButton = function(link){
	var fb = this;
	fb.obj = {};
	
	fb.create = function(link){
		fb.obj = '<div class="social-button f-button"><fb:like href="' + link + '" layout="button_count" show_faces="false" width="450" font="lucida grande"></fb:like></div>';
	}
	fb.create(link);
};


