/**********/
/* Scroll */
/**********/
// Déclaration du plugin
(function ($)
{
  $.fn.scroll = function (options)
  {
    debug ('nb objet(s) : ' + this.size ());
    
    // On écrase les options par défaut si ils sont surchargées en paramètre
    var opts = $.extend ({}, $.fn.scroll.defaults, options);
    
    // On parcours tous les objets
    return this.each (function ()
    {
      var $this = $ (this);
      
      // interval pour l'animation
      var interval;
      
      // On écrase les options par défaut si ils sont surchargées pour cet objet
      var o = $.extend ({}, opts);
      o = $this.attr ('sens') ? $.extend (o, { 'sens' : $this.attr ('sens')}) : o;
      o = (!isNaN(parseInt ($this.attr ('step')))) ? $.extend (o, { 'step' : parseInt ($this.attr ('step'))}) : o;
      o = (!isNaN(parseInt ($this.attr ('vitesse')))) ? $.extend (o, { 'vitesse' : parseInt ($this.attr ('vitesse'))}) : o;
      o = $this.attr ('width') ? $.extend (o, { 'width' : $this.attr ('width')}) : o;
      o = $this.attr ('height') ? $.extend (o, { 'height' : $this.attr ('height')}) : o;
      o = $this.attr ('classafter') ? $.extend (o, { 'classafter' : $this.attr ('classafter')}) : o;
      o = $this.attr ('classbefore') ? $.extend (o, { 'classbefore' : $this.attr ('classbefore')}) : o;
      o = $this.attr ('size') ? $.extend (o, { 'size' : $this.attr ('size')}) : o;
      
      // Fixation de la taille de la zone défilante
      if (o.sens == 'H')
        $this.css ({ height: o.height });
      else
        $this.css ({ width: o.width });
      
      if (o.sens == 'H')
    	if (o.size != '')
    	  $this.css ({ width: o.size });
    	else
          $this.css ({ width: $this.outerWidth () });
      else
      	if (o.size != '')
      	  $this.css ({ height: o.size });
      	else
          $this.css ({ height: $this.outerHeight () });
      
      // Mise en place des conteneurs
      $this.wrap ('<div><div></div></div>');

      // Réglage des différents éléments
      $this.parent ().css ({
        width: o.width,
        height: o.height,
        overflow: 'hidden',
        position: 'relative'
      });
      
      $this.css ({
        position: 'absolute',
        top: '0',
        left: '0'
      });
      
      // Mise en place des boutons pour le défilement
      $this.parent ().before ('<a class="' + o.classbefore + '"><span class="ICON"></span></a>');
      $this.parent ().after ('<a class="' + o.classafter + '"><span class="ICON"></span></a>');
      
      // Définition des actions pour le scroll
      $this.parent ().parent ().children ('a.' + o.classbefore).mouseover (function ()
      {
        if (o.sens == 'H')
          interval = setInterval (function (){$this.move (o.step, 0);}, o.vitesse);
        else
          interval = setInterval (function (){$this.move (0, o.step);}, o.vitesse);
      });
      
      $this.parent ().parent ().children ('a.' + o.classbefore).mouseout (function ()
      {
        clearInterval (interval);
      });
      
      $this.parent ().parent ().children ('a.' + o.classafter).mouseover (function ()
      {
        if (o.sens == 'H')
          interval = setInterval (function (){$this.move (-o.step, 0);}, o.vitesse);
        else
          interval = setInterval (function (){$this.move (0, -o.step);}, o.vitesse);
      });
      
      $this.parent ().parent ().children ('a.' + o.classafter).mouseout (function ()
      {
        clearInterval (interval);
      });
      
      // Fonction pour le déplacement
      $this.move = function (left, top)
      {
        var p = $this.position ();
        
        var newLeft = p.left + left;
        if (newLeft > 0)
          newLeft = 0;
        else if ($this.parent ().outerWidth () - newLeft > $this.outerWidth ())
          newLeft = $this.parent ().outerWidth () - $this.outerWidth ();
        
        var newTop = p.top + top;
        if (newTop > 0)
          newTop = 0;
        else if ($this.parent ().outerHeight () - newTop > $this.outerHeight ())
          newTop = $this.parent ().outerHeight () - $this.outerHeight ();
        
        $this.css ({
          'left': newLeft + 'px',
          'top': newTop + 'px'
        });
      };
    });
  };
  
  // function privée pour débuggage
  function debug ($message)
  {
    if (window.console && window.console.log)
      window.console.log ('taojquery - scroll : ' + $message);
  };
  
  // options par défaut
  $.fn.scroll.defaults = {
    step: 3,
    vitesse: 100,
    sens: 'H',
    width: '200px',
    height: '200px',
    classafter: 'SUIVANT',
    classbefore: 'PRECEDENT',
    size: ''
  };
})(jQuery);

