var Core = {

	/*TODO
	 * Load HighRes Images Dynamically when nothing is being loaded
	 * Redo Tag listeners
	 * Create links in each post specific Tag
	 * Create Link to Notes
	 * Adjustable number of columns
	 * Default number of columns based on Window proportions
	 * Change Hash depending on the offset
	 * Array of last action when pressing return
	 **/
    state: {
	all	    : "all",
	author  : "author",
	tag	    : "tag",
	single  : "single"
    },

    test: '',
    COL_WIDTH: '',
    COL_MAX_WIDTH: 600,
    COL_MIN_WIDTH: 100,
    DOUBLE_COL_RATIO: 0.8,
    MIN_COLS: 5,
    GAP: 5,
    IMG_WIDTH: '',
    offset: 0,
    noLoading: false,
    currentState: null,

    //Posts
    lowerPost: null,
    righterPost: null,
	colPosts: new Object(),



    config: {
	currentHash: ''
    },
	prevIndex: 0,


    init: function(){
		clog("[CORE] (init) Initializing BLog");

		Core.COL_WIDTH =  (parseInt($('#Posts').innerWidth()) - ( (Core.MIN_COLS-1) * Core.GAP ) ) / Core.MIN_COLS;

		URL.init();
		Core.adminMode();
		Core.listeners();
		Core.checkScrolling();
    },

    //LISTENERS
	listeners: function(){

		//Hover Listeners
		$("body").on({
			mouseenter: function(){
			$(this).find(".PostInfo").stop(false,true).animate({"opacity" : 1}, 200);
			},
			mouseleave: function(){
			$(this).find(".PostInfo").stop(false,true).animate({"opacity" : 0}, 300);

			}
		}, '.Post');


		//Specifc Clikc Listeners by state
		$("body").on('click', "body[data-state='all'] .Post", function(){
			Core.loadAuthorPosts(  $(this).data().author );
		})
		$("body").on('click', "body[data-state='author'] .Post", function(){
			document.location.href = $(this).data().postUrl;
		})
		$("body").on('click', "body[data-state='tag'] .Post", function(){
			document.location.href = $(this).data().postUrl;
		})
		/*
		$("body[data-state='single']").on('click', '.Post', function(){
			//Load High Res Img
			Core.loadAuthorPosts(  $(this).data().id );
		});
		*/


	    $(document).scroll(function(){
			Core.checkScrolling();
		});
    },

    //Post Creators
    createPost: function(data, type){
		clog( data )
		var postImgUrl;
		if( Core.currentState == Core.state.single){
			postImgUrl = data.photos[0].original_size.url;
		} else {
			postImgUrl = data.photos[0].alt_sizes[1].url;
		}
		var templateVars = {
			"PostId"	: data.id,
			"PostImg"	: postImgUrl
		};
		$.tmpl( Templates.postImg , templateVars ).appendTo("#Posts");
		var post = $("#"+data.id);

		post.data().id				= data.id
		post.data().postUrl			= data.post_url;
		post.data().originalWidth   = data.photos[0].original_size.width;
		post.data().originalHeight  = data.photos[0].original_size.height;
		post.data().originalImg		= data.photos[0].original_size.url;

		Core.setPost( data.id );
		Core.setPostInfo( data );

		//Set Post listeners
    },
    setPost: function( postId ){
		var post = $("#"+postId);
		var postIndex = post.index();
		var colIndex;

		if( Core.currentState == Core.state.single){
			post.css("width", post.data().originalWidth);
			//post.css("height", post.data().originalHeight);
		} else {
			post.css("width", ($("#Posts").innerWidth() - ( (Core.MIN_COLS-1) * Core.GAP)) / Core.MIN_COLS)
			post.css("height", (post.innerWidth() * post.data().originalHeight) / post.data().originalWidth);
		}

		if( postIndex == 0){
			post.css("left", 0);
			post.css("top", 0);
			Core.colPosts[0] = post;
		}
		else if ( postIndex < Core.MIN_COLS ){
			post.css("left", Core.absRight( Core.colPosts[Core.prevIndex%Core.MIN_COLS] ) );
			Core.colPosts[postIndex%Core.MIN_COLS] = post;
		}
		else{
			var lowsetPost;
			var lowestY;
			for( var i in  Core.colPosts){
				if(i == 0){
					lowestY = Core.absTop( Core.colPosts[i] )
					lowsetPost = i;
				}
				if( Core.absTop( Core.colPosts[i] ) < lowestY){
					lowestY =  Core.absTop( Core.colPosts[i] );
					lowsetPost = i;
				}
			}
			post.css("top", Core.absTop( Core.colPosts[lowsetPost] ));
			post.css("left", Core.colPosts[lowsetPost].position().left);


			Core.colPosts[lowsetPost] = post;
		}
		
		Core.prevIndex = postIndex;




    },
    setPostInfo: function(postData){
	    var post = $("#"+postData.id);
	    var meta = post.find(".meta");
	    var tags = postData.tags;
	    var postNotes = postData.note_count;

	    for (var i = 0; i < tags.length; i++){
		    if (tags[i] == "Graphic Design" || tags[i] == "graphic design"){
			    post.find(".categories").html( '<div class="graphic">Graphic Design</div> ');
			    post.data("category", "Graphic Design");
		    }
		    else if (tags[i] == "Concept Art" || tags[i] == "concept art"){
			    post.find(".categories").html( '<div class="concept">Concept Art</div> ');
			    post.data("category", "Concept Art");
		    }
		    else if (tags[i] == "Illustration" || tags[i] == "illustration"){
			    post.find(".categories").html( '<div class="illustration">Illustration</div> ');
			    post.data("category", "Illustration");
		    }
		    else if (tags[i] == "Photography" || tags[i] == "photography"){
			    post.find(".categories").html( '<div class="photography">Photography</div> ');
			    post.data("category", "Photography");
		    } else {
			    var temp = new Array();
			    temp = tags[i].split("Author: ");
			    if( temp[0] == ""){
				    post.find(".author").text( temp[1] );
				    post.data("author", temp[1])
			    }
		    }
	    }

	    meta.html(postData.caption);
	    post.find(".notes").text( postNotes+" notes");

    },

    //LOADERS
    loadAuthorPosts: function( author ){
		Core.setState( Core.state.author );
		$("#Posts").html("");
		Ajax.getPostsbyTag("Author: "+author);
		Core.noLoading = true;
		window.location.hash = "/author/"+author;

		$(".Back").text("Go back to all images");
		$(".Back").fadeIn(500);
		$(".Back").click(function(){
			Core.loadAllPosts();
		});

    },
    loadSinglePost: function( postId ){
	Core.setState( Core.state.single );
	Ajax.getPostsbyId( postId );
	Core.noLoading = true;

	$(".Back").text("Go back to all images");
	$(".Back").fadeIn(500);
	$(".Back").click(function(){
	    document.location = "/";
	});
    },
    loadAllPosts: function(){
	$("#Posts").html("");
	Core.setState(Core.state.all);
	Ajax.getAllPosts(Core.offset);
	Core.noLoading = false;
	$(".Back").fadeOut(500);
    },


    //MISC
    adminMode: function(){
	    $(document).keydown(function(e){
	var key = e.which;
		    if( e.ctrlKey && key == "77"){ //M
			    $(".post").each(function(){
				    $(this).click(function(){
					    window.open( "http://www.tumblr.com/edit/"+ $(this).attr("id") );
				    });
			    })

		    }
	    });
    },
    checkScrolling: function(){
		var lastChild = $("#Posts").children().last()
		var bottomPos = lastChild.position().top + lastChild.outerHeight();
		var scrollPos = $(window).scrollTop();
		var windowHeight = $(window).height() * 2;

		if (scrollPos > bottomPos - windowHeight && Core.noLoading == false ){

			switch( Core.currentState ){
				case "all":
					Ajax.getAllPosts( Core.offset );
					break;
				case "author":
					break;
				case "tag":
					Ajax.getPostsbyTag (  Core.config.currentHash, Core.offset );
					break;
			}
		}
    },
    setState: function( state ){
	    Core.currentState = state;
	    $("body").attr("data-state", state)

	},

	absRight: function( obj ){
		var num = obj.position().left + obj.outerWidth();
		return num;
	},
	absTop: function( obj ){
		var num = obj.position().top + obj.outerHeight();
		return num;
	}


}

