// Singleton class TooltipWindow
// This class works with special className. The tooltip content could be in your HTML page as an hidden element or
// can be retreive by an AJAX call.
//
// To work, You just need to set two class name on elements that should show tooltips
// - One to say to TooltipManager that this element must have a tooltip ('tooltip' by default)
// - Another to indicate how to find the tooltip content
//   It could be html_XXXX if tootltip content is somewhere hidden in your page, XXX must be DOM ID of this hidden element
//   It could be ajax_XXXX if tootltip content must be find by an ajax request, XXX will be the string send as id parameter to your server. 
// Check samples/tooltips/tooltip.html to see how it works
//

/*    WEBRATIO 
Modificata la proprieta' shiftX e shiftY mettendo 20 in modo che il tooltip sia visualizzato in basso a destra rispetto
alla posizione del mouse allo scatenamento dell'evento correlato. Aggiunta la proprieta' wrRequest per fare in modo che il 
tooltip venga mostrato al termine della particolare richiesta ajax che effettua WebRatio. Aggiunta la proprieta' event che 
permette di mostrare il tooltip in seguito a eventi diversi e nn soltanto con il mouseover.
*/

TooltipManager = {
  options: {cssClassName: 'tooltip', delayOver: 200, delayOut: 1000, shiftX: 0, shiftY: 0, top: 0, left:0, event: 'mouseover',
            className: 'alphacube', wrRequest:false,
            draggable: false, minimizable: false, maximizable: false, closable:true, showEffect: Element.show, hideEffect: Element.hide},
  ajaxInfo: null,
  elements: null,
  showTimer: null,
  hideTimer: null,

  // Init tooltip manager
  // parameters:
  // - cssClassName (string) : CSS class name where tooltip should be shown. 
  // - ajaxOptions  (hash)   : Ajax options for ajax tooltip. 
  //                           For examples {url: "/tooltip/get.php", options: {method: 'get'}} 
  //                           see Ajax.Request documentation for details
  //- tooltipOptions (hash)  : available keys
  //                           - delayOver: int in ms (default 10) delay before showing tooltip
  //                           - delayOut:  int in ms (default 1000) delay before hidding tooltip
  //                           - shiftX:    int in pixels (default 10) left shift of the tooltip window 
  //                           - shiftY:    int in pixels (default 10) top shift of the tooltip window 
  //                           and All window options like showEffect: Element.show, hideEffect: Element.hide to remove animation
  //                           default: {className: 'alphacube', width: 200, height: null, draggable: false, minimizable: false, maximizable: false}
  
  init: function(cssClassName, ajaxInfo, tooltipOptions) {
    TooltipManager.options = Object.extend(TooltipManager.options, tooltipOptions || {});
    cssClassName = TooltipManager.options.cssClassName || "tooltip";
    TooltipManager.ajaxInfo = ajaxInfo;
    TooltipManager.elements = $$("." + cssClassName);
    TooltipManager.elements.each(function(element) {
      element = $(element)
      var info = TooltipManager._getInfo(element);
      if (info.ajax) {
        element.ajaxId = info.id;
        element.ajaxInfo = ajaxInfo;
      }
      else {
        element.tooltipElement = $(info.id);
      }
      /* WEBRATIO
         Aggiunta l'istruzione che permette di associare l'evento all'elemento
         che deve mostrare il tooltip.
      */
      this.addEvent(element, TooltipManager.options.event);
      
    });
    Windows.addObserver(this);
  },
  
  /* WEBRATIO
     Metodo che permette di associare un evento all'elemento a cui si vuole
     associare il tooltip. 
  */
  addEvent: function(element, eventName) {
    if (eventName == 'mouseover') {
      element.observe("mouseover", TooltipManager._mouseOver);
      element.observe("mouseout", TooltipManager._mouseOut);
    } else if (eventName == 'click') {
      ////console.log("click");
      element.observe("click", TooltipManager._click);
    }
  },
  /* WEBRATIO
     Metodo che permette di creare un tooltip utilizzando la richiesta Ajax
     costruita per WebRatio. 
  */  
  addWR: function(element, tooltipElement, ajaxInfo){
    element = $(element);
    tooltipElement = $(tooltipElement);
    element.tooltipElement = tooltipElement;
    element.ajaxInfo = ajaxInfo;
    TooltipManager.options.wrRequest = true;
    this.addEvent(element, TooltipManager.options.event);    
  },
  
  addHTML: function(element, tooltipElement) {
    element = $(element);
    tooltipElement = $(tooltipElement);
    element.tooltipElement = tooltipElement;
    this.addEvent(element, TooltipManager.options.event);
  },
  
  addAjax: function(element, ajaxInfo) {
    element = $(element);
    element.ajaxInfo = ajaxInfo;
    this.addEvent(element, TooltipManager.options.event);
  },
    
  addURL: function(element, url, width, height) {
    element = $(element);
    element.url = url;
    element.frameWidth = width;
    element.frameHeight = height;
    this.addEvent(element, TooltipManager.options.event);
  },
    
  close: function() {
    if (TooltipManager.tooltipWindow)
      TooltipManager.tooltipWindow.hide();
  },
  
  preloadImages: function(path, images, extension) {
    if (!extension)
      extension = ".gif";
      
    //preload images
    $A(images).each(function(i) {
      var image = new Image(); 
      image.src= path + "/" + i + extension; 
    });
  },
  
  _showTooltip: function(element) {
    if (this.element == element)
      return;
    this.element = element;
    
    TooltipManager.showTimer = null;
    if (TooltipManager.hideTimer)
      clearTimeout(TooltipManager.hideTimer);
    
    var position = Position.cumulativeOffset(element);
    var dimension = element.getDimensions();

    if (! this.tooltipWindow){
    
    this.tooltipWindow = new Window("__tooltip__", TooltipManager.options);}
      
      
    this.tooltipWindow.hide();
    this.tooltipWindow.setLocation(position[1] + dimension.height + TooltipManager.options.shiftY, position[0] + TooltipManager.options.shiftX);
    
    /*  WEBRATIO
        Associa l'observer sull'evento desiderato 
    */
    if (TooltipManager.options.event=='mouseover') {
      Event.observe(this.tooltipWindow.element, "mouseover", function(event) {TooltipManager._tooltipOver(event, element)});
      Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
    } else if (TooltipManager.options.event=='click') {
      Event.observe(this.tooltipWindow.element, "click", function(event) {TooltipManager._tooltipClick(event, element)});
      Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
    }
    
    // Reset width/height for computation
    
    if(!TooltipManager.options.wrRequest){
        this.tooltipWindow.height = TooltipManager.options.height;
        this.tooltipWindow.width = TooltipManager.options.width;
    }
    
    var h = this.tooltipWindow.height;
    var w = this.tooltipWindow.width;
    // Ajax content
    if (element.ajaxInfo) {
      var p = element.ajaxInfo.options.parameters;
      var wrAjaxRequest = TooltipManager.options.wrRequest;
      
      var saveParam = p;
      
      // Set by CSS
      if (element.ajaxId) {
        if (p)
          p += "&id=" + element.ajaxId;
        else
          p = "id=" + element.ajaxId;
      }

      element.ajaxInfo.options.parameters = p;    
     
      element.ajaxInfo.url = element.ajaxInfo.url.replace(/&amp;/g,"&"); 
      
      if (wrAjaxRequest) {
        ////console.log(element.tooltipElement);
        var request = new Ajax.Request(element.ajaxInfo.url, {evalScripts:true, onSuccess: function(request) {
          computeRequest(request);
          
          }
        }
        );
        //console.log(element.tooltipElement);
       
        this.tooltipWindow.setContent(element.tooltipElement, true, false);
        //d = Element.getDimensions(element);
        //////console.log(d)
        this.tooltipWindow.setSize(w,h);
        
        this.tooltipWindow.show();
        
      } else {
    
        this.tooltipWindow.setAjaxContent(element.ajaxInfo.url, element.ajaxInfo.options);
        
      }
      //////console.log(this.tooltipWindow.getContent());
      element.ajaxInfo.options.parameters = saveParam;    
    } 
    // URL content
    else if (element.url) {
      this.tooltipWindow.setURL(element.url);
      this.tooltipWindow.setSize(element.frameWidth, element.frameHeight);

      // Set tooltip size
      this.tooltipWindow.height = element.frameHeight;
      this.tooltipWindow.width = element.frameWidth;
    }
    // HTML content
    else
      this.tooltipWindow.setHTMLContent(element.tooltipElement.innerHTML);

    if (!element.ajaxInfo) 
      this.tooltipWindow.show();
  },
  
  _hideTooltip: function(element) {
    if (this.tooltipWindow) {
      this.tooltipWindow.hide();
      
      this.element = null;
    }
  },
  
  _click: function (event) {
    var element = Event.element(event);
    if (event.pageY) {
			var top = event.pageY;
			var left = event.pageX;
		} else if (event.clientY) {
			// put an If here instead, ?: doesn't seem to work
			if (document.body.scrollTop > document.documentElement.scrollTop) {
				var top = event.clientY + document.body.scrollTop;
			} else {
				var top = event.clientY + document.documentElement.scrollTop;
			}

			if (document.body.scrollLeft > document.documentElement.scrollLeft) {
				var left = event.clientX + document.body.scrollLeft;
			} else {
				var left = event.clientX + document.documentElement.scrollLeft;
			}
		}
		TooltipManager.options.top = top;
		TooltipManager.options.left = left;
    //////console.log(top + " " + left);
    if (TooltipManager.showTimer) 
      clearTimeout(TooltipManager.showTimer);
    
    TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver) 
  },
  
  _mouseOver: function (event) {
    var element = Event.element(event);
    if (event.pageY) {
			var top = event.pageY;
			var left = event.pageX;
		} else if (event.clientY) {
			// put an If here instead, ?: doesn't seem to work
			if (document.body.scrollTop > document.documentElement.scrollTop) {
				var top = event.clientY + document.body.scrollTop;
			} else {
				var top = event.clientY + document.documentElement.scrollTop;
			}

			if (document.body.scrollLeft > document.documentElement.scrollLeft) {
				var left = event.clientX + document.body.scrollLeft;
			} else {
				var left = event.clientX + document.documentElement.scrollLeft;
			}
		}
		TooltipManager.options.top = top;
		TooltipManager.options.left = left;
    //////console.log(top + " " + left);
    if (TooltipManager.showTimer) 
      clearTimeout(TooltipManager.showTimer);
    
    TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver)
  },
  
  _mouseOut: function(event) {
    var element = Event.element(event);
    TooltipManager.options.top = 0;
		TooltipManager.options.left = 0;
    if (TooltipManager.showTimer) {
      clearTimeout(TooltipManager.showTimer);
      TooltipManager.showTimer = null;
      return;
    }
    if (TooltipManager.tooltipWindow)
      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
  },
  
  _tooltipClick: function(event, element) {
    ////console.log("click");
    if (TooltipManager.hideTimer) {
      clearTimeout(TooltipManager.hideTimer);
      TooltipManager.hideTimer = null;
    }
  },
  _tooltipOver: function(event, element) {
    if (TooltipManager.hideTimer) {
      clearTimeout(TooltipManager.hideTimer);
      TooltipManager.hideTimer = null;
    }
  },
  
  _tooltipOut: function(event, element) {
    if (TooltipManager.hideTimer == null)
      TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
  },
  
  _getInfo: function(element) {
    // Find html_ for static content
    var id = element.className.split(' ').detect(function(name) {return name.indexOf("html_") == 0});
    var ajax = true;
    if (id)
      ajax = false;
    else 
      // Find ajax_ for ajax content
      id = element.className.split(' ').detect(function(name) {return name.indexOf("ajax_") == 0});
    
    id = id.substr(id.indexOf('_')+1, id.length)
    return id ? {ajax: ajax, id: id} : null;
  },
  
  onBeforeShow: function(eventName, win) {
     var top = parseFloat(win.getLocation().top);
     var dim = win.element.getDimensions();


       var winWidth = dim.width;
       var winHeight = dim.height;

       
       var documentWidth = window.innerWidth || document.body.clientWidth || 0;
  
       var documentHeight = window.innerHeight || document.body.clientHeight || 0;

       
       if(this.element){
       
       var position = Position.cumulativeOffset(this.element);
       
       if ((TooltipManager.options.top + winHeight) < documentHeight || documentHeight == 0) {
         var top = TooltipManager.options.top  + TooltipManager.options.shiftY;
       } else {
         var top = TooltipManager.options.top - (TooltipManager.options.top + winHeight - documentHeight);
       }
       if ((TooltipManager.options.left + winWidth) < documentWidth || documentWidth == 0) {
         var left = TooltipManager.options.left + TooltipManager.options.shiftX;
       } else {
         var left = TooltipManager.options.left - (TooltipManager.options.left + winWidth - documentWidth);
       }
       win.setLocation(top, left)       
       
       }

     
   },

	_getPageWidth: function(){
		return window.innerWidth || document.documentElement.clientWidth || 0;
	},
	
	_getPageHeight: function(){
		return window.innerHeight || document.documentElement.clientHeight || 0;
	},

	_getScrollTop: function(){
		return document.documentElement.scrollTop || window.pageYOffset || 0;
	},

	_getScrollLeft: function(){
		return document.documentElement.scrollLeft || window.pageXOffset || 0;
	}	
};
