$.AJ = function(){
    var max_y;
    var max_x;
    var max_lines = 42;
    var projects = $("#projects");
    var techsElem = $('#techs');
    
    var initProjects = function () {
        // Init project only on project page
        if ($('body').find('#projects').length < 1) {
            return;
        }

    	initTechs();
    	// Init vgrid
    	projects.vgrid({
			easing: "easeOutQuart",
			time: 400,
			delay: 20,
			fadeIn: {
				time: 500,
				delay: 50,
			}
		});
    	
    	projects.find('div div').hover(function (e) {
    		$(this).animate({opacity: 0.9}, 400);
    	}, function (e) {
    		$(this).animate({opacity: 0}, 300);
    	});
    	// Hide project full description
    	projects.find('.description').hide();

        setProjectsEvents();
    };

    var setProjectsEvents = function () {
        $(".tech").click(function(e){
            sortProjectsByTech(this);
            setSelected(this);
            return false;
        });

        $('#projects > div').click(function (event) {
            setProjectInfo(this);
            navigationJump(null, '#project');
            return false;
        });

        $('#close-project').click(function (event) {
            $('#project').hide('slow');
            navigationJump(null, '#top');
            return false;
        });
    };
    
    var initTechs = function () {
    	var techs = {};
    	$.each(projects.children(), function(index, value) {
    		var currentTechs = getTechs(value);
    		
    		$.each(currentTechs, function(index, value) {
				techs[value] = value;
    		});
    	});
    	
    	var index = 0, techsList = [];
    	$.each(techs, function(key, value) {
    		techsList[index++] = '<a href="#" class="tech">'+ key +'</a>';    		
    	});

        techsList.sort();
    	
    	techsElem.children('p').html(techsList.join(', '));
    };

    var getTechs = function (element) {
    	return $(element).attr('data-tech').split(' ');
    };
    
    var setProjectInfo = function (project) {
        var elem = $(project);
        $('.project-name').text(elem.find('h5').text());
        $('#project-desc').text(elem.find('.description').text());
        $('#project-tech').text(getTechs(project).join(', '));
        $('#project').show('slow');
        $('#git-repo a').attr('href', elem.find('h5 > a').attr('href'));
    };

    var sortProjectsByTech = function (element) {
        if ($(element).hasClass('selected')) {
            projects.children().css({opacity: 1});
            projects.children().removeClass('selected');
            return;
        }

    	var tech = $(element).text();
    	projects.vgsort(function(a, b){
			var _a = listToArray(getTechs(a));
			var _b = listToArray(getTechs(b));
			
			if (tech in _a) {
				$(a).css({opacity: 1});
                $(a).addClass('selected');
			} else {
				$(a).css({opacity: 0.7});
                $(a).removeClass('selected');
			}
			
			if (tech in _b) {
				$(b).css({opacity: 1});
                $(b).addClass('selected');
			} else {
				$(b).css({opacity: 0.7});
                $(b).removeClass('selected');
			}
			
			return (tech in _a) ? -1 : 1;
    	}, "easeInOutExpo", 300, 0);
    };

    var listToArray = function (listElem) {
    	var result = {};
    	for (var i=0; i < listElem.length; i++) {
    		result[listElem[i]] = listElem[i];
    	}
    	
    	return result;
    };
 
    var setSelected = function (selected) {
        if ($(selected).hasClass('selected')) {
            $(selected).removeClass('selected');
        } else {
            techsElem.find('a').removeClass('selected');
            $(selected).addClass('selected');
        }
    };
      
	var scrollingNav = function () {
		var window_y = 0;
		
		var fake_nav = $('#fake_nav');
		var fake_nav_orig_y = $('.content').position().top + 5;
		var fake_nav_hidden = true;
		
		var nav = $('nav.menu');
		var nav_orig_y = nav.position().top;
		var nav_visible = true;
		var nav_orig_offset = 80;
		
		var header = $('header h1');
		var header_orig_y = header.position().top;
		var header_visible = true;
		var header_orig_offset = 140;
		
		var desc = $('header h2');
		var desc_orig_y = desc.position().top;
		var desc_visible = true;
		var desc_orig_offset = 130;
		
		$(window).scroll(function(){
			window_y = $(window).scrollTop(); 

			// Fake nav
			if (window_y >= fake_nav_orig_y) {
				if (fake_nav_hidden) {
					fake_nav.addClass('fixed');
					fake_nav_hidden = false;
				}
			} else if (window_y < fake_nav_orig_y) {
				if (!fake_nav_hidden) {
					fake_nav.removeClass('fixed');
					fake_nav_hidden = true;
				}
			}
			
			// Menu
			if (window_y >= (nav_orig_y + nav_orig_offset)) {
				if (nav_visible)  {
					fake_nav.append(nav.html());
					makeAppear(fake_nav.find('ul'));
					nav_visible = false;
				}
			} else if (window_y < (nav_orig_y + nav_orig_offset)) {
				if (!nav_visible) {
					fake_nav.html('');
					nav_visible = true;
				}
			}
			
			// Header
			if (window_y >= (header_orig_y + header_orig_offset)) {
				if (header_visible)  {
					fake_nav.append(header.clone());
					makeAppear(fake_nav.find('h1'));
					header_visible = false;
				}
			} else if (window_y < (header_orig_y + header_orig_offset)) {
				if (!header_visible) {
					makeDisappear(fake_nav.find('h1'));
					fake_nav.find('h1').remove();
					header_visible = true;
				}
			}
			
			// Desc
			if (window_y >= (desc_orig_y + desc_orig_offset)) {
				if (desc_visible)  {
					fake_nav.append(desc.clone());
					makeAppear(fake_nav.find('h2'));
					desc_visible = false;
				}
			} else if (window_y < (desc_orig_y + desc_orig_offset)) {
				if (!desc_visible) {
					makeDisappear(fake_nav.find('h2'));
					fake_nav.find('h2').remove();
					desc_visible = true;
				}
			}
			
			
		}).trigger('scroll');
	};
	
	var makeAppear = function (element) {
		element.css({opacity: 0});
		element.animate({opacity: 1}, 500);
	};
	
	var makeDisappear = function (element) {
		element.animate({opacity: 0}, 500);
	}; 

	var navigationJump = function (event, anchor){
		var target = anchor || $(this).attr('href');
		
		if (target.split('#')[1] == '') {
			return;
		}
		
		$('html, body').animate({
			scrollTop: $(target).offset().top-100,
		}, 1000, function(){
			location.hash = '#/'+target.split('#')[1];
		});
	};
	
	return {
        init: function () {
            $('a[href*=#]').click(navigationJump);

            $('a.fancybox').fancybox();
            $('a.fancyframe').fancybox({type: 'iframe'});
            
            scrollingNav();
            initProjects();    
        },
    };
	
}();
			
$(document).ready(function () {
	$.AJ.init();
});


