/***************************************** (c) Copyright Phi Tran 2005 ***************/
var ItemMaxX,ItemMaxY,ItemMinX,ItemMinY;




		
	
var NewPpoints;
var BB1 =new Array();
var BB2 =new Array();
var BB3 =new Array();
B3 = function(t) { return (t*t*t);};
B2 = function(t) { return (t*t);}; 
B1 = function(t) { return (t);};
{
var TreeBranch=0;
for (var x=0;x<=1000;x++)
	{
	BB1[x]=B1(TreeBranch);
	BB2[x]=B2(TreeBranch);
	BB3[x]=B3(TreeBranch);
	TreeBranch+=0.001;
	}
}

function SVGReverseTransform(X, Y)
	{
	var msin,mcos;
	var pp=new Array();
	
	if(Math.tan(ItemArray[CurrentItem].skewX)<200 && Math.tan(ItemArray[CurrentItem].skewX)!=0)
		X-= Y*Math.tan(ItemArray[CurrentItem].skewX);
	if(Math.tan(ItemArray[CurrentItem].skewY)<200 && Math.tan(ItemArray[CurrentItem].skewY)!=0)
		Y-= X*Math.tan(ItemArray[CurrentItem].skewY);
	
	msin=Math.sin(-ItemArray[CurrentItem].rotate);
	mcos=Math.cos(-ItemArray[CurrentItem].rotate);
	Xi = X * mcos - Y * msin;// alpha=0;
	Yi = X * msin + Y * mcos;
	pp.x=Math.round (Xi);
	pp.y=Math.round (Yi);
	return(pp);
	}
function SVGTransformNoRound(zX, zY)
	{
	var pp=new Array();
	var Xi,Yi;
	var msin,mcos;
	msin=Math.sin(ItemArray[CurrentItem].rotate);
	mcos=Math.cos(ItemArray[CurrentItem].rotate);
	// ROTATE
	Xi = zX * mcos - zY * msin;// alpha=0;
	Yi = zX * msin + zY * mcos;
	if(Math.tan(ItemArray[CurrentItem].skewY)<200 && Math.tan(ItemArray[CurrentItem].skewY)!=0)
		Yi+= Xi*Math.tan(ItemArray[CurrentItem].skewY);
	if(Math.tan(ItemArray[CurrentItem].skewX)<200 && Math.tan(ItemArray[CurrentItem].skewX)!=0)
		Xi+= Yi*Math.tan(ItemArray[CurrentItem].skewX);
	pp.x=Xi;
	pp.y=Yi;
	return(pp);
	}	
function SVGTransform(X, Y)	
	{
	var pp=new Array();
	var Xi,Yi;
	var msin,mcos;
	msin=Math.sin(ItemArray[CurrentItem].rotate);
	mcos=Math.cos(ItemArray[CurrentItem].rotate);
	// ROTATE
	Xi = X * mcos - Y * msin;// alpha=0;
	Yi = X * msin + Y * mcos;
	if(Math.tan(ItemArray[CurrentItem].skewY)<200 && Math.tan(ItemArray[CurrentItem].skewY)!=0)
		Yi+= Xi*Math.tan(ItemArray[CurrentItem].skewY);
	if(Math.tan(ItemArray[CurrentItem].skewX)<200 && Math.tan(ItemArray[CurrentItem].skewX)!=0)
		Xi+= Yi*Math.tan(ItemArray[CurrentItem].skewX);
	
	pp.x=Math.round (Xi);
	pp.y=Math.round (Yi);
	
	return(pp);
	
	}
	

//BuildingBitmap();
//SetRect(LL,y3,x3,1,1);
//encode64();
/*************************************** ELIMINATE REPEAT AT SAME PathOrient */
function EnhanceArray(flagb,flagE)
		{
		var x2;
		//if(CurveAddlevel>StokeMouseEvent.length) CurveAddlevel=StokeMouseEvent.length;
		for(x=flagb;x<flagE;x++)
			{
//			if(StokeMouseEvent[x].PathMaxY==StokeMouseEvent[x].PathMinY) continue;
//			if(StokeMouseEvent[x].PathMaxX==StokeMouseEvent[x].PathMinX) continue;
			
			if(x>flagb) x2=x-1;
			else 
				x2=flagE-1;
			
			if(PathOrient[x]==PathOrient[x2])
				{
				if(PathOrient[x]==2)// when y2 >y1
					StokeMouseEvent[x2].PathMaxY--;
				else
				if(PathOrient[x]==1)// when y2 <y1
					StokeMouseEvent[x2].PathMinY++;
				}
			}
		}
