var yPositionTop = new Array(10,50,50,10,10,49,49,11,11,50);
var top = 0;
var yPositionAverage = new Array(0,0,0,0,0,0,0,0,0,0);
var avg = 0;
var yPositionDirection = new Array(0,0,0,0,0,0,0,0,0,0);
var dir = 0;
var xPosition = new Array(240,240,480,480,244,244,476,476,244,480);
var lastMeasurement = "(keine Messung)";
var avgDirection = new Array(0,0,0,0,0,0,0,0,0,0);
var avgDirectionX = new Array(0,0,0,0,0,0,0,0,0,0);

var xPositionDraw = null;
var yPositionTopDraw = null;
var yPositionAvgDraw = null;
var avgDirectionDraw = null;
var avgDirectionXDraw = null;

var windDistr = new Array(0,0,0,0,0,0,0,0);
var topDay = 0;
var topAvgDay = 0;
var count4Bf = 0;
var avgDay = 0;

var col = new Array("#FFFF99","#00FF00","#FF0000");
var windDistrCol = new Array("#0000FF","#006060","#00FF00","#806000","#FF0000","#B00040","#800080","#501080"); // north, northwest,west,southwest,south,southeast,east,northeast
var windDistrNames = new Array("Nord","Nordwest","West","S&uuml;dwest","S&uuml;d","S&uuml;dost","Ost","Nordost");
var windDistrTimes = new Array("08:00-09:59","10:00-11:59","12:00-13:59","14:00-15:59","16:00-17:59","18:00-19:59","20:00-21:59","22:00-23:59","00:00-01:59","02:00-03:59","04:00-05:59","06:00-07:59");
var timeScale= new Array("&nbsp;8h","&nbsp;9h","10h","11h","12h","13h","14h","15h","16h","17h","18h","19h","20h","21h","22h","23h","&nbsp;0h","&nbsp;1h","&nbsp;2h","&nbsp;3h","&nbsp;4h","&nbsp;5h","&nbsp;6h","&nbsp;7h","&nbsp;8h");
var speedScale60 = new Array("&nbsp;0","&nbsp;5","10","15","20","25","30","35","40","45","50","55","60","km/h");
var speedScale120 = new Array("&nbsp;0","10","20","30","40","50","60","70","80","90","100","110","120","km/h");

// Sizes; 0= in main frame, 1= full screen,2=...
var xTickDf = new Array(48,48,10); // advance xTick pixels per hr
var yTickDf = new Array(6,8,1); // advance yTick pixels per km/h
var pieSize = new Array(180,240,60);
var lastMeasPosX = new Array(400,400,400);
var lastMeasYOffset=32;
var yscaling = 1; // changes to two in normalizeToCoord, if Wind> 60km/h
var totMeas = 0;

//adapt the km and hr-values to the coord system
function normalizeToCoord(picBeginX,picBeginY,xTick,yTick)
{
    yscaling = 1;
    xIncr = Math.round((45 / xTick) - 0.5) +1;
    //document.write("xincr:"+xIncr+" avgDirection.length:"+avgDirection.length);
    xPositionDraw = new Array(Math.round(xPosition.length/xIncr));
    yPositionTopDraw = new Array(Math.round(yPositionTop.length/xIncr));
    yPositionAvgDraw = new Array(Math.round(yPositionAverage.length/xIncr));
    avgDirectionDraw = new Array(Math.round(avgDirection.length/xIncr));
    avgDirectionXDraw = new Array(Math.round(avgDirection.length/xIncr));

    topDay = 0;

    do {
        var yTop = 0, yAvgTop = 0, yAvg=0, posTot = 0;
        count4Bf = 0;
        avgDay = 0;
        if(topDay >=60) yscaling = 2;

        for(j=0;j<yPositionTopDraw.length;j++)
        {
            for(i=0;(i<xIncr) && (posTot < yPositionAverage.length);i++)
            {
                yTop = Math.max(yTop,yPositionTop[posTot]);
                yAvgTop = Math.max(yAvgTop,yPositionAverage[posTot]);
                yAvg += yPositionAverage[posTot];
                if(yPositionAverage[posTot]>=20) count4Bf++;
                windDistr[Math.round(yPositionDirection[posTot++] / 4.5) % 7]++;
                totMeas++;
            }
            if(yTop > topDay) topDay = yTop;
            if(yAvgTop > topAvgDay) topAvgDay = yAvgTop;
//            alert("yAvg:"+yAvg+" posTot:"+posTot);
            avgDay += yAvg;
            yPositionTopDraw[j] = picBeginY - yTop * yTick / yscaling;
            yPositionAvgDraw[j] = picBeginY - Math.round(yAvg/xIncr) * yTick / yscaling;
            xPositionDraw[j] = picBeginX + xPosition[j*xIncr]*xTick / 60;
            yTop = 0; yAvg = 0;
        }
        //alert("topDay:"+topDay+" yscaling:"+yscaling);
    } while ((topDay >= 60) && (yscaling < 2));
//    alert("avgDay:"+avgDay+"  posTot:"+posTot);
    avgDay = Math.round(avgDay / posTot);
    j=0;
    for(i=0;i<avgDirectionDraw.length;i++)
    {
        avgDirectionDraw[i] = avgDirection[j];
        avgDirectionXDraw[i] = picBeginX + avgDirectionX[j]*xTick/4;
        j+=xIncr;
    }
}

