
/**
* Home page Hero spot animator
*/

var HeroCore = {
    current_slide : '',
    slides        : [],
    
    slide_start_css : {
        'slide' : { opacity : 1 }   // same as in CSS
    },
    
    slide_remove_animation : {
        'slide' : {
            params   : { opacity : 0 },
            duration : 350
        }
    },
    
    auto_slide       : true,
    user_interacting : false,
    auto_slide_delay : 11
};

/*
* initialize(e)
*/
HeroCore.initialize = function(e) {
    var slide_containers = jQuery('#core-stories-wrap #slideshowlist>li.slide').get();
    
    // only one slide. don't do anything
    if (slide_containers.length < 2)
        return;
    
    HeroCore.slides = [];
    
    jQuery('#core-stories-title-bar').append(HeroCore.create_control_buttons(slide_containers.length, 0, 1));
    
    //
    // Control Button Handlers
    //
    jQuery('#core-stories-title-bar .heroslideshowcontrols .control a').hover( HeroCore.handle_hero_interact_over, HeroCore.handle_hero_interact_out );
    
    var control_buttons = jQuery('#core-stories-title-bar .heroslideshowcontrols .control a');
    var direction_left  = 1; //jQuery(slide_body).hasClass('left');
    
    var cb_index = 0;
    var direction = 1;
    
    if (!direction_left) {
        cb_index = control_buttons.length - 1;
        direction = -1;
    }
    
    for (var j = 0; j < control_buttons.length; j++) {
        jQuery(control_buttons[j]).data('index', cb_index);
        
        jQuery(control_buttons[j]).click(HeroCore.handle_control_button_click);
        cb_index += direction;
    }
    
    // combine elements into single object for easy access
    // if some elements are missing, then the object won't be created
    for (var i = 0; i < slide_containers.length; i++) {
        
        var slide = {
            index           : i,
            slide_body      : slide_containers[i]
        };
        
        HeroCore.slides.push(slide);
    }
    
    // if none, stop here and do nothing
    if (!HeroCore.slides.length) return;
    
    // choose random first one
    HeroCore.start_random_start();
    HeroCore.updateControls();
    
    // remove all but the chosen from the dom
    for (var i = 0; i < HeroCore.slides.length; i++) {
        // remove all but the chosen one from the dom
        
        if (i != HeroCore.current_slide.index) {
            jQuery(HeroCore.slides[i].slide_body).remove();
        }
    }
    
    // add handlers to slide, as they are lost when removed from dom
    HeroCore.add_handlers_to_slide(HeroCore.current_slide.slide_body);
    jQuery(HeroCore.current_slide.slide_body).css({ visibility : 'visible' });
    
    // if only one, don't animate, and hide controls
    //if (HeroCore.slides.length == 1)
    HeroCore.auto_slideshow_begin();
}

/*
* create_control_buttons(length)
*/
HeroCore.create_control_buttons = function(length, selected, direction_left) {
    var lis = [];
    
    var number = 1;
    var direction = 1;
    
    if (!direction_left) {
        number = length;
        direction = -1;
    }
    
    for (var i = 0; i < length; i++) {
        var classname = '';
        
        lis.push('<li class="control"><a href="#"><span>' + number + '</span></a></li>');
        
        number += direction;
    }
    
    return '<ul class="heroslideshowcontrols">' + lis.join('') + '</ul>';
}

/*
* add_handlers_to_slide(length)
*/
HeroCore.add_handlers_to_slide = function(slide_body) {

    // user might be trying to click a link
    jQuery('.slidetextcontainer', slide_body).hover( HeroCore.handle_hero_interact_over, HeroCore.handle_hero_interact_out );
}
        
/*
* start_random_start()
*/
HeroCore.start_random_start = function() {

    if (HeroCore.slides.length == 1) {
        HeroCore.current_slide = HeroCore.slides[0];
        return;
    }
    
    var slides_starting_out_visible = [];
    
    for (var i = 0; i < HeroCore.slides.length; i++) {
        if (jQuery(HeroCore.slides[i].slide_body).css('visibility') != 'hidden')
            slides_starting_out_visible.push(HeroCore.slides[i]);
    }
    
    if (slides_starting_out_visible.length == 1) {
        HeroCore.current_slide = HeroCore.slides[slides_starting_out_visible[0].index];
        return;
    }
    
    var slides_array = slides_starting_out_visible.length ? slides_starting_out_visible : HeroCore.slides;
    
    // choose a random slide to on which start
    var rand_index = parseInt(Math.random() * 1000) % slides_array.length;
    
    HeroCore.current_slide = slides_array[rand_index];
}

