// plot
// Version vom 12. 2. 2009
// Jürgen Berkemeier
// www.j-berkemeier.de
var plot = function(id) {
  var JB_log10 = function(x) { return Math.log(x)/Math.LN10; }
  var JB_toString = function(n) { return Number(n.toPrecision(15)).toString(10); }
  var JB_makediv = function(parentnode,id,x0,y0,width,height) {
    var ele = document.createElement("div");
    ele.id = id;
    ele.style.position = "absolute";
    ele.style.left = x0 + "px";
    ele.style.top = y0 + "px";
    ele.style.width = width + "px";
    ele.style.height = height + "px";
    parentnode.appendChild(ele);
    return ele;
  }
  var plotid = id+"plot";
  var plotidm = id+"plotm";
  var idxlabel = id+"xlabel";
  var idylabel = id+"ylabel";
  var xmin=0,xmax=0,ymin=0,ymax=0;
  var xfak=0,yfak=0;
  var dx,dy,fx,fy;
  var gr = null;
  var xlabel = null;
  var ylabel = null;
  var feld = document.getElementById(id) ;
  var w = parseInt(feld.offsetWidth-1);
  var h = parseInt(feld.offsetHeight-1);
  var ifeld = document.createElement("div");
  ifeld.style.position = "absolute";
  ifeld.style.width = w + "px";
  ifeld.style.height = h + "px";
  feld.appendChild(ifeld);

  this.scale = function(a) {
    if(xmin==xmax) {
      xmax = xmin = a[0].x;
      ymax = ymin = a[0].y;
    }
    for(var i=0;i<a.length;i++) {
      var t = a[i];
      if(t.x<xmin) xmin = t.x;
      if(t.x>xmax) xmax = t.x;
      if(t.y<ymin) ymin = t.y;
      if(t.y>ymax) ymax = t.y;
    }
    if(xmax==xmin) { xmin -= 0.5; xmax += 0.5; }
    dx = xmax - xmin ;
    fx = Math.pow(10,Math.floor(JB_log10(dx))-1);
    xmin = Math.floor(xmin/fx)*fx;
    xmax = Math.ceil(xmax/fx)*fx;
    if(ymax==ymin) { ymin -= 0.5; ymax += 0.5; }
    dy = ymax - ymin ;
    fy = Math.pow(10,Math.floor(JB_log10(dy))-1);
    ymin = Math.floor(ymin/fy)*fy;
    ymax = Math.ceil(ymax/fy)*fy;
  } // plot.scale
  this.clear = function() {
    ifeld.innerHTML = "";
    xmax = xmin = ymax = ymin = xfak = yfak = 0;
  } // plot.clear
  this.frame = function(x0,y0,xl,yl) {
    ifeld.innerHTML = "";
    JB_makediv(ifeld,plotid,x0,0,w-x0,h-y0);
    JB_makediv(ifeld,idxlabel,x0,h-y0,w-x0,y0);
    JB_makediv(ifeld,idylabel,0,0,x0,h-y0);
    JB_makediv(ifeld,plotidm,x0,0,w-x0,h-y0);
    xlabel=new gra(idxlabel);
    ylabel=new gra(idylabel);
    gr=new gra(plotid);
    gr.setbuf(1000);
    xfak = gr.w/(xmax-xmin);
    yfak = gr.h/(ymax-ymin);
    xlabel.text(xlabel.w/2,0,16,"black",xl,"mu");
    ylabel.text(0,ylabel.h/2,16,"black",yl,"lm");
    var tx = 100*dx/gr.w;
    var ty = gr.h<250 ?  50*dy/gr.h : 100*dy/gr.h;
    var tx10 = Math.pow(10,Math.floor(JB_log10(tx)));
    tx = Math.round(tx/tx10);
    var ty10 = Math.pow(10,Math.floor(JB_log10(ty)));
    ty = Math.round(ty/ty10);
    tx = Number(String(tx).replace(/3/,"2").replace(/[4567]/,"5").replace(/[89]/,"10"));
    ty = Number(String(ty).replace(/3/,"2").replace(/[4567]/,"5").replace(/[89]/,"10"));
    tx *= tx10;
    ty *= ty10;
    var mxmin = Math.ceil(xmin/tx)*tx;
    var mymin = Math.ceil(ymin/ty)*ty;
    for(var x=mxmin;x<=xmax;x+=tx) {
      gr.linie((x-xmin)*xfak,0,(x-xmin)*xfak,gr.h,"gray");
      xlabel.text((x-xmin)*xfak,xlabel.h,14,"black",JB_toString(x),"mo");
    }
    for(var y=mymin;y<=ymax;y+=ty) {
      gr.linie(0,(y-ymin)*yfak,gr.w,(y-ymin)*yfak,"gray");
      ylabel.text(ylabel.w,(y-ymin)*yfak,14,"black",JB_toString(y),"rm");
    }
    var rahmen=new gra(plotid);
    rahmen.linie(       0,       0,rahmen.w,       0,"black");
    rahmen.linie(rahmen.w,       0,rahmen.w,rahmen.h,"black");
    rahmen.linie(rahmen.w,rahmen.h,       0,rahmen.h,"black");
    rahmen.linie(       0,rahmen.h,       0,       0,"black");
  } // plot.frame
  this.plot = function(a,col) {
    for(var i=0;i<a.length-1;i++)
      gr.linie(
       (a[i].x-xmin)*xfak,
       (a[i].y-ymin)*yfak,
       (a[i+1].x-xmin)*xfak,
       (a[i+1].y-ymin)*yfak,
       col);
    gr.flush();
  } // plot.plot)
  this.markeron = function(a,callback_over,callback_out,callback_move,markertype) {
    var dieses = this;
    var posx=0;
    var mele = document.getElementById(plotidm);
    var pele = document.getElementById(plotid);
    var marker = document.createElement("div");
    marker.style.position = "absolute";
    marker.style.display = "none";
    if(markertype=="Punkt") {
      marker.style.fontSize = "32px";
      var txt=document.createTextNode(String.fromCharCode(8226)) ; // Kreis als Zeichen: &bull; oder &#8226; evtl auch 8729
      marker.appendChild(txt);
    }
    else {
      marker.style.top = "0";
      marker.style.height = gr.h + "px" ;
      marker.style.width = "1px";
      marker.style.backgroundColor = "black";
    }
    pele.appendChild(marker);
    mele.onmouseover = function(e) {
      if(!e) e = window.event;
      e.cancelBubble = true;
      if (e.stopPropagation) e.stopPropagation();
      marker.style.display = "";
      mele.onmousemove = function(e) {
        if(!e) e = window.event;
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        posx = e.layerX ? e.layerX : e.offsetX;
        var x = posx/xfak+xmin;
        var al = a.length;
        var p,pi;
        if(x<=a[0].x) pi=0;
        else if(x>=a[al-1].x) pi=al-1;
        else {
          p = al/2;
          pi = Math.floor(p);
          var dp = Math.ceil(p/2);
          do {
            var apx = a[pi].x;
            if(x<apx) p -= dp;
            else if(x>apx) p += dp;
            else break;
            pi = Math.floor(p);
            dp = dp/2;
          } while(dp>=0.5) ;
        }
        if(markertype=="Punkt") {
          marker.style.left = Math.round((a[pi].x-xmin)*xfak) - marker.offsetWidth/2 + "px";
          marker.style.top = Math.round(gr.h - (a[pi].y-ymin)*yfak) - marker.offsetHeight/2 + "px";
        }
        else {
          marker.style.left = Math.round((a[pi].x-xmin)*xfak) + "px";
        }
        if(callback_move && typeof(callback_move)=="function") callback_move(pi);
        return false;
      }
      if(callback_over && typeof(callback_over)=="function") callback_over();
      return false;
    }
    mele.onmouseout = function(e) {
      if(!e) e = window.event;
      marker.style.display = "none";
      mele.onmousemove = null;
      if(callback_out && typeof(callback_out)=="function") callback_out();
      return false;
    }
  } // plot.markeron
  this.markeroff = function() {
    var ele = document.getElementById(plotid);
    ele.onmousemove = null;
    ele.onmouseout = null;
  } // plot.markeroff
} // plot
