www/include/scripts/js-draw.js

Code
Comments
Other
Rev Date Author Line
5350 25 May 10 nicklas 1 /**********************************************************************************
5350 25 May 10 nicklas 2 *
5350 25 May 10 nicklas 3 * Project Name:    jsDraw2D (Graphics Library for JavaScript)
5350 25 May 10 nicklas 4 * Version:    Beta 1.1.0 (17-August-2009) (Uncompressed)
5350 25 May 10 nicklas 5 * Project Homepage:  http://jsdraw2d.jsfiction.com
5350 25 May 10 nicklas 6 * Author:      Sameer Burle
5350 25 May 10 nicklas 7 * Copyright 2009:    jsFiction.com (http://www.jsfiction.com)
5350 25 May 10 nicklas 8 * Licensed Under:    LGPL
5350 25 May 10 nicklas 9 *
5350 25 May 10 nicklas 10 * This program (library) is free software: you can redistribute it and/or modify
5350 25 May 10 nicklas 11 * it under the terms of the GNU Lesser General Public License as published by
5350 25 May 10 nicklas 12 * the Free Software Foundation, either version 3 of the License, or
5350 25 May 10 nicklas 13 * (at your option) any later version.
5350 25 May 10 nicklas 14 *
5350 25 May 10 nicklas 15 * This program is distributed in the hope that it will be useful,
5350 25 May 10 nicklas 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5350 25 May 10 nicklas 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5350 25 May 10 nicklas 18 * GNU Lesser General Public License for more details.
5350 25 May 10 nicklas 19 *
5350 25 May 10 nicklas 20 * You should have received a copy of the GNU General Public License
5350 25 May 10 nicklas 21 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
5350 25 May 10 nicklas 22 *
5350 25 May 10 nicklas 23 ************************************************************************************/
7419 03 Nov 17 nicklas 24 'use strict';
5350 25 May 10 nicklas 25
5350 25 May 10 nicklas 26 //jsColor class holds the color information and provides some color related basic functions.
5350 25 May 10 nicklas 27 function jsColor()
5350 25 May 10 nicklas 28 {
5350 25 May 10 nicklas 29   //Member variables
5350 25 May 10 nicklas 30   var hex="#000000";
5350 25 May 10 nicklas 31   
5350 25 May 10 nicklas 32   switch(arguments.length)
5350 25 May 10 nicklas 33   {
5350 25 May 10 nicklas 34     //Hexadecimal Color
5350 25 May 10 nicklas 35     case 1:
5350 25 May 10 nicklas 36             setHex(arguments[0]);      
5350 25 May 10 nicklas 37       break;
5350 25 May 10 nicklas 38     //RGB Color
5350 25 May 10 nicklas 39     case 3:
5350 25 May 10 nicklas 40       var red=arguments[0];
5350 25 May 10 nicklas 41       var green=arguments[1];
5350 25 May 10 nicklas 42       var blue=arguments[2];
5350 25 May 10 nicklas 43       hex=rgbToHex(red,green,blue);
5350 25 May 10 nicklas 44       if(hex==false)
5350 25 May 10 nicklas 45         hex="#000000";
5350 25 May 10 nicklas 46       break;
5350 25 May 10 nicklas 47   }
5350 25 May 10 nicklas 48   
5350 25 May 10 nicklas 49   //Public Methods
5350 25 May 10 nicklas 50   
5350 25 May 10 nicklas 51   //Set color by specifying the hexa-decimal value. 
5350 25 May 10 nicklas 52   this.setHex=setHex;
5350 25 May 10 nicklas 53   function setHex(hexColor)
5350 25 May 10 nicklas 54   {
5350 25 May 10 nicklas 55       if(hexColor.charAt(0)=="#")
5350 25 May 10 nicklas 56     {
5350 25 May 10 nicklas 57       hex=hexColor;
5350 25 May 10 nicklas 58     }
5350 25 May 10 nicklas 59     else
5350 25 May 10 nicklas 60     {
5350 25 May 10 nicklas 61             if(isNaN(hexColor))
5350 25 May 10 nicklas 62             {
5350 25 May 10 nicklas 63                 setNamedColor(hexColor.toLowerCase());
5350 25 May 10 nicklas 64             }
5350 25 May 10 nicklas 65             else
5350 25 May 10 nicklas 66             {      
5350 25 May 10 nicklas 67         hex="#" + hexColor;
5350 25 May 10 nicklas 68         }    
5350 25 May 10 nicklas 69     }
5350 25 May 10 nicklas 70       
5350 25 May 10 nicklas 71     var rgbArray=hexToRgb(hex);
5350 25 May 10 nicklas 72     if(!rgbArray)
5350 25 May 10 nicklas 73     {
5350 25 May 10 nicklas 74         hex="#000000"
5350 25 May 10 nicklas 75     }
5350 25 May 10 nicklas 76   }
5350 25 May 10 nicklas 77   //Get the hexa-decimal value of the object
5350 25 May 10 nicklas 78   this.getHex=getHex;
5350 25 May 10 nicklas 79   function getHex()
5350 25 May 10 nicklas 80   {
5350 25 May 10 nicklas 81       return hex;
5350 25 May 10 nicklas 82   }
5350 25 May 10 nicklas 83   
5350 25 May 10 nicklas 84   //Set color by specifying the RGB values.
5350 25 May 10 nicklas 85   this.setRGB=setRGB;
5350 25 May 10 nicklas 86   function setRGB(redValue,greenValue,blueValue)
5350 25 May 10 nicklas 87   {
5350 25 May 10 nicklas 88     hex=rgbToHex(redValue,greenValue,blueValue);
5350 25 May 10 nicklas 89     if(hex==false)
5350 25 May 10 nicklas 90       hex="#000000";
5350 25 May 10 nicklas 91   }
5350 25 May 10 nicklas 92   
5350 25 May 10 nicklas 93   //Get the RGB values of the object
5350 25 May 10 nicklas 94   this.getRGB=getRGB;
5350 25 May 10 nicklas 95   function getRGB()
5350 25 May 10 nicklas 96   {
5350 25 May 10 nicklas 97       return hexToRgb(hex);
5350 25 May 10 nicklas 98   }
5350 25 May 10 nicklas 99   
5350 25 May 10 nicklas 100   //Returns new jsColor object with darker color shade 
5350 25 May 10 nicklas 101   this.getDarkerShade=getDarkerShade;
5350 25 May 10 nicklas 102   function getDarkerShade(value)
5350 25 May 10 nicklas 103   {
5350 25 May 10 nicklas 104     var redValue,greenValue,blueValue;
5350 25 May 10 nicklas 105     var resArray=getRGB();
5350 25 May 10 nicklas 106     
5350 25 May 10 nicklas 107     if(!isNaN(value))
5350 25 May 10 nicklas 108     {
5350 25 May 10 nicklas 109       redValue=parseInt(resArray[0]-value);
5350 25 May 10 nicklas 110       greenValue=parseInt(resArray[1]-value);
5350 25 May 10 nicklas 111       blueValue=parseInt(resArray[2]-value);
5350 25 May 10 nicklas 112     }
5350 25 May 10 nicklas 113     
5350 25 May 10 nicklas 114     if(redValue<0)
5350 25 May 10 nicklas 115       redValue=0;
5350 25 May 10 nicklas 116     if(greenValue<0)
5350 25 May 10 nicklas 117       greenValue=0;
5350 25 May 10 nicklas 118     if(blueValue<0)
5350 25 May 10 nicklas 119       blueValue=0;
5350 25 May 10 nicklas 120       
5350 25 May 10 nicklas 121     return new jsColor(redValue,greenValue,blueValue);  
5350 25 May 10 nicklas 122   }
5350 25 May 10 nicklas 123
5350 25 May 10 nicklas 124   //Returns new jsColor object with lighter color shade 
5350 25 May 10 nicklas 125   this.getLighterShade=getLighterShade;  
5350 25 May 10 nicklas 126   function getLighterShade(value)
5350 25 May 10 nicklas 127   {
5350 25 May 10 nicklas 128     var redValue,greenValue,blueValue;
5350 25 May 10 nicklas 129     var resArray=getRGB();
5350 25 May 10 nicklas 130     
5350 25 May 10 nicklas 131     if(!isNaN(value))
5350 25 May 10 nicklas 132     {
5350 25 May 10 nicklas 133       redValue=parseInt(resArray[0]+value);
5350 25 May 10 nicklas 134       greenValue=parseInt(resArray[1]+value);
5350 25 May 10 nicklas 135       blueValue=parseInt(resArray[2]+value);
5350 25 May 10 nicklas 136     }
5350 25 May 10 nicklas 137     
5350 25 May 10 nicklas 138     if(redValue>255)
5350 25 May 10 nicklas 139       redValue=255;
5350 25 May 10 nicklas 140     if(greenValue>255)
5350 25 May 10 nicklas 141       greenValue=255;
5350 25 May 10 nicklas 142     if(blueValue>255)
5350 25 May 10 nicklas 143       blueValue=255;
5350 25 May 10 nicklas 144     
5350 25 May 10 nicklas 145     return new jsColor(redValue,greenValue,blueValue);  
5350 25 May 10 nicklas 146   }
5350 25 May 10 nicklas 147
5350 25 May 10 nicklas 148   //Static-Shared Utility Methods
5350 25 May 10 nicklas 149   
5350 25 May 10 nicklas 150   //Convert RGB color to Hex color
5350 25 May 10 nicklas 151   this.rgbToHex=rgbToHex;
5350 25 May 10 nicklas 152   function rgbToHex(redValue, greenValue, blueValue)
5350 25 May 10 nicklas 153   {
5350 25 May 10 nicklas 154     //Check argument values
5350 25 May 10 nicklas 155     if(redValue<0 || redValue>255 || greenValue<0 || greenValue>255 || blueValue<0 || blueValue>255)
5350 25 May 10 nicklas 156     {
5350 25 May 10 nicklas 157       return false;
5350 25 May 10 nicklas 158     }
5350 25 May 10 nicklas 159                                 
5350 25 May 10 nicklas 160        var colorDec = Math.round(blueValue) + 256 * Math.round(greenValue) + 65536 * Math.round(redValue);
5350 25 May 10 nicklas 161        return "#" + zeroPad(colorDec.toString(16),6);
5350 25 May 10 nicklas 162   }
5350 25 May 10 nicklas 163   
5350 25 May 10 nicklas 164   //Convert Hex color to RGB color
5350 25 May 10 nicklas 165   this.hexToRgb=hexToRgb;
5350 25 May 10 nicklas 166   function hexToRgb(hexValue)
5350 25 May 10 nicklas 167   {
5350 25 May 10 nicklas 168     var redValue,greenValue,blueValue;
5350 25 May 10 nicklas 169     if(hexValue.charAt(0)=="#")
5350 25 May 10 nicklas 170     {
5350 25 May 10 nicklas 171       hexValue=hexValue.substring(1,7);
5350 25 May 10 nicklas 172     }
5350 25 May 10 nicklas 173     
5350 25 May 10 nicklas 174     redValue=parseInt(hexValue.substring(0,2),16);
5350 25 May 10 nicklas 175     greenValue=parseInt(hexValue.substring(2,4),16);
5350 25 May 10 nicklas 176     blueValue=parseInt(hexValue.substring(4,6),16);
5350 25 May 10 nicklas 177     
5350 25 May 10 nicklas 178     //Check argument values
5350 25 May 10 nicklas 179     if(redValue<0 || redValue>255 || greenValue<0 || greenValue>255 || blueValue<0 || blueValue>255)
5350 25 May 10 nicklas 180     {
5350 25 May 10 nicklas 181       return false;
5350 25 May 10 nicklas 182     }
5350 25 May 10 nicklas 183
5350 25 May 10 nicklas 184     return new Array(redValue,greenValue,blueValue);
5350 25 May 10 nicklas 185   }
5350 25 May 10 nicklas 186
5350 25 May 10 nicklas 187   //Private Methods
5350 25 May 10 nicklas 188   //Set the color using specified name of the color out of 16 web colors.
5350 25 May 10 nicklas 189   function setNamedColor(colorName)
5350 25 May 10 nicklas 190   {
5350 25 May 10 nicklas 191       switch(colorName)
5350 25 May 10 nicklas 192         {   
5350 25 May 10 nicklas 193             case "aqua":
5350 25 May 10 nicklas 194                 hex="#00FFFF";
5350 25 May 10 nicklas 195                 break;
5350 25 May 10 nicklas 196             case "black":
5350 25 May 10 nicklas 197                 hex="#000000";
5350 25 May 10 nicklas 198                 break;
5350 25 May 10 nicklas 199             case "blue":
5350 25 May 10 nicklas 200                 hex="#0000FF";
5350 25 May 10 nicklas 201                 break;
5350 25 May 10 nicklas 202             case "fuchsia":
5350 25 May 10 nicklas 203                 hex="#FF00FF";
5350 25 May 10 nicklas 204                 break;
5350 25 May 10 nicklas 205             case "green":
5350 25 May 10 nicklas 206                 hex="#008000";
5350 25 May 10 nicklas 207                 break;
5350 25 May 10 nicklas 208             case "gray":
5350 25 May 10 nicklas 209                 hex="#808080";
5350 25 May 10 nicklas 210                 break;
5350 25 May 10 nicklas 211             case "lime":
5350 25 May 10 nicklas 212                 hex="#00FF00";
5350 25 May 10 nicklas 213                 break;
5350 25 May 10 nicklas 214             case "maroon":
5350 25 May 10 nicklas 215                 hex="#800000";
5350 25 May 10 nicklas 216                 break;
5350 25 May 10 nicklas 217             case "navy":
5350 25 May 10 nicklas 218                 hex="#000080";
5350 25 May 10 nicklas 219                 break;
5350 25 May 10 nicklas 220             case "olive":
5350 25 May 10 nicklas 221                 hex="#808000";
5350 25 May 10 nicklas 222                 break;
5350 25 May 10 nicklas 223             case "purple":
5350 25 May 10 nicklas 224                 hex="#800080";
5350 25 May 10 nicklas 225                 break;
5350 25 May 10 nicklas 226             case "red":
5350 25 May 10 nicklas 227                 hex="#FF0000";
5350 25 May 10 nicklas 228                 break;
5350 25 May 10 nicklas 229             case "silver":
5350 25 May 10 nicklas 230                 hex="#C0C0C0";
5350 25 May 10 nicklas 231                 break;
5350 25 May 10 nicklas 232             case "teal":
5350 25 May 10 nicklas 233                 hex="#008080";
5350 25 May 10 nicklas 234                 break;
5350 25 May 10 nicklas 235             case "white":
5350 25 May 10 nicklas 236                 hex="#FFFFFF";
5350 25 May 10 nicklas 237                 break;
5350 25 May 10 nicklas 238             case "yellow":
5350 25 May 10 nicklas 239                 hex="#FFFF00";
5350 25 May 10 nicklas 240                 break;
5350 25 May 10 nicklas 241         }
5350 25 May 10 nicklas 242   }
5350 25 May 10 nicklas 243   
5350 25 May 10 nicklas 244   //Add zero padding to the left. Used for building hexa-decimal string.  
5350 25 May 10 nicklas 245   function zeroPad(val,count)
5350 25 May 10 nicklas 246   { 
5350 25 May 10 nicklas 247     var valZeropad = val + "";
5350 25 May 10 nicklas 248     while(valZeropad.length < count) 
5350 25 May 10 nicklas 249     {
5350 25 May 10 nicklas 250       valZeropad = "0" + valZeropad; 
5350 25 May 10 nicklas 251     }
5350 25 May 10 nicklas 252     return valZeropad;
5350 25 May 10 nicklas 253   }
5350 25 May 10 nicklas 254
5350 25 May 10 nicklas 255 }
5350 25 May 10 nicklas 256
5350 25 May 10 nicklas 257 //jsFont class holds the font information which can be used by other objects in object oriented way.
5350 25 May 10 nicklas 258 function jsFont(family,weight,size,style,variant)
5350 25 May 10 nicklas 259 {
5350 25 May 10 nicklas 260     //Properties: family, weight, size, style and varient with default value null
5350 25 May 10 nicklas 261     this.family=null;
5350 25 May 10 nicklas 262     this.weight=null;
5350 25 May 10 nicklas 263     this.size=null;
5350 25 May 10 nicklas 264     this.style=null;
5350 25 May 10 nicklas 265     this.variant=null;
5350 25 May 10 nicklas 266     
5350 25 May 10 nicklas 267     if(family && family!="")
5350 25 May 10 nicklas 268         this.family=family;
5350 25 May 10 nicklas 269     
5350 25 May 10 nicklas 270     if(weight && weight!="")
5350 25 May 10 nicklas 271         this.weight=weight;
5350 25 May 10 nicklas 272
5350 25 May 10 nicklas 273     if(size && size!="")
5350 25 May 10 nicklas 274         this.size=size;
5350 25 May 10 nicklas 275         
5350 25 May 10 nicklas 276     if(style && style!="")
5350 25 May 10 nicklas 277         this.style=style;
5350 25 May 10 nicklas 278     
5350 25 May 10 nicklas 279     if(variant && variant!="")
5350 25 May 10 nicklas 280         this.variant=variant;
5350 25 May 10 nicklas 281 }
5350 25 May 10 nicklas 282
5350 25 May 10 nicklas 283 //jsPen class holds the drawing pen/stroke information. Mainly it holds the color and width values to be used for 2D drawing. 
5350 25 May 10 nicklas 284 //All draw methods take jsPen object as a parameter. Acts like a pen for drawing.
5350 25 May 10 nicklas 285 function jsPen(color,width)
5350 25 May 10 nicklas 286 {
5350 25 May 10 nicklas 287   this.color=new jsColor();  //color proprty of jsColor type
5350 25 May 10 nicklas 288   this.width="1px";      //width property with 1px default value
5350 25 May 10 nicklas 289   
5350 25 May 10 nicklas 290   if(arguments.length>0)
5350 25 May 10 nicklas 291   {
5350 25 May 10 nicklas 292     this.color=color;  
5350 25 May 10 nicklas 293   }
5350 25 May 10 nicklas 294   if(arguments.length>=2)
5350 25 May 10 nicklas 295   {
5350 25 May 10 nicklas 296     this.width=width;
5350 25 May 10 nicklas 297   }
5350 25 May 10 nicklas 298   if(!isNaN(width))
5350 25 May 10 nicklas 299   {
5350 25 May 10 nicklas 300     this.width=width+"px";
5350 25 May 10 nicklas 301   }
5350 25 May 10 nicklas 302 }
5350 25 May 10 nicklas 303
5350 25 May 10 nicklas 304 //jsPoint class holds the 2D drawing point information. It holds values of x and y coordinates of the point.
5350 25 May 10 nicklas 305 function jsPoint(x,y)
5350 25 May 10 nicklas 306 {
5350 25 May 10 nicklas 307   this.x=0;
5350 25 May 10 nicklas 308   this.y=0;
5350 25 May 10 nicklas 309
5350 25 May 10 nicklas 310   if(arguments.length==2)
5350 25 May 10 nicklas 311   {
5350 25 May 10 nicklas 312     this.x=x;
5350 25 May 10 nicklas 313     this.y=y;
5350 25 May 10 nicklas 314   }
5350 25 May 10 nicklas 315 }
5350 25 May 10 nicklas 316
5350 25 May 10 nicklas 317 function jsGraphics(canvasDivElement)
5350 25 May 10 nicklas 318 {
5350 25 May 10 nicklas 319   //Private member variables
5350 25 May 10 nicklas 320   var origin=new jsPoint(0,0);
5350 25 May 10 nicklas 321   var scale=1;
5350 25 May 10 nicklas 322   var coordinateSystem="default";  //Possible values "default" or "cartecian"
5350 25 May 10 nicklas 323   var canvasDiv;
5350 25 May 10 nicklas 324   
5350 25 May 10 nicklas 325   if(canvasDivElement)
5350 25 May 10 nicklas 326     canvasDiv=canvasDivElement;
5350 25 May 10 nicklas 327   else
5350 25 May 10 nicklas 328     canvasDiv=document.body;  //Document will be used directly for drawing
5350 25 May 10 nicklas 329   
5350 25 May 10 nicklas 330   var gridDiv=null;
5350 25 May 10 nicklas 331   
5350 25 May 10 nicklas 332   //Public Methods
5350 25 May 10 nicklas 333   this.drawLine=drawLine;
5350 25 May 10 nicklas 334   this.drawRectangle=drawRectangle;
5350 25 May 10 nicklas 335   this.fillRectangle=fillRectangle;
5350 25 May 10 nicklas 336   this.drawCircle=drawCircle;
5350 25 May 10 nicklas 337   this.drawEllipse=drawEllipse;
5350 25 May 10 nicklas 338   this.fillCircle=fillCircle;
5350 25 May 10 nicklas 339   this.fillEllipse=fillEllipse;
5350 25 May 10 nicklas 340   this.fillArc=fillArc;
5350 25 May 10 nicklas 341   this.drawArc=drawArc;
5350 25 May 10 nicklas 342   this.drawPolyline=drawPolyline;
5350 25 May 10 nicklas 343   this.drawPolygon=drawPolygon;
5350 25 May 10 nicklas 344   this.fillPolygon=fillPolygon;
5350 25 May 10 nicklas 345   this.drawBezier=drawBezier;
5350 25 May 10 nicklas 346   this.drawPolyBezier=drawPolyBezier;
5350 25 May 10 nicklas 347   this.drawCurve=drawCurve;
5350 25 May 10 nicklas 348   this.drawClosedCurve=drawClosedCurve;
5350 25 May 10 nicklas 349   this.fillClosedCurve=fillClosedCurve;
5350 25 May 10 nicklas 350   this.drawText=drawText;
5350 25 May 10 nicklas 351   this.drawImage=drawImage;
5350 25 May 10 nicklas 352   this.clear=clear;
5527 13 Dec 10 nicklas 353   this.clearDrawing=clearDrawing;
5350 25 May 10 nicklas 354   this.showGrid=showGrid;
5350 25 May 10 nicklas 355   this.hideGrid=hideGrid;
5350 25 May 10 nicklas 356   this.setOrigin=setOrigin;
5350 25 May 10 nicklas 357   this.getOrigin=getOrigin;
5350 25 May 10 nicklas 358   this.setScale=setScale;
5350 25 May 10 nicklas 359   this.getScale=getScale;
5350 25 May 10 nicklas 360   this.setCoordinateSystem=setCoordinateSystem;
5350 25 May 10 nicklas 361   this.getCoordinateSystem=getCoordinateSystem;
5350 25 May 10 nicklas 362   this.logicalToPhysicalPoint=logicalToPhysicalPoint;
5350 25 May 10 nicklas 363   
5350 25 May 10 nicklas 364   //Initialization
5350 25 May 10 nicklas 365   
5350 25 May 10 nicklas 366   //Grid initialization
5350 25 May 10 nicklas 367   gridDiv=document.createElement("div");
5350 25 May 10 nicklas 368   gridDiv.style.left="0px";
5350 25 May 10 nicklas 369   gridDiv.style.top="0px";
5350 25 May 10 nicklas 370   if(canvasDiv.clientWidth>0 && canvasDiv.clientHeight>0)
5350 25 May 10 nicklas 371   {
5350 25 May 10 nicklas 372       gridDiv.style.width=(parseInt(canvasDiv.clientWidth)-1) + "px";
5350 25 May 10 nicklas 373       gridDiv.style.height=(parseInt(canvasDiv.clientHeight)-1) + "px";
5350 25 May 10 nicklas 374   }
5350 25 May 10 nicklas 375   else
5350 25 May 10 nicklas 376   {
5350 25 May 10 nicklas 377       gridDiv.style.width="0px";
5350 25 May 10 nicklas 378       gridDiv.style.height="0px";
5350 25 May 10 nicklas 379   }    
5350 25 May 10 nicklas 380   gridDiv.style.zIndex=0;
5350 25 May 10 nicklas 381   gridDiv.style.position="absolute";
5350 25 May 10 nicklas 382   gridDiv.style.display="none";
5350 25 May 10 nicklas 383   canvasDiv.appendChild(gridDiv);
5350 25 May 10 nicklas 384
5350 25 May 10 nicklas 385   //Origin
5350 25 May 10 nicklas 386   function setOrigin(point)
5350 25 May 10 nicklas 387   {
5350 25 May 10 nicklas 388     origin=point;  
5350 25 May 10 nicklas 389   }
5350 25 May 10 nicklas 390   
5350 25 May 10 nicklas 391   function getOrigin()
5350 25 May 10 nicklas 392   {
5350 25 May 10 nicklas 393     return origin;
5350 25 May 10 nicklas 394   }
5350 25 May 10 nicklas 395
5350 25 May 10 nicklas 396   //Scale
5350 25 May 10 nicklas 397   function setScale(value)
5350 25 May 10 nicklas 398   {
5350 25 May 10 nicklas 399     scale=value;  
5350 25 May 10 nicklas 400   }
5350 25 May 10 nicklas 401   
5350 25 May 10 nicklas 402   function getScale()
5350 25 May 10 nicklas 403   {
5350 25 May 10 nicklas 404     return scale;
5350 25 May 10 nicklas 405   }
5350 25 May 10 nicklas 406   
5350 25 May 10 nicklas 407   //Coordinate System
5350 25 May 10 nicklas 408   function setCoordinateSystem(name)
5350 25 May 10 nicklas 409   {
5350 25 May 10 nicklas 410     name=name.toLowerCase()
5350 25 May 10 nicklas 411     if(name.toLowerCase() != "default" && name.toLowerCase() != "cartecian")
5350 25 May 10 nicklas 412     {
5350 25 May 10 nicklas 413       coordinateSystem="default";
5350 25 May 10 nicklas 414     }
5350 25 May 10 nicklas 415     else
5350 25 May 10 nicklas 416     {
5350 25 May 10 nicklas 417       coordinateSystem=name;
5350 25 May 10 nicklas 418     }
5350 25 May 10 nicklas 419   }
5350 25 May 10 nicklas 420   
5350 25 May 10 nicklas 421   function getCoordinateSystem()
5350 25 May 10 nicklas 422   {
5350 25 May 10 nicklas 423     return coordinateSystem=name;
5350 25 May 10 nicklas 424   }
5350 25 May 10 nicklas 425   
5350 25 May 10 nicklas 426   //Conversion of logical point to physical point based on coordinate system, origin and scale.
5350 25 May 10 nicklas 427   function logicalToPhysicalPoint(point)
5350 25 May 10 nicklas 428   {
5350 25 May 10 nicklas 429     if(coordinateSystem=="cartecian")
5350 25 May 10 nicklas 430     {
5350 25 May 10 nicklas 431       return new jsPoint(point.x*scale+origin.x,origin.y-point.y*scale)
5350 25 May 10 nicklas 432     }
5350 25 May 10 nicklas 433     else
5350 25 May 10 nicklas 434     {
5350 25 May 10 nicklas 435       return new jsPoint(point.x*scale+origin.x,point.y*scale+origin.y)
5350 25 May 10 nicklas 436     }
5350 25 May 10 nicklas 437   }
5350 25 May 10 nicklas 438   
5350 25 May 10 nicklas 439   //Display background grid
5350 25 May 10 nicklas 440   function showGrid(range,showRange,color)
5350 25 May 10 nicklas 441   {
5350 25 May 10 nicklas 442     if(showRange==null)  
5350 25 May 10 nicklas 443       showRange=true;  //range is grid interval. The values will be shown if showRange is true.
5350 25 May 10 nicklas 444       
5350 25 May 10 nicklas 445     var x0,x1,y0,y1;
5350 25 May 10 nicklas 446     var isLeft=false; //range display on left side of y-axis if true otherwise right side.
5350 25 May 10 nicklas 447     var isUp=false;  //range display above the x-axis if true otherwise below.
5350 25 May 10 nicklas 448     gridDiv.innerHTML="";
5350 25 May 10 nicklas 449
5350 25 May 10 nicklas 450     if(!color)
5350 25 May 10 nicklas 451       color=new jsColor(200,200,200);
5350 25 May 10 nicklas 452       
5350 25 May 10 nicklas 453     if(!range)
5350 25 May 10 nicklas 454       range=Math.round(parseInt(gridDiv.style.width)/10);  //If range not specified, use grid with devided by 10 as range.
5350 25 May 10 nicklas 455     else  
5350 25 May 10 nicklas 456       range=range*scale;
5350 25 May 10 nicklas 457       
5350 25 May 10 nicklas 458     var hexColor=color.getHex();
5350 25 May 10 nicklas 459     
5350 25 May 10 nicklas 460     //If grid height or width is not available, the grid will not be displayed.
5350 25 May 10 nicklas 461     if(parseInt(gridDiv.style.width)<=0 || parseInt(gridDiv.style.height)<=0)
5350 25 May 10 nicklas 462         return;
5350 25 May 10 nicklas 463     else
5350 25 May 10 nicklas 464         gridDiv.style.display="";
5350 25 May 10 nicklas 465         
5350 25 May 10 nicklas 466     x0=parseInt(gridDiv.style.left)
5350 25 May 10 nicklas 467     x1=parseInt(gridDiv.style.left)+parseInt(gridDiv.style.width);
5350 25 May 10 nicklas 468     y0=parseInt(gridDiv.style.top);
5350 25 May 10 nicklas 469     y1=parseInt(gridDiv.style.top)+parseInt(gridDiv.style.height);
5350 25 May 10 nicklas 470
5350 25 May 10 nicklas 471     //On which side of the axis the range to be displayed is decided based on position of the origin in the canvas.
5350 25 May 10 nicklas 472     //Range is displyed on opposite side of the largest section(out of 4 section divided by the 2 axis)  
5350 25 May 10 nicklas 473     if(origin.x-parseInt(gridDiv.style.left)<=parseInt(gridDiv.style.left)+gridDiv.offsetWidth-origin.x)
5350 25 May 10 nicklas 474       isLeft=true
5350 25 May 10 nicklas 475       
5350 25 May 10 nicklas 476     if(origin.y-parseInt(gridDiv.style.top)<=parseInt(gridDiv.style.top)+gridDiv.offsetHeight-origin.y)
5350 25 May 10 nicklas 477       isUp=true
5350 25 May 10 nicklas 478       
5350 25 May 10 nicklas 479     var iHtml=new Array();  //Holds inner html
5350 25 May 10 nicklas 480     var rangeFont=new jsFont("arial",null,"9px");
5350 25 May 10 nicklas 481     var rangeColor=color.getDarkerShade(150);
5350 25 May 10 nicklas 482     var hexRangeColor=rangeColor.getHex(); 
5350 25 May 10 nicklas 483
5350 25 May 10 nicklas 484     //Draw the border grids
5350 25 May 10 nicklas 485      iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x0 + "px;top:" + y0 + "px;width:" + (x1-x0+1) + "px;height:1px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 486      iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x0 + "px;top:" + y1 + "px;width:" + (x1-x0+1) + "px;height:1px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 487      iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x0 + "px;top:" + y0 + "px;width:1px;height:" + (y1-y0+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 488      iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x1 + "px;top:" + y0 + "px;width:1px;height:" + (y1-y0+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 489
5350 25 May 10 nicklas 490     var gridHeight=gridDiv.offsetHeight;
5350 25 May 10 nicklas 491     var gridWidth=gridDiv.offsetWidth;
5350 25 May 10 nicklas 492     var lastRangeDiv; //previous range div
5350 25 May 10 nicklas 493     var currentRangeDiv //current range div
5350 25 May 10 nicklas 494   
5350 25 May 10 nicklas 495     //Draw vertical grid lines
5350 25 May 10 nicklas 496     for(var x=(origin.x-x0)%range;x<x1;x+=range)
5350 25 May 10 nicklas 497     {
5350 25 May 10 nicklas 498       if(x==origin.x && x>=x0)
5350 25 May 10 nicklas 499       {
5350 25 May 10 nicklas 500         if(x>=x0 && x<=x1)
5350 25 May 10 nicklas 501            iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-99;left:" + x + "px;top:" + y0 + "px;width:1px;height:" + gridHeight + "px;background-color:" + hexRangeColor + "\"></DIV>";
5350 25 May 10 nicklas 502        }  
5350 25 May 10 nicklas 503       else
5350 25 May 10 nicklas 504       {
5350 25 May 10 nicklas 505          iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x + "px;top:" + y0 + "px;width:1px;height:" + gridHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 506        }  
5350 25 May 10 nicklas 507          
5350 25 May 10 nicklas 508       if(showRange && x>=x0 && x<x1)
5350 25 May 10 nicklas 509       {       
5350 25 May 10 nicklas 510          if(lastRangeDiv && lastRangeDiv.offsetLeft + lastRangeDiv.offsetWidth + 1 < x)
5350 25 May 10 nicklas 511          {
5350 25 May 10 nicklas 512            if(lastRangeDiv.offsetWidth < x1-x)
5350 25 May 10 nicklas 513              currentRangeDiv = drawRange(Math.round((x-origin.x)/scale),new jsPoint(x+2,y0+1+origin.y),rangeFont,rangeColor);
5350 25 May 10 nicklas 514          }  
5350 25 May 10 nicklas 515          else if(!lastRangeDiv)
5350 25 May 10 nicklas 516            currentRangeDiv = drawRange(Math.round((x-origin.x)/scale),new jsPoint(x+2,y0+1+origin.y),rangeFont,rangeColor);
5350 25 May 10 nicklas 517          
5350 25 May 10 nicklas 518         if(currentRangeDiv)
5350 25 May 10 nicklas 519         {
5350 25 May 10 nicklas 520            if(!isUp)
5350 25 May 10 nicklas 521           {
5350 25 May 10 nicklas 522             if(parseInt(currentRangeDiv.style.top)+currentRangeDiv.offsetHeight > y1)
5350 25 May 10 nicklas 523                currentRangeDiv.style.top=y1-currentRangeDiv.offsetHeight-1;
5350 25 May 10 nicklas 524           }
5350 25 May 10 nicklas 525           else
5350 25 May 10 nicklas 526           {
5350 25 May 10 nicklas 527             if(parseInt(currentRangeDiv.style.top)-currentRangeDiv.offsetHeight-1>y0)
5350 25 May 10 nicklas 528                currentRangeDiv.style.top=parseInt(currentRangeDiv.style.top)-currentRangeDiv.offsetHeight-1;
5350 25 May 10 nicklas 529              
5350 25 May 10 nicklas 530             if(parseInt(currentRangeDiv.style.top)<=y0)
5350 25 May 10 nicklas 531               currentRangeDiv.style.top=y0 + 1;
5350 25 May 10 nicklas 532           }  
5350 25 May 10 nicklas 533         
5350 25 May 10 nicklas 534           currentRangeDiv.style.visibility="visible";
5350 25 May 10 nicklas 535           lastRangeDiv = currentRangeDiv;
5350 25 May 10 nicklas 536         }
5350 25 May 10 nicklas 537         currentRangeDiv=null;  
5350 25 May 10 nicklas 538
5350 25 May 10 nicklas 539        }    
5350 25 May 10 nicklas 540     }
5350 25 May 10 nicklas 541     lastRangeDiv = null;
5350 25 May 10 nicklas 542
5350 25 May 10 nicklas 543     //Draw horizontal grid lines
5350 25 May 10 nicklas 544     for(var y=(origin.y-y0)%range;y<=y1;y+=range)
5350 25 May 10 nicklas 545     {
5350 25 May 10 nicklas 546       if(y==origin.y)
5350 25 May 10 nicklas 547       {
5350 25 May 10 nicklas 548         if(y>=y0 && y<=y1)
5350 25 May 10 nicklas 549           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-99;left:" + x0 + "px;top:" + y + "px;width:" + gridWidth + "px;height:1px;background-color:" + hexRangeColor + "\"></DIV>";
5350 25 May 10 nicklas 550       }  
5350 25 May 10 nicklas 551       else
5350 25 May 10 nicklas 552          iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;z-index:-100;left:" + x0 + "px;top:" + y + "px;width:" + gridWidth + "px;height:1px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 553        
5350 25 May 10 nicklas 554       if(showRange && y!=origin.y && y>=y0 && y<y1)
5350 25 May 10 nicklas 555       {       
5350 25 May 10 nicklas 556          if(lastRangeDiv && lastRangeDiv.offsetTop + lastRangeDiv.offsetHeight < y)
5350 25 May 10 nicklas 557          {
5350 25 May 10 nicklas 558            if(lastRangeDiv.offsetHeight <= y1-y)
5350 25 May 10 nicklas 559            {
5350 25 May 10 nicklas 560              if(coordinateSystem=="cartecian")
5350 25 May 10 nicklas 561                currentRangeDiv = drawRange(Math.round((origin.y-y)/scale),new jsPoint(x0+2+origin.x,y),rangeFont,rangeColor);
5350 25 May 10 nicklas 562              else
5350 25 May 10 nicklas 563                currentRangeDiv = drawRange(Math.round((y-origin.y)/scale),new jsPoint(x0+2+origin.x,y),rangeFont,rangeColor);
5350 25 May 10 nicklas 564            }  
5350 25 May 10 nicklas 565          }  
5350 25 May 10 nicklas 566          else if(!lastRangeDiv)
5350 25 May 10 nicklas 567          {
5350 25 May 10 nicklas 568            if(coordinateSystem=="cartecian")
5350 25 May 10 nicklas 569              currentRangeDiv = drawRange(Math.round((origin.y-y)/scale),new jsPoint(x0+2+origin.x,y),rangeFont,rangeColor);
5350 25 May 10 nicklas 570            else  
5350 25 May 10 nicklas 571              currentRangeDiv = drawRange(Math.round((y-origin.y)/scale),new jsPoint(x0+2+origin.x,y),rangeFont,rangeColor);
5350 25 May 10 nicklas 572         }
5350 25 May 10 nicklas 573         
5350 25 May 10 nicklas 574         if(currentRangeDiv)
5350 25 May 10 nicklas 575         {
5350 25 May 10 nicklas 576           if(!isLeft)
5350 25 May 10 nicklas 577           {
5350 25 May 10 nicklas 578             if(parseInt(currentRangeDiv.style.left)+1+currentRangeDiv.offsetWidth < x1)
5350 25 May 10 nicklas 579                currentRangeDiv.style.left=parseInt(currentRangeDiv.style.left)+1;
5350 25 May 10 nicklas 580              else
5350 25 May 10 nicklas 581               currentRangeDiv.style.left=x1-currentRangeDiv.offsetWidth-3;
5350 25 May 10 nicklas 582           }
5350 25 May 10 nicklas 583           else
5350 25 May 10 nicklas 584           {
5350 25 May 10 nicklas 585             if(parseInt(currentRangeDiv.style.left)-currentRangeDiv.offsetWidth-2 > x0)
5350 25 May 10 nicklas 586                currentRangeDiv.style.left=parseInt(currentRangeDiv.style.left)-currentRangeDiv.offsetWidth-2;
5350 25 May 10 nicklas 587              else
5350 25 May 10 nicklas 588                currentRangeDiv.style.left=parseInt(currentRangeDiv.style.left)+1;
5350 25 May 10 nicklas 589                
5350 25 May 10 nicklas 590             if(parseInt(currentRangeDiv.style.left)<=x0)
5350 25 May 10 nicklas 591               currentRangeDiv.style.left=x0 + 1;
5350 25 May 10 nicklas 592           }
5350 25 May 10 nicklas 593         
5350 25 May 10 nicklas 594           currentRangeDiv.style.visibility="visible";
5350 25 May 10 nicklas 595           
5350 25 May 10 nicklas 596           //Hide the overlapping range.
5350 25 May 10 nicklas 597           if(isUp && parseInt(currentRangeDiv.style.top)+currentRangeDiv.offsetHeight>origin.y-currentRangeDiv.offsetHeight && parseInt(currentRangeDiv.style.top)<origin.y)
5350 25 May 10 nicklas 598             currentRangeDiv.style.visibility="hidden";
5350 25 May 10 nicklas 599
5350 25 May 10 nicklas 600           if(isUp && parseInt(currentRangeDiv.style.top)>origin.y && parseInt(currentRangeDiv.style.top)<origin.y+currentRangeDiv.offsetHeight && parseInt(currentRangeDiv.style.top)>origin.y)
5350 25 May 10 nicklas 601             currentRangeDiv.style.visibility="hidden";
5350 25 May 10 nicklas 602
5350 25 May 10 nicklas 603           if(origin.y>y1 && parseInt(currentRangeDiv.style.top)+currentRangeDiv.offsetHeight>y1-currentRangeDiv.offsetHeight)
5350 25 May 10 nicklas 604             currentRangeDiv.style.visibility="hidden";  
5350 25 May 10 nicklas 605
5350 25 May 10 nicklas 606           if(!isUp && parseInt(currentRangeDiv.style.top)<origin.y+currentRangeDiv.offsetHeight && parseInt(currentRangeDiv.style.top)>origin.y)
5350 25 May 10 nicklas 607             currentRangeDiv.style.visibility="hidden";
5350 25 May 10 nicklas 608             
5350 25 May 10 nicklas 609           if(!isUp && parseInt(currentRangeDiv.style.top)<origin.y && parseInt(currentRangeDiv.style.top)+currentRangeDiv.offsetHeight>origin.y && parseInt(currentRangeDiv.style.top)<origin.y)
5350 25 May 10 nicklas 610           {
5350 25 May 10 nicklas 611             alert(parseInt(currentRangeDiv.style.top));
5350 25 May 10 nicklas 612             currentRangeDiv.style.visibility="hidden";
5350 25 May 10 nicklas 613           }
5350 25 May 10 nicklas 614           if(origin.y<y0 && parseInt(currentRangeDiv.style.top)<y0+currentRangeDiv.offsetHeight)
5350 25 May 10 nicklas 615             currentRangeDiv.style.visibility="hidden";
5350 25 May 10 nicklas 616
5350 25 May 10 nicklas 617           lastRangeDiv=currentRangeDiv;
5350 25 May 10 nicklas 618         }
5350 25 May 10 nicklas 619         currentRangeDiv = null;  
5350 25 May 10 nicklas 620
5350 25 May 10 nicklas 621       }
5350 25 May 10 nicklas 622     }
5350 25 May 10 nicklas 623
5350 25 May 10 nicklas 624     gridDiv.innerHTML=gridDiv.innerHTML + iHtml.join("");
5350 25 May 10 nicklas 625     
5350 25 May 10 nicklas 626     //Internal function only to be used by showGrid method to draw the range value.
5350 25 May 10 nicklas 627     function drawRange(text,point,font,color,align)
5350 25 May 10 nicklas 628     {
5350 25 May 10 nicklas 629           var textDiv=document.createElement("div");
5350 25 May 10 nicklas 630
5350 25 May 10 nicklas 631           textDiv.style.position="absolute";
5350 25 May 10 nicklas 632           textDiv.style.left=point.x + "px";
5350 25 May 10 nicklas 633           textDiv.style.top=point.y + "px";
5350 25 May 10 nicklas 634           textDiv.style.color=color.getHex();
5350 25 May 10 nicklas 635           textDiv.style.zIndex=-98;
5350 25 May 10 nicklas 636       textDiv.style.visibility="hidden";
5350 25 May 10 nicklas 637
5350 25 May 10 nicklas 638           gridDiv.appendChild(textDiv);
5350 25 May 10 nicklas 639                 
5350 25 May 10 nicklas 640           //set font
5350 25 May 10 nicklas 641           if(font.family)
5350 25 May 10 nicklas 642               textDiv.style.fontFamily=font.family;
5350 25 May 10 nicklas 643
5350 25 May 10 nicklas 644           if(font.weight)
5350 25 May 10 nicklas 645               textDiv.style.fontWeight=font.weight;
5350 25 May 10 nicklas 646         
5350 25 May 10 nicklas 647           if(font.size)
5350 25 May 10 nicklas 648               textDiv.style.fontSize=font.size;
5350 25 May 10 nicklas 649         
5350 25 May 10 nicklas 650           if(font.style)
5350 25 May 10 nicklas 651               textDiv.style.fontStyle=font.style;
5350 25 May 10 nicklas 652         
5350 25 May 10 nicklas 653           if(font.variant)
5350 25 May 10 nicklas 654               textDiv.style.fontVariant=font.variant;
5350 25 May 10 nicklas 655
5350 25 May 10 nicklas 656             if(align) 
5350 25 May 10 nicklas 657                 textDiv.align=align;
5350 25 May 10 nicklas 658         
5350 25 May 10 nicklas 659           textDiv.innerHTML=text;
5350 25 May 10 nicklas 660           return textDiv;
5350 25 May 10 nicklas 661       }
5350 25 May 10 nicklas 662   }
5350 25 May 10 nicklas 663
5350 25 May 10 nicklas 664   //Clear the grid.
5350 25 May 10 nicklas 665   function hideGrid()
5350 25 May 10 nicklas 666   {
5350 25 May 10 nicklas 667     gridDiv.innerHTML="";
5350 25 May 10 nicklas 668     gridDiv.style.display="none";
5350 25 May 10 nicklas 669   }
5350 25 May 10 nicklas 670   
5350 25 May 10 nicklas 671   //Draw Line between the 2 specified points based on Mid point Algorithm.
5350 25 May 10 nicklas 672   function drawLine(pen,point0,point1)
5350 25 May 10 nicklas 673   {
5350 25 May 10 nicklas 674     //Check arguments for null values
5350 25 May 10 nicklas 675     if(!pen || !point0 || !point1)
5350 25 May 10 nicklas 676       return false;
5350 25 May 10 nicklas 677       
5350 25 May 10 nicklas 678       var lineDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 679       
7419 03 Nov 17 nicklas 680       var phPoint0;
7419 03 Nov 17 nicklas 681       var phPoint1;
5350 25 May 10 nicklas 682       //Some library functions use drawLine method and need to pass physical points only. So the following check.
5350 25 May 10 nicklas 683       if(arguments[3]!="physical") 
5350 25 May 10 nicklas 684       {
5350 25 May 10 nicklas 685         phPoint0=logicalToPhysicalPoint(point0);
5350 25 May 10 nicklas 686            phPoint1=logicalToPhysicalPoint(point1);
5350 25 May 10 nicklas 687          }
5350 25 May 10 nicklas 688          else
5350 25 May 10 nicklas 689          {
5350 25 May 10 nicklas 690            phPoint0=new jsPoint(point0.x,point0.y);
5350 25 May 10 nicklas 691            phPoint1=new jsPoint(point1.x,point1.y);
5350 25 May 10 nicklas 692          }
5350 25 May 10 nicklas 693
5350 25 May 10 nicklas 694      var x0, x1, y0, y1;
5527 13 Dec 10 nicklas 695      x0=Math.round(phPoint0.x);
5527 13 Dec 10 nicklas 696      x1=Math.round(phPoint1.x);
5527 13 Dec 10 nicklas 697      y0=Math.round(phPoint0.y);
5527 13 Dec 10 nicklas 698      y1=Math.round(phPoint1.y);
5350 25 May 10 nicklas 699      
5350 25 May 10 nicklas 700      var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 701         //For Horizontal line
5350 25 May 10 nicklas 702      if(y0==y1)
5350 25 May 10 nicklas 703      {
5350 25 May 10 nicklas 704        if(x0<=x1)
5350 25 May 10 nicklas 705          lineDiv.innerHTML="<DIV style=\"position:absolute;overflow:hidden;left:" + x0 + "px;top:" + y0 + "px;width:" + (x1-x0+1) + "px;height:" + pen.width + ";background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 706        else if(x0>x1)
5350 25 May 10 nicklas 707          lineDiv.innerHTML="<DIV style=\"position:absolute;overflow:hidden;left:" + x1 + "px;top:" + y0 + "px;width:" + (x0-x1+1) + "px;height:" + pen.width + ";background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 708          
5350 25 May 10 nicklas 709        return lineDiv;
5350 25 May 10 nicklas 710      }
5350 25 May 10 nicklas 711      
5350 25 May 10 nicklas 712      //For Vertical line
5350 25 May 10 nicklas 713      if(x0==x1)
5350 25 May 10 nicklas 714      {
5350 25 May 10 nicklas 715        if(y0<=y1)
5350 25 May 10 nicklas 716          lineDiv.innerHTML="<DIV style=\"position:absolute;overflow:hidden;left:" + x0 + "px;top:" + y0 + "px;width:" + pen.width + ";height:" + (y1-y0+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 717        else if(y0>y1)
5350 25 May 10 nicklas 718          lineDiv.innerHTML="<DIV style=\"position:absolute;overflow:hidden;left:" + x0 + "px;top:" + y1 + "px;width:" + pen.width + ";height:" + (y0-y1+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 719          
5350 25 May 10 nicklas 720        return lineDiv;
5350 25 May 10 nicklas 721      }
5350 25 May 10 nicklas 722     
5350 25 May 10 nicklas 723       var iHtml=new Array();
5350 25 May 10 nicklas 724      var yArray=new Array();
5350 25 May 10 nicklas 725      
5350 25 May 10 nicklas 726      ///Pixel Height Width Start
5350 25 May 10 nicklas 727     var dx=Math.abs(x1-x0);
5350 25 May 10 nicklas 728      var dy=Math.abs(y1-y0);
5350 25 May 10 nicklas 729      var pixHeight,pixWidth;
5350 25 May 10 nicklas 730      var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 731      
5350 25 May 10 nicklas 732      pixHeight=Math.round(Math.sqrt((penWidth*penWidth)/((dy*dy)/(dx*dx)+1)));
5350 25 May 10 nicklas 733      pixWidth=Math.round(Math.sqrt(penWidth*penWidth-pixHeight*pixHeight));
5350 25 May 10 nicklas 734   
5350 25 May 10 nicklas 735      if(pixWidth==0)
5350 25 May 10 nicklas 736      {
5350 25 May 10 nicklas 737        pixWidth=1;
5350 25 May 10 nicklas 738      }
5350 25 May 10 nicklas 739      if(pixHeight==0)
5350 25 May 10 nicklas 740      {
5350 25 May 10 nicklas 741        pixHeight=1;
5350 25 May 10 nicklas 742      }
5350 25 May 10 nicklas 743      ///Pixel Height Width End
5350 25 May 10 nicklas 744
5350 25 May 10 nicklas 745      var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0); 
5350 25 May 10 nicklas 746     if (steep)
5350 25 May 10 nicklas 747     {   
5350 25 May 10 nicklas 748       // swap   
5350 25 May 10 nicklas 749       var tmp=x0;
5350 25 May 10 nicklas 750       x0=y0;
5350 25 May 10 nicklas 751       y0=tmp;
5350 25 May 10 nicklas 752       tmp=x1;
5350 25 May 10 nicklas 753       x1=y1;
5350 25 May 10 nicklas 754       y1=tmp;
5350 25 May 10 nicklas 755     }
5350 25 May 10 nicklas 756
5350 25 May 10 nicklas 757     if (x0 > x1)
5350 25 May 10 nicklas 758     {   
5350 25 May 10 nicklas 759       // swap   
5350 25 May 10 nicklas 760       var tmp=x0;
5350 25 May 10 nicklas 761       x0=x1;
5350 25 May 10 nicklas 762       x1=tmp;
5350 25 May 10 nicklas 763       tmp=y0;
5350 25 May 10 nicklas 764       y0=y1;
5350 25 May 10 nicklas 765       y1=tmp;
5350 25 May 10 nicklas 766     }
5350 25 May 10 nicklas 767     
5350 25 May 10 nicklas 768     var deltax = x1 - x0;
5350 25 May 10 nicklas 769     var deltay = Math.abs(y1 - y0);
5350 25 May 10 nicklas 770     var error  = deltax/2;
5350 25 May 10 nicklas 771     var ystep;
5350 25 May 10 nicklas 772     var y = y0;
5350 25 May 10 nicklas 773     
5350 25 May 10 nicklas 774     if (y0<y1) 
5350 25 May 10 nicklas 775       ystep = 1; 
5350 25 May 10 nicklas 776     else 
5350 25 May 10 nicklas 777       ystep = -1;
5350 25 May 10 nicklas 778       
5350 25 May 10 nicklas 779     var xp,yp;
5350 25 May 10 nicklas 780     var divWidth=0;
5350 25 May 10 nicklas 781      var divHeight=0;
5350 25 May 10 nicklas 782      if(steep)
5350 25 May 10 nicklas 783      {
5350 25 May 10 nicklas 784        divWidth=pixWidth;
5350 25 May 10 nicklas 785      }
5350 25 May 10 nicklas 786      else
5350 25 May 10 nicklas 787      {
5350 25 May 10 nicklas 788        divHeight=pixHeight;
5350 25 May 10 nicklas 789      }
7419 03 Nov 17 nicklas 790     for (var x=x0;x<=x1;x++)
5350 25 May 10 nicklas 791     {
5350 25 May 10 nicklas 792          if (steep)
5350 25 May 10 nicklas 793          { 
5350 25 May 10 nicklas 794            if(x==x0)
5350 25 May 10 nicklas 795            {
5350 25 May 10 nicklas 796              xp=y;
5350 25 May 10 nicklas 797              yp=x;
5350 25 May 10 nicklas 798            }
5350 25 May 10 nicklas 799            else
5350 25 May 10 nicklas 800            {
5350 25 May 10 nicklas 801              if(y==xp)
5350 25 May 10 nicklas 802              {
5350 25 May 10 nicklas 803                divHeight=divHeight+ 1;
5350 25 May 10 nicklas 804              }
5350 25 May 10 nicklas 805              else
5350 25 May 10 nicklas 806              {
5350 25 May 10 nicklas 807                divHeight=divHeight+pixHeight;
5350 25 May 10 nicklas 808             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xp + "px;top:" + yp + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 809              divHeight=0;    
5350 25 May 10 nicklas 810              xp=y;
5350 25 May 10 nicklas 811                yp=x;    
5350 25 May 10 nicklas 812            }
5350 25 May 10 nicklas 813          }
5350 25 May 10 nicklas 814          
5350 25 May 10 nicklas 815          if(x==x1)
5350 25 May 10 nicklas 816          {
5350 25 May 10 nicklas 817            if(divHeight!=0)
5350 25 May 10 nicklas 818            {
5350 25 May 10 nicklas 819              divHeight=divHeight+pixHeight;
5350 25 May 10 nicklas 820              iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xp + "px;top:" + yp + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 821            }
5350 25 May 10 nicklas 822            else
5350 25 May 10 nicklas 823            {
5350 25 May 10 nicklas 824              divHeight=pixHeight;
5350 25 May 10 nicklas 825             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + y + "px;top:" + x + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 826            }
5350 25 May 10 nicklas 827          }
5350 25 May 10 nicklas 828        }
5350 25 May 10 nicklas 829       else
5350 25 May 10 nicklas 830       { 
5350 25 May 10 nicklas 831         if(x==x0)
5350 25 May 10 nicklas 832            {
5350 25 May 10 nicklas 833              xp=x;
5350 25 May 10 nicklas 834              yp=y;
5350 25 May 10 nicklas 835            }
5350 25 May 10 nicklas 836            else
5350 25 May 10 nicklas 837            {
5350 25 May 10 nicklas 838              if(y==yp)
5350 25 May 10 nicklas 839              {
5350 25 May 10 nicklas 840                divWidth=divWidth + 1;
5350 25 May 10 nicklas 841              }
5350 25 May 10 nicklas 842              else
5350 25 May 10 nicklas 843              {
5350 25 May 10 nicklas 844                divWidth=divWidth+pixWidth;
5527 13 Dec 10 nicklas 845              iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xp + "px;top:" + yp + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 846              divWidth=0;
5350 25 May 10 nicklas 847              xp=x;
5350 25 May 10 nicklas 848              yp=y;      
5350 25 May 10 nicklas 849            }
5350 25 May 10 nicklas 850          }  
5350 25 May 10 nicklas 851          if(x==x1)
5350 25 May 10 nicklas 852          {
5350 25 May 10 nicklas 853            if(divWidth!=0)
5350 25 May 10 nicklas 854            {
5350 25 May 10 nicklas 855                divWidth=divWidth+pixWidth;
5350 25 May 10 nicklas 856             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xp + "px;top:" + yp + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 857            }
5350 25 May 10 nicklas 858            else
5350 25 May 10 nicklas 859            {
5350 25 May 10 nicklas 860              divWidth=pixWidth;
5350 25 May 10 nicklas 861             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + x + "px;top:" + y + "px;width:" + divWidth+ "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 862            }
5350 25 May 10 nicklas 863          }
5350 25 May 10 nicklas 864        }
5350 25 May 10 nicklas 865
5350 25 May 10 nicklas 866          error = error - deltay;
5350 25 May 10 nicklas 867          if (error < 0)
5350 25 May 10 nicklas 868       {     
5350 25 May 10 nicklas 869         y = y + ystep;
5350 25 May 10 nicklas 870            error = error + deltax;
5350 25 May 10 nicklas 871          }
5350 25 May 10 nicklas 872      }
5350 25 May 10 nicklas 873      
5350 25 May 10 nicklas 874      lineDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 875      return lineDiv;
5350 25 May 10 nicklas 876   }
5350 25 May 10 nicklas 877   
5350 25 May 10 nicklas 878   //Private function returns array of x coordinates for y values
5350 25 May 10 nicklas 879   //for a line (algorithm same as drawLine method). 
5350 25 May 10 nicklas 880   //Used by drawArc, fillArc and fillPolygon methods.
5350 25 May 10 nicklas 881   function getLinePixels(point0,point1)
5350 25 May 10 nicklas 882   {
5350 25 May 10 nicklas 883     function xData()
5350 25 May 10 nicklas 884     {
5350 25 May 10 nicklas 885       this.xMax=0;
5350 25 May 10 nicklas 886       this.xMin=0;
5350 25 May 10 nicklas 887       this.isVertex=false;
5350 25 May 10 nicklas 888     }
5350 25 May 10 nicklas 889     
5350 25 May 10 nicklas 890      var x0, x1, y0, y1;
5350 25 May 10 nicklas 891      x0=point0.x;
5350 25 May 10 nicklas 892      x1=point1.x;
5350 25 May 10 nicklas 893      y0=point0.y;
5350 25 May 10 nicklas 894      y1=point1.y;
5350 25 May 10 nicklas 895      var xDataArray=new Array();
5350 25 May 10 nicklas 896      var steep = Math.abs(y1 - y0) > Math.abs(x1 - x0); 
5350 25 May 10 nicklas 897     if (steep)
5350 25 May 10 nicklas 898     {   
5350 25 May 10 nicklas 899       // swap   
5350 25 May 10 nicklas 900       var tmp=x0;
5350 25 May 10 nicklas 901       x0=y0;
5350 25 May 10 nicklas 902       y0=tmp;
5350 25 May 10 nicklas 903       tmp=x1;
5350 25 May 10 nicklas 904       x1=y1;
5350 25 May 10 nicklas 905       y1=tmp;
5350 25 May 10 nicklas 906     }
5350 25 May 10 nicklas 907
5350 25 May 10 nicklas 908     if (x0 > x1)
5350 25 May 10 nicklas 909     {   
5350 25 May 10 nicklas 910       // swap   
5350 25 May 10 nicklas 911       var tmp=x0;
5350 25 May 10 nicklas 912       x0=x1;
5350 25 May 10 nicklas 913       x1=tmp;
5350 25 May 10 nicklas 914       tmp=y0;
5350 25 May 10 nicklas 915       y0=y1;
5350 25 May 10 nicklas 916       y1=tmp;
5350 25 May 10 nicklas 917     }
5350 25 May 10 nicklas 918
5350 25 May 10 nicklas 919     var deltax = x1 - x0;
5350 25 May 10 nicklas 920     var deltay = Math.abs(y1 - y0);
5350 25 May 10 nicklas 921     var error  = deltax/2;
5350 25 May 10 nicklas 922     var ystep;
5350 25 May 10 nicklas 923     var y = y0;
5350 25 May 10 nicklas 924     
5350 25 May 10 nicklas 925     if (y0<y1) 
5350 25 May 10 nicklas 926       ystep = 1; 
5350 25 May 10 nicklas 927     else 
5350 25 May 10 nicklas 928       ystep = -1;
5350 25 May 10 nicklas 929       
7419 03 Nov 17 nicklas 930     for (var x=x0;x<=x1;x++)
5350 25 May 10 nicklas 931     {
5350 25 May 10 nicklas 932          if (steep)
5350 25 May 10 nicklas 933          { 
5350 25 May 10 nicklas 934            xDataArray[x]=new xData();
5350 25 May 10 nicklas 935            xDataArray[x].xMin=y;
5350 25 May 10 nicklas 936            xDataArray[x].xMax=y;
5350 25 May 10 nicklas 937            
5350 25 May 10 nicklas 938            if(x==x0 && y==y0)
5350 25 May 10 nicklas 939              xDataArray[x].isVertex=true;  
5350 25 May 10 nicklas 940        }
5350 25 May 10 nicklas 941       else
5350 25 May 10 nicklas 942       { 
5350 25 May 10 nicklas 943         if(!xDataArray[y])
5350 25 May 10 nicklas 944         {
5350 25 May 10 nicklas 945           xDataArray[y]=new xData();
5350 25 May 10 nicklas 946           xDataArray[y].xMin=x;
5350 25 May 10 nicklas 947              xDataArray[y].xMax=x;
5350 25 May 10 nicklas 948              
5350 25 May 10 nicklas 949              if(x==x0 && y==y0)
5350 25 May 10 nicklas 950                xDataArray[y].isVertex=true;  
5350 25 May 10 nicklas 951         }
5350 25 May 10 nicklas 952         else
5350 25 May 10 nicklas 953         {
5350 25 May 10 nicklas 954           xDataArray[y].xMax=x;
5350 25 May 10 nicklas 955         }
5350 25 May 10 nicklas 956        }
5350 25 May 10 nicklas 957
5350 25 May 10 nicklas 958          error = error - deltay;
5350 25 May 10 nicklas 959          if (error < 0)
5350 25 May 10 nicklas 960       {     
5350 25 May 10 nicklas 961         y = y + ystep;
5350 25 May 10 nicklas 962            error = error + deltax;
5350 25 May 10 nicklas 963          }
5350 25 May 10 nicklas 964      }
5350 25 May 10 nicklas 965     return xDataArray;
5350 25 May 10 nicklas 966   }
5350 25 May 10 nicklas 967
5350 25 May 10 nicklas 968     //Draw rectangle at specified point with specified width and height.  
5350 25 May 10 nicklas 969     function drawRectangle(pen,point,width,height)
5350 25 May 10 nicklas 970     {
5350 25 May 10 nicklas 971       //Check arguments for null values
5350 25 May 10 nicklas 972       if(!pen || !point || !width || !height)
5350 25 May 10 nicklas 973         return false;
5350 25 May 10 nicklas 974         
5350 25 May 10 nicklas 975       width=Math.round(width*scale);
5350 25 May 10 nicklas 976       height=Math.round(height*scale);
5350 25 May 10 nicklas 977       
5350 25 May 10 nicklas 978         var rectDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 979         var iHtml=new Array();
5350 25 May 10 nicklas 980         
5350 25 May 10 nicklas 981         var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 982         var hexColor=pen.color.getHex(); 
5350 25 May 10 nicklas 983         
5350 25 May 10 nicklas 984         //If pen width is less than height or width specified use fillRectangle method
5350 25 May 10 nicklas 985         if(penWidth>=height || penWidth>=width)
5350 25 May 10 nicklas 986           return this.fillRectangle(pen.color,point,width,height);
5350 25 May 10 nicklas 987           
7419 03 Nov 17 nicklas 988        var phPoint=logicalToPhysicalPoint(point);
5350 25 May 10 nicklas 989         
5350 25 May 10 nicklas 990         //Draw 4 sides of the rectangle.
5350 25 May 10 nicklas 991         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + phPoint.x + "px;top:" + phPoint.y + "px;width:" + width +  "px;height:" + penWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 992         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + phPoint.x + "px;top:" + (phPoint.y+height-penWidth) + "px;width:" + width +  "px;height:" + penWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 993         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + phPoint.x + "px;top:" + (phPoint.y+penWidth) + "px;width:" + penWidth +  "px;height:" + (height-2*penWidth+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 994         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (phPoint.x+width-penWidth) + "px;top:" + (phPoint.y+penWidth) + "px;width:" + penWidth +  "px;height:" + (height-2*penWidth+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 995         
5350 25 May 10 nicklas 996         rectDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 997         return rectDiv;
5350 25 May 10 nicklas 998     }
5350 25 May 10 nicklas 999
5350 25 May 10 nicklas 1000     //Draw color filled rectangle at specified point with specified color, width and height
5350 25 May 10 nicklas 1001     function fillRectangle(color,point,width,height)
5350 25 May 10 nicklas 1002     {
5350 25 May 10 nicklas 1003       //Check arguments for null values
5350 25 May 10 nicklas 1004       if(!color || !point || !width || !height)
5350 25 May 10 nicklas 1005         return false;
5350 25 May 10 nicklas 1006
5350 25 May 10 nicklas 1007       width=Math.round(width*scale);
5350 25 May 10 nicklas 1008       height=Math.round(height*scale);
5350 25 May 10 nicklas 1009       
5350 25 May 10 nicklas 1010         var rectDiv=canvasDiv.appendChild(document.createElement("div"));
7419 03 Nov 17 nicklas 1011         var phPoint=logicalToPhysicalPoint(point);
5350 25 May 10 nicklas 1012
5350 25 May 10 nicklas 1013         var hexColor=color.getHex();
5350 25 May 10 nicklas 1014         
5350 25 May 10 nicklas 1015         //Draw a single div element
5350 25 May 10 nicklas 1016         rectDiv.innerHTML="<DIV style=\"position:absolute;overflow:hidden;left:" + phPoint.x + "px;top:" + phPoint.y + "px;width:" + width +  "px;height:" + height + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1017         return rectDiv;
5350 25 May 10 nicklas 1018     }
5350 25 May 10 nicklas 1019
5350 25 May 10 nicklas 1020     //This is a private function to draw an ellipse with width 1px.
5350 25 May 10 nicklas 1021     //It is used by drawEllipse method. 
5350 25 May 10 nicklas 1022     //Mid point algorithm is used for the drawing
5350 25 May 10 nicklas 1023     function drawEllipseSingle(pen,center,width,height)
5350 25 May 10 nicklas 1024     {
5350 25 May 10 nicklas 1025          //Check arguments for null values
5350 25 May 10 nicklas 1026       if(!pen || !center || !width || !height)
5350 25 May 10 nicklas 1027         return false;
5350 25 May 10 nicklas 1028         
5350 25 May 10 nicklas 1029         var ellipseDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 1030         var iHtml=new Array();
5350 25 May 10 nicklas 1031
5350 25 May 10 nicklas 1032         var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 1033         var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 1034         
5350 25 May 10 nicklas 1035       var a=Math.round(width/2);
5350 25 May 10 nicklas 1036       var b=Math.round(height/2);
5350 25 May 10 nicklas 1037       var xc=center.x;
5350 25 May 10 nicklas 1038       var yc=center.y;
5350 25 May 10 nicklas 1039
5350 25 May 10 nicklas 1040       var x=0;
5350 25 May 10 nicklas 1041       var y=b;
5350 25 May 10 nicklas 1042       var a2=a*a;
5350 25 May 10 nicklas 1043       var b2=b*b;
5350 25 May 10 nicklas 1044       
5350 25 May 10 nicklas 1045       var yp=y;
5350 25 May 10 nicklas 1046       var xp=x;
5350 25 May 10 nicklas 1047       var divWidth;
5350 25 May 10 nicklas 1048       var divHeight;
5350 25 May 10 nicklas 1049       
5350 25 May 10 nicklas 1050        while(b2*x < a2*y)
5350 25 May 10 nicklas 1051         {     
5350 25 May 10 nicklas 1052           x++;    
5350 25 May 10 nicklas 1053          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 1054            y--;    
5350 25 May 10 nicklas 1055         
5350 25 May 10 nicklas 1056         if(x==1 && y!=yp)
5350 25 May 10 nicklas 1057         {
5350 25 May 10 nicklas 1058             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+x) + "px;top:" + (yc+y) + "px;width:1px;height:1px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1059             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+x) + "px;top:" + (yc-y) + "px;width:1px;height:1px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1060         }
5350 25 May 10 nicklas 1061             if(y!=yp)
5350 25 May 10 nicklas 1062             {
5350 25 May 10 nicklas 1063           divWidth=x-xp;
5350 25 May 10 nicklas 1064           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp) + "px;top:" + (yc+yp-penWidth+1) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1065           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp-divWidth+1) + "px;top:" + (yc+yp-penWidth+1) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1066           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp) + "px;top:" + (yc-yp) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1067           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp-divWidth+1) + "px;top:" + (yc-yp) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1068
5350 25 May 10 nicklas 1069           yp=y;
5350 25 May 10 nicklas 1070           xp=x;
5350 25 May 10 nicklas 1071         }
5350 25 May 10 nicklas 1072         
5350 25 May 10 nicklas 1073         if(b2*x >= a2*y)
5350 25 May 10 nicklas 1074         {
5350 25 May 10 nicklas 1075           divWidth=x-xp+1;
5350 25 May 10 nicklas 1076           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp) + "px;top:" + (yc+yp-penWidth+1) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1077           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp-divWidth+1) + "px;top:" + (yc+yp-penWidth+1) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1078           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp) + "px;top:" + (yc-yp) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1079           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp-divWidth+1) + "px;top:" + (yc-yp) + "px;height:" + penWidth + "px;width:" + divWidth + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1080         }
5350 25 May 10 nicklas 1081       }
5350 25 May 10 nicklas 1082
5350 25 May 10 nicklas 1083         yp=y;
5350 25 May 10 nicklas 1084       xp=x;
5350 25 May 10 nicklas 1085       
5350 25 May 10 nicklas 1086       while(y!=0)  
5350 25 May 10 nicklas 1087       {
5350 25 May 10 nicklas 1088         y--;   
5350 25 May 10 nicklas 1089           if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 1090              x++;
5350 25 May 10 nicklas 1091         
5350 25 May 10 nicklas 1092            if(x!=xp)
5350 25 May 10 nicklas 1093            {
5350 25 May 10 nicklas 1094           divHeight=yp-y;
5350 25 May 10 nicklas 1095           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp-penWidth+1) + "px;top:" + (yc+yp-divHeight+1) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1096           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp-penWidth+1) + "px;top:" + (yc-yp) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1097           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc+yp-divHeight+1) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1098           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc-yp) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1099           
5350 25 May 10 nicklas 1100           xp=x;
5350 25 May 10 nicklas 1101           yp=y;
5350 25 May 10 nicklas 1102         }
5350 25 May 10 nicklas 1103         
5350 25 May 10 nicklas 1104            if(y==0)
5350 25 May 10 nicklas 1105            {
5350 25 May 10 nicklas 1106           divHeight=yp-y+1;
5350 25 May 10 nicklas 1107           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp-penWidth+1) + "px;top:" + (yc+yp-divHeight+1) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1108           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc+xp-penWidth+1) + "px;top:" + (yc-yp) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1109           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc+yp-divHeight+1) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1110           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc-yp) + "px;width:" + penWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1111           
5350 25 May 10 nicklas 1112           xp=x;
5350 25 May 10 nicklas 1113           yp=y;
5350 25 May 10 nicklas 1114         }
5350 25 May 10 nicklas 1115
5350 25 May 10 nicklas 1116        }
5350 25 May 10 nicklas 1117        
5350 25 May 10 nicklas 1118        ellipseDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 1119        return ellipseDiv;
5350 25 May 10 nicklas 1120     }
5350 25 May 10 nicklas 1121
5350 25 May 10 nicklas 1122     //Draw ellipse with specified center, width and height.
5350 25 May 10 nicklas 1123     //Mid point algorithm is used for basic drawing.  
5350 25 May 10 nicklas 1124     function drawEllipse(pen,center,width,height)
5350 25 May 10 nicklas 1125     {
5350 25 May 10 nicklas 1126       //Check arguments for null values
5350 25 May 10 nicklas 1127       if(!pen || !center || !width || !height)
5350 25 May 10 nicklas 1128         return false;
5350 25 May 10 nicklas 1129         
5350 25 May 10 nicklas 1130       width*=scale;
5350 25 May 10 nicklas 1131       height*=scale;
5350 25 May 10 nicklas 1132
5350 25 May 10 nicklas 1133         var ellipseDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 1134         var iHtml=new Array();
5350 25 May 10 nicklas 1135         
7419 03 Nov 17 nicklas 1136         var phCenter=logicalToPhysicalPoint(center);
5350 25 May 10 nicklas 1137
5350 25 May 10 nicklas 1138       var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 1139       if(penWidth<=1)
5350 25 May 10 nicklas 1140       {
5350 25 May 10 nicklas 1141         return drawEllipseSingle(pen,phCenter,width,height);
5350 25 May 10 nicklas 1142       }
5350 25 May 10 nicklas 1143       
5350 25 May 10 nicklas 1144       var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 1145       
5350 25 May 10 nicklas 1146       var a=Math.round(width/2);
5350 25 May 10 nicklas 1147       var b=Math.round(height/2);
5350 25 May 10 nicklas 1148       var xc=phCenter.x;
5350 25 May 10 nicklas 1149       var yc=phCenter.y;
5350 25 May 10 nicklas 1150       
5350 25 May 10 nicklas 1151       //For inner ellipse
5350 25 May 10 nicklas 1152       var ai=a-penWidth + 1;
5350 25 May 10 nicklas 1153       var bi=b-penWidth + 1;
5350 25 May 10 nicklas 1154       
5350 25 May 10 nicklas 1155       //For drawing ellipse having width more than 1px, inner ellipse is required to be considered
5350 25 May 10 nicklas 1156       var res=getInnerEllipse(phCenter,ai*2,bi*2)
5350 25 May 10 nicklas 1157       
5350 25 May 10 nicklas 1158       var xArray=res[0];
5350 25 May 10 nicklas 1159       var xArrayI=res[1];
5350 25 May 10 nicklas 1160       
5350 25 May 10 nicklas 1161       var yi=bi;
5350 25 May 10 nicklas 1162       var ai2=ai*ai;
5350 25 May 10 nicklas 1163       var bi2=bi*bi;
5350 25 May 10 nicklas 1164       
5350 25 May 10 nicklas 1165       var x=0;
5350 25 May 10 nicklas 1166       var y=b;
5350 25 May 10 nicklas 1167       var a2=a*a;
5350 25 May 10 nicklas 1168       var b2=b*b;
5350 25 May 10 nicklas 1169       
5350 25 May 10 nicklas 1170       var xp,yp;
5350 25 May 10 nicklas 1171       
5350 25 May 10 nicklas 1172       xp=1;
5350 25 May 10 nicklas 1173       yp=y;
5350 25 May 10 nicklas 1174       var ypi=yi;
5350 25 May 10 nicklas 1175       
5350 25 May 10 nicklas 1176       var xT;
5350 25 May 10 nicklas 1177       var divWidth;
5350 25 May 10 nicklas 1178       var divHeight=1;
5350 25 May 10 nicklas 1179       
5350 25 May 10 nicklas 1180        while(b2*x < a2*y)
5350 25 May 10 nicklas 1181         {     
5350 25 May 10 nicklas 1182           x++;    
5350 25 May 10 nicklas 1183          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 1184            y--;    
5350 25 May 10 nicklas 1185         
5350 25 May 10 nicklas 1186         if(y+1<bi)
5350 25 May 10 nicklas 1187         {
5350 25 May 10 nicklas 1188            if(y!=yp)
5350 25 May 10 nicklas 1189           {
5350 25 May 10 nicklas 1190             xT=xc-x+1;
5350 25 May 10 nicklas 1191             divWidth=(x-1)+1-xArray[yp];
5350 25 May 10 nicklas 1192             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1193             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1194
5350 25 May 10 nicklas 1195             xT=xT+2*(x-1)+1-divWidth;
5350 25 May 10 nicklas 1196             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1197             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1198             
5350 25 May 10 nicklas 1199             yp=y;    
5350 25 May 10 nicklas 1200             xp=x;
5350 25 May 10 nicklas 1201           }
5350 25 May 10 nicklas 1202           //Last step in loop
5350 25 May 10 nicklas 1203           if(b2*x >= a2*y)
5350 25 May 10 nicklas 1204           {
5350 25 May 10 nicklas 1205             xT=xc-x;
5350 25 May 10 nicklas 1206             divWidth=x+1-xArray[yp];
5350 25 May 10 nicklas 1207             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1208             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1209             
5350 25 May 10 nicklas 1210             xT=xT+2*x+1-divWidth;
5350 25 May 10 nicklas 1211             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1212             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1213           }
5350 25 May 10 nicklas 1214         }       
5350 25 May 10 nicklas 1215         else
5350 25 May 10 nicklas 1216         {
5350 25 May 10 nicklas 1217               if(x==1 && y!=yp) //Topmost and bottom most points, to be tested
5350 25 May 10 nicklas 1218               {
5350 25 May 10 nicklas 1219             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;width:1px;height:1px;left:" + xc + "px;top:" + (yc+yp-1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1220             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;width:1px;height:1px;left:" + xc + "px;top:" + (yc-yp) + "px;background-color:" + hexColor + "\"></DIV>";          
5350 25 May 10 nicklas 1221           }
5350 25 May 10 nicklas 1222           if(y!=yp)
5350 25 May 10 nicklas 1223           {
5350 25 May 10 nicklas 1224                iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x+1) + "px;top:" + (yc-yp) + "px;width:" + (2*(x-1)+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1225             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x+1) + "px;top:" + (yc+yp) + "px;width:" + (2*(x-1)+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1226             yp=y;
5350 25 May 10 nicklas 1227           }
5350 25 May 10 nicklas 1228               
5350 25 May 10 nicklas 1229           //Last step in loop
5350 25 May 10 nicklas 1230           if(y==bi || y==0)
5350 25 May 10 nicklas 1231           {
5350 25 May 10 nicklas 1232               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x) + "px;top:" + (yc-y) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1233             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x) + "px;top:" + (yc+y) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1234           }
5350 25 May 10 nicklas 1235         }
5350 25 May 10 nicklas 1236       }
5350 25 May 10 nicklas 1237         
5350 25 May 10 nicklas 1238       xp=x;
5350 25 May 10 nicklas 1239       yp=y;
5350 25 May 10 nicklas 1240       divHeight=1;
5350 25 May 10 nicklas 1241       var xpi=xArray[y];
5350 25 May 10 nicklas 1242
5350 25 May 10 nicklas 1243       while(y!=0)  
5350 25 May 10 nicklas 1244       {     
5350 25 May 10 nicklas 1245         y--;   
5350 25 May 10 nicklas 1246           if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 1247              x++;
5350 25 May 10 nicklas 1248         
5350 25 May 10 nicklas 1249           if(y+1<bi)
5350 25 May 10 nicklas 1250           {
5350 25 May 10 nicklas 1251             if(x!=xp || xArray[y]!=xpi)
5350 25 May 10 nicklas 1252             {
5350 25 May 10 nicklas 1253               divHeight=yp-y;
5350 25 May 10 nicklas 1254               
5350 25 May 10 nicklas 1255               xT=xc-xp;
5350 25 May 10 nicklas 1256               divWidth=xp+1-xArray[y+1];
5350 25 May 10 nicklas 1257               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1258                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y+1) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1259             
5350 25 May 10 nicklas 1260               xT=xT+2*xp+1-divWidth;
5350 25 May 10 nicklas 1261               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1262                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y+1) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1263             
5350 25 May 10 nicklas 1264               xp=x;
5350 25 May 10 nicklas 1265               yp=y;
5350 25 May 10 nicklas 1266               xpi=xArray[y];
5350 25 May 10 nicklas 1267             }
5350 25 May 10 nicklas 1268         
5350 25 May 10 nicklas 1269             //Last step in loop
5350 25 May 10 nicklas 1270             if(y==0)
5350 25 May 10 nicklas 1271             {
5350 25 May 10 nicklas 1272               divHeight=yp-y+1;
5350 25 May 10 nicklas 1273
5350 25 May 10 nicklas 1274               xT=xc-x;
5350 25 May 10 nicklas 1275               divWidth=x+1-xArray[y];
5350 25 May 10 nicklas 1276               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1277                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1278             
5350 25 May 10 nicklas 1279               xT=xT+2*x+1-divWidth;
5350 25 May 10 nicklas 1280               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc-yp) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1281                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + xT + "px;top:" + (yc+y) + "px;width:" + divWidth + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1282                 
5350 25 May 10 nicklas 1283                 xp=x;
5350 25 May 10 nicklas 1284               yp=y;
5350 25 May 10 nicklas 1285               xpi=xArray[y];
5350 25 May 10 nicklas 1286             }
5350 25 May 10 nicklas 1287           }
5350 25 May 10 nicklas 1288           else
5350 25 May 10 nicklas 1289           {
5350 25 May 10 nicklas 1290             if(x!=xp)
5350 25 May 10 nicklas 1291             {
5350 25 May 10 nicklas 1292               divHeight=yp-y;
5350 25 May 10 nicklas 1293               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc-yp) + "px;width:" + (2*xp+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1294                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc+y+1) + "px;width:" + (2*xp+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1295
5350 25 May 10 nicklas 1296               xp=x;
5350 25 May 10 nicklas 1297               yp=y;
5350 25 May 10 nicklas 1298               xpi=xArray[y];
5350 25 May 10 nicklas 1299             }
5350 25 May 10 nicklas 1300         
5350 25 May 10 nicklas 1301             //Last step in loop
5350 25 May 10 nicklas 1302             if(y==bi || y==0)
5350 25 May 10 nicklas 1303             {
5350 25 May 10 nicklas 1304                 divHeight=yp-y+1;
5350 25 May 10 nicklas 1305                 
5350 25 May 10 nicklas 1306               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x) + "px;top:" + (yc-yp) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1307                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-x) + "px;top:" + (yc+y) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1308                 
5350 25 May 10 nicklas 1309               xp=x;
5350 25 May 10 nicklas 1310               yp=y;
5350 25 May 10 nicklas 1311               xpi=xArray[y];
5350 25 May 10 nicklas 1312             }
5350 25 May 10 nicklas 1313           }  
5350 25 May 10 nicklas 1314          }
5350 25 May 10 nicklas 1315          
5350 25 May 10 nicklas 1316          ellipseDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 1317          return ellipseDiv;
5350 25 May 10 nicklas 1318     }
5350 25 May 10 nicklas 1319
5350 25 May 10 nicklas 1320     //For ellipse having width more than 1 px, get the coordinates for inner ellipse.
5350 25 May 10 nicklas 1321     function getInnerEllipse(center,w,h)
5350 25 May 10 nicklas 1322     {
5350 25 May 10 nicklas 1323       var a=Math.round(w/2);
5350 25 May 10 nicklas 1324       var b=Math.round(h/2);
5350 25 May 10 nicklas 1325       var xc=center.x;
5350 25 May 10 nicklas 1326       var yc=center.y;
5350 25 May 10 nicklas 1327       
7419 03 Nov 17 nicklas 1328       var xArray=new Array();
7419 03 Nov 17 nicklas 1329       var xArrayI=new Array();
5350 25 May 10 nicklas 1330
5350 25 May 10 nicklas 1331       var x=0;
5350 25 May 10 nicklas 1332       var y=b;
5350 25 May 10 nicklas 1333       var a2=a*a;
5350 25 May 10 nicklas 1334       var b2=b*b;
5350 25 May 10 nicklas 1335       
5350 25 May 10 nicklas 1336       xArray[y]=x;
5350 25 May 10 nicklas 1337       xArrayI[y]=x;
5350 25 May 10 nicklas 1338       
5350 25 May 10 nicklas 1339       var divWidth;
5350 25 May 10 nicklas 1340       var divHeight;
5350 25 May 10 nicklas 1341       
5350 25 May 10 nicklas 1342       //Upper and Lower portions of the ellipse
5350 25 May 10 nicklas 1343        while(b2*x < a2*y)
5350 25 May 10 nicklas 1344         {     
5350 25 May 10 nicklas 1345           x++;    
5350 25 May 10 nicklas 1346          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 1347            y--;    
5350 25 May 10 nicklas 1348             if(!xArray[y])
5350 25 May 10 nicklas 1349         xArray[y]=x;
5350 25 May 10 nicklas 1350         
5350 25 May 10 nicklas 1351         xArrayI[y]=x;
5350 25 May 10 nicklas 1352       }
5350 25 May 10 nicklas 1353       
5350 25 May 10 nicklas 1354       //Left and Right portions of the ellipse
5350 25 May 10 nicklas 1355       while(y!=0)  
5350 25 May 10 nicklas 1356       {     
5350 25 May 10 nicklas 1357         y--;   
5350 25 May 10 nicklas 1358           if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 1359              x++;
5350 25 May 10 nicklas 1360
5350 25 May 10 nicklas 1361            xArray[y]=x;
5350 25 May 10 nicklas 1362            xArrayI[y]=x;
5350 25 May 10 nicklas 1363        }
5350 25 May 10 nicklas 1364        return new Array(xArray,xArrayI);
5350 25 May 10 nicklas 1365     }
5350 25 May 10 nicklas 1366
5350 25 May 10 nicklas 1367     //Draw circle with specified center and radius.
5350 25 May 10 nicklas 1368     //Uses drawEllipse method only.
5350 25 May 10 nicklas 1369     function drawCircle(pen,center,radius)
5350 25 May 10 nicklas 1370     {
5350 25 May 10 nicklas 1371          //Check arguments for null values
5350 25 May 10 nicklas 1372       if(!pen || !center || !radius)
5350 25 May 10 nicklas 1373         return false;
5350 25 May 10 nicklas 1374         
5350 25 May 10 nicklas 1375         return drawEllipse(pen,center,2*radius,2*radius);
5350 25 May 10 nicklas 1376     }
5350 25 May 10 nicklas 1377
5350 25 May 10 nicklas 1378     //Draw circle filled with the specified color alongwith specified center and radius.
5350 25 May 10 nicklas 1379     //Uses drawEllipse method only.
5350 25 May 10 nicklas 1380     function fillCircle(color,center,radius)
5350 25 May 10 nicklas 1381     {
5350 25 May 10 nicklas 1382          //Check arguments for null values
5350 25 May 10 nicklas 1383       if(!color || !center || !radius)
5350 25 May 10 nicklas 1384         return false;
5350 25 May 10 nicklas 1385         
5350 25 May 10 nicklas 1386         return fillEllipse(color,center,2*radius,2*radius);
5350 25 May 10 nicklas 1387     }
5350 25 May 10 nicklas 1388
5350 25 May 10 nicklas 1389     //Draw ellipse filled with specified color and other parameters, center, width and height.
5350 25 May 10 nicklas 1390     //Mid point algorithm is used for basic ellipse drawing.  
5350 25 May 10 nicklas 1391     function fillEllipse(color,center,width,height)
5350 25 May 10 nicklas 1392     {
5350 25 May 10 nicklas 1393       //Check arguments for null values
5350 25 May 10 nicklas 1394       if(!color || !center || !width || !height)
5350 25 May 10 nicklas 1395         return false;
5350 25 May 10 nicklas 1396         
5350 25 May 10 nicklas 1397       width*=scale;
5350 25 May 10 nicklas 1398       height*=scale;
5350 25 May 10 nicklas 1399
5350 25 May 10 nicklas 1400         var ellipseDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 1401         var iHtml=new Array();
5350 25 May 10 nicklas 1402
7419 03 Nov 17 nicklas 1403        var  phCenter=logicalToPhysicalPoint(center);
5350 25 May 10 nicklas 1404
5350 25 May 10 nicklas 1405       var a=Math.round(width/2);
5350 25 May 10 nicklas 1406       var b=Math.round(height/2);
5350 25 May 10 nicklas 1407       var xc=phCenter.x;
5350 25 May 10 nicklas 1408       var yc=phCenter.y;
5350 25 May 10 nicklas 1409       var hexColor=color.getHex();
5350 25 May 10 nicklas 1410       
5350 25 May 10 nicklas 1411       var x=0;
5350 25 May 10 nicklas 1412       var y=b;
5350 25 May 10 nicklas 1413       var a2=a*a;
5350 25 May 10 nicklas 1414       var b2=b*b;
5350 25 May 10 nicklas 1415       
5350 25 May 10 nicklas 1416       var xp,yp;
5350 25 May 10 nicklas 1417       
5350 25 May 10 nicklas 1418       xp=1;
5350 25 May 10 nicklas 1419       yp=y;
5350 25 May 10 nicklas 1420       
5350 25 May 10 nicklas 1421       //Upper and Lower portion of the ellipse
5350 25 May 10 nicklas 1422        while(b2*x < a2*y)
5350 25 May 10 nicklas 1423         {     
5350 25 May 10 nicklas 1424           x++;    
5350 25 May 10 nicklas 1425          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 1426            y--;    
5350 25 May 10 nicklas 1427            
5350 25 May 10 nicklas 1428             if(x==1 && y!=yp) //Topmost and bottom most points, to be tested
5350 25 May 10 nicklas 1429             {
5350 25 May 10 nicklas 1430             
5350 25 May 10 nicklas 1431               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;width:1px;height:1px;left:" + xc + "px;top:" + (yc+yp-1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1432           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;width:1px;height:1px;left:" + xc + "px;top:" + (yc-yp) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1433
5350 25 May 10 nicklas 1434             }
5350 25 May 10 nicklas 1435         if(y!=yp)
5350 25 May 10 nicklas 1436         {
5350 25 May 10 nicklas 1437           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;height:1px;left:" + (xc-x+1) + "px;top:" + (yc-yp) + "px;width:" + (2*x-1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1438           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;height:1px;left:" + (xc-x+1) + "px;top:" + (yc+yp) + "px;width:" + (2*x-1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1439
5350 25 May 10 nicklas 1440           yp=y;
5350 25 May 10 nicklas 1441           xp=x;    
5350 25 May 10 nicklas 1442         }
5350 25 May 10 nicklas 1443           
5350 25 May 10 nicklas 1444         
5350 25 May 10 nicklas 1445         //Last step in loop
5350 25 May 10 nicklas 1446         if(b2*x >= a2*y)
5350 25 May 10 nicklas 1447         {
5350 25 May 10 nicklas 1448           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;height:1px;left:" + (xc-x) + "px;top:" + (yc-yp) + "px;width:" + (2*x+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1449           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;height:1px;left:" + (xc-x) + "px;top:" + (yc+yp) + "px;width:" + (2*x+1) + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1450         }
5350 25 May 10 nicklas 1451       }
5350 25 May 10 nicklas 1452         
5350 25 May 10 nicklas 1453       xp=x;
5350 25 May 10 nicklas 1454       yp=y;
5350 25 May 10 nicklas 1455       var divHeight=1;
5350 25 May 10 nicklas 1456
5350 25 May 10 nicklas 1457       //Left and Right portion of the ellipse
5350 25 May 10 nicklas 1458       while(y!=0)  
5350 25 May 10 nicklas 1459       {     
5350 25 May 10 nicklas 1460         y--;   
5350 25 May 10 nicklas 1461           if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 1462              x++;
5350 25 May 10 nicklas 1463         
5350 25 May 10 nicklas 1464         if(x!=xp)
5350 25 May 10 nicklas 1465         {
5350 25 May 10 nicklas 1466           divHeight=yp-y;
5350 25 May 10 nicklas 1467           
5350 25 May 10 nicklas 1468           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc-yp) + "px;width:" + (2*xp+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1469           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc+y+1) + "px;width:" + (2*xp+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1470           
5350 25 May 10 nicklas 1471           xp=x;
5350 25 May 10 nicklas 1472           yp=y;
5350 25 May 10 nicklas 1473         }
5350 25 May 10 nicklas 1474         
5350 25 May 10 nicklas 1475         //Last step in loop
5350 25 May 10 nicklas 1476         if(y==0)
5350 25 May 10 nicklas 1477         {
5350 25 May 10 nicklas 1478           divHeight=yp-y+1;
5350 25 May 10 nicklas 1479           
5350 25 May 10 nicklas 1480           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc-yp) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1481           iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + (xc-xp) + "px;top:" + (yc+y) + "px;width:" + (2*x+1) + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1482         }
5350 25 May 10 nicklas 1483        }
5350 25 May 10 nicklas 1484        
5350 25 May 10 nicklas 1485        ellipseDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 1486        return ellipseDiv;
5350 25 May 10 nicklas 1487     }
5350 25 May 10 nicklas 1488
5350 25 May 10 nicklas 1489     //Draw arc filled with specified color, center, width, height, start angle and swap angle. 
5350 25 May 10 nicklas 1490     function fillArc(color,center,width,height,startAngle,swapAngle)
5350 25 May 10 nicklas 1491     {
5350 25 May 10 nicklas 1492       //Check arguments for null values 
5350 25 May 10 nicklas 1493       if(!color || !center || !width || !height || startAngle==null || swapAngle==null)
5350 25 May 10 nicklas 1494         return false;
5350 25 May 10 nicklas 1495
5350 25 May 10 nicklas 1496       width*=scale;
5350 25 May 10 nicklas 1497       height*=scale;
5350 25 May 10 nicklas 1498       
5350 25 May 10 nicklas 1499         if(swapAngle==0)
5350 25 May 10 nicklas 1500         return;
5350 25 May 10 nicklas 1501         
5350 25 May 10 nicklas 1502         var arcDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 1503         var iHtml=new Array();
5350 25 May 10 nicklas 1504         
7419 03 Nov 17 nicklas 1505         var phCenter=logicalToPhysicalPoint(center);
5350 25 May 10 nicklas 1506         
5350 25 May 10 nicklas 1507       var saD; //arc start angle degrees.
5350 25 May 10 nicklas 1508       if(startAngle>360)
5350 25 May 10 nicklas 1509           saD=startAngle%360;
5350 25 May 10 nicklas 1510       else
5350 25 May 10 nicklas 1511           saD=startAngle;
5350 25 May 10 nicklas 1512        
5350 25 May 10 nicklas 1513       var swD; //swap angle in degrees.
5350 25 May 10 nicklas 1514       if(swapAngle>360)
5350 25 May 10 nicklas 1515           swD=swapAngle%360;
5350 25 May 10 nicklas 1516       else
5350 25 May 10 nicklas 1517           swD=swapAngle;
5350 25 May 10 nicklas 1518           
5350 25 May 10 nicklas 1519       var eaD; //arc end angle degrees.
5350 25 May 10 nicklas 1520       eaD=parseFloat(saD)+parseFloat(swD);
5350 25 May 10 nicklas 1521       if(eaD>360)
5350 25 May 10 nicklas 1522           eaD=eaD%360; 
5350 25 May 10 nicklas 1523
5350 25 May 10 nicklas 1524       //For cartecian coordinate system.
5350 25 May 10 nicklas 1525       if(coordinateSystem=="cartecian")    
5350 25 May 10 nicklas 1526       {
5350 25 May 10 nicklas 1527         saD=360-saD;
5350 25 May 10 nicklas 1528         eaD=360-eaD;
5350 25 May 10 nicklas 1529         var tempAD;
5350 25 May 10 nicklas 1530         tempAD=saD;
5350 25 May 10 nicklas 1531         saD=eaD;
5350 25 May 10 nicklas 1532         eaD=tempAD;
5350 25 May 10 nicklas 1533       }
5350 25 May 10 nicklas 1534
5350 25 May 10 nicklas 1535       var x1,y1,x2,y2;
5350 25 May 10 nicklas 1536       var saR=saD*Math.PI/180;
5350 25 May 10 nicklas 1537       var swR=swD*Math.PI/180;
5350 25 May 10 nicklas 1538       var eaR=eaD*Math.PI/180;
5350 25 May 10 nicklas 1539       
5350 25 May 10 nicklas 1540       //For start angle
5350 25 May 10 nicklas 1541       if((saD<=45 && saD>=0) || (saD>=135 && saD<=225) || (saD>=315 && saD<=360))
5350 25 May 10 nicklas 1542       {
5350 25 May 10 nicklas 1543         y1=Math.round(phCenter.y+Math.sin(saR)*width/2);
5350 25 May 10 nicklas 1544         if(saD>=90 && saD<=270)
5350 25 May 10 nicklas 1545           x1=Math.round(phCenter.x-width/2);
5350 25 May 10 nicklas 1546         else
5350 25 May 10 nicklas 1547           x1=Math.round(phCenter.x+width/2);
5350 25 May 10 nicklas 1548       }
5350 25 May 10 nicklas 1549       else
5350 25 May 10 nicklas 1550       {
5350 25 May 10 nicklas 1551         x1=Math.round(phCenter.x+Math.cos(saR)*height/2);
5350 25 May 10 nicklas 1552         if(saD>=0 && saD<=180)
5350 25 May 10 nicklas 1553           y1=Math.round(phCenter.y+height/2);
5350 25 May 10 nicklas 1554         else
5350 25 May 10 nicklas 1555           y1=Math.round(phCenter.y-height/2);
5350 25 May 10 nicklas 1556       }
5350 25 May 10 nicklas 1557       
5350 25 May 10 nicklas 1558       //For end angle
5350 25 May 10 nicklas 1559       if((eaD<=45 && eaD>=0) || (eaD>=135 && eaD<=225) || (eaD>=315 && eaD<=360))
5350 25 May 10 nicklas 1560       {
5350 25 May 10 nicklas 1561         y2=Math.round(phCenter.y+Math.sin(eaR)*width/2);
5350 25 May 10 nicklas 1562         if(eaD>=90 && eaD<=270)
5350 25 May 10 nicklas 1563           x2=Math.round(phCenter.x-width/2);
5350 25 May 10 nicklas 1564         else
5350 25 May 10 nicklas 1565           x2=Math.round(phCenter.x+width/2);
5350 25 May 10 nicklas 1566       }
5350 25 May 10 nicklas 1567       else
5350 25 May 10 nicklas 1568       {
5350 25 May 10 nicklas 1569         x2=Math.round(phCenter.x+Math.cos(eaR)*height/2);
5350 25 May 10 nicklas 1570         if(eaD>=0 && eaD<=180)
5350 25 May 10 nicklas 1571           y2=Math.round(phCenter.y+height/2);
5350 25 May 10 nicklas 1572         else
5350 25 May 10 nicklas 1573           y2=Math.round(phCenter.y-height/2);
5350 25 May 10 nicklas 1574       }
5350 25 May 10 nicklas 1575       
5350 25 May 10 nicklas 1576       //Get the pixel arrays for the lines croping the ellipse to form an arc.
7419 03 Nov 17 nicklas 1577       var xDataArraySa=getLinePixels(phCenter,new jsPoint(x1,y1));
7419 03 Nov 17 nicklas 1578       var xDataArrayEa=getLinePixels(phCenter,new jsPoint(x2,y2));
5350 25 May 10 nicklas 1579       
5350 25 May 10 nicklas 1580       var hexColor=color.getHex();
5350 25 May 10 nicklas 1581
5350 25 May 10 nicklas 1582       var a=Math.round(width/2);
5350 25 May 10 nicklas 1583       var b=Math.round(height/2);
5350 25 May 10 nicklas 1584       var xc=phCenter.x;
5350 25 May 10 nicklas 1585       var yc=phCenter.y;
5350 25 May 10 nicklas 1586       
5350 25 May 10 nicklas 1587       var x=0;
5350 25 May 10 nicklas 1588       var y=b;
5350 25 May 10 nicklas 1589       var a2=a*a;
5350 25 May 10 nicklas 1590       var b2=b*b;
5350 25 May 10 nicklas 1591       
5350 25 May 10 nicklas 1592       var xp,yp;
5350 25 May 10 nicklas 1593       var divX1,divX1pU,divX1pD,divX2,divX2pU,divX2pD,divY1,divY2,saX,eaX,saXp,eaXp,xpU,xpD,ypU,ypD;
5350 25 May 10 nicklas 1594       var divWidthOrg,divWidth1,divWidth2,divWidth3,divWidth4,divWidth1p,divWidth2p,divWidth3p,divWidth4p,divHeight;
5350 25 May 10 nicklas 1595       var draw1p,draw2p,draw3p,draw4p;
5350 25 May 10 nicklas 1596       
5350 25 May 10 nicklas 1597       xp=1;
5350 25 May 10 nicklas 1598       yp=y;
5350 25 May 10 nicklas 1599       
5350 25 May 10 nicklas 1600       //Upper and lower portion of the ellipse constutuing the arc
5350 25 May 10 nicklas 1601        while(b2*x < a2*y)
5350 25 May 10 nicklas 1602         {     
5350 25 May 10 nicklas 1603           x++;    
5350 25 May 10 nicklas 1604          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 1605            y--;    
5350 25 May 10 nicklas 1606            
5350 25 May 10 nicklas 1607             if(x==1 && y!=yp) //Topmost and bottom most points, to be tested
5350 25 May 10 nicklas 1608             {
5350 25 May 10 nicklas 1609               divY1=yc+yp-1;
5350 25 May 10 nicklas 1610           divY2=yc-yp;
5350 25 May 10 nicklas 1611           divWidthOrg=1;
5350 25 May 10 nicklas 1612           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 1613           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 1614           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 1615           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 1616           divX1=xc;
5350 25 May 10 nicklas 1617           
5350 25 May 10 nicklas 1618           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 1619           {
5350 25 May 10 nicklas 1620             fillArcSegOut(true);
5350 25 May 10 nicklas 1621             if(eaD<=saD)
5350 25 May 10 nicklas 1622             fillArcSegOut(false);
5350 25 May 10 nicklas 1623           }
5350 25 May 10 nicklas 1624           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 1625           {
5350 25 May 10 nicklas 1626             fillArcSegOut(false);
5350 25 May 10 nicklas 1627             if(eaD<=saD)
5350 25 May 10 nicklas 1628             fillArcSegOut(true);
5350 25 May 10 nicklas 1629           }
5350 25 May 10 nicklas 1630           else
5350 25 May 10 nicklas 1631           {
5350 25 May 10 nicklas 1632             fillArcSegOut(true);
5350 25 May 10 nicklas 1633             fillArcSegOut(false);
5350 25 May 10 nicklas 1634           }
5350 25 May 10 nicklas 1635             }
5350 25 May 10 nicklas 1636         else if(y!=yp)
5350 25 May 10 nicklas 1637         {
5350 25 May 10 nicklas 1638           divY1=yc+yp;
5350 25 May 10 nicklas 1639           divY2=yc-yp;
5350 25 May 10 nicklas 1640           divWidthOrg=2*(x-1)+1;
5350 25 May 10 nicklas 1641           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 1642           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 1643           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 1644           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 1645           divX1=xc-x+1;
5350 25 May 10 nicklas 1646           
5350 25 May 10 nicklas 1647           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 1648           {
5350 25 May 10 nicklas 1649             fillArcSegOut(true);
5350 25 May 10 nicklas 1650             if(eaD<=saD)
5350 25 May 10 nicklas 1651             fillArcSegOut(false);
5350 25 May 10 nicklas 1652           }
5350 25 May 10 nicklas 1653           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 1654           {
5350 25 May 10 nicklas 1655             fillArcSegOut(false);
5350 25 May 10 nicklas 1656             if(eaD<=saD)
5350 25 May 10 nicklas 1657             fillArcSegOut(true);
5350 25 May 10 nicklas 1658           }
5350 25 May 10 nicklas 1659           else
5350 25 May 10 nicklas 1660           {
5350 25 May 10 nicklas 1661             fillArcSegOut(true);
5350 25 May 10 nicklas 1662             fillArcSegOut(false);
5350 25 May 10 nicklas 1663           }  
5350 25 May 10 nicklas 1664           
5350 25 May 10 nicklas 1665           yp=y;
5350 25 May 10 nicklas 1666           xp=x;
5350 25 May 10 nicklas 1667         }
5350 25 May 10 nicklas 1668             
5350 25 May 10 nicklas 1669         
5350 25 May 10 nicklas 1670         //Last step in loop
5350 25 May 10 nicklas 1671         if(b2*x >= a2*y)
5350 25 May 10 nicklas 1672         {
5350 25 May 10 nicklas 1673           divY1=yc+yp;
5350 25 May 10 nicklas 1674           divY2=yc-yp;
5350 25 May 10 nicklas 1675           divWidthOrg=2*x+1;
5350 25 May 10 nicklas 1676           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 1677           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 1678           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 1679           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 1680           divX1=xc-x;
5350 25 May 10 nicklas 1681           
5350 25 May 10 nicklas 1682           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 1683           {
5350 25 May 10 nicklas 1684             fillArcSegOut(true);
5350 25 May 10 nicklas 1685             if(eaD<=saD)
5350 25 May 10 nicklas 1686             fillArcSegOut(false);
5350 25 May 10 nicklas 1687           }
5350 25 May 10 nicklas 1688           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 1689           {
5350 25 May 10 nicklas 1690             fillArcSegOut(false);
5350 25 May 10 nicklas 1691             if(eaD<=saD)
5350 25 May 10 nicklas 1692             fillArcSegOut(true);
5350 25 May 10 nicklas 1693           }
5350 25 May 10 nicklas 1694           else
5350 25 May 10 nicklas 1695           {
5350 25 May 10 nicklas 1696             fillArcSegOut(true);
5350 25 May 10 nicklas 1697             fillArcSegOut(false);
5350 25 May 10 nicklas 1698           }
5350 25 May 10 nicklas 1699         }
5350 25 May 10 nicklas 1700         
5350 25 May 10 nicklas 1701       }
5350 25 May 10 nicklas 1702         
5350 25 May 10 nicklas 1703         xp=x;
5350 25 May 10 nicklas 1704       yp=y;
5350 25 May 10 nicklas 1705       divHeight=1;
5350 25 May 10 nicklas 1706
5350 25 May 10 nicklas 1707       //Similar code as in next while loop for first y before the loop. Only values are retrieved and no drawing.
5350 25 May 10 nicklas 1708                 
5350 25 May 10 nicklas 1709       divY1=yc+y;
5350 25 May 10 nicklas 1710       divY2=yc-y;
5350 25 May 10 nicklas 1711       divWidthOrg=2*x+1;
5350 25 May 10 nicklas 1712       divWidth1=divWidthOrg;
5350 25 May 10 nicklas 1713       divWidth2=divWidthOrg;
5350 25 May 10 nicklas 1714       divWidth3=divWidthOrg;
5350 25 May 10 nicklas 1715       divWidth4=divWidthOrg;
5350 25 May 10 nicklas 1716       divX1=xc-x;
5350 25 May 10 nicklas 1717       
5350 25 May 10 nicklas 1718       if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 1719       {
5350 25 May 10 nicklas 1720         xDataArrayEa.pop();        
5350 25 May 10 nicklas 1721         fillArcSegIn(true,true);
5350 25 May 10 nicklas 1722         if(eaD<=saD)
5350 25 May 10 nicklas 1723         fillArcSegIn(false,true);
5350 25 May 10 nicklas 1724       }        
5350 25 May 10 nicklas 1725       else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 1726       {
5350 25 May 10 nicklas 1727         xDataArrayEa.pop();        
5350 25 May 10 nicklas 1728         if(y!=0)
5350 25 May 10 nicklas 1729           fillArcSegIn(false,true);
5350 25 May 10 nicklas 1730         if(eaD<=saD)
5350 25 May 10 nicklas 1731             fillArcSegIn(true,true);
5350 25 May 10 nicklas 1732       }
5350 25 May 10 nicklas 1733       else
5350 25 May 10 nicklas 1734       {
5350 25 May 10 nicklas 1735         if(saD>=180 && saD<360)
5350 25 May 10 nicklas 1736           xDataArraySa.pop();
5350 25 May 10 nicklas 1737         else
5350 25 May 10 nicklas 1738           xDataArrayEa.pop();
5350 25 May 10 nicklas 1739         
5350 25 May 10 nicklas 1740
5350 25 May 10 nicklas 1741         fillArcSegIn(true,true);
5350 25 May 10 nicklas 1742         if(y!=0)
5350 25 May 10 nicklas 1743         {
5350 25 May 10 nicklas 1744           divX1=xc-x;
5350 25 May 10 nicklas 1745           fillArcSegIn(false,true);
5350 25 May 10 nicklas 1746         }
5350 25 May 10 nicklas 1747       }
5350 25 May 10 nicklas 1748
5350 25 May 10 nicklas 1749       //Left and Right portion of the ellipse ellipse constutuing the arc.
5350 25 May 10 nicklas 1750       while(y!=0)  
5350 25 May 10 nicklas 1751       {
5350 25 May 10 nicklas 1752         y--;   
5350 25 May 10 nicklas 1753         if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 1754            x++;
5350 25 May 10 nicklas 1755      
5350 25 May 10 nicklas 1756         divY1=yc+y;
5350 25 May 10 nicklas 1757         divY2=yc-y;
5350 25 May 10 nicklas 1758         divWidthOrg=2*x+1;
5350 25 May 10 nicklas 1759         divWidth1=divWidthOrg;
5350 25 May 10 nicklas 1760         divWidth2=divWidthOrg;
5350 25 May 10 nicklas 1761         divWidth3=divWidthOrg;
5350 25 May 10 nicklas 1762         divWidth4=divWidthOrg;
5350 25 May 10 nicklas 1763         divX1=xc-x;
5350 25 May 10 nicklas 1764       
5350 25 May 10 nicklas 1765         if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 1766         {
5350 25 May 10 nicklas 1767           fillArcSegIn(true);
5350 25 May 10 nicklas 1768           if(eaD<=saD)
5350 25 May 10 nicklas 1769           fillArcSegIn(false);
5350 25 May 10 nicklas 1770         }        
5350 25 May 10 nicklas 1771         else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 1772         {
5350 25 May 10 nicklas 1773           if(y!=0)
5350 25 May 10 nicklas 1774             fillArcSegIn(false);
5350 25 May 10 nicklas 1775           if(eaD<=saD)
5350 25 May 10 nicklas 1776             fillArcSegIn(true);
5350 25 May 10 nicklas 1777         }
5350 25 May 10 nicklas 1778         else
5350 25 May 10 nicklas 1779         {
5350 25 May 10 nicklas 1780           fillArcSegIn(true);
5350 25 May 10 nicklas 1781           if(y!=0)
5350 25 May 10 nicklas 1782           {
5350 25 May 10 nicklas 1783             divX1=xc-x;
5350 25 May 10 nicklas 1784             fillArcSegIn(false);
5350 25 May 10 nicklas 1785           }  
5350 25 May 10 nicklas 1786         }
5350 25 May 10 nicklas 1787        }
5350 25 May 10 nicklas 1788        
5350 25 May 10 nicklas 1789        arcDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 1790        return arcDiv;
5350 25 May 10 nicklas 1791
5350 25 May 10 nicklas 1792       //Internal function: Arc segment for left and right portion of the ellipse constutuing the arc.
5350 25 May 10 nicklas 1793       function fillArcSegIn(isUpperHalf,valueOnly)
5350 25 May 10 nicklas 1794       {
5350 25 May 10 nicklas 1795         var divY;
5350 25 May 10 nicklas 1796         var xDataArray1,xDataArray1;
5350 25 May 10 nicklas 1797         var divWidthFirst=divWidthOrg;
5350 25 May 10 nicklas 1798         var divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 1799         var drawFirst=false;
5350 25 May 10 nicklas 1800         var drawSecond=false;
5350 25 May 10 nicklas 1801         
7419 03 Nov 17 nicklas 1802         var xDataArray1, xDataArray2;
7419 03 Nov 17 nicklas 1803         var saDvar, eaDvar;
5350 25 May 10 nicklas 1804         if(isUpperHalf)
5350 25 May 10 nicklas 1805         {
5350 25 May 10 nicklas 1806           var draw1=false; //upper half (in all comments upper & lower are in context of cartecian system)
5350 25 May 10 nicklas 1807           var draw3=false; //upper half second
5350 25 May 10 nicklas 1808           divY=divY1;
5350 25 May 10 nicklas 1809           xDataArray1=xDataArraySa;
5350 25 May 10 nicklas 1810           xDataArray2=xDataArrayEa;
5350 25 May 10 nicklas 1811           saDvar=saD;
5350 25 May 10 nicklas 1812           eaDvar=eaD;
5350 25 May 10 nicklas 1813         }
5350 25 May 10 nicklas 1814         else
5350 25 May 10 nicklas 1815         {
5350 25 May 10 nicklas 1816           var draw2=false; //lower half
5350 25 May 10 nicklas 1817           var draw4=false; //lower half second
5350 25 May 10 nicklas 1818           divY=divY2;
5350 25 May 10 nicklas 1819           xDataArray2=xDataArraySa;
5350 25 May 10 nicklas 1820           xDataArray1=xDataArrayEa;
5350 25 May 10 nicklas 1821           saDvar=360-eaD;
5350 25 May 10 nicklas 1822           eaDvar=360-saD;
5350 25 May 10 nicklas 1823         }
5350 25 May 10 nicklas 1824         if(eaDvar>saDvar)
5350 25 May 10 nicklas 1825         {
5350 25 May 10 nicklas 1826           if(xDataArray2[divY] && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 1827           {
5350 25 May 10 nicklas 1828             eaX=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 1829             if(xDataArray1[divY] && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 1830             {
5350 25 May 10 nicklas 1831               saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 1832               divWidthFirst=saX-eaX;
5350 25 May 10 nicklas 1833             }
5350 25 May 10 nicklas 1834             else
5350 25 May 10 nicklas 1835             {
5350 25 May 10 nicklas 1836               divWidthFirst=divX1+divWidthOrg-eaX;
5350 25 May 10 nicklas 1837             }
5350 25 May 10 nicklas 1838             divX1=eaX;
5350 25 May 10 nicklas 1839             drawFirst=true;
5350 25 May 10 nicklas 1840           }
5350 25 May 10 nicklas 1841           else if(xDataArray1[divY] && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 1842           {
5350 25 May 10 nicklas 1843             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 1844             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 1845             drawFirst=true;
5350 25 May 10 nicklas 1846           }
5350 25 May 10 nicklas 1847           else if(eaDvar>90 && saDvar<90)
5350 25 May 10 nicklas 1848           {
5350 25 May 10 nicklas 1849             drawFirst=true;
5350 25 May 10 nicklas 1850           }
5350 25 May 10 nicklas 1851         }
5350 25 May 10 nicklas 1852         else //saDvar>=eaDvar
5350 25 May 10 nicklas 1853         {
5350 25 May 10 nicklas 1854           if(xDataArray1[divY] && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 1855           {
5350 25 May 10 nicklas 1856             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 1857             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 1858             drawFirst=true;
5350 25 May 10 nicklas 1859           }
5350 25 May 10 nicklas 1860           else if(eaDvar<90 && saDvar<90)
5350 25 May 10 nicklas 1861           {
5350 25 May 10 nicklas 1862             drawFirst=true;
5350 25 May 10 nicklas 1863           }
5350 25 May 10 nicklas 1864       
5350 25 May 10 nicklas 1865           if(xDataArray2[divY] && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 1866           {
5350 25 May 10 nicklas 1867             divX2=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 1868             divWidthSecond=divWidthOrg-xDataArray2[divY].xMin+divX1;
5350 25 May 10 nicklas 1869             drawSecond=true;
5350 25 May 10 nicklas 1870           }
5350 25 May 10 nicklas 1871           else if(eaDvar>90 && saDvar>90)
5350 25 May 10 nicklas 1872           {
5350 25 May 10 nicklas 1873             divX2=divX1;
5350 25 May 10 nicklas 1874             divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 1875             drawSecond=true;
5350 25 May 10 nicklas 1876           }
5350 25 May 10 nicklas 1877         }
5350 25 May 10 nicklas 1878         
5350 25 May 10 nicklas 1879         if(isUpperHalf)
5350 25 May 10 nicklas 1880         {
5350 25 May 10 nicklas 1881           if(drawFirst)
5350 25 May 10 nicklas 1882             draw1=true;
5350 25 May 10 nicklas 1883           
5350 25 May 10 nicklas 1884           if(drawSecond)
5350 25 May 10 nicklas 1885             draw3=true;
5350 25 May 10 nicklas 1886             
5350 25 May 10 nicklas 1887           divWidth1=divWidthFirst;
5350 25 May 10 nicklas 1888           divWidth3=divWidthSecond;  
5350 25 May 10 nicklas 1889         }
5350 25 May 10 nicklas 1890         else
5350 25 May 10 nicklas 1891         {
5350 25 May 10 nicklas 1892           if(drawFirst)
5350 25 May 10 nicklas 1893             draw2=true;
5350 25 May 10 nicklas 1894           
5350 25 May 10 nicklas 1895           if(drawSecond)
5350 25 May 10 nicklas 1896             draw4=true;
5350 25 May 10 nicklas 1897             
5350 25 May 10 nicklas 1898           divWidth2=divWidthFirst;
5350 25 May 10 nicklas 1899           divWidth4=divWidthSecond;  
5350 25 May 10 nicklas 1900         }
5350 25 May 10 nicklas 1901         
5350 25 May 10 nicklas 1902         if(saD>=0 && saD<180 && eaD>=0 && eaD<180 && saD>eaD)
5350 25 May 10 nicklas 1903         {
5350 25 May 10 nicklas 1904           draw2=true;
5350 25 May 10 nicklas 1905         }        
5350 25 May 10 nicklas 1906         else if(saD>=180 && saD<360 && eaD>=180 && eaD<360 && saD>eaD)
5350 25 May 10 nicklas 1907         {
5350 25 May 10 nicklas 1908           draw1=true;
5350 25 May 10 nicklas 1909         }
5350 25 May 10 nicklas 1910         
5350 25 May 10 nicklas 1911         if(!divX2)
5350 25 May 10 nicklas 1912         divX2="";
5350 25 May 10 nicklas 1913         if(!divX1)
5350 25 May 10 nicklas 1914         divX1="";
5350 25 May 10 nicklas 1915         
5350 25 May 10 nicklas 1916         if(!valueOnly)
5350 25 May 10 nicklas 1917         {
5350 25 May 10 nicklas 1918           if(isUpperHalf)
5350 25 May 10 nicklas 1919           {
5350 25 May 10 nicklas 1920             if(x!=xpU || divX1pU!=divX1 || divX2pU!=divX2 || divWidth1!=divWidth1p || divWidth3!=divWidth3p)
5350 25 May 10 nicklas 1921             {
5350 25 May 10 nicklas 1922               divHeight=ypU-y;
5350 25 May 10 nicklas 1923               if(draw3p)
5350 25 May 10 nicklas 1924               {
5350 25 May 10 nicklas 1925                 if(divX2pU!=null)
5350 25 May 10 nicklas 1926                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pU + "px;top:" + (divY1+1) + "px;width:" + divWidth3p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1927               }
5350 25 May 10 nicklas 1928               if(draw1p)
5350 25 May 10 nicklas 1929               {
5350 25 May 10 nicklas 1930                 if(divX1pU!=null)
5350 25 May 10 nicklas 1931                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pU + "px;top:" + (divY1+1) + "px;width:" + divWidth1p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1932               }
5350 25 May 10 nicklas 1933               
5350 25 May 10 nicklas 1934               if(draw1p||draw3p)  
5350 25 May 10 nicklas 1935               {
5350 25 May 10 nicklas 1936                 divX1pU=divX1;
5350 25 May 10 nicklas 1937               
5350 25 May 10 nicklas 1938                 draw1p=draw1;
5350 25 May 10 nicklas 1939                 draw3p=draw3;
5350 25 May 10 nicklas 1940                 xpU=x;
5350 25 May 10 nicklas 1941                 ypU=y;
5350 25 May 10 nicklas 1942               
5350 25 May 10 nicklas 1943                 divWidth1p=divWidth1;
5350 25 May 10 nicklas 1944                 divWidth3p=divWidth3;
5350 25 May 10 nicklas 1945                 divX2pU=divX2;
5350 25 May 10 nicklas 1946               }
5350 25 May 10 nicklas 1947             }
5350 25 May 10 nicklas 1948           }  
5350 25 May 10 nicklas 1949           else
5350 25 May 10 nicklas 1950           {
5350 25 May 10 nicklas 1951             if(x!=xpD || divX1pD!=divX1 || divX2pD!=divX2 || divWidth2!=divWidth2p || divWidth4!=divWidth4p)
5350 25 May 10 nicklas 1952             {
5350 25 May 10 nicklas 1953               divHeight=ypD-y;
5350 25 May 10 nicklas 1954               if(draw4p)
5350 25 May 10 nicklas 1955               {
5350 25 May 10 nicklas 1956                 if(divX2pD!=null)
5350 25 May 10 nicklas 1957                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pD + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth4p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1958               }
5350 25 May 10 nicklas 1959               if(draw2p)
5350 25 May 10 nicklas 1960               {
5350 25 May 10 nicklas 1961                 if(divX1pD!=null) 
5350 25 May 10 nicklas 1962                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pD + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth2p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 1963               }
5350 25 May 10 nicklas 1964               if(draw2p||draw4p)
5350 25 May 10 nicklas 1965               {
5350 25 May 10 nicklas 1966                 divX1pD=divX1;
5350 25 May 10 nicklas 1967               
5350 25 May 10 nicklas 1968                 draw2p=draw2;
5350 25 May 10 nicklas 1969                 draw4p=draw4;
5350 25 May 10 nicklas 1970
5350 25 May 10 nicklas 1971                 xpD=x;
5350 25 May 10 nicklas 1972                 ypD=y;
5350 25 May 10 nicklas 1973               
5350 25 May 10 nicklas 1974                 divWidth2p=divWidth2;
5350 25 May 10 nicklas 1975                 divWidth4p=divWidth4;
5350 25 May 10 nicklas 1976                 divX2pD=divX2;
5350 25 May 10 nicklas 1977               }
5350 25 May 10 nicklas 1978             }
5350 25 May 10 nicklas 1979           }      
5350 25 May 10 nicklas 1980         }
5350 25 May 10 nicklas 1981         
5350 25 May 10 nicklas 1982         //To get only values; used for first y value before loop. 
5350 25 May 10 nicklas 1983         if(valueOnly)
5350 25 May 10 nicklas 1984         {
5350 25 May 10 nicklas 1985           if(isUpperHalf)
5350 25 May 10 nicklas 1986           {
5350 25 May 10 nicklas 1987             draw1p=draw1;
5350 25 May 10 nicklas 1988             draw3p=draw3;
5350 25 May 10 nicklas 1989             
5350 25 May 10 nicklas 1990             if(draw1p)
5350 25 May 10 nicklas 1991             divX1pU=divX1;
5350 25 May 10 nicklas 1992             
5350 25 May 10 nicklas 1993             if(draw3p)
5350 25 May 10 nicklas 1994             divX2pU=divX2;
5350 25 May 10 nicklas 1995             
5350 25 May 10 nicklas 1996             if(draw1p||draw3p)
5350 25 May 10 nicklas 1997             {
5350 25 May 10 nicklas 1998                 ypU=y;
5350 25 May 10 nicklas 1999                 xpU=x;
5350 25 May 10 nicklas 2000             }
5350 25 May 10 nicklas 2001             else
5350 25 May 10 nicklas 2002             {
5350 25 May 10 nicklas 2003                 ypU=0;
5350 25 May 10 nicklas 2004                 xpU=0;
5350 25 May 10 nicklas 2005             }
5350 25 May 10 nicklas 2006             
5350 25 May 10 nicklas 2007             divWidth1p=divWidth1;
5350 25 May 10 nicklas 2008             divWidth3p=divWidth3;
5350 25 May 10 nicklas 2009           }
5350 25 May 10 nicklas 2010           else
5350 25 May 10 nicklas 2011           {
5350 25 May 10 nicklas 2012             draw2p=draw2;
5350 25 May 10 nicklas 2013             draw4p=draw4;
5350 25 May 10 nicklas 2014
5350 25 May 10 nicklas 2015             if(draw2p)
5350 25 May 10 nicklas 2016             divX1pD=divX1;
5350 25 May 10 nicklas 2017             
5350 25 May 10 nicklas 2018             if(draw4p)
5350 25 May 10 nicklas 2019             divX2pD=divX2;
5350 25 May 10 nicklas 2020             
5350 25 May 10 nicklas 2021             if(draw2p||draw4p)
5350 25 May 10 nicklas 2022             {
5350 25 May 10 nicklas 2023                 ypD=y;
5350 25 May 10 nicklas 2024                 xpD=x;
5350 25 May 10 nicklas 2025             }
5350 25 May 10 nicklas 2026             else
5350 25 May 10 nicklas 2027             {
5350 25 May 10 nicklas 2028                 ypD=0;
5350 25 May 10 nicklas 2029                 xpD=0;
5350 25 May 10 nicklas 2030             }
5350 25 May 10 nicklas 2031             
5350 25 May 10 nicklas 2032             divWidth2p=divWidth2;
5350 25 May 10 nicklas 2033             divWidth4p=divWidth4;
5350 25 May 10 nicklas 2034           }
5350 25 May 10 nicklas 2035         }
5350 25 May 10 nicklas 2036         
5350 25 May 10 nicklas 2037         if(!isUpperHalf)
5350 25 May 10 nicklas 2038         {
5350 25 May 10 nicklas 2039           draw2p=draw2;
5350 25 May 10 nicklas 2040           draw4p=draw4;
5350 25 May 10 nicklas 2041         }
5350 25 May 10 nicklas 2042         else
5350 25 May 10 nicklas 2043         {
5350 25 May 10 nicklas 2044           draw1p=draw1;
5350 25 May 10 nicklas 2045           draw3p=draw3;
5350 25 May 10 nicklas 2046         }
5350 25 May 10 nicklas 2047         
5350 25 May 10 nicklas 2048         if(y==1 && !isUpperHalf)
5350 25 May 10 nicklas 2049         {
5350 25 May 10 nicklas 2050           divHeight=ypD-y+1;
5350 25 May 10 nicklas 2051           if(draw4)
5350 25 May 10 nicklas 2052           {
5350 25 May 10 nicklas 2053             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2054           }
5350 25 May 10 nicklas 2055           if(draw2)
5350 25 May 10 nicklas 2056           {
5350 25 May 10 nicklas 2057             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2058           }
5350 25 May 10 nicklas 2059         }
5350 25 May 10 nicklas 2060         if(y==0 && isUpperHalf)
5350 25 May 10 nicklas 2061         {  
5350 25 May 10 nicklas 2062           divHeight=ypU-y+1;
5350 25 May 10 nicklas 2063           if(draw3)
5350 25 May 10 nicklas 2064           {
5350 25 May 10 nicklas 2065             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + (divY1) + "px;width:" + divWidth3 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2066           }
5350 25 May 10 nicklas 2067           if(draw1)
5350 25 May 10 nicklas 2068           {
5350 25 May 10 nicklas 2069             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + (divY1) + "px;width:" + divWidth1 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2070           }
5350 25 May 10 nicklas 2071         }    
5350 25 May 10 nicklas 2072       }
5350 25 May 10 nicklas 2073       
5350 25 May 10 nicklas 2074       //Internal function: Arc segment for upper and lower portion of the ellipse constutuing the arc.
5350 25 May 10 nicklas 2075       function fillArcSegOut(isUpperHalf)
5350 25 May 10 nicklas 2076       {
5350 25 May 10 nicklas 2077         var divY;
5350 25 May 10 nicklas 2078         var xDataArray1,xDataArray1;
5350 25 May 10 nicklas 2079         var divWidthFirst=divWidthOrg;
5350 25 May 10 nicklas 2080         var divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 2081         var drawFirst=false;
5350 25 May 10 nicklas 2082         var drawSecond=false;
7419 03 Nov 17 nicklas 2083         var xDataArray1, xDataArray2;
7419 03 Nov 17 nicklas 2084         var saDvar, eaDvar;
5350 25 May 10 nicklas 2085         if(isUpperHalf)
5350 25 May 10 nicklas 2086         {
5350 25 May 10 nicklas 2087           var draw1=false; //upper half
5350 25 May 10 nicklas 2088           var draw3=false; //upper half second
5350 25 May 10 nicklas 2089           divY=divY1;
5350 25 May 10 nicklas 2090           xDataArray1=xDataArraySa;
5350 25 May 10 nicklas 2091           xDataArray2=xDataArrayEa;
5350 25 May 10 nicklas 2092           saDvar=saD;
5350 25 May 10 nicklas 2093           eaDvar=eaD;
5350 25 May 10 nicklas 2094         }
5350 25 May 10 nicklas 2095         else
5350 25 May 10 nicklas 2096         {
5350 25 May 10 nicklas 2097           var draw2=false; //lower half
5350 25 May 10 nicklas 2098           var draw4=false; //lower half second
5350 25 May 10 nicklas 2099           divY=divY2;
5350 25 May 10 nicklas 2100           xDataArray2=xDataArraySa;
5350 25 May 10 nicklas 2101           xDataArray1=xDataArrayEa;
5350 25 May 10 nicklas 2102           saDvar=360-eaD;
5350 25 May 10 nicklas 2103           eaDvar=360-saD;
5350 25 May 10 nicklas 2104         }
5350 25 May 10 nicklas 2105         if(eaDvar>saDvar)
5350 25 May 10 nicklas 2106         {
5350 25 May 10 nicklas 2107           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 2108           {
5350 25 May 10 nicklas 2109             eaX=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 2110             if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2111             {
5350 25 May 10 nicklas 2112               saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2113               divWidthFirst=saX-eaX;
5350 25 May 10 nicklas 2114             }
5350 25 May 10 nicklas 2115             else
5350 25 May 10 nicklas 2116             {
5350 25 May 10 nicklas 2117               divWidthFirst=divX1+divWidthOrg-eaX;
5350 25 May 10 nicklas 2118             }
5350 25 May 10 nicklas 2119             divX1=eaX;
5350 25 May 10 nicklas 2120             drawFirst=true;
5350 25 May 10 nicklas 2121           }
5350 25 May 10 nicklas 2122           else if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2123           {
5350 25 May 10 nicklas 2124             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2125             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 2126             drawFirst=true;
5350 25 May 10 nicklas 2127           }
5350 25 May 10 nicklas 2128           else if(eaDvar>90 && saDvar<90)
5350 25 May 10 nicklas 2129           {
5350 25 May 10 nicklas 2130             drawFirst=true;
5350 25 May 10 nicklas 2131           }
5350 25 May 10 nicklas 2132         }
5350 25 May 10 nicklas 2133         else //saDvar>eaDvar
5350 25 May 10 nicklas 2134         {
5350 25 May 10 nicklas 2135           if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2136           {
5350 25 May 10 nicklas 2137             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2138             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 2139             drawFirst=true;
5350 25 May 10 nicklas 2140           }
5350 25 May 10 nicklas 2141           else if(eaDvar<90 && saDvar<90)
5350 25 May 10 nicklas 2142           {
5350 25 May 10 nicklas 2143             drawFirst=true;
5350 25 May 10 nicklas 2144           }
5350 25 May 10 nicklas 2145       
5350 25 May 10 nicklas 2146           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 2147           {
5350 25 May 10 nicklas 2148             divX2=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 2149             divWidthSecond=divWidthOrg-xDataArray2[divY].xMin+divX1;
5350 25 May 10 nicklas 2150             drawSecond=true;
5350 25 May 10 nicklas 2151           }
5350 25 May 10 nicklas 2152           else if(eaDvar>90 && saDvar>90)
5350 25 May 10 nicklas 2153           {
5350 25 May 10 nicklas 2154             divX2=divX1;
5350 25 May 10 nicklas 2155             divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 2156             drawSecond=true;
5350 25 May 10 nicklas 2157           }
5350 25 May 10 nicklas 2158         }
5350 25 May 10 nicklas 2159         
5350 25 May 10 nicklas 2160         if(isUpperHalf)
5350 25 May 10 nicklas 2161         {
5350 25 May 10 nicklas 2162           if(drawFirst)
5350 25 May 10 nicklas 2163             draw1=true;
5350 25 May 10 nicklas 2164           
5350 25 May 10 nicklas 2165           if(drawSecond)
5350 25 May 10 nicklas 2166             draw3=true;
5350 25 May 10 nicklas 2167             
5350 25 May 10 nicklas 2168           divWidth1=divWidthFirst;
5350 25 May 10 nicklas 2169           divWidth3=divWidthSecond;  
5350 25 May 10 nicklas 2170         }
5350 25 May 10 nicklas 2171         else
5350 25 May 10 nicklas 2172         {
5350 25 May 10 nicklas 2173           if(drawFirst)
5350 25 May 10 nicklas 2174             draw2=true;
5350 25 May 10 nicklas 2175           
5350 25 May 10 nicklas 2176           if(drawSecond)
5350 25 May 10 nicklas 2177             draw4=true;
5350 25 May 10 nicklas 2178             
5350 25 May 10 nicklas 2179           divWidth2=divWidthFirst;
5350 25 May 10 nicklas 2180           divWidth4=divWidthSecond;  
5350 25 May 10 nicklas 2181         }
5350 25 May 10 nicklas 2182         
5350 25 May 10 nicklas 2183         if(saD>=0 && saD<180 && eaD>=0 && eaD<180 && saD>eaD)
5350 25 May 10 nicklas 2184         {
5350 25 May 10 nicklas 2185           draw2=true;
5350 25 May 10 nicklas 2186         }        
5350 25 May 10 nicklas 2187         else if(saD>=180 && saD<360 && eaD>=180 && eaD<360 && saD>eaD)
5350 25 May 10 nicklas 2188         {
5350 25 May 10 nicklas 2189           draw1=true;
5350 25 May 10 nicklas 2190         }
5350 25 May 10 nicklas 2191         
5350 25 May 10 nicklas 2192         if(divX2==null)
5350 25 May 10 nicklas 2193         divX2="X";
5350 25 May 10 nicklas 2194         if(divX1==null)
5350 25 May 10 nicklas 2195         divX1="X";
5350 25 May 10 nicklas 2196         
5350 25 May 10 nicklas 2197         if(isUpperHalf)
5350 25 May 10 nicklas 2198         {
5350 25 May 10 nicklas 2199           divHeight=1;
5350 25 May 10 nicklas 2200           if(draw3)
5350 25 May 10 nicklas 2201           {
5350 25 May 10 nicklas 2202             if(divX2!="X")
5350 25 May 10 nicklas 2203               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + divY1 + "px;width:" + divWidth3 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2204           }
5350 25 May 10 nicklas 2205           if(draw1)
5350 25 May 10 nicklas 2206           {
5350 25 May 10 nicklas 2207             if(divX1!="X")
5350 25 May 10 nicklas 2208               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + divY1 + "px;width:" + divWidth1 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2209           }
5350 25 May 10 nicklas 2210         }  
5350 25 May 10 nicklas 2211         else
5350 25 May 10 nicklas 2212         {
5350 25 May 10 nicklas 2213           divHeight=1;
5350 25 May 10 nicklas 2214           if(draw4)
5350 25 May 10 nicklas 2215           {
5350 25 May 10 nicklas 2216             if(divX2!="X")
5350 25 May 10 nicklas 2217                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2218           }
5350 25 May 10 nicklas 2219           if(draw2)
5350 25 May 10 nicklas 2220           {
5350 25 May 10 nicklas 2221             if(divX1!="X") 
5350 25 May 10 nicklas 2222               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2223           }
5350 25 May 10 nicklas 2224         }      
5350 25 May 10 nicklas 2225       }
5350 25 May 10 nicklas 2226     }
5350 25 May 10 nicklas 2227
5350 25 May 10 nicklas 2228     //Draw arc with specified center, width, height, start angle and swap angle. 
5350 25 May 10 nicklas 2229     function drawArc(pen,center,width,height,startAngle,swapAngle)
5350 25 May 10 nicklas 2230     {
5350 25 May 10 nicklas 2231       //Check arguments for null values
5350 25 May 10 nicklas 2232       if(!pen || !center || !width || !height || startAngle==null || swapAngle==null)
5350 25 May 10 nicklas 2233         return false;
5350 25 May 10 nicklas 2234
5350 25 May 10 nicklas 2235       width*=scale;
5350 25 May 10 nicklas 2236       height*=scale;
5350 25 May 10 nicklas 2237        
5350 25 May 10 nicklas 2238         if(swapAngle==0)
5350 25 May 10 nicklas 2239         return;
5350 25 May 10 nicklas 2240
5350 25 May 10 nicklas 2241         var arcDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 2242         var iHtml=new Array();
5350 25 May 10 nicklas 2243         
7419 03 Nov 17 nicklas 2244         var phCenter=logicalToPhysicalPoint(center);
5350 25 May 10 nicklas 2245
5350 25 May 10 nicklas 2246       var saD; //arc start angle degrees.
5350 25 May 10 nicklas 2247       if(startAngle>360)
5350 25 May 10 nicklas 2248           saD=startAngle%360;
5350 25 May 10 nicklas 2249       else
5350 25 May 10 nicklas 2250           saD=startAngle;
5350 25 May 10 nicklas 2251        
5350 25 May 10 nicklas 2252       var swD; //swap angle in degrees.
5350 25 May 10 nicklas 2253       if(swapAngle>360)
5350 25 May 10 nicklas 2254           swD=swapAngle%360;
5350 25 May 10 nicklas 2255       else
5350 25 May 10 nicklas 2256           swD=swapAngle;
5350 25 May 10 nicklas 2257       
5350 25 May 10 nicklas 2258       var eaD; //arc end angle degrees.
5350 25 May 10 nicklas 2259       eaD=parseFloat(saD)+parseFloat(swD);
5350 25 May 10 nicklas 2260       if(eaD>360)
5350 25 May 10 nicklas 2261           eaD=eaD%360; 
5350 25 May 10 nicklas 2262       
5350 25 May 10 nicklas 2263       //For cartecian coordinate system.
5350 25 May 10 nicklas 2264       if(coordinateSystem=="cartecian")    
5350 25 May 10 nicklas 2265       {
5350 25 May 10 nicklas 2266         saD=360-saD;
5350 25 May 10 nicklas 2267         eaD=360-eaD;
5350 25 May 10 nicklas 2268         var tempAD;
5350 25 May 10 nicklas 2269         tempAD=saD;
5350 25 May 10 nicklas 2270         saD=eaD;
5350 25 May 10 nicklas 2271         eaD=tempAD;
5350 25 May 10 nicklas 2272       }
5350 25 May 10 nicklas 2273       
5350 25 May 10 nicklas 2274       var x1,y1,x2,y2;
5350 25 May 10 nicklas 2275       var saR=saD*Math.PI/180;
5350 25 May 10 nicklas 2276       var swR=swD*Math.PI/180;
5350 25 May 10 nicklas 2277       var eaR=eaD*Math.PI/180;
5350 25 May 10 nicklas 2278       
5350 25 May 10 nicklas 2279       //For start angle
5350 25 May 10 nicklas 2280       if((saD<=45 && saD>=0) || (saD>=135 && saD<=225) || (saD>=315 && saD<=360))
5350 25 May 10 nicklas 2281       {
5350 25 May 10 nicklas 2282         y1=Math.round(phCenter.y+Math.sin(saR)*width/2);
5350 25 May 10 nicklas 2283         if(saD>=90 && saD<=270)
5350 25 May 10 nicklas 2284           x1=Math.round(phCenter.x-width/2);
5350 25 May 10 nicklas 2285         else
5350 25 May 10 nicklas 2286           x1=Math.round(phCenter.x+width/2);
5350 25 May 10 nicklas 2287       }
5350 25 May 10 nicklas 2288       else
5350 25 May 10 nicklas 2289       {
5350 25 May 10 nicklas 2290         x1=Math.round(phCenter.x+Math.cos(saR)*height/2);
5350 25 May 10 nicklas 2291         if(saD>=0 && saD<=180)
5350 25 May 10 nicklas 2292           y1=Math.round(phCenter.y+height/2);
5350 25 May 10 nicklas 2293         else
5350 25 May 10 nicklas 2294           y1=Math.round(phCenter.y-height/2);
5350 25 May 10 nicklas 2295       }
5350 25 May 10 nicklas 2296       
5350 25 May 10 nicklas 2297       //For end angle
5350 25 May 10 nicklas 2298       if((eaD<=45 && eaD>=0) || (eaD>=135 && eaD<=225) || (eaD>=315 && eaD<=360))
5350 25 May 10 nicklas 2299       {
5350 25 May 10 nicklas 2300         y2=Math.round(phCenter.y+Math.sin(eaR)*width/2);
5350 25 May 10 nicklas 2301         if(eaD>=90 && eaD<=270)
5350 25 May 10 nicklas 2302           x2=Math.round(phCenter.x-width/2);
5350 25 May 10 nicklas 2303         else
5350 25 May 10 nicklas 2304           x2=Math.round(phCenter.x+width/2);
5350 25 May 10 nicklas 2305       }
5350 25 May 10 nicklas 2306       else
5350 25 May 10 nicklas 2307       {
5350 25 May 10 nicklas 2308         x2=Math.round(phCenter.x+Math.cos(eaR)*height/2);
5350 25 May 10 nicklas 2309         if(eaD>=0 && eaD<=180)
5350 25 May 10 nicklas 2310           y2=Math.round(phCenter.y+height/2);
5350 25 May 10 nicklas 2311         else
5350 25 May 10 nicklas 2312           y2=Math.round(phCenter.y-height/2);
5350 25 May 10 nicklas 2313       }
5350 25 May 10 nicklas 2314       
5350 25 May 10 nicklas 2315         //Get the pixel arrays for the lines croping the ellipse to form an arc.
7419 03 Nov 17 nicklas 2316       var xDataArraySa=getLinePixels(phCenter,new jsPoint(x1,y1));
7419 03 Nov 17 nicklas 2317       var xDataArrayEa=getLinePixels(phCenter,new jsPoint(x2,y2));
5350 25 May 10 nicklas 2318       
5350 25 May 10 nicklas 2319       var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 2320
5350 25 May 10 nicklas 2321       var a=Math.round(width/2);
5350 25 May 10 nicklas 2322       var b=Math.round(height/2);
5350 25 May 10 nicklas 2323       var xc=phCenter.x;
5350 25 May 10 nicklas 2324       var yc=phCenter.y;
5350 25 May 10 nicklas 2325       
5350 25 May 10 nicklas 2326       var x=0;
5350 25 May 10 nicklas 2327       var y=b;
5350 25 May 10 nicklas 2328       var a2=a*a;
5350 25 May 10 nicklas 2329       var b2=b*b;
5350 25 May 10 nicklas 2330       
5350 25 May 10 nicklas 2331       var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 2332       
5350 25 May 10 nicklas 2333         //For Inner Ellipse
5350 25 May 10 nicklas 2334       var ai=a-parseInt(pen.width)+1;
5350 25 May 10 nicklas 2335       var bi=b-parseInt(pen.width)+1;
5350 25 May 10 nicklas 2336       
5350 25 May 10 nicklas 2337       var res=getInnerEllipse(phCenter,ai*2,bi*2)
5350 25 May 10 nicklas 2338       var xArray=res[0];
5350 25 May 10 nicklas 2339       var xArrayI=res[1];
5350 25 May 10 nicklas 2340       xArray.pop();
5350 25 May 10 nicklas 2341       xArrayI.pop();
5350 25 May 10 nicklas 2342
5350 25 May 10 nicklas 2343       var xp,yp;
5350 25 May 10 nicklas 2344       var divX1,divX1pU,divX1pD,divX2,divX2pU,divX2pD,divY1,divY2,saX,eaX,saXp,eaXp,xpU,xpD,ypU,ypD,divX1i,divX2i,divX1pUi,divX1pDi,divX2pUi,divX2pDi;
5350 25 May 10 nicklas 2345       var divWidthOrg,divWidth1,divWidth2,divWidth3,divWidth4,divWidth1p,divWidth2p,divWidth3p,divWidth4p,divHeight,divWidth1i,divWidth2i,divWidth3i,divWidth4i,divWidth1pi,divWidth2pi,divWidth3pi,divWidth4pi;
5350 25 May 10 nicklas 2346       var draw1p,draw2p,draw3p,draw4p;
5350 25 May 10 nicklas 2347       
5350 25 May 10 nicklas 2348       xp=1;
5350 25 May 10 nicklas 2349       yp=y;
5350 25 May 10 nicklas 2350       
5350 25 May 10 nicklas 2351       //Upper and lower portion of the ellipse constutuing the arc
5350 25 May 10 nicklas 2352        while(b2*x < a2*y)
5350 25 May 10 nicklas 2353         {     
5350 25 May 10 nicklas 2354           x++;    
5350 25 May 10 nicklas 2355          if((b2*x*x + a2*(y-0.5)*(y-0.5) - a2*b2) >=0)  
5350 25 May 10 nicklas 2356            y--;    
5350 25 May 10 nicklas 2357            
5350 25 May 10 nicklas 2358             if(x==1 && y!=yp) //Topmost and bottom most points, to be tested
5350 25 May 10 nicklas 2359             {
5350 25 May 10 nicklas 2360               divY1=yc+yp-1;
5350 25 May 10 nicklas 2361           divY2=yc-yp;
5350 25 May 10 nicklas 2362           divWidthOrg=1;
5350 25 May 10 nicklas 2363           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 2364           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 2365           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 2366           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 2367           divX1=xc;
5350 25 May 10 nicklas 2368           
5350 25 May 10 nicklas 2369           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 2370           {
5350 25 May 10 nicklas 2371             drawArcSegOut(true);
5350 25 May 10 nicklas 2372             if(eaD<=saD)
5350 25 May 10 nicklas 2373             drawArcSegOut(false);
5350 25 May 10 nicklas 2374           }
5350 25 May 10 nicklas 2375           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 2376           {
5350 25 May 10 nicklas 2377             drawArcSegOut(false);
5350 25 May 10 nicklas 2378             if(eaD<=saD)
5350 25 May 10 nicklas 2379             drawArcSegOut(true);
5350 25 May 10 nicklas 2380           }
5350 25 May 10 nicklas 2381           else
5350 25 May 10 nicklas 2382           {
5350 25 May 10 nicklas 2383             drawArcSegOut(true);
5350 25 May 10 nicklas 2384             drawArcSegOut(false);
5350 25 May 10 nicklas 2385           }
5350 25 May 10 nicklas 2386             }
5350 25 May 10 nicklas 2387         else if(y!=yp)
5350 25 May 10 nicklas 2388         {
5350 25 May 10 nicklas 2389           divY1=yc+yp;
5350 25 May 10 nicklas 2390           divY2=yc-yp;
5350 25 May 10 nicklas 2391           divWidthOrg=2*(x-1)+1;
5350 25 May 10 nicklas 2392           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 2393           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 2394           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 2395           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 2396           divX1=xc-x+1;
5350 25 May 10 nicklas 2397           
5350 25 May 10 nicklas 2398           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 2399           {
5350 25 May 10 nicklas 2400             drawArcSegOut(true);
5350 25 May 10 nicklas 2401             if(eaD<=saD)
5350 25 May 10 nicklas 2402             drawArcSegOut(false);
5350 25 May 10 nicklas 2403           }
5350 25 May 10 nicklas 2404           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 2405           {
5350 25 May 10 nicklas 2406             drawArcSegOut(false);
5350 25 May 10 nicklas 2407             if(eaD<=saD)
5350 25 May 10 nicklas 2408             drawArcSegOut(true);
5350 25 May 10 nicklas 2409           }
5350 25 May 10 nicklas 2410           else
5350 25 May 10 nicklas 2411           {
5350 25 May 10 nicklas 2412             drawArcSegOut(true);
5350 25 May 10 nicklas 2413             drawArcSegOut(false);
5350 25 May 10 nicklas 2414           }  
5350 25 May 10 nicklas 2415           
5350 25 May 10 nicklas 2416           yp=y;
5350 25 May 10 nicklas 2417           xp=x;
5350 25 May 10 nicklas 2418         }
5350 25 May 10 nicklas 2419             
5350 25 May 10 nicklas 2420         
5350 25 May 10 nicklas 2421         //Last step in loop
5350 25 May 10 nicklas 2422         if(b2*x >= a2*y)
5350 25 May 10 nicklas 2423         {
5350 25 May 10 nicklas 2424           divY1=yc+yp;
5350 25 May 10 nicklas 2425           divY2=yc-yp;
5350 25 May 10 nicklas 2426           divWidthOrg=2*x+1;
5350 25 May 10 nicklas 2427           divWidth1=divWidthOrg;
5350 25 May 10 nicklas 2428           divWidth2=divWidthOrg;
5350 25 May 10 nicklas 2429           divWidth3=divWidthOrg;
5350 25 May 10 nicklas 2430           divWidth4=divWidthOrg;
5350 25 May 10 nicklas 2431           divX1=xc-x;
5350 25 May 10 nicklas 2432           
5350 25 May 10 nicklas 2433           if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 2434           {
5350 25 May 10 nicklas 2435             drawArcSegOut(true);
5350 25 May 10 nicklas 2436             if(eaD<=saD)
5350 25 May 10 nicklas 2437             drawArcSegOut(false);
5350 25 May 10 nicklas 2438           }
5350 25 May 10 nicklas 2439           else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 2440           {
5350 25 May 10 nicklas 2441             drawArcSegOut(false);
5350 25 May 10 nicklas 2442             if(eaD<=saD)
5350 25 May 10 nicklas 2443             drawArcSegOut(true);
5350 25 May 10 nicklas 2444           }
5350 25 May 10 nicklas 2445           else
5350 25 May 10 nicklas 2446           {
5350 25 May 10 nicklas 2447             drawArcSegOut(true);
5350 25 May 10 nicklas 2448             drawArcSegOut(false);
5350 25 May 10 nicklas 2449           }
5350 25 May 10 nicklas 2450         }
5350 25 May 10 nicklas 2451       }
5350 25 May 10 nicklas 2452         
5350 25 May 10 nicklas 2453         xp=x;
5350 25 May 10 nicklas 2454       yp=y;
5350 25 May 10 nicklas 2455       divHeight=1;
5350 25 May 10 nicklas 2456
5350 25 May 10 nicklas 2457       //Similar code as in next while loop for first y before the loop. Only values are retrieved and no drawing.
5350 25 May 10 nicklas 2458                
5350 25 May 10 nicklas 2459       divY1=yc+y;
5350 25 May 10 nicklas 2460       divY2=yc-y;
5350 25 May 10 nicklas 2461       divWidthOrg=2*x+1;
5350 25 May 10 nicklas 2462       divWidth1=divWidthOrg;
5350 25 May 10 nicklas 2463       divWidth2=divWidthOrg;
5350 25 May 10 nicklas 2464       divWidth3=divWidthOrg;
5350 25 May 10 nicklas 2465       divWidth4=divWidthOrg;
5350 25 May 10 nicklas 2466       divX1=xc-x;
5350 25 May 10 nicklas 2467       
5350 25 May 10 nicklas 2468       if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 2469       {
5350 25 May 10 nicklas 2470         xDataArrayEa.pop();        
5350 25 May 10 nicklas 2471         drawArcSegIn(true,true);
5350 25 May 10 nicklas 2472         if(eaD<=saD)
5350 25 May 10 nicklas 2473         drawArcSegIn(false,true);
5350 25 May 10 nicklas 2474       }        
5350 25 May 10 nicklas 2475       else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 2476       {
5350 25 May 10 nicklas 2477         xDataArrayEa.pop();        
5350 25 May 10 nicklas 2478         if(y!=0)
5350 25 May 10 nicklas 2479           drawArcSegIn(false,true);
5350 25 May 10 nicklas 2480         if(eaD<=saD)
5350 25 May 10 nicklas 2481             drawArcSegIn(true,true);
5350 25 May 10 nicklas 2482       }
5350 25 May 10 nicklas 2483       else
5350 25 May 10 nicklas 2484       {
5350 25 May 10 nicklas 2485         if(saD>=180 && saD<360)
5350 25 May 10 nicklas 2486           xDataArraySa.pop();
5350 25 May 10 nicklas 2487         else
5350 25 May 10 nicklas 2488           xDataArrayEa.pop();
5350 25 May 10 nicklas 2489         
5350 25 May 10 nicklas 2490
5350 25 May 10 nicklas 2491         drawArcSegIn(true,true);
5350 25 May 10 nicklas 2492         if(y!=0)
5350 25 May 10 nicklas 2493         {
5350 25 May 10 nicklas 2494           divX1=xc-x;
5350 25 May 10 nicklas 2495           drawArcSegIn(false,true);
5350 25 May 10 nicklas 2496         }
5350 25 May 10 nicklas 2497       }
5350 25 May 10 nicklas 2498
5350 25 May 10 nicklas 2499       //Left and Right portion of the ellipse ellipse constutuing the arc.
5350 25 May 10 nicklas 2500       while(y!=0)  
5350 25 May 10 nicklas 2501       {
5350 25 May 10 nicklas 2502         y--;   
5350 25 May 10 nicklas 2503         if((b2*(x+0.5)*(x+0.5) + a2*y*y - a2*b2)<=0)   
5350 25 May 10 nicklas 2504            x++;
5350 25 May 10 nicklas 2505      
5350 25 May 10 nicklas 2506         divY1=yc+y;
5350 25 May 10 nicklas 2507         divY2=yc-y;
5350 25 May 10 nicklas 2508         divWidthOrg=2*x+1;
5350 25 May 10 nicklas 2509         divWidth1=divWidthOrg;
5350 25 May 10 nicklas 2510         divWidth2=divWidthOrg;
5350 25 May 10 nicklas 2511         divWidth3=divWidthOrg;
5350 25 May 10 nicklas 2512         divWidth4=divWidthOrg;
5350 25 May 10 nicklas 2513         divX1=xc-x;
5350 25 May 10 nicklas 2514       
5350 25 May 10 nicklas 2515         if(saD>=0 && saD<180 && eaD>=0 && eaD<180)
5350 25 May 10 nicklas 2516         {
5350 25 May 10 nicklas 2517           drawArcSegIn(true);
5350 25 May 10 nicklas 2518           if(eaD<=saD)
5350 25 May 10 nicklas 2519           drawArcSegIn(false);
5350 25 May 10 nicklas 2520         }        
5350 25 May 10 nicklas 2521         else if(saD>=180 && saD<360 && eaD>=180 && eaD<=360)
5350 25 May 10 nicklas 2522         {
5350 25 May 10 nicklas 2523           if(y!=0)
5350 25 May 10 nicklas 2524             drawArcSegIn(false);
5350 25 May 10 nicklas 2525           if(eaD<=saD)
5350 25 May 10 nicklas 2526             drawArcSegIn(true);
5350 25 May 10 nicklas 2527         }
5350 25 May 10 nicklas 2528         else
5350 25 May 10 nicklas 2529         {
5350 25 May 10 nicklas 2530           drawArcSegIn(true);
5350 25 May 10 nicklas 2531           if(y!=0)
5350 25 May 10 nicklas 2532           {
5350 25 May 10 nicklas 2533             divX1=xc-x;
5350 25 May 10 nicklas 2534             drawArcSegIn(false);
5350 25 May 10 nicklas 2535           }  
5350 25 May 10 nicklas 2536         }
5350 25 May 10 nicklas 2537        }
5350 25 May 10 nicklas 2538
5350 25 May 10 nicklas 2539        arcDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 2540        return arcDiv;
5350 25 May 10 nicklas 2541
5350 25 May 10 nicklas 2542         //Internal function: Arc segment for left and right portion of the ellipse constutuing the arc.
5350 25 May 10 nicklas 2543       function drawArcSegIn(isUpperHalf,valueOnly)
5350 25 May 10 nicklas 2544       {
5350 25 May 10 nicklas 2545         var divY;
5350 25 May 10 nicklas 2546         var xDataArray1,xDataArray1;
5350 25 May 10 nicklas 2547         var divWidthFirst=divWidthOrg;
5350 25 May 10 nicklas 2548         var divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 2549         var drawFirst=false;
5350 25 May 10 nicklas 2550         var drawSecond=false;
5350 25 May 10 nicklas 2551         var xIn;
5350 25 May 10 nicklas 2552         
7419 03 Nov 17 nicklas 2553         var xDataArray1, xDataArray2;
7419 03 Nov 17 nicklas 2554         var saDvar, eaDvar;
5350 25 May 10 nicklas 2555         if(isUpperHalf)
5350 25 May 10 nicklas 2556         {
5350 25 May 10 nicklas 2557           var draw1=false; //upper half
5350 25 May 10 nicklas 2558           var draw3=false; //upper half second
5350 25 May 10 nicklas 2559           divY=divY1;
5350 25 May 10 nicklas 2560           xDataArray1=xDataArraySa;
5350 25 May 10 nicklas 2561           xDataArray2=xDataArrayEa;
5350 25 May 10 nicklas 2562           saDvar=saD;
5350 25 May 10 nicklas 2563           eaDvar=eaD;
5350 25 May 10 nicklas 2564         }
5350 25 May 10 nicklas 2565         else
5350 25 May 10 nicklas 2566         {
5350 25 May 10 nicklas 2567           var draw2=false; //lower half
5350 25 May 10 nicklas 2568           var draw4=false; //lower half second
5350 25 May 10 nicklas 2569           divY=divY2;
5350 25 May 10 nicklas 2570           xDataArray2=xDataArraySa;
5350 25 May 10 nicklas 2571           xDataArray1=xDataArrayEa;
5350 25 May 10 nicklas 2572           saDvar=360-eaD;
5350 25 May 10 nicklas 2573           eaDvar=360-saD;
5350 25 May 10 nicklas 2574         }
5350 25 May 10 nicklas 2575         if(eaDvar>saDvar)
5350 25 May 10 nicklas 2576         {
5350 25 May 10 nicklas 2577           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 2578           {
5350 25 May 10 nicklas 2579             eaX=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 2580             if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2581             {
5350 25 May 10 nicklas 2582               saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2583               divWidthFirst=saX-eaX;
5350 25 May 10 nicklas 2584             }
5350 25 May 10 nicklas 2585             else
5350 25 May 10 nicklas 2586             {
5350 25 May 10 nicklas 2587               divWidthFirst=divX1+divWidthOrg-eaX;
5350 25 May 10 nicklas 2588             }
5350 25 May 10 nicklas 2589             divX1=eaX;
5350 25 May 10 nicklas 2590             drawFirst=true;
5350 25 May 10 nicklas 2591           }
5350 25 May 10 nicklas 2592           else if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2593           {
5350 25 May 10 nicklas 2594             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2595             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 2596             drawFirst=true;
5350 25 May 10 nicklas 2597           }
5350 25 May 10 nicklas 2598           else if(eaDvar>90 && saDvar<90)
5350 25 May 10 nicklas 2599           {
5350 25 May 10 nicklas 2600             drawFirst=true;
5350 25 May 10 nicklas 2601           }
5350 25 May 10 nicklas 2602         }
5350 25 May 10 nicklas 2603         else //saDvar>eaDvar
5350 25 May 10 nicklas 2604         {
5350 25 May 10 nicklas 2605           if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 2606           {
5350 25 May 10 nicklas 2607             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 2608             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 2609             drawFirst=true;
5350 25 May 10 nicklas 2610           }
5350 25 May 10 nicklas 2611           else if(eaDvar<90 && saDvar<90)
5350 25 May 10 nicklas 2612           {
5350 25 May 10 nicklas 2613             drawFirst=true;
5350 25 May 10 nicklas 2614           }
5350 25 May 10 nicklas 2615       
5350 25 May 10 nicklas 2616           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 2617           {
5350 25 May 10 nicklas 2618             divX2=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 2619             divWidthSecond=divWidthOrg-xDataArray2[divY].xMin+divX1;
5350 25 May 10 nicklas 2620             drawSecond=true;
5350 25 May 10 nicklas 2621           }
5350 25 May 10 nicklas 2622           else if(eaDvar>90 && saDvar>90)
5350 25 May 10 nicklas 2623           {
5350 25 May 10 nicklas 2624             divX2=divX1;
5350 25 May 10 nicklas 2625             divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 2626             drawSecond=true;
5350 25 May 10 nicklas 2627           }
5350 25 May 10 nicklas 2628         }
5350 25 May 10 nicklas 2629         
5350 25 May 10 nicklas 2630         if(isUpperHalf)
5350 25 May 10 nicklas 2631         {
5350 25 May 10 nicklas 2632           if(drawFirst)
5350 25 May 10 nicklas 2633             draw1=true;
5350 25 May 10 nicklas 2634           
5350 25 May 10 nicklas 2635           if(drawSecond)
5350 25 May 10 nicklas 2636             draw3=true;
5350 25 May 10 nicklas 2637             
5350 25 May 10 nicklas 2638           divWidth1=divWidthFirst;
5350 25 May 10 nicklas 2639           divWidth3=divWidthSecond;  
5350 25 May 10 nicklas 2640         }
5350 25 May 10 nicklas 2641         else
5350 25 May 10 nicklas 2642         {
5350 25 May 10 nicklas 2643           if(drawFirst)
5350 25 May 10 nicklas 2644             draw2=true;
5350 25 May 10 nicklas 2645           
5350 25 May 10 nicklas 2646           if(drawSecond)
5350 25 May 10 nicklas 2647             draw4=true;
5350 25 May 10 nicklas 2648             
5350 25 May 10 nicklas 2649           divWidth2=divWidthFirst;
5350 25 May 10 nicklas 2650           divWidth4=divWidthSecond;  
5350 25 May 10 nicklas 2651         }
5350 25 May 10 nicklas 2652         
5350 25 May 10 nicklas 2653         if(saD>=0 && saD<180 && eaD>=0 && eaD<180 && saD>eaD)
5350 25 May 10 nicklas 2654         {
5350 25 May 10 nicklas 2655           draw2=true;
5350 25 May 10 nicklas 2656         }        
5350 25 May 10 nicklas 2657         else if(saD>=180 && saD<360 && eaD>=180 && eaD<360 && saD>eaD)
5350 25 May 10 nicklas 2658         {
5350 25 May 10 nicklas 2659           draw1=true;
5350 25 May 10 nicklas 2660         }
5350 25 May 10 nicklas 2661      
5350 25 May 10 nicklas 2662             //Start: Only for drawArc (not in fillArc)        
5350 25 May 10 nicklas 2663             if(draw1)
5350 25 May 10 nicklas 2664             {
5350 25 May 10 nicklas 2665               if(xArray[divY1-yc]!=null && divX1!=null)
5350 25 May 10 nicklas 2666               {
5350 25 May 10 nicklas 2667                   if(xc+xArray[divY1-yc]<=divX1+divWidth1)
5350 25 May 10 nicklas 2668                   {
5350 25 May 10 nicklas 2669                       if(divWidth1>divX1+divWidth1-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 2670                       {
5350 25 May 10 nicklas 2671                           divX1i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 2672                           divWidth1i=divX1+divWidth1-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 2673                       }
5350 25 May 10 nicklas 2674                   }
5350 25 May 10 nicklas 2675                   else
5350 25 May 10 nicklas 2676                   divX1i=null;
5350 25 May 10 nicklas 2677                   
5350 25 May 10 nicklas 2678                   if(divX1<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2679                   {
5350 25 May 10 nicklas 2680                       if(divWidth1>xc-xArray[divY1-yc]-divX1+1)
5350 25 May 10 nicklas 2681                             divWidth1=xc-xArray[divY1-yc]-divX1+1;
5350 25 May 10 nicklas 2682                   }
5350 25 May 10 nicklas 2683                   else if(divWidth1>=divX1+divWidth1-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2684                   divX1=null;
5350 25 May 10 nicklas 2685             }
5350 25 May 10 nicklas 2686         }
5350 25 May 10 nicklas 2687             
5350 25 May 10 nicklas 2688             if(draw3)
5350 25 May 10 nicklas 2689             {
5350 25 May 10 nicklas 2690               if(xArray[divY1-yc]!=null && divX2!=null)
5350 25 May 10 nicklas 2691               {
5350 25 May 10 nicklas 2692                     if(xc+xArray[divY1-yc]<=divX2+divWidth3)
5350 25 May 10 nicklas 2693                   {
5350 25 May 10 nicklas 2694                       if(divWidth3>divX2+divWidth3-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 2695                       {
5350 25 May 10 nicklas 2696                           divX2i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 2697                           divWidth3i=divX2+divWidth3-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 2698                       }
5350 25 May 10 nicklas 2699                   }
5350 25 May 10 nicklas 2700                   else
5350 25 May 10 nicklas 2701                   divX2i=null;
5350 25 May 10 nicklas 2702                   
5350 25 May 10 nicklas 2703                   if(divX2<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2704                   {
5350 25 May 10 nicklas 2705                       if(divWidth3>xc-xArray[divY1-yc]-divX2+1)
5350 25 May 10 nicklas 2706                             divWidth3=xc-xArray[divY1-yc]-divX2+1;
5350 25 May 10 nicklas 2707                   }
5350 25 May 10 nicklas 2708                   else if(divWidth3>=divX2+divWidth3-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2709                   divX2=null;
5350 25 May 10 nicklas 2710               }
5350 25 May 10 nicklas 2711           }
5350 25 May 10 nicklas 2712
5350 25 May 10 nicklas 2713             //Lower Half    
5350 25 May 10 nicklas 2714             if(draw2)
5350 25 May 10 nicklas 2715             {
5350 25 May 10 nicklas 2716               if(xArray[divY1-yc]!=null && divX1!=null)
5350 25 May 10 nicklas 2717               {
5350 25 May 10 nicklas 2718                   if(xc+xArray[divY1-yc]<=divX1+divWidth2)
5350 25 May 10 nicklas 2719                   {
5350 25 May 10 nicklas 2720                       if(divWidth2>divX1+divWidth2-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 2721                       {
5350 25 May 10 nicklas 2722                           divX1i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 2723                           divWidth2i=divX1+divWidth2-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 2724                       }
5350 25 May 10 nicklas 2725                   }
5350 25 May 10 nicklas 2726                   else
5350 25 May 10 nicklas 2727                   divX1i=null;
5350 25 May 10 nicklas 2728                   
5350 25 May 10 nicklas 2729                   if(divX1<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2730                   {
5350 25 May 10 nicklas 2731                       if(divWidth2>xc-xArray[divY1-yc]-divX1+1)
5350 25 May 10 nicklas 2732                             divWidth2=xc-xArray[divY1-yc]-divX1+1;
5350 25 May 10 nicklas 2733                   }
5350 25 May 10 nicklas 2734                   else if(divWidth2>=divX1+divWidth2-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2735                   divX1=null;
5350 25 May 10 nicklas 2736             }
5350 25 May 10 nicklas 2737         }
5350 25 May 10 nicklas 2738         
5350 25 May 10 nicklas 2739             if(draw4)
5350 25 May 10 nicklas 2740             {
5350 25 May 10 nicklas 2741               if(xArray[divY1-yc]!=null && divX2!=null)
5350 25 May 10 nicklas 2742               {
5350 25 May 10 nicklas 2743                     if(xc+xArray[divY1-yc]<=divX2+divWidth4)
5350 25 May 10 nicklas 2744                   {
5350 25 May 10 nicklas 2745                       if(divWidth4>divX2+divWidth4-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 2746                       {
5350 25 May 10 nicklas 2747                           divX2i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 2748                           divWidth4i=divX2+divWidth4-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 2749                       }
5350 25 May 10 nicklas 2750                   }
5350 25 May 10 nicklas 2751                   else
5350 25 May 10 nicklas 2752                   divX2i=null;
5350 25 May 10 nicklas 2753                   
5350 25 May 10 nicklas 2754                   if(divX2<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2755                   {
5350 25 May 10 nicklas 2756                       if(divWidth4>xc-xArray[divY1-yc]-divX2+1)
5350 25 May 10 nicklas 2757                             divWidth4=xc-xArray[divY1-yc]-divX2+1;
5350 25 May 10 nicklas 2758                   }
5350 25 May 10 nicklas 2759                   else if(divWidth4>=divX2+divWidth4-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 2760                   divX2=null;
5350 25 May 10 nicklas 2761               }
5350 25 May 10 nicklas 2762           }
5350 25 May 10 nicklas 2763             //End: Only for drawArc (not in fillArc)
5350 25 May 10 nicklas 2764                 
5350 25 May 10 nicklas 2765         if(divX2==null)
5350 25 May 10 nicklas 2766         divX2="";
5350 25 May 10 nicklas 2767         if(divX1==null)
5350 25 May 10 nicklas 2768         divX1="";
5350 25 May 10 nicklas 2769         
5350 25 May 10 nicklas 2770         
5350 25 May 10 nicklas 2771         if(!valueOnly)
5350 25 May 10 nicklas 2772         {
5350 25 May 10 nicklas 2773           if(isUpperHalf)
5350 25 May 10 nicklas 2774           {
5350 25 May 10 nicklas 2775             if(x!=xpU || divX1pU!=divX1 || divX1pUi!=divX1i || divX2pU!=divX2 || divX2pUi!=divX2i || divWidth1!=divWidth1p || divWidth3!=divWidth3p || divWidth1i!=divWidth1pi || divWidth3i!=divWidth3pi)
5350 25 May 10 nicklas 2776             {
5350 25 May 10 nicklas 2777               divHeight=ypU-y;
5350 25 May 10 nicklas 2778               if(draw3p)
5350 25 May 10 nicklas 2779               {
5350 25 May 10 nicklas 2780                 if(divX2pU!=null && divX2pU!="")              
5350 25 May 10 nicklas 2781                     iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pU + "px;top:" + (divY1+1) + "px;width:" + divWidth3p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2782                     
5350 25 May 10 nicklas 2783                   if(divX2pUi!=null && divX2pUi!="")
5350 25 May 10 nicklas 2784                     iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pUi + "px;top:" + (divY1+1) + "px;width:" + divWidth3pi + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2785               }
5350 25 May 10 nicklas 2786
5350 25 May 10 nicklas 2787               if(draw1p)
5350 25 May 10 nicklas 2788               {
5350 25 May 10 nicklas 2789                 if(divX1pU!=null && divX1pU!="")
5350 25 May 10 nicklas 2790                         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pU + "px;top:" + (divY1+1) + "px;width:" + divWidth1p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2791
5350 25 May 10 nicklas 2792                 if(divX1pUi!=null && divX1pUi!="")
5350 25 May 10 nicklas 2793                         iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pUi + "px;top:" + (divY1+1) + "px;width:" + divWidth1pi + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2794               }
5350 25 May 10 nicklas 2795               
5350 25 May 10 nicklas 2796               if(draw1p||draw3p)  
5350 25 May 10 nicklas 2797               {
5350 25 May 10 nicklas 2798                 divX1pU=divX1;
5350 25 May 10 nicklas 2799                   divX1pUi=divX1i;
5350 25 May 10 nicklas 2800                   
5350 25 May 10 nicklas 2801                 draw1p=draw1;
5350 25 May 10 nicklas 2802                 draw3p=draw3;
5350 25 May 10 nicklas 2803                 
5350 25 May 10 nicklas 2804                 xpU=x;
5350 25 May 10 nicklas 2805                 ypU=y;
5350 25 May 10 nicklas 2806               
5350 25 May 10 nicklas 2807                 divWidth1p=divWidth1;
5350 25 May 10 nicklas 2808                 divWidth3p=divWidth3;
5350 25 May 10 nicklas 2809                 
5350 25 May 10 nicklas 2810                 divX2pU=divX2;
5350 25 May 10 nicklas 2811                 divX2pUi=divX2i;
5350 25 May 10 nicklas 2812                 
5350 25 May 10 nicklas 2813                 divWidth1pi=divWidth1i;
5350 25 May 10 nicklas 2814                 divWidth3pi=divWidth3i;
5350 25 May 10 nicklas 2815               }
5350 25 May 10 nicklas 2816             }
5350 25 May 10 nicklas 2817           }  
5350 25 May 10 nicklas 2818           else
5350 25 May 10 nicklas 2819           {
5350 25 May 10 nicklas 2820             if(x!=xpD || divX1pD!=divX1 ||divX1pDi!=divX1i || divX2pD!=divX2 || divWidth2!=divWidth2p || divWidth2i!=divWidth2pi || divWidth4!=divWidth4p || divWidth4i!=divWidth4pi)
5350 25 May 10 nicklas 2821             {
5350 25 May 10 nicklas 2822               divHeight=ypD-y;
5350 25 May 10 nicklas 2823               if(draw4p)
5350 25 May 10 nicklas 2824               {
5350 25 May 10 nicklas 2825                 if(divX2pD!=null && divX2pD!="")
5350 25 May 10 nicklas 2826                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pD + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth4p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2827                 
5350 25 May 10 nicklas 2828                 if(divX2pDi!=null && divX2pDi!="")
5350 25 May 10 nicklas 2829                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2pDi + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth4pi + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2830               }
5350 25 May 10 nicklas 2831               if(draw2p)
5350 25 May 10 nicklas 2832               {
5350 25 May 10 nicklas 2833                 if(divX1pD!=null && divX1pD!="") 
5350 25 May 10 nicklas 2834                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pD + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth2p + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2835                 
5350 25 May 10 nicklas 2836                 if(divX1pDi!=null && divX1pDi!="") 
5350 25 May 10 nicklas 2837                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1pDi + "px;top:" + (divY2-divHeight) + "px;width:" + divWidth2pi + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2838               }
5350 25 May 10 nicklas 2839               if(draw2p||draw4p)
5350 25 May 10 nicklas 2840               {
5350 25 May 10 nicklas 2841                 divX1pD=divX1;
5350 25 May 10 nicklas 2842                   divX1pDi=divX1i;
5350 25 May 10 nicklas 2843                   
5350 25 May 10 nicklas 2844                 draw2p=draw2;
5350 25 May 10 nicklas 2845                 draw4p=draw4;
5350 25 May 10 nicklas 2846
5350 25 May 10 nicklas 2847                 xpD=x;
5350 25 May 10 nicklas 2848                 ypD=y;
5350 25 May 10 nicklas 2849               
5350 25 May 10 nicklas 2850                 divWidth2p=divWidth2;
5350 25 May 10 nicklas 2851                 divWidth4p=divWidth4;
5350 25 May 10 nicklas 2852                 
5350 25 May 10 nicklas 2853                 divX2pD=divX2;
5350 25 May 10 nicklas 2854                 divX2pDi=divX2i;
5350 25 May 10 nicklas 2855                 
5350 25 May 10 nicklas 2856                 divWidth2pi=divWidth2i;
5350 25 May 10 nicklas 2857                 divWidth4pi=divWidth4i;
5350 25 May 10 nicklas 2858               }
5350 25 May 10 nicklas 2859             }
5350 25 May 10 nicklas 2860           }      
5350 25 May 10 nicklas 2861         }
5350 25 May 10 nicklas 2862         
5350 25 May 10 nicklas 2863         //To get only values; used for first y value before loop.
5350 25 May 10 nicklas 2864         if(valueOnly)
5350 25 May 10 nicklas 2865         {
5350 25 May 10 nicklas 2866           if(isUpperHalf)
5350 25 May 10 nicklas 2867           {
5350 25 May 10 nicklas 2868             draw1p=draw1;
5350 25 May 10 nicklas 2869             draw3p=draw3;
5350 25 May 10 nicklas 2870             
5350 25 May 10 nicklas 2871             if(draw1p)
5350 25 May 10 nicklas 2872             {
5350 25 May 10 nicklas 2873                 divX1pU=divX1;
5350 25 May 10 nicklas 2874                 divX1pUi=divX1i;
5350 25 May 10 nicklas 2875             }
5350 25 May 10 nicklas 2876             
5350 25 May 10 nicklas 2877             if(draw3p)
5350 25 May 10 nicklas 2878             {
5350 25 May 10 nicklas 2879               divX2pU=divX2;
5350 25 May 10 nicklas 2880               divX2pUi=divX2i;
5350 25 May 10 nicklas 2881             }
5350 25 May 10 nicklas 2882             
5350 25 May 10 nicklas 2883             if(draw1p||draw3p)
5350 25 May 10 nicklas 2884             {
5350 25 May 10 nicklas 2885                 ypU=y;
5350 25 May 10 nicklas 2886                 xpU=x;
5350 25 May 10 nicklas 2887             }
5350 25 May 10 nicklas 2888             else
5350 25 May 10 nicklas 2889             {
5350 25 May 10 nicklas 2890                 ypU=0;
5350 25 May 10 nicklas 2891                 xpU=0;
5350 25 May 10 nicklas 2892             }
5350 25 May 10 nicklas 2893             
5350 25 May 10 nicklas 2894             divWidth1p=divWidth1;
5350 25 May 10 nicklas 2895             divWidth3p=divWidth3;
5350 25 May 10 nicklas 2896             divWidth1pi=divWidth1i;
5350 25 May 10 nicklas 2897             divWidth3pi=divWidth3i;
5350 25 May 10 nicklas 2898
5350 25 May 10 nicklas 2899           }
5350 25 May 10 nicklas 2900           else
5350 25 May 10 nicklas 2901           {
5350 25 May 10 nicklas 2902             draw2p=draw2;
5350 25 May 10 nicklas 2903             draw4p=draw4;
5350 25 May 10 nicklas 2904
5350 25 May 10 nicklas 2905             if(draw2p)
5350 25 May 10 nicklas 2906             {
5350 25 May 10 nicklas 2907               divX1pD=divX1;
5350 25 May 10 nicklas 2908               divX1pDi=divX1i;
5350 25 May 10 nicklas 2909             }
5350 25 May 10 nicklas 2910             
5350 25 May 10 nicklas 2911             if(draw4p)
5350 25 May 10 nicklas 2912             {
5350 25 May 10 nicklas 2913               divX2pD=divX2;
5350 25 May 10 nicklas 2914               divX2pDi=divX2i;
5350 25 May 10 nicklas 2915             }
5350 25 May 10 nicklas 2916             
5350 25 May 10 nicklas 2917             if(draw2p||draw4p)
5350 25 May 10 nicklas 2918             {
5350 25 May 10 nicklas 2919                 ypD=y;
5350 25 May 10 nicklas 2920                 xpD=x;
5350 25 May 10 nicklas 2921             }
5350 25 May 10 nicklas 2922             else
5350 25 May 10 nicklas 2923             {
5350 25 May 10 nicklas 2924                 ypD=0;
5350 25 May 10 nicklas 2925                 xpD=0;
5350 25 May 10 nicklas 2926             }
5350 25 May 10 nicklas 2927             
5350 25 May 10 nicklas 2928             divWidth2p=divWidth2;
5350 25 May 10 nicklas 2929             divWidth4p=divWidth4;
5350 25 May 10 nicklas 2930             divWidth2pi=divWidth2i;
5350 25 May 10 nicklas 2931             divWidth4pi=divWidth4i;
5350 25 May 10 nicklas 2932           }
5350 25 May 10 nicklas 2933         }
5350 25 May 10 nicklas 2934         
5350 25 May 10 nicklas 2935         if(!isUpperHalf)
5350 25 May 10 nicklas 2936         {
5350 25 May 10 nicklas 2937           draw2p=draw2;
5350 25 May 10 nicklas 2938           draw4p=draw4;
5350 25 May 10 nicklas 2939         }
5350 25 May 10 nicklas 2940         else
5350 25 May 10 nicklas 2941         {
5350 25 May 10 nicklas 2942           draw1p=draw1;
5350 25 May 10 nicklas 2943           draw3p=draw3;
5350 25 May 10 nicklas 2944         }
5350 25 May 10 nicklas 2945         
5350 25 May 10 nicklas 2946         if(y==1 && !isUpperHalf)
5350 25 May 10 nicklas 2947         {
5350 25 May 10 nicklas 2948           divHeight=ypD-y+1;
5350 25 May 10 nicklas 2949           if(draw4)
5350 25 May 10 nicklas 2950           {
5350 25 May 10 nicklas 2951               if(divX2!="")
5350 25 May 10 nicklas 2952               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2953           
5350 25 May 10 nicklas 2954               if(divX2i!=null)
5350 25 May 10 nicklas 2955               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2i + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2956           }
5350 25 May 10 nicklas 2957           if(draw2)
5350 25 May 10 nicklas 2958           {
5350 25 May 10 nicklas 2959               if(divX1!="")
5350 25 May 10 nicklas 2960               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2961           
5350 25 May 10 nicklas 2962             if(divX1i!=null)
5350 25 May 10 nicklas 2963               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1i + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";            
5350 25 May 10 nicklas 2964           }
5350 25 May 10 nicklas 2965         }
5350 25 May 10 nicklas 2966     
5350 25 May 10 nicklas 2967         if(y==0 && isUpperHalf)
5350 25 May 10 nicklas 2968         {      
5350 25 May 10 nicklas 2969           divHeight=ypU-y+1;
5350 25 May 10 nicklas 2970           if(draw3)
5350 25 May 10 nicklas 2971           {
5350 25 May 10 nicklas 2972               if(divX2!="")
5350 25 May 10 nicklas 2973               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + divY1 + "px;width:" + divWidth3 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2974           
5350 25 May 10 nicklas 2975               if(divX2i!=null)
5350 25 May 10 nicklas 2976               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2i + "px;top:" + divY1 + "px;width:" + divWidth3i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2977           }
5350 25 May 10 nicklas 2978
5350 25 May 10 nicklas 2979           if(draw1)
5350 25 May 10 nicklas 2980           {
5350 25 May 10 nicklas 2981                     if(divX1!="")
5350 25 May 10 nicklas 2982                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + divY1 + "px;width:" + divWidth1 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2983             
5350 25 May 10 nicklas 2984                     if(divX1i!=null)
5350 25 May 10 nicklas 2985                   iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1i + "px;top:" + divY1 + "px;width:" + divWidth1i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 2986           }
5350 25 May 10 nicklas 2987         }    
5350 25 May 10 nicklas 2988       }
5350 25 May 10 nicklas 2989       
5350 25 May 10 nicklas 2990       //Internal function: Arc segment for upper and lower portion of the ellipse constutuing the arc.
5350 25 May 10 nicklas 2991       function drawArcSegOut(isUpperHalf)
5350 25 May 10 nicklas 2992       {
5350 25 May 10 nicklas 2993         var divY;
5350 25 May 10 nicklas 2994         var xDataArray1,xDataArray1;
5350 25 May 10 nicklas 2995         var divWidthFirst=divWidthOrg;
5350 25 May 10 nicklas 2996         var divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 2997         var drawFirst=false;
5350 25 May 10 nicklas 2998         var drawSecond=false;
5350 25 May 10 nicklas 2999         
7419 03 Nov 17 nicklas 3000         var xDataArray1, xDataArray2;
7419 03 Nov 17 nicklas 3001         var saDvar, eaDvar;
5350 25 May 10 nicklas 3002         if(isUpperHalf)
5350 25 May 10 nicklas 3003         {
5350 25 May 10 nicklas 3004           var draw1=false; //upper half
5350 25 May 10 nicklas 3005           var draw3=false; //upper half second
5350 25 May 10 nicklas 3006           divY=divY1;
5350 25 May 10 nicklas 3007           xDataArray1=xDataArraySa;
5350 25 May 10 nicklas 3008           xDataArray2=xDataArrayEa;
5350 25 May 10 nicklas 3009           saDvar=saD;
5350 25 May 10 nicklas 3010           eaDvar=eaD;
5350 25 May 10 nicklas 3011         }
5350 25 May 10 nicklas 3012         else
5350 25 May 10 nicklas 3013         {
5350 25 May 10 nicklas 3014           var draw2=false; //lower half
5350 25 May 10 nicklas 3015           var draw4=false; //lower half second
5350 25 May 10 nicklas 3016           divY=divY2;
5350 25 May 10 nicklas 3017           xDataArray2=xDataArraySa;
5350 25 May 10 nicklas 3018           xDataArray1=xDataArrayEa;
5350 25 May 10 nicklas 3019           saDvar=360-eaD;
5350 25 May 10 nicklas 3020           eaDvar=360-saD;
5350 25 May 10 nicklas 3021         }
5350 25 May 10 nicklas 3022         if(eaDvar>saDvar)
5350 25 May 10 nicklas 3023         {
5350 25 May 10 nicklas 3024           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 3025           {
5350 25 May 10 nicklas 3026             eaX=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 3027             if(xDataArray1[divY] && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 3028             {
5350 25 May 10 nicklas 3029               saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 3030               divWidthFirst=saX-eaX;
5350 25 May 10 nicklas 3031             }
5350 25 May 10 nicklas 3032             else
5350 25 May 10 nicklas 3033             {
5350 25 May 10 nicklas 3034               divWidthFirst=divX1+divWidthOrg-eaX;
5350 25 May 10 nicklas 3035             }
5350 25 May 10 nicklas 3036             divX1=eaX;
5350 25 May 10 nicklas 3037             drawFirst=true;
5350 25 May 10 nicklas 3038           }
5350 25 May 10 nicklas 3039           else if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 3040           {
5350 25 May 10 nicklas 3041             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 3042             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 3043             drawFirst=true;
5350 25 May 10 nicklas 3044           }
5350 25 May 10 nicklas 3045           else if(eaDvar>90 && saDvar<90)
5350 25 May 10 nicklas 3046           {
5350 25 May 10 nicklas 3047             drawFirst=true;
5350 25 May 10 nicklas 3048           }
5350 25 May 10 nicklas 3049         }
5350 25 May 10 nicklas 3050         else //saDvar>eaDvar
5350 25 May 10 nicklas 3051         {
5350 25 May 10 nicklas 3052           if(xDataArray1[divY]!=null && divX1+divWidthOrg>=xDataArray1[divY].xMax+1 && divX1<=xDataArray1[divY].xMax+1)
5350 25 May 10 nicklas 3053           {
5350 25 May 10 nicklas 3054             saX=xDataArray1[divY].xMax+1;
5350 25 May 10 nicklas 3055             divWidthFirst=saX-divX1;
5350 25 May 10 nicklas 3056             drawFirst=true;
5350 25 May 10 nicklas 3057           }
5350 25 May 10 nicklas 3058           else if(eaDvar<90 && saDvar<90)
5350 25 May 10 nicklas 3059           {
5350 25 May 10 nicklas 3060             drawFirst=true;
5350 25 May 10 nicklas 3061           }
5350 25 May 10 nicklas 3062       
5350 25 May 10 nicklas 3063           if(xDataArray2[divY]!=null && divX1+divWidthOrg>=xDataArray2[divY].xMin && divX1<=xDataArray2[divY].xMin)
5350 25 May 10 nicklas 3064           {
5350 25 May 10 nicklas 3065             divX2=xDataArray2[divY].xMin;
5350 25 May 10 nicklas 3066             divWidthSecond=divWidthOrg-xDataArray2[divY].xMin+divX1;
5350 25 May 10 nicklas 3067             drawSecond=true;
5350 25 May 10 nicklas 3068           }
5350 25 May 10 nicklas 3069           else if(eaDvar>90 && saDvar>90)
5350 25 May 10 nicklas 3070           {
5350 25 May 10 nicklas 3071             divX2=divX1;
5350 25 May 10 nicklas 3072             divWidthSecond=divWidthOrg;
5350 25 May 10 nicklas 3073             drawSecond=true;
5350 25 May 10 nicklas 3074           }
5350 25 May 10 nicklas 3075         }
5350 25 May 10 nicklas 3076         
5350 25 May 10 nicklas 3077         if(isUpperHalf)
5350 25 May 10 nicklas 3078         {
5350 25 May 10 nicklas 3079           if(drawFirst)
5350 25 May 10 nicklas 3080             draw1=true;
5350 25 May 10 nicklas 3081           
5350 25 May 10 nicklas 3082           if(drawSecond)
5350 25 May 10 nicklas 3083             draw3=true;
5350 25 May 10 nicklas 3084             
5350 25 May 10 nicklas 3085           divWidth1=divWidthFirst;
5350 25 May 10 nicklas 3086           divWidth3=divWidthSecond;  
5350 25 May 10 nicklas 3087         }
5350 25 May 10 nicklas 3088         else
5350 25 May 10 nicklas 3089         {
5350 25 May 10 nicklas 3090           if(drawFirst)
5350 25 May 10 nicklas 3091             draw2=true;
5350 25 May 10 nicklas 3092           
5350 25 May 10 nicklas 3093           if(drawSecond)
5350 25 May 10 nicklas 3094             draw4=true;
5350 25 May 10 nicklas 3095             
5350 25 May 10 nicklas 3096           divWidth2=divWidthFirst;
5350 25 May 10 nicklas 3097           divWidth4=divWidthSecond;  
5350 25 May 10 nicklas 3098         }
5350 25 May 10 nicklas 3099         
5350 25 May 10 nicklas 3100         if(saD>=0 && saD<180 && eaD>=0 && eaD<180 && saD>eaD)
5350 25 May 10 nicklas 3101         {
5350 25 May 10 nicklas 3102           draw2=true;
5350 25 May 10 nicklas 3103         }        
5350 25 May 10 nicklas 3104         else if(saD>=180 && saD<360 && eaD>=180 && eaD<360 && saD>eaD)
5350 25 May 10 nicklas 3105         {
5350 25 May 10 nicklas 3106           draw1=true;
5350 25 May 10 nicklas 3107         }
5350 25 May 10 nicklas 3108         
5350 25 May 10 nicklas 3109             //Start: Only for drawArc (not in fillArc)    
5350 25 May 10 nicklas 3110             if(draw1)
5350 25 May 10 nicklas 3111             {
5350 25 May 10 nicklas 3112             
5350 25 May 10 nicklas 3113               if(xArray[divY1-yc] && divX1!=null)
5350 25 May 10 nicklas 3114               {
5350 25 May 10 nicklas 3115                   if(xc+xArray[divY1-yc]<=divX1+divWidth1)
5350 25 May 10 nicklas 3116                   {
5350 25 May 10 nicklas 3117                       if(divWidth1>divX1+divWidth1-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 3118                       {
5350 25 May 10 nicklas 3119                           divX1i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 3120                           divWidth1i=divX1+divWidth1-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 3121                       }
5350 25 May 10 nicklas 3122                   }
5350 25 May 10 nicklas 3123                   else
5350 25 May 10 nicklas 3124                   divX1i="X";
5350 25 May 10 nicklas 3125                   
5350 25 May 10 nicklas 3126                   if(divX1<xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3127                   {
5350 25 May 10 nicklas 3128                       if(divWidth1>xc-xArray[divY1-yc]-divX1+1)
5350 25 May 10 nicklas 3129                             divWidth1=xc-xArray[divY1-yc]-divX1+1;
5350 25 May 10 nicklas 3130                   }
5350 25 May 10 nicklas 3131                   else if(divWidth1>=divX1+divWidth1-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3132                   divX1="X";
5350 25 May 10 nicklas 3133             }
5350 25 May 10 nicklas 3134             
5350 25 May 10 nicklas 3135         }
5350 25 May 10 nicklas 3136             
5350 25 May 10 nicklas 3137             if(draw3)
5350 25 May 10 nicklas 3138             {
5350 25 May 10 nicklas 3139               if(xArray[divY1-yc] && divX2!=null)
5350 25 May 10 nicklas 3140               {
5350 25 May 10 nicklas 3141                     if(xc+xArray[divY1-yc]<=divX2+divWidth3)
5350 25 May 10 nicklas 3142                   {
5350 25 May 10 nicklas 3143                       if(divWidth3>divX2+divWidth3-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 3144                       {
5350 25 May 10 nicklas 3145                           divX2i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 3146                           divWidth3i=divX2+divWidth3-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 3147                       }
5350 25 May 10 nicklas 3148                   }
5350 25 May 10 nicklas 3149                   else
5350 25 May 10 nicklas 3150                   divX2i="X";
5350 25 May 10 nicklas 3151                   
5350 25 May 10 nicklas 3152                   if(divX2<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3153                   {
5350 25 May 10 nicklas 3154                       if(divWidth3>xc-xArray[divY1-yc]-divX2+1)
5350 25 May 10 nicklas 3155                             divWidth3=xc-xArray[divY1-yc]-divX2+1;
5350 25 May 10 nicklas 3156                   }
5350 25 May 10 nicklas 3157                   else if(divWidth3>=divX2+divWidth3-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3158                   divX2="X";
5350 25 May 10 nicklas 3159               }
5350 25 May 10 nicklas 3160           }
5350 25 May 10 nicklas 3161
5350 25 May 10 nicklas 3162             //Lower Half    
5350 25 May 10 nicklas 3163             if(draw2)
5350 25 May 10 nicklas 3164             {
5350 25 May 10 nicklas 3165               if(xArray[divY1-yc] && divX1!=null)
5350 25 May 10 nicklas 3166               {
5350 25 May 10 nicklas 3167                   if(xc+xArray[divY1-yc]<=divX1+divWidth2)
5350 25 May 10 nicklas 3168                   {
5350 25 May 10 nicklas 3169                       if(divWidth2>divX1+divWidth2-xc-xArrayI[divY1-yc])
5350 25 May 10 nicklas 3170                       {
5350 25 May 10 nicklas 3171                           divX1i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 3172                           divWidth2i=divX1+divWidth2-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 3173                       }
5350 25 May 10 nicklas 3174                   }
5350 25 May 10 nicklas 3175                   else
5350 25 May 10 nicklas 3176                   divX1i="X";
5350 25 May 10 nicklas 3177                   
5350 25 May 10 nicklas 3178                   if(divX1<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3179                   {
5350 25 May 10 nicklas 3180                       if(divWidth2>xc-xArray[divY1-yc]-divX1+1)
5350 25 May 10 nicklas 3181                             divWidth2=xc-xArray[divY1-yc]-divX1+1;
5350 25 May 10 nicklas 3182                   }
5350 25 May 10 nicklas 3183                   else if(divWidth2>=divX1+divWidth2-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3184                   divX1="X";
5350 25 May 10 nicklas 3185             }
5350 25 May 10 nicklas 3186         }
5350 25 May 10 nicklas 3187         
5350 25 May 10 nicklas 3188             if(draw4)
5350 25 May 10 nicklas 3189             {
5350 25 May 10 nicklas 3190               if(xArrayI[divY1-yc] && divX2!=null)
5350 25 May 10 nicklas 3191               {
5350 25 May 10 nicklas 3192                     if(xc+xArray[divY1-yc]<=divX2+divWidth4)
5350 25 May 10 nicklas 3193                   {
5350 25 May 10 nicklas 3194                       if(divWidth4>divX2+divWidth4-xc-xArray[divY1-yc])
5350 25 May 10 nicklas 3195                       {
5350 25 May 10 nicklas 3196                           divX2i=xc+xArray[divY1-yc];
5350 25 May 10 nicklas 3197                           divWidth4i=divX2+divWidth4-xc-xArray[divY1-yc];
5350 25 May 10 nicklas 3198                       }
5350 25 May 10 nicklas 3199                   }
5350 25 May 10 nicklas 3200                   else
5350 25 May 10 nicklas 3201                   divX2i="X";
5350 25 May 10 nicklas 3202                   
5350 25 May 10 nicklas 3203                   if(divX2<=xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3204                   {
5350 25 May 10 nicklas 3205                       if(divWidth4>xc-xArray[divY1-yc]-divX2+1)
5350 25 May 10 nicklas 3206                             divWidth4=xc-xArray[divY1-yc]-divX2+1;
5350 25 May 10 nicklas 3207                   }
5350 25 May 10 nicklas 3208                   else if(divWidth4>=divX2+divWidth4-xc-xArray[divY1-yc]+1)
5350 25 May 10 nicklas 3209                   divX2="X";
5350 25 May 10 nicklas 3210               }
5350 25 May 10 nicklas 3211           }
5350 25 May 10 nicklas 3212             //End: Only for drawArc (not in fillArc)    
5350 25 May 10 nicklas 3213
5350 25 May 10 nicklas 3214         if(divX2==null)
5350 25 May 10 nicklas 3215         divX2="X";
5350 25 May 10 nicklas 3216         if(divX1==null)
5350 25 May 10 nicklas 3217         divX1="X";
5350 25 May 10 nicklas 3218         
5350 25 May 10 nicklas 3219           if(divX2i==null)
5350 25 May 10 nicklas 3220         divX2i="X";
5350 25 May 10 nicklas 3221         if(divX1i==null)
5350 25 May 10 nicklas 3222         divX1i="X";
5350 25 May 10 nicklas 3223         
5350 25 May 10 nicklas 3224         if(isUpperHalf)
5350 25 May 10 nicklas 3225         {
5350 25 May 10 nicklas 3226           divHeight=1;
5350 25 May 10 nicklas 3227           if(draw3)
5350 25 May 10 nicklas 3228           {
5350 25 May 10 nicklas 3229             if(divX2!="X")
5350 25 May 10 nicklas 3230               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + divY1 + "px;width:" + divWidth3 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3231           
5350 25 May 10 nicklas 3232             if(divX2i!="X")
5350 25 May 10 nicklas 3233               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2i + "px;top:" + divY1 + "px;width:" + divWidth3i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3234           }
5350 25 May 10 nicklas 3235
5350 25 May 10 nicklas 3236           if(draw1)
5350 25 May 10 nicklas 3237           {
5350 25 May 10 nicklas 3238             if(divX1!="X")
5350 25 May 10 nicklas 3239               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + divY1 + "px;width:" + divWidth1 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3240
5350 25 May 10 nicklas 3241             if(divX1i!="X")
5350 25 May 10 nicklas 3242               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1i + "px;top:" + divY1 + "px;width:" + divWidth1i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3243           }
5350 25 May 10 nicklas 3244         }  
5350 25 May 10 nicklas 3245         else
5350 25 May 10 nicklas 3246         {
5350 25 May 10 nicklas 3247           divHeight=1;
5350 25 May 10 nicklas 3248           if(draw4)
5350 25 May 10 nicklas 3249           {
5350 25 May 10 nicklas 3250             if(divX2!="X")
5350 25 May 10 nicklas 3251                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3252           
5350 25 May 10 nicklas 3253             if(divX2i!="X")
5350 25 May 10 nicklas 3254                 iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX2i + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth4i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3255           }
5350 25 May 10 nicklas 3256           if(draw2)
5350 25 May 10 nicklas 3257           {
5350 25 May 10 nicklas 3258             if(divX1!="X") 
5350 25 May 10 nicklas 3259               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1 + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2 + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3260           
5350 25 May 10 nicklas 3261             if(divX1i!="X") 
5350 25 May 10 nicklas 3262               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:" + divX1i + "px;top:" + (divY2+1-divHeight) + "px;width:" + divWidth2i + "px;height:" + divHeight + "px;background-color:" + hexColor + "\"></DIV>";
5350 25 May 10 nicklas 3263           }
5350 25 May 10 nicklas 3264         }      
5350 25 May 10 nicklas 3265       }
5350 25 May 10 nicklas 3266     }
5350 25 May 10 nicklas 3267
5350 25 May 10 nicklas 3268     //Draw polyline connecting to the specified points.
5350 25 May 10 nicklas 3269     function drawPolyline(pen,points)
5350 25 May 10 nicklas 3270     {
5350 25 May 10 nicklas 3271         //Check arguments for null values
5350 25 May 10 nicklas 3272       if(!pen || !points)
5350 25 May 10 nicklas 3273         return false;
5350 25 May 10 nicklas 3274
5350 25 May 10 nicklas 3275       var polylineDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 3276
5350 25 May 10 nicklas 3277       for(var i=1;i<points.length;i++)
5350 25 May 10 nicklas 3278       {
5350 25 May 10 nicklas 3279         polylineDiv.appendChild(this.drawLine(pen,points[i-1],points[i]));
5350 25 May 10 nicklas 3280       }
5350 25 May 10 nicklas 3281       
5350 25 May 10 nicklas 3282       return polylineDiv;
5350 25 May 10 nicklas 3283     }
5350 25 May 10 nicklas 3284
5350 25 May 10 nicklas 3285     //Draw polygon connecting to the specified points.  
5350 25 May 10 nicklas 3286     function drawPolygon(pen,points)
5350 25 May 10 nicklas 3287     {
5350 25 May 10 nicklas 3288         //Check arguments for null values
5350 25 May 10 nicklas 3289       if(!pen || !points)
5350 25 May 10 nicklas 3290         return false;
5350 25 May 10 nicklas 3291
5350 25 May 10 nicklas 3292       var polylineDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 3293
5350 25 May 10 nicklas 3294       var i;  
5350 25 May 10 nicklas 3295       for(i=1;i<points.length;i++)
5350 25 May 10 nicklas 3296       {
5350 25 May 10 nicklas 3297         polylineDiv.appendChild(this.drawLine(pen,points[i-1],points[i]));
5350 25 May 10 nicklas 3298       }
5350 25 May 10 nicklas 3299       polylineDiv.appendChild(this.drawLine(pen,points[i-1],points[0]));
5350 25 May 10 nicklas 3300     }
5350 25 May 10 nicklas 3301
5350 25 May 10 nicklas 3302     //Draw polygon filled with specified color and connecting to the specified points.  
5350 25 May 10 nicklas 3303   function fillPolygon(color,points)
5350 25 May 10 nicklas 3304   {
5350 25 May 10 nicklas 3305       //Check arguments for null values
5350 25 May 10 nicklas 3306     if(!color || !points)
5350 25 May 10 nicklas 3307     return false;
5350 25 May 10 nicklas 3308
5350 25 May 10 nicklas 3309     var phPoints=new Array();
5350 25 May 10 nicklas 3310     var i;
5350 25 May 10 nicklas 3311     
5350 25 May 10 nicklas 3312     for(i=0;i<points.length;i++)
5350 25 May 10 nicklas 3313     {
5350 25 May 10 nicklas 3314       phPoints[i]=logicalToPhysicalPoint(points[i]);
5350 25 May 10 nicklas 3315     }
5350 25 May 10 nicklas 3316     
5350 25 May 10 nicklas 3317       var polygonDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 3318     var iHtml=new Array();
5350 25 May 10 nicklas 3319     
5350 25 May 10 nicklas 3320     var hexColor=color.getHex(); 
5350 25 May 10 nicklas 3321
5350 25 May 10 nicklas 3322     var xDataArrays=new Array();
5350 25 May 10 nicklas 3323     var yMin=phPoints[0].y;
5350 25 May 10 nicklas 3324     var yMax=phPoints[0].y;
5350 25 May 10 nicklas 3325     
5350 25 May 10 nicklas 3326     var newPoints=new Array();
5350 25 May 10 nicklas 3327     var l,m,n;
5350 25 May 10 nicklas 3328     var pointsCount;
5350 25 May 10 nicklas 3329
5350 25 May 10 nicklas 3330     pointsCount=phPoints.length;
5350 25 May 10 nicklas 3331     
5350 25 May 10 nicklas 3332     //Remove duplicate consecutive points
5350 25 May 10 nicklas 3333     for(i=0;i<phPoints.length;i++)
5350 25 May 10 nicklas 3334     {
5350 25 May 10 nicklas 3335       if(i!=0)
5350 25 May 10 nicklas 3336           m=i-1;
5350 25 May 10 nicklas 3337       else
5350 25 May 10 nicklas 3338           m=pointsCount-1;
5350 25 May 10 nicklas 3339             
5350 25 May 10 nicklas 3340       if(!(phPoints[m].x==phPoints[i].x && phPoints[m].y==phPoints[i].y))
5350 25 May 10 nicklas 3341       {
5350 25 May 10 nicklas 3342             newPoints[newPoints.length]=phPoints[i];
5350 25 May 10 nicklas 3343       }
5350 25 May 10 nicklas 3344     }
5350 25 May 10 nicklas 3345     phPoints=newPoints;
5350 25 May 10 nicklas 3346     newPoints=new Array();
5350 25 May 10 nicklas 3347     
5350 25 May 10 nicklas 3348     pointsCount=phPoints.length;
5350 25 May 10 nicklas 3349     
5350 25 May 10 nicklas 3350     //For consecutive horizontal points
5350 25 May 10 nicklas 3351     for(i=0;i<phPoints.length;i++)
5350 25 May 10 nicklas 3352     {
5350 25 May 10 nicklas 3353       if(i!=0)
5350 25 May 10 nicklas 3354           m=i-1;
5350 25 May 10 nicklas 3355       else
5350 25 May 10 nicklas 3356           m=pointsCount-1;
5350 25 May 10 nicklas 3357           
5350 25 May 10 nicklas 3358       if(i!=pointsCount-1)
5350 25 May 10 nicklas 3359           n=i+1;
5350 25 May 10 nicklas 3360       else
5350 25 May 10 nicklas 3361           n=0;
5350 25 May 10 nicklas 3362         
5350 25 May 10 nicklas 3363       if(!(phPoints[i].y==phPoints[n].y && phPoints[i].y==phPoints[m].y))
5350 25 May 10 nicklas 3364       {
5350 25 May 10 nicklas 3365             newPoints[newPoints.length]=phPoints[i];
5350 25 May 10 nicklas 3366       }
5350 25 May 10 nicklas 3367       else
5350 25 May 10 nicklas 3368       {
5350 25 May 10 nicklas 3369           //For consecutive horizontal points, just draw horizontal lines
5350 25 May 10 nicklas 3370         if(phPoints[m].x<=phPoints[i].x)
5350 25 May 10 nicklas 3371         {
5350 25 May 10 nicklas 3372           iHtml[iHtml.length]="<DIV style=\"position:absolute;height:1px;overflow:hidden;left:";
5350 25 May 10 nicklas 3373           iHtml[iHtml.length]=phPoints[m].x;
5350 25 May 10 nicklas 3374           iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3375           iHtml[iHtml.length]=phPoints[i].y;
5350 25 May 10 nicklas 3376           iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3377           iHtml[iHtml.length]=phPoints[i].x-phPoints[m].x;
5350 25 May 10 nicklas 3378           iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3379           iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3380           iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3381         }
5350 25 May 10 nicklas 3382         else
5350 25 May 10 nicklas 3383         {
5350 25 May 10 nicklas 3384           iHtml[iHtml.length]="<DIV style=\"position:absolute;height:1px;overflow:hidden;left:";
5350 25 May 10 nicklas 3385           iHtml[iHtml.length]=phPoints[i].x;
5350 25 May 10 nicklas 3386           iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3387           iHtml[iHtml.length]=phPoints[i].y;
5350 25 May 10 nicklas 3388           iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3389           iHtml[iHtml.length]=phPoints[m].x-phPoints[i].x;
5350 25 May 10 nicklas 3390           iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3391           iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3392           iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3393         }
5350 25 May 10 nicklas 3394       }
5350 25 May 10 nicklas 3395     }
5350 25 May 10 nicklas 3396     phPoints=newPoints;
5350 25 May 10 nicklas 3397     
5350 25 May 10 nicklas 3398     for(i=1;i<phPoints.length;i++)
5350 25 May 10 nicklas 3399     {
5350 25 May 10 nicklas 3400       if(yMin>phPoints[i-1].y)
5350 25 May 10 nicklas 3401       {
5350 25 May 10 nicklas 3402         yMin=phPoints[i-1].y;
5350 25 May 10 nicklas 3403       }
5350 25 May 10 nicklas 3404       if(yMax<phPoints[i-1].y)
5350 25 May 10 nicklas 3405       {
5350 25 May 10 nicklas 3406         yMax=phPoints[i-1].y;
5350 25 May 10 nicklas 3407       }
5350 25 May 10 nicklas 3408       
5350 25 May 10 nicklas 3409             //Get the pixel arrays for the lines connecting polygon vertices.
5350 25 May 10 nicklas 3410       xDataArrays[i-1]=getLinePixels(phPoints[i-1],phPoints[i]);
5350 25 May 10 nicklas 3411       
5350 25 May 10 nicklas 3412       //For verices, keep only one point and not two overlapping points
5350 25 May 10 nicklas 3413       if(i<phPoints.length-1)
5350 25 May 10 nicklas 3414       {
5350 25 May 10 nicklas 3415         if((phPoints[i-1].y<phPoints[i].y && phPoints[i].y<phPoints[i+1].y) || (phPoints[i-1].y>phPoints[i].y && phPoints[i].y>phPoints[i+1].y))
5350 25 May 10 nicklas 3416         {
5350 25 May 10 nicklas 3417           xDataArrays[i-1][phPoints[i].y]=null;  
5350 25 May 10 nicklas 3418         }
5350 25 May 10 nicklas 3419       }
5350 25 May 10 nicklas 3420       else
5350 25 May 10 nicklas 3421       {
5350 25 May 10 nicklas 3422         if((phPoints[i-1].y<phPoints[i].y && phPoints[i].y<phPoints[0].y) || (phPoints[i-1].y>phPoints[i].y && phPoints[i].y>phPoints[0].y))
5350 25 May 10 nicklas 3423         {
5350 25 May 10 nicklas 3424           xDataArrays[i-1][phPoints[i].y]=null;
5350 25 May 10 nicklas 3425         }
5350 25 May 10 nicklas 3426       }
5350 25 May 10 nicklas 3427     }
5350 25 May 10 nicklas 3428     
5350 25 May 10 nicklas 3429     if(yMin>phPoints[i-1].y)
5350 25 May 10 nicklas 3430     {
5350 25 May 10 nicklas 3431       yMin=phPoints[i-1].y;
5350 25 May 10 nicklas 3432     }
5350 25 May 10 nicklas 3433     if(yMax<phPoints[i-1].y)
5350 25 May 10 nicklas 3434     {
5350 25 May 10 nicklas 3435       yMax=phPoints[i-1].y;
5350 25 May 10 nicklas 3436     }
5350 25 May 10 nicklas 3437       
5350 25 May 10 nicklas 3438     xDataArrays[i-1]=getLinePixels(phPoints[i-1],phPoints[0]);
5350 25 May 10 nicklas 3439     if((phPoints[i-1].y<phPoints[0].y && phPoints[0].y<phPoints[1].y) || (phPoints[i-1].y>phPoints[0].y && phPoints[0].y>phPoints[1].y))
5350 25 May 10 nicklas 3440     {
5350 25 May 10 nicklas 3441       xDataArrays[i-1][phPoints[0].y]=null;
5350 25 May 10 nicklas 3442     }
5350 25 May 10 nicklas 3443           
5350 25 May 10 nicklas 3444     var y;
5350 25 May 10 nicklas 3445     var divStyle="";
5350 25 May 10 nicklas 3446     var j;
5350 25 May 10 nicklas 3447     pointsCount=phPoints.length;
5350 25 May 10 nicklas 3448     var xDataArray;
5350 25 May 10 nicklas 3449     var xMin,xMax;
5350 25 May 10 nicklas 3450     var curX,curY,curWidth;
5350 25 May 10 nicklas 3451     
5350 25 May 10 nicklas 3452     for(y=yMin;y<=yMax;y++)
5350 25 May 10 nicklas 3453     {
5350 25 May 10 nicklas 3454       j=0;
5350 25 May 10 nicklas 3455       var allXDataArray=new Array();
5350 25 May 10 nicklas 3456       
5350 25 May 10 nicklas 3457       for(i=0;i<pointsCount;i++)
5350 25 May 10 nicklas 3458       {
5350 25 May 10 nicklas 3459         xDataArray=xDataArrays[i];
5350 25 May 10 nicklas 3460         if(i!=0)
5350 25 May 10 nicklas 3461             m=i-1;
5350 25 May 10 nicklas 3462         else
5350 25 May 10 nicklas 3463             m=pointsCount-1;
5350 25 May 10 nicklas 3464             
5350 25 May 10 nicklas 3465         if(i!=1 && i!=0)
5350 25 May 10 nicklas 3466             l=i-2;
5350 25 May 10 nicklas 3467         else if(i==0)
5350 25 May 10 nicklas 3468             l=pointsCount-2;    
5350 25 May 10 nicklas 3469         else
5350 25 May 10 nicklas 3470             l=pointsCount-1;    
5350 25 May 10 nicklas 3471             
5350 25 May 10 nicklas 3472         if(i!=pointsCount-1)
5350 25 May 10 nicklas 3473             n=i+1;
5350 25 May 10 nicklas 3474         else
5350 25 May 10 nicklas 3475             n=0;
5350 25 May 10 nicklas 3476                 
5350 25 May 10 nicklas 3477         if((y==phPoints[i].y && y==phPoints[m].y && y<phPoints[l].y && y<phPoints[n].y && xDataArray[y]) || (y==phPoints[i].y && y==phPoints[m].y && y>phPoints[l].y && y>phPoints[n].y && xDataArray[y]))
5350 25 May 10 nicklas 3478         {
5350 25 May 10 nicklas 3479           allXDataArray[j]= xDataArray[y];
5350 25 May 10 nicklas 3480           j++;
5350 25 May 10 nicklas 3481         }
5350 25 May 10 nicklas 3482         if(xDataArray[y])
5350 25 May 10 nicklas 3483         {
5350 25 May 10 nicklas 3484           allXDataArray[j]= xDataArray[y];
5350 25 May 10 nicklas 3485           j++;
5350 25 May 10 nicklas 3486         }
5350 25 May 10 nicklas 3487       }
5350 25 May 10 nicklas 3488             
5350 25 May 10 nicklas 3489             //Sorting based on xMin, uses sortXDataArray function
5350 25 May 10 nicklas 3490       allXDataArray.sort(sortXDataArray);
5350 25 May 10 nicklas 3491       
5350 25 May 10 nicklas 3492       curY=y;
5350 25 May 10 nicklas 3493       for(i=0;i<allXDataArray.length;i+=2)
5350 25 May 10 nicklas 3494       {
5350 25 May 10 nicklas 3495         if(allXDataArray[i+1])
5350 25 May 10 nicklas 3496         {
5350 25 May 10 nicklas 3497           curX=allXDataArray[i].xMin;
5350 25 May 10 nicklas 3498           if(allXDataArray[i+1].xMax>allXDataArray[i].xMax)
5350 25 May 10 nicklas 3499             curWidth=allXDataArray[i+1].xMax-allXDataArray[i].xMin+1;
5350 25 May 10 nicklas 3500           else
5350 25 May 10 nicklas 3501             curWidth=allXDataArray[i].xMax-allXDataArray[i].xMin+1;
5350 25 May 10 nicklas 3502         }
5350 25 May 10 nicklas 3503         else
5350 25 May 10 nicklas 3504         {
5350 25 May 10 nicklas 3505           curX=allXDataArray[allXDataArray.length-1].xMin;
5350 25 May 10 nicklas 3506           curWidth=allXDataArray[allXDataArray.length-1].xMax-allXDataArray[allXDataArray.length-1].xMin+1;
5350 25 May 10 nicklas 3507         }
5350 25 May 10 nicklas 3508         
5350 25 May 10 nicklas 3509         iHtml[iHtml.length]="<DIV style=\"position:absolute;height:1px;overflow:hidden;left:";
5350 25 May 10 nicklas 3510         iHtml[iHtml.length]=curX;
5350 25 May 10 nicklas 3511         iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3512         iHtml[iHtml.length]=curY;
5350 25 May 10 nicklas 3513         iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3514         iHtml[iHtml.length]=curWidth;
5350 25 May 10 nicklas 3515         iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3516         iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3517         iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3518       }
5350 25 May 10 nicklas 3519     }
5350 25 May 10 nicklas 3520     
5350 25 May 10 nicklas 3521      polygonDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 3522      return polygonDiv;
5350 25 May 10 nicklas 3523
5350 25 May 10 nicklas 3524         //Internal function: sorting based on xMin
5350 25 May 10 nicklas 3525     function sortXDataArray(a,b)
5350 25 May 10 nicklas 3526     {
5350 25 May 10 nicklas 3527       return a.xMin - b.xMin;
5350 25 May 10 nicklas 3528     }
5350 25 May 10 nicklas 3529   }
5350 25 May 10 nicklas 3530
5350 25 May 10 nicklas 3531     //Draw cubic bezier curve with specified 4 points
5350 25 May 10 nicklas 3532   function drawBezier(pen,points)
5350 25 May 10 nicklas 3533   {
5350 25 May 10 nicklas 3534     //Check arguments for null values
5350 25 May 10 nicklas 3535     if(!pen || !points)
5350 25 May 10 nicklas 3536       return false;
5350 25 May 10 nicklas 3537     
5350 25 May 10 nicklas 3538     var phPoints=new Array();
5350 25 May 10 nicklas 3539     var i;
5350 25 May 10 nicklas 3540     for(i=0;i<points.length;i++)
5350 25 May 10 nicklas 3541     {
5350 25 May 10 nicklas 3542       phPoints[i]=logicalToPhysicalPoint(points[i]);
5350 25 May 10 nicklas 3543     }
5350 25 May 10 nicklas 3544
5350 25 May 10 nicklas 3545         //If no of points more than 4, take only first four points.
5350 25 May 10 nicklas 3546     if(phPoints.length>4)
5350 25 May 10 nicklas 3547     {
5350 25 May 10 nicklas 3548       phPoints=new Array(phPoints[0],phPoints[1],phPoints[2],phPoints[3]);
5350 25 May 10 nicklas 3549     }
5350 25 May 10 nicklas 3550     else if(phPoints.length<4)
5350 25 May 10 nicklas 3551     {
5350 25 May 10 nicklas 3552       return false;
5350 25 May 10 nicklas 3553     }
5350 25 May 10 nicklas 3554       
5350 25 May 10 nicklas 3555     var bezierDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 3556         var iHtml=new Array();
5350 25 May 10 nicklas 3557         
5350 25 May 10 nicklas 3558     var xMin=phPoints[0].x;
5350 25 May 10 nicklas 3559     var xMax=phPoints[0].x;
5350 25 May 10 nicklas 3560     
5350 25 May 10 nicklas 3561     for(i=1;i<phPoints.length;i++)
5350 25 May 10 nicklas 3562     {
5350 25 May 10 nicklas 3563       if(xMin>phPoints[i-1].x)
5350 25 May 10 nicklas 3564       {
5350 25 May 10 nicklas 3565         xMin=phPoints[i-1].x;
5350 25 May 10 nicklas 3566       }
5350 25 May 10 nicklas 3567       if(xMax<phPoints[i-1].x)
5350 25 May 10 nicklas 3568       {
5350 25 May 10 nicklas 3569         xMax=phPoints[i-1].x;
5350 25 May 10 nicklas 3570       }
5350 25 May 10 nicklas 3571     }
5350 25 May 10 nicklas 3572     
5350 25 May 10 nicklas 3573     var p1x,p2x,p3x,p4x,p1y,p2y,p3y,p4y;
5350 25 May 10 nicklas 3574     p1x=phPoints[0].x;
5350 25 May 10 nicklas 3575     p1y=phPoints[0].y;
5350 25 May 10 nicklas 3576
5350 25 May 10 nicklas 3577     p2x=phPoints[1].x;
5350 25 May 10 nicklas 3578     p2y=phPoints[1].y;
5350 25 May 10 nicklas 3579
5350 25 May 10 nicklas 3580     p3x=phPoints[2].x;
5350 25 May 10 nicklas 3581     p3y=phPoints[2].y;
5350 25 May 10 nicklas 3582
5350 25 May 10 nicklas 3583     p4x=phPoints[3].x;
5350 25 May 10 nicklas 3584     p4y=phPoints[3].y;
5350 25 May 10 nicklas 3585
5350 25 May 10 nicklas 3586     var x,y,xB,t;
5350 25 May 10 nicklas 3587     
5350 25 May 10 nicklas 3588     var xl=p1x-1;
5350 25 May 10 nicklas 3589     var yl=p1y-1;
5350 25 May 10 nicklas 3590     var xp,yp;
5350 25 May 10 nicklas 3591     t=0;
5350 25 May 10 nicklas 3592     var f=1;
5350 25 May 10 nicklas 3593     var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 3594     var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 3595     var divWidth=penWidth;
5350 25 May 10 nicklas 3596     var divHeight=penWidth;
5350 25 May 10 nicklas 3597     xp=p1x;
5350 25 May 10 nicklas 3598     yp=p1y;
5350 25 May 10 nicklas 3599     var yStart=false;
5350 25 May 10 nicklas 3600     var xStart=false;
5350 25 May 10 nicklas 3601     var k=1.1;
5350 25 May 10 nicklas 3602     //Array to hold all points on the bezier curve
5350 25 May 10 nicklas 3603     var curvePoints=new Array();
5350 25 May 10 nicklas 3604     
5350 25 May 10 nicklas 3605     var y1,y2,x1,x2;
5350 25 May 10 nicklas 3606     y1=yp;
5350 25 May 10 nicklas 3607     y2=yp;
5350 25 May 10 nicklas 3608     x1=xp;
5350 25 May 10 nicklas 3609     x2=xp;
5350 25 May 10 nicklas 3610
5350 25 May 10 nicklas 3611     while(t<=1)
5350 25 May 10 nicklas 3612     {
5350 25 May 10 nicklas 3613       x=0;
5350 25 May 10 nicklas 3614       y=0;
5350 25 May 10 nicklas 3615       x=(1-t)*(1-t)*(1-t)*p1x + 3*(1-t)*(1-t)*t*p2x + 3*(1-t)*t*t*p3x + t*t*t*p4x;
5350 25 May 10 nicklas 3616       y=(1-t)*(1-t)*(1-t)*p1y + 3*(1-t)*(1-t)*t*p2y + 3*(1-t)*t*t*p3y + t*t*t*p4y;
5350 25 May 10 nicklas 3617       x=Math.round(x);
5350 25 May 10 nicklas 3618       y=Math.round(y);
5350 25 May 10 nicklas 3619
5350 25 May 10 nicklas 3620       if(x!=xl || y!=yl)
5350 25 May 10 nicklas 3621       {
5350 25 May 10 nicklas 3622         if(x-xl>1 || y-yl>1 || xl-x>1 || yl-y>1)
5350 25 May 10 nicklas 3623         {
5350 25 May 10 nicklas 3624           t-=f;
5350 25 May 10 nicklas 3625           f=f/k;
5350 25 May 10 nicklas 3626         }
5350 25 May 10 nicklas 3627         else
5350 25 May 10 nicklas 3628         {
5350 25 May 10 nicklas 3629             curvePoints[curvePoints.length]=new jsPoint(x,y);  
5350 25 May 10 nicklas 3630           xl=x;
5350 25 May 10 nicklas 3631           yl=y;
5350 25 May 10 nicklas 3632         }
5350 25 May 10 nicklas 3633       }
5350 25 May 10 nicklas 3634       else
5350 25 May 10 nicklas 3635       {
5350 25 May 10 nicklas 3636         t-=f;
5350 25 May 10 nicklas 3637         f=f*k;
5350 25 May 10 nicklas 3638       }
5350 25 May 10 nicklas 3639       t+=f;
5350 25 May 10 nicklas 3640     }
5350 25 May 10 nicklas 3641     
5350 25 May 10 nicklas 3642     var isEliminated=new Array();
5350 25 May 10 nicklas 3643     for(var i=0;i<curvePoints.length;i++)
5350 25 May 10 nicklas 3644     {
5350 25 May 10 nicklas 3645         var next=false;
5350 25 May 10 nicklas 3646         x=curvePoints[i].x;
5350 25 May 10 nicklas 3647         y=curvePoints[i].y;
5350 25 May 10 nicklas 3648         
5350 25 May 10 nicklas 3649         //Eliminate extra points disturbing continuity/smoothness
5350 25 May 10 nicklas 3650         if(i!=0 && i+1<curvePoints.length)
5350 25 May 10 nicklas 3651         {
5350 25 May 10 nicklas 3652         if(Math.abs(curvePoints[i-1].x-curvePoints[i+1].x)==1 && Math.abs(curvePoints[i-1].y-curvePoints[i+1].y)==1)
5350 25 May 10 nicklas 3653             {
5350 25 May 10 nicklas 3654                 if(!isEliminated[i-1])
5350 25 May 10 nicklas 3655                 {
5350 25 May 10 nicklas 3656                     next=true;
5350 25 May 10 nicklas 3657                     isEliminated[i]=true;
5350 25 May 10 nicklas 3658                 }
5350 25 May 10 nicklas 3659             }
5350 25 May 10 nicklas 3660         }
5350 25 May 10 nicklas 3661         
5350 25 May 10 nicklas 3662         //Divs optimization
5350 25 May 10 nicklas 3663         if(!next)
5350 25 May 10 nicklas 3664         {
5350 25 May 10 nicklas 3665             if(y==yp && !xStart)
5350 25 May 10 nicklas 3666         {
5350 25 May 10 nicklas 3667           yStart=true;
5350 25 May 10 nicklas 3668         }
5350 25 May 10 nicklas 3669         if(x==xp && !yStart)
5350 25 May 10 nicklas 3670         {
5350 25 May 10 nicklas 3671           xStart=true;
5350 25 May 10 nicklas 3672         }
5350 25 May 10 nicklas 3673         
5350 25 May 10 nicklas 3674         if(x!=xp && !yStart)
5350 25 May 10 nicklas 3675         {
5350 25 May 10 nicklas 3676           if(y2==y1)
5350 25 May 10 nicklas 3677           {
5350 25 May 10 nicklas 3678             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3679             iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 3680             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3681             iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 3682             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3683             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3684             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3685             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3686             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3687             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3688             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3689           }  
5350 25 May 10 nicklas 3690           else
5350 25 May 10 nicklas 3691           {
5350 25 May 10 nicklas 3692               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3693               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 3694               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3695               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 3696               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3697               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3698               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3699               iHtml[iHtml.length]=y2-y1+penWidth;
5350 25 May 10 nicklas 3700               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3701               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3702               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3703           }
5350 25 May 10 nicklas 3704           
5350 25 May 10 nicklas 3705           xp=x;
5350 25 May 10 nicklas 3706           yp=y;
5350 25 May 10 nicklas 3707           y1=yp;
5350 25 May 10 nicklas 3708           y2=yp;
5350 25 May 10 nicklas 3709           
5350 25 May 10 nicklas 3710           xStart=false;
5350 25 May 10 nicklas 3711         }
5350 25 May 10 nicklas 3712         
5350 25 May 10 nicklas 3713         if(y!=yp && !xStart )
5350 25 May 10 nicklas 3714         {
5350 25 May 10 nicklas 3715           if(x2==x1)
5350 25 May 10 nicklas 3716           {
5350 25 May 10 nicklas 3717             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3718             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 3719             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3720             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 3721             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3722             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3723             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3724             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3725             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3726             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3727             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3728           }  
5350 25 May 10 nicklas 3729           else
5350 25 May 10 nicklas 3730           {
5350 25 May 10 nicklas 3731             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3732             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 3733             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3734             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 3735             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3736             iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 3737             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3738             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3739             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3740             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3741             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3742           }  
5350 25 May 10 nicklas 3743
5350 25 May 10 nicklas 3744           xp=x;
5350 25 May 10 nicklas 3745           yp=y;
5350 25 May 10 nicklas 3746           x1=xp;
5350 25 May 10 nicklas 3747           x2=xp;
5350 25 May 10 nicklas 3748           
5350 25 May 10 nicklas 3749           yStart=false;
5350 25 May 10 nicklas 3750         }
5350 25 May 10 nicklas 3751         
5350 25 May 10 nicklas 3752         if(xStart && !yStart)
5350 25 May 10 nicklas 3753         {
5350 25 May 10 nicklas 3754           if(y<=y1)
5350 25 May 10 nicklas 3755           y1=y;
5350 25 May 10 nicklas 3756         
5350 25 May 10 nicklas 3757           if(y>y2)
5350 25 May 10 nicklas 3758           y2=y;
5350 25 May 10 nicklas 3759         }
5350 25 May 10 nicklas 3760         else
5350 25 May 10 nicklas 3761         {
5350 25 May 10 nicklas 3762           y1=y;
5350 25 May 10 nicklas 3763           y2=y;
5350 25 May 10 nicklas 3764         }
5350 25 May 10 nicklas 3765         
5350 25 May 10 nicklas 3766         if(yStart && !xStart)
5350 25 May 10 nicklas 3767         {
5350 25 May 10 nicklas 3768           if(x<=x1)
5350 25 May 10 nicklas 3769           x1=x;
5350 25 May 10 nicklas 3770         
5350 25 May 10 nicklas 3771           if(x>x2)
5350 25 May 10 nicklas 3772           x2=x;
5350 25 May 10 nicklas 3773         }
5350 25 May 10 nicklas 3774         else
5350 25 May 10 nicklas 3775         {
5350 25 May 10 nicklas 3776           x1=x;
5350 25 May 10 nicklas 3777           x2=x;
5350 25 May 10 nicklas 3778         }
5350 25 May 10 nicklas 3779         
5350 25 May 10 nicklas 3780         if(i==curvePoints.length-1) //last step in the loop
5350 25 May 10 nicklas 3781         {
5350 25 May 10 nicklas 3782           if(!xStart)
5350 25 May 10 nicklas 3783           {
5350 25 May 10 nicklas 3784             if(x2==x1)
5350 25 May 10 nicklas 3785             {
5350 25 May 10 nicklas 3786               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3787               iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 3788               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3789               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 3790               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3791               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3792               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3793               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3794               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3795               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3796               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3797             }  
5350 25 May 10 nicklas 3798             else
5350 25 May 10 nicklas 3799             {
5350 25 May 10 nicklas 3800               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3801               iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 3802               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3803               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 3804               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3805               iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 3806               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3807               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3808               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3809               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3810               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3811             }  
5350 25 May 10 nicklas 3812           }
5350 25 May 10 nicklas 3813           if(!yStart)
5350 25 May 10 nicklas 3814           {
5350 25 May 10 nicklas 3815             if(y2==y1)
5350 25 May 10 nicklas 3816             {
5350 25 May 10 nicklas 3817               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3818               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 3819               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3820               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 3821               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3822               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3823               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3824               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3825               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3826               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3827               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3828             }  
5350 25 May 10 nicklas 3829             else
5350 25 May 10 nicklas 3830             {
5350 25 May 10 nicklas 3831               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3832               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 3833               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3834               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 3835               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3836               iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 3837               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3838               iHtml[iHtml.length]=y2-y1+penWidth;
5350 25 May 10 nicklas 3839               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3840               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3841               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 3842             }  
5350 25 May 10 nicklas 3843           }
5350 25 May 10 nicklas 3844         }
5350 25 May 10 nicklas 3845       }    
5350 25 May 10 nicklas 3846     }
5350 25 May 10 nicklas 3847         
5350 25 May 10 nicklas 3848         bezierDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 3849         return bezierDiv;
5350 25 May 10 nicklas 3850   }
5350 25 May 10 nicklas 3851
5350 25 May 10 nicklas 3852     //Draw general (poly) bezier curve with specified points
5350 25 May 10 nicklas 3853   function drawPolyBezier(pen,points)
5350 25 May 10 nicklas 3854   {
5350 25 May 10 nicklas 3855     //Check arguments for null values
5350 25 May 10 nicklas 3856     if(!pen || !points)
5350 25 May 10 nicklas 3857       return false;
5350 25 May 10 nicklas 3858     
5350 25 May 10 nicklas 3859     if(points.length<2)
5350 25 May 10 nicklas 3860     {
5350 25 May 10 nicklas 3861       return false;
5350 25 May 10 nicklas 3862     }
5350 25 May 10 nicklas 3863     
5350 25 May 10 nicklas 3864     var phPoints=new Array();
5350 25 May 10 nicklas 3865     for(var i=0;i<points.length;i++)
5350 25 May 10 nicklas 3866     {
5350 25 May 10 nicklas 3867       phPoints[i]=logicalToPhysicalPoint(points[i]);
5350 25 May 10 nicklas 3868     }
5350 25 May 10 nicklas 3869   
5350 25 May 10 nicklas 3870       var bezierDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 3871         var iHtml=new Array();    
5350 25 May 10 nicklas 3872       
5350 25 May 10 nicklas 3873     var cfx=new Array();
5350 25 May 10 nicklas 3874     var cfy=new Array();
5350 25 May 10 nicklas 3875
5350 25 May 10 nicklas 3876     var n=phPoints.length-1;
5350 25 May 10 nicklas 3877     for(var i=0;i<=n;i++)
5350 25 May 10 nicklas 3878     {
5350 25 May 10 nicklas 3879       cfx[i]= phPoints[i].x*fact(n)/(fact(i)*fact(n-i));
5350 25 May 10 nicklas 3880       cfy[i]= phPoints[i].y*fact(n)/(fact(i)*fact(n-i));
5350 25 May 10 nicklas 3881     }
5350 25 May 10 nicklas 3882     
5350 25 May 10 nicklas 3883     var xl=phPoints[0].x-1;
5350 25 May 10 nicklas 3884     var yl=phPoints[0].y-1;
5350 25 May 10 nicklas 3885     var xp,yp;
7419 03 Nov 17 nicklas 3886     var t=0;
5350 25 May 10 nicklas 3887     var f=1;
5350 25 May 10 nicklas 3888     var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 3889     var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 3890     var divWidth=penWidth;
5350 25 May 10 nicklas 3891     var divHeight=penWidth;
5350 25 May 10 nicklas 3892     xp=phPoints[0].x;
5350 25 May 10 nicklas 3893     yp=phPoints[0].y;
5350 25 May 10 nicklas 3894     var yStart=false;
5350 25 May 10 nicklas 3895     var xStart=false;
5350 25 May 10 nicklas 3896     var divCount=0;
5350 25 May 10 nicklas 3897     var res;
5350 25 May 10 nicklas 3898     var fct=0;
5350 25 May 10 nicklas 3899     var x;
5350 25 May 10 nicklas 3900     var y;
5350 25 May 10 nicklas 3901     var j;
5350 25 May 10 nicklas 3902     var xd,yd;
5350 25 May 10 nicklas 3903     var k=1.1;
5350 25 May 10 nicklas 3904     //Array to hold all points on the bezier curve
5350 25 May 10 nicklas 3905     var curvePoints=new Array();
5350 25 May 10 nicklas 3906     
5350 25 May 10 nicklas 3907     var y1,y2,x1,x2;
5350 25 May 10 nicklas 3908     y1=yp;
5350 25 May 10 nicklas 3909     y2=yp;
5350 25 May 10 nicklas 3910     x1=xp;
5350 25 May 10 nicklas 3911     x2=xp;
5350 25 May 10 nicklas 3912         
5350 25 May 10 nicklas 3913     while(t<=1)
5350 25 May 10 nicklas 3914     {
5350 25 May 10 nicklas 3915       x=0;
5350 25 May 10 nicklas 3916       y=0;
5350 25 May 10 nicklas 3917             
5350 25 May 10 nicklas 3918       for(var i=0;i<=n;i++)
5350 25 May 10 nicklas 3919       {
5350 25 May 10 nicklas 3920         fct=Math.pow(1-t,n-i)*Math.pow(t,i);
5350 25 May 10 nicklas 3921         x= x + cfx[i]*fct;
5350 25 May 10 nicklas 3922         y= y + cfy[i]*fct;
5350 25 May 10 nicklas 3923       }
5350 25 May 10 nicklas 3924       var xd;
5350 25 May 10 nicklas 3925       var yd;
5350 25 May 10 nicklas 3926       xd=x;
5350 25 May 10 nicklas 3927       yd=y;
5350 25 May 10 nicklas 3928       x=Math.round(x);
5350 25 May 10 nicklas 3929       y=Math.round(y);
5350 25 May 10 nicklas 3930       
5350 25 May 10 nicklas 3931       if(x!=xl || y!=yl)
5350 25 May 10 nicklas 3932       {
5350 25 May 10 nicklas 3933           if(x-xl >1 || y-yl>1 || xl-x>1 || yl-y>1)
5350 25 May 10 nicklas 3934         {
5350 25 May 10 nicklas 3935             t-=f;
5350 25 May 10 nicklas 3936             f=f/k;
5350 25 May 10 nicklas 3937         }
5350 25 May 10 nicklas 3938         else
5350 25 May 10 nicklas 3939         {
5350 25 May 10 nicklas 3940             curvePoints[curvePoints.length]=new jsPoint(x,y);  
5350 25 May 10 nicklas 3941           xl=x;
5350 25 May 10 nicklas 3942           yl=y;
5350 25 May 10 nicklas 3943         }
5350 25 May 10 nicklas 3944       }
5350 25 May 10 nicklas 3945       else
5350 25 May 10 nicklas 3946       {
5350 25 May 10 nicklas 3947           t-=f;
5350 25 May 10 nicklas 3948         f=f*k;
5350 25 May 10 nicklas 3949       }
5350 25 May 10 nicklas 3950       t+=f;
5350 25 May 10 nicklas 3951       }
5350 25 May 10 nicklas 3952             
5350 25 May 10 nicklas 3953     var isEliminated=new Array();
5350 25 May 10 nicklas 3954     for(var i=0;i<curvePoints.length;i++)
5350 25 May 10 nicklas 3955     {
5350 25 May 10 nicklas 3956         var next=false;
5350 25 May 10 nicklas 3957         x=curvePoints[i].x;
5350 25 May 10 nicklas 3958         y=curvePoints[i].y;
5350 25 May 10 nicklas 3959         
5350 25 May 10 nicklas 3960         //Eliminate extra points disturbing continuity/smoothness
5350 25 May 10 nicklas 3961         if(i!=0 && i+1<curvePoints.length)
5350 25 May 10 nicklas 3962         {
5350 25 May 10 nicklas 3963             if(Math.abs(curvePoints[i-1].x-curvePoints[i+1].x)==1 && Math.abs(curvePoints[i-1].y-curvePoints[i+1].y)==1)
5350 25 May 10 nicklas 3964             {
5350 25 May 10 nicklas 3965                 if(!isEliminated[i-1])
5350 25 May 10 nicklas 3966                 {
5350 25 May 10 nicklas 3967                     next=true;
5350 25 May 10 nicklas 3968                     isEliminated[i]=true;
5350 25 May 10 nicklas 3969                 }
5350 25 May 10 nicklas 3970             }
5350 25 May 10 nicklas 3971         }
5350 25 May 10 nicklas 3972         
5350 25 May 10 nicklas 3973         //Divs optimization        
5350 25 May 10 nicklas 3974         if(!next)
5350 25 May 10 nicklas 3975         {
5350 25 May 10 nicklas 3976             if(y==yp && !xStart)
5350 25 May 10 nicklas 3977         {
5350 25 May 10 nicklas 3978           yStart=true;
5350 25 May 10 nicklas 3979         }
5350 25 May 10 nicklas 3980         if(x==xp && !yStart)
5350 25 May 10 nicklas 3981         {
5350 25 May 10 nicklas 3982           xStart=true;
5350 25 May 10 nicklas 3983         }
5350 25 May 10 nicklas 3984         
5350 25 May 10 nicklas 3985         if(x!=xp && !yStart)
5350 25 May 10 nicklas 3986         {
5350 25 May 10 nicklas 3987           if(y2==y1)
5350 25 May 10 nicklas 3988           {
5350 25 May 10 nicklas 3989             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 3990             iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 3991             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 3992             iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 3993             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 3994             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3995             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 3996             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 3997             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 3998             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 3999             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4000           }  
5350 25 May 10 nicklas 4001           else
5350 25 May 10 nicklas 4002           {
5350 25 May 10 nicklas 4003               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4004               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4005               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4006               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4007               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4008               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4009               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4010               iHtml[iHtml.length]=y2-y1+penWidth;
5350 25 May 10 nicklas 4011               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4012               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4013               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4014           }    
5350 25 May 10 nicklas 4015
5350 25 May 10 nicklas 4016           xp=x;
5350 25 May 10 nicklas 4017           yp=y;
5350 25 May 10 nicklas 4018           y1=yp;
5350 25 May 10 nicklas 4019           y2=yp;
5350 25 May 10 nicklas 4020           
5350 25 May 10 nicklas 4021           xStart=false;
5350 25 May 10 nicklas 4022         }
5350 25 May 10 nicklas 4023         
5350 25 May 10 nicklas 4024         if(y!=yp && !xStart )
5350 25 May 10 nicklas 4025         {
5350 25 May 10 nicklas 4026           if(x2==x1)
5350 25 May 10 nicklas 4027           {
5350 25 May 10 nicklas 4028             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4029             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4030             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4031             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4032             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4033             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4034             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4035             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4036             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4037             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4038             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4039           }  
5350 25 May 10 nicklas 4040           else
5350 25 May 10 nicklas 4041           {
5350 25 May 10 nicklas 4042             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4043             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4044             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4045             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4046             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4047             iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 4048             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4049             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4050             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4051             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4052             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4053           }  
5350 25 May 10 nicklas 4054
5350 25 May 10 nicklas 4055           xp=x;
5350 25 May 10 nicklas 4056           yp=y;
5350 25 May 10 nicklas 4057           x1=xp;
5350 25 May 10 nicklas 4058           x2=xp;
5350 25 May 10 nicklas 4059           
5350 25 May 10 nicklas 4060           yStart=false;
5350 25 May 10 nicklas 4061         }
5350 25 May 10 nicklas 4062         
5350 25 May 10 nicklas 4063         if(xStart && !yStart)
5350 25 May 10 nicklas 4064         {
5350 25 May 10 nicklas 4065           if(y<=y1)
5350 25 May 10 nicklas 4066           y1=y;
5350 25 May 10 nicklas 4067         
5350 25 May 10 nicklas 4068           if(y>y2)
5350 25 May 10 nicklas 4069           y2=y;
5350 25 May 10 nicklas 4070         }
5350 25 May 10 nicklas 4071         else
5350 25 May 10 nicklas 4072         {
5350 25 May 10 nicklas 4073           y1=y;
5350 25 May 10 nicklas 4074           y2=y;
5350 25 May 10 nicklas 4075         }
5350 25 May 10 nicklas 4076         
5350 25 May 10 nicklas 4077         if(yStart && !xStart)
5350 25 May 10 nicklas 4078         {
5350 25 May 10 nicklas 4079           if(x<=x1)
5350 25 May 10 nicklas 4080           x1=x;
5350 25 May 10 nicklas 4081         
5350 25 May 10 nicklas 4082           if(x>x2)
5350 25 May 10 nicklas 4083           x2=x;
5350 25 May 10 nicklas 4084         }
5350 25 May 10 nicklas 4085         else
5350 25 May 10 nicklas 4086         {
5350 25 May 10 nicklas 4087           x1=x;
5350 25 May 10 nicklas 4088           x2=x;
5350 25 May 10 nicklas 4089         }
5350 25 May 10 nicklas 4090         
5350 25 May 10 nicklas 4091         if(i==curvePoints.length-1) //last step in the loop
5350 25 May 10 nicklas 4092         {
5350 25 May 10 nicklas 4093           if(!xStart)
5350 25 May 10 nicklas 4094           {
5350 25 May 10 nicklas 4095             if(x2==x1)
5350 25 May 10 nicklas 4096             {
5350 25 May 10 nicklas 4097               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4098               iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4099               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4100               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4101               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4102               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4103               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4104               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4105               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4106               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4107               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4108             }  
5350 25 May 10 nicklas 4109             else
5350 25 May 10 nicklas 4110             {
5350 25 May 10 nicklas 4111               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4112               iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4113               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4114               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4115               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4116               iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 4117               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4118               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4119               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4120               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4121               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4122             }  
5350 25 May 10 nicklas 4123           }
5350 25 May 10 nicklas 4124           if(!yStart)
5350 25 May 10 nicklas 4125           {
5350 25 May 10 nicklas 4126             if(y2==y1)
5350 25 May 10 nicklas 4127             {
5350 25 May 10 nicklas 4128               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4129               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4130               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4131               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4132               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4133               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4134               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4135               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4136               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4137               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4138               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4139             }  
5350 25 May 10 nicklas 4140             else
5350 25 May 10 nicklas 4141             {
5350 25 May 10 nicklas 4142               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4143               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4144               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4145               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4146               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4147               iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 4148               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4149               iHtml[iHtml.length]=y2-y1+penWidth;
5350 25 May 10 nicklas 4150               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4151               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4152               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4153             }  
5350 25 May 10 nicklas 4154           }
5350 25 May 10 nicklas 4155         }
5350 25 May 10 nicklas 4156       }    
5350 25 May 10 nicklas 4157     }
5350 25 May 10 nicklas 4158
5350 25 May 10 nicklas 4159         bezierDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 4160         return bezierDiv;
5350 25 May 10 nicklas 4161         
5350 25 May 10 nicklas 4162         //Internal factorial function
5350 25 May 10 nicklas 4163     function fact(n)
5350 25 May 10 nicklas 4164     {
5350 25 May 10 nicklas 4165       var res = 1;
5350 25 May 10 nicklas 4166       for(var i=1;i<= n;i++)
5350 25 May 10 nicklas 4167           {
5350 25 May 10 nicklas 4168             res =res * i;
5350 25 May 10 nicklas 4169         }
5350 25 May 10 nicklas 4170         return res;
5350 25 May 10 nicklas 4171     }
5350 25 May 10 nicklas 4172   }
5350 25 May 10 nicklas 4173
5350 25 May 10 nicklas 4174     //Draw closed curve passing through the give points with specified tension
5350 25 May 10 nicklas 4175     //This method just calls drawCurve method with parameter isClosed=true
5350 25 May 10 nicklas 4176     function drawClosedCurve(pen,points,tension) 
5350 25 May 10 nicklas 4177   {
5350 25 May 10 nicklas 4178     return this.drawCurve(pen,points,tension,true); 
5350 25 May 10 nicklas 4179   }
5350 25 May 10 nicklas 4180
5350 25 May 10 nicklas 4181     //Draw curve passing through the give points with specified tension
5350 25 May 10 nicklas 4182   function drawCurve(pen,points,tension,isClosed) 
5350 25 May 10 nicklas 4183   {
5350 25 May 10 nicklas 4184     if(!pen || !points)
5350 25 May 10 nicklas 4185       return false;
5350 25 May 10 nicklas 4186       
5350 25 May 10 nicklas 4187     if(!tension)
5350 25 May 10 nicklas 4188     {
5350 25 May 10 nicklas 4189       tension=0;
5350 25 May 10 nicklas 4190     }
5350 25 May 10 nicklas 4191     if(!isClosed)
5350 25 May 10 nicklas 4192     {
5350 25 May 10 nicklas 4193       isClosed=false;
5350 25 May 10 nicklas 4194     }
5350 25 May 10 nicklas 4195
5350 25 May 10 nicklas 4196     var phPoints=new Array();
5350 25 May 10 nicklas 4197     for(var i=0;i<points.length;i++)
5350 25 May 10 nicklas 4198     {
5350 25 May 10 nicklas 4199       phPoints[i]=logicalToPhysicalPoint(points[i]);
5350 25 May 10 nicklas 4200     }
5350 25 May 10 nicklas 4201     
5350 25 May 10 nicklas 4202     var newPoints=new Array();
5350 25 May 10 nicklas 4203
5350 25 May 10 nicklas 4204        //Remove duplicate consecutive points (ToDo: neccessity of this step is to be confirmed)    
5350 25 May 10 nicklas 4205         if(!isClosed || !(phPoints[0].x==phPoints[phPoints.length-1].x && phPoints[0].y==phPoints[phPoints.length-1].y))
5350 25 May 10 nicklas 4206         {
5350 25 May 10 nicklas 4207             newPoints[newPoints.length]=phPoints[0];  
5350 25 May 10 nicklas 4208         }  
5350 25 May 10 nicklas 4209
5350 25 May 10 nicklas 4210     for(var i=1;i<phPoints.length;i++)
5350 25 May 10 nicklas 4211     {
5350 25 May 10 nicklas 4212         if(!(phPoints[i].x==phPoints[i-1].x && phPoints[i].y==phPoints[i-1].y))
5350 25 May 10 nicklas 4213         {
5350 25 May 10 nicklas 4214             newPoints[newPoints.length]=phPoints[i];  
5350 25 May 10 nicklas 4215         }   
5350 25 May 10 nicklas 4216     }
5350 25 May 10 nicklas 4217         phPoints=newPoints;
5350 25 May 10 nicklas 4218         
5350 25 May 10 nicklas 4219         if(phPoints.length<2)
5350 25 May 10 nicklas 4220     {
5350 25 May 10 nicklas 4221       return false;
5350 25 May 10 nicklas 4222     }
5350 25 May 10 nicklas 4223     else if(phPoints.length==2)
5350 25 May 10 nicklas 4224     {
5350 25 May 10 nicklas 4225         //For 2 points just draw a line connecting them.
5350 25 May 10 nicklas 4226       return this.drawLine(pen,phPoints[0],phPoints[1],"physical");
5350 25 May 10 nicklas 4227     }
5350 25 May 10 nicklas 4228
5350 25 May 10 nicklas 4229       var curveDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 4230         var iHtml=new Array();
5350 25 May 10 nicklas 4231         //Array to hold points on the curve
5350 25 May 10 nicklas 4232     var curvePoints=new Array();
5350 25 May 10 nicklas 4233     
5350 25 May 10 nicklas 4234     var n=phPoints.length-1;
5350 25 May 10 nicklas 4235     //Call drawCurveSeg method in loop to get points in curvePoints 
5350 25 May 10 nicklas 4236     //array for segment (connecting 2 points) of the curve. 
5350 25 May 10 nicklas 4237     if(!isClosed) //for open curve
5350 25 May 10 nicklas 4238     {  
5350 25 May 10 nicklas 4239       for(var i=0;i<=n-1;i++)
5350 25 May 10 nicklas 4240       {
5350 25 May 10 nicklas 4241         if(i==0)
5350 25 May 10 nicklas 4242         {
5350 25 May 10 nicklas 4243           drawCurveSeg(new Array(phPoints[0],phPoints[0],phPoints[1],phPoints[2]),tension,curvePoints);
5350 25 May 10 nicklas 4244         }
5350 25 May 10 nicklas 4245         else if(i==n-1)
5350 25 May 10 nicklas 4246         {
5350 25 May 10 nicklas 4247           drawCurveSeg(new Array(phPoints[n-2],phPoints[n-1],phPoints[n],phPoints[n]),tension,curvePoints);
5350 25 May 10 nicklas 4248         }
5350 25 May 10 nicklas 4249         else
5350 25 May 10 nicklas 4250         {
5350 25 May 10 nicklas 4251           drawCurveSeg(new Array(phPoints[i-1],phPoints[i],phPoints[i+1],phPoints[i+2]),tension,curvePoints);
5350 25 May 10 nicklas 4252         }
5350 25 May 10 nicklas 4253       }
5350 25 May 10 nicklas 4254       //Actual drawing using points data in curvePoints array
5350 25 May 10 nicklas 4255       drawAllCurvePoints(pen,curvePoints,iHtml);
5350 25 May 10 nicklas 4256     }
5350 25 May 10 nicklas 4257     else //for closed curve
5350 25 May 10 nicklas 4258     {
5350 25 May 10 nicklas 4259       for(var i=0;i<=n-1;i++)
5350 25 May 10 nicklas 4260       {
5350 25 May 10 nicklas 4261         if(i==0)
5350 25 May 10 nicklas 4262         {
5350 25 May 10 nicklas 4263           drawCurveSeg(new Array(phPoints[n],phPoints[0],phPoints[1],phPoints[2]),tension,curvePoints);
5350 25 May 10 nicklas 4264         }
5350 25 May 10 nicklas 4265         else if(i==n-1)
5350 25 May 10 nicklas 4266         {
5350 25 May 10 nicklas 4267           drawCurveSeg(new Array(phPoints[n-2],phPoints[n-1],phPoints[n],phPoints[0]),tension,curvePoints);
5350 25 May 10 nicklas 4268         }
5350 25 May 10 nicklas 4269         else
5350 25 May 10 nicklas 4270         {
5350 25 May 10 nicklas 4271           drawCurveSeg(new Array(phPoints[i-1],phPoints[i],phPoints[i+1],phPoints[i+2]),tension,curvePoints);
5350 25 May 10 nicklas 4272         }
5350 25 May 10 nicklas 4273       }
5350 25 May 10 nicklas 4274       drawCurveSeg(new Array(phPoints[n-1],phPoints[n],phPoints[0],phPoints[1]),tension,curvePoints);
5350 25 May 10 nicklas 4275       //Actual drawing using points data in curvePoints array
5350 25 May 10 nicklas 4276       drawAllCurvePoints(pen,curvePoints,iHtml);
5350 25 May 10 nicklas 4277     }
5350 25 May 10 nicklas 4278             
5350 25 May 10 nicklas 4279     curveDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 4280     return curveDiv;
5350 25 May 10 nicklas 4281   }
5350 25 May 10 nicklas 4282
5350 25 May 10 nicklas 4283     //Private function used by drawCurve method to get curve points 
5350 25 May 10 nicklas 4284     //(in curvePoints array) for a single curve segment (connecting 2 points)
5350 25 May 10 nicklas 4285   function drawCurveSeg(segPoints,tension,curvePoints)
5350 25 May 10 nicklas 4286   {
5350 25 May 10 nicklas 4287     var x=0;
5350 25 May 10 nicklas 4288     var y=0;
5350 25 May 10 nicklas 4289     var xl=segPoints[1].x-1;
5350 25 May 10 nicklas 4290     var yl=segPoints[1].y-1;
5350 25 May 10 nicklas 4291
5350 25 May 10 nicklas 4292     var  t=0;
5350 25 May 10 nicklas 4293     var f=1;
5350 25 May 10 nicklas 4294     var k=1.1;
5350 25 May 10 nicklas 4295
5350 25 May 10 nicklas 4296     var m1x=(1-tension)*(segPoints[2].x-segPoints[0].x)/2;
5350 25 May 10 nicklas 4297     var m2x=(1-tension)*(segPoints[3].x-segPoints[1].x)/2;
5350 25 May 10 nicklas 4298
5350 25 May 10 nicklas 4299     var m1y=(1-tension)*(segPoints[2].y-segPoints[0].y)/2;
5350 25 May 10 nicklas 4300     var m2y=(1-tension)*(segPoints[3].y-segPoints[1].y)/2;
5350 25 May 10 nicklas 4301     
5350 25 May 10 nicklas 4302     while(t<=1)
5350 25 May 10 nicklas 4303     {
5350 25 May 10 nicklas 4304       x=0;
5350 25 May 10 nicklas 4305       y=0;
5350 25 May 10 nicklas 4306
5350 25 May 10 nicklas 4307       x= (2*t*t*t-3*t*t+1)*segPoints[1].x + (t*t*t-2*t*t+t)*m1x + (-2*t*t*t+3*t*t)*segPoints[2].x + (t*t*t-t*t)*m2x;
5350 25 May 10 nicklas 4308       y= (2*t*t*t-3*t*t+1)*segPoints[1].y + (t*t*t-2*t*t+t)*m1y + (-2*t*t*t+3*t*t)*segPoints[2].y + (t*t*t-t*t)*m2y;
5350 25 May 10 nicklas 4309         
5350 25 May 10 nicklas 4310       x=Math.round(x);
5350 25 May 10 nicklas 4311       y=Math.round(y);
5350 25 May 10 nicklas 4312
5350 25 May 10 nicklas 4313       if(x!=xl || y!=yl)
5350 25 May 10 nicklas 4314       {
5350 25 May 10 nicklas 4315         if(x-xl>1 || y-yl>1 || xl-x>1 || yl-y>1)
5350 25 May 10 nicklas 4316         {
5350 25 May 10 nicklas 4317           t-=f;
5350 25 May 10 nicklas 4318           f=f/k;
5350 25 May 10 nicklas 4319         }
5350 25 May 10 nicklas 4320         else
5350 25 May 10 nicklas 4321         {
5350 25 May 10 nicklas 4322                   curvePoints[curvePoints.length]=new jsPoint(x,y); 
5350 25 May 10 nicklas 4323           xl=x;
5350 25 May 10 nicklas 4324           yl=y;
5350 25 May 10 nicklas 4325                   if(t+f>1)
5350 25 May 10 nicklas 4326                       t=1-f;
5350 25 May 10 nicklas 4327         }
5350 25 May 10 nicklas 4328       }
5350 25 May 10 nicklas 4329       else
5350 25 May 10 nicklas 4330       {
5350 25 May 10 nicklas 4331         f=f*k;
5350 25 May 10 nicklas 4332       }
5350 25 May 10 nicklas 4333       t+=f;
5350 25 May 10 nicklas 4334     }
5350 25 May 10 nicklas 4335   }
5350 25 May 10 nicklas 4336     
5350 25 May 10 nicklas 4337   //Private function used by drawCurve method to draw actual curve
5350 25 May 10 nicklas 4338   //using and processing points data in curvePoints array
5350 25 May 10 nicklas 4339   function drawAllCurvePoints(pen,curvePoints,iHtml)
5350 25 May 10 nicklas 4340   {
5350 25 May 10 nicklas 4341   var xp=curvePoints[0].x;
5350 25 May 10 nicklas 4342   var yp=curvePoints[0].y;
5350 25 May 10 nicklas 4343
5350 25 May 10 nicklas 4344   var yStart=false;
5350 25 May 10 nicklas 4345   var xStart=false;
5350 25 May 10 nicklas 4346
5350 25 May 10 nicklas 4347   var x1,x2,y1,y2;
5350 25 May 10 nicklas 4348   x1=xp;
5350 25 May 10 nicklas 4349   x2=xp;
5350 25 May 10 nicklas 4350   y1=yp;
5350 25 May 10 nicklas 4351   y2=yp;
5350 25 May 10 nicklas 4352
5350 25 May 10 nicklas 4353         
5350 25 May 10 nicklas 4354   var penWidth=parseInt(pen.width);
5350 25 May 10 nicklas 4355   var hexColor=pen.color.getHex();
5350 25 May 10 nicklas 4356   var divWidth=penWidth;
5350 25 May 10 nicklas 4357   var divHeight=penWidth;
5350 25 May 10 nicklas 4358
5350 25 May 10 nicklas 4359   var isEliminated=new Array();
5350 25 May 10 nicklas 4360   for(var i=0;i<curvePoints.length;i++)
5350 25 May 10 nicklas 4361   {
5350 25 May 10 nicklas 4362       var next=false;
7419 03 Nov 17 nicklas 4363       var x=curvePoints[i].x;
7419 03 Nov 17 nicklas 4364       var y=curvePoints[i].y;
5350 25 May 10 nicklas 4365       
5350 25 May 10 nicklas 4366       //Eliminate extra points disturbing continuity/smoothness
5350 25 May 10 nicklas 4367       if(i!=0 && i+1<curvePoints.length)
5350 25 May 10 nicklas 4368       {
5350 25 May 10 nicklas 4369         if(Math.abs(curvePoints[i-1].x-curvePoints[i+1].x)==1 && Math.abs(curvePoints[i-1].y-curvePoints[i+1].y)==1)
5350 25 May 10 nicklas 4370           {
5350 25 May 10 nicklas 4371               if(!isEliminated[i-1])
5350 25 May 10 nicklas 4372               {
5350 25 May 10 nicklas 4373                   next=true;
5350 25 May 10 nicklas 4374                   isEliminated[i]=true;
5350 25 May 10 nicklas 4375               }
5350 25 May 10 nicklas 4376           }
5350 25 May 10 nicklas 4377       }
5350 25 May 10 nicklas 4378
5350 25 May 10 nicklas 4379         //Divs optimization      
5350 25 May 10 nicklas 4380       if(!next)
5350 25 May 10 nicklas 4381       {
5350 25 May 10 nicklas 4382             if(y==yp && !xStart)
5350 25 May 10 nicklas 4383         {
5350 25 May 10 nicklas 4384           yStart=true;
5350 25 May 10 nicklas 4385         }
5350 25 May 10 nicklas 4386         if(x==xp && !yStart)
5350 25 May 10 nicklas 4387         {
5350 25 May 10 nicklas 4388           xStart=true;
5350 25 May 10 nicklas 4389         }
5350 25 May 10 nicklas 4390         
5350 25 May 10 nicklas 4391         if(x!=xp && !yStart)
5350 25 May 10 nicklas 4392         {
5350 25 May 10 nicklas 4393           if(y2==y1)
5350 25 May 10 nicklas 4394           {
5350 25 May 10 nicklas 4395             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:"
5350 25 May 10 nicklas 4396             iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4397             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4398             iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4399             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4400             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4401             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4402             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4403             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4404             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4405             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4406           }  
5350 25 May 10 nicklas 4407           else
5350 25 May 10 nicklas 4408           {
5350 25 May 10 nicklas 4409               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4410               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4411               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4412               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4413               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4414               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4415               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4416               iHtml[iHtml.length]=y2-y1+penWidth;
5350 25 May 10 nicklas 4417               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4418               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4419               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4420           }    
5350 25 May 10 nicklas 4421
5350 25 May 10 nicklas 4422           xp=x;
5350 25 May 10 nicklas 4423           yp=y;
5350 25 May 10 nicklas 4424           y1=yp;
5350 25 May 10 nicklas 4425           y2=yp;
5350 25 May 10 nicklas 4426           
5350 25 May 10 nicklas 4427           xStart=false;
5350 25 May 10 nicklas 4428         }
5350 25 May 10 nicklas 4429         
5350 25 May 10 nicklas 4430         if(y!=yp && !xStart )
5350 25 May 10 nicklas 4431         {
5350 25 May 10 nicklas 4432           if(x2==x1)
5350 25 May 10 nicklas 4433           {
5350 25 May 10 nicklas 4434             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4435             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4436             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4437             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4438             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4439             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4440             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4441             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4442             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4443             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4444             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4445           }  
5350 25 May 10 nicklas 4446           else
5350 25 May 10 nicklas 4447           {
5350 25 May 10 nicklas 4448             iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4449             iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4450             iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4451             iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4452             iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4453             iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 4454             iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4455             iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4456             iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4457             iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4458             iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4459           }
5350 25 May 10 nicklas 4460           xp=x;
5350 25 May 10 nicklas 4461           yp=y;
5350 25 May 10 nicklas 4462           x1=xp;
5350 25 May 10 nicklas 4463           x2=xp;
5350 25 May 10 nicklas 4464           
5350 25 May 10 nicklas 4465           yStart=false;
5350 25 May 10 nicklas 4466         }
5350 25 May 10 nicklas 4467         
5350 25 May 10 nicklas 4468         if(xStart && !yStart)
5350 25 May 10 nicklas 4469         {
5350 25 May 10 nicklas 4470           if(y<=y1)
5350 25 May 10 nicklas 4471           y1=y;
5350 25 May 10 nicklas 4472         
5350 25 May 10 nicklas 4473           if(y>y2)
5350 25 May 10 nicklas 4474           y2=y;
5350 25 May 10 nicklas 4475         }
5350 25 May 10 nicklas 4476         else
5350 25 May 10 nicklas 4477         {
5350 25 May 10 nicklas 4478           y1=y;
5350 25 May 10 nicklas 4479           y2=y;
5350 25 May 10 nicklas 4480         }
5350 25 May 10 nicklas 4481         
5350 25 May 10 nicklas 4482         if(yStart && !xStart)
5350 25 May 10 nicklas 4483         {
5350 25 May 10 nicklas 4484           if(x<=x1)
5350 25 May 10 nicklas 4485           x1=x;
5350 25 May 10 nicklas 4486         
5350 25 May 10 nicklas 4487           if(x>x2)
5350 25 May 10 nicklas 4488           x2=x;
5350 25 May 10 nicklas 4489         }
5350 25 May 10 nicklas 4490         else
5350 25 May 10 nicklas 4491         {
5350 25 May 10 nicklas 4492           x1=x;
5350 25 May 10 nicklas 4493           x2=x;
5350 25 May 10 nicklas 4494         }
5350 25 May 10 nicklas 4495         
5350 25 May 10 nicklas 4496         if(i==curvePoints.length-1) //last step in the loop
5350 25 May 10 nicklas 4497         {
5350 25 May 10 nicklas 4498           if(!xStart)
5350 25 May 10 nicklas 4499           {
5350 25 May 10 nicklas 4500             if(x2==x1)
5350 25 May 10 nicklas 4501             {
5350 25 May 10 nicklas 4502               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4503               iHtml[iHtml.length]=x1;
5350 25 May 10 nicklas 4504               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4505               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4506               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4507               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4508               iHtml[iHtml.length]="px;height:";
5350 25 May 10 nicklas 4509               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4510               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4511               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4512               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4513             }  
5350 25 May 10 nicklas 4514             else
5350 25 May 10 nicklas 4515             {
5350 25 May 10 nicklas 4516               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:"; 
5350 25 May 10 nicklas 4517               iHtml[iHtml.length]=x1; 
5350 25 May 10 nicklas 4518               iHtml[iHtml.length]="px;top:"; 
5350 25 May 10 nicklas 4519               iHtml[iHtml.length]=yp;
5350 25 May 10 nicklas 4520               iHtml[iHtml.length]="px;width:"; 
5350 25 May 10 nicklas 4521               iHtml[iHtml.length]=x2-x1+penWidth; 
5350 25 May 10 nicklas 4522               iHtml[iHtml.length]="px;height:"; 
5350 25 May 10 nicklas 4523               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4524               iHtml[iHtml.length]="px;background-color:"; 
5350 25 May 10 nicklas 4525               iHtml[iHtml.length]=hexColor; 
5350 25 May 10 nicklas 4526               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4527             }  
5350 25 May 10 nicklas 4528           }
5350 25 May 10 nicklas 4529           if(!yStart)
5350 25 May 10 nicklas 4530           {
5350 25 May 10 nicklas 4531             if(y2==y1)
5350 25 May 10 nicklas 4532             {
5350 25 May 10 nicklas 4533               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4534               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4535               iHtml[iHtml.length]="px;top:"; 
5350 25 May 10 nicklas 4536               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4537               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4538               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4539               iHtml[iHtml.length]="px;height:"; 
5350 25 May 10 nicklas 4540               iHtml[iHtml.length]=penWidth;
5350 25 May 10 nicklas 4541               iHtml[iHtml.length]="px;background-color:"; 
5350 25 May 10 nicklas 4542               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4543               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4544             }  
5350 25 May 10 nicklas 4545             else
5350 25 May 10 nicklas 4546             {
5350 25 May 10 nicklas 4547               iHtml[iHtml.length]="<DIV style=\"position:absolute;overflow:hidden;left:";
5350 25 May 10 nicklas 4548               iHtml[iHtml.length]=xp;
5350 25 May 10 nicklas 4549               iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4550               iHtml[iHtml.length]=y1;
5350 25 May 10 nicklas 4551               iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4552               iHtml[iHtml.length]=x2-x1+penWidth;
5350 25 May 10 nicklas 4553               iHtml[iHtml.length]="px;height:"; 
5350 25 May 10 nicklas 4554               iHtml[iHtml.length]=y2-y1+penWidth; 
5350 25 May 10 nicklas 4555               iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4556               iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4557               iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4558             }  
5350 25 May 10 nicklas 4559           }
5350 25 May 10 nicklas 4560         }
5350 25 May 10 nicklas 4561       }  
5350 25 May 10 nicklas 4562     }    
5350 25 May 10 nicklas 4563   }
5350 25 May 10 nicklas 4564     
5350 25 May 10 nicklas 4565   //Draw color filled closed curve passing through the specified points 
5350 25 May 10 nicklas 4566   //with specified tension
5350 25 May 10 nicklas 4567   function fillClosedCurve(color,points,tension)
5350 25 May 10 nicklas 4568   {
5350 25 May 10 nicklas 4569     if(!color || !points)
5350 25 May 10 nicklas 4570       return false;
5350 25 May 10 nicklas 4571       
5350 25 May 10 nicklas 4572     if(!tension)
5350 25 May 10 nicklas 4573     {
5350 25 May 10 nicklas 4574       tension=0;
5350 25 May 10 nicklas 4575     }
5350 25 May 10 nicklas 4576     
5350 25 May 10 nicklas 4577     var phPoints=new Array();
5350 25 May 10 nicklas 4578     for(var i=0;i<points.length;i++)
5350 25 May 10 nicklas 4579     {
5350 25 May 10 nicklas 4580       phPoints[i]=logicalToPhysicalPoint(points[i]);
5350 25 May 10 nicklas 4581     }
5350 25 May 10 nicklas 4582     
5350 25 May 10 nicklas 4583     //Remove duplicate consecutive points (ToDo: neccessity of this step is to be confirmed)
5350 25 May 10 nicklas 4584     var newPoints=new Array();
5350 25 May 10 nicklas 4585       if(!(phPoints[0].x==phPoints[phPoints.length-1].x && phPoints[0].y==phPoints[phPoints.length-1].y))
5350 25 May 10 nicklas 4586       {
5350 25 May 10 nicklas 4587           newPoints[newPoints.length]=phPoints[0];  
5350 25 May 10 nicklas 4588       }   
5350 25 May 10 nicklas 4589
5350 25 May 10 nicklas 4590     for(var i=1;i<phPoints.length;i++)
5350 25 May 10 nicklas 4591     {
5350 25 May 10 nicklas 4592         if(!(phPoints[i].x==phPoints[i-1].x && phPoints[i].y==phPoints[i-1].y))
5350 25 May 10 nicklas 4593         {
5350 25 May 10 nicklas 4594             newPoints[newPoints.length]=phPoints[i];  
5350 25 May 10 nicklas 4595         }   
5350 25 May 10 nicklas 4596     }
5350 25 May 10 nicklas 4597         phPoints=newPoints;
5350 25 May 10 nicklas 4598         
5350 25 May 10 nicklas 4599         if(phPoints.length<2)
5350 25 May 10 nicklas 4600     {
5350 25 May 10 nicklas 4601       return false;
5350 25 May 10 nicklas 4602     }
5350 25 May 10 nicklas 4603     else if(phPoints.length==2)
5350 25 May 10 nicklas 4604     {
5350 25 May 10 nicklas 4605         //For 2 points just draw a line connecting them.
5350 25 May 10 nicklas 4606       return this.drawLine(pen,phPoints[0],phPoints[1],"physical");
5350 25 May 10 nicklas 4607     }
5350 25 May 10 nicklas 4608             
5350 25 May 10 nicklas 4609       var curveDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 4610     var iHtml=new Array();
5350 25 May 10 nicklas 4611     
5350 25 May 10 nicklas 4612     var hexColor=color.getHex();
5350 25 May 10 nicklas 4613   
5350 25 May 10 nicklas 4614      var xDataArray=new Array();
5350 25 May 10 nicklas 4615      //Array to hold points on the curve
5350 25 May 10 nicklas 4616     var curvePoints=new Array();
5350 25 May 10 nicklas 4617
5350 25 May 10 nicklas 4618     var yArray=new Array();
5350 25 May 10 nicklas 4619     var yMin;
5350 25 May 10 nicklas 4620     var yMax;
5350 25 May 10 nicklas 4621     var n=phPoints.length-1;
5350 25 May 10 nicklas 4622     var i;  
5350 25 May 10 nicklas 4623
5350 25 May 10 nicklas 4624     //Call drawCurveSeg method in loop to get points in curvePoints 
5350 25 May 10 nicklas 4625     //array for segment (connecting 2 points) of the curve. 
5350 25 May 10 nicklas 4626     for(var i=0;i<=n-1;i++)
5350 25 May 10 nicklas 4627     {
5350 25 May 10 nicklas 4628       if(i==0)
5350 25 May 10 nicklas 4629       {
5350 25 May 10 nicklas 4630         getCurveSegPixels(new Array(phPoints[n],phPoints[0],phPoints[1],phPoints[2]),tension,curvePoints);
5350 25 May 10 nicklas 4631       }
5350 25 May 10 nicklas 4632       else if(i==n-1)
5350 25 May 10 nicklas 4633       {
5350 25 May 10 nicklas 4634         getCurveSegPixels(new Array(phPoints[n-2],phPoints[n-1],phPoints[n],phPoints[0]),tension,curvePoints);
5350 25 May 10 nicklas 4635       }
5350 25 May 10 nicklas 4636       else
5350 25 May 10 nicklas 4637       {
5350 25 May 10 nicklas 4638         getCurveSegPixels(new Array(phPoints[i-1],phPoints[i],phPoints[i+1],phPoints[i+2]),tension,curvePoints);
5350 25 May 10 nicklas 4639       }
5350 25 May 10 nicklas 4640     }
5350 25 May 10 nicklas 4641
5350 25 May 10 nicklas 4642     getCurveSegPixels(new Array(phPoints[n-1],phPoints[n],phPoints[0],phPoints[1]),tension,curvePoints);
5350 25 May 10 nicklas 4643     
5350 25 May 10 nicklas 4644     //getAllCurvePointsArray function processes the points data from curvePoints
5350 25 May 10 nicklas 4645     //xDataArray is also populated by the fuction
5350 25 May 10 nicklas 4646     var allPointsResult=getAllCurvePointsArray(xDataArray,yArray,curvePoints);
5350 25 May 10 nicklas 4647     
5350 25 May 10 nicklas 4648     yMin=allPointsResult[0];
5350 25 May 10 nicklas 4649     yMax=allPointsResult[1];
5350 25 May 10 nicklas 4650     
5350 25 May 10 nicklas 4651     var y;
5350 25 May 10 nicklas 4652     var k;
5350 25 May 10 nicklas 4653     var divStyle="";
5350 25 May 10 nicklas 4654     var j;
5350 25 May 10 nicklas 4655     var pointsCount=phPoints.length;
5350 25 May 10 nicklas 4656     var curX,curY,curWidth;
5350 25 May 10 nicklas 4657     
5350 25 May 10 nicklas 4658     //Draw the actual filled curve by drawing div rectangles
5350 25 May 10 nicklas 4659     for(y=yMin;y<=yMax;y++)
5350 25 May 10 nicklas 4660     {
5350 25 May 10 nicklas 4661       j=0;
5350 25 May 10 nicklas 4662       var allXDataArray=xDataArray[y];
5350 25 May 10 nicklas 4663       //Sort allXDataArray based on xMin using sortXDataArray function
5350 25 May 10 nicklas 4664       allXDataArray.sort(sortXDataArray);
5350 25 May 10 nicklas 4665       
5350 25 May 10 nicklas 4666       curY=y;
5350 25 May 10 nicklas 4667       
5350 25 May 10 nicklas 4668       for(i=0;i<allXDataArray.length;i+=2)
5350 25 May 10 nicklas 4669       {
5350 25 May 10 nicklas 4670         if(allXDataArray[i+1])
5350 25 May 10 nicklas 4671         {
5350 25 May 10 nicklas 4672           curX=allXDataArray[i].xMin;
5350 25 May 10 nicklas 4673           if(allXDataArray[i+1].xMax>allXDataArray[i].xMax)
5350 25 May 10 nicklas 4674             curWidth=allXDataArray[i+1].xMax-allXDataArray[i].xMin+1;
5350 25 May 10 nicklas 4675           else
5350 25 May 10 nicklas 4676             curWidth=allXDataArray[i].xMax-allXDataArray[i].xMin+1;
5350 25 May 10 nicklas 4677         }
5350 25 May 10 nicklas 4678         else
5350 25 May 10 nicklas 4679         {
5350 25 May 10 nicklas 4680           curX=allXDataArray[allXDataArray.length-1].xMin;
5350 25 May 10 nicklas 4681           curWidth=allXDataArray[allXDataArray.length-1].xMax-allXDataArray[allXDataArray.length-1].xMin+1;
5350 25 May 10 nicklas 4682         }
5350 25 May 10 nicklas 4683         
5350 25 May 10 nicklas 4684         iHtml[iHtml.length]="<DIV style=\"position:absolute;height:1px;overflow:hidden;left:";
5350 25 May 10 nicklas 4685         iHtml[iHtml.length]=curX;
5350 25 May 10 nicklas 4686         iHtml[iHtml.length]="px;top:";
5350 25 May 10 nicklas 4687         iHtml[iHtml.length]=curY;
5350 25 May 10 nicklas 4688         iHtml[iHtml.length]="px;width:";
5350 25 May 10 nicklas 4689         iHtml[iHtml.length]=curWidth;
5350 25 May 10 nicklas 4690         iHtml[iHtml.length]="px;background-color:";
5350 25 May 10 nicklas 4691         iHtml[iHtml.length]=hexColor;
5350 25 May 10 nicklas 4692         iHtml[iHtml.length]="\"></DIV>";
5350 25 May 10 nicklas 4693       }
5350 25 May 10 nicklas 4694     }
5350 25 May 10 nicklas 4695     
5350 25 May 10 nicklas 4696     curveDiv.innerHTML=iHtml.join("");
5350 25 May 10 nicklas 4697     return curveDiv;
5350 25 May 10 nicklas 4698
5350 25 May 10 nicklas 4699         //Internal sort function for allXDataArray array
5350 25 May 10 nicklas 4700     function sortXDataArray(a,b)
5350 25 May 10 nicklas 4701     {
5350 25 May 10 nicklas 4702       return a.xMin - b.xMin;
5350 25 May 10 nicklas 4703     }
5350 25 May 10 nicklas 4704   }
5350 25 May 10 nicklas 4705
5350 25 May 10 nicklas 4706     //Private function used by fillClosedCurve method to get curve points 
5350 25 May 10 nicklas 4707     //(in curvePoints array) for a single curve segment (connecting 2 points)
5350 25 May 10 nicklas 4708   function getCurveSegPixels(segPoints,tension,curvePoints)
5350 25 May 10 nicklas 4709   {
5350 25 May 10 nicklas 4710     var x=0;
5350 25 May 10 nicklas 4711     var y=0;
5350 25 May 10 nicklas 4712     var xl=segPoints[1].x-1;
5350 25 May 10 nicklas 4713     var yl=segPoints[1].y-1;
5350 25 May 10 nicklas 4714     var  t=0;
5350 25 May 10 nicklas 4715     var f=1;
5350 25 May 10 nicklas 4716     var k=1.1;
5350 25 May 10 nicklas 4717     var penWidth=1;
5350 25 May 10 nicklas 4718     var divWidth=1;
5350 25 May 10 nicklas 4719     var divHeight=1;
5350 25 May 10 nicklas 4720
5350 25 May 10 nicklas 4721     var m1x=(1-tension)*(segPoints[2].x-segPoints[0].x)/2;
5350 25 May 10 nicklas 4722     var m2x=(1-tension)*(segPoints[3].x-segPoints[1].x)/2;
5350 25 May 10 nicklas 4723
5350 25 May 10 nicklas 4724     var m1y=(1-tension)*(segPoints[2].y-segPoints[0].y)/2;
5350 25 May 10 nicklas 4725     var m2y=(1-tension)*(segPoints[3].y-segPoints[1].y)/2;
5350 25 May 10 nicklas 4726     
5350 25 May 10 nicklas 4727     while(t<=1)
5350 25 May 10 nicklas 4728     {
5350 25 May 10 nicklas 4729       x=0;
5350 25 May 10 nicklas 4730       y=0;
5350 25 May 10 nicklas 4731
5350 25 May 10 nicklas 4732       x= (2*t*t*t-3*t*t+1)*segPoints[1].x + (t*t*t-2*t*t+t)*m1x + (-2*t*t*t+3*t*t)*segPoints[2].x + (t*t*t-t*t)*m2x;
5350 25 May 10 nicklas 4733       y= (2*t*t*t-3*t*t+1)*segPoints[1].y + (t*t*t-2*t*t+t)*m1y + (-2*t*t*t+3*t*t)*segPoints[2].y + (t*t*t-t*t)*m2y;
5350 25 May 10 nicklas 4734         
5350 25 May 10 nicklas 4735       x=Math.round(x);
5350 25 May 10 nicklas 4736       y=Math.round(y);
5350 25 May 10 nicklas 4737     
5350 25 May 10 nicklas 4738       if(x!=xl || y!=yl)
5350 25 May 10 nicklas 4739       {
5350 25 May 10 nicklas 4740         if(x-xl>1 || y-yl>1 || xl-x>1 || yl-y>1)
5350 25 May 10 nicklas 4741         {
5350 25 May 10 nicklas 4742           t-=f;
5350 25 May 10 nicklas 4743           f=f/k;
5350 25 May 10 nicklas 4744         }
5350 25 May 10 nicklas 4745         else
5350 25 May 10 nicklas 4746         {
5350 25 May 10 nicklas 4747                   curvePoints[curvePoints.length]=new jsPoint(x,y);  
5350 25 May 10 nicklas 4748           xl=x;
5350 25 May 10 nicklas 4749           yl=y;
5350 25 May 10 nicklas 4750           if(t+f>1)
5350 25 May 10 nicklas 4751                       t=1-f;
5350 25 May 10 nicklas 4752         }
5350 25 May 10 nicklas 4753       }
5350 25 May 10 nicklas 4754       else
5350 25 May 10 nicklas 4755       {
5350 25 May 10 nicklas 4756         f=f*k;
5350 25 May 10 nicklas 4757       }
5350 25 May 10 nicklas 4758       t+=f;
5350 25 May 10 nicklas 4759     }
5350 25 May 10 nicklas 4760     }
5350 25 May 10 nicklas 4761   
5350 25 May 10 nicklas 4762   //Private function that processes the points data from curvePoints
5350 25 May 10 nicklas 4763   //xDataArray is also populated by the fuction
5350 25 May 10 nicklas 4764   function getAllCurvePointsArray(xDataArray,yArray,curvePoints)
5350 25 May 10 nicklas 4765   {
5350 25 May 10 nicklas 4766     function xData()
5350 25 May 10 nicklas 4767     {
5350 25 May 10 nicklas 4768       this.xMax=0;
5350 25 May 10 nicklas 4769       this.xMin=0;
5350 25 May 10 nicklas 4770       this.i=0;
5350 25 May 10 nicklas 4771     }
5350 25 May 10 nicklas 4772     
5350 25 May 10 nicklas 4773     var isEliminated=new Array();
5350 25 May 10 nicklas 4774     var yMin;
5350 25 May 10 nicklas 4775     var yMax;
5350 25 May 10 nicklas 4776     var lastY;
5350 25 May 10 nicklas 4777     var firstY;
5350 25 May 10 nicklas 4778     var isFirst=true;
5350 25 May 10 nicklas 4779     var xDataArrayLast;
5350 25 May 10 nicklas 4780     var iLast=-1;
5350 25 May 10 nicklas 4781     var yTop1,yTop2;
5350 25 May 10 nicklas 4782
5350 25 May 10 nicklas 4783     for(var i=0;i<curvePoints.length;i++)
5350 25 May 10 nicklas 4784     {
5350 25 May 10 nicklas 4785         var next=false;
7419 03 Nov 17 nicklas 4786         var x=curvePoints[i].x;
7419 03 Nov 17 nicklas 4787         var y=curvePoints[i].y;
5350 25 May 10 nicklas 4788
5350 25 May 10 nicklas 4789            //Eliminate extra points disturbing continuity/smoothness
5350 25 May 10 nicklas 4790         if(i!=0 && i+1<curvePoints.length)
5350 25 May 10 nicklas 4791         {
5350 25 May 10 nicklas 4792             if((curvePoints[i-1].x-curvePoints[i+1].x==1 || curvePoints[i+1].x-curvePoints[i-1].x==1) && (curvePoints[i-1].y-curvePoints[i+1].y==1 || curvePoints[i+1].y-curvePoints[i-1].y==1))
5350 25 May 10 nicklas 4793             {
5350 25 May 10 nicklas 4794                 if(!isEliminated[i-1])
5350 25 May 10 nicklas 4795                 {
5350 25 May 10 nicklas 4796                     next=true;
5350 25 May 10 nicklas 4797                     isEliminated[i]=true;
5350 25 May 10 nicklas 4798                 }
5350 25 May 10 nicklas 4799             }
5350 25 May 10 nicklas 4800         }
5350 25 May 10 nicklas 4801         
5350 25 May 10 nicklas 4802         //Divs optimization
5350 25 May 10 nicklas 4803         if(!next)
5350 25 May 10 nicklas 4804         {
5350 25 May 10 nicklas 4805           if(!firstY)
5350 25 May 10 nicklas 4806             firstY=y;
5350 25 May 10 nicklas 4807             
5350 25 May 10 nicklas 4808           if(!yMin)
5350 25 May 10 nicklas 4809             yMin=y;
5350 25 May 10 nicklas 4810           if(!yMax)
5350 25 May 10 nicklas 4811             yMax=y;
5350 25 May 10 nicklas 4812   
5350 25 May 10 nicklas 4813           if(y<yMin)
5350 25 May 10 nicklas 4814             yMin=y;
5350 25 May 10 nicklas 4815           if(y>yMax)
5350 25 May 10 nicklas 4816             yMax=y;
5350 25 May 10 nicklas 4817
5350 25 May 10 nicklas 4818         if(!xDataArray[y])
5350 25 May 10 nicklas 4819         {
5350 25 May 10 nicklas 4820           xDataArray[y]=new Array();
5350 25 May 10 nicklas 4821           xDataArray[y][0]=new xData();
5350 25 May 10 nicklas 4822           xDataArray[y][0].xMin=x;
5350 25 May 10 nicklas 4823           xDataArray[y][0].xMax=x;
5350 25 May 10 nicklas 4824           xDataArray[y][0].i=i;
5350 25 May 10 nicklas 4825         }
5350 25 May 10 nicklas 4826         else
5350 25 May 10 nicklas 4827         {
5350 25 May 10 nicklas 4828           xDataArrayLast=xDataArray[y][xDataArray[y].length-1];
5350 25 May 10 nicklas 4829           if(i-xDataArrayLast.i==1)
5350 25 May 10 nicklas 4830           {
5350 25 May 10 nicklas 4831             if(xDataArrayLast.xMin>x)
5350 25 May 10 nicklas 4832               xDataArrayLast.xMin=x;
5350 25 May 10 nicklas 4833             if(xDataArrayLast.xMax<x)
5350 25 May 10 nicklas 4834               xDataArrayLast.xMax=x;
5350 25 May 10 nicklas 4835               
5350 25 May 10 nicklas 4836             xDataArrayLast.i=i;
5350 25 May 10 nicklas 4837           }
5350 25 May 10 nicklas 4838           else
5350 25 May 10 nicklas 4839           {
5350 25 May 10 nicklas 4840             xDataArray[y][xDataArray[y].length]=new xData();
5350 25 May 10 nicklas 4841             xDataArray[y][xDataArray[y].length-1].xMin=x;
5350 25 May 10 nicklas 4842             xDataArray[y][xDataArray[y].length-1].xMax=x;
5350 25 May 10 nicklas 4843             xDataArray[y][xDataArray[y].length-1].i=i;
5350 25 May 10 nicklas 4844           }  
5350 25 May 10 nicklas 4845         }
5350 25 May 10 nicklas 4846
5350 25 May 10 nicklas 4847         yTop1=yArray[yArray.length-1];
5350 25 May 10 nicklas 4848         yTop2=yArray[yArray.length-2];  
5350 25 May 10 nicklas 4849         
5350 25 May 10 nicklas 4850         if(yTop1 && yTop2) 
5350 25 May 10 nicklas 4851         {
5350 25 May 10 nicklas 4852           if((yTop1 > y && yTop2 < yTop1) || (yTop1 < y && yTop2 > yTop1))
5350 25 May 10 nicklas 4853           {
5350 25 May 10 nicklas 4854             xDataArray[yTop1][xDataArray[yTop1].length]=xDataArray[yTop1][xDataArray[yTop1].length-1];
5350 25 May 10 nicklas 4855           }
5350 25 May 10 nicklas 4856         }
5350 25 May 10 nicklas 4857         
5350 25 May 10 nicklas 4858         if(!yArray[0])
5350 25 May 10 nicklas 4859         {
5350 25 May 10 nicklas 4860           yArray[0]=y;
5350 25 May 10 nicklas 4861         }  
5350 25 May 10 nicklas 4862         else if(yArray[yArray.length-1]!=y)
5350 25 May 10 nicklas 4863         {
5350 25 May 10 nicklas 4864           yArray[yArray.length]=y;
5350 25 May 10 nicklas 4865         }
5350 25 May 10 nicklas 4866         
5350 25 May 10 nicklas 4867         lastY=y;
5350 25 May 10 nicklas 4868       }
5350 25 May 10 nicklas 4869     }
5350 25 May 10 nicklas 4870       
5350 25 May 10 nicklas 4871     yTop1=yArray[0];
5350 25 May 10 nicklas 4872     yTop2=yTop1;
5350 25 May 10 nicklas 4873     var i=1;
5350 25 May 10 nicklas 4874     while(yTop1==yTop2)
5350 25 May 10 nicklas 4875     {
5350 25 May 10 nicklas 4876         yTop2=yArray[yArray.length-i];  
5350 25 May 10 nicklas 4877         i++;
5350 25 May 10 nicklas 4878     }
5350 25 May 10 nicklas 4879       
5350 25 May 10 nicklas 4880     if(yTop1 && yTop2)
5350 25 May 10 nicklas 4881     {
5350 25 May 10 nicklas 4882       if((yTop1 > yArray[1] && yTop2 < yTop1) || (yTop1 < yArray[1] && yTop2 > yTop1))
5350 25 May 10 nicklas 4883       {
5350 25 May 10 nicklas 4884         xDataArray[yTop1][xDataArray[yTop1].length]=xDataArray[yTop1][xDataArray[yTop1].length-1];
5350 25 May 10 nicklas 4885       }
5350 25 May 10 nicklas 4886     }
5350 25 May 10 nicklas 4887     
5350 25 May 10 nicklas 4888     if(firstY==lastY)
5350 25 May 10 nicklas 4889     {
5350 25 May 10 nicklas 4890         var firstXDataA=xDataArray[firstY][0];
5350 25 May 10 nicklas 4891         var lastXDataA=xDataArray[lastY][xDataArray[lastY].length-1];
5350 25 May 10 nicklas 4892            
5350 25 May 10 nicklas 4893         if(lastXDataA.xMax>firstXDataA.xMax)
5350 25 May 10 nicklas 4894           xDataArray[firstY][0].xMax=lastXDataA.xMax;
5350 25 May 10 nicklas 4895           
5350 25 May 10 nicklas 4896         if(lastXDataA.xMin<firstXDataA.xMin)
5350 25 May 10 nicklas 4897           xDataArray[firstY][0].xMin=lastXDataA.xMin;
5350 25 May 10 nicklas 4898           
5350 25 May 10 nicklas 4899         if(xDataArray[lastY].length>1)
5350 25 May 10 nicklas 4900           xDataArray[lastY].pop();
5350 25 May 10 nicklas 4901         else
5350 25 May 10 nicklas 4902           xDataArray.pop();
5350 25 May 10 nicklas 4903     }
5350 25 May 10 nicklas 4904     
5350 25 May 10 nicklas 4905     return new Array(yMin,yMax);  
5350 25 May 10 nicklas 4906   }
5350 25 May 10 nicklas 4907     
5350 25 May 10 nicklas 4908   //Draw text string at specified point with specified color,font,width & alignment  
5350 25 May 10 nicklas 4909     function drawText(text,point,font,color,width,align)
5350 25 May 10 nicklas 4910     {
5350 25 May 10 nicklas 4911     //Check arguments for null values        
5350 25 May 10 nicklas 4912       if(!text || !point)
5350 25 May 10 nicklas 4913       return false;
5350 25 May 10 nicklas 4914       
7419 03 Nov 17 nicklas 4915     var phPoint=logicalToPhysicalPoint(point);
5350 25 May 10 nicklas 4916     
5350 25 May 10 nicklas 4917     if(width!=null)
5350 25 May 10 nicklas 4918            width=Math.round(width*scale) + "px";
5350 25 May 10 nicklas 4919        
5350 25 May 10 nicklas 4920         var textDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 4921
5350 25 May 10 nicklas 4922         textDiv.style.position="absolute";
5350 25 May 10 nicklas 4923         textDiv.style.left=phPoint.x + "px";
5350 25 May 10 nicklas 4924         textDiv.style.top=phPoint.y + "px";
5350 25 May 10 nicklas 4925         
5350 25 May 10 nicklas 4926         if(color)
5350 25 May 10 nicklas 4927           textDiv.style.color=color.getHex();
5350 25 May 10 nicklas 4928                 
5350 25 May 10 nicklas 4929         //set font
5350 25 May 10 nicklas 4930         if(font)
5350 25 May 10 nicklas 4931         {
5350 25 May 10 nicklas 4932           if(font.family)
5350 25 May 10 nicklas 4933               textDiv.style.fontFamily=font.family;
5350 25 May 10 nicklas 4934
5350 25 May 10 nicklas 4935           if(font.weight)
5350 25 May 10 nicklas 4936               textDiv.style.fontWeight=font.weight;
5350 25 May 10 nicklas 4937         
5350 25 May 10 nicklas 4938           if(font.size)
5350 25 May 10 nicklas 4939               textDiv.style.fontSize=font.size;
5350 25 May 10 nicklas 4940         
5350 25 May 10 nicklas 4941           if(font.style)
5350 25 May 10 nicklas 4942               textDiv.style.fontStyle=font.style;
5350 25 May 10 nicklas 4943         
5350 25 May 10 nicklas 4944           if(font.variant)
5350 25 May 10 nicklas 4945               textDiv.style.fontVariant=font.variant;
5350 25 May 10 nicklas 4946     }
5350 25 May 10 nicklas 4947     
5350 25 May 10 nicklas 4948         if(width)
5350 25 May 10 nicklas 4949             textDiv.style.width=width;
5350 25 May 10 nicklas 4950
5350 25 May 10 nicklas 4951         if(align) 
5350 25 May 10 nicklas 4952             textDiv.style.textAlign=align;
5350 25 May 10 nicklas 4953
5350 25 May 10 nicklas 4954         textDiv.innerHTML=text;
5350 25 May 10 nicklas 4955         
5350 25 May 10 nicklas 4956         return textDiv;
5350 25 May 10 nicklas 4957     }
5350 25 May 10 nicklas 4958   
5350 25 May 10 nicklas 4959   //Draw image at specified point with specified width & height
5350 25 May 10 nicklas 4960     function drawImage(url,point,width,height)
5350 25 May 10 nicklas 4961     {
5350 25 May 10 nicklas 4962         if(!url || !point)
5350 25 May 10 nicklas 4963             return false;
5350 25 May 10 nicklas 4964              
7419 03 Nov 17 nicklas 4965         var phPoint=logicalToPhysicalPoint(point);
5350 25 May 10 nicklas 4966       
5350 25 May 10 nicklas 4967         if(width!=null)
5350 25 May 10 nicklas 4968             width=Math.round(width*scale) + "px";
5350 25 May 10 nicklas 4969             
5350 25 May 10 nicklas 4970         if(height!=null)   
5350 25 May 10 nicklas 4971             height=Math.round(height*scale) + "px";
5350 25 May 10 nicklas 4972
5350 25 May 10 nicklas 4973         var imgDiv=canvasDiv.appendChild(document.createElement("div"));
5350 25 May 10 nicklas 4974
5350 25 May 10 nicklas 4975         imgDiv.style.position="absolute";
5350 25 May 10 nicklas 4976         imgDiv.style.left=phPoint.x + "px";
5350 25 May 10 nicklas 4977         imgDiv.style.top=phPoint.y + "px";
5350 25 May 10 nicklas 4978         //create and set img tag/element
5350 25 May 10 nicklas 4979         var img=imgDiv.appendChild(document.createElement("img"));
5350 25 May 10 nicklas 4980          
5350 25 May 10 nicklas 4981         img.src=url;
5350 25 May 10 nicklas 4982         
5350 25 May 10 nicklas 4983         if(width!=null)
5350 25 May 10 nicklas 4984         {
5350 25 May 10 nicklas 4985             img.style.width=width;
5350 25 May 10 nicklas 4986             imgDiv.style.width=width;
5350 25 May 10 nicklas 4987         }
5350 25 May 10 nicklas 4988           
5350 25 May 10 nicklas 4989         if(height!=null)
5350 25 May 10 nicklas 4990         {
5350 25 May 10 nicklas 4991             img.style.height=height;
5350 25 May 10 nicklas 4992             imgDiv.style.height=height;
5350 25 May 10 nicklas 4993         }
5350 25 May 10 nicklas 4994         
5350 25 May 10 nicklas 4995         return imgDiv;
5350 25 May 10 nicklas 4996     }
5350 25 May 10 nicklas 4997     
5350 25 May 10 nicklas 4998     //Clear the canvas div element
5350 25 May 10 nicklas 4999     function clear()
5350 25 May 10 nicklas 5000     {
5350 25 May 10 nicklas 5001       canvasDiv.innerHTML="";
5350 25 May 10 nicklas 5002     }
5527 13 Dec 10 nicklas 5003     
5527 13 Dec 10 nicklas 5004     function clearDrawing(div)
5527 13 Dec 10 nicklas 5005     {
5527 13 Dec 10 nicklas 5006       canvasDiv.removeChild(div);
5527 13 Dec 10 nicklas 5007     }
5350 25 May 10 nicklas 5008 }