/*
    ###########################################  
    #####Author:Adrian Statescu Dumitru########
    ###########################################  
         Project: plugin showtitle
    ###########################################      
*/
//ShowTitle OBJECT

var toolTip = Class.create();

toolTip.prototype = {

         initialize: function(el,options)
                     {
                      this.el = $(el); 
                      this.initialized = false;                      
                      this.setOptions(options);  

                      //event handlers
                      this.showEvent = this.show.bindAsEventListener(this);
                      this.hideEvent = this.hide.bindAsEventListener(this);
                      this.updateEvent = this.update.bindAsEventListener(this);

                      Event.observe(this.el,'mouseover',this.showEvent);
                      Event.observe(this.el,'mouseout',this.hideEvent);
                       

                      //removing title DOM element to avoid showing it
                      this.content = this.el.title;
                      this.el.title = "";

                      //if descendant elements has 'alt' attribute defined clear it
                        this.el.descendants().each(function(el){ if(Element.readAttribute(el,'alt')) el.alt=""; });   
 
                     },//end initialize

         setOptions: function(options)
                     {
                       
                      this.options = {
                                      //default background color
                                       backgroundColor: '#999',

                                      //default border color
                                       borderColor: '#666',    
                                      
                                      //default text color
                                        textColor: '',
 
                                      //default text shadow color
                                        textShadowColor: '',
                                       
                                      //default toolhelp width
                                         maxWidth: 150,

                                      //default align
                                         align: 'left',

                                      //default delay before toolhelp appear in ms
                                         delay: 250,

                                      //Toolhelp follows the mouse moving
                                         mouseFollow: true,

                                       //default opacity
                                         opacity: .75,

                                       //default appear duration in sec
                                         appearDuration: .25,

                                       //default dissappear duration in sec   
                                         hideDuration: .25 
                        
                                       }; 

                        Object.extend(this.options,options || {}); 

                     },//end setOptions

          show: function(e) 
                    {

                      this.xCord = Event.pointerX(e);
                      this.yCord = Event.pointerY(e);
                      
                      if(!this.initialized) this.timeout = window.setTimeout(this.appear.bind(this),this.options.delay);

                    },//end show

          hide: function(e)
                    {

                    if(this.initialized)
                        { 
                          this.appearingFX.cancel();
                               if(this.options.mouseFollow) Event.stopObserving(this.el,"mousemove",this.updateEvent)
                               new Effect.Fade(this.tooltip, {duration: this.options.hideDuration, afterFinish: function() { Element.remove(this.tooltip) }.bind(this) });
                        }

 
                      this.initialized = false;

                      this._clearTimeout(this.timeout);
                    },//end hide

          update: function(e)
                   {
                     this.xCord = Event.pointerX(e);
                     this.yCord = Event.pointerY(e);
                     this.setup(); 
                   },
  
          appear: function()
                    {  

                        //building toolhelp container
                        this.tooltip = Builder.node("div", {className: "tooltip", style: "display: none;" }, [

			Builder.node("div", {className:"xtop"}, [
				Builder.node("div", {className:"xb1", style:"background-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb2", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb3", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb4", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"})
			]),
			Builder.node("div", {className: "xboxcontent", style: "background-color:" + this.options.backgroundColor + 
				"; border-color:" + this.options.borderColor + 
				((this.options.textColor != '') ? "; color:" + this.options.textColor : "") + 
				((this.options.textShadowColor != '') ? "; text-shadow:2px 2px 0" + this.options.textShadowColor + ";" : "")}, this.content), 
			Builder.node("div", {className:"xbottom"}, [
				Builder.node("div", {className:"xb4", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb3", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb2", style: "background-color:" + this.options.backgroundColor + "; border-color:" + this.options.borderColor + ";"}),
				Builder.node("div", {className:"xb1", style:"background-color:" + this.options.borderColor + ";"})
			 ]),
		        ]); 

                        document.body.insertBefore(this.tooltip,document.body.childNodes[0]);  

                        Element.extend(this.tooltip);

                        this.options.width = this.tooltip.getWidth();
                        this.tooltip.style.width = this.options.width + 'px';  
                      
                        this.setup();

                        if(this.options.mouseFollow) Event.observe(this.el,'mousemove',this.updateEvent);
                                                            
                        this.initialized = true;

                        this.appearingFX = new Effect.Appear(this.tooltip, {duration: this.options.appearDuration, to: this.options.opacity });


                      },  //end appear

           setup: function()
                      {
                        //if content width is more then allowed max width set width to max
                         if(this.options.width > this.options.maxWidth)  
                           {
                             this.options.width = this.options.maxWidth;
                             this.tooltip.style.width = this.options.width + 'px';

                           } 

                         //tooltip doesn t fit the current document dimensions                          
                           if(this.xCord + this.options.width >= Element.getWidth(document.body))  
                                  {
                                   this.options.align = "right";
                                   this.xCord = this.xCord - this.options.width + 20;  
                                  }

                         this.tooltip.style.left = this.xCord - 7 +"px";
                         this.tooltip.style.top = this.yCord + 12 +"px";
                       
                      },

             _clearTimeout: function(timer)
                     {
                      clearTimeout(timer);
                      clearInterval(timer); 
                      return null; 
                     }  


};//end class