function ItemFill(flagb,flagE)
		{
		//ItemMaxX,ItemMaxY,ItemMinX,ItemMinY
		var FillPoints=new Array();
		var x,m,start,n;
		for(y=ItemMinY;y<=ItemMaxY;y++)
			{
			FillPoints=new Array();
			for(m=flagb;m<flagE;m++)
				{
				if(!isArray(StokeMouseEvent[m]))continue;
				if(y<StokeMouseEvent[m].PathMinY) continue;
				if(y>StokeMouseEvent[m].PathMaxY) continue;
				start=StokeMouseEvent[m].start;
				for(n=start;n<NewPpoints.length;n++)
					{
					if(NewPpoints[n].Addlevel!=m) break;
					if(y>=NewPpoints[n].y && y<=(NewPpoints[n].y+NewPpoints[n].h))
						{
						var u;
						u=FillPoints.length;
						u=FillPoints[u]=new Array();
						//FillPoints[u].l=NewPpoints[n].x;
						//FillPoints[u].r=(NewPpoints[n].x+NewPpoints[n].w);
						//FillPoints[u].n=Number(n);
						u.l=NewPpoints[n].x;
						u.r=(NewPpoints[n].x+NewPpoints[n].w);
						u.n=Number(n);
						break;
						}
					else	
						n=n;
					}	
				}
			FillPoints.sort(NumericalLeftSort);	
			n=n;
			if((FillPoints.length &1)==0)
			for(n=0;n<FillPoints.length;n+=2)
				{
				NewPpoints[FillPoints[n+1].n].cc=1;
				NewPpoints[FillPoints[n].n].dd=1;
				if(FillPoints[n+1].l<=FillPoints[n].r) continue; // No Meat between
				m=FillPoints[n].r;
				if(m<FillPoints[n+1].r) m=FillPoints[n+1].r;
				//PngSetRect(FillPoints[n].l+1,y,(m-FillPoints[n].l),1,8);
				var o=GlobeBit.length ;o=GlobeBit[o]=new Array();
				o.x=FillPoints[n].l+1;
				o.y=y;
				o.w=(m-FillPoints[n].l);
				o.h=1;
				o.a=8;
				
				
				}
			else if(FillPoints.length>=2)
				{
				m=0;
				for(n=0;n<FillPoints.length;n++)
					if(FillPoints[n].r>m) m=FillPoints[n].r;
				//PngSetRect(FillPoints[0].l+1,y,(m-FillPoints[0].l),1,8);
				var o=GlobeBit.length ;o=GlobeBit[o]=new Array();
				o.x=FillPoints[0].l+1;
				o.y=y;
				o.w=(m-FillPoints[0].l);
				o.h=1;
				o.a=8;
				}
			}
		}

function ItemStroke(flagb)
		{
		var start=StokeMouseEvent[flagb].start;
		var o2=GlobeBit.length;
		var o;
		for(var n=start;n<NewPpoints.length;n++)
			{
			o=GlobeBit[o2++]=new Array();
			//PngSetRect(NewPpoints[n].x,NewPpoints[n].y,NewPpoints[n].w,NewPpoints[n].h,1);
			o.x=NewPpoints[n].x;
			o.y=NewPpoints[n].y;
			o.w=NewPpoints[n].w;
			o.h=NewPpoints[n].h;
			o.a=1;
			}
		}
function OneStroke(n)
		{
		return;
		PngSetRect(NewPpoints[n].x,NewPpoints[n].y,NewPpoints[n].w-NewPpoints[n].x,NewPpoints[n].h,1);
		}
