/*---------------------------------------------

CODE.JS

common javascript library
front side site

copyright 2005
platformlabs.com
all rights reserved
---------------------------------------------*/

var ob;
var os;
var gk;
var dat=false;

var _typ=new Array();
var _tag=new Array();
var _hdr=new Array();
var _url=new Array();
var _ctl=new Array();

_typ=
[
'',
'vbar',
];


_ctl[0]=
[
//0
[
[1,1,31,[1,26,27],['','FF0000','00FF00'],'uptime(percent)',['','downtime','uptime']]
],
//1
[
[1,1,31,[1,21,22,23,24,25],['','FF00FF','000000','FF0000','0000FF','00FF00'],'average response times(seconds)',['','dns','connection','request','wait','response']]
],
//2
[
[1,1,31,[1,28,30,29],['','FFFFFF','00FF00','FF0000'],'total response times(seconds)',['','','minimum to average','average to maximum']]
],
//3
[
[],
[0,0,45,[4,2],['','AFD8F8']],
[1,0,45,[1,3],['','AFD8F8']],
[0,0,45,[2,1],['','AFD8F8']],
[0,0,45,[2,1],['','AFD8F8']],
[1,1,45,[0,1],['','AFD8F8']]
],
//4
[
[],
[1,1,45,[0,2],['','AFD8F8']],
[1,1,45,[0,2,3],['','AFD8F8','AFAFAF']],
[1,1,45,[0,1],['','AFD8F8']],
[1,1,45,[0,3,2],['','F0F0F0','AFD8F8']]
],
//5
[
[],
[1,1,45,[0,3],['','AFD8F8']],
[1,0,45,[0,1],['','AFD8F8']],
[1,0,45,[0,2,1],['','F0F0F0','AFD8F8']],
[1,0,45,[0,1],['','AFD8F8']],
[1,0,45,[0,1],['','AFD8F8']]
]
];

_tag[0]=
[
//0
[
[],
['<td>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>']
],
//1
[
[],
['<td>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>']
],
//2
[
[],
['<td nowrap>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td align="right">','<td align="right">','<td align="right">'],
['<td>','<td align=right>','<td align=right>'],
['<td>','<td align=right>'],
['<td>','<td align=right>','<td align=right>','<td align=right>']
],
//3
[
[],
['<td>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','','<td align=right>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td align=right>','<td align=right>'],
//['<td>','<td align=right>','<td align=right>','<td>'],
['<td>','<td>'],
],
//4
[
[],
['<td>','<td align=right>','<td align=right>'],
['<td>','<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td>'],
['<td>','<td align=right>','<td align=right>','<td align=right>']
],
//5
[
[],
['<td>','<td align=right>','<td align=right>','<td align=right>'],
['<td align=right>','<td align=right>','<td align=right>'],
['<td align=right>','<td align=right>','<td align=right>'],
['<td align=right>','<td align=right>','<td align=right>'],
['<td>','<td align=right>']
]

];

_hdr[0]=
[
//0
[
[],
['date','count','min','max','avg','total','pages','seconds']
],
//1
[
[],
['date','count','min','max','avg','total','pages','seconds']
],
//2
[
[],
['date','new','repeat','total','pages','avg pages','avg duration','sales','$/visit','$/page'],
['date','rate','bounces','sessions'],
['date','percent','exits','total'],
['date','sessions','count'],
['date','count'],
['date','sessions','avg pages','avg seconds']
],
//3
[
[],
['date','terms','referrals','value'],
['engine','','count','percent','value','each'],
['date','landing pages','referrals','value'],
['date','words','phrases'],
//['','referrals','phrases','key word'],
['date','count']
],
//4
[
[],
['date','urls','views'],
['date','count','loadtime','readtime'],
['date','pages'],
['date','pages','views','referrals']

],
//5
[
[],
['date','javascript','cookies','both'],
['language','percent','coverage'],
['width','percent','coverage'],
['timezone','percent','coverage'],
['vendor','percent']
]
];

