function uiDropDownClass( anchorId , ddmId , scrollable , height , width , triggerEvent ){

	var c1 = jml.obj
	var c2 = jml.xml.node
	var c3 = jml.events;
	var c4 = new uiLayerClass();
	
	var host;
	var anchorId = anchorId || null;
	var ddmId = ddmId || null;
	var ddmenu;
	var anchor;
	
	var forcedWidth = width || 190 ;
	var forcedHeight = height || null ;
	var forcedScrollable = scrollable || false ;
	var TriggerEvent = triggerEvent || "mouseover" ;
	
	var firstRun ;
	
	var intl ;
	var mouseinSector ;	
	var delay = 0;
	
	c4.onCreate = function( structure ){
	
		if( !isset( ddmenu ) ) ddmenu = structure.container;
		
		setPosition() ;

		if( !isset( firstRun ) ){
			firstRun = true;
			var x1 = c2.byPath( '0.0' , structure.content );
			for( var i = 0; i< c2.length(x1); i++){
				var x2 = c2.byPosition( i , x1 );
				if( isset(x2) ){
					var x3 = c2.byPosition( 0 , x2 );
					if( isset( x3 ) && lower( x3.nodeName ) == "a" ){
						var url = c1.get( x3 , "href" );
						if( url == window.location.href ){ // this may cause error for obvious reasons!
							c1.set( x3 , "href" , "javascript:void(0);" );
							c3.add( x3 , 'click' , function(){ return false; } );
						}
					}
					var s1 = c1.get( x2 , "className" );
					if( !isset(s1) || ( isset(s1) && s1.indexOf('ddmenu_group_label') == -1 ) ){
						c1.set( x2 , "cursor" , "pointer" );
						c3.add( x2 , 'mouseover' , delegate( null, mouseOverItem , x2) );
						c3.add( x2 , 'mouseout' , delegate( null, mouseOutItem , x2) );
						c3.add( x2 , 'click' , delegate( null, selectItem , x2 ) );
					}
				}
			}
		}
	}
	function setPosition(){
		if( isset( anchor ) ){
			var n1 = c1.get( anchor , "offsetLeft" );
			var n2 = c1.get( anchor , "offsetTop" );
			var n3 = c1.get( anchor , "offsetHeight" );
			var nn0 = 0; 
			if( typeof externalInIframe != "undefined" ){
				if( externalInIframe == true ){
					var nn1 = jml.browser.getBodySize().h ;
					var nn2 = c1.get( ddmenu , "offsetHeight" );
					if( n2 + n3 + nn2 > nn1   ) nn0 = nn2 + n3 ;
				}
			}
			c4.setPosition( n1 , n2 + n3 - nn0) ;
		}
	}
	function mouseOverItem( eventObject , object ){ addCssClass( object , "over" ); }
	function mouseOutItem( eventObject , object ){ removeCssClass( object , "over" ); }	
	function selectItem( eventObject , item ){
		if( isset( host.onSelect ) ){
			host.onSelect( item );
			close();
		}else{
			var x1 = c2.byPosition( 0 , item );		
			if( lower( x1.nodeName ) == "a" ){
				var url = c1.get( x1 , "href" );
				if( isset( url ) && !isEmpty( url ) ) window.location.href = url;
			}
    }
	}
	function addCssClass( object , className ){
		var s1 = c1.get( object , "className" );
		if( !isset( s1 ) ) s1 = "";
		if( s1.indexOf( className ) == -1 ) c1.set( object , "className" , s1 + " " + className );
	}
	function removeCssClass( object , className ){
		var s1 = c1.get( object , "className" );
		if( !isset( s1 ) ) s1 = "";
		if( s1.indexOf( className ) != -1 ) c1.set( object , "className" , s1.replace( new RegExp( "(\\b" + className + "\\b)+" , "gi" ) ,"") );
	}
	function init(){
		if( !isset( anchorId ) || !isset( ddmId ) ) return;
		var o1 = getObj( anchorId );
		var o2 = getObj( ddmId );
		if( !isset( o1 ) || !isset( o2 ) ) return;
		anchor = o1;
		c1.set( o1 , 'cursor' , 'pointer' );
		c3.add( o1 , TriggerEvent , display );
	}
	function display(){
		mouseinSector = true ;
		c3.remove( document , 'mousemove', evaluateSector );
		c3.add( document , 'mousemove', evaluateSector );
		clearInterval( intl );
		
		intl = setInterval( delayedEvaluation , 300 ) ;
		isset( ddmenu )? c4.show() : c4.create( ddmId , forcedWidth , forcedHeight , forcedScrollable );
		setPosition() ;
	}
	function close(){
		c4.hide();
	}
	function delayedEvaluation(){
		if( !mouseinSector ){
			clearInterval( intl ) ; 
			c3.remove( document , 'mousemove', evaluateSector );
			close();
		}
	} ;
	function evaluateSector( eventObject ){
		if( delay == 4 ){
			mouseinSector = c3.hitTest( eventObject , [ anchor , ddmenu ] ).on ; 
			delay = 0 ;
		}
		else{ delay ++ ; }
	} ;
	return {
		constructor:function(){
			host=this;		
			c3.add( window , 'load' , init );
			return this;
		},
		initialize:function(){
			c3.remove( window , 'load' , init );
			init();
		},
		onSelect:null
	}.constructor();
}