function ItemSmooth(flagb)
		{
		var start=StokeMouseEvent[flagb].start;
		var endd,w,h;
		var prv=NewPpoints.length-1;
		var nxt;
		endd=NewPpoints.length;
		NewPpoints[endd]=NewPpoints[0];
		NewPpoints[endd+1]=NewPpoints[1];
		prv=start;
		nxt=start+2;
		NewPpoints[start].w+=NewPpoints[start].x;
		for(var n=start+1;n<=endd;n++,nxt++)
			{
			if(n<endd)
				NewPpoints[n].w+=NewPpoints[n].x;
			if(NewPpoints[n].y>NewPpoints[prv].y && NewPpoints[n].y>NewPpoints[nxt].y)
				{NewPpoints[n].t=1;OneStroke(n);}
			else
				NewPpoints[n].t=0;
			if(NewPpoints[n].y+NewPpoints[n].h<NewPpoints[prv].y+NewPpoints[prv].h && NewPpoints[n].y+NewPpoints[n].h<NewPpoints[nxt].y+NewPpoints[nxt].h)
				{NewPpoints[n].b=1;OneStroke(n);}
			else	
				NewPpoints[n].b=0;
			if(NewPpoints[n].x>NewPpoints[prv].x && NewPpoints[n].x>NewPpoints[nxt].x)	
				{NewPpoints[n].ll=1;OneStroke(n);}
			else
				NewPpoints[n].ll=0;
			if(NewPpoints[n].w<NewPpoints[prv].w && NewPpoints[n].w<NewPpoints[nxt].w)	
				{NewPpoints[n].rr=1;OneStroke(n);}
			else
				NewPpoints[n].rr=0;				
			prv=n;	
			}
			
		prv=start;	
		nxt=start+2;	
		for(var n=start+1;n<=endd;n++,nxt++)
			{
			dirr=0;
			if(NewPpoints[n].ll)
				{
				// case left Most
				if(NewPpoints[n].h)
					{
					M=Math.round(NewPpoints[n].h/2);
					MkSmooth(NewPpoints[n].x-1,NewPpoints[n].y,1,M,2);
					MkSmooth(NewPpoints[n].x-1,NewPpoints[n].y+M,1,NewPpoints[n].h-M,1);
					}
				continue;	
				}
			if(NewPpoints[n].rr)
				{
				// case right MOST
				if(NewPpoints[n].h)
					{
					M=Math.round(NewPpoints[n].h/2);
					MkSmooth(NewPpoints[n].w,NewPpoints[n].y,1,M,2);
					MkSmooth(NewPpoints[n].w,NewPpoints[n].y+M,1,NewPpoints[n].h-M,1);
					}
				continue;
				}


			dirr	=0;	
			if(NewPpoints[n].x>NewPpoints[prv].x )
				{
				w=Math.abs (NewPpoints[n].x-NewPpoints[prv].x); 
				if( NewPpoints[n].y<NewPpoints[prv].y)
					dirr=1; // low to hight
				else 	//OK
					dirr =2;
				LL=	NewPpoints[n].x-w;	
//				if(w==1) LL++;
//					else	
//						if(dirr ==2) YY--;
//						else YY++;
				YY= NewPpoints[n].y;
				HH= NewPpoints[n].h;
				MkSmooth(LL,YY,w,HH,dirr);	
				}
			dirr=0;
			if(NewPpoints[n].x>NewPpoints[nxt].x)
				{
				w=Math.abs (NewPpoints[n].x-NewPpoints[nxt].x);
				if(NewPpoints[n].y>NewPpoints[nxt].y)
					dirr=1; // hight to low
				else dirr=2;
					
				LL=	NewPpoints[n].x-w;
				YY= NewPpoints[n].y;
//				if(w==1) LL++;	
//					if(dirr ==2) YY--;
//						else YY++;
				
				HH= NewPpoints[n].h;
				MkSmooth(LL,YY,w,HH,dirr);
				}
			dirr=0;
			
			
			if(NewPpoints[n].w<NewPpoints[prv].w )
				{
				w=Math.abs (NewPpoints[n].w-NewPpoints[prv].w); 
				if( NewPpoints[n].y<NewPpoints[prv].y)
					dirr=2;
				else //OK
					dirr=1;
				LL=	NewPpoints[n].w;
				YY= NewPpoints[n].y;
				HH= NewPpoints[n].h;
				if(w>1 )
					{
//					if(dirr ==2) YY--;
//						else YY++;
					}
				
				MkSmooth(LL,YY,w,HH,dirr);
				}
			dirr=0;
			if(NewPpoints[n].w<NewPpoints[nxt].w)
				{
				w=Math.abs (NewPpoints[n].w-NewPpoints[nxt].w); 
				if  (NewPpoints[n].y>NewPpoints[nxt].y)
					dirr=2;
				else  // OK
					dirr=1;
				
				LL=	NewPpoints[n].w;
				YY= NewPpoints[n].y;
				HH= NewPpoints[n].h;
				if(w>1 )
					{
//					if(dirr ==2) YY--;
//						else YY++;
					}
				MkSmooth(LL,YY,w,HH,dirr);
				}
				
			dirr=0;
			prv=n;
			}
		NewPpoints.length=endd;
		return;
		function MkSmooth(L,Y,W,H,dirr)
				{
				var M;
				var LL=L;
				if(!dirr || !W || !H) return;
			
				if(dirr==3)
					{
					// both up/down
					if(H>1)
						{
						M=Math.round (H-2);
						MkSmooth(L,Y,1,M,2);
						MkSmooth(L,Y+M,1,H-M,1);
						return;
						}
					}
				if(dirr==2)
					{
					if(H>W)  W=1; 
						else H=1;
					if(H>5) H=5;
					if(W>5) W=5;
					//if(H>W) {N=-100/(H+1);M=100+N;}
					//else {N=-100/(W+1);M=100+N;}
					if(H>W) {N=-100/(H+1);M=100;}
					else {N=-100/(W+1);M=100;}
					}
				if(dirr==1)
					{
					if(W>H)
						{
						H=1;
						if(W>5)
							{
							L-=(W-5);
							W=5;
							}
						if(W>H) M=N=100/(W);
							else 
								if(H==1)M=N==50; else M=N=100/(H);	
						}	
					else
						{
						W=1;
						if(H>5)
							{
							Y+=(H-5);
							H=5;
							}
						if(H>W) M=N=100/(H+1);
						else if( H==W)M=N=50; else M=N=100/(W);
						}
					}
				var CC=W;
				var RR=LL;
				var TT=M;
				if(H==1)
					{
					CC=W;
					RR=LL;
					TT=M;
					while(CC>0)
						{
						PngSetRect(RR,Y,1,1,ColorIndex(TT));
						RR++;
						CC--;
						TT+=N;
						}
					H--;
					Y++;
					}
				else
					{
					while(H>0)
						{
						CC=W;
						RR=LL;
						while(CC>0)
							{
							PngSetRect(RR,Y,1,1,ColorIndex(TT));
							RR++;
							CC--;
							}
						TT+=N;	
						H--;
						Y++;
						}
					}
				}
		function ColorIndex(TT)
				{
				if(TT<(15+30)/2) return(2);
				if(TT<(30+45)/2) return(2);
				if(TT<(45+60)/2) return(3);
				if(TT<(60+75)/2) return(4);
				if(TT<(75+90)/2) return(5);
				if(TT<(95)) return(6);
				return(6);
				//if(TT<(15+30)/2) return(7);
				//if(TT<(30+45)/2) return(6);
				//if(TT<(45+60)/2) return(5);
				//if(TT<(60+75)/2) return(4);
				//if(TT<(75+90)/2) return(3);
				//return(2);
				}
		}		
