app = {

    setSpeakerModal: function() {
        $('.open_speaker').live('click', function() {
                
            var appHeight = $(window).height();

            var a = $('#speakerModal .modal_container');
        
            var item_thumb = $(this).children('.thumbnail').html();
            var item_name = $(this).children('.name').text();
            var item_meta = $(this).siblings('.meta').text();
            var item_des = $(this).siblings('.hidden').children('p.bio').html();
            
            var talk_title = $(this).siblings('.hidden').children('span.talk_title').text();
            var talk_summary = $(this).siblings('.hidden').children('p.talk_summary').text();

            $('#speakerModal .thumbnail').empty().html(item_thumb);
            $('#speakerModal .name').text(item_name);
            $('#speakerModal .meta').text(item_meta);
            $('#speakerModal .link').html(talk_title);
            
            $('#speakerModal .talk strong').text(talk_title);
            $('#speakerModal .talk p').text(talk_summary);

            $('#speakerModal p.bio').html(item_des);

            $('#speakerModal').show();
            $('body').addClass('modal_enabled');
            a.css('top', -(a.outerHeight() / 2));
            a.css('margin-top', appHeight / 2);
            return false;
        });
        
        $('.close').live('click', function() {
            $('#speakerModal').hide();
            $('body').removeClass('modal_enabled');
            return false;
        });
        
    },
    
    setModal: function() {
        $('.open_modal').live('click', function() {
                
            var appHeight = $(window).height();

            var a = $('#modal .modal_container');
        
            var item_thumb = $(this).children('.thumbnail').html();
            var item_name = $(this).children('.name').text();
            var item_meta = $(this).siblings('.meta').text();
            var item_link = $(this).siblings('.meta').html();
            var item_des = $(this).siblings('.hidden').children('p').text();
                        
            $('#modal .thumbnail').empty().html(item_thumb);
            $('#modal .name').text(item_name);
            $('#modal .meta').text(item_meta);
            $('#modal .link').html(item_link);
            $('#modal p').text(item_des);
            
            $('#modal .link a').addClass('styled_button');
        
            a.css('top', -(a.outerHeight() / 2));
            a.css('margin-top', appHeight / 2);

            $('#modal').show();
            return false;
        });
        
        $('.close').live('click', function() {
            $('#modal').hide();
            return false;
        });
        
    },

    setDeckHeight: function() {
    
        var appHeight = $(window).height();
        
        var a = $('#panorama').outerHeight();
        var b = $('#utilities').outerHeight();
        var n = $('#footer').outerHeight();
        var w = $('#deck .left_col').outerHeight();
        var c = $('#deck .right_col');
        
        var minHeight = a + b + w + n;
                
        var adjustedHeight = appHeight - (a + b + n);
        var height = (appHeight < minHeight) ? w : adjustedHeight;
        c.height(height);    
    },
    
    animateAwards: function() {
    
        if($('body').hasClass('animatePanorama')) {
            $("body").animate({
                top: "-200px",
                }, 800 , function() {
                
                $('#panorama').animate({
                    opacity: "0.4",
                });
            });
            
        }
   
    },

    init: function() {
        app.setDeckHeight();
        app.setModal();
        app.setSpeakerModal();
        app.animateAwards();
    }

}



/******************************************************************************
 * Site Component Registry
 ******************************************************************************/

var SiteComponents = {
    list: [],
    register: function(name, members){
        var component = new SiteComponent(name, members);
        this.list.push(component);
        this[name] = component;
    },
    initialize: function(){
        $(this.list).each(function(){
            if(this.test()){
                this.initialize();
            }
        });
    },
    lookup: function(name){
        return this[name];
    }
};
function SiteComponent(name, members){
    this.name = name;

    // Members that each component must have
    this.test = function(){ return true; };
    this.initialize = function(){};
    this.finalize = function(){};

    $.extend(this, members);
}
SiteComponent.prototype.toString = function(){
    return "SiteComponent<" + this.name + ">";
};

$(document).ready(function() {
    SiteComponents.initialize();
});




/******************************************************************************
 * Register Components Used in the Site
 ******************************************************************************/