var URL = {
    path: '',
    init: function(){
	clog("[URL] (init) Inicializando URL Checker");

	//NO Tumblr URL
	if ( window.location.pathname == "/"){

	    //Check Hash
	    var hash = new Array();
	    hash = document.location.hash.split("/");

	    //Author Hash
	    if ( hash[1] == "author" ){
		var author = hash[2];
		Core.loadAuthorPosts( author )
	    }
	    //Tag Hash
	    else if( hash[1] == "tag" ){
		Core.setState(Core.state.tag);
		var tag = hash[2];
		Core.config.currentHash = tag;
		Ajax.getPostsbyTag( tag );
	    }
	    //No HASH = Get All Posts
	    else {
		Core.loadAllPosts();
	    }

	}
	//Tumblr URL
	else
	{
	    //Get Single
	    var path = new Array();
	    path = document.location.pathname.split("/");

	    if (path[1] == "post"){
		var postId = path[2];
		Core.loadSinglePost( postId );
	    }
	}
    },
    resetUrl: function(){

    }
}

var Ajax = {
    start: 0,
    amount: 50,
    baseUrl: "http://api.tumblr.com/v2/blog/bernatfortet.tumblr.com",
    apiKey: "api_key=4hPGtIdhWb99U54h5W97Rl2EhsPwONJbTk1DTisckc5aLIeWMk",
    jsonCallback: "",
    debug: true,

    init: function(){},
    getAllPosts: function(offset){
	    $.ajax({
	      url: Ajax.baseUrl+"/posts/photo?" + Ajax.apiKey + "&offset="+offset+"&jsonp=Ajax.getAllPostsCallback",
	      dataType: 'jsonp'
	    });
	    Core.offset += 20;
    },
    getPostsbyTag: function(tag, offset){
	    var url = Ajax.baseUrl+"/posts/photo?" + Ajax.apiKey + "&tag="+tag+"&offset="+offset+"&jsonp=Ajax.getPostsbyTagCallback";
	    $.ajax({
	      url: url,
	      dataType: 'jsonp'
	    });
	    Core.offset += 20;
    },
    getPostsbyId: function(postId){
	    $.ajax({
	      url: Ajax.baseUrl+"/posts/photo?" + Ajax.apiKey + "&id="+postId+"&jsonp=Ajax.getPostByIdCallback",
	      dataType: 'jsonp'
	    });
    },
    getAllPostsCallback: function(data){
		console.log(data);
		$.each(data.response.posts, function(){
			Core.createPost(this, "all");
		});
		Core.checkScrolling();
    },
    getPostsbyTagCallback: function(data){
	    clog(data.response, Ajax.debug);
	    $.each(data.response.posts, function(){
		    Core.createPost(this, "author");
	    });
		Core.checkScrolling();
    },
    getPostByIdCallback: function(data){
		clog(data, Ajax.debug);
		$("#Posts").html("");
		$.each(data.response.posts, function(){
			Core.createPost(this, "single");
		});
		Core.checkScrolling();
	}
}

var Templates = {
	postImg: '\
	  <div class="Post post" id="${PostId}">\
		<div class="post-img">\
		  <img src="${PostImg}"/>\
		</div>\
		<div class="more">\
		  <div class="more-triangle"></div>\
		  <div class="more-plus">+</div>\
		</div>\
		<div class="PostInfo post-info">\
		  <div class="author"></div>\
		  <div class="post-meta">\
			<div class="notes"></div>\
			<div class="categories"></div>\
		  </div>\
		  <div class="meta"></div>\
		</div>\
	  </div>\
	'

}

//Infinite scroll js
