(function() {
    var Event = YAHOO.util.Event;
    var Dom   = YAHOO.util.Dom;
    var lang  = YAHOO.lang;
    var Slider;

    // The slider can move 0 pixels up
    var topConstraint = 0;

    // The slider can move 100 pixels down
    var bottomConstraint = 100;

    // Custom scale factor for converting the pixel offset into a real value
    var scaleFactor = 100000;

    // The amount the slider moves when the value is changed with the arrow keys
    var keyIncrement = 10;

    var tickSize = 10;

    // prechargement des images des curseurs :
    var tempImgSrcOn = new Image();
    var tempImgSrcOff = new Image();
		tempImgSrcOn.src = '../images/btn-slide_on.gif';
		tempImgSrcOff.src = '../images/btn-slide_off.gif';

    Event.onDOMReady(function() {

        // curseur 'Combien je veux' (left) :
        slider1 = YAHOO.widget.Slider.getHorizSlider( "slider-bg1", "slider-thumb1", topConstraint, 75, 1 );

        // curseur 'Versement initial' (left) :
        slider3 = YAHOO.widget.Slider.getHorizSlider( "slider-bg3", "slider-thumb3", topConstraint, 75, 1 );

        // curseur 'Duree' (left):
        slider2 = YAHOO.widget.Slider.getHorizSlider( "slider-bg2", "slider-thumb2", topConstraint, 50, 1 );

        // curseur 'Taux' (left):
        slider4 = YAHOO.widget.Slider.getHorizSlider( "slider-bg4", "slider-thumb4", topConstraint, 50, 1 );

        // curseur 'Combien je verse' (right) :
        slider5 = YAHOO.widget.Slider.getHorizSlider( "slider-bg5", "slider-thumb5", topConstraint, 75, 1 );

        // curseur 'Versement initial' (right) :
        slider6 = YAHOO.widget.Slider.getHorizSlider( "slider-bg6", "slider-thumb6", topConstraint, 75, 1 );

        // curseur 'Duree' (right):
        slider7 = YAHOO.widget.Slider.getHorizSlider( "slider-bg7", "slider-thumb7", topConstraint, 50, 1 );

        // curseur 'Taux' (right):
        slider8 = YAHOO.widget.Slider.getHorizSlider( "slider-bg8", "slider-thumb8", topConstraint, 50, 1 );

        /** Combien je veux (left) **/
        slider1.getRealValue = function() {
            var returnValue;
            returnValue = Math.round( this.getValue() * 100000/75 );
            if ( 50667 == returnValue ) {
                returnValue = 50000;
            }
            return number_format( returnValue, 0, '.', ' ' );
        }

        slider1.subscribe( "change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb1" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb1' );
            var valnode = Dom.get( "slider-value1" );
            var fld = Dom.get( "slider-converted-value1" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider1.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );

        slider1.subscribe( "onSliderEnd", function() {
            alert( 'fin' );

        } );

        //document.getElementById( "slider-thumb1" ).getElementsByTagName( 'img' )[0].src = '../images/btn-slide_off.gif';


        // valeur initiale :
        slider1.setValue( 38, false ); //false here means to animate if possible


        /** Duree (left) **/
        slider2.getRealValue = function() {
            var returnValue = Math.round( this.getValue() );
            if ( 0 == returnValue ) {
                returnValue = 1;
            }
            return returnValue;
        }

        slider2.subscribe("change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb2" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb2' );
            var valnode = Dom.get( "slider-value2" );
            var fld = Dom.get( "slider-converted-value2" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider2.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        });
        
        // valeur initiale :
        slider2.setValue( 8, false ); //false here means to animate if possible


        /** Versement initial (left) **/
        slider3.getRealValue = function() {
            var returnValue;
            returnValue = Math.round( this.getValue() * 100000/75 );
            if ( 5333 == returnValue ) {
                returnValue = 5000;
            }
            return number_format( returnValue, 0, '.', ' ' );
        }

        slider3.subscribe( "change", function(offsetFromStart) {
          // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb3" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb3' );
            var valnode = Dom.get( "slider-value3" );
            var fld = Dom.get( "slider-converted-value3" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider3.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );
        
        // valeur initiale :
        slider3.setValue( 4, false ); //false here means to animate if possible


        /** Taux (left) **/
        slider4.getRealValue = function() {
            var returnValue;
            returnValue = this.getValue() * 15/50;
            if ( 3.9 == returnValue ) {
                returnValue = 4;
            }
            return returnValue;
        }

        slider4.subscribe( "change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb4" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb4' );
            var valnode = Dom.get( "slider-value4" );
            var fld = Dom.get( "slider-converted-value4" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider4.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );
        
        // valeur initiale :
        slider4.setValue( 13, false ); //false here means to animate if possible
        
        
        /** Combien je verse (right) **/
        slider5.getRealValue = function() {
            var returnValue;
            returnValue = this.getValue() * 1500/75;
            return returnValue;
        }

        slider5.subscribe( "change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb5" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb5' );
            var valnode = Dom.get( "slider-value5" );
            var fld = Dom.get( "slider-converted-value5" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider5.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );
        
        // valeur initiale :
        slider5.setValue( 15, false ); //false here means to animate if possible
        

        /** Versement initial (right) **/
        slider6.getRealValue = function() {
            var returnValue;
            returnValue = Math.round( this.getValue() * 100000/75 );
            if ( 1333 == returnValue ) {
                returnValue = 1500;
            }
            return number_format( returnValue, 0, '.', ' ' );
        }

        slider6.subscribe( "change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb6" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb6' );
            var valnode = Dom.get( "slider-value6" );
            var fld = Dom.get( "slider-converted-value6" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider6.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );
        
        // valeur initiale :
        slider6.setValue( 1, false ); //false here means to animate if possible


        /** Duree (right) **/
        slider7.getRealValue = function() {
            var returnValue = Math.round( this.getValue() );
            if ( 0 == returnValue ) {
                returnValue = 1;
            }
            return returnValue;
        }

        slider7.subscribe("change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb7" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb7' );
            var valnode = Dom.get( "slider-value7" );
            var fld = Dom.get( "slider-converted-value7" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider7.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        });

		 slider7.setValue( 8, false ); //false here means to animate if possible
		 
        /** Taux (right) **/
        slider8.getRealValue = function() {
            var returnValue;
            returnValue = this.getValue() * 15/50;
            if ( 3.9 == returnValue ) {
                returnValue = 4;
            }
            
            return returnValue;
        }

        slider8.subscribe( "change", function(offsetFromStart) {
            // vert quand on bouge le curseur, les autres en gris
            var imgCursor = Dom.get( "slider-thumb8" );
            imgCursor.getElementsByTagName( 'img' )[0].src = tempImgSrcOn.src;
            fadeAllThumbers( 'slider-thumb8' );
            var valnode = Dom.get( "slider-value8" );
            var fld = Dom.get( "slider-converted-value8" );
            // Display the pixel value of the control
            valnode.innerHTML = offsetFromStart;
            // use the scale factor to convert the pixel offset into a real value
            var actualValue = slider8.getRealValue();
            // update the text box with the actual value
            fld.value = actualValue;
            // Update the title attribute on the background.  This helps assistive technology to communicate the state change
            Dom.get(bg).title = actualValue;
        } );
        
         slider8.setValue( 13, false ); //false here means to animate if possible
        
        // on grise tous les curseurs :
        fadeAllThumbers( null );  
        
    });

})();


/**
*    number_format : equivalent JS de number_format PHP (thx to jim), utile pour passer de 1000000 à 1 000 000...
**/
function number_format( num, decimal, dec_point, thousands_sep ) {

    var decimal, dec_point, thousands_sep;

    if ( arguments.length > 1 ) {
      decimal = arguments[ 1 ];
      dec_point = arguments[ 2 ];
      thousands_sep = arguments[ 3 ];
    }
    if ( !decimal )
      decimal = 0;
    if ( !dec_point )
      dec_point = ',';
    if ( !thousands_sep )
      thousands_sep = ' ';
    var regexp = new RegExp( '([0-9]*)([\.,]([0-9]*))?', 'gi' );
    var matches = regexp.exec( num );
    if ( matches ) {
      var int = matches[ 1 ];
      var final_int = '';
      var cut = int.length % 3;
      final_int = int.substr( 0, cut );
      int = int.substr( cut );
      var max = int.length / 3;;
      for( var i=0; i<=max; i++ ) {
        if ( 0 == int.length )
          break;
        var tmp = int.substr( 0, 3 );
        if ( final_int.length > 0 )
          final_int += thousands_sep;
        final_int += tmp;
        int = int.substr( 3 );
      }
      var dec = ( matches[ 3 ] ) ? matches[ 3 ] : '';
      if ( dec ) {
        if ( dec.length > decimal )
          dec = dec.substr( 0, decimal );
        else {
          var len = dec.length;
          for( var i=len; i<decimal; i++ )
            dec += '0';
        }
      }
      var rv = final_int;
      if ( decimal > 0 )
        rv += dec_point + dec;
      return rv;
    }
    return null;
}


/**
*    classicalFormat : pour passer de 1 000 000 à 1000000...
**/
function classicalFormat( numString ) {

  if ( arguments.length > 1 ) {
      numString = arguments[ 0 ];
  }
  return parseInt( numString.replace( /\s/g, '' ) );

}


/**
*
**/
function fadeAllThumbers( notThisEltId ) {

    var Dom   = YAHOO.util.Dom;
    var thumbers = Dom.getElementsByClassName( 'thumber', 'div' );
    var fadeIt;
    for( var i=0; i<thumbers.length; i++ ) {
        fadeIt = true;
        if ( ( null != notThisEltId ) && ( notThisEltId == thumbers[i].id ) ) {
            fadeIt = false;
        }
        if ( fadeIt ) {
            thumbers[ i ].getElementsByTagName( 'img' )[0].src = '../images/btn-slide_off.gif';
        }
    }

}


/**
*    initForms : initialise le comportement des elements de la page
**/
function initForms() {
    
    document.getElementById( "ResultLeft" ).style.display = 'none';
    document.getElementById( "ResultRight" ).style.display = 'none';

    // left form :
    var formLeft = document.getElementById( "calcLeft" );
	  if ( formLeft ) {

	      formLeft.onsubmit = function() {
	          return false;
	      }

	      formLeft.onclick = function() {

            // on grise tous les curseurs :
            fadeAllThumbers( null );

					  var msgLeft = '';
					  var calcLeft = true;

				    // combien je veux :
					  var combienJeVeuxLeftValue = document.getElementById( "slider-converted-value1" ).value;
					  var epargneFinale = classicalFormat( combienJeVeuxLeftValue );
			      if ( epargneFinale > 9999999 ) {
			          msgLeft = 'Le montant total de l\'épargne ne peut excéder 9 999 999 euros';
			          calcLeft = false;
			      }

			      // versement initial :
					  var versementInitialLeftValue = document.getElementById( "slider-converted-value3" ).value;
					  var versementInitial = classicalFormat( versementInitialLeftValue );
			      if ( versementInitial > 9999999 ) {
			          msgLeft = 'Le versement initial ne peut excéder 9 999 999 euros';
			          calcLeft = false;
			      }

			      // duree :
					  var dureeLeftValue = document.getElementById( "slider-converted-value2" ).value;
					  var duree = classicalFormat( dureeLeftValue );
			      if ( duree > 50 ) {
			          msgLeft = 'La durÃ©e ne peut excéder 50 ans';
			          calcLeft = false;
			      }

			      // taux :
					  var tauxLeftValue = document.getElementById( "slider-converted-value4" ).value;
					  var tauxLeftValue2 = Math.round( parseFloat( tauxLeftValue ) * 100 );
			      if ( tauxLeftValue2 > 1500 ) {
			          msgLeft = 'Le taux ne peut excéder 15 %';
			          calcLeft = false;
			      }

            if ( !calcLeft ) {
                alert( msgLeft );
            }	else {
                CalcCombienJeVeux( epargneFinale, versementInitial, tauxLeftValue2 / 100, duree )
            }

			  }

	  }

	  // right form :
    var formRight = document.getElementById( "calcRight" );
	  if ( formRight ) {

	      formRight.onsubmit = function() {
	          return false;
	      }

	      formRight.onclick = function() {

					  // on grise tous les curseurs :
            fadeAllThumbers( null );

					  var msgRight = '';
					  var calcRight = true;

				    // combien je verse :
					  var combienJeVerseRightValue = document.getElementById( "slider-converted-value5" ).value;
					  var versementMensuel = classicalFormat( combienJeVerseRightValue );
			      if ( versementMensuel > 20000 ) {
			          msgRight = 'Le versement mensuel ne peut excéder 20 000 euros';
			          calcRight = false;
			      }

			      // versement initial :
					  var versementInitialRightValue = document.getElementById( "slider-converted-value6" ).value;
					  var versementInitial = classicalFormat( versementInitialRightValue );
			      if ( versementInitial > 9999999 ) {
			          msgRight = 'Le versement initial ne peut excéder 9 999 999 euros';
			          //msgRight = 'Le versement initial est limitÃ© Ã  9 999 999 euros';
			          calcRight = false;
			      }

			      // duree :
					  var dureeRightValue = document.getElementById( "slider-converted-value7" ).value;
					  var duree = classicalFormat( dureeRightValue );
			      if ( duree > 50 ) {
			          msgRight = 'La durée ne peut excéder 50 ans';
			          calcRight = false;
			      }

			      // taux :
					  var tauxRightValue = document.getElementById( "slider-converted-value8" ).value;
					  var tauxRightValue2 = Math.round( parseFloat( tauxRightValue ) * 100 );
			      if ( tauxRightValue2 > 1500 ) {
			          msgRight = 'Le taux ne peut excéder 15 %';
			          calcRight = false;
			      }

            if ( !calcRight ) {
                alert( msgRight );
            } else {
                CalcCombienJeVerse( versementMensuel, versementInitial, tauxRightValue2 / 100, duree )
            }

			  }

	  }

}


/**
*    partialCapitalisation : (1 + i)[PUISSANCE]n
*    taux : taux annuel en % (ex : 15% annuel <=> 15/100 annuel <=> 15/1200 mensuel)
*    duree : duree en annee (ex : 5 ans <=> 12*5 = 60 mois)
**/
function partialCapitalisation( taux, duree ) {

    return Math.pow( 1 + taux/1200, parseInt( 12 * duree ) );

}


/**
*    valeurAcquiseCapitalisation : Vo(1 + i)[PUISSANCE]n
*    Vo : capital de depart
*    taux : taux annuel en % (ex : 15% annuel <=> 15/100 annuel <=> 15/1200 mensuel)
*    duree : duree en annee (ex : 5 ans <=> 12*5 = 60 mois)
**/
function valeurAcquiseCapitalisation( Vo, taux, duree ) {

    return parseInt( Vo ) * partialCapitalisation( taux, duree );

}


/**
*    valeurFutureCapitalisation : a[(1 + i)[PUISSANCE]n - 1]/i
*    a : versement mensuel
*    taux : taux annuel en % (ex : 15% annuel <=> 15/100 annuel <=> 15/1200 mensuel)
*    duree : duree en annee (ex : 5 ans <=> 12*5 = 60 mois)
**/
function valeurFutureCapitalisation( a, taux, duree ) {

    return 1200 * parseInt( a ) * ( partialCapitalisation( taux, duree ) - 1 ) / taux;

}


/**
*    CalcCombienJeVeux : determine le montant des versements mensuels
**/
function CalcCombienJeVeux( epargneFinale, versementInitial, taux, duree ) {

    var displayView = document.getElementById( "ResultLeft" ).style.display;

    if ( parseInt( epargneFinale ) > 0 ) {

        // calcul formule
        var Vn1 = 0;
        Vn1 = valeurAcquiseCapitalisation( versementInitial, taux, duree );
        var versementMensuel = 0;
        if ( 0 != taux ) {
            versementMensuel = ( parseInt( epargneFinale ) - parseInt( Vn1 ) ) * taux / ( 1200 * ( partialCapitalisation( taux, duree ) - 1 ) );
        } else {
            versementMensuel = ( parseInt( epargneFinale ) - parseInt( Vn1 ) ) / ( 12 * duree );
        }

        if ( versementMensuel < 0 ) {
            versementMensuel = 0;
        }

        // remplacement des valeurs
        document.getElementById( "montantEpargneLeft" ).innerHTML = number_format( epargneFinale, 0, '.', ' ' );
        document.getElementById( "montantVersementLeft" ).innerHTML = number_format( Math.round( versementMensuel ), 0, '.', ' ' );

        // affichage du resultat
        if ( 'none' == displayView ) {
            document.getElementById( "ResultLeft" ).style.display = 'block';
        }

    } else {

        document.getElementById( "ResultLeft" ).style.display = 'none';

    }

}


/**
*    CalcCombienJeVerse : determine le montant total de l'eparne au bout de n annees
**/
function CalcCombienJeVerse( versementMensuel, versementInitial, taux, duree ) {

    var displayView = document.getElementById( "ResultRight" ).style.display;

    // calcul formule
    var Vn1 = 0;
    Vn1 = valeurAcquiseCapitalisation( versementInitial, taux, duree );
    var Vn2 = 0;
    if ( 0 != taux ) {
        Vn2 = valeurFutureCapitalisation( versementMensuel, taux, duree );
    } else {
        Vn2 = 12 * parseInt( versementMensuel ) * parseInt( duree );
    }

    var Vn = Math.round( Vn1 + Vn2 );

    // remplacement des valeurs
    document.getElementById( "anneesRight" ).innerHTML = parseInt( duree );
    document.getElementById( "montantEpargneRight" ).innerHTML = number_format( Vn, 0, '.', ' ' );

    // affichage du resultat
    if ( 'none' == displayView ) {
        document.getElementById( "ResultRight" ).style.display = 'block';
    }

}


YAHOO.util.Event.onDOMReady( initForms );
