/* Main page functions */

var sectionIds = ['#featured', '#news', '#work', '#about', '#contact'];
var headerHeight = 42;
var hideWorkNav = false;
var hideAboutNav = false;
var currentSection = sectionIds[0];

// A collection of YouTube video player data, organized by id
var videos = {};

//jQuery offset calculation fix for iOS 4.0+ (http://bugs.jquery.com/ticket/6446)
if( parseFloat(((/CPU.+OS ([0-9_]{3}).*AppleWebkit.*Mobile/i.exec(navigator.userAgent)) || [0,'4_2'])[1].replace('_','.')) < 4.1) {
   $.fn.Oldoffset = $.fn.offset;
   $.fn.offset = function() {
      var result = $(this).Oldoffset();
      result.top -= window.scrollY;
      result.left -= window.scrollX;

      return result;
   }
}

// document onload scripts
$(document).ready(function() {
    initHeader();
	
	$(window).scroll(function(eventData) {
	    onScrollAndResize();
	});
	
	// init each section
	initFeatured();
	initNewsSidebar();
    applyMood();  
    initWorkSection();
    initAboutSection();
    initContact();

	if(isMobile) {
		$(document.body).swipe({
		    swipe: onSwipe, 
		    allowPageScroll: "vertical",
		    threshold: 10,
		    triggerOnTouchEnd: false
		});    
	}
});

$(window).load(function() {
    // scroll to article if in URL
    scrollToArticle();
    
    //do the expensive AJAX call last, it tends to block the other http requests for images etc.
	loadTodayStats();
	
    //hide the obnoxious trackalyzer image
    $("img:last").hide();
});

$(window).resize(function() {
    onResize();
    onScrollAndResize();
});

function initHeader() {
    //add header rollover gifs
    $("#pod_logo").hover(function() {
        $(this).find("img").attr("src", "/static/images/rollover_logo.gif");
    }, function() {
        $(this).find("img").attr("src", "/static/images/header_pod_logo.png");
    });
    $("#pod_fb").hover(function() {
        $(this).find("img").attr("src", "/static/images/rollover_facebook.gif");
    }, function() {
        $(this).find("img").attr("src", "/static/images/header_fb_logo.png");
    });
    $("#pod_twit").hover(function() {
        $(this).find("img").attr("src", "/static/images/rollover_twitter.gif");
    }, function() {
        $(this).find("img").attr("src", "/static/images/header_twit_logo.png");
    });   
    
    // Unescape opengraph title tag for facebook sharing
    var ogTitle = $("meta[property='og:title']").attr("content");
    $("meta[property='og:title']").attr("content", decodeURI(ogTitle));
}

//add drawer rollovers
function addDrawerRollover() {
    $(".drawer_close").hover(function() {
        $(this).find("img").attr("src", "/static/images/icon_drawer_close_hover.png");
    }, function() {
        $(this).find("img").attr("src", "/static/images/icon_drawer_close.png");
    });
}

function scrollToSection(section, options) {
    var goTo = $.inArray(section, sectionIds);
    var current = $.inArray(currentSection, sectionIds);
    var duration = 300 * Math.abs(goTo - current);
    
    if(section != '#work') {
        $("#work_drawer").hide();
        hideWorkNav = true;
    }
    if(section != '#about') {
        $("#about_nav").hide();
        hideAboutNav = true;
    }
    scrollWindow(section, $.extend(options, {'onAfter': afterSectionScroll, 'duration': duration})); 
    return false;
}

function afterSectionScroll() {
    hideWorkNav = false;
    hideAboutNav = false;
}

function setHighlight(value) {
    currentSection = value;
    $('.nav_link div.selected').removeClass('selected');
	$('#header_link_' + value.substring(1)).addClass('selected');
}

/**
 * Called when a window is resized.  Contains custom scripts for each page section.
 */
function onResize() {   
	// featured 
	if(work !== undefined) {
        positionFeaturedItems();
    }
}

var showTimer = false;

/**
 * Called when the user scrolls and when the page is resized.
 */