_url[0]=
[
//0
[
[],
['<a href="" onclick="return(pops(1,1,0,\'##\'));">##</a>','##','##','##','##','##','##','##']
],
//1
[
[],
['<a href="" onclick="return(pops(1,1,0,\'##\'));">##</a>','##','##','##','##','##','##','##']
],
//2
[
[],
['<a href="" onclick="return(pops(2,1,1,\'##\'));">##</a>','##','##','##','##','##','##','##','##','##'],
['<a href="" onclick="return(pops(2,2,3,\'##\'));">##</a>','##','##','##'],
['<a href="" onclick="return(pops(2,3,2,\'##\'));">##</a>','##','##','##'],
['<a href="" onclick="return(pops(2,4,4,\'##\'));">##</a>','##','##'],
['<a href="" onclick="return(pops(2,5,13,\'##\'));">##</a>','##'],
['<a href="" onclick="return(pops(2,6,14,\'##\'));">##</a>','##','##','##']
],
//3
[
[],
['<a href="" onclick="return(pops(3,7,1,\'##\'));">##</a>','##','##','##'],
//['<a href="" onclick="return(pops(3,6,11,\'##\'));"><b>?</b></a>','##','##','##','##','##'],
['<a href="" onclick="return(pops(3,6,11,\'##\'));">','##</a>','##','##','##','##'],
['<a href="" onclick="return(pops(3,8,1,\'##\'));">##</a>','##','##','##'],
['<a href="" onclick="return(pops(3,4,0,\'##\'));">##</a>','##','##'],
//['<a href="" onclick="return(pops(3,4,11,\'##\'));">?</a>','##','##','##'],
['<a href="" onclick="return(pops(3,5,11,\'##\'));">##</a>','##'],
],
//4
[
[],
['<a href="" onclick="return(pops(4,1,5,\'##\'));">##</a>','##','##'],
['<a href="" onclick="return(pops(4,2,6,\'##\'));">##</a>','##','##','##'],
['<a href="" onclick="return(pops(4,3,7,\'##\'));">##</a>','##'],
['<a href="" onclick="return(pops(4,4,6,\'##\'));">##</a>','##','##','##']

],
//5
[
[],
['##','##','##','##'],
['##','##','##'],
['<a href="" onclick="return(pops(5,3,12,\'##\'));">##</a>','##','##'],
['##','##','##'],
['##','##']
]
];





/*-------------------------------------------
make form visible
--------------------------------------------*/
function form(x)
{
var s;

s=document.getElementById(x);

if(s!=null)
  {
  s.style.display=(s.style.display=='inline')?('none'):('inline');
  }

return(false);
}



