var Dom = YAHOO.util.Dom;
var Event=YAHOO.util.Event;
var tt_view_w;
var tt_view_h;
var screenPos;
function ttResetSize(e) {
	tt_view_w=Dom.getViewportWidth();
	tt_view_h=Dom.getViewportHeight();
}

function ttResetScroll(e) {
	screenPos={x:Dom.getDocumentScrollLeft(),y:Dom.getDocumentScrollTop()};
}



var yh_tt;

var tt_header=document.createElement('div');
tt_header.id='tt_header';
tt_header.className='tt_header';

var tt_inner=document.createElement('div');
tt_inner.id='tt_inner';
tt_inner.className='yh_tooltip';

var tt_div=document.createElement('div');
tt_div.id='yh_tt';
tt_div.className='yh_tt_div';
tt_div.appendChild(tt_inner);

function init_tt() {
	document.body.appendChild ( tt_div );
	yh_tt=new YAHOO.widget.Overlay('yh_tt',{visible:false});
	yh_tt.setBody ( tt_div );
	yh_tt.render(document.body);
	tt_div.style.display='';
	Event.addListener ( window, 'resize', ttResetSize );
	Event.addListener ( window, 'scroll', ttResetScroll );
	ttResetSize();
	ttResetScroll();
}

Event.onDOMReady( init_tt );


function _moveNodes(dst,src) {
 var c; // tmp
 // empty dst
 while ( (c=dst.firstChild) ) {
  dst.removeChild(c);
 }
 // move src to dst
 while ( (c=src.firstChild) ) {
  dst.appendChild(src.removeChild(c));  
 }
}

var tt_curElem;
var tt_size={w:200,h:200}; // initial size..

function showTip(e,elem) {
	//elem=Event.getTarget(e);
	var reposition=tt_curElem != elem;
	if (tt_curElem != elem) {
		if (!elem.tt_div) return; // have to try again :)
		if (tt_curElem) {
			// put tt_inner children back in tt_curElem
			//var td=YAHOO.util.Dom.get(tt_curElem.tt_div);
			/*for (var x=0;x<tt_inner.childNodes.length;++x) {
			 td.appendChild ( tt_inner.removeChild(tt_inner.childNodes[x]) );
			} */
			_moveNodes(Dom.get(tt_curElem.tt_div),tt_inner);
			
		}
		tt_div.innerHTML=''; // just a safety check
		tt_curElem=elem;
		
		if (!elem.tt_noheader) {
			tt_div.appendChild(tt_header);
		}

		_moveNodes ( tt_inner, Dom.get(elem.tt_div) );
		tt_div.appendChild ( tt_inner );
		
	}
	
	yh_tt.show();
		
	var r=Dom.getRegion('yh_tt');	
	tt_size={w:r.right-r.left,h:r.bottom-r.top};
	
	var p=Event.getXY(e);
	var newPos=[p[0]+15,p[1]+15];
	// reposition higher if div goes beyond bottom of screen
	// bottom of viewable screen:
	var bs=screenPos.y+tt_view_h
	var swap=0;
	//alert (tt_size.h);
	//alert (screenPos.y);
	//alert (tt_view_h);
	//alert (newPos[1]);
	if (newPos[1] + tt_size.h > bs) {
		swap++;
		newPos[1] -= tt_size.h + newPos[1]-bs;
	}	
	
	// right of screen
	var ls=screenPos.x+tt_view_w;
	if (newPos[0] + tt_size.w > ls) {
		swap++;
		newPos[0] -= tt_size.w+newPos[0]-ls;
	}
	
	// instead of moving, redo the orientation
	if (swap>1) {
		newPos=[p[0]-15-tt_size.w,
				p[1]+300-tt_size.h];
	}
		
	//logDebug ( newPos );
	yh_tt.cfg.setProperty(
		'xy', newPos);

	
	
}

function hideTip(e) {
	yh_tt.hide();
}


function createTip ( elem,divid ) {

	if (arguments.length<3) arguments[2]=true; // default to use header
	
	if (!yh_tt || !elem || elem.tt_div ) return; // not yet initialized	
	elem.tt_div=divid;
	elem.tt_noheader=!arguments[2];
	
	Event.addListener ( elem, 'mouseover', showTip, elem );
	Event.addListener ( elem, 'mouseout', hideTip );
	Event.addListener ( elem, 'mousemove', showTip, elem );
	
}