function drawCoord(jg,picBeginX,picBeginY,xTick,yTick,timeScaleOffs,scalesOn)
{
  var xmax = picBeginX + 12 * xTick;
  var ymin = picBeginY - 60 * yTick;

  var i;
  var xfine = Math.round(xTick / 4);
  var overhang = 5; // how much over the horizontal/vertical gridlines the lines are drawn
  // draw fine scales
  jg.setColor("#C0C0C0");

  var yfine=yTick;
  if(yfine < 3) yfine = 5*yTick;
    // draw horizontal fine scale
    for(i=ymin;i<picBeginY;i+=yfine)
        jg.drawLine(picBeginX-overhang,i,xmax,i);

  // make sure x fine scale does not get too small
  if(xfine < 4) xfine = xTick;
  if(xfine > 2)// draw vertical fine scale
    for(i=picBeginX; i<xmax; i+=xfine)
        jg.drawLine(i,ymin,i,picBeginY+overhang);

  // draw axis
  jg.setColor("#000000");
  jg.setStroke(2);
  jg.drawLine(picBeginX,picBeginY,xmax,picBeginY);
  jg.drawLine(picBeginX,picBeginY,picBeginX,ymin);

  // draw rough scales
  jg.setStroke(1);

  // draw horizontal rough scale
  var yIncr = 1;
  if(yTick < 4) yIncr=3;
  for(i=ymin;i<picBeginY;i+=yTick*5*yIncr)
    jg.drawLine(picBeginX-overhang,i,xmax,i);

  // draw vertical rough scale; must be at least 30 apart due to hour scale
  // 12 (hrs) )goes by 6,4,3,2
  var xIncr = xTick;
  if(xIncr < 8) xIncr *= 6;
  if(xIncr < 10) xIncr *= 4;
  if(xIncr < 15) xIncr *= 3;
  if(xIncr < 30) xIncr *= 2;

  for(i=picBeginX;i<=xmax;i+=xIncr)
    jg.drawLine(i,ymin,i,picBeginY+overhang);

  if (scalesOn) {
      incr = xIncr / xTick;
      // draw horizontal scale descriptions
      for(i=0;i<13;i+=incr)
        jg.drawString(timeScale[i+timeScaleOffs],i*xTick+picBeginX-12 /* charW*1.5 */,picBeginY+16);
      //jg.drawString("Zeit",(12+xIncr-(12%xIncr))*xTick+picBeginX-12,picBeginY+8);

      var yIncr = 1;
      if(yTick < 4) yIncr=3;
      // draw vertical scale descriptions
      var speedScaleDraw = [];
      if(yscaling == 1) speedScaleDraw = speedScale60;
      else speedScaleDraw = speedScale120;
      for(i=0;i<13;i+=yIncr)
         jg.drawString(speedScaleDraw[i],picBeginX-30 /* 2*charH */,picBeginY-i * 5 /*kmh / descr */ * yTick-8);
      jg.drawString("km/h",picBeginX-30,picBeginY - (60 + (yIncr-(12%yIncr))*5)*yTick-8);
  }
  // draw legend rectangles
  //jg.setColor(col[2]);
  //jg.fillRect(378,582,20,10);
  //jg.setColor(col[1]);
  //jg.fillRect(508,582,20,10);
  //jg.setColor(col[0]);
  //jg.fillRect(503,562,20,10);
  jg.paint();
}

