// utils.js

var mBrowser = new Browser();


//===========================================================================
function Browser() {

  var ua, s, i;

  this.isIE    = false;
  this.isNS    = false;
  this.version = null;

  ua = navigator.userAgent;

  s = "MSIE";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as NS 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0) {
    this.isNS = true;
    this.version = 6.1;
    return;
  }
}

//----------------------------------------------------------------
function GetTick()
	{
	var today = new Date();	
	return today.getTime();
	}	
	
//----------------------------------------------------------------
function PadZero(num, len)
	{
	num += "";
	for (var cnt = num.length; cnt < len; cnt++)
		{
		num = "0"+num;	
		}
	return num;
	}	
	
//----------------------------------------------------------------
function TickToMMSSHH(ms)
	{
	var mins = Math.floor(ms/60000);
	ms -= mins*60000;
	var secs = Math.floor(ms/1000);
	ms -= secs*1000;
	var hunds = Math.round(ms/10);
	var s = (PadZero(mins,2)+":"+PadZero(secs,2)+":"+PadZero(hunds,2));
	return {minutes: mins, seconds: secs, millisecs: hunds, str: s}
	}			

//----------------------------------------------------------------
function GetCursorPos(event)
	{
	var xpos;
	var ypos;
	
  // Get cursor position with respect to the page.
  if (mBrowser.isIE) {
    xpos = window.event.clientX + document.documentElement.scrollLeft
      + document.body.scrollLeft;
    ypos = window.event.clientY + document.documentElement.scrollTop
      + document.body.scrollTop;
  }
  else if (mBrowser.isNS) {
    xpos = event.clientX + window.scrollX;
    ypos = event.clientY + window.scrollY;
  }

	return {
		x: xpos,
		y: ypos
	}
}


var mDragElem;
var mPuckDiam = 17;
var mTicksNeededForPause= 30;

var mDragLimitTop;
var mDragLimitLeft;
var mDragLimitBottom;
var mDragLimitRight;

//---------------------------------------------------------
function SetDragAttributes(top,left,bottom,right)
	{
	mDragLimitTop = top;
	mDragLimitLeft = left;
	mDragLimitBottom = bottom;
	mDragLimitRight = right;
	}

function DragObject_Begin(event, id)
	{
	Drag_Begin(event, id);	
	}
