	function addEvent( obj, type, fn )
	{
		if (obj.addEventListener)
			obj.addEventListener( type, fn, false );
		else if (obj.attachEvent)
		{
			obj["e"+type+fn] = fn;
			obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
			obj.attachEvent( "on"+type, obj[type+fn] );
		}
	}

	function removeEvent( obj, type, fn )
	{
		if (obj.removeEventListener)
			obj.removeEventListener( type, fn, false );
		else if (obj.detachEvent)
		{
			obj.detachEvent( "on"+type, obj[type+fn] );
			obj[type+fn] = null;
			obj["e"+type+fn] = null;
		}
	}

	function debug( a ) {
		var out		= '';
		var type	= typeof a;
		
		if ( arguments[1] )
			var ident = arguments[1];
		else
			var ident = '';

		if ( type == 'boolean' )
			out = ident + 'boolean: ' + a + "\n";
		else
		if ( type == 'string' )
			out = ident + 'string: ' + a + "\n";
		else
		if ( type == 'number' )
			out = ident + 'number: ' + a + "\n";
		else
		if ( type == 'function' )
			out = ident + 'function: ' + a + "\n";
		else
		if ( type == 'object' ) {
			out = ident + 'object: ' + "\n";

			for ( x in a )
				out += ident + x + ':' + debug( a[x], ident + '  ' );
		}
		else
		if ( type == 'undefined' )
			out = 'undefined: ' + a + "\n";

		return out;	
	}

	function Bubble( bubbler, text ) {
		this.createBubble = function ( bubbler, text ) {
			var bubbleID	= bubbler.id + 'Bubble';
			var bubble		= document.createElement( 'div' );
			var atID		= document.createAttribute( 'id' );
			var bubbleTop	= document.createElement( 'div' );
			var bubbleBottom= document.createElement( 'div' );
			var bubbleBody	= document.createElement( 'div' );
			var bubbleText	= document.createTextNode( text );
			
			bubbleBody.appendChild( bubbleText );
			bubble.appendChild( bubbleTop );
			bubble.appendChild( bubbleBody );
			bubble.appendChild( bubbleBottom );

			bubble.setAttribute( 'id', bubbleID );
			bubble.style.display			= 'none';
			bubble.className				= 'bubbleContainer';
			bubbleTop.className				= 'bubbleTop';
			bubbleBottom.className			= 'bubbleBottom';
			bubbleBody.className			= 'bubbleBody';

			bubbler.parentNode.appendChild( bubble );
			
		}
		
		this.showBubble = function ( e ) {
			var bubble = document.getElementById( this.id + 'Bubble' );
			bubble.style.display	= 'block';
			bubble.style.left		= ( e.clientX - 15 ) + 'px';
			bubble.style.top		= ( e.clientY - bubble.offsetHeight - 5 ) + 'px';
		}

		this.hideBubble = function ( e ) {
			var bubble = document.getElementById( this.id + 'Bubble' );
			bubble.style.display	= 'none';
		}

		// constructor
		this.createBubble( bubbler, text );
		addEvent( bubbler, 'mousemove',	this.showBubble );
		addEvent( bubbler, 'mouseout',	this.hideBubble );

	}

	// open player centralized
	function openPlayer( ids ) {
		var left		= screen.width	/ 2 - 205;
		var top			= screen.height	/ 2 - 90;
		var windowUrl	= 'player.php?ids=' + ids;
		var windowName	= 'srplayer';
		var windowParam	= 'width=410,height=180,left=' + left + ',top=' + top;
		try {
			window.open( windowUrl, windowName, windowParam );
		} catch (e) {
			alert( debug( e ) );
		}
	}