var Ppoints= new Array();
var viewMinY=10000;
var viewMaxY=0;
var fl_c=0;
var d_c=0;
var M_Yarray=new Array();
var total_count=0;
function OutlineDraw(toDraw,toFill,flagBeg,Disflag)
	{
	Mkheader();
	for(var bb=0;bb<FillSection.length;bb++)
		{
		EnhanceArray(FillSection[bb].st,FillSection[bb].ed);
		ItemFill(FillSection[bb].st,FillSection[bb].ed);
		//ItemSmooth(flagb);
		}
	ItemStroke(0); // start 0 anyway
	PngEncode64();
	return("");
	
	}
	
	
/*
function HugeRefresh()
	{
	var m;
	var kk;
	m=total_count;
	var this_count=0;
	return;
	for (var y=viewMinY;y<viewMaxY;y++)
		{
		if(!isArray(M_Yarray[y])) continue;
		kk=M_Yarray[y];
		kk.sort(NumericalLeftSort);
		var a=0;
		for(x=1;x<kk.length ;x++)
			{
			if(kk[x].l>(kk[x-1].r+1))
				{
				get_div_count();
				m=x-a;
				a=x;
				}
			}
		get_div_count();
		m=x-a;
		a=a;
		}
	a=a;	
	return;
		function GetStyleSheetName2(l,y,w,m,n)
					{
					if(m==0)
						return(GetStyleSheetName("S0",l,y,w,-1,-1));
					else
						return(GetStyleSheetName("M0",l,y,w,m,n));
					}
		
		function DrawBordersolid(l,r)
					{
					return(GetStyleSheetName("S0",l,y,r,-1,-1));
					}
		function get_div_count()
			{
			var ggh=0;
			if(a>=kk.length) return;
			switch(x-a)
				{
				case 1:
				     if(x<kk.length)
						{
						if(kk[x].m==0 &&kk[a].m==0)
							{
							y3=GetStyleSheetName("SS",kk[a].l,y,kk[x].l-kk[a].r,kk[a].r-kk[a].l,kk[x].r-kk[x].l);
							M_HHTML+="<p class='"+y3+"'/>";
							this_count++;
							x++;
							return;
							}
						}
					ggh=a;
					y3=GetStyleSheetName2(kk[ggh].l,  y,(kk[ggh].r-kk[ggh].l-kk[ggh].n),  kk[ggh].m,kk[ggh].n);
					M_HHTML+="<p class='"+y3+"'/>";
					this_count++;
					return;
				case 2:
					if(kk[a].m==kk[a+1].m && kk[a].m==0)
						{
						if(kk[a].r<kk[a+1].r) kk[a].r=kk[a+1].r;
						y3=GetStyleSheetName("S0",kk[a].l,y,kk[a].r-kk[a].l,-1,-1);
						M_HHTML+="<p class='"+y3+"'/>";
						this_count++;
						return;
						}
					ggh=a;
					y3=GetStyleSheetName2(kk[ggh].l,  y,(kk[ggh].r-kk[ggh].l-kk[ggh].n),  kk[ggh].m,kk[ggh].n);
					M_HHTML+="<p class='"+y3+"'/>";
					ggh++;
					y3=GetStyleSheetName2(kk[ggh].l,  y,(kk[ggh].r-kk[ggh].l-kk[ggh].n),  kk[ggh].m,kk[ggh].n);
					M_HHTML+="<p class='"+y3+"'/>";
					this_count++;
					this_count++;
					return;
				default:
					var skin=new Array();
					var sc=0;
					var tt;
					for(tt=a;tt<x;tt++)
						{
						if(kk[tt].m==0)
							{
							skin[sc]=new Array();
							skin[sc].l=kk[tt].l;
							skin[sc++].r=kk[tt].r;
							}
						else
							{
							skin[sc]=new Array();
							skin[sc].l=kk[tt].l;
							//skin[sc].r=kk[tt].r;
							skin[sc].r=skin[sc].l+kk[tt].m;sc++;
							skin[sc]=new Array();
							skin[sc].l=kk[tt].r-kk[tt].n;
							skin[sc++].r=kk[tt].r;
							}
						}
					skin.sort(NumericalLeftSort);
					for(tt=1;tt<skin.length ;tt++)
						{
						if(skin[tt].l<=(skin[tt-1].r+1))
							{
							if(skin[tt-1].r<skin[tt].r)
								skin[tt-1].r=skin[tt].r;
							skin.splice(tt,1);
							tt--;
							continue;
							}
						}
					this_count+=Math.round(tt/2);
					//y3=GetStyleSheetName("M"+TheStyle,left,y3,width,leftborderWidth,rightborderwidth);
					if(tt>=2)
						{
						var yu=skin.length-1;
						y3=GetStyleSheetName("M0",skin[0].l,y, skin[yu].l-skin[0].r ,skin[0].r-skin[0].l,skin[yu].r-skin[yu].l);
						M_HHTML+="<p class='"+y3+"'/>";
						skin.splice(yu,1);
						skin.splice(0,1);
						}
					while(skin.length)
						{
						if(skin.length==1)
							{
							y3=GetStyleSheetName("S0",skin[0].l,y,skin[0].r-skin[0].l,-1,-1); // borderonly
							M_HHTML+="<p class='"+y3+"'/>";
							skin.length=0;
							break;
							}
						yu=1;
						y3=GetStyleSheetName("SS",skin[0].l,y,skin[yu].l-skin[0].r,skin[0].r-skin[0].l,skin[yu].r-skin[yu].l); // transparent
						M_HHTML+="<p class='"+y3+"'/>";
						skin.splice(0,1);
						skin.splice(0,1);
						}
				break;
				}
			}
		
	}
*/	
function NumericalLeftSort(a,b){if(a.l==b.l)return(a.r-b.r); return(a.l-b.l);}	
var DivTestCount=0;	
var StokeMouseEvent= new Array();
function mkDiv(x, y, w, h)
	{
	var x2,y2;
	var x1=-1;
	var g,gg;
	var uu;
		
//	try {
//		g=StokeMouseEvent[CurveAddlevel].Mouse;
//		}
//	catch(e)	
if(StokeMouseEvent.length <=CurveAddlevel)
		{
//		if(CurveAddlevel)
//			{
//			try{g=StokeMouseEvent[CurveAddlevel-1].Mouse;}
//			catch(e){CurveAddlevel--;}
//			}
		StokeMouseEvent[CurveAddlevel]=new Array();
		StokeMouseEvent[CurveAddlevel].PathMinX=StokeMouseEvent[CurveAddlevel].PathMinY=20000;
		StokeMouseEvent[CurveAddlevel].PathMaxX=StokeMouseEvent[CurveAddlevel].PathMaxY=-20000;
		StokeMouseEvent[CurveAddlevel].Mouse=DrawingLevel;
		StokeMouseEvent[CurveAddlevel].start=NewPpoints.length;
		}
	x2=NewPpoints.length;

	if(x2)
		{
		x1=x2-1;
		uu=NewPpoints[x1];
		if(uu.Addlevel==CurveAddlevel)
			{
			if(uu.y==y && uu.h==h)
				{
				if( (uu.x>=x && uu.x<=(x+w)) ||(x>=uu.x && x<=(uu.x+uu.w)) )
					{
					y2=(uu.x+uu.w);//x2
					if(y2<(x+w)) y2=(x+w);
					if(uu.x>x) uu.x=x;
					uu.w=y2-uu.x;
					x1=-2;
					}
				}
			if(x1>=0)
			if(uu.x==x && uu.w==w)
				{
				if( (y>=uu.y && y<=(uu.y+uu.h))||(uu.y>=y && uu.y<=(y+h)) )
					{// inersect
					y2=uu.y+uu.h;
					if(y2<(y+h)) y2=y+h;
					if(uu.y>y)uu.y=y;
					uu.h=y2-uu.y;
					x1=-2;
					}
				}
			}
		}
	if(x1!=-2)
		{
		x2=NewPpoints.length;
		NewPpoints[x2]=new Array();
		
		//NewPpoints[x2].x=x;
		//NewPpoints[x2].y=y;
		//NewPpoints[x2].w=w;
		//NewPpoints[x2].h=h;
		//NewPpoints[x2].Addlevel=CurveAddlevel;
		//NewPpoints[x2].DrawingLevel=DrawingLevel;
		x1=NewPpoints[x2];
		x1.x=x;
		x1.y=y;
		x1.w=w;
		x1.h=h;
		x1.Addlevel=CurveAddlevel;
		x1.DrawingLevel=DrawingLevel;
		}
		
		


//if(StokeMouseEvent[CurveAddlevel].PathMinX>x) StokeMouseEvent[CurveAddlevel].PathMinX=x;
//if(StokeMouseEvent[CurveAddlevel].PathMinY>y) StokeMouseEvent[CurveAddlevel].PathMinY=y;
//if(StokeMouseEvent[CurveAddlevel].PathMaxX<(x+w-1))StokeMouseEvent[CurveAddlevel].PathMaxX=(x+w-1);
//if(StokeMouseEvent[CurveAddlevel].PathMaxY<(y+h-1))StokeMouseEvent[CurveAddlevel].PathMaxY=(y+h-1);
	x2=StokeMouseEvent[CurveAddlevel];
	if(x2.PathMinX>x)		{x2.PathMinX=x;if(ItemMinX>x)ItemMinX=x;}
	if(x2.PathMinY>y)		{x2.PathMinY=y;if(ItemMinY>y)ItemMinY=y;}
	if(x2.PathMaxX<(x+w-1))	{x2.PathMaxX=(x+w-1);if((ItemMaxX+w)<x)ItemMaxX=x;}
	if(x2.PathMaxY<(y+h-1))	{x2.PathMaxY=(y+h-1);if((ItemMaxY+h)<y)ItemMaxY=y;}



	//if((ItemMaxX+w)<x)ItemMaxX=x;
	//if((ItemMaxY+h)<y)ItemMaxY=y;
	//if(ItemMinX>x)ItemMinX=x;
	//if(ItemMinY>y)ItemMinY=y;
	return;
	}



