function DG_R()
{
	this.l=0;
	this.t=0;
	this.w=0;
	this.h=0;
	this.ReadRect=function(o)
	{
		this.l=(o.l)?o.l:0;
		this.t=(o.t)?o.t:0;
		this.w=(o.w)?o.w:0;
		this.h=(o.h)?o.h:0;
	}
}

function DG_ImgArea()
{
	var myself=this;
	this.R=new DG_R();
	this.Kids=[];
	this.Layouts=[];
	this.PerformLinks=function(links)
	{
		if(!links)return;
		var obj=this.Content;
		for(var i=0;i<links.length;i++)
		{
			var lnk=links[i];
			if(lnk.pid>=0)
				obj.PP[lnk.pid]=lnk.v;
			else
				SetProp(lnk.pid,lnk.v);
		}
	}
	
	function SetProp(pid,v)
	{
		switch(pid)
		{
			case -1: myself.DIV.SS(7,v); break; //cursor
			case -2: myself.DIV.onclick=v; break;
			case -3: myself.DIV.SS(10,v); break; //alt
			case -4: myself.DIV.SS(1,v); break; //bg color
			case -5: myself.DIV.SS(3,v); break; //border
//			case -6: myself.DIV.SS(35,v); break; //padding
		}
	}
	
	this.CreateDiv=function()
	{
		var r=myself.R;
		var d=myself.P.DIV;
		myself.DIV=DG_CreateDiv(d,{l:r.l,t:r.t,w:r.w,h:r.h});
//		myself.DIV.SS(3,"1px solid red"); //temp
	}
	this.SetCanvas=function(c)
	{
		var r=myself.R;
		myself.DIV=c;
		if(DG_W(c)<=0)c.SS(5,r.w);
		if(DG_H(c)<=0)c.SS(6,r.h);
	}
}

