Array.prototype.random = function(r) {
    var i = 0, l = this.length;
    if(!r) { r = this.length; }
    else if(r > 0) { r = r % l; }
    else { i = r; r = l + r % l; }
    return this[Math.floor(r * Math.random() - i)];
};



$(document).ready(function(){
    
    $("#pageLoadingGif").fadeOut(100);
    
    // Assemble email address
    var emailAddress = "ian" + "&#64;" + "clearblock.net";
    $(".emailHolder").html(emailAddress);
    
    var currentContentBlank = true;
    var firstClick = true;
    var recentHash = "";

    // Bind events to navigation bar
    $(".nav").bind("click", function(){

	    // Make sure that page loading gif is really gone
	    $("#pageLoadingGif").fadeOut(100);

        // Get nav target data
        var pageName     = $(this).attr("name");
        var pageData     = $("#" + pageName).html();

        // If click is on currently open pane, close it
        if($("#content").html() === pageData && pageName !== "blank") {
            pageName = "blank";
            pageData = $("#" + pageName).html();
        }

        var fadeOutSpeed = (currentContentBlank ? 10 : 200);
        var fadeInSpeed  = 300;
        
        if(firstClick) {
            fadeInSpeed  = 450;
            firstClick   = false;
        }

        // Fade out old pane
        $("#content").fadeOut(fadeOutSpeed, function() {
			// Fade in new pane
            $("#content").html(pageData).fadeIn(fadeInSpeed, function(){});
        });     

        // Set flag if the pane is now blank
        currentContentBlank = (pageName === "blank") ? true : false;

        // Change location in address bar
        recentHash = (pageName === "blank") ? "" : "#/" + pageName;
        window.location.hash = recentHash;

    });

    // Detect IE 7 and below, for which background animation is problematic
	if(!($.browser.msie && $.browser.version < 8)){
		
	    // Background animation
	    var x, y, div, col,

	        // Get a random effect duration
	        rndTime = function(){
	            return (Math.random() * 2000) + 2000;
	        },

	        // Get a random target color (more likely) or gray
	        rndColor = function(){
	            return ["#200000", "#072007", "#000020", "#151515"].random();
	        },

	        // Get a random target color or gray (more likely)
	        rndGray = function(){
	            return ["#181818", "#0d0d0d", "#0b0b0b", "#121212",
	                rndColor(), rndColor(), "#000000"].random();
	        },

	        // Fade to blank
	        black = function(div) {
	            $(div).animate({ backgroundColor: "#000000" }, rndTime(), 
	            function() { color(this); });
	        },

	        // Fade to color or gray
	        color = function(div) {
	            $(div).animate({ backgroundColor: rndGray() }, rndTime(), 
	            function() { 
	                var c = Math.floor(Math.random() * 3);
	                (c == 0) ? color(this) : black(this);
	            });
	        },

	        init = function(div, col) {
	            $(div).delay(50).animate({ backgroundColor: rndGray() }, (2000 + (200 * col)), 
	            function() { 
	                color(this); 
	            });
	        };


	    // Construct all the boxes in the grid
	    for(y = 0; y < 4; y++){
	        for(x = 0; x < 5; x++){

	            col = (y * 5) + (x * 1);

	            div = $(document.createElement('div'))                  
	                .css("float",               "left")
	                .css("height",              "145px")
	                .css("width",               "146px")
	                .css("z-index",             "-100")
	                .css("position",            "absolute")
	                .css("margin-top",          ((y * 175) + 16) + "px")
	                .css("margin-left",         ((x * 178) + 32) + "px")
	                .css("background-color",    "#000000");

	            $(div).appendTo('#container');

	            init(div, col);
	        }   
	    }
	}


    // Load page from hash
    var initHash = recentHash = window.location.hash;
    if(initHash) {
        firstClick = false;
        var hash = recentHash.replace("#/", "").replace("#", "");
        $(".nav[name=" + hash + "]").click();
    };


    // Poll hash to change content if user clicks back button
    var pollHash = function() {
        if(window.location.hash === recentHash) {
            return;
        }
        recentHash = window.location.hash;

        var hash = recentHash.replace("#/", "").replace("#", "");
        if(hash === "") { hash = "blank"; }

        $(".nav[name=" + hash + "]").click();
    };
    setInterval(pollHash, 100);


	var cache = [];
    // jQ image preloader for certain recalcitrant browsers (Opera)
    var preLoadImages = function() {
        var args_len = arguments.length;
        for (var i = args_len; i--;) {
            var cacheImage = document.createElement('img');
            cacheImage.src = arguments[i];
            cache.push(cacheImage);
        }
    };
    var imgs = [];
    $("img").each(function(){
        imgs.push($(this).attr("src"));
    });
    preLoadImages(imgs);


    // Make sure that page loading gif is really gone
    $("#pageLoadingGif").fadeOut(100);




    // Google Analytics, pt. 2
    try {
        var pageTracker = _gat._getTracker("UA-8501415-2");
        pageTracker._trackPageview();
    } catch(err) {}

});

// Google Analytics, pt. 1
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));