function MakeLine(x1, y1, x2, y2) // make line
{
var pp;
pp=SVGTransform(x1,y1);x1=pp.x;y1=pp.y;
pp=SVGTransform(x2,y2);x2=pp.x;y2=pp.y;
if(x1==x2)
	{
	if(y2<y1)
		mkDiv(x1,y2,1,y1-y2+1);
	else	
		{
		if(y1==y2) {return;	mkDiv(x1,y1,1,1);}
			else
		mkDiv(x1,y1,1,y2-y1+1);	
		}
	return;
	}
else
if(y1==y2)
	{
	if(x1<x2) mkDiv(x1,y2,x2-x1+1,1);
	else
		mkDiv(x2,y2,x1-x2+1,1);	
	return;
	}

if (x1 > x2)
	{

	MakeLineSwap(-x1, y1, -x2, y2); 
	return;
	}


		
		var dx = x2-x1, dy = Math.abs(y2-y1),	x = x1, y = y1,	yIncr = (y1 > y2)? -1 : 1;

		if (dx >= dy)
		{
			var pr = dy<<1,		pru = pr - (dx<<1),		p = pr-dx,		ox = x;
			while ((dx--) > 0)
			{
				++x;
				if (p > 0)
				{

					mkDiv(ox, y, x-ox, 1);
					y += yIncr;
					p += pru;
					ox = x;
				}
				else p += pr;
			}

			mkDiv(ox, y, x2-ox+1, 1);
		}

		else
		{
			var pr = dx<<1,		pru = pr - (dy<<1),		p = pr-dy,		oy = y;
			if (y2 <= y1)
			{
				while ((dy--) > 0)
				{
					if (p > 0)
					{
						mkDiv(x++, y, 1, oy-y+1);
						y += yIncr;
						p += pru;
						oy = y;
					}
					else
					{
						y += yIncr;
						p += pr;
					}
				}

				mkDiv(x2, y2, 1, oy-y2+1);
			}
			else
			{
				while ((dy--) > 0)
				{
					y += yIncr;
					if (p > 0)
					{

					mkDiv(x++, oy, 1, y-oy);
						p += pru;
						oy = y;
					}
					else p += pr;
				}

			mkDiv(x2, oy, 1, y2-oy+1);
			}
		}
}