function onScrollAndResize() {
    var pos = $(window).scrollTop();
	var halfWindowHeight = Math.floor($(window).height() / 2);
    
    // highlight appropriate category based on where we are on the page
	for(var i = 0; i < sectionIds.length; i++) {
	    if(i == sectionIds.length - 1) {
	        setHighlight(sectionIds[i]);
	        break;
	    }
	    var scrollThreshold = $(sectionIds[i+1]).offset().top - halfWindowHeight;
		if(pos < scrollThreshold) {
			setHighlight(sectionIds[i]);
			break;
		}
	} 
	
	if(isMobile) {
	    if (showTimer) {
            clearTimeout(showTimer);
        }
        showTimer = setTimeout( function() {
            $("#header").css({ top: pos + "px" });
        }, 175 );
	}
	
	// News section
	if(currentSection == "#news") {
        positionNewsSidebar();
    }
    if(isMobile) {
        $("#news_sidebar").show();
        $("#news_today").show();
    }
    
    // Work section
    if(!hideWorkNav) {
        positionWorkContent();
    }
    
    // About section
    if(!hideAboutNav) {
        positionAboutNav();   
    }
    
    if(currentSection == "#contact") {
        animateChandelier();
        $("#floorboard_repeat").width($(window).width() - 948);
    }
}

function openDrawer(selector, settings) {
    var drawer = $(selector);
    drawer.find(".collapsed_content").hide();
    drawer.find(".expanded_content .drawer_close").clone().appendTo(drawer);
    drawer.animate($.extend(settings, {   
        opacity: 0.9,
        filter: 'alpha(opacity=90)'
    }), function() {
        drawer.find(".expanded_content").show();
        drawer.removeClass("can_click");
        drawer.find(".drawer_close").slice(1,2).remove();
        $(document).bind('click', function(event) {
            closeDrawer(selector);
            $(document).unbind('click');
        });
        drawer.click(function(event) {
            if($(event.target)[0] != drawer.find(".drawer_close")[0]) {
                event.stopPropagation(); 
            } 
        });
        addDrawerRollover();
    });
    return false;
}
function closeDrawer(selector) {
    var drawer = $(selector);
    drawer.find(".expanded_content").hide();
    drawer.animate({   
        height: 23,
        opacity: 1.0,
        filter: 'alpha(opacity=100)'
    }, function() {
        drawer.find(".collapsed_content").show();
        drawer.addClass('can_click');
    });
    return false;
}

// Shows an overlay div, which is expected to have an img.close element within.  
// Clicking on the close image or outside of the overlay hides the overlay.
function clickOffOverlay(overlay, duration, onclose) {
    overlay.show(duration, function() {
        $(document).bind('click', function(event) {
            overlay.hide(duration, function() {
                if(onclose !== null) {
                    onclose();
                }
            });
            $(document).unbind('click');
        });
        overlay.click(function(event) {
            if($(event.target)[0] != overlay.find("img.close")[0]) {
                event.stopPropagation(); 
            } 
        });
    });
}

function scrollWindow(scrollTo, options) {
    //Have to correct for a few issues in jQuery and the scrollTo plugin
    if(isMobile) {
        var pos = $(window).scrollTop();
        var isSectionScroll = options["onAfter"] !== undefined;
        //jQuery seems to calculate the offset incorrectly for the element, so provide the position on mobile devices
        scrollTo = $(scrollTo).offset().top;
        //offset isn't applied correctly in the scrollTo plugin
        if(options["offset"]) {
            scrollTo += options["offset"];
        }
        options["onAfter"] = function() {
            if(isSectionScroll) {
                afterSectionScroll();
            }
            $("#header").css({ top: pos + "px" });
            $(window).scroll();
        }
    }
    var scrollDefaults = {
    	duration: 300,
    	easing: 'swing',
    	axis: 'y'
    };
    $.scrollTo(scrollTo, $.extend(scrollDefaults, options));
}

/* For iOS, hide stuff when swipe (scroll) begins */
function onSwipe(ev, direction, distance) {
    if(direction == "up" || direction == "down") {
        $("#header").css({ top: "-42px" });
        if(currentSection == "#news") {
            $("#news_today").hide();
            $("#news_sidebar").hide();
        }
        $("#work_drawer").hide();
        $("#about_nav").hide();
    }
}

function goToTwitter() {
    if(isMobile) {
        document.location.href="http://mobile.twitter.com/pereiraodell";
    } else {
        document.location.href="http://twitter.com/pereiraodell";
    }
    
    return false;
}

/* Video player stuff */