function drawBeaufort(jg,picBeginX,picBeginY,xTick,yTick,scalesOn)
{
  var xmax = picBeginX + 12 * xTick;
  var ymin = picBeginY - 60 * yTick;
  var beauf = new Array(1,6,12,20,29,39,50,62,75,89,103,118);
  jg.setStroke(2);
  jg.setColor("#0000FF");
  var numBeauf=beauf.length/2+1;
  if (yscaling>1) numBeauf=beauf.length;
  for(i=0;i<numBeauf;i++)
  {
    jg.drawLine(picBeginX,picBeginY-beauf[i]*yTick/yscaling,xmax+8,picBeginY-beauf[i]*yTick/yscaling);
    if(scalesOn) jg.drawString(""+(i+1)+" bf",xmax+8,picBeginY-16-beauf[i]*yTick/yscaling);
  }
}

function drawWindDirection(canvas,picBeginX,picBeginYLo,size)
{
    picBeginY = yTickDf[size]*60-picBeginYLo;
    var jg = new jsGraphics(canvas);
  xIncr = 1;
  for(i=0;i<avgDirectionXDraw.length;i++)
  {
    dirM = avgDirectionDraw[i];
    dirT = "36";
    if((dirM >= 3) && (dirM <= 6))   dirT = "03_06";
    if((dirM >= 7) && (dirM <= 11))  dirT = "07_11";
    if((dirM >= 12) && (dirM <= 15)) dirT = "12_15";
    if((dirM >= 16) && (dirM <= 20)) dirT = "16_20";
    if((dirM >= 21) && (dirM <= 24)) dirT = "21_24";
    if((dirM >= 25) && (dirM <= 29)) dirT = "25_29";
    if((dirM >= 30) && (dirM <= 33)) dirT = "30_33";
    if(((dirM >=34) && (dirM < 36)) || (dirM <= 2)) dirT = "34_02";
    jg.drawImage("images/direction_"+dirT+".gif",avgDirectionXDraw[i],picBeginY+4,12,12);
  }
  jg.setColor("#000000");
  jg.paint();
  //jg.drawString("Richtung",668,525);
}

// draw Windgraph in canvas named at lower left coord picBeginX, picBeginYLo
// size is 0=640*420; 1=640*540;
function drawWindgraph(canvas,picBeginX,picBeginYLo,day,size,beaufOn)
{
    //for(i=0;i<48;i++)
    //    document.write(""+i+",");
    var timeScaleOffs = 12;
    if(day) timeScaleOffs = 0

    var jg = new jsGraphics(canvas);
    
    picBeginY = yTickDf[size]*60-picBeginYLo;
    normalizeToCoord(picBeginX,picBeginY,xTickDf[size],yTickDf[size]);

    drawCoord(jg,picBeginX,picBeginY,xTickDf[size],yTickDf[size],timeScaleOffs,1);
    if(beaufOn)
        drawBeaufort(jg,picBeginX,picBeginY,xTickDf[size],yTickDf[size],1);
    //jg.drawImage(coordSys,29,-10,687,565);
    jg.paint();

    //drawDirection(jg);
    //jg.setStroke(2);

    // direction
    //jg.setColor(col[0]);
    //jg.drawPolyline(xPosition,yPositionDirection);

    jg.setStroke(2);
    // average
    jg.setColor(col[1]);
    jg.drawPolyline(xPositionDraw,yPositionAvgDraw);

    // Top
    jg.setColor(col[2]); // red
    jg.drawPolyline(xPositionDraw,yPositionTopDraw);
    jg.paint();
}

