/*
 * Copyright 2005-2007, Peter Rowntree. All Rights Reserved.
 * http://www.hdyn.com/wr/common/contact.php?addr=pr
 * external calls: setObClass
 */

//keep these synched with fb css:
var g_fBoxTop=10; //fb from fBars
var g_fBoxWidth=15;  //(css + 1) --includes border
var g_fBoxHeight=180;
var g_selectedBar=null;

function setAllFlowBars(barsBox,boxType)
{
   var bars=barsBox.getElementsByTagName(boxType);
   if(bars == null)
      return;
   var barsLen=bars.length;
	for(var i=0; i < barsLen; ++i)
   {
      if(!setFlowBar(bars.item(i)))
         break;
   }
}

function setFlowBar(bbox)
{
   var f=bbox.getAttribute("f");
   if(f == null)
      return true;
   if(f == "")
      f=0.0;
   flowToBar(bbox.firstChild,f);
   return true;
}

function offsetToReceiverX(tgt,evtReceiver)
{
	var x=0;
   do
	{
      x+=tgt.offsetLeft;
      tgt=tgt.offsetParent;
	}
	while(tgt != null && tgt != evtReceiver);
   return x;
}

function getEvtReceiverRelX(e,evtReceiver)
{
	var x=0;
   if(typeof e.layerX != 'undefined')
   	x=e.layerX+offsetToReceiverX(e.target,evtReceiver);
   else if(typeof e.offsetX != 'undefined')
      x=e.offsetX+offsetToReceiverX(e.srcElement,evtReceiver)+1;
   return x;
}

function offsetToReceiverY(tgt,evtReceiver)
{
	var y=0;
	while(tgt != evtReceiver)
	{
		y+=tgt.offsetTop;
      tgt=tgt.offsetParent;
      if(tgt == null)
         break;
	}
   return y;
}

function getEvtReceiverRelY(e,evtReceiver)
{
	var y=0;
   if(typeof e.layerY != 'undefined')
   	y=e.layerY+offsetToReceiverY(e.target,evtReceiver);
   else if(typeof e.offsetY != 'undefined')
      y=e.offsetY+offsetToReceiverY(e.srcElement,evtReceiver);
   return y;
}

function obX(e)
{
   if(typeof e.layerX != 'undefined')
   	return e.layerX;
   if(typeof e.offsetX != 'undefined')
      return e.offsetX;
   return null;
}

function flowToBar(barOb,f)
{
   var m=Math.floor(g_fBoxHeight/2);
   var h=Math.floor(Math.abs(f*m));
   barOb.style.height=h+"px";
   barOb.style.top=(f < 0 ? m : m-h)+"px";
   barOb.style.backgroundColor=flowToColor(f);
}

function eventToIndex(e,evtReceiver)
{
   if(!e)
      e=window.event;
	var x=getEvtReceiverRelX(e,evtReceiver);
   return Math.floor(x/g_fBoxWidth);
}

function obEventToIndex(e)
{
	var x=obX(e);
	return Math.floor(x/g_fBoxWidth);
}

function selectBar(barOb)
{
   if(g_selectedBar != null)
   {
      setObClass(g_selectedBar,"selected",false);
      setObClass(g_selectedBar,"gotFlows",false);
   }
   g_selectedBar=barOb;
   if(barOb != null)
      setObClass(barOb,"selected",true);
}

//------- helpers ----------
//does no checks!
function flowToColor(f)
{
	if(typeof f == "string")
   	f=parseFloat(f);
   f=(f+1)/2; //[0,1]
   var guns=[Math.floor(180-f*120),Math.floor(f*240),Math.floor(f*255)];
   return "rgb("+guns.join(",")+")";
}
