function registerHScroller( prefix, time, speed, zone )	{

	this.name = 'HScoller' + prefix;

	if( window[this.name] )
		return window[this.name];

	this.prefix = '#' + prefix;	// prefijo de id de zonas
	this.zone = ( zone > 1 ? zone / 100 : ( zone > 0 ? zone : .3 ) );	// Porcentaje de zona sensible
	this.speed = ( speed > 10 ? speed : 10 );	// Maximo de pixeles a mover en cada intervalo
	this.time = ( time > 40 ? time : 40 );	// Espacio entre intervalos
	this.coefficient = 1;	// Coeficiente de transforamacin(escala) entre en ancho del contenidor principal y el contenedor de informacin real

	this.holder = 0;	// ancho del contenedor
	this.zoneSize = 0;	// ancho de la zona sensible
	this.content = 0;	// ancho del contenido
	this.interval = null;	// identificador de intervalo
	this.sLayerX = 0;	// posicin del mouse en x

	$(this.prefix + "Left").hide( );
	$(this.prefix + "Right").hide( );
	$(this.prefix + "Content").css('left', '0px' );

	this.init = function ( )	{

		if( $(this.prefix + "Content").width( ) > $(this.prefix + "Holder").width( ) )	{
			this.holder = $(this.prefix + "Holder").width( );
			this.zoneSize = Math.round( this.holder * this.zone );
			this.content = $(this.prefix + "Content").width( );
			this.coefficient = this.holder  / $(this.prefix).width( );
			
			$(this.prefix + "Right").show( );
			$(this.prefix).get( 0 ).HScroller = this;
			$(this.prefix).mouseleave( function( event )	{
					this.HScroller.stop( );
				}
			);

			$(this.prefix).mouseenter( function( event )	{
					this.HScroller.sLayerX =  event.pageX - $(this).offset( ).left;
					this.HScroller.play( );
				}
			);

			$(this.prefix).mousemove( function( event )	{
					this.HScroller.sLayerX = event.pageX - $(this).offset( ).left;
				}
			);
		}
	}


	this.stop = function( )	{
		clearInterval( this.interval );
	}

	this.play = function( )	{
		clearInterval( this.interval );
		this.interval = setInterval( new Function( "window." + this.name + ".move( );" ), this.time );
	}

	this.move = function ( )	{
		var mouse = ( this.sLayerX * this.coefficient );

		if( mouse > this.holder - this.zoneSize )	{
			var pos = Math.abs( parseInt( $(this.prefix + "Content").css('left') ) );
			if( pos + this.holder < this.content )	{
				var limit = this.content - this.holder;
				mouse -= ( this.holder - this.zoneSize );
				var move = ( mouse > 0 ? Math.min( pos + Math.round( ( mouse / this.zoneSize ) * this.speed ), limit ) : pos );
				$(this.prefix + "Content").css('left', - move );
				$(this.prefix + "Right").toggle( ( move != limit ) );
				$(this.prefix + "Left").toggle( ( move > 0 ) );
			}
		}
		else if( mouse < this.zoneSize )	{
			var pos = parseInt( $(this.prefix + "Content").css('left') );
			if( pos < 0 )	{
				var limit = 0;
				var move = Math.min( pos + ( mouse > 0 ? Math.round( ( 1 - ( mouse / this.zoneSize ) ) * this.speed ) : this.speed ), limit );
				$(this.prefix + "Content").css('left', move );
				$(this.prefix + "Left").toggle( ( move != limit ) );
				$(this.prefix + "Right").toggle( ( move > this.holder - this.content ) );
			}
		}
	}	
	
	window[this.name] = this;
	$(document).ready( new Function( "window." + this.name + ".init( );" ) );

	return this;
}

	function toObject ( something )	{
		if ( typeof( something ) == 'string' )
			return document.getElementById ( something );
		if ( typeof( something.nodeName ) != 'undefined' )
			return something;
		return null;
	}
	
	function setElementOpacity ( something, opacity )	{
		var old = something;
		something = toObject( something );
		if( !something )
			alert( something + " " + old );

		if( opacity < 0 )
			opacity = 0;
		else if( opacity > 1 )
			opacity /= 100;

		if( document.all )
			something.style.filter = 'alpha(opacity=' + ( opacity * 100 ) + ')';
		else
			something.style.MozOpacity = opacity;
		something.style.opacity = opacity;
	}

	function setElementPosition( something, posx, posy, type )	{
		something = toObject( something );
		if( !type )
			type = 'absolute';
		something.style.position = type;
		something.style.left = posx + 'px';
		something.style.top = posy + 'px';
	}

	function showElement ( something )	{
		something = toObject ( something );
		if ( something )	{
			something.style.visibility = 'visible';
			something.style.display = 'block';
		}
	}
	
	function hideElement ( something )	{
		something = toObject ( something );
		if ( something )	{
			something.style.visibility = 'hidden';
			something.style.display = 'none';
		}
	}
	
	function getIEVersionNumber() {
	    var ua = navigator.userAgent;
	    var MSIEOffset = ua.indexOf("MSIE ");
	    
	    if (MSIEOffset == -1) {
	        return 8;
	    } else {
	        return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
	    }
	}

	function popupHTML( ttitle, ttext )	{
		
		var isIE7Min = getIEVersionNumber() < 7;
		
		var mPHolder = document.getElementById( 'mPHolder' );
		var title = content = arrow = null;
		if( !mPHolder )	{
			mPHolder = document.createElement( 'div' );
			mPHolder.id = 'mPHolder';
			mPHolder.style.position = isIE7Min? 'absolute' : 'fixed';
			mPHolder.style.top = '0px';
			mPHolder.style.left = '0px';
			mPHolder.style.height = '100%';
			mPHolder.style.width = '100%';
			mPHolder.style.zIndex = '3';
			document.body.appendChild( mPHolder, document.body.firstChild );
			
			var mPHolderBack = document.createElement( 'div' );
			mPHolderBack.id = 'mPHolderBack';
			setElementOpacity( mPHolderBack, 0.6 );
			mPHolderBack.style.position = isIE7Min? 'absolute' : 'fixed';
			mPHolderBack.style.top = '0px';
			mPHolderBack.style.left = '0px';
			mPHolderBack.style.height = '100%';
			mPHolderBack.style.width = '100%';
			mPHolder.appendChild( mPHolderBack );
			
			var mPHolderHolder = document.createElement( 'div' );
			mPHolderHolder.id = 'mPHolderHolder';
			mPHolderHolder.style.position = isIE7Min? 'absolute' : 'fixed';
			mPHolderHolder.style.top = '0px';
			mPHolderHolder.style.left = '0px';
			mPHolderHolder.style.height = '100%';
			mPHolderHolder.style.width = '100%';
			mPHolder.appendChild( mPHolderHolder);
			
			var mainTable = document.createElement( 'table' );
			mainTable.cellPadding = mainTable.cellSpacing = 0;
			mainTable.style.height = '100%';
			mainTable.style.width = '100%';
			mPHolderHolder.appendChild( mainTable );
			
			var mainRow = mainTable.insertRow( 0 );
			var mainCell = mainRow.insertCell( 0 );
			mainCell.id = 'mPCellHolder';
			addEvent( mainCell, 'click', function ( evt )	{
					elem = ( evt.srcElement ? evt.srcElement : evt.target );
					if( elem && elem.id == 'mPCellHolder' )
						popupHTMLClose( );
				}
			);
			
			var borderTable = document.createElement( 'table' );
			borderTable.cellPadding = borderTable.cellSpacing = 0;
			borderTable.align = 'center';
			mainCell.appendChild( borderTable );
			//--R
			var borderRow = borderTable.insertRow( 0 );
			var borderCell = borderRow.insertCell( 0 );
				
			elem = document.createElement( 'div' );
			elem.id = 'pHTMLHolder';
			borderCell.appendChild( elem );
			
			button = document.createElement( 'div' );
			button.id = 'pHTMLButton';
			elem.appendChild( button );

			a = document.createElement( 'div' );
			a.onclick = popupHTMLClose;
			button.appendChild( a );
			
			title = document.createElement( 'div' );
			title.id = 'pHTMLTitle';
			elem.appendChild( title );
			
			content = document.createElement( 'div' );
			content.id = 'pHTMLContent';
			elem.appendChild( content );
			
			var down = document.createElement( 'div' );
			down.id = 'pHTMLDown';
			elem.appendChild( down );
		}
		
		document.body.style.overflow = 'hidden';
		

		title = toObject( 'pHTMLTitle' );
		content = toObject( 'pHTMLContent' );
		if( !ttext )
			ttext = '<div class="pHTMLWait"></div>';
		content.innerHTML = ttext;
		title.innerHTML = ttitle;
		showElement( mPHolder );
		
	}
	
	function popupHTMLClose( )	{
		var elem = document.getElementById( 'mPHolder' );
		if( elem )
			hideElement( elem );
		
		document.body.style.overflow = '';
		
		return false;
	}

/* EVENTS */
	function addEvent( obj, evtType, func, useCapture )	{
		obj = toObject( obj );
		if ( obj.addEventListener )	{
			obj.addEventListener( evtType, func, useCapture );
			return true;
		}
		else if ( obj.attachEvent )
			return obj.attachEvent( "on" + evtType, func );
		else
			alert( "Handler could not be attached." );
		return false;
	} 

	function removeEvent( obj, evtType, func, useCapture )	{
		if ( obj.removeEventListener )	{
			obj.removeEventListener( evtType, func, useCapture );
			return true;
		}
		else if ( obj.detachEvent )
			return obj.detachEvent( "on" + evtType, func );
		else
			alert( "Handler could not be removed." );
		return false;
	} 

	function stopProp( evt )	{
		if ( evt && evt.stopPropogation )
			evt.stopPropogation( );
		else if ( window.event && window.event.cancelBubble )
			window.event.cancelBubble = true;
	}

	function stopDef( evt )	{
		if ( evt && evt.preventDefault )
			evt.preventDefault( );
		else if ( window.event && window.event.returnValue )
			window.eventReturnValue = false;
	} 