function MakeLineSwap(x1, y1, x2, y2) // make line
{
var dx = x2-x1, dy = Math.abs(y2-y1),	x = x1, y = y1,	yIncr = (y1 > y2)? -1 : 1;

		if (dx >= dy)
		{
			var pr = dy<<1,		pru = pr - (dx<<1),		p = pr-dx,		ox = x;
			while ((dx--) > 0)
			{
				++x;
				if (p > 0)
				{
					mkDiv((-ox)-(x-ox), y, x-ox, 1);
					y += yIncr;
					p += pru;
					ox = x;
				}
				else p += pr;
			}
			mkDiv((-ox)-(x2-ox+1), y, x2-ox+1, 1);
		}

		else
		{
			var pr = dx<<1,		pru = pr - (dy<<1),		p = pr-dy,		oy = y;
			if (y2 <= y1)
			{
				while ((dy--) > 0)
				{
					if (p > 0)
					{
					mkDiv((-(x++))-1, y, 1, oy-y+1);
						y += yIncr;
						p += pru;
						oy = y;
					}
					else
					{
						y += yIncr;
						p += pr;
					}
				}
			mkDiv((-x2)-1, y2, 1, oy-y2+1);
			}
			else
			{
				while ((dy--) > 0)
				{
					y += yIncr;
					if (p > 0)
					{
						mkDiv((-(x++))-1, oy, 1, y-oy);
						p += pru;
						oy = y;
					}
					else p += pr;
				}
			mkDiv((-x2)-1, oy, 1, y2-oy+1);
			}
		}
}

























function MakeCurve(X0,Y0,X1,Y1,X2,Y2,X3,Y3) 
		{
		var x,y;
		var stage;
		var stage_add=1;
		var pp;
		pp=SVGTransform(X0,Y0);X0=pp.x;Y0=pp.y;
		pp=SVGTransform(X1,Y1);X1=pp.x;Y1=pp.y;
		pp=SVGTransform(X2,Y2);X2=pp.x;Y2=pp.y;
		pp=SVGTransform(X3,Y3);X3=pp.x;Y3=pp.y;
	
		
		
		
		var ax, bx, cx, ay, by, cy, xt, yt, t, I;
		if(Math.abs(X1-X2)> Math.abs(Y1-Y2)) x=Math.abs(X1-X2); else x=Math.abs(Y1-Y2);
		if(Math.abs(X3-X2)> Math.abs(Y3-Y2)) x+=Math.abs(X3-X2); else x+=Math.abs(Y3-Y2);
		if(Math.abs(X3-X0)> Math.abs(Y3-Y0)) x+=Math.abs(X3-X0); else x+=Math.abs(Y3-Y0);
		if(Math.abs(X1-X0)> Math.abs(Y1-Y0)) x+=Math.abs(X1-X0); else x+=Math.abs(Y1-Y0);
		if(x<1000)
			stage_add=Math.round(1000/x);
			
		cx = 3 * (X1 - X0);
		bx = 3 * (X2 - X1) - cx;
		ax = X3 - X0 - cx - bx;
    
		cy = 3 * (Y1 - Y0);
		by = 3 * (Y2 - Y1) - cy;
		ay = Y3 - Y0 - cy - by;
		var CheckY,orientation,CheckX;
		CheckY=CheckX=-10000;
		orientation=0;
		//mkDiv(X0, Y0, 1,1);
		//mkDiv(X3, Y3, 1,1);
		for(stage=0;stage<=999+stage_add;stage+=stage_add)
			{
			if(stage>1000) stage=1000;
			xt = ax * BB3[stage] + bx * BB2[stage] + cx * BB1[stage] + X0;
			yt = ay * BB3[stage] + by * BB2[stage] + cy * BB1[stage] + Y0;
			yt=Math.round(yt);
			xt=Math.round(xt);
			if(stage)
				{
				if((CheckY<yt && orientation==1) || (CheckY>yt && orientation==2))
						{
						// change course
						CurveAddlevel++;
						mkDiv(CheckX, CheckY, 1,1);
						if(orientation==2) orientation=1; else orientation=2;
						PathOrient[CurveAddlevel]=orientation;
						}
				else if(orientation==0)
					{
					if(CheckY>yt) orientation=1;
					else
					  if(CheckY<yt) orientation=2;
					PathOrient[CurveAddlevel]=orientation;
					}
				}
			if(CheckY==yt && CheckX==xt) continue;
			CheckY=yt;
			CheckX=xt;
			mkDiv(CheckX,CheckY,1,1);
			}
		}
		
