	function CLetter(){

		this.oHtmlDiv ;
		this.oHtmlDivA ;
		this.sId ;

		this.x ;
		this.y ;

		this.RandX ;
		this.RandY ;

		this.WordX ;
		this.WordY ;
		
		this.NextX ;
		this.NextY ;
		
		this.Mode ;
		this.sCode ;

		var that = this ;											// Para solucionar los problemas de los callback

		//------------------------------------------
		// METODOS
		//------------------------------------------
	
		// CREATE
		// Se hace bastante, asi que está bien tenerlo aqui para acortar lineas de código
		//-------------------------------------------------		
		this.Create = function Create( sLetter , SSize , sId , nX , nY , nWordX , nWordY , sCode ){
			
			this.sCode = sCode ;
			
			switch( sLetter ){
				/*
				case "á":
					sLetter = "aa" ;
					break;

				case "é":
					sLetter = "ee" ;
					break;
					
				case "í":
					sLetter = "ii" ;
					break;
					
				case "ó":
					sLetter = "oo" ;
					break;
					*/
					
				case "ú":
					sLetter = "uu" ;
					break;
					
				case "ñ":
					sLetter = "nn" ;
					break;
					
				case "-":
					sLetter = "guion" ;
					break;

			}
			
			
			if( sLetter == "ú"){ sLetter = "uu" }
			
			var img = sLetter + SSize ;
			
			var oFather 				= document.getElementById( "menuFrame" ) ;

			this.oHtmlDiv 				= document.createElement( "div" ) ;
			this.oHtmlDiv.className		= "Letter" ;
			this.oHtmlDiv.id = this.sId = sId ;
			
			this.oHtmlDivA 				= document.createElement( "div" ) ;
			this.oHtmlDivA.className	= "LetterA" ;
			
			if( sLetter != '' ){
				
				
				//this.oHtmlDivA.style.backgroundImage = "url(style/letters/"+ img +".png)" ;
				this.oHtmlDivA.style.background = "url(style/letters/"+ img +".png)" ;
				
				
			}
			
			this.oHtmlDiv.style.backgroundImage = "" ;
			
			this.oHtmlDiv.appendChild( this.oHtmlDivA ) ;
			oFather.appendChild( this.oHtmlDiv ) ;

			this.RandX = nX ;
			this.RandY = nY ;

			this.WordX = nWordX ;
			this.WordY = nWordY ;

			this.x = nX ;
			this.y = nY ;
			
			this.NextX = nX ;
			this.NextY = nY ;

			this.SetPosition( nX , nY ) ;

			this.oHtmlDiv.onmouseover = function(){ oEvent.Throw( sCode + "_glowOn" ); } ;
			this.oHtmlDiv.onmouseout = function(){ oEvent.Throw( sCode + "_glowOff" ); } ;
			this.oHtmlDiv.onmouseup = function(){ that.ShowSection();  oEvent.Throw( "onRandom" ); } ;

			//EVENTOS

			this.Handle( sCode + "_glowOn" , this.GlowOn ) ;
			this.Handle( sCode + "_glowOff", this.GlowOff ) ;
			this.Handle( "onRandom", this.GoRandom ) ;
			this.Handle( "onWord", 	 this.GoWord ) ;
			this.Handle( "onFrame",  this.Move ) ;
			
		}


		// SHOW SECTION
		//
		//-------------------------------------------------	
		this.ShowSection = function ShowSection(){
			
			oMenu.HideSections() ;
			oMenu.ShowSection( that.sCode ) ;
			
		}


		// GLOW ON
		//
		//-------------------------------------------------	
		this.GlowOn = function GlowOn(){
			
			that.oHtmlDiv.style.backgroundImage = "url(style/over.png)" ;	
			
		}
		

		// GLOW OFF
		//
		//-------------------------------------------------	
		this.GlowOff = function GlowOff(){
			
			that.oHtmlDiv.style.backgroundImage = "" ;	
			
		}


		// GO WORD
		//
		//-------------------------------------------------		
		this.GoWord = function GoWord(){
			
			that.NextX = that.WordX ;
			that.NextY = that.WordY ;
			
			//that.Handle( "onFrame" , that.Move ) ;
			that.Mode = false ;
				
		}


		// GO RANDOM
		//
		//-------------------------------------------------		
		this.GoRandom = function GoRandom(){
			
			that.NextX = that.RandX ;
			that.NextY = that.RandY ;
			that.Mode = true ;
			
			//that.Handle( "onFrame" , that.Move ) ;
				
		}


		// MOVE
		//
		//-------------------------------------------------		
		this.Move = function Move(){
			
			if( that.x == that.NextX && that.y == that.NextY  ){
				return ;  
			}
			
			if( that.Mode){
				
				that.x  = that.interpolateAB( that.x , that.NextX , 0.05 ) ;
				that.y  = that.interpolateAB( that.y , that.NextY , 0.05 ) ;
				
			}else{
				
				that.x  = that.interpolateAB( that.x , that.NextX , 0.15 ) ;
				that.y  = that.interpolateAB( that.y , that.NextY , 0.15 ) ;				
				
			}
			
			that.SetPosition( that.x , that.y  ) ;
				
			
			//alert('move ' + that.x + ' ' + that.y ) ;
			
			//if( that.x == that.NextX && that.y == that.NextY  ){
				
				//that.UnHandle( "onFrame" , that.Move ) ;
				
			//}
				
		}
		

		// SET POSITION
		//
		//-------------------------------------------------		
		this.SetPosition = function SetPosition( nX  , nY ){
			
			that.oHtmlDiv.style.left = nX + "px" ;
			that.oHtmlDiv.style.top = nY + "px" ;
				
		}


		// HANDLE
		//
		//-------------------------------------------------		
		this.Handle = function Handle( sEvent , oFunction ){
		
			//alert( oEvent.HasEvent( sEvent , oFunction ) ) ;
			if( !oEvent.HasEvent( sEvent , oFunction ) ){
				
				oEvent.Handle( sEvent , oFunction ) ;
				
			}
			
		}
	
	
		// UN HANDLE
		//
		//-------------------------------------------------		
		this.UnHandle = function UnHandle( sEvent , oFunction ){
				
			oEvent.UnHandle( sEvent , oFunction ) ;
				
		}
		
		
		// HAS EVENT
		//
		//-------------------------------------------------		
		this.HasEvent = function HasEvent( sEvent , oFunction ){
				
			return ( oEvent.HasEvent( sEvent , oFunction ) ) ;
				
		}		
		

		// INTERPOLATE AB
		// Interpola entre dos números segun distancia
		//-------------------------------------------------------------------------- 
		this.interpolateAB = function interpolateAB( fA , fB , fPonderado ){
			var fA , fB , fPonderado , increment ;
			
			if ( fA == fB ){
					
					return( fA ) ;
					
			}else if( fA > fB ){

					fA *= 10 ;
					fB *= 10 ;
			
					increment = ( fA - fB ) * fPonderado ;
					if( increment < 1 ){ increment = 1 ; }
					return(  Math.floor( fA - increment )  * 0.1 ) ;
			}else{

					fA *= 10 ;
					fB *= 10 ;
					
					increment = ( fB - fA ) * fPonderado ;
					if( increment < 1 ){ increment = 1 ; }
					return ( Math.floor( fA + increment ) * 0.1 ) ;
			}
			
		}

	}