function drawWindDistribution(canvas,picBeginX,picBeginYLo,size,descrOn)
{
    var jg = new jsGraphics(canvas);
    picBeginY = yTickDf[size]*60 - picBeginYLo -pieSize[size];


    var endAngle = Math.round(360+90 + windDistr[0] * 180 / totMeas);
    var oriEndAngle=endAngle%360;

    for(i=0;i<7;i++)
    {
        //document.write("WindDistr["+i+"]:"+windDistr[i]+"<br/>");
        startAngle = endAngle - windDistr[i]*360/totMeas;
        jg.setColor(windDistrCol[i]);
        jg.fillArc(picBeginX,picBeginY,pieSize[size],pieSize[size],startAngle-0.5,endAngle);
        endAngle=startAngle;
    }
    jg.setColor(windDistrCol[7]);
    //document.write("oriEndAngle:"+oriEndAngle+" startAngle:"+startAngle+"<br/>");
    startAngle=Math.round(startAngle)%360;
    jg.fillArc(picBeginX,picBeginY,pieSize[size],pieSize[size],oriEndAngle-0.5,startAngle);

    if(descrOn)
    {
        jg.setFont("arial","16px",Font.BOLD);
        jg.drawString("Windverteilung",picBeginX+48,picBeginY-32);
        jg.setFont("arial","12px",Font.PLAIN);
        var yPos = 0;
        for(j=0;j<2;j++)
        {
            yPos = picBeginY+pieSize[size]+20;

            for(i=0;i<4;i++)
            {
            jg.setColor(windDistrCol[i+j*4]);
            jg.fillRect(picBeginX+10+j*140,yPos,16,16);
            jg.drawString(windDistrNames[i+j*4]+" ("+Math.round(100*windDistr[i+j*4]/totMeas)+"%)",picBeginX+30+j*140,yPos);
            yPos+=20;
            }
        }
    }
    jg.paint();
}

function drawWindDistributionV2(canvas,picBeginX,picBeginYLo,size,descrOn)
{
    var jg = new jsGraphics(canvas);
    var radius = Math.round(pieSize[size] / 2.0);
    var oktPie = Math.round(radius / 4.0);
    var yCenter = yTickDf[size]*60 - picBeginYLo -radius;
    var xCenter = picBeginX + radius;
    
    // there may be rounding in the oktPie... make sure we use the outcome based on center/oktPie
    var picBeginY = yCenter - 4 * oktPie;
    var picBeginX = xCenter - 4 * oktPie;

    // normal scale: pie half for 40 km/h
    var scale = 1;
    if(topAvgDay > 40) scale = 2;
    var scaleFakt = radius / 40.0 / scale;

    jg.setColor("#E0E0E0");
    jg.fillEllipse(picBeginX,picBeginY,8*oktPie+1,8*oktPie+1);
    jg.setColor("#000000");
    for(i=1;i<=4;i++)
    {
        jg.drawEllipse(xCenter-i*oktPie,yCenter-i*oktPie,2*i*oktPie,2*i*oktPie);
    }

    jg.drawLine(picBeginX,yCenter,picBeginX+8*oktPie,yCenter);
    jg.drawLine(xCenter,picBeginY,xCenter,picBeginY+8*oktPie);

    for(i=0; i < yPositionTop.length; i++)
    {
        angle = (9-yPositionDirection[i]) * 3.14 / 18;
        xpos = xCenter + Math.cos(angle)*yPositionAverage[i] * scaleFakt;
        ypos = yCenter - Math.sin(angle)*yPositionAverage[i] * scaleFakt;
        jg.setColor(windDistrCol[Math.floor(xPosition[i] / 120)]);
        jg.fillRect(xpos-2,ypos-2,4,4);
    }

    if(descrOn)
    {
        jg.setColor("#000000");

        for(i=1;i<4;i++)
        {
            jg.drawString(""+10*scale*i,xCenter-8,yCenter-i*oktPie-14);
        }

        jg.drawString("Nord",xCenter-16,picBeginY-16);
        jg.drawString("S&uuml;d",xCenter-12,picBeginY+8*oktPie);
        jg.drawString("West",picBeginX-36,yCenter-8);
        jg.drawString("Ost",picBeginX+8*oktPie+4,yCenter-8);

        jg.setFont("arial","16px",Font.BOLD);
        jg.drawString("Windverteilung",xCenter - 48,picBeginY-56);
        jg.setFont("arial","12px",Font.PLAIN);
        jg.drawString("(Richtung und mittl. Geschwindigkeit, Farbe für Zeitraum)",xCenter-140,picBeginY-36);
        var offset = 0;
        if(shift == "night") offset = 6;
        var yPos = yPos = picBeginY+8*oktPie+20;
        
        for(j=0;j<3;j++)
        {
            
            for(i=0;i<2;i++)
            {
                jg.setColor(windDistrCol[i+j*2]);
                jg.fillRect(picBeginX+10+i*140,yPos,16,16);
                jg.drawString(windDistrTimes[i+j*2+offset],picBeginX+30+i*140,yPos);
            }
            yPos+=20;
        }
    }
    jg.paint();
}

