var UIMaster = { items : [], item_under_mouse : function( X, Y ) { var ret = undefined; for( var idx in this.items ) { var itm = this.items[ idx ]; if( Y >= itm.top() && Y <= itm.bottom() && X >= itm.left() && X <= itm.right() ) { if( (! ret) || ret.priority < itm.priority ) { ret = itm; } } } return ret; }, //item_under_mouse init:function( attachpoint ) { this.selector = ( function(ap) { return function() { return $( ap ) } } )( attachpoint ); $( attachpoint ).mousemove( (function(master) { return function( event ) { var X = event.pageX; var Y = event.pageY; var item = master.item_under_mouse( X, Y ); if( item ) { if( master.over == item ) { item.mouse_move( X, Y ); } else if( master.over ) { master.over.mouse_leave( X, Y ); item.mouse_enter( X, Y ); } else { item.mouse_enter( X, Y ); } } else if( master.over ) { master.over.mouse_leave( X, Y ); } if( master.holding ) { master.holding.mouse_move( X, Y ); } } } ) ( this ) ); // init - mousemove }, //init make_item:function() { var id = items.length; var itm { id:id, selector:function() { return $( '#_' + this.id ); }, offset:function() { return this.selector().offset(); }, top:function() { return this.offset().top; }, left:function() { return this.offset().left; }, bottom:function() { return this.top() + this.selector().height; }, right:function() { return this.left() + this.selector().width; }, mouse_move:function( X, Y ) {}, mouse_enter:function( X, Y ) {}, mouse_leave:function( X, Y ) {}, mouse_up:function( X, Y ) {}, mouse_down:function( X, Y ) {}, click:function() {}, accepts:function( item, X, Y ) {}, accept:function( item, control, X, Y ) {}, give:function( item, control, X, Y ) {} }; return itm; }, //make_item }; //UIMaster