function onYouTubePlayerReady(playerId) {
    var currentVideo = videos[playerId];
    // Get the flash object.  JQuery selector doesn't work
    var ytPlayer = document.getElementById(currentVideo["embed"]);
    var playStarted = false;
    var ytPlayerPausePolling = false;
    
    var updatePlayerInfo = function() {
        if(!ytPlayer.getPlayerState) {
            ytPlayerPausePolling = true;
        }
        if(!ytPlayerPausePolling && ytPlayer.getPlayerState() >= 0 && ytPlayer.getPlayerState() < 3 && playStarted) {
            var pctLoaded = Math.round(ytPlayer.getVideoBytesLoaded() / ytPlayer.getVideoBytesTotal() * 100);
            $(currentVideo["wrapperSelector"]).find(".playbar .loaded").width("" + pctLoaded + "%");
            var played = Math.round(ytPlayer.getCurrentTime() / ytPlayer.getDuration() * 100);
            $(currentVideo["wrapperSelector"]).find(".playbar").slider("value", played);
        }
    }
    
    // This causes the updatePlayerInfo function to be called every 250ms to get fresh data from the player
    setInterval(updatePlayerInfo, 250);
    
    videos[playerId]["stateChangeListener"] = function(newState) {
        var container = $(currentVideo["wrapperSelector"]);
        if(newState == 1) {
           playStarted = true;

           container.find(".playbar .ui-slider-handle").css("background-image", "url('/static/images/icon_video_playbar_play.png')");
           container.find(".controls .play").attr("src", "/static/images/icon_video_pause.png");
           container.find(".controls .play").bind("click", function() {
               ytPlayer.pauseVideo();
           });
        } else {
           container.find(".playbar .ui-slider-handle").css("background-image", "url('/static/images/icon_video_playbar_pause.png')");
           container.find(".controls .play").attr("src", "/static/images/icon_video_play.png");
           container.find(".controls .play").bind("click", function() {
               ytPlayer.playVideo();
           });
        }
    };
    
    videos[playerId]["errorListener"] = function(error) {
        alert("Could not find video.  Please try again later.");
    };
    
    // Fired when the player state changes
    ytPlayer.addEventListener("onStateChange", "videos['" + playerId + "']['stateChangeListener']");
    ytPlayer.addEventListener("onError", "videos['" + playerId + "']['errorListener']");
    
    // Load an initial video into the player
    ytPlayer.cueVideoById(currentVideo["yt_id"]);
    
    var container = $(currentVideo["wrapperSelector"]);
    var containerHover = container.find(".hover");
    
    // Register controls
    container.find(".controls .play").bind("click", function() {
        ytPlayer.playVideo();
    });
    container.find(".controls .forward").bind("mousedown", function() {
        ytPlayer.seekTo(ytPlayer.getCurrentTime() + 10, true);
    });
    container.find(".controls .reverse").bind("mousedown", function() {
        ytPlayer.seekTo(ytPlayer.getCurrentTime() - 10, true);
    });
    container.find(".controls .volbar").slider({
        value: 80,
        slide: function(event, ui) {
            var volbar = container.find(".controls .volbar");
            volbar.find(".level").width(Math.round((ui.value / 100) * volbar.width()));
            ytPlayer.setVolume(ui.value);
        }
    });

    container.find(".playbar").slider({
        value: 0,
        start: function(event, ui) {
            ytPlayerPausePolling = true;
        }, 
        stop: function(event, ui) {
            ytPlayer.seekTo(Math.round(ui.value / 100 * ytPlayer.getDuration()), true);
            ytPlayerPausePolling = false;
        }
    });
    
    // Set up the hover effects
    container.hover(function() {
        if(playStarted) {
            if($(this).find("img.close").length > 0) {
                $(this).find("img.close").fadeIn();
            }
            containerHover.animate({
                height: 38
            });
        }
    }, function() {
        if(playStarted) {
            if($(this).find("img.close").length > 0) {
                $(this).find("img.close").fadeOut();
            }
            containerHover.animate({
                height: 30
            });
        }
    });
    containerHover.hover(function(event) {
        if(playStarted) {
            containerHover.animate({
                height: 62
            });
            event.stopPropagation(); 
        }
    }, function() {
        if(playStarted) {
            containerHover.animate({
                height: 38
            });
        }
    });
}
                      
