var projectSlideshow = function () {
    var stage, on_deck, active, slides, current, slideshow_container, slide_indicator, is_animating, stage_width;
    var current = 0;
    var speed = 300;
    var user_has_advanced = false;
    
    var init = function (container) {
        slideshow_container = container;
        slide_indicator = $('.slide-indicator');
        hide_slides(container);
        slideshow_container.append('<div id="slideshow_stage"><div id="slideshow_on_deck"></div><div id="slideshow_active"></div>');
        stage = $('#slideshow_stage');
        on_deck = $('#slideshow_on_deck');
        active = $('#slideshow_active');
        stage.css({
            position: 'relative',
            overflow: 'hidden',
            'z-index': '10'
        });
        on_deck.css({
            position: 'absolute',
            top: 0,
            left: 0,
            overflow: 'hidden'
        });
        active.css({
            position: 'absolute',
            top: 0,
            left: 0,
            overflow: 'hidden'
        });
        stage_width = parseInt(slideshow_container.width());
        slides = $('li', container);
        load_slide(active, 0);
        $('img', get_slide(0)).load(function () {
            stage.css({
                height: slide_height(0)
            })
            slideshow_container.removeClass('loading')
        });
        if (is_vimeo_video(0)) {
            append_vimeo_video(0);
            stage.css({
                height: slide_height(0)
            })
        }
        $('#space_holder').remove();
        bind_forward_next();
        bind_mousemove();
        bind_arrow_keys();
        
        var activeIndex = slide_indicator.find('li').get(0);
        $(activeIndex).addClass('active');
        slide_indicator.find('li').click(function(e) {
            go_to_slide($(this).index());
        });
    }
    var get_vimeo_height = function() {
      var video_height = 523
      if (stage_width <= 300) {
        video_height = 169
      } else if (stage_width <= 460) {
        video_height = 259
      } else if (stage_width <= 710) {
        video_height = 394
      }
      return video_height
    }
    var append_vimeo_video = function(slide_number) {
        slideshow_container.addClass('loading')
        id = $(get_slide_html(slide_number)).attr('id')
        var video_height = get_vimeo_height()
        vid = $('<iframe class="vimeo_frame" src="http://player.vimeo.com/video/' + id +
                '?title=0&portrait=0&autoplay=0&byline=0" frameborder="0" width="' + stage_width +
                '" height="' + video_height + '"></iframe>')
        vid.load(function() { slideshow_container.removeClass('loading') })
        active.find('.vimeo').append(vid)
    }
    var bind_arrow_keys = function() {
        $(document).keydown(function(e) {
            if (e.keyCode == 37) {
                go_to_previous_slide()
                return false
            } else if (e.keyCode == 39) {
                go_to_next_slide()
                return false
            }
        })
    }
    var is_slide_a_video = function (slide_number) {
        return $('.video_slide', $(get_slide_html(slide_number)).parent()).size() == true || $(get_slide_html(slide_number)).hasClass('video_slide')
    }
    var is_vimeo_video = function(slide_number) {
        return $(get_slide_html(slide_number)).hasClass('vimeo')
    }
    var bind_mousemove = function () {
        stage.mousemove(function (e) {
            $(this).css('cursor', 'pointer')
        })
        stage.hover(function (e) {
        
        })
    }
    var bind_forward_next = function () {
        stage.click(function (e) {
            width = active.find('img').width()
            offsetleft = e.pageX - $(this).offset().left
            offsettop = e.pageY - $(this).offset().top
            slideheight = slide_height(current)
            if (is_slide_a_video(current) && (offsettop > slideheight)) {} else {
                if (offsetleft > (width / 2)) {
                    go_to_next_slide()
                }
                else {
                    go_to_previous_slide()
                }
            }
        })
    }
    var hide_slides = function (container) {
        $('ul', container).css({
            height: 0,
            width: 0,
            overflow: 'hidden'
        });
    }
    var go_to_next_slide = function () {
        if (current + 1 >= num_slides()) {
            go_to_slide(0);
        } else {
            go_to_slide(current + 1)
        }
    }
    var go_to_previous_slide = function () {
        if (current === 0) {
            go_to_slide(num_slides() - 1)
        } else {
            go_to_slide(current - 1)
        }
    }
    var can_go_back = function () {
        return (current > 0);
    }
    var num_slides = function () {
        return slides.size();
    }
    var go_to_slide = function (slide_number) {
        if (!is_animating) {
            is_animating = !is_animating
            current_height = slide_height(current)
            next_height = slide_height(slide_number)
            load_slide(on_deck, slide_number)
            if (current_height > next_height) {
                stage.stop().animate({
                    height: next_height
                },
                speed, function () {
                    active.css({
                        height: next_height
                    })
                    active.fadeOut(speed, function () {
                        batter_up(slide_number)
                        load_video_if_necessary(slide_number)
                        is_animating = false
                    })
                })
            } else {
                on_deck.css({
                    height: current_height
                })
                active.fadeOut(speed, function () {
                    on_deck.css({
                        height: next_height
                    })
                    stage.stop().animate({
                        height: next_height
                    },
                    speed, function () {
                        batter_up(slide_number)
                        load_video_if_necessary(slide_number)
                        is_animating = false
                    })
                })
            }
            var prevIndex = slide_indicator.find('li').get(current)
            var nextIndex = slide_indicator.find('li').get(slide_number)
            $(prevIndex).removeClass('active')
            $(nextIndex).addClass('active')    
            current = slide_number
        }
    }
    var load_video_if_necessary = function (slide_number) {
        if (is_slide_a_video(slide_number)) {
            if (is_vimeo_video(slide_number)) {
                append_vimeo_video(slide_number)
            } else {
                video_path = $('#slideshow_active .vid_url').html()
                id = $('#slideshow_active .video_slide .flashcontent').attr('id')
                $('#slideshow_active .video_slide .flashcontent').flash({
                    swf: '/assets/swf/detail_player.swf',
                    width: '705',
                    height: '396',
                    params: {
                        wmode: 'transparent'
                    },
                    data: '/assets/swf/detail_player.swf',
                    flashvars: {
                        flvPath: video_path,
                        imgPath: $('#slideshow_active img').attr('src')
                    }
                })
            }
        } else {
            return 0;
        }
    }
    var batter_up = function (slide_number) {
        hite = slide_height(slide_number);
        load_slide(active, slide_number);
        active.show();
        active.css({
            height: hite
        });
        on_deck.css({
            height: hite
        });
    }
    var slide_height = function (slide_number) {
        if (is_slide_a_video(slide_number)) {
            var video_height = get_vimeo_height();
            height = is_vimeo_video(slide_number) ? video_height : 395;
        } else {
            height = get_slide(slide_number).height();
        }
        return height;
    }
    var load_slide = function (cont, slide_number) {
        cont.html(get_slide_html(slide_number));
    }
    var get_slide_html = function (slide_number) {
        return $(slides[slide_number]).html();
    }
    var get_slide = function (slide_number) {
        return $(slides[slide_number]);
    }
    return {
        init: init
    }
}();
