Add analytics
[bus.git] / busui / owa / modules / base / js / wz_jsgraphics.js
blob:a/busui/owa/modules/base/js/wz_jsgraphics.js -> blob:b/busui/owa/modules/base/js/wz_jsgraphics.js
  /* This notice must be untouched at all times.
   
  wz_jsgraphics.js v. 2.36
  The latest version is available at
  http://www.walterzorn.com
  or http://www.devira.com
  or http://www.walterzorn.de
   
  Copyright (c) 2002-2004 Walter Zorn. All rights reserved.
  Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
  Last modified: 21. 6. 2006
   
  Performance optimizations for Internet Explorer
  by Thomas Frank and John Holdsworth.
  fillPolygon method implemented by Matthieu Haller.
   
  High Performance JavaScript Graphics Library.
  Provides methods
  - to draw lines, rectangles, ellipses, polygons
  with specifiable line thickness,
  - to fill rectangles and ellipses
  - to draw text.
  NOTE: Operations, functions and branching have rather been optimized
  to efficiency and speed than to shortness of source code.
   
  LICENSE: LGPL
   
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License (LGPL) as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
   
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.
   
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA,
  or see http://www.gnu.org/copyleft/lesser.html
  */
   
   
  var jg_ihtm, jg_ie, jg_fast, jg_dom, jg_moz,
  jg_n4 = (document.layers && typeof document.classes != "undefined");
   
   
  function chkDHTM(x, i)
  {
  x = document.body || null;
  jg_ie = x && typeof x.insertAdjacentHTML != "undefined";
  jg_dom = (x && !jg_ie &&
  typeof x.appendChild != "undefined" &&
  typeof document.createRange != "undefined" &&
  typeof (i = document.createRange()).setStartBefore != "undefined" &&
  typeof i.createContextualFragment != "undefined");
  jg_ihtm = !jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined";
  jg_fast = jg_ie && document.all && !window.opera;
  jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";
  }
   
   
  function pntDoc()
  {
  this.wnd.document.write(jg_fast? this.htmRpc() : this.htm);
  this.htm = '';
  }
   
   
  function pntCnvDom()
  {
  var x = this.wnd.document.createRange();
  x.setStartBefore(this.cnv);
  x = x.createContextualFragment(jg_fast? this.htmRpc() : this.htm);
  if(this.cnv) this.cnv.appendChild(x);
  this.htm = '';
  }
   
   
  function pntCnvIe()
  {
  if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this.htmRpc() : this.htm);
  this.htm = '';
  }
   
   
  function pntCnvIhtm()
  {
  if(this.cnv) this.cnv.innerHTML += this.htm;
  this.htm = '';
  }
   
   
  function pntCnv()
  {
  this.htm = '';
  }
   
   
  function mkDiv(x, y, w, h)
  {
  this.htm += '<div style="position:absolute;'+
  'left:' + x + 'px;'+
  'top:' + y + 'px;'+
  'width:' + w + 'px;'+
  'height:' + h + 'px;'+
  'clip:rect(0,'+w+'px,'+h+'px,0);'+
  'background-color:' + this.color +
  (!jg_moz? ';overflow:hidden' : '')+
  ';"><\/div>';
  }
   
   
  function mkDivIe(x, y, w, h)
  {
  this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';
  }
   
   
  function mkDivPrt(x, y, w, h)
  {
  this.htm += '<div style="position:absolute;'+
  'border-left:' + w + 'px solid ' + this.color + ';'+
  'left:' + x + 'px;'+
  'top:' + y + 'px;'+
  'width:0px;'+
  'height:' + h + 'px;'+
  'clip:rect(0,'+w+'px,'+h+'px,0);'+
  'background-color:' + this.color +
  (!jg_moz? ';overflow:hidden' : '')+
  ';"><\/div>';
  }
   
   
  function mkLyr(x, y, w, h)
  {
  this.htm += '<layer '+
  'left="' + x + '" '+
  'top="' + y + '" '+
  'width="' + w + '" '+
  'height="' + h + '" '+
  'bgcolor="' + this.color + '"><\/layer>\n';
  }
   
   
  var regex = /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;
  function htmRpc()
  {
  return this.htm.replace(
  regex,
  '<div style="overflow:hidden;position:absolute;background-color:'+
  '$1;left:$2;top:$3;width:$4;height:$5"></div>\n');
  }
   
   
  function htmPrtRpc()
  {
  return this.htm.replace(
  regex,
  '<div style="overflow:hidden;position:absolute;background-color:'+
  '$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');
  }
   
   
  function mkLin(x1, y1, x2, y2)
  {
  if (x1 > x2)
  {
  var _x2 = x2;
  var _y2 = y2;
  x2 = x1;
  y2 = y1;
  x1 = _x2;
  y1 = _y2;
  }
  var dx = x2-x1, dy = Math.abs(y2-y1),
  x = x1, y = y1,
  yIncr = (y1 > y2)? -1 : 1;
   
  if (dx >= dy)
  {
  var pr = dy<<1,
  pru = pr - (dx<<1),
  p = pr-dx,
  ox = x;
  while ((dx--) > 0)
  {
  ++x;
  if (p > 0)
  {
  this.mkDiv(ox, y, x-ox, 1);
  y += yIncr;
  p += pru;
  ox = x;
  }
  else p += pr;
  }
  this.mkDiv(ox, y, x2-ox+1, 1);
  }
   
  else
  {
  var pr = dx<<1,
  pru = pr - (dy<<1),
  p = pr-dy,
  oy = y;
  if (y2 <= y1)
  {
  while ((dy--) > 0)
  {
  if (p > 0)
  {
  this.mkDiv(x++, y, 1, oy-y+1);
  y += yIncr;
  p += pru;
  oy = y;
  }
  else
  {
  y += yIncr;
  p += pr;
  }
  }
  this.mkDiv(x2, y2, 1, oy-y2+1);
  }
  else
  {
  while ((dy--) > 0)
  {
  y += yIncr;
  if (p > 0)
  {
  this.mkDiv(x++, oy, 1, y-oy);
  p += pru;
  oy = y;
  }
  else p += pr;
  }
  this.mkDiv(x2, oy, 1, y2-oy+1);
  }
  }
  }
   
   
  function mkLin2D(x1, y1, x2, y2)
  {
  if (x1 > x2)
  {
  var _x2 = x2;
  var _y2 = y2;
  x2 = x1;
  y2 = y1;
  x1 = _x2;
  y1 = _y2;
  }
  var dx = x2-x1, dy = Math.abs(y2-y1),
  x = x1, y = y1,
  yIncr = (y1 > y2)? -1 : 1;
   
  var s = this.stroke;
  if (dx >= dy)
  {
  if (dx > 0 && s-3 > 0)
  {
  var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
  _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  }
  else var _s = s;
  var ad = Math.ceil(s/2);
   
  var pr = dy<<1,
  pru = pr - (dx<<1),
  p = pr-dx,
  ox = x;
  while ((dx--) > 0)
  {
  ++x;
  if (p > 0)
  {
  this.mkDiv(ox, y, x-ox+ad, _s);
  y += yIncr;
  p += pru;
  ox = x;
  }
  else p += pr;
  }
  this.mkDiv(ox, y, x2-ox+ad+1, _s);
  }
   
  else
  {
  if (s-3 > 0)
  {
  var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
  _s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;
  }
  else var _s = s;
  var ad = Math.round(s/2);
   
  var pr = dx<<1,
  pru = pr - (dy<<1),
  p = pr-dy,
  oy = y;
  if (y2 <= y1)
  {
  ++ad;
  while ((dy--) > 0)
  {
  if (p > 0)
  {
  this.mkDiv(x++, y, _s, oy-y+ad);
  y += yIncr;
  p += pru;
  oy = y;
  }
  else
  {
  y += yIncr;
  p += pr;
  }
  }
  this.mkDiv(x2, y2, _s, oy-y2+ad);
  }
  else
  {
  while ((dy--) > 0)
  {
  y += yIncr;
  if (p > 0)
  {
  this.mkDiv(x++, oy, _s, y-oy+ad);
  p += pru;
  oy = y;
  }
  else p += pr;
  }
  this.mkDiv(x2, oy, _s, y2-oy+ad+1);
  }
  }
  }
   
   
  function mkLinDott(x1, y1, x2, y2)
  {
  if (x1 > x2)
  {
  var _x2 = x2;
  var _y2 = y2;
  x2 = x1;
  y2 = y1;
  x1 = _x2;
  y1 = _y2;
  }
  var dx = x2-x1, dy = Math.abs(y2-y1),
  x = x1, y = y1,
  yIncr = (y1 > y2)? -1 : 1,
  drw = true;
  if (dx >= dy)
  {
  var pr = dy<<1,
  pru = pr - (dx<<1),
  p = pr-dx;
  while ((dx--) > 0)
  {
  if (drw) this.mkDiv(x, y, 1, 1);
  drw = !drw;
  if (p > 0)
  {
  y += yIncr;
  p += pru;
  }
  else p += pr;
  ++x;
  }
  if (drw) this.mkDiv(x, y, 1, 1);
  }
   
  else
  {
  var pr = dx<<1,
  pru = pr - (dy<<1),
  p = pr-dy;
  while ((dy--) > 0)
  {
  if (drw) this.mkDiv(x, y, 1, 1);
  drw = !drw;
  y += yIncr;
  if (p > 0)
  {
  ++x;
  p += pru;
  }
  else p += pr;
  }
  if (drw) this.mkDiv(x, y, 1, 1);
  }
  }
   
   
  function mkOv(left, top, width, height)
  {
  var a = width>>1, b = height>>1,
  wod = width&1, hod = (height&1)+1,
  cx = left+a, cy = top+b,
  x = 0, y = b,
  ox = 0, oy = b,
  aa = (a*a)<<1, bb = (b*b)<<1,
  st = (aa>>1)*(1-(b<<1)) + bb,
  tt = (bb>>1) - aa*((b<<1)-1),
  w, h;
  while (y > 0)
  {
  if (st < 0)
  {
  st += bb*((x<<1)+3);
&nbs