/*
* show_slide(index)
*/
HeroCore.show_slide = function(new_slide_index) {
    var current_slide = HeroCore.current_slide;
    
    if (current_slide && (current_slide.index == new_slide_index))
        return;
    
    var new_slide = HeroCore.slides[new_slide_index];
    
    if (!new_slide)
        return;
    
    if (HeroCore.animating)
        return;
    
    /** toggle globals **/
    HeroCore.previous_slide = current_slide;
    HeroCore.current_slide  = new_slide;
    HeroCore.animating      = true;
    
    HeroCore.updateControls();
    
    // put new one under current one
    jQuery(current_slide.slide_body).before(new_slide.slide_body);
    
    jQuery(HeroCore.current_slide.slide_body).css({ visibility : 'visible' });
    
    // set elements' starting CSS so it's visible
    jQuery(new_slide.slide_body).css(HeroCore.slide_start_css['slide']);
    
    // readd handlers to slide, as they are lost when removed from dom
    HeroCore.add_handlers_to_slide(new_slide.slide_body);
    
    /**
    * Begin go-away animations
    */
    // go away
    jQuery(current_slide.slide_body).animate(
        HeroCore.slide_remove_animation['slide'].params,
        HeroCore.slide_remove_animation['slide'].duration,
        'linear',
        HeroCore._finish_showing_new_slide
    );
}

/*
* updateControls()
*/
HeroCore.updateControls = function() {
    // button highlight
    jQuery('#core-stories-title-bar .heroslideshowcontrols .control a').removeClass('selected');
    jQuery(jQuery('#core-stories-title-bar .heroslideshowcontrols .control a').get(HeroCore.current_slide.index)).addClass('selected');
}

/*
* _finish_showing_new_slide()
*/
HeroCore._finish_showing_new_slide = function(new_slide_index) {
    if (HeroCore.previous_slide) {
        jQuery(HeroCore.previous_slide.slide_body).remove();
        HeroCore.previous_slide = '';
    }
    
    HeroCore.animating = false;
}

/**
* Auto Slideshow Related Functions
*/

/*
* auto_slideshow_begin()
*/
HeroCore.auto_slideshow_begin = function() {
    if (!HeroCore.auto_slide)
        return;
    
    // already started? don't start twice
    if (HeroCore.auto_slide_interval)
        return;
    
    if (HeroCore.auto_slide_delay <= 0) HeroCore.auto_slide_delay = 4;
    
    HeroCore.auto_slide_interval = setInterval(HeroCore.auto_slideshow_show_next_slide, (HeroCore.auto_slide_delay * 1000));
}

/*
* auto_slideshow_show_next_slide()
*/
HeroCore.auto_slideshow_show_next_slide = function() {
    if (!HeroCore.auto_slide)
        return;
    
    // go slowly. don't clobber other running animation
    if (HeroCore.animating)
        return;
    
    // don't move if the user is trying to click something
    if (HeroCore.user_interacting)
        return;
    
    var next_index = (HeroCore.current_slide.index + 1) % HeroCore.slides.length;
    
    // should never happen, but make sure we're not trying to go to the same slide
    // (that would mean there is only one slide, and the slideshow would never have been started)
    if (next_index == HeroCore.current_slide_index)
        return;
    
    HeroCore.show_slide(next_index);
}

/*
* auto_slideshow_end()
*/
HeroCore.auto_slideshow_end = function() {
    HeroCore.auto_slide = false;
    
    clearInterval(HeroCore.auto_slide_interval);
    
    HeroCore.auto_slide_interval = false;
}


/**
* Handlers
*/

/*
* handle_control_button_click(e)
*/
HeroCore.handle_control_button_click = function(e) {
    var index = jQuery(this).data('index');
    
    HeroCore.auto_slideshow_end();
    
    HeroCore.user_interacting = false;
    
    HeroCore.show_slide(index);
    
    return false;
}

/*
* handle_hero_interact_over(e)
*/
HeroCore.handle_hero_interact_over = function(e) {
    HeroCore.user_interacting = true;
}

/*
* handle_hero_interact_out(e)
*/
HeroCore.handle_hero_interact_out = function(e) {
    HeroCore.user_interacting = false;
}

    
/**
* call initialize() when document is loaded
*/
jQuery(document).ready(HeroCore.initialize);