/*-------------------------------------------
div limits
--------------------------------------------*/
function fxml(x,mx,mn)
{
var s;
var ymax;
var ymin;
var vmax;
var vmin;
var cdiv;

cdiv=9;
ymin=0;
ymax=1;
vmin=mn;
vmax=mx;

while(vmax<0.1)
{
ymax=ymax/10;
vmax=vmax*10;
}

while(vmax>1.0)
{
ymax=ymax*10;
vmax=vmax/10;
}

if(vmax < 0.2)
  {
  ymax=ymax/5;
  cdiv=3;
  }
  else
  {
  if(vmax < 0.5)
    {
    ymax=ymax/2;
    cdiv=4;
    }
  }


if(vmin<0)
  {
  ymin=-1;
  while(vmin > -0.1)
  {
  ymin=ymin/10;
  vmin=vmin*10;
  }
  while(vmin < -1.0)
  {
  ymin=ymin*10;
  vmin=vmin/10;
  }
  if(vmin > -0.2)
    {
    ymin=ymin/5;
    }
    else
    {
    if(vmin > -0.5)
      {
      ymin=ymin/2;
      }
    }
  cdiv=cdiv + 1 + Math.floor(cdiv*(Math.abs(ymin)/Math.abs(ymax)));
  }

s=x;
s=s.replace(/##YMAX##/g,ymax);
s=s.replace(/##YMIN##/g,ymin);
s=s.replace(/##CDIV##/g,cdiv);

return(s);
}


/*-------------------------------------------
create xml dataset
--------------------------------------------*/
function load(ctl)
{
var rh=new RegExp(/##H##/g);
var rs=new RegExp(/##S##/g);
var rc=new RegExp(/##C##/g);
var rv=new RegExp(/##V##/g);

var a=new Array();
var n;
var c="<category name='##C##'  />";
var d="<set value='##V##' />";
var s="<dataset seriesName='##S##' color='##H##' showValues='0' alpha='80'>";
var xml="<graph caption='##NAME##' showNames='1' canvasBorderThickness='2' canvasBorderColor='D0D0D0' canvasBgAlpha='60' bgColor='FFFF00' bgAlpha='10' rotateNames='1' showColumnShadow='0' yAxisMinValue='##YMIN##' yAxisMaxValue='##YMAX##'  numDivlines='##CDIV##' divlineThickness='1' showDivLineValue='1' divlinecolor='D0D0D0' showLimits='0' zeroPlaneColor='101010' zeroPlaneAlpha='80'  zeroPlaneThickness='1'>";

var t;
var f;
var r;
var z;
var q;
var mx;
var mn;
var nx;
var nn;
var xb;
var xe;
var cx;
var ct;

rh.compile;
rs.compile;
rc.compile;
rv.compile;

q=ctl[2]>dat.length?dat.length:ctl[2];
f=ctl[1];
z=f?q-1:0;

ct=ctl[3];
cx=ct.length;
for(x=0;x<cx;x++)
{
a[x]=[];
if(x==0)
  {
  a[x].push("<categories>");
  }
  else
  {
  t=s.replace(rh,ctl[4][x]);
  t=t.replace(rs,ctl[6][x]);
  a[x].push(t);
  }
}

xe=ctl[3][ctl[3].length-1];
xb=ctl[3][1];
mx=0;
mn=0;

for(y=0;y<q;y++)
{
nn=0;
nx=0;
for(x=0;x<cx;x++)
{
if(x==0)
  {
  a[x].push(c.replace(rc,dat[y][ct[x]]));
  }
else
  {
  a[x].push(d.replace(rv,dat[y][ct[x]]));
  nn+=dat[y][ct[x]]<0?dat[y][ct[x]]:0;
  nx+=dat[y][ct[x]]>0?dat[y][ct[x]]:0;
  }
}
mx=Math.max(mx,nx);
mn=Math.min(mn,nn);
}

xml=xml.replace(/##NAME##/g,ctl[5]);
xml=[fxml(xml,mx,mn)];
for(x=0;x<cx;x++)
{
if(x==0)
  {
  xml.push(a[x].join(""));
  xml.push("</categories>");
  }
else
  {
  xml.push(a[x].join(""));
  xml.push("</dataset>");
  }
}

xml.push("</graph>");
xml=xml.join("");

return(xml);
}


/*-------------------------------------------
draw graph
--------------------------------------------*/
function draw(s,g,r)
{
var t;
var c;
var ewf='<EMBED src="http://www.basicstate.com/swf/##WSWF##.swf" name="fc" FlashVars="&dataXML=##DT##&chartWidth=450&chartHeight=300" loop="false" quality="high" WIDTH="450" HEIGHT="300" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>';
var owf='<OBJECT classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" WIDTH="450" HEIGHT="300" id="fc"><PARAM NAME=movie VALUE="http://www.basicstate.com/swf/##WSWF##.swf"><PARAM NAME=FlashVars VALUE="&dataXML=##DT##&chartWidth=450&chartHeight=300"><PARAM NAME=quality VALUE=high><PARAM NAME="LOOP" VALUE="false"></OBJECT>';
var ctl;

window.status="";

while(1)
{
ctl=_ctl[s][g][r];
if(ctl==null) break;
if(ctl.length==0) break;
if(!ctl[0]) break;
t=_typ[ctl[0]];
if(t=='') break;
c=navigator.userAgent.indexOf('MSIE')<0?ewf:owf;
c=c.replace(/##WSWF##/,t);
c=c.replace(/##DT##/,load(ctl));
//document.write('<div class="draw">');
document.write(c);
//document.write('</div><br>');
break;
}

return;
}



/*---------------------------------------
write out a table from sql data
---------------------------------------*/
function grid(s,g,r)
{
var n;
var w;
var j;
var p=new Array();
var rg=new RegExp(/##/g);

if(dat)
{
var tag=_tag[s][g][r];
var hdr=_hdr[s][g][r];
var url=_url[s][g][r];
rg.compile;

form('calc');   // flip calc on

w=dat.length;

for(j=0;j<w;j++)
{
n=dat[j][2]*1000;
dat[j][21]=n?Math.abs((dat[j][6])/n)            :0;
dat[j][22]=n?Math.abs((dat[j][9] -dat[j][6]) /n):0;
dat[j][23]=n?Math.abs((dat[j][12]-dat[j][9]) /n):0;
dat[j][24]=n?Math.abs((dat[j][15]-dat[j][12])/n):0;
dat[j][25]=n?Math.abs((dat[j][18]-dat[j][15])/n):0;
dat[j][28]=n?dat[j][19]/1000:0;
dat[j][29]=n?dat[j][20]/1000:0;
dat[j][30]=n?dat[j][18]/n:0; 
n=Math.abs(dat[j][2])+Math.abs(dat[j][3]);
n=n>0?n:1;
dat[j][26]=n?0-((100*dat[j][3])/n):0;
dat[j][27]=n?0+((100*dat[j][2])/n):0;
}

draw(s,0,r);
draw(s,1,r);
draw(s,2,r);

w=hdr.length;
r=dat.length;

p.push('<div class="data"><table valign=top nowrap cols='+w+ '><tr>');


for(j=0;j<w;j++)
{
if(tag[j]!=''&&j>0) p.push('</th>');
p.push(tag[j].replace(/<td/,'<th'));
p.push(hdr[j]);
}
p.push('</th></tr>');

for(n=0;n<r;n++)
{
p.push('<tr>');
for(j=0;j<w;j++)
   {
   if(tag[j]!=''&&j>0) p.push('</td>');
   p.push(tag[j]);
   p.push(url[j].replace(rg,dat[n][j]));
   }
p.push('</td></tr>');
}

p.push('</table></div>');
p=p.join('');
document.write(p);
}
form('calc');               // flip wait msg off
return(false);
}


/*---------------------------------------
receive data
---------------------------------------*/
function data(e)
{
dat=e;
form('read');   // flip read wait off
if(e.length>0)
  {
  grid(0,0,0);
  }
  else
  {
  document.write("no available data for selected test");
  }
return;
}


/*------------------------------------------------
eof
------------------------------------------------*/