function isArray(obj) 
	{
	try {
		var a=obj[0];
		return(1);
		}
	catch(e)
		{
		return(0);
		}
	}
var SwapNeeded=0;

function GetGradOffset(x,y,b,fill_type) //gradi,fill_type
		{
		var c ;
		if(fill_type==2)
			{
			if(SwapNeeded)
				c=GetLinearOffset(y,x,b.y1,b.x1,b.y2,b.x2);
			else
				c=GetLinearOffset(x,y,b.x1,b.y1,b.x2,b.y2);
			}
		else
			c=GetRadialOffset(x,y,b.fx,b.fy);
		return(c);
		}


function ProcessOneLine(cur,x,y,w)
		{
		var htmm="";
		var mouseevent="onmousedown='FloodMouseDown("+cur+")'";
		w+=x;
		var x2=x;
		var b=ItemArray[cur].fillGradient;
		var a=ItemArray[cur].fillType;
		var c;
		var m;
		var ii=0;
		var kk= new Array();
		var subflag=3;
		if(a==2) subflag=1000;
		for(x=x;x<w;x++)
			{
			c=GetGradOffset(x,y,b,a);
			c=Math.round(c);
			if(c>=ColorOpaRR) c=Math.round(ColorOpaRR-1);
			if(c<0) c=0;
			kk[ii]=c;
			ii++;
			}
		kk[ii]=kk[ii-1];
		w-=x2;
		b=ColorOpa;
		if(ie5)
			for(x=0,m=1;x<w;x++,m++)
				{
				while(m<w && b[kk[x]].st==b[kk[m]].st  && m-x<subflag) m++;
				var cck="transparent";//RgbToString( b[kk[x]].R,b[kk[x]].G,b[kk[x]].B);
				var color1=AlphaRgbToString(Math.round(b[kk[x]].O*255),  b[kk[x]].R,b[kk[x]].G,b[kk[x]].B);
				var color2=AlphaRgbToString(Math.round(b[kk[m-1]].O*255),b[kk[m-1]].R,b[kk[x]].G,b[kk[m-1]].B);
				var thiscolor=cck+';filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=1, StartColorStr="'+color1+'", EndColorStr="'+color2+'")';
				//htmm+="<div "+mouseevent+" style='overflow:hidden;position:absolute;left:"+(x2+x)+"px;top:"+y+"px;width:"+(m-x)+"px;height:1px;background-color:"+thiscolor+";border-style:none;'></div>";
				htmm+="<div "+mouseevent+" style='overflow:hidden;position:absolute;left:"+(x2+x)+"px;top:"+y+"px;width:"+(m-x)+"px;height:1px;background-color:"+thiscolor+";border-style:none;'/>";
				x=m-1;
				}
		else	
		for(x=0,m=1;x<w;x++,m++)
			{
			var thiscolor=RgbToString(b[kk[x]].R,b[kk[x]].G,b[kk[x]].B);
			while(m<w && b[kk[x]].O==b[kk[m]].O && b[kk[x]].R==b[kk[m]].R &&	b[kk[x]].B==b[kk[m]].B && b[kk[x]].G==b[kk[m]].G) 
					m++;
			var mopaci=1;	
			if(b[kk[x]].O>=0 && b[kk[x]].O<1)
				{
				mopaci=b[kk[x]].O;
				thiscolor+=";opacity:"  +mopaci+  ";filter:alpha(opacity=" +(mopaci*100)+ ")";
				}
			//htmm+=MkDrawDiv((x2+x),y,(m-x),1,thiscolor,mopaci);
//htmm+="<div style='overflow:hidden;position:absolute;left:"+(x2+x)+"px;top:"+y+"px;width:"+(m-x)+"px;height:1px;background-color:"+thiscolor+";border-style:none;' "+mouseevent+"></div>";
htmm+="<div style='overflow:hidden;position:absolute;left:"+(x2+x)+"px;top:"+y+"px;width:"+(m-x)+"px;height:1px;background-color:"+thiscolor+";border-style:none;' "+mouseevent+"/>";
			x=m-1;
			}
		return(htmm);
		}
