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)
	{
		var d=myself.DIV;
		switch(pid)
		{
			case -1: d.SS(7,v); break; //cursor
			case -2: d.onclick=v; break;
			case -3: d.SS(10,v); break; //alt
			case -4: d.SS(1,v); break; //bg color
			case -5: d.SS(3,v); break; //border
//			case -6: d.SS(35,v); break; //padding
		}
	}
	
	this.CreateDiv=function()
	{
		var r=myself.R;
		var d=myself.P.DIV;
		if(myself.Content.DIV)
		{
			myself.DIV=myself.Content.DIV;
			d.appendChild(myself.DIV);
			DG_SetDomProps(myself.DIV,{s12:r.l,s13:r.t,s5:r.w,s6:r.h});
			return;
		}
		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);
	}
	this.ApplyLayouts=function()
	{
		var m=myself;
		for(var i=0;i<m.Layouts.length;i++)
		{
			var l=m.Layouts[i];if(!l||!l.L)continue;
			l.L.ProcessLayout(m);
		}
	}
	this.SetL=function(l){myself.DIV.SS(12,l);}
	this.SetT=function(t){myself.DIV.SS(13,t);}
	this.SetW=function(w){myself.DIV.SS(5,w);}
	this.SetH=function(h){myself.DIV.SS(6,h);}
	this.GetAllKids=function(t,a)
	{
		if(!a)a=[];
		var k=myself.Kids;
		for(var i=0;i<k.length;i++)
		{
			var o=k[i];
			o.GetAllKids(t,a);
			if(t){if(o.Content.DgType!=t)continue;}
			a[a.length]=o;
		}
		return a;
	}
}

function DG_Render(t)
{
	var m_objRoot;
	var m_links=[];
	var m_layouts=[];
	var m_templ=t;
	if(!t)
		alert('no template');
	function SetTemplate()
	{
//		m_templ=t;
		m_templ.Imgs=function(n){return m_templ.m_images[n];}
		m_templ.Fncs=function(n){return m_templ.m_fncs[n];}
		m_templ.Params=function(n){return m_templ.PP[n];}
		m_templ.Strs=function(n){return m_templ.m_strs[n];}
		m_templ.Styles=function(n){return m_templ.m_st[n];}
		m_templ.Texts=function(n){return m_templ.m_text[n];}
		m_templ.Maps=function(n){return m_templ.m_maps[n];}
		ParseLinks();
		ParseLayouts();
	}
	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()
	{
		if(!m_templ.m_layouts)return;
		var len=m_templ.m_layouts.length;
		if(m_templ.Area)m_templ.Area.Layouts=m_templ.m_layouts;
		for(var i=0;i<len;i++)
		{
			var lt=m_templ.m_layouts[i];
			if(!lt.L)
				continue;
			var t=m_templ.m_types[lt.t];
			lt.L=DG_CF.New(t); if(!lt.pp)return;
			for(var k in lt.pp)
			{
				var n=parseInt(k.replace("p",""));
				var v=lt.pp[k];
				lt.L.PP[n]=v;
			}
		}
	}
	this.Render=function(canvas)
	{
		SetTemplate();
		CreateRes();
		CreateObjs(canvas);
		ProcessLayouts(m_objRoot);
		PerformLinks(m_objRoot);
		RenderObjs(canvas);
	}
	function CreateRes()
	{
		var rr=m_templ.m_res;
		var len=(rr)?rr.length:0;
		for(var i=0;i<len;i++)
		{
			var r=rr[i];if(!r)continue;
			var t=m_templ.m_types[r.t];
			r.o=DG_CF.New(t);
		}
	}	
	function CreateObjs(canvas)
	{
		m_templ.m_objs=[];
		m_templ.GetObj=function(i){return m_templ.m_objs[i].Content;}
		var stack=new Array();
		var area=new DG_ImgArea();
		area.Content=new DG_Rect();//canvas
		area.DIV=canvas;
		area.Content.DIV=canvas;
		area.Path="";
//		area.Layouts=m_templ.m_layouts;
		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=null;
			if(typeName=="DG_Span")
			{
				var id=a.ss.s100;
				o=DG_Obj(id);
			}
			if(!o)
				o=DG_CF.New(typeName);
			if(!o)
				throw("unknown type "+typeName);
			if(typeName=="DG_Area2")
			{
				if(!o)
					continue;
				RenderArea(p.o,o,a);
				continue;
			}
			area=new DG_ImgArea();
			area.P=p.o;
			if(o)o.Area=area;
			area.Content=o; 
			area.Layouts=(o)?o.m_layouts:null;
			lastObj={lv:level,o:area};
			area.R.ReadRect(a.r);
			ReadLayouts(area,a.layout);
			if(level>0)
			{
				area.CreateDiv();
//				if(o&&o.SetDiv)
//					o.SetDiv(area.DIV);
			}
			else
				area.SetCanvas(canvas);
			if(!area.DIV.JSO)area.DIV.JSO=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);
			DG_SetDomProps(area.DIV,a.ss,m_templ);
			DG_SetObjProps(area.DIV.JSO,a.o,m_templ);
		}

		for(var i=0;i<m_templ.m_objs.length;i++)
		{
			var o=m_templ.m_objs[i];
			var a=m_templ.m_tree[i];
			DG_SetObjProps(o.Content,a.pp,m_templ);
//			DG_SetDomProps(o,a.pp);
//			area.PerformLinks(a.pp);
			if(!o)
				DG_CF.LoadWidget(area.DIV,typeName,null);
		}
		
		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)
	{
		if(a.Layouts)
		for(var i=0;i<a.Layouts.length;i++)
		{
			var l=a.Layouts[i];
			if(l.L)
				l.L.Process(a);
		}
		if(a.Kids)
		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)
	{
//		if(canvas.JSO&&canvas.JSO.RenderObj)
//			canvas.JSO.RenderObj();

		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;
//new			
			var render=new DG_Render(a.Content);
			render.Render( a.DIV );
			if(typeof(o.RenderObj)!="undefined")
				o.RenderObj(a.R);
		}
/*new
		for(var i=0;i<len;i++)
		{
			var a=m_templ.m_objs[i];
			if(!a||!a.Content) continue;
			var render = new DG_Render(a.Content);
			render.Render( a.DIV );
			if(a.Content&&a.Content.ApplyPP)
				a.Content.ApplyPP();
		}
*/
	}
}