function drawLastMeasurement(canvas,picBeginX,picBeginYLo,size)
{
    picBeginY = yTickDf[size]*60-picBeginYLo;
    var jg = new jsGraphics(canvas);
    jg.setStroke(1);
    jg.setColor("#000000");
    dir = parseInt(dir);
    var dirT = "Nord ("+dir+"0&deg;)";
    if((dir >= 3) && (dir <= 6))
	   dirT = "Nordost ("+dir+"0&deg;)";
    if((dir >= 7) && (dir <= 11))
	   dirT = "Ost ("+dir+"0&deg;)";
    if((dir >= 12) && (dir <= 15))
	   dirT = "S&uuml;dost ("+dir+"0&deg;)";
    if((dir >= 16) && (dir <= 20))
	   dirT = "S&uuml;d ("+dir+"0&deg;)";
    if((dir >= 21) && (dir <= 24))
	   dirT = "S&uuml;dwest ("+dir+"0&deg;)";
    if((dir >= 25) && (dir <= 29))
	   dirT = "West ("+dir+"0&deg;)";
    if((dir >= 30) && (dir <= 33))
	   dirT = "Nordwest ("+dir+"0&deg;)";
    if(dir == 0) dirT = "Nord (0&deg;)";
    jg.drawString("Spitze: "+top+" km/h,",lastMeasPosX[size],lastMeasYOffset+picBeginY);
    jg.drawString("Mittel: "+avg+" km/h, aus "+dirT,lastMeasPosX[size]+110,lastMeasYOffset+picBeginY);                
    jg.drawString("Letzte Messung: "+lastMeasurement+" mit ",picBeginX-8,lastMeasYOffset+picBeginY);
    jg.setStroke(2);
    jg.setColor(col[2]);
    jg.drawLine(lastMeasPosX[size],lastMeasYOffset+picBeginY+16,lastMeasPosX[size]+40,lastMeasYOffset+picBeginY+16);
    jg.setColor(col[1]);
    jg.drawLine(lastMeasPosX[size]+110,lastMeasYOffset+picBeginY+16,lastMeasPosX[size]+148,lastMeasYOffset+picBeginY+16);

    jg.paint();
}

function drawDayStatistics(canvas,picBeginX,picBeginYLo,size)
{
    picBeginY = yTickDf[size]*60-picBeginYLo;
    var jg = new jsGraphics(canvas);
    jg.setColor("#000000");
    jg.drawRect(picBeginX,picBeginY,170,60);
    jg.setFont("arial","14px",Font.PLAIN);
    if(shift == "day")
    {
        jg.drawString("Tages-Spitze: "+topDay+" km/h",picBeginX+8,picBeginY+4);
        jg.drawString("Tages-Mittel: "+avgDay+" km/h",picBeginX+8,picBeginY+24);        
    }
    else 
    {
        jg.drawString("Nacht-Spitze: "+topDay+" km/h",picBeginX+8,picBeginY+4);
        jg.drawString("Nacht-Mittel: "+avgDay+" km/h",picBeginX+8,picBeginY+24);

    }
    jg.drawString("Min. 4 Bf: "+count4Bf*4+" Minuten",picBeginX+8,picBeginY+44);
    jg.paint();
}

function drawButton(canvas,img,picBeginX,picBeginYLo,size,url)
{
    var jg = new jsGraphics(canvas);
    picBeginY = yTickDf[size]*60-picBeginYLo;
    jg.drawString("<a href='"+url+"'><img src='"+img+"' /></a>",picBeginX,picBeginY);
    jg.paint();
}

