﻿;(function($) {
  $.fn.gaflyoutmenu = function(options) {

  // Pull the settings if they exist. Use defaults otherwise.
  var settings = $.extend({}, $.fn.gaflyoutmenu.defaults, options);
  
  // Helper hook class used to "remember" the current active trigger.
  var hookAttr = (settings.GroupBy) ? hookAttr = settings.GroupBy : hookAttr = settings.TriggerButton;
  hookAttr = selectorToClass(hookAttr + 'Hook');
  // Global var for storing Flyout burn through items.
  var offenders = [];
  
  // Reattach the menu to avoid any css overrides
  $(settings.Flyout).detach().appendTo("body");
        
    if (settings.MenuBehaviour) {      
      $(settings.TriggerButton).bind('mouseenter', showFlyoutAndReposition);         
    }
    else {
      $(this).bind('click', function(){
        var trigger = $(this);
        menuFlyOut(trigger); 
      });
    }
    
    function showFlyoutAndReposition() {
      var trigger = $(this);
      showFlyout(trigger); 
      var anchor = (settings.FlyoutPositionAnchor) ? anchor = settings.FlyoutPositionAnchor : anchor = trigger;
      repositionFlyout(anchor);
      hideBurnThroughs();
    }
    
    function menuFlyOut(trigger) {
      $(document).unbind('click', hideFlyout);
      if ($(trigger).hasClass(hookAttr)) {
        hideFlyout();        
      }
      else {
        showFlyout(trigger);
        var anchor = (settings.FlyoutPositionAnchor) ? anchor = settings.FlyoutPositionAnchor : anchor = trigger;
        repositionFlyout(anchor);
      } 
    }
    
    $(settings.FlyoutCloseButton).click(function(){       
      hideFlyout();
    });
    
    $(settings.Flyout).click(function(e) {
      if (!e) var e = window.event;
      e.cancelBubble = true;
      if (e.stopPropagation) e.stopPropagation();
    });
    
    function showFlyout(trigger) { 
      $(settings.TriggerButton).removeClass(hookAttr);
      $(settings.GroupBy).removeClass(hookAttr);
      $(trigger).addClass(hookAttr);
      $(settings.Flyout).fadeIn(settings.ShowHideSpeed);            
      var ON = selectorToClass(settings.TriggerButtonOnStateClass);
      var OFF = selectorToClass(settings.TriggerButtonOffStateClass);  
      $(settings.TriggerButton).removeClass(ON).addClass(OFF);               
      $(trigger).removeClass(OFF).addClass(ON);         
      setTimeout(function() { // Delay for Mozilla
        if (settings.MenuBehaviour) {                   
          $(settings.TriggerButton).unbind('mouseenter', showFlyoutAndReposition);           
          $(settings.Flyout).bind('mouseleave', hideFlyoutAfterTime);
          $(document).bind('click', hideFlyout);                         
        }
        else
          $(document).bind('click', hideFlyout);
          
      }, 1);
      // hideBurnThroughs();
    }
    
    function hideFlyoutAfterTime() {
      setTimeout(hideFlyout, 100);
    }
       
    function hideFlyout(e) {      
      $(settings.TriggerButton).removeClass(hookAttr);  
      $(settings.Flyout).fadeOut(settings.ShowHideSpeed);
      var ON = selectorToClass(settings.TriggerButtonOnStateClass);
      var OFF = selectorToClass(settings.TriggerButtonOffStateClass);
      $(settings.TriggerButton).removeClass(ON).addClass(OFF);
      
      if (settings.MenuBehaviour) {                
        $(settings.Flyout).unbind('mouseleave', hideFlyoutAfterTime);      
        setTimeout(function() { // Delay for Mozilla
          $(settings.TriggerButton).bind('mouseenter', showFlyoutAndReposition);
          $(settings.TriggerButton).bind('click', showFlyoutAndReposition);
          $(document).unbind('click', hideFlyout);          
        }, 100);                                 
      }
      else
        $(document).unbind('click', hideFlyout);
      
      showBurnThroughs();
    }
    
    function repositionFlyout(anchor) {
      var position = $(anchor).offset();
      var anchorHeight = $(anchor).innerHeight();
      var anchorWidth = $(anchor).width();
      $(settings.Flyout).css("left", (position.left + settings.FlyoutPositionLeft) + "px").css("top", (position.top + settings.FlyoutPositionTop + anchorHeight) + "px");
    }
   
    function settleButton(trigger) {
      var ON = selectorToClass(settings.TriggerButtonOnStateClass);
      var OFF = selectorToClass(settings.TriggerButtonOffStateClass);
      if ($(settings.Flyout).is(':visible')) {       
        $(settings.TriggerButton).removeClass(OFF).addClass(ON);
      } 
      else {  
        $(settings.TriggerButton).removeClass(ON).addClass(OFF);
      }
    }
    
    function hideBurnThroughs() {     
                  
      //make shure that flashes are in wmode=transparent
      if (!window.fixed_flashes) {            
        setTimeout(fix_wmode_transparent_swf, 10);
        window.fixed_flashes = true;
      }
                  
      $("iframe").each(function() { offenders.push($(this)) });            
      $("div.advert").each(function() { offenders.push($(this)) });
                  
      if($.browser.msie && $.browser.version == "6.0"){
    	$("select").each(function() { offenders.push($(this)) });
      } else {
    	// Other offending stuff will go here;
      }

      $.each(offenders, function(i) {        
        if (detectCollision(this, settings.Flyout)) {            
          $(this).css("visibility",("hidden"));
        };
      });
      
      //put flyout to the top
      $(settings.Flyout).css("z-index", 1000);
    } 
    
    function showBurnThroughs() {
      $.each(offenders, function(i) {
	    $(this).css("visibility",("visible"));
      });
      offenders = [];   
    } 
    
    function detectCollision(item, Flyout) {      
        var fx1 = Math.round($(Flyout).offset().left); 
        var fx2 = Math.round(fx1 + $(Flyout).width());
        var fy1 = Math.round($(Flyout).offset().top);
        var fy2 = Math.round(fy1 + $(Flyout).height());  
        var ix1 = Math.round(item.offset().left);
        var ix2 = Math.round(ix1 + item.width());
        var iy1 = Math.round(item.offset().top);
        var iy2 = Math.round(iy1 + item.height());
        var iw = item.width();
        var ih = item.height();
           
        // Test for overlap       
        if ((fx1 <= ix2 && fx2 >= ix1) && (fy1 <= iy2 && fy2 >= iy1)) {
      	  return true;
        } else {
          return false;
        }
      }      
    
    function selectorToClass(item) {
      return item.replace('#', '').replace('.', '');     
    }
    
    function fix_wmode_transparent_swf() {    	
    
    	// For Internet Explorer
    	$("object").each(function (i) {
    	
    	var algo = $(this).context.attributes;
    	var str_tag = '<OBJECT ';
    	
    	for (var i=0; i < algo.length; i++)		
    		str_tag += algo[i].name + '="' + algo[i].value + '" ';	
    	
    	str_tag += '>';
    	
    	var flag = false;
    	
    	$(this).children().each(function (elem) {
    		if ($(this).attr("NAME") == "wmode") {
    			flag=true;
    			str_tag += '<PARAM NAME="' + $(this).attr("NAME") + '" VALUE="transparent">';		
    		}
    		else  
    			str_tag += '<PARAM NAME="' + $(this).attr("NAME") + '" VALUE="' + $(this).attr("VALUE") + '">';						
    	});
    	
    	if(!flag)
    		str_tag += '<PARAM NAME="wmode" VALUE="transparent">';		
    	
    	str_tag += '</OBJECT>';
    	
    	$(str_tag).insertAfter(this);
    	$(this).remove();	
    	} );	
    	
    	// For Firefox Browser
    	$("embed").attr("wmode",'transparent');
    	$("embed").each(function(i) {
    		$(this).clone().insertAfter(this);
    		$(this).remove();
    	});	
    }
      
    $(settings.Flyout + " a").click(function(){
      hideFlyout();    
      if (!settings.linksWork) {       
        $(settings.TriggerButton).html($(this).html());
        return false;
      }      
      return true;
    });    
        
    jQuery.extend( {
    hideMenuFlyout: function() { 
      hideFlyout();      
    }
  });

  }; 
  
  $.fn.gaflyoutmenu.defaults = {
      Flyout: ".fmnu3",
      FlyoutCloseButton: ".fmnu-close",
      FlyoutPositionTop: 15,
      FlyoutPositionLeft: 10,
      FlyoutPositionAnchor: "",      
      TriggerButton: ".fbtn",
      TriggerButtonOffStateClass: ".fbtnoff",
      TriggerButtonOnStateClass: ".fbtnon",
      ShowHideSpeed: 120,
      GroupBy: "",
      linksWork: false,
      MenuBehaviour: false      
  };
})(jQuery);