//----------------------------------------------------------------
function Drag_Begin(event, id)
	{
	if (event == undefined || !event) {
		event = window.event;
	}
	if (id == undefined)
		{
		mDragElem = GetEventTarget(event);
		
		if (mDragElem.dragTargetID != undefined)	
			{
			mDragElem = document.getElementById(mDragElem.dragTargetID);
			}
		}
	else 
		{
		mDragElem = document.getElementById(id);
		}
	switch(mDragElem.className)
		{
		case "panel":
		case "drag":
			break;
		default:
			return;
		}
	if (mDragElem.className == "panel")
		{
		mDragElem.panel.MakeTop();
		}
	var mousePos = GetCursorPos(event);
	mDragElem.lastMouseX = mousePos.x;
	mDragElem.lastMouseY = mousePos.y;
	
	// Save starting positions of cursor and element.
	mDragElem.cursorStartX = mousePos.x;
	mDragElem.cursorStartY = mousePos.y;
	mDragElem.elStartLeft  = parseInt(mDragElem.style.left, 10);
	mDragElem.elStartTop   = parseInt(mDragElem.style.top,  10);
	mDragElem.elLastLeft  = mDragElem.elStartLeft;
	mDragElem.elLastTop   = mDragElem.elStartTop;
	
  if (isNaN(mDragElem.elStartLeft)) mDragElem.elStartLeft = 0;
  if (isNaN(mDragElem.elStartTop))  mDragElem.elStartTop  = 0;

  // Capture mousemove and mouseup events on the page.
  if (mBrowser.isIE) {
    document.attachEvent("onmousemove", MouseMoved);
    document.attachEvent("onmouseup",   DragStopped);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (mBrowser.isNS) {
    document.addEventListener("mousemove", MouseMoved,   true);
    document.addEventListener("mouseup",   DragStopped, true);
    event.preventDefault();
  }
  	mDragElem.beingDragged = true;
	mDragElem.hVelocity = 0;
	mDragElem.vVelocity = 0;
	mDragElem.startReleaseTime = 0;
	mDragElem.lastMoveTime = 0;
}

//--------------------------------------------------------------------------
function MouseMoved(event) 
	{
	var mousePos = GetCursorPos(event)
	
	// Move drag element by the same amount the cursor has moved.
	var px = (mDragElem.elStartLeft + mousePos.x - mDragElem.cursorStartX) + "px";
	mDragElem.style.left = px;
	px = parseInt(px);
	var py  = (mDragElem.elStartTop  + mousePos.y - mDragElem.cursorStartY) + "px";
	mDragElem.style.top = py;
	py = parseInt(py);

	// if puck isn't on the board, reset release tracking
	if ((py+mPuckDiam) > mDragLimitBottom)
		{
		mDragElem.startReleaseTime = 0;
		}
	else
		{ // mouse just moved on board...
		if ((GetTick()- mDragElem.lastMoveTime) >= mTicksNeededForPause)
			{
			mDragElem.StartReleaseX = px;
			mDragElem.StartReleaseY = py;	
			mDragElem.startReleaseTime = GetTick();
			}
		mDragElem.lastMoveTime = GetTick();
		}

  if (mBrowser.isIE) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (mBrowser.isNS)
    event.preventDefault();
}

//--------------------------------------------------------------------------
function DragStopped(event) {
	
  // Stop capturing mousemove and mouseup events.

  if (mBrowser.isIE) {
    document.detachEvent("onmousemove", MouseMoved);
    document.detachEvent("onmouseup",   DragStopped);
  }
  if (mBrowser.isNS) {
    document.removeEventListener("mousemove", MouseMoved,   true);
    document.removeEventListener("mouseup",   DragStopped, true);
  }
 mDragElem.beingDragged = false;

 if (mDragElem.postDragFunc != undefined)
 	{
 	mDragElem.elEndTop   = parseInt(mDragElem.style.top,  10);
   	mDragElem.elEndLeft  = parseInt(mDragElem.style.left, 10);

	mDragElem.tickerEnd = GetTick();
 	mDragElem.postDragFunc(mDragElem);
	}
}

//---------------------------------------------------------
function GetEventTarget(e)
	{
	if (e == undefined) e = window.event;
	if (e.target) return e.target;
	else return event.srcElement;
	}

//---------------------------------------------------------
function getElementsByClassName(cl) {
var retnode = [];
var myclass = new RegExp('\\b'+cl+'\\b');
var elem = document.getElementsByTagName('*');

for (var i = 0; i < elem.length; i++) {
	var classes = elem[i].className;
	if (myclass.test(classes)) retnode.push(elem[i]);
}
return retnode;
}
//---------------------------------------------------------
    function lightup(imageobject, opacity){
    if (navigator.appName.indexOf("Netscape")!=-1&&parseInt(navigator.appVersion)>=5)
    imageobject.style.MozOpacity=opacity/100
    else if (navigator.appName.indexOf("Microsoft")!=-1&&parseInt(navigator.appVersion)>=4)
    imageobject.filters.alpha.opacity=opacity
}
function slowhigh(which2){
imgobj=which2
browserdetect=which2.filters? "ie" : typeof which2.style.MozOpacity=="string"? "mozilla" : ""
instantset(baseopacity)
highlighting=setInterval("gradualfade(imgobj)",50)
}

function slowlow(which2){
cleartimer()
instantset(baseopacity)
}

function instantset(degree){
if (browserdetect=="mozilla")
imgobj.style.MozOpacity=degree/100
else if (browserdetect=="ie")
imgobj.filters.alpha.opacity=degree
}

function cleartimer(){
if (window.highlighting) clearInterval(highlighting)
}

function gradualfade(cur2){
if (browserdetect=="mozilla" && cur2.style.MozOpacity<1)
cur2.style.MozOpacity=Math.min(parseFloat(cur2.style.MozOpacity)+0.1, 0.99)
else if (browserdetect=="ie" && cur2.filters.alpha.opacity<100)
cur2.filters.alpha.opacity+=10
else if (window.highlighting)
clearInterval(highlighting)
}


