function uiFloatClass( anchorId , contentId ){

	var c1 = jml.obj
	var c2 = jml.xml.node
	var c3 = jml.events;
	var c4 = new uiLayerClass();
	
	var host;
	var intl;
	var delay = 0;
	var open = false ;
	var anchorId = anchorId || null ;
	var contentId = contentId || null ;
	var mouseinSector = false ;
	var elements = { anchor : null , layer : null };	
	
	if( !isset( anchorId ) || !isset( contentId ) ) return null ;
	c4.onCreate = function( layer ){
		if( !isset( elements.layer ) ) elements.layer = layer.container ;
		if( !isset( elements.layer ) ) return ;
		if( isset( host.onBeforeOpen ) ) host.onBeforeOpen();		
		setPosition();
	} ;
	function setPosition(){
		var x1 = elements.anchor ;
		if( isset( elements.anchor ) ){
			var n1 = c1.get( x1 , "offsetLeft" );
			var n2 = c1.get( x1 , "offsetTop" );
			var n3 = c1.get( x1 , "offsetWidth" );
			var n4 = c1.get( x1 , "offsetHeight" ) - 1;			
			var n5 = c1.get( elements.layer , "offsetWidth" );
			var n6 = c1.get( elements.layer , "offsetHeight" ) - 1;			

			var p1, p2 ;
			if( isset( host.customPosition ) ){
				var cp = host.customPosition( n1 , n2 , n3 , n4 , n5 , n6 );
				p1 = cp.x ;
				p2 = cp.y ;
			}else{
				p1 = n1 ;
				p2 = n2 + n4 ;
			}
			c4.setPosition( p1 , p2 ) ;
		}
	} ;
	function delayedEvaluation(){
		var b1 = false ;
		try{ b1 = host.customEvaluation() ; }
		catch( errorObject ){}
		if( !mouseinSector && !b1 ){
			clearInterval( intl ) ; 
			c3.remove( document , 'mousemove', evaluateSectors );
			host.close();
		}
	} ;
	function evaluateSectors( eventObject ){
		if( delay == 4 ){
			mouseinSector = c3.hitTest( eventObject , [ elements.anchor , elements.layer ] ).on ; 
			delay = 0 ;
		}else{ delay ++ ; }
	} ;
	return {
		constructor:function(){ return host = this; },
		initialize:function(){
			if( !isset( elements.anchor ) ) elements.anchor = getObj( anchorId ) ;
			if( !isset( elements.anchor ) ) return null ;
			c3.add( elements.anchor , "mouseover" , host.open );
		},
		open:function( eventObject ){
			if( open ) return ;
			open = true ;
			mouseinSector = true ;
			c3.remove( document , 'mousemove', evaluateSectors );
			c3.add( document , 'mousemove', evaluateSectors );
			clearInterval( intl );
			intl = setInterval( delayedEvaluation , 300 ) ;			
			if( isset( elements.layer ) ){
				c4.show() ;
				c4.onCreate() ;
			}else{
				c4.create( contentId , 300 , 200 , false , "expand" , "expand" ) ;
			}
		},
		close:function(){
			if( isset( host.onBeforeClose ) ) host.onBeforeClose();
			c4.hide() ;
			open = false ;
		} ,
		customEvaluation : null ,
		onBeforeOpen : null ,
		onBeforeClose : null ,
		customPosition : null
	}.constructor();
}