var ColorOpa =new Array();
var ColorOpaRR;
var IeFillGraddient=new Array();




function ProcessGradient(cur)
	{
	var b=ItemArray[cur].fillGradient;
	var a=ItemArray[cur].fillType;
	var y1,y2,r;
	var MainOpacity=ItemArray[cur].style.fillOpacity;
	if(a==2)
		{
		if(Math.abs(b.y2-b.y1) < Math.abs(b.x2-b.x1))
			{
			SwapNeeded=1;
			y1=b.x1;y2=b.x2;
			}
		else
			{
			SwapNeeded=0;
			y1=b.y1;y2=b.y2;
			}
		r=y2-y1;	
		}
	else {y1=0;y2=r=b.r;}
	r=Math.abs(r);
	ColorOpaRR=r;
	var c=ItemArray[cur].fillGradient.stop;
	var m,n,Radd,Gadd,Badd,Oadd;
	var R,G,B,O;
	ColorOpa =new Array();
	for(var x=0; x<c.length-1;x++)
		{
		x=Number(x);
		m=Math.round( c[x].offset* r);
		n=Math.round(c[x+1].offset* r);
		Oadd=n-m;
		R=G=B=O=0;
		Radd=(c[x+1].colorR-c[x].colorR)/Oadd;
		Gadd=(c[x+1].colorG-c[x].colorG)/Oadd;
		Badd=(c[x+1].colorB-c[x].colorB)/Oadd;
		R=c[x].colorR;
		G=c[x].colorG;
		B=c[x].colorB;
		//if(MainOpacity!=undefined)
		//	{
		//	O=MainOpacity;
		//	Oadd=0;
		//	}
		//else
			{
			O=c[x].opacity;
			Oadd=(c[x+1].opacity-c[x].opacity)/Oadd;
			}
		for(var h=m;h<=n;h++)
			{
			try	{ColorOpa[h].R=R;}	catch(e) {ColorOpa[h]= new Array();}
			ColorOpa[h].R=Math.round(R)&0xff;
			ColorOpa[h].G=Math.round(G)&0xff;
			ColorOpa[h].B=Math.round(B)&0xff;
			ColorOpa[h].O=O;ColorOpa[h].O=Math.round( ColorOpa[h].O*100); // +- 5% 
			ColorOpa[h].O/=100;
			ColorOpa[h].st=x;
			O=(Number(O)+Number(Oadd));
			R=(Number(R)+Number(Radd));
			G=(Number(G)+Number(Gadd));
			B=(Number(B)+Number(Badd));
			}
		}
	}
function GetLinearOffset(x,y,x1,y1,x2,y2)
	{
	var a=0;
	if(Math.abs(y2-y1)<10) return((x-x1));
	if(Math.abs(x2-x1)<10) return((y-y1));
	if(Math.abs(x-x1)<3) return((y-y1));
	var atan1=Math.atan((y2-y1)	/(x2-x1));
	var atan2=Math.atan((y-y1)	/(x-x1) );
	//if(x==x1)  return(y-y1);
		atan2-=atan1; // new corner
	var mt=Math.sqrt( 	((x-x1)*(x-x1)) + ((y-y1)*(y-y1))   ) * Math.abs (Math.cos (atan2));
	mt=mt/ Math.sqrt( 	((x2-x1)*(x2-x1)) + ((y2-y1)*(y2-y1))   ) ;
	return(mt*(y2-y1));
	}
function GetRadialOffset(x,y,x1,y1)
	{
	return (  Math.sqrt(((x-x1)*(x-x1)) + ((y-y1)*(y-y1))) );
	}


function DrawEllipse( cx ,  cy , wid ,  hgt ,  angle)
	{
	var sin_angle =Math.sin (angle);
	var cos_angle =Math.cos  (angle);
	var theta = 0;
	var dtheta =Math.PI /64;
	var X, Y , RX, RY;
	X = wid * Math.cos(theta);
    Y = hgt * Math.sin(theta);
    
    var CurrentX =X+cx;
    var CurrentY =Y+cy;
    var a=0;
    while (theta <= (2 * Math.PI))
		{
        theta = (theta + dtheta);
        X = wid * Math.cos(theta);
        Y = hgt * Math.sin(theta);
        X+=cx;
        Y+=cy;
		if(a<32)		MakeLine( (CurrentX+CirleAddRight), (CurrentY+CirleAddBot), (X+CirleAddRight), (Y+CirleAddBot));//X2Y2
		else if(a< 64)	MakeLine( CurrentX, (CurrentY+CirleAddBot), X, (Y+CirleAddBot));//X1/Y2
		else if(a< 96)	MakeLine( CurrentX, CurrentY, X, Y);//X1Y1
		else			MakeLine( (CurrentX+CirleAddRight), CurrentY, (X+CirleAddRight), Y);//X2Y1
        CurrentX =X;
        CurrentY =Y;
        a++;
        
        }
    return;   
	}

	