/* vars for internal debugging via console */
var _ = null;
var __ = null;

jQuery.fn.imageflow = function(options) {  

    var noop = function(){};
    var l = new logger("global");
    /*
    l.warn = noop;
    l.log = noop;
    */

var current_coverflow = null;
    var before_scroll_callback = function(overlay_element, active_image){
      //l.log("before_scroll_callback", arguments);
      active_image.onmouseover = noop;
      active_image.onmouseout = noop;      
      jQuery('#active-image-control')[0].onmouseover  = noop;
      jQuery(overlay_element)[0].style.display = 'none';
    };
    
    /**
    * jQuery mouse position helper
    */
    var mouse_within_container = function(container, mouse_position, debug){
          
          var l = new logger("mouse_within_container_debugmode");
          var _debug = (typeof debug !== "undefined") ? l.log: noop;
          
          //l.warn(parseFloat(container.parent().get(0)));
          var container_position = {
              // left: parseFloat(container.css('left')),
              // top: parseFloat(container.css('top')),
              height: 85, //container.height(),
              width: container.width(),
              offset: container.offset()
          };
          
          /**/
          if (typeof mouse_position === "function"){
              mouse_position = mouse_position();
          }
          /**/
          
          var current_mouse_position = {
              left: mouse_position.x,
              top: mouse_position.y
          };
          _debug('mouse.x=' + current_mouse_position.left + ' .y='+current_mouse_position.top);
          _debug('container-position left:'+container_position.offset.left + ' top:'+container_position.offset.top);
          _debug('container-width:'+container_position.width + ' height:'+container_position.height);
          _debug(container_position.offset.left,  current_mouse_position.left);
          _debug(current_mouse_position.left,  container_position.offset.left + container_position.width);
          _debug(container_position.offset.top,  current_mouse_position.top);
          _debug(current_mouse_position.top,  container_position.offset.top + container_position.height);  
          
          if (container_position.offset.left <= current_mouse_position.left &&
              current_mouse_position.left <= container_position.offset.left + container_position.width &&
              container_position.offset.top <= current_mouse_position.top &&
              current_mouse_position.top <= container_position.offset.top + container_position.height){
              _debug("IS WITHIN");
              return true;
          }   
          _debug("OUTSIDE");
          return false;
      };
    
    
    
    var after_scroll_callback = function(overlay_element, active_image, mouse_position){
        //l.warn("after_scroll_callback", overlay_element, active_image);
        active_image = jQuery(active_image);
        overlay_element = jQuery(overlay_element);
  
        /* fix2: show overlay, if mouse within container */
        if (mouse_within_container(active_image, mouse_position)){
            // DO NOT USE jQuery::show, as the imageflow library only uses style.display, but not visibility!
            overlay_element[0].style.display = 'block';
        }
    };
    
    var display_element_display_if_eventmouse_within_container = function(event, container, element_to_show, show_hide, outside_of_container){
        var mouse_position = ImageFlowHelpers.get_mouse_position_from_event(event);
        var new_display = show_hide ? 'block':'none';
        container = jQuery(container);
        element_to_show = jQuery(element_to_show);
          
        var container_id = container[0].id || "undefined" ;
        
        // console.warn(container[0].id, container);        
        if (typeof new_display === "undefined"){
            new_display = 'block';
        }
        
        var within = mouse_within_container(container, mouse_position);
        var log_text_within = 'inside of';
        
        if (typeof outside_of_container !== "undefined" && outside_of_container===true){
            log_text_within = 'outside of';              
            within = !within;
        }
        
        
        if (within){              
            // l.log("mouse  "  + log_text_within +  container_id + " element - setting display to " + new_display);
            // l.log("current mouse position:" + mouse_position.x + ' '  + mouse_position.y);
            element_to_show[0].style.display = new_display;
            // l.log("SUCCESS!!");
            
        } else {
              // l.log("mouse NOT " + log_text_within + " " + container_id + " element");
        }
        
    };
    
    var before_show_overlay = function(overlay_element, active_image){
        var temp = jQuery('#'+active_image.id+'-overlay').html();
        overlay_element = jQuery(overlay_element);
        overlay_element.html(temp);
    
        var active_image_mask = jQuery('#active-image-control');     
        active_image.onmouseover = function(event){
            
            // l.log("active_image.onmouseover"); 
            if (overlay_element[0].style.display === 'none'){
                display_element_display_if_eventmouse_within_container(event, active_image_mask, overlay_element, true);
            } else {
                display_element_display_if_eventmouse_within_container(event, overlay_element, overlay_element, true);
            } 

        };
        
        active_image.onmouseout = function(event){
            // l.log("active_image.onmouseout"); 
            display_element_display_if_eventmouse_within_container(event, overlay_element, overlay_element, false, true);
            
        };

        active_image_mask[0].onmouseover = function(event){
             // l.warn("active-image-control mouseover");
             if (overlay_element[0].style.display === 'block'){
                 //display_element_display_if_eventmouse_within_container(event, overlay_element, overlay_element, false, true);
             } else {
                 overlay_element[0].style.display = 'block';
             }
         };  
      
    };
    
    var init_overlay_element = function(overlay_element){
       overlay_element = jQuery(overlay_element);
  
        /**
        * new: mouseover/out functions injected via jQuery, not part of imageflow anymore
        */
        overlay_element.mouseleave(function(event){
            // l.warn("overlay_element.mouseleave");
            display_element_display_if_eventmouse_within_container(event, overlay_element, overlay_element, false, true);
        });
        jQuery('#active-image-bottom-mask')[0].onmouseover = function(event){
            // l.warn('active-image-bottom-mask mouseover');
            //l.log('bottom mask over',overlay_element[0].style.display);
            if (overlay_element[0].style.display === 'block'){
                overlay_element[0].style.display = 'none';
            }
        };
        
        var active_image_mask = jQuery('#active-image-control');
         active_image_mask.mouseleave(function(event){
             // l.warn("active-image-control mouseleave");
             display_element_display_if_eventmouse_within_container(event, overlay_element, overlay_element, false, true);
        });
    };
    
    
    var defaults = {
        /* Configuration variables */
        reflection_p:   0,           // Sets the height of the reflection in % of the source image
        focus:          10,          // Sets the numbers of images on each side of the focussed one
        slider_width:   14,          // Sets the px width of the slider div
        images_cursor:  'pointer',   // Sets the cursor type for all images default is 'default'
        slider_cursor:  'default',   // Sets the slider cursor type: try "e-resize" default is 'default'
  
        /* advanced: modification of the carousel animation */
        scale_factor:   3.2,           // bigger numbers make the whole animation smaller 2.1756 - 130
        xstep:          120,         // 'gap' between images
  
        /* Id names used in the HTML */
        imageflow:     'imageflow',  // Default is 'imageflow'
        loading:       'loading',    // Default is 'loading'
        images:        'images',     // Default is 'images'
        captions:      'captions',   // Default is 'captions'
        scrollbar:     'scrollbar',  // Default is 'scrollbar'
        slider:        'slider',     // Default is 'slider'
  
        /* show a div overlay for center image */
        overlay:       'active-image-overlay',    // Default is '' - if empty string or false no overlay is shown. if string ID of the overlay element - the overlay will be shown
        auto_display_overlay: false,              // Default is false
        overlay_delay: 0,                       //Default 500 - unit: ms - used when showing the overlay directly   
        before_show_overlay: before_show_overlay, // Default: noop
  
        /* callbacks */
        before_scroll_callback: before_scroll_callback, 
        after_scroll_callback: after_scroll_callback,
        
        /* buttons */
        previous_button: 'scroller-back',
        next_button: 'scroller-forward',
        
        scroll_to_middle_after_initial_display: true,
        
        init_overlay: init_overlay_element,
  
        coverflow_function: 'abs', // sqrt(curved coverflow) or abs(more straight)
        coverflow_function_abs: 300, //
        coverflow_function_abs_scale: 0.3
        
        
      };  
    options = jQuery.extend(defaults, options);  
    
    current_coverflow = new ImageFlow(options);
    //l.log("current_coverflow created!", current_coverflow);
    
    return current_coverflow;
    
 };