function DG_Render()
{
	var m_objRoot;
	var m_templ;
	var m_links=[];
	var m_layouts=[];
	this.SetTemplate=function( templ )
	{
		m_templ=templ;
		m_templ.Img=function(n){return m_templ.m_images[n];}
		m_templ.Fnc=function(n){return m_templ.m_fncs[n];}
		ParseLinks();
		ParseLayouts();
	}
//	function GetImg(n){return m_templ.m_images[n]}
//	function GetFnc(n){return m_templ.m_fncs[n]}
	function ParseLinks()
	{
		if(!m_templ||!m_templ.m_links)return;
		var len=m_templ.m_links.length;
		for(var i=0;i<len;i++)
		{
			var link=m_templ.m_links[i];
			var path=link.i;//link.o;
			if(!m_links[path])m_links[path]=new Array();
			var lnks=m_links[path];
			lnks[lnks.length]=link;
			
			switch(link.type)
			{
				case 4: link.v=m_templ.m_images[link.img]; break; // ref to image
				case 5: link.v=m_templ.m_fncs[link.fnc]; break;	// ref to function
				case 6: link.v=link.ss; break; // html props
				case 7: link.v=m_templ.PP[link.pid]; break;	// ext. prop.
			}
		}
	}
	function ParseLayouts()
	{
/*		var len=templ.m_layouts.length;
		for(var i=0;i<len;i++)
		{
			var lt=templ.m_layouts[i];
			DG_CF.New(lt.type);
		}	
*/	}
	this.Render=function( canvas )
	{
		CreateObjs(canvas);
		ProcessLayouts(m_objRoot);
		PerformLinks(m_objRoot);
		RenderObjs(canvas);
	}
	
	function CreateObjs(canvas)
	{
		m_templ.m_objs=[];
		var stack=new Array();
		var area=new DG_ImgArea();
		area.Content=new DG_Rect();//canvas
		area.DIV=canvas;
		area.Content.DIV=canvas;
		area.Path="";
		m_objRoot=area;
		stack.push({lv:0,o:area});
		var len=(m_templ.m_tree)?m_templ.m_tree.length:0;
		var level=0;
		var lastObj=stack[stack.length-1];
		for(var i=0;i<len;i++)
		{
			var p=stack[stack.length-1];
			var a=m_templ.m_tree[i];
			if(!a)continue;
			if(a.lv>0)
			{
				if(a.lv>(p.lv+1))
				{
					stack.push(lastObj);
					p=lastObj;
				}
				else if(a.lv<=p.lv)
				{
					while(a.lv<(p.lv+1)){p=stack.pop();}
					stack.push(p);
				}
			}
			level=a.lv;

			var typeName=m_templ.m_types[a.t];
			if(typeName.substring(0,3)=="DW_")
				alert("DW");
			var o=DG_CF.New(typeName);
			if(typeName=="DG_Area2")
			{
				if(!o)
					continue;
				RenderArea(p.o,o,a);
				continue;
			}
			area=new DG_ImgArea();
			area.P=p.o;
			lastObj={lv:level,o:area};
			area.R.ReadRect(a.r);
			ReadLayouts(area,a.layout);
			if(level>0)
				area.CreateDiv();
			else
			{
				area.SetCanvas(canvas);
//				area.DIV=canvas;
			}
			if(!area.DIV.JSO)area.DIV.JSO=o;
			area.Content=o;
			var idx=p.o.Kids.length;
			area.Path=p.o.Path+"/"+idx;
			p.o.Kids[idx]=area;
			m_templ.m_objs[i]=area;
			area.i=i;
//			area.DIV.SS(10,area.Path);//test
			
			var st=(m_templ.m_st)?m_templ.m_st[a.st]:null;
			DG_SetDomProps(area.DIV,st,m_templ.Img,m_templ.Fnc);
			DG_SetDomProps(area.DIV,a.ss,m_templ.Img,m_templ.Fnc);
			DG_SetObjProps(area.DIV.JSO,a.o,m_templ.Img,m_templ.Fnc);
//			DG_SetDomProps(o,a.pp);
//			area.PerformLinks(a.pp);
		}
		
		function ReadLayouts(area,layouts)
		{
			if(!layouts)return;
			for(var i=0;i<layouts.length;i++)
			{
				var id=layouts[i];
				var l=m_layouts[id];
				if(!l)
				{
					var lt=m_templ.m_layouts[i];
					m_layouts[id]=DG_CF.New(lt.type);
				}
				area.Layouts[area.Layouts.length]=m_layouts[id];
			}
		}
	}
	
	function RenderArea(p,a,tr)
	{
		var o=p.Content;
		o.AddArea(a);
		var r=tr.r;
		a.PP[0]=r.l;a.PP[1]=r.t;a.PP[2]=r.w;a.PP[3]=r.h;
		if(!tr.pp)return;
		for(var p in tr.pp)
		{
			var fx="p";
			if(p.substring(0,4)=="pfnc") fx="pfnc";
			var id=parseInt(p.replace(fx,""));
			var v=null;
			if( fx=="pfnc" )
			{
				var idx=tr.pp[p];
				a.PP[id]=m_templ.m_fncs[idx];
			}
			else
			{
				a.PP[id]=tr.pp[p];
			}
		}
	}
	
	function ProcessLayouts(a)
	{
		for(var i=0;i<a.Layouts.length;i++)
		{
			var l=a.Layouts[i];
			l.Process(a);
		}
		for(var i=0;i<a.Kids.length;i++)
		{
			var a2=a.Kids[i];
			ProcessLayouts(a2);
		}
	}
	
	function PerformLinks(a)
	{
		var links=m_links[a.i];//[a.Path];
		if(links)
			a.PerformLinks(links);
		for(var i=0;i<a.Kids.length;i++)
		{
			var a2=a.Kids[i];
			PerformLinks(a2);
		}
	}
	
	function RenderObjs(canvas)
	{
		var len=m_templ.m_objs.length;
		var stack=new Array();
		stack.push({lv:0,o:canvas});
		var p=canvas;
		for(var i=0;i<len;i++)
		{
			var a=m_templ.m_objs[i];
			var o=a.Content;
			if(!o)continue;
			o.DIV=a.DIV;
			o.RenderObj(a.R);
		}
		for(var i=0;i<len;i++)
		{
			var a=m_templ.m_objs[i];
			var render = new DG_Render();
			render.SetTemplate( a.Content );
			render.Render( a.DIV );
		}
	}
}