/*f*****************/
function putPixel(xp,yp,qpsize,scp,sidparent)
{
	var pixel;
	
	pixel=document.createElement('div');
	
	pixel.style.position='absolute';
	
	pixel.style.border='solid '+scp;
	pixel.style.borderTopWidth=qpsize+'px';
	pixel.style.borderBottomStyle='none';
	pixel.style.borderRightStyle='none';
	pixel.style.borderLeftStyle='none';
	
	pixel.style.width=qpsize+'px';
	
	pixel.style.left=xp+'px';
	pixel.style.top=yp+'px';
	
	if(sidparent!=null)
		document.getElementById(sidparent).appendChild(pixel);
	else
		document.body.appendChild(pixel);
		
	return pixel;
}
/*f*****************/
function drawLine(xb,yb,xe,ye,scp)
{
	var oLine;
	var xp,yp;
	var qpsize;
	var pixel;
	var	aPixel;
	
	aPixel=new Array();
	
	qpsize=1;
	oLine=defStraightLineByTwoPoints(xb,yb,xe,ye);
	if(xe!=xb)
	{
		if(Math.abs(oLine.coe)<=1)
		{
			if(xb<xe)
			{
				for(xp=xb;xp<=xe;xp++)
				{
					yp=oLine.coe*xp+oLine.byi;
					pixel=putPixel(xp,yp,qpsize,scp);
					aPixel.push(pixel);
				}
			}
			else
			{
				for(xp=xb;xp>=xe;xp--)
				{
					yp=oLine.coe*xp+oLine.byi;
					pixel=putPixel(xp,yp,qpsize,scp);
					aPixel.push(pixel);
				}
			}
		}
		else
		{
			if(yb<ye)
			{
				for(yp=yb;yp<=ye;yp++)
				{
					xp=(yp-oLine.byi)/oLine.coe;
					pixel=putPixel(xp,yp,qpsize,scp);
					aPixel.push(pixel);
				}
			}
			else
			{
				for(yp=yb;yp>=ye;yp--)
				{
					xp=(yp-oLine.byi)/oLine.coe;
					pixel=putPixel(xp,yp,qpsize,scp);
					aPixel.push(pixel);
				}
			}
		}
	}
	else
	{
		xp=xb;
		if(yb<ye)
		{
			for(yp=yb;yp<=ye;yp++)
			{
				pixel=putPixel(xp,yp,qpsize,scp);
				aPixel.push(pixel);
			}
		}
		else
		{
			for(yp=yb;yp>=ye;yp--)
			{
				pixel=putPixel(xp,yp,qpsize,scp);
				aPixel.push(pixel);
			}
		}
	}
	
	return aPixel;
}
/*f*****************/
function defStraightLineByTwoPoints(xb,yb,xe,ye)
{
	var oLine;
	
	oLine=new Object();
	oLine.coe=(ye-yb)/(xe-xb);
	oLine.byi=undefined;
	if(xe!=xb)
		oLine.byi=-oLine.coe*xb+yb;

	return oLine;
}
/*f*****************/
function drawLineInViewportNS(left,top,right,bottom,xbrel,ybrel,xerel,yerel,scp,bup)
{
	var	aPixel;
	var	xb,yb,xe,ye,cu;
	var coe,byi;
	var oLine;
	var	bdraw;
	var	bcht;
	
	if(bup)
	{
		ybrel=bottom-top-ybrel;
		yerel=bottom-top-yerel;
	}

	xb=left+xbrel;yb=top+ybrel;
	xe=left+xerel;ye=top+yerel;

	bcht=false;
	if(xb>xe)
	{
		cu=xb;xb=xe;xe=cu;
		cu=yb;yb=ye;ye=cu;
		bcht=true;
	}
//	alert('(r)b * e['+xb+':'+yb+' * '+xe+':'+ye+']');
	
	oLine=defStraightLineByTwoPoints(xb,yb,xe,ye);
	
	bdraw=true;
	if(xb<left)
	{
		if(xe>=left)
		{
			xb=left;
			yb=oLine.coe*xb+oLine.byi;
		}
		else
			bdraw=false;
	}
	if(xe>right)
	{
		if(xb<=right)
		{
			xe=right;
			ye=oLine.coe*xe+oLine.byi;
		}
		else
			bdraw=false;
	}
	if(yb<top)
	{
		if(ye>=top)
		{
			yb=top;
			if(!(isNaN(oLine.coe)||oLine.coe==Infinity||oLine.coe==-Infinity))
				xb=(yb-oLine.byi)/oLine.coe;
		}
		else
			bdraw=false;
	}
	if(ye<top)
	{
		if(yb>=top)
		{
			ye=top;
			if(!(isNaN(oLine.coe)||oLine.coe==Infinity||oLine.coe==-Infinity))
				xe=(ye-oLine.byi)/oLine.coe;
		}
		else
			bdraw=false;
	}
	if(ye>bottom)
	{
		if(yb<=bottom)
		{
			ye=bottom;
			if(!(isNaN(oLine.coe)||oLine.coe==Infinity||oLine.coe==-Infinity))
				xe=(ye-oLine.byi)/oLine.coe;
		}
		else
			bdraw=false;
	}
	if(yb>bottom)
	{
		if(ye<=bottom)
		{
			yb=bottom;
			if(!(isNaN(oLine.coe)||oLine.coe==Infinity||oLine.coe==-Infinity))
				xb=(yb-oLine.byi)/oLine.coe;
		}
		else
			bdraw=false;
	}
//	alert('b * e['+xb+':'+yb+' * '+xe+':'+ye+']');

	if(bcht)
	{
		cu=xb;xb=xe;xe=cu;
		cu=yb;yb=ye;ye=cu;
	}

	if(bdraw)
		aPixel=drawLine(xb,yb,xe,ye,scp);
	else
		aPixel=new Array();
	
	return aPixel;
}