window.J = jQuery;

(function($){

    function isStringEmpty(str){
        return str.search(/^[\s]*$/) != -1
    }

    function displaySpeakers(speakerData, speakersLoc, profile_link_text){

        function Speaker(speaker_data){
            this.speaker_data = speaker_data
            
            var speakerDiv = $("<div />").addClass('speaker');
            
            // setup name area
            var name_area = $("<div/>").addClass('name_area');
            var firstname = $("<div/>").addClass('firstname').text(this.speaker_data.firstname);
            var surname = $("<div/>").addClass('surname').text(this.speaker_data.surname);
            name_area.append(firstname).append(surname);

            // setup title
            if(isStringEmpty(this.speaker_data.title)){
                var title = $("<div/>");
            } else {
                var title = $("<div/>").addClass('title').text(this.speaker_data.title);            
            }
              

            
            this.profile_link = $("<div/>")
                .append($("<a/>").attr('href', this.speaker_data.url)
                        .text(profile_link_text)).addClass("profile_link").hide();

            // create image
            var image = $("<img />").attr('src', this.speaker_data.image).addClass('speaker_image');
            
            // add all to div
            speakerDiv.append(name_area).append(title).append(this.profile_link).append(image);
            
            this.speakerDiv = speakerDiv;
            
            var me = this;
            // add speakerdiv hover
            this.speakerDiv.hover(function(){
                displaySpeaker(me);
            }, function(){
                undisplaySpeakers();
            });
            
            this.speakerDiv.click(function(){
                me.click();
            });
            
        }
        
        Speaker.prototype.addSelfToDiv = function(div){
            div.append(this.speakerDiv);
        };
        
        Speaker.prototype.click = function(){
            if(this.isCurrentlyHighlighted()){
                this.sendUserToUrl();
            } else {
                displaySpeaker(this);
            }
        };
        
    
        Speaker.prototype.sendUserToUrl = function(){
            window.location = this.speaker_data.url;
        };
        
        Speaker.prototype.getDiv = function(){
            return this.speakerDiv;
        };
        
        Speaker.prototype.highlight = function(){
            this.speakerDiv.addClass('speaker_hover');
            this.profile_link.show()
        };
        

        Speaker.prototype.isCurrentlyHighlighted = function(){
            return this.speakerDiv.hasClass('speaker_hover');
        }
        
        Speaker.prototype.unhighlight = function(){
            this.speakerDiv.removeClass('speaker_hover');
            this.profile_link.hide();
        }
        
        Speaker.prototype.firstname = function(){
            return this.speaker_data.firstname;
        }
        
        
        Speaker.prototype.surname = function(){
            return this.speaker_data.surname;
        }

        Speaker.prototype.description = function(){
            return this.speaker_data.description;
        }




        // maintain a rotating list of all speakers
        // LIFO queue
        var speakers = [];
        function nextSpeaker(){
            // take speaker off of the front
            var next = speakers.shift();
            // stick him back on the back
            speakers.push(next);
            // return him to caller
            return next;   
        }

        // add a speaker to the end of the queue
        function addSpeaker(speaker){
            speakers.push(speaker);
        }

        var speakersInner = speakersLoc.find(".speakers_inner");

        function unhighlightSpeakers(){
            $.each(speakers, function(i, speaker){
                speaker.unhighlight();
            });
        }

        var pauseButtonPressed = false;

        // set up speakers info functions/boxen
        var speakerInfo = speakersLoc.find(".speaker_info");
        function displaySpeaker(speaker){
            unhighlightSpeakers();
            speaker.highlight();
            speakerInfo.find(".prompt").hide();
            
            if(isStringEmpty(speaker.firstname()) && isStringEmpty(speaker.surname())){
                speakerInfo.find(".info_only_description").show().text(speaker.description());
            } else {
                speakerInfo.find(".info").show();
                speakerInfo.find(".firstname").text(speaker.firstname());
                speakerInfo.find(".surname").text(speaker.surname());
                speakerInfo.find(".description").text(speaker.description());
            }
            speakersInner.pause();
        }

        function undisplaySpeakers(){
            unhighlightSpeakers();
            speakerInfo.find(".info").hide();
            speakerInfo.find(".info_description_only").hide();

            speakerInfo.find(".prompt").show();
            if(!pauseButtonPressed){
                speakersInner.resume();            
            }
        }

        undisplaySpeakers();

        // setup initial speakers
        for(var i = 0; i < speakerData.length; i++) {
            (function(speaker_data){
                var speaker = new Speaker(speaker_data);
                addSpeaker(speaker);
            })(speakerData[i]);
        }
        // setup initial speakers
        for(var i = 0; i < 7; i++) {
            nextSpeaker().addSelfToDiv(speakersInner);
        }
        


        var durations = [5500, 4400, 3667, 2750, 1833];
        var current_duration = 0;

        var need_to_slow = false;
        var need_to_speed = false;

        
        var percent_left = 1;
        function animateMovement(){
            speakersInner.animate({
                right: -135
            }, {
                duration: durations[current_duration],
                easing: 'linear',
                step: function(now, fx){
                    if(need_to_slow){
                        current_duration = Math.max(0, current_duration-1);
                    } else if(need_to_speed){
                        current_duration = Math.min(durations.length-1, current_duration+1);
                    }

                    if(need_to_slow || need_to_speed){
                        need_to_speed = need_to_slow = false;

                        // first of all, figure out the percentage
                        // left
                        percent_left = percent_left - (percent_left*fx.pos);

                        // need to also reset the jquery animation 
                        
                        // set the start position to the current position
                        fx.start = fx.now;
                        
                        // update the startTime to the current time
                        fx.startTime = (new Date).getTime();

                        // figure out the new duration 
                        fx.options.duration = durations[current_duration]*percent_left;
                    }
                },
                complete: function(){
                    // reset the percent left
                    percent_left = 1;


                    // this is a bug fix for safari
                    speakersInner.children().find("img").hide();                    

                    var fc = speakersInner.children(":first").detach()
                    nextSpeaker().addSelfToDiv(speakersInner);

                    // this is a bug fix for safari
                    speakersInner.children().find("img").hide();                    

                    speakersInner.css('right', '0px');
                    setTimeout(animateMovement, 0);

                    // end of safari bug fix
                    speakersInner.children().find("img").show();
                }
            });
        }

        animateMovement();
        


        function resumeIfPaused(){
            if(pauseButtonPressed){
                speakersLoc.find(".pause_resume").click();
            }
        }

        speakersLoc.find(".slow_down").click(function(){
            need_to_slow = true;
            resumeIfPaused();
            return false;
        })
        
        speakersLoc.find(".speed_up").click(function(){
            need_to_speed = true;
            resumeIfPaused();
            return false;
        })
        speakersLoc.find(".pause_resume").click(function(){
            if(pauseButtonPressed){
                speakersInner.resume();
                $(this).removeClass('paused');
                pauseButtonPressed = false;
            } else {
                speakersInner.pause();
                $(this).addClass('paused');
                pauseButtonPressed = true;
            }
            return false;
        });
    }

    


    function fetchSpeakers(filename, dom){

        $.ajax({
            type: "GET",
	        url: filename,
	        dataType: "xml",
	        success: function(xml) {
                var data = $(xml).find("speaker").map(function(i,spkr){
                    var data = {};
                    spkr = $(spkr);
                    var fields = ["firstname", "surname", "image", "title", "description", "url"];
                    $.each(fields, function(j, field){
                        data[field] = spkr.find(field).text();
                    });
                    return data;
                });
                var profile_link_text = $(xml).find('profile_link_text').text();
                displaySpeakers(data, dom, profile_link_text);
	        }
        })
    }

    window.fetchSpeakers = fetchSpeakers; 
})(jQuery);