SiteComponents.register("Countdown", {
    /**
     * Only do countdown if the countdown elements are in the page
     */
    test: function(){
        return $('#days, #hours, #minutes, #seconds').length == 4;
    },

    /**
     * Kick-off countdown
     */
    initialize: function(){
        var eventDate = new Date("March 4, 2012 12:00:00 PST");

        var $days = $('#days');
        var $hours = $('#hours');
        var $minutes = $('#minutes');
        var $seconds = $('#seconds');

        /**
         * Zero-pad a given number to two-digits
         */
        function formatDoubleDigit(number){
            number = Math.floor(number);
            return number < 10 ? '0'+number : number;
        }

        /**
         * Interval function to update display with latest countdown
         */
        function updateCountdown(){
            var now = new Date();

            var remainingTime = eventDate.valueOf() - now.valueOf();
            if(remainingTime < 0){
                remainingTime = 0;
            }

            // Update the countdown display
            var x = remainingTime / 1000;
            $seconds.text(formatDoubleDigit(x % 60));
            x /= 60
            $minutes.text(formatDoubleDigit(x % 60));
            x /= 60
            $hours.text(formatDoubleDigit(x % 24));
            x /= 24
            $days.text(formatDoubleDigit(x));

            // Update countdown display again if time hasn't passed yet
            if(remainingTime > 0){
                setTimeout(updateCountdown, 1000);
            }
        }
        updateCountdown();
    }
});

$.fn.shuffle = function() {
		return this.each(function(){
		var items = $(this).children().clone(true);
		return (items.length) ? $(this).html($.shuffle(items)) : this;
	});
}

$.shuffle = function(arr) {
	for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
	return arr;
}

$.get('speakers.xml', function(d)
{

    $(d).find('speaker').each(function()
	{
        
        var $speaker = $(this),
            imageurl = $speaker.attr('imageurl'),
            name = $speaker.attr('name'),
            meta = $speaker.attr('meta'),
            linkTitle = $speaker.attr('linkTitle'),
            linkurl = $speaker.attr('linkurl'),
            talkTitle = $speaker.attr('talkTitle'),
            talkSummary = $speaker.attr('talkSummary'),
            bio = $speaker.attr('bio'),
            secondaryLinkTitle = $speaker.attr('secondaryLinkTitle'),
            secondaryURL = $speaker.attr('secondaryURL');
            
            if(secondaryLinkTitle === '') {
            
            var html = 
                '<li><a class="open_speaker" href="#"><div class="thumbnail"><span class="hover_block"></span><img src="' + imageurl + '" /></div><span class="name">'+ name +'</span></a><span class="meta"><em>'+meta+'</em> <a target="_blank" href="'+linkurl+'">'+linkTitle+'</a></span><div class="hidden"><span class="talk_title">'+talkTitle+'</span><p class="talk_summary">'+talkSummary+'</p><p class="bio"><span>'+bio+'</span> <a href="'+linkurl+'" class="styled_button" target="_blank">Visit '+linkTitle+'</a></p></div></li>';
                
            } else {
            
            var html = 
                '<li><a class="open_speaker" href="#"><div class="thumbnail"><span class="hover_block"></span><img src="' + imageurl + '" /></div><span class="name">'+ name +'</span></a><span class="meta"><em>'+meta+'</em> <a target="_blank" href="'+linkurl+'">'+linkTitle+'</a></span><div class="hidden"><span class="talk_title">'+talkTitle+'</span><p class="talk_summary">'+talkSummary+'</p><p class="bio"><span>'+bio+'</span><a href="'+secondaryURL+'" class="styled_button" target="_blank">Visit '+secondaryLinkTitle+'</a></p></div></li>';
            
            }

        $('#speakers').shuffle().append($(html));
        $('#speakersNoShuffle').append($(html));

    });
});

$.get('finalist.xml', function(d)
{

    $(d).find('category').each(function()
	{
        
        var $category = $(this),
            title = $category.find('title').text(),
            $finalist = $category.find('finalist'),
            
            id = $category.attr('id');
            
            var html = '<span class="inline_header clear"><em>Category:</em> '+title+'</span><ul id="'+id+'"></ul>';
            $('#finalist').append($(html));
            
            $finalist.each(function() {
            
                var finalistGame = $(this).attr('game'),
                    finalistName = $(this).attr('name'),
                    finalistCompany = $(this).attr('company'),
                    finalistURL = $(this).attr('url');
                            
                var finalistHTML = '<li><strong><a target="_blank" href="'+finalistURL+'">'+finalistGame+'</a></strong><span class="meta">'+finalistName+'</span><span class="game">'+finalistCompany+'</span></li>';
                
                
                $('#finalist ul#'+id).append($(finalistHTML));

            });
            

    });
});


$(document).ready(function() {
    app.init();
    
    $(window).resize( function() {
        app.init();
    });
    
    $(window).scroll( function() {
        app.init();
    });

});