// Appelle du plugin
// Toutes les balises ayant un attribut scroll
$ (document).ready (function ()
{
  $ ('[scroll]').scroll ();
});

/********/
/* Zoom */
/********/
// Déclaration du plugin
(function ($)
{
  $.fn.zoom = function (options)
  {
    debug ('nb objet(s) : ' + this.size ());
    
    // On écrase les options par défaut si ils sont surchargées en paramètre
    var opts = $.extend ({}, $.fn.zoom.defaults, options);
      
    // On parcours tous les objets
    return this.each (function ()
    {
      var $this = $ (this);
      
      // On écrase les options par défaut si ils sont surchargées pour cet objet
      var o = $.extend ({}, opts);
      o = $this.attr ('imageBtnClose') ? $.extend (o, { 'imageBtnClose' : $this.attr ('imageBtnClose')}) : o;
      o = $this.attr ('imageLoading') ? $.extend (o, { 'imageLoading' : $this.attr ('imageLoading')}) : o;
      o = $this.attr ('overlayBgColor') ? $.extend (o, { 'overlayBgColor' : $this.attr ('overlayBgColor')}) : o;
      o = (!isNaN(parseFloat ($this.attr ('overlayOpacity')))) ? $.extend (o, { 'overlayOpacity' : parseFloat ($this.attr ('overlayOpacity'))}) : o;
      o = (!isNaN(parseInt ($this.attr ('containerBorderSize')))) ? $.extend (o, { 'containerBorderSize' : parseInt ($this.attr ('containerBorderSize'))}) : o;
      o = (!isNaN(parseInt ($this.attr ('containerResizeSpeed')))) ? $.extend (o, { 'containerResizeSpeed' : parseInt ($this.attr ('containerResizeSpeed'))}) : o;
      
      $this.click (function ()
      {
        // Cache ses éléments qui apparaitraient au dessus de la popin sous IE
        $ ('embed, object, select').css ( { 'visibility' : 'hidden' } );
        
        // Mise en place de la popin
        _init ();
        
        // Affichage de l'image
        _show ();
      });

      // Function privée pour afficher la popin
      function _init ()
      {
        $ ('body').append ('<div id="taojquery-zoom-overlay"></div><div id="taojquery-zoom-popin"><div id="taojquery-zoom-container-image-box"><div id="taojquery-zoom-container-image"><img id="taojquery-zoom-image"><div id="taojquery-zoom-loading"><a href="#" id="taojquery-zoom-loading-link"><img src="' + o.imageLoading + '"></a></div></div></div><div id="taojquery-zoom-container-data-box"><div id="taojquery-zoom-container-data"><div id="taojquery-zoom-details"><span id="taojquery-zoom-titre"></span><span id="taojquery-zoom-description"></span></div><div><a href="#" id="taojquery-zoom-btnClose"><img src="' + o.imageBtnClose + '"></a></div></div></div></div>');   
        
        // Récupération des dimensions de la page et de la fenêtre
        var arrPageSizes = ___getPageSize();
        
        // Mise en forme de la popin
        $ ('#taojquery-zoom-overlay').css (
        {
          position: "absolute",
          top: 0,
          left: 0,
          zIndex: 90,
          backgroundColor: o.overlayBgColor,
          opacity: o.overlayOpacity,
          width: arrPageSizes[0],
          height: arrPageSizes[1]
        }).fadeIn ();
        
        $ ('#taojquery-zoom-popin').css (
        {
          position: "absolute",
          top: 0,
          left: 0,
          width: "100%",
          zIndex: 100,
          textAlign: "center",
          lineHeight: 0
        });
        
        $ ('#taojquery-zoom-popin a img').css (
        {
          border: "none"
        });

        $ ('#taojquery-zoom-container-image-box').css (
        {
          position: "relative",
          backgroundColor: "#FFFFFF",
          width: "250px",
          height: "250px",
          margin: "0 auto"
        });
        
        $ ('#taojquery-zoom-container-image').css (
        {
          padding: "10px"
        });
        
        $ ('#taojquery-zoom-loading').css (
        {
          position: "absolute",
          top: "40%",
          left: "0%",
          height: "25%",
          width: "100%",
          textAlign: "center",
          lineHeight: 0
        });
        
        $ ('#taojquery-zoom-container-data-box').css (
        {
          font: "10px Verdana, Helvetica, sans-serif",
          backgroundColor: "#FFFFFF",
          margin: "0 auto",
          lineHeight: "1.4em",
          overflow: "auto",
          width: "100%",
          padding: "0 10px 0"
        });
        
        $ ('#taojquery-zoom-container-data').css (
        {
          padding: "0 10px",
          color: "#666666"
        });
        
        $ ('#taojquery-zoom-container-data #taojquery-zoom-details').css (
        {
          width: "70%",
          float: "left",
          textAlign: "left"
        });
        
        $ ('#taojquery-zoom-titre').css (
        {
          fontWeight: "bold"
        });
        
        $ ('#taojquery-zoom-description').css (
        {
          display: "block",
          clear: "left",
          paddingBottom: "1.0em"
        });
        
        $ ('#taojquery-zoom-btnClose').css (
        {
          float: "right",
          paddingBottom: "0.7em"
        });
        
        // Récupération du scroll de la page
        var arrPageScroll = ___getPageScroll();
        
        // Positionnement de la popin
        $ ('#taojquery-zoom-popin').css (
        {
          top: arrPageScroll[1] + (arrPageSizes[3] / 10),
          left: arrPageScroll[0]
        }).show();
        
        // Définition des actions
        $ ('#taojquery-zoom-overlay, #taojquery-zoom-popin').click (function ()
        {
          _close ();                            
        });
        
        $ ('#taojquery-zoom-loading-link, #taojquery-zoom-btnClose').click (function ()
        {
          _close ();
          return false;
        });
        
        // Redimensionnement des éléments si la page est redimensionnée
        $ (window).resize (function ()
        {
          var arrPageSizes = ___getPageSize ();
          
          $ ('#taojquery-zoom-overlay').css (
          {
            width: arrPageSizes[0],
            height: arrPageSizes[1]
          });

          var arrPageScroll = ___getPageScroll ();
          
          $ ('#taojquery-zoom-popin').css (
          {
            top: arrPageScroll[1] + (arrPageSizes[3] / 10),
            left: arrPageScroll[0]
          });
        });
      }
      
      // Function privée pour afficher l'image
      function _close ()
      {
        $ ('#taojquery-zoom-popin').remove ();
        $ ('#taojquery-zoom-overlay').fadeOut (function () { $('#taojquery-zoom-overlay').remove (); } );
        $ ('embed, object, select').css ( { 'visibility' : 'visible' } );
        _disable_keyboard_navigation ();
      }
      
      // Function privée pour initialiser l'image
      function _show ()
      {
        // Affiche le chargement
        $ ('#taojquery-zoom-loading').show ();
        
        // Masque les éléments inutiles pour le moment
        $('#taojquery-zoom-image, #taojquery-zoom-container-data-box, #taojquery-zoom-titre, #taojquery-zoom-description').hide();
        
        // Chargement de l'image
        var objImagePreloader = new Image ();
        objImagePreloader.onload = function () // Fin du chargement
        {
          $ ('#taojquery-zoom-image').attr ('src', $this.attr ('zoom'));
          _resize_container_image_box (objImagePreloader.width, objImagePreloader.height);
          // Fix IE
          objImagePreloader.onload = function () {};
        };
        objImagePreloader.src = $this.attr ('zoom');
      };

      // Function privée pour afficher le zoom
      function _show_zoom ()
      {
        // Masque le chargement
        $ ('#taojquery-zoom-loading').hide ();
        
        // Affiche le zoom
        $ ('#taojquery-zoom-image').fadeIn (function ()
        {
          $ ('#taojquery-zoom-container-data-box').slideDown ('fast');
          if ($this.attr ("zoom_titre"))
            $ ('#taojquery-zoom-titre').html ($this.attr ("zoom_titre")).show();
          if ($this.attr ("zoom_description"))
            $ ('#taojquery-zoom-description').html ($this.attr ("zoom_description")).show();
          _enable_keyboard_navigation ();
        });
      };
      
      function _resize_container_image_box (intImageWidth, intImageHeight)
      {
        // Récupération de la hauteur et largeur actuelle
        var intCurrentWidth = $ ('#taojquery-zoom-container-image-box').width ();
        var intCurrentHeight = $ ('#taojquery-zoom-container-image-box').height ();

        // Récupération de la hauteur et largeur de l'image + bordure
        var intWidth = (intImageWidth + (o.containerBorderSize * 2));
        var intHeight = (intImageHeight + (o.containerBorderSize * 2));

        // Calcul de la différence
        var intDiffW = intCurrentWidth - intWidth;
        var intDiffH = intCurrentHeight - intHeight;
        
        // Animation
        $ ('#taojquery-zoom-container-image-box').animate ({ width: intWidth, height: intHeight }, o.containerResizeSpeed, function () { _show_zoom (); });
        if ((intDiffW == 0) && (intDiffH == 0))
        {
          if ($.browser.msie)
            ___pause (250);
          else
            ___pause (100);
        }
        
        $ ('#taojquery-zoom-container-data-box').css ({ width: intImageWidth });
      };
      
      // Activation des actions clavier
      function _enable_keyboard_navigation ()
      {
        $ (document).keydown (function (objEvent)
        {
          _keyboard_action (objEvent);
        });
      }

      // Désactivation des actions clavier
      function _disable_keyboard_navigation ()
      {
        $ (document).unbind ('keydown');
      }
      
      // Actions clavier
      function _keyboard_action (event)
      {
        keycode = event.keyCode;
        escapeKey = 27;
        
        // Touche pour fermer ?
        if (keycode == escapeKey)
          _close ();
      }
    });
  };
  
  // Function privée pour récupérer les dimensions de la page et de la fenêtre
  /**
  / THIRD FUNCTION
  * getPageSize() by quirksmode.com
  *
  * @return Array Return an array with page width, height and window width, height
  */
  function ___getPageSize ()
  {
    var xScroll, yScroll;
    if (window.innerHeight && window.scrollMaxY)
    {  
        xScroll = window.innerWidth + window.scrollMaxX;
        yScroll = window.innerHeight + window.scrollMaxY;
    }
    else if (document.body.scrollHeight > document.body.offsetHeight) // all but Explorer Mac
    {
      xScroll = document.body.scrollWidth;
      yScroll = document.body.scrollHeight;
    }
    else // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
    {
      xScroll = document.body.offsetWidth;
      yScroll = document.body.offsetHeight;
    }
    
    var windowWidth, windowHeight;
    if (self.innerHeight) // all except Explorer
    {
      if (document.documentElement.clientWidth)
        windowWidth = document.documentElement.clientWidth; 
      else
        windowWidth = self.innerWidth;
      windowHeight = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode
    {
      windowWidth = document.documentElement.clientWidth;
      windowHeight = document.documentElement.clientHeight;
    }
    else if (document.body) // other Explorers
    {
      windowWidth = document.body.clientWidth;
      windowHeight = document.body.clientHeight;
    }   
    
    // for small pages with total height less then height of the viewport
    if (yScroll < windowHeight)
      pageHeight = windowHeight;
    else
      pageHeight = yScroll;
    
    // for small pages with total width less then width of the viewport
    if (xScroll < windowWidth)
      pageWidth = xScroll;        
    else
      pageWidth = windowWidth;
    
    arrayPageSize = new Array (pageWidth, pageHeight, windowWidth, windowHeight);
    
    return arrayPageSize;
  };

  // Function privée pour récupérer le scroll de la page
  /**
  / THIRD FUNCTION
  * getPageScroll() by quirksmode.com
  *
  * @return Array Return an array with x,y page scroll values.
  */
  function ___getPageScroll()
  {
    var xScroll, yScroll;
    if (self.pageYOffset)
    {
      yScroll = self.pageYOffset;
      xScroll = self.pageXOffset;
    }
    else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict
    {
      yScroll = document.documentElement.scrollTop;
      xScroll = document.documentElement.scrollLeft;
    }
    else if (document.body) // all other Explorers
    {
      yScroll = document.body.scrollTop;
      xScroll = document.body.scrollLeft; 
    }
    
    arrayPageScroll = new Array (xScroll, yScroll);
    
    return arrayPageScroll;
  };
  
  // function privée qui simule une pause
  function ___pause (ms)
  {
    var date = new Date(); 
    curDate = null;
    
    do
    {
      var curDate = new Date();
    } while ( curDate - date < ms);
  };
  
  // function privée pour débuggage
  function debug ($message)
  {
    if (window.console && window.console.log)
      window.console.log ('taojquery - zoom : ' + $message);
  };
  
  // options par défaut
  $.fn.zoom.defaults = {
    imageBtnClose: '/images/taojquery/zoom/btn-close.gif',
    imageLoading: '/images/taojquery/zoom/loading.gif',
    overlayBgColor: "#000000",
    overlayOpacity: 0.8,
    containerBorderSize: 10,
    containerResizeSpeed: 400
  };
})(jQuery);

// Appelle du plugin
// Toutes les balises ayant un attribut zoom
$ (document).ready (function ()
{
  $ ('[zoom]').zoom ();
});

/**********************/
/* Input text default */
/**********************/
// Déclaration du plugin
(function ($)
{
  $.fn.input_text_default = function (options)
  {
    debug ('nb objet(s) : ' + this.size ());
    
    // On écrase les options par défaut si ils sont surchargées en paramètre
    var opts = $.extend ({}, $.fn.input_text_default.defaults, options);
    
    // On parcours tous les objets
    return this.each (function ()
    {
      var $this = $ (this);
      
      // On écrase les options par défaut si ils sont surchargées pour cet objet
      var o = $.extend ({}, opts);
      o = $this.attr ('showTitle') ? $.extend (o, { 'showTitle' : $this.attr ('showTitle')}) : o;
      o = $this.attr ('deleteOnSubmit') ? $.extend (o, { 'deleteOnSubmit' : $this.attr ('deleteOnSubmit')}) : o;
      
      // Récupération de la valeur par défaut
      var defaultValue = $this.attr ('default');
      
      // On affiche tout de suite la valeur par défaut si le champ est vide
      _blur ();
      
      // On ajoute l'info-bulle correspondante au texte par défaut
      if (jQuery.trim ($this.attr ('title')) == '')
      {
        if (o.showTitle === true && jQuery.trim (defaultValue) != '')
          $this.attr ('title', defaultValue);
        else if (o.showTitle != "false" && jQuery.trim (o.showTitle) != '')
          $this.attr ('title', o.showTitle);
      }
      
      // On efface le champ si on prend le focus et que c'est la valeur par défaut qui est inscrite
      $this.focus (function ()
      {
        _focus ();
      });
      
      function _focus ()
      {
        if ($this.val () == defaultValue)
          $this.val ('');
      }

      // On met la valeur par défaut si on perd le focus et que le champ est vide
      $this.blur (function ()
      {
        _blur ();
      });
      
      function _blur ()
      {
        if (jQuery.trim ($this.val ()) == '')
          $this.val (defaultValue);
      }
      
      // Efface la valeur par défaut lorsque le formulaire correspondant est submitté
      if (o.deleteOnSubmit === true)
      {
        $this.parent ('form').submit (function ()
        {
          _focus ();
        });
      }
    });
  };
  
  // function privée pour débuggage
  function debug ($message)
  {
    if (window.console && window.console.log)
      window.console.log ('taojquery - input default : ' + $message);
  };
  
  // options par défaut
  $.fn.input_text_default.defaults = {
    showTitle: true,
    deleteOnSubmit: true
  };
})(jQuery);

//Appelle du plugin
//Toutes les input text ayant un attribut default
$ (document).ready (function ()
{
  $ ('input:text[default]').input_text_default ();
});
