// Diagramics generic JavaScript functions
function DG_Obj(s){var o=document.getElementById(s);if(o&&!o.SS)DG_Init(o);return o;};
function DG_New(s){var o=document.createElement(s);DG_Init(o);return o;}
function DG_NewText(s){return document.createTextNode(s);}
function DG_None(){return false;}

function DG_Object()
{
	var myself=this;
	this.InitProps=function()
	{
		for(var i=0;i<myself.PP.length;i++){myself.PP[i]=myself.GetDefault(i);}
	}
	this.ApplyPP=function(){}//override
	this.SetPP=function(pp)
	{
		if(!myself.PPN||!pp)return;
		for( var pid in myself.PPN )
		{
			var name = myself.PPN[pid];
			if(name=="array")continue;
			var v=pp[name];
			myself.PP[pid]=v;
		}
	}
	this.SetPPfromSS=function(div)
	{
		var st=DG_GetStyle(div);
		if(!st)return;
		for(var i=0;i<this.PPN.length;i++)
		{
			var pn="dg-"+this.PPN[i];
			var v=st[pn];
			if(v)this.PP[i]=v;
		}
		return;
	}

	this.Serialize=function()
	{
		var s="";
		s+="t:'"+myself.DgType+"'";
		for(var i=0;i<myself.PP.length;i++)
		{
			var p=myself.PP[i];
			var t=typeof(p);
			var pt=myself.PD(i).t;
			if( p!=myself.GetDefault(i))
			{
				s+=",p"+i+":"+P2Str(p,pt);
			}
		}
		return s;
	}
	function P2Str(p,pt)
	{
		switch(pt)
		{
		case "url":
		case "clr":
		case "str": return "'"+p+"'";
		case "str[]": return "["+p.toString()+"]";
		case "int": return p.toString();
		case "bool": return (p)?1:0;
		default: return "";
		}
	}
}

function DG_InitDoc()
{
	var b=document.body;
	if(!b)return;
//	b.leftMargin=0;
//	b.topMagin=0;
//	b.oncontextmenu=DG_None;
//	b.onselectstart=DG_None;
	b.ondrag=DG_None;
	b.ondragstart=DG_None;
	b.ondragenter=DG_None;
	b.ondragover=DG_None;
	b.ondrop=DG_None;
	b.ondragend=DG_None;
	b.ondragleave=DG_None;
}
DG_InitDoc();

var DG_CF={};
DG_CF.Types={};
DG_CF.Servers=[];
DG_CF.Widgets=new Array();
DG_CF.New=function(typeName)
{
	var fnc=DG_CF.Types[typeName];
	if(!fnc)fnc=DG_CF[typeName];
	if(!fnc)return null;
	var o=fnc();
	o.DgType=typeName;
	return o;
}
function DG_ForEachDgDiv(type,fnc)
{
	var divs=document.getElementsByTagName("DIV");
	for(var i=0;i<divs.length;i++)
	{
		var d=divs[i];
		var dgn=d.getAttributeNode("dgType");
		if(!dgn)continue;
		var dgType=dgn.nodeValue;
		if((type)&&(type!=dgType))continue;
	    fnc(d,dgType);
	}
}

DG_CF.InitObjects=function()
{
	var divs=document.getElementsByTagName("DIV");
    for(var i=0;i<divs.length;i++)
    {
		var c=divs[i];
		var t=c.getAttributeNode('dgType');
		var id=c.id;
		if(!t)continue;
		var s=t.value;
		if(c.JSO)continue;
		c=DG_Init(c);
		var fnc=DG_CF[t.value];
		if(!fnc)continue;
		var o=fnc(c);
		c.JSO=o;
		//set properties
		var pp=c.getAttributeNode('dgPP');
		var pp1=c.getAttributeNode('dg-symbol');
		if(!pp)continue;
//		var c=;
		eval("pp="+pp.value);
		if(o.SetPP)o.SetPP(pp);
		if(o.SetPPfromSS)o.SetPPfromSS(c);

		//init object
		if(o.Init)o.Init();
		if(o.SetDiv)o.SetDiv(c);
	}
}
DG_CF.InitObjects2=function()
{
	var divs=document.getElementsByTagName("DIV");
    for(var i=0;i<divs.length;i++)
    {
		var d=divs[i];
		if(d.JSO)continue;
		d=DG_Init(d);
		var dgn=d.getAttributeNode("dgType");
		if(!dgn)continue;
		var dgType=dgn.nodeValue;
		var isInit=DG_IsInitClass(d,dgType);
		if(isInit)continue;
		var dgData=d.getAttributeNode("dgData");
		var dobj=(dgData)?eval(dgData.nodeValue):null;
		DG_CF.LoadWidget(d,dgType,pp,dobj);
	}
	for(var i=0;i<divs.length;i++)
    {
		var dv=divs[i];
		var o=dv.JSO;
		if(!o)
			continue;//widget
		var pp=dv.getAttributeNode("dgPP");
		if(pp)
		{	
			pp=pp.value;
			var p1; eval("p1="+pp);
			if(o.SetPP){o.SetPP(p1);}
		}
		if(o.ApplyPP)o.ApplyPP();
    }
}
DG_IsInitClass=function(d,dgType)
{
	var fnc=DG_CF.Types[dgType];
	if(!fnc)fnc=DG_CF[dgType];
	if(!fnc)return false;
	var o=fnc(); d.JSO=o;
	//init object
	if(o.Init)o.Init();
	if(o.SetDiv)o.SetDiv(d);
	var dgpp=d.getAttributeNode("dgPP");
	var pp=null;
	if(dgpp)
	{
		dgpp=dgpp.value;
		eval("pp="+dgpp);
		var o=d.JSO;
		if(pp&&o)
		if(o.SetPP)o.SetPP(pp);
		if(o.ApplyPP)o.ApplyPP();
	}
	
	if(o.m_tree)
	{
		var render=new DG_Render(o);
		render.Render(d);
	}
	return true;
}

//==============================================================================================
// generic functions
//==============================================================================================
function DG_PngImgSrc( img, src, sm, blankSrc )
{
	if(!img)return;
	if(!sm)sm='scale'; //'scale','image', or 'crop'
	if(!img.runtimeStyle){img.src = src;return;}
	img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='"+sm+"',enabled=true)";
	img.src=(blankSrc)? blankSrc: DG_ImgSrvUrl+"images/blank.gif";
}

function DG_Init(o,jso)
{
	if(o.nodeName=="#text")
		return o;
	o.ST=function(s){if(o.firstChild)o.firstChild.nodeValue=s;} // sets text of SPAN elements
	if(!o.SS) o["SS"]=DG_SS;
	if(!o.type){if(o.tagName=="DIV")o.type="div";}
	if(o.tagName=="IMG")o.galleryImg="false";
	var s = o.style;
//	if(!s.left) s.left=0;
//	if(!s.top) s.top=0;
	if(!o.X) o.X=DG_L(o);
	if(!o.Y) o.Y=DG_T(o);
	if(!o.W) o.W=DG_W(o);
	if(!o.H) o.H=DG_H(o);
	o.JSO=jso;
	return o;
}

//----------------------------------------------------------------------------------------
// function determines x/y position of the object 'obj' relative to the page/document
// from http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap13/index6.html
//----------------------------------------------------------------------------------------
function DG_getPos(obj)
{
    var o = obj; var oX = 0; var oY = 0;
    while(o){ oX += o.offsetLeft; oY += o.offsetTop; o = o.offsetParent; }
    return{X:oX,Y:oY};
}

function DG_L(o){ if(!o||(!o.style.left))return 0;	return parseInt(o.style.left.replace("px",""));}
function DG_T(o){ if(!o||(!o.style.left))return 0;	return parseInt(o.style.top.replace("px",""));}
function DG_W(o){ if(!o||(!o.style.width))return 0;	return parseInt(o.style.width.replace("px",""));}
function DG_H(o){ if(!o||(!o.style.height))return 0;return parseInt(o.style.height.replace("px",""));}
function DG_Trim(s)
{
	while(s.substring(0,1)==' '){s=s.substring(1,s.length);}
	while(s.substring(s.length-1,s.length)==' '){s=s.substring(0,s.length-1);}
	return s;
}

function DG_GetEvent(e)
{
	var e1=DG_MouseEvent(e);
	e=e1.ev;
	var x; var y;
	var b=document.body;
	if(!e.pageX) //IE
	{
		x=e.clientX+b.scrollLeft;if(b.clientLeft)x-=b.clientLeft;
		y=e.clientY+b.scrollTop;if(b.clientTop)y -=b.clientTop;
		var p=b.parentNode;
		if(p&&p.scrollTop)y+=p.scrollTop;
		if(p&&p.scrollLeft)x+=p.scrollLeft;
	}
	else
		{x=e.pageX;y=e.pageY;} //FireFox
   	e.X=x; e.Y=y;
	var r=false;if(e.which)r=(e.which==3);else if(e.button)r=(e.button==2);
	e.IsRightBtn=r;
   	return e;
}
function DG_Event(e)
{
	if(e==null){e=event;}
	DG_CancelEvent(e);
	return e;
}

function DG_Target(e)
{
	if(e==null){e=event;}
	var targ;
	if(e.target)targ=e.target;
	else if(e.srcElement)targ=e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}

function DG_KeyEvent(e)
{
	if(!e)e=window.event;
	var c=e.keyCode;if(!c&&e.which)c=e.which;
	return {ev:e,code:c,"char":String.fromCharCode(c),target:DG_EvTarget(e)};
}
function DG_MouseEvent(e)
{
	if(!e)e=window.event;
	var r=false; if(e.which)r=(e.which==3); else if(e.button)r=(e.button==2);
	return {ev:e,isRightBtn:r,target:DG_EvTarget(e)};
}
function DG_EvTarget(e)
{
	var t=(e.target)?e.target:null;
	if(e.srcElement)t=e.srcElement;
	if(t.nodeType==3)t=t.parentNode; // defeat Safari bug
	return t;
}

function DG_SetPngSrc(img,blankSrc,src)
{
	if(img.runtimeStyle)
	{
		img.runtimeStyle.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='scale',enabled=true)";
		img.src=blankSrc;
	}
	else
		img.src=src;
}

//----------------------------------------------------------------------------------------
// this function determines X and Y coordinates of the mouse relative to the object 'obj'.
// from http://evolt.org/article/Mission_Impossible_mouse_position/17/23335/index.html, "Mission Impossible - Mouse Position"
// see also: http://www.quirksmode.org/js/events_properties.html, "Event properties"
//----------------------------------------------------------------------------------------
function DG_EventPos(e,obj,isCancel)
{
	if(!e){e=event;}
	var tg=(e.target)?e.target:e.srcElement;
	if(tg.nodeType==3)tg=tg.parentNode;//safari
	if(isCancel)DG_CancelEvent(e);
	if((obj==tg)&&(e.offsetX))
		return{X:e.offsetX,Y:e.offsetY};
	var pos=DG_getPos( obj );
	var x; var y;
	if(!e.pageX)
	{
		// IE
		var b=document.body;
		if(b)
		{
			x=e.clientX+b.scrollLeft;if(b.clientLeft)x-=b.clientLeft;
			y=e.clientY+b.scrollTop;if(b.clientTop)y -=b.clientTop;
		}
		x= e.offsetX + pos.X;
		y= e.offsetY + pos.Y;
	}
	else
	{
		// FireFox
		x=e.pageX;
		y=e.pageY;
	}
	
	if(obj.parentNode&&obj.parentNode.scrollTop)y+=obj.parentNode.scrollTop;
	if(obj.parentNode&&obj.parentNode.scrollLeft)x+=obj.parentNode.scrollLeft;
	x-=pos.X;
	y-=pos.Y;
   	e.X=x; e.Y=y;
    return e;
}

function DG_CancelEvent(e)
{
	if(e==null){e=event;}
	e.cancelBubble=true;
	e.returnValue=false;
	if(e.stopPropagation)e.stopPropagation();
	if(e.preventDefault)e.preventDefault();
}

function DG_SS(p,v) 
{
	var o=this;
	var s=o.style;
	switch(p)
	{
	case 0:s.backgroundColor=(v)?v:"transparent";break;
	case 1:s.background=v;break;
	case 2:s.borderColor=v;break; // not all borders change color
	case 3:s.border=v;break; // "1px solid red"; /* if not set, default to system 3D border*/
	case 4:s.color=v;break;
	case 5:s.width=DG_IsStr(v)?v:v+"px";this.W=v;break;
	case 6:s.height=DG_IsStr(v)?v:v+"px";this.H=v;break;
	case 7:s.cursor=v;break;
	case 8:s.fontSize=DG_IsStr(v)?v:v+"px";break;
	case 9:s.borderWidth=v;break;
	case 10:o.title=v;this.alt=v;break;
	case 11:s.visibility=(v)?"visible":"hidden";break;
	case 12:s.left=DG_IsStr(v)?v:v+"px";this.X=v;break;
	case 13:s.top=DG_IsStr(v)?v:v+"px";this.Y=v;break;
	case 14:o.className=v;break;
	case 15:s.zIndex=v;break;
	case 16:o.SS(12,v.X);o.SS(13,v.Y);break;
	case 17:o.SS(12,v.X);o.SS(13,v.Y);o.SS(5,v.W);o.SS(6,v.H);break;
	case 18:s.position=(v==1)?"absolute":"relative";break;
	case 19:s.overflow=(v==1)?"hidden":((v==0)?"visible":"auto");break;
	case 20:o.disabled=v;break;
	case 21:s.clip="rect("+v.t+"px "+v.r+"px "+v.b+"px "+v.l+"px)";break;
	case 22:o.value=v;break;
	case 23:{var r="block";switch(v){case 0:r="none";break;case 1:r="block";break;case 2:r="inline";break;case 3:r="list-item";break;}s.display=r;}break;
	case 24:s.fontFamily=v;break;
	case 25:s.fontWeight=(v==1)?"bold":(v==0)?"":v;break;//is bold
	case 26:s.fontSize=DG_IsStr(v)?v:v+"px";break;
	case 27:s.fontStyle=(v)?"italic":"";break;//is italic
	case 28:s.font=v;break; //e.g."italic bold 12pt/14pt Times, serif"
	case 30:s.margin=DG_IsStr(v)?v:v+"px";break;
	case 31:s.marginLeft=DG_IsStr(v)?v:v+"px";break;
	case 32:s.marginTop=DG_IsStr(v)?v:v+"px";break;
	case 33:s.marginRight=DG_IsStr(v)?v:v+"px";break;
	case 34:s.marginBottom=DG_IsStr(v)?v:v+"px";break;
	case 35:s.padding=DG_IsStr(v)?v:v+"px";break;
	case 36:s.paddingLeft=DG_IsStr(v)?v:v+"px";break;
	case 37:s.paddingTop=DG_IsStr(v)?v:v+"px";break;
	case 38:s.paddingRight=DG_IsStr(v)?v:v+"px";break;
	case 39:s.paddingBottom=DG_IsStr(v)?v:v+"px";break;
	case 40:s.cssFloat=v;s.styleFloat=v;break;
	case 41:if(v){o.SS(31,"auto");o.SS(33,"auto");o.SS(23,1);o.SS(18,0)};break; //center
	case 42:s.backgroundImage="url("+v+")"; break;
	case 43:{var r="repeat";switch(v){case 0:break;case 1:r="repeat-x";break;case 2:r="repeat-y";break;case 3:r="no-repeat";break;}s.backgroundRepeat=r;}break;
	case 44:s.backgroundAttachment=(v==1)?"fixed":"scroll";break;
//	case 45:s.backgroundPosition=v;break;
	case 45:s.backgroundPosition=""+v.X+"px "+v.Y+"px";break;
	case 46:{var r="normal";switch(v){case 0:break;case 1:r="pre";break;case 2:r="nowrap";break;}s.whiteSpace=r;}break; 
	case 47:{var r="disc";switch(v){case 0:r="disc";break;case 1:r="circle";break;case 2:r="square";break;case 3:r="decimal";break;case 4:r="lower-roman";break;case 5:r="upper-roman";break;case 6:r="lower-alpha";break;case 7:r="upper-alpha";break;case 8:r="none";break;};s.listStyleType=r;}break;
	case 48:s.listStyleImage="url("+v+")";break;
	case 49:s.wordSpacing=v;break;
	case 50:s.letterSpacing=v;break;
	case 51:{var r="none";switch(v){case 0:break;case 1:"underline";break;case 2:r="overline";break;case 3:r="line-through";break;case 4:r="blink";break;};s.textDecoration=r;}break;
	case 52:s.verticalAlign=v;break;
	case 53:{var r="none";switch(v){case 0:break;case 1:r="capitalize";break;case 2:r="uppercase";break;case 3:r="lowercase";break;};s.textTransform=r;}break;
	case 54:{var r="left"; switch(v){case 0:break;case 1:r="right";break;case 2:r="center";break;case 3:r="justify";break;}s.textAlign=r;}break;
	case 55:s.textIndent=v;break; 
	case 56:s.lineHeight=v;break;
	case 60:o.src=v;break;
	case 61:o.frameBorder=v;break;
	case 62:{var r="auto";switch(v){case 1:r="no";break;case 2:r="yes";break;}o.scrolling=r;}break;
	case 63:s.opacity=v/100;s.filter="alpha(opacity="+v+")";break;
	case 63:if(v)DG_PngImgSrc(o,o.src);break; //apply png correction
	case 64:o.name=v;break;
	case 65:/*o.clear=v;*/break;
	case 66:o.href=v;break;
	case 67:o.minHeight=v;break;
	case 68:o.maxHeight=v;break;
	case 69:o.minWidth=v;break;
	case 70:o.maxWidth=v;break;
	case 90:s.borderLeft=v;break;
	case 91:s.borderTop=v;break;
	case 92:s.borderRight=v;break;
	case 93:s.borderBottom=v;break;
	case 100:o.id=v;break;
	case 101:o.innerHTML=v;break;

	case 200:o.onclick=v;break;
	case 201:o.onmouseover=v;break;
	case 202:o.onmouseout=v;break;
	}
}
function DG_IsStr(s){return((s!=null)&&(typeof(s)!="undefined")&&(s.constructor==String));}

function DG_SP(d)
{
	var o=this;
	if(d.i){o.id=d.i;o.name=d.i;}	//"i" - id
	if(d.c)o.SS(14,d.c);				//"c" - class name
	if(d.dy!=null)o.SS(23,d.dy);		//"dy"- display
	o.SS(12,(d.l)?d.l:0);				//"l" - left
	o.SS(13,(d.t)?d.t:0);				//"t" - top
	if(d.w!=null)o.SS(5,d.w);			//"w" - width
	if(d.h!=null)o.SS(6,d.h);			//"h" - height
	if(d.v!=null)o.SS(11,d.v);			//"v" - visibility
	if(d.z)o.SS(15,d.z);				//"z" - zIndex
	o.SS(10,(d.a)?d.a:"");				//"a" - alt,title
	o.SS(18,1); //absolute position		
	if(d.b)o.SS(3,d.b);					//"b" - border
	//------------------------	
	if(d.bc)o.SS(0,d.bc);				//"bc" - background color
	if(d.op)o.SS(63,d.op);				//"op"  - opacity
}

function DG_AddChild(o,p,d)
{
	o["SS"] = DG_SS;
	o["SE"] = DG_SetEvent;
	if(d.i){o.id = d.i; o.name = d.i;}
	if(d.c)o.SS(14,d.c);
	if(d.dy!=null)o.SS(23,d.dy);
	o.SS(12,(d.l)?d.l:0);
	o.SS(13,(d.t)?d.t:0);
	if(d.w!=null)o.SS(5,d.w);
	if(d.h!=null)o.SS(6,d.h);
	if(d.v!=null)o.SS(11,d.v);
	if(d.z)o.SS(15,d.z);
	o.SS(10,(d.a)?d.a:"");
	o.SS(18,1); //absolute position
	if(d.b)o.SS(3,d.b);
	if(p)p.appendChild(o);
}
function DG_AddChild2(o,p,ss)
{
	if(!ss)ss={};
	o["SS"]=DG_SS;
	o["SE"]=DG_SetEvent;
	if(ss.id){o.id=ss.id;o.name=ss.id;}
	if(isNaN(ss.s18)&&isNaN(ss.s41))ss.s18=1;
	if(isNaN(ss.s11))ss.s11=1;
	if(isNaN(ss.s12))ss.s12=0;
	if(isNaN(ss.s13))ss.s13=0;
	DG_SetDomProps(o,ss);
	if(p)p.appendChild(o);
}
function DG_CreateImg(p,d)
{
//	var img = DG_New("IMG");
	var img=new Image();DG_Init(img);
	img.galleryImg="false";
	DG_AddChild(img,p,d);
	if(d.src)img.src=d.src;
	if(d.pngSrc)DG_PngImgSrc(img, d.pngSrc);
	if(d.a)img.title=d.a;
	return img;
}
function DG_CreateDiv(p,d)
{
	var o = DG_New("DIV");
	o.type = "div";
	o.SS(35,0);//always
	o.SS(19,1);//always
	DG_AddChild(o,p,d);
	return o;
}
function DG_NewDiv(p,ss)
{
	var o=DG_New("DIV");
	o.type = "div";
	o.SS(35,0);//always
	o.SS(19,1);//always
	DG_AddChild2(o,p,ss);
	return o;
}
function DG_NewForm(p,ss)
{
	var o = DG_New("FORM");
	DG_AddChild2(o,p,ss);
	return o;
}
function DG_NewIFrame(p,ss)
{
	var o=DG_New("IFRAME");
	o.type = "iframe";
	DG_AddChild2(o,p,ss);
	return o;
}
function DG_CreateSpan(p,d)
{
	var sp=DG_New("SPAN");
	DG_AddChild(sp,p,d);
	var t=DG_NewText(d.txt);
	sp.SS(54,0);
	sp.appendChild(t);
	sp.Text=t;
	sp.SetText=function(txt){DG_SetSpanText(sp,txt);}
	return sp;
}
function DG_CreateScriptTag(id,p)
{	
	// we need to remove and then create the script element in order to make FireFox work.
	// 1. remove old script
	var olds=document.getElementById(id);
	if(olds)
	{
		var p1=olds.parentNode;
		p1.removeChild(olds);
	}
	// 2. load new script
	var s=DG_New("script");
	s.id=id;
	s.type='text/javascript';
	s.defer=true;
	if(!p)p=document.body;
	p.appendChild(s);
	return s;
}
function DG_CreateTextBox(p,d,t)
{
	var o = DG_New("INPUT");
	o.type=(t)?t:"text";
	if(d.v) o.value = d.v;
	DG_AddChild(o,p,d);
	return o;
}
function DG_CreateButton(p,d)
{
	var o = DG_New("BUTTON");
//	o.style.height = 20; 	// height less than 20 looks bad (clipping)
	if(d.v)
	{
		var s = DG_NewText(d.v);
		o.appendChild(s);
	}
	DG_AddChild(o,p,d);
	o.SS(7,"pointer"); //cursor
	return o;
}
function DG_CreateCheckBox(p,d)
{
	var o = DG_New("INPUT");
	o.type = "checkbox";
	DG_AddChild(o,p,d);
	o.SS(7,"pointer"); //cursor
	o.checked = (d.v ==1);	// after appending
	return o;
}
function DG_CreateAnchor(p,d)
{
	var o = DG_New("A");
	o.href = d.link;
	var s = DG_NewText(d.value);
	o.appendChild(s);
	DG_AddChild(o,p,d);
	return o;
}
function DG_CreateRadioBtn2(p,d)
{
//	d.n = "name"; // temp
	var	b = null;
	var c = (d.ch==1); // is checked?
	try
	{
		//IE does not create radio buttons properly unless entire HTML is specified
		b = DG_New("<INPUT TYPE='radio' NAME='"+d.n+"' VALUE='"+d.i+"'" + ((c)?" CHECKED":"") + ">");
	} 
	catch (e){}
	if((b==null)||(b.type!="radio"))
	{
		//FireFox only creates radio buttons in W3C way
		b = DG_New("INPUT");
		b.type="radio";
		b.name = d.n;
		b.checked = c;
	}
	DG_AddChild(b,p,d);
	b.SS(7,"pointer"); //cursor
//	b.style.border="1px solid red";
//	b.style.backgroundColor="yellow";
//	b.style.width = 100;
//	b.style.height = 100;
	return b;
}
function DG_CreateTextArea(p,d)
{
	var o = DG_New("TEXTAREA");
	DG_AddChild(o,p,d);
	return o;
}
function DG_CreateSelect(p,d)
{
	var o = DG_New("SELECT");
	DG_AddChild(o,p,d);
	o.SS(7,"pointer");
	return o;
}
function DG_PopulateSelect(s,a,sel,selindex)
{
	if(!s)return;
	var len=s.options.length;
	for(var i=len-1;i>=0;i--)
	{
	    if(s.options.remove)s.options.remove(i);
	    if(s.remove)s.remove(i);
	}
	if(!a)return;
	for(var i=0;i<a.length;)
	{
		var v=a[i++];var t=a[i++];
		var o=new Option(t,v);
		s.options[s.options.length]=o;
		if(sel&&sel==v)o.selected=true;
	}
	if(!sel&&selindex&&s.options.length<sel)s.options[selindex].selected=true;
}
function DG_SelectOption(s,v)
{
	if(!s)return;
	var len=s.options.length;
	for(var i=0;i<len;i++)
	{
		var o=s.options[i];
		o.selected=(o.value==v);
	}
}

//==============================================================================================
// classes
//==============================================================================================

function DG_LoadFrame(id, fr, pars)
{
	//----------------------------------------------------
	// clean up old objects and re-create <script> element
	//----------------------------------------------------
	var div = DG_Obj("dg_ctrl_"+id);
	var scr = DG_CreateScriptTag("dg_js_"+id);
	var img = DG_CreateImg( div, {i:("dg_img_"+id), l:0, t:0} );
	DG_CleanUp(div, img.id);
	
	//-----------------------------------------------
	// compose request url 
	//-----------------------------------------------
	var url=DG_ImgServer+"?cmd=1&t="+fr+"&id="+id;
	if(pars)url+=pars;
	url+=("&ts="+Date.UTC());

	var imgUrl=url;
	var jsUrl=url.replace("cmd=1","cmd=2");

	var isTest=false;
	if(isTest)
	{
		imgUrl=fr+".jpg"+"?ts="+Date.UTC();
		jsUrl=DG_ImgServer+"?cmd=9&fileName="+fr+".js";
	}
	
	//-----------------------------------------------
	// request new frame
	//-----------------------------------------------
	img.src=imgUrl;	// request new image
	scr.src=jsUrl;	// request new script
}

function DG_LoadImage(img, url, t)
{
	img.timestamp = t;
	img.src = url + "&ts=" + t;
	return img;
}

function DG_CleanUp(o,id)
{
	if(!o)return;
	var len = o.childNodes.length;
    for(var i=len-1; i>=0; i--)
    {
		var c = o.childNodes.item(i);
		if(c.id!=id)o.removeChild(c);
	}
}

function DG_DeleteChildren(o,className)
{
	var len=o.childNodes.length;
    for(var i=len-1; i>=0; i--)
    {
		var c = o.childNodes.item(i);
		if((className==null)||(c.className==className))o.removeChild(c);
	}
}

function DG_GetStyle(o)
{
	if(!o)return null;
	var st=o.currentStyle;if(st)return st;
	var fn=window.getComputedStyle;
	if(fn)st=fn(o,null);return st;
}

// output for debug purposes, expects a text box with id="output"
function DG_Trace(s)
{
	var txt=DG_Obj("output");
	if(txt)txt.value=s;
}
function DG_TracePt(p){DG_Trace(p.X+","+p.Y);}
function DG_TraceR(r){DG_Trace(r.l+","+r.t+","+r.r+","+r.b+","+(r.r-r.l)+","+(r.b-r.t));}

//-----------------------------------------------------------
//  classes Click -> Link
//-----------------------------------------------------------
function DG_Click()
{
	this.OnClick = function(){}
}

function DG_JSCall(js)
{
	DG_Click.call(this);
	var jscode = js;
	this.OnClick = function(){ eval(js); }
}

function DG_Link( link )
{
	DG_Click.call(this);
	var link = link;
	this.OnClick = function(){document.location = link;}
}

function DG_HighlightImg(img)
{
	var img = img;
	this.Show = function(b)
	{
		if(img ==null) return;
		img.SS(11,b);
	}
}

function DG_Area(x,y,w,h,cursor,alt,highlight,onClick,args,index)
{
	var x1=x;
	var x2=x+w;
	var y1=y;
	var y2=y+h;
	this.X=x;
	this.Y=y;
	this.W=w;
	this.H=h;
	this.Cursor=cursor;
	this.Alt=alt;
	this.Highlight=highlight;
	this.HighlightImg=null; 
	this.OnClick=onClick;
	this.Args=args;
	this.Index=index;
	this.Contains=function(pt)
	{
		pt=pt;
		return((pt.X>x1)&&(pt.X<x2)&&(pt.Y>y1)&&(pt.Y<y2));
	}
};

function DG_Map()
{
	var myself=this;
	var m_areas;
	this.InitMap=function(map)
	{
		if(!map)return;
		var len=map.length;
		m_areas=new Array(len);
		for(var i=0;i<len;i++)
		{
			var m=map[i];
			m_areas[i]=new DG_Area(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9]);
		}
	}
	this.GetArea=function(pt)
	{
		if(!m_areas)return null;
		var len=m_areas.length;
		for(var i=len-1;i>=0;i--)
		{
			var a=m_areas[i];
			if(a.Contains(pt))return a;
		}
		return null;
	}
}

function DG_Ctrl2(mainDivId,divId,imgId)
{
	this.m_areas = new Array();
	var myself =this;
//	var m_ctrlId = ctrlId;
	var m_mainDiv=DG_Obj(mainDivId);
	var m_div = DG_Obj(divId);
	var m_ctrlImg = DG_Obj(imgId);
//	var m_templ = templ;
	this.OnMM=null;

	// clean up kids
//	if(!m_div||!m_ctrlImg)return;
//	DG_CleanUp(m_div, (m_ctrlImg)?m_ctrlImg.id:0);
//	SetCursor(null);

	this.AddArea = function( area )
	{
		var len = myself.m_areas.length;
		myself.m_areas[len] = area;
		if(area.Highlight>=0) 
		{
//			var img = CreateChildImg(m_div,area.X,area.Y);
//			SetPngImgSrc( img, DG_ImgServer+"?cmd=6&e=0", DG_ImgServer+"?cmd=7&@t="+m_templ+"&id="+m_ctrlId+"&bmp="+area.Highlight );
//			area.HighlightImg = new DG_HighlightImg( img );
		}
	}
	
	function SetCursor(cursor)
	{
		if(m_div!=null)
		if( cursor==null ) 
			m_div.SS(7,"default");
		else
			if( m_div.style.cursor != cursor )m_div.SS(7,cursor);
	}
	function SetAlt(alt)
	{
		if(m_div!=null)	m_div.SS(10,(alt)?alt:"");
	}

	function SetPngImgSrc( img, blankSrc, src )
	{
		if( img.runtimeStyle )
		{
			img.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='image',enabled=true)";
			img.src = blankSrc;
		}
		else
			img.src = src;
	}

	function CreateChildImg(p,x,y)
	{
		var o = DG_New("IMG");
		o.SS(18,1);
		o.SS(12,x);
		o.SS(13,y);
		o.SS(11,0);
		p.appendChild(o);
		o.galleryImg="false";
		return o;
	}

	//---------------------------------------------------------------
	// event handlers
	//---------------------------------------------------------------
	m_ctrlImg.onclick=function(e)
	{
		e=DG_EventPos(e, m_ctrlImg);
		m_ctrlImg.onclickPos=e;
		var a=FindObj(e);
		if(a&&a.OnClick!=null)a.OnClick.OnClick();
	}

	m_mainDiv.onmousemove=function(e)
	{
		e=DG_EventPos(e, m_ctrlImg);
		DG_TracePt(e);
		//--------------------------------------------
		var a = FindObj(e);
		e.TopObj=a;
//		DG_Obj("output").SS(22,e.X);
		SetCursor( (a)?a.Cursor:null);
		SetAlt( (a)?a.Alt:null);

		var len = myself.m_areas.length;
		for( var i=0; i<len; i++ )
		{
			var b = myself.m_areas[i];
			if( b.HighlightImg ) 
				b.HighlightImg.Show((a==b));
		}
		if(myself.OnMM)myself.OnMM(e);
	}
	
	m_div.onmouseup = function(e)
	{
		if(m_div==null) return;
		e = DG_EventPos(e, m_div);
		SetCursor(null);
	}
	m_div.onmousedown = function(e)
	{
		if(m_div==null) return;
		e = DG_EventPos(e, m_div);
		var a = FindObj(e);
//		alert(a.OnClick.OnClick);
	}
	
	function FindObj(pos)
	{
		var len=myself.m_areas.length;
		for(var i=len-1;i>=0;i--)
		{
			var a=myself.m_areas[i];
			if(a.Contains(pos))
				return a;
		}
		return null;
	}
};

function DG_SetEvent(e,h)
{
	if(h)
	{
		var o=this;
		switch(e)
		{
		case 0:o.onclick=h;break;
		case 1:o.onchange=h;break;
		}
	}
}

function DGJS_Click()
{
	this.OnClick=function(){}
}

function DGJS_JSCall(js)
{
	DGJS_Click.call(this);
	var jscode = js;
	this.OnClick = function(){ eval(js); }
}

function DGJS_Link( link )
{
	DGJS_Click.call(this);
	var link = link;
	this.OnClick = function(){document.location = link;}
}

//---------------------------------------------------------
function DG_Ctrl3(div,img)
{
	var myself=this;
	var m_div=DG_Obj(div); m_div.DGO=this; 	
	this.O=m_div;
	var m_img=DG_Obj(img);
	var m_areas=new Array();

	m_img.onclick=function(e)
	{
		e=DG_EventPos(e,m_img);
		var a=FindObj(e);
		if(a&&a.OnClick!=null)a.OnClick(a);
	}
	m_img.onmousemove=function(e)
	{
		e=DG_EventPos(e,m_img);
		var a=FindObj(e);
		var c=(a)?a.Cursor:"default";if(m_img.style.cursor!=c)m_img.SS(7,c);
		var h=(a)?a.Alt:"";if(m_img.alt!=h)m_img.SS(10,h);
	}
	function FindObj(pos)
	{
		var len=m_areas.length;
		for(var i=len-1;i>=0;i--)
		{
			var a = m_areas[i];
			if( a.Contains(pos))
				return a;
		}
		return null;
	}
	this.AddTextBox=function(d)
	{
//		var t=DG_CreateTextBox(m_div,d);
		var t=new DG_TextBox(null,m_div,d);
		t.SetText=function(txt){t.O.value=(txt)?txt:"";}
		return t;
	}
	this.AddTextArea=function(d)
	{
		var t=DG_CreateTextArea(m_div,d);
		t.SetText=function(txt){t.value=(txt)?txt:"";}
		return t;
	}
	this.AddArea=function(a){m_areas[m_areas.length]=a;}
	this.Hide=function(){ if(myself.OnHide)myself.OnHide();	m_div.SS(11,0);}
	this.Show=function(){ var v=true;if(myself.OnShow)v=myself.OnShow(); m_div.SS(11,v); }

	this.ValidateControls=function(arr)
	{
		if(!arr)return;
		var isValid = true;
		for(var i=0;i<arr.length;i++)
			isValid &= arr[i].IsValid();
		return isValid;
	}
}

function DG_TextBox(id,p,d)
{
	var m_txt=(id)?DG_Obj(id):DG_CreateTextBox(p,d);
	m_txt.DGO=this;
	this.O=m_txt;
	this.IsValid=function(){return(m_txt.value.search(this.Validator)==0);}
	this.Validator=null; //regex for validation
/*	var bgcolor;
	m_txt.onchange=function()
	{
		if(!m_txt.DGO.Validator)return;
		if(!bgcolor)bgcolor=m_txt.style.backgroundColor;
		if(!bgcolor)bgcolor="white";
		var isValid = m_txt.value.search(m_txt.DGO.Validator)==0;
		m_txt.SS(0,(isValid)?bgcolor:"lightyellow");
	}
	m_txt.onfocus=function(){if(!bgcolor)bgcolor="white";m_txt.SS(0,bgcolor);}
*/
}

function DG_SetSpanText(sp,txt)
{
	sp.innerHtml=txt;
	return;
	var t=sp.firstChild;
	if(!t)
	{
		t=DG_NewText(txt);
		sp.appendChild(t);
		sp.Text=t;
		sp.SetText=function(txt){DG_SetSpanText(sp,txt);}
	}
	t.nodeValue=(txt)?txt:"";
}
function DG_SetSpanText2(spn,txt)
{
	var sp=document.getElementById(spn);
	if(sp)DG_SetSpanText(sp,txt);
}

Array.prototype.remove=function(o)
{
	var n=-1;
	for(var i=0;i<this.length;i++){if(this[i]==o){n=i;break;}}
	if(n>=0)this.splice(n,1);
}

function DG_BuildTree(p,tree,getNode)
{
	var stack=new Array();
	stack.push(p);
	var lv=0; var p1=p;
	for(var i=0; i<tree.length-1; i++)
	{	
		var o=tree[i];
		var p=stack[stack.length-1];
		if(o.lv>lv)
		{
			stack.push(p1);
			p=p1;
		}
		else if(o.lv<lv)
		{
			var n=lv-o.lv+1;
			for(var j=0;j<n;j++)
				p=stack.pop();
		}
		lv=o.lv;
		p1=getNode(p,o);
	}
}

function DG_SetDomProps(o,ss,templ)
{
	if(!ss)return;
	for(var s in ss)
	{
		var cmd=s.substring(0,2);
		switch(cmd)
		{
			case "si":
			{
				var n=parseInt(s.replace("si",""));
				o.SS(n,templ.Imgs(ss[s])); continue;
			}
			case "sf":
			{
				var n=parseInt(s.replace("sf",""));
				o.SS(n,templ.Fncs(ss[s])); continue;
			}
			case "sp":
			{
				var n=parseInt(s.replace("sp",""));
				o.SS(n,templ.Params(ss[s])); continue;
			}
			case "sh":
			{
				var n=parseInt(s.replace("sh",""));
				o.SS(n,templ.Texts(ss[s])); continue;
			}
		}
		if(s.substring(0,1)!="s")continue;
		if(s=="id"){o.id=ss[s];continue;}
		var n=parseInt(s.replace("s",""));
		o.SS(n,ss[s]);
	}
}
function DG_SetObjProps(o,pp,templ)
{
	if(!pp)return;
	for(var p in pp)
	{
		var cmd=p.substring(0,2);
		switch(cmd)
		{
			case "pi":
			{
				var n=parseInt(p.replace("pi",""));
				o.PP[n]=templ.Imgs(pp[p]);continue;
			}
			case "pf":
			{
				var n=parseInt(p.replace("pf",""));
				o.PP[n]=templ.Fncs(pp[p]);continue;
			}
			case "pp":
			{
				var n=parseInt(p.replace("pp",""));
				o.PP[n]=templ.Params(pp[p]);continue;
			}
			case "pt":
			{
				var n=parseInt(p.replace("pt",""));
				o.PP[n]=templ.Styles(pp[p]);continue;
			}
			case "ps":
			{
				var n=parseInt(p.replace("ps",""));
				o.PP[n]=templ.Strs(pp[p]);continue;
			}
			case "pm":
			{
				var n=parseInt(p.replace("pm",""));
				o.PP[n]=templ.Maps(pp[p]); continue;
			}
			case "ph":
			{
				var n=parseInt(p.replace("ph",""));
				o.PP[n]=templ.Texts(pp[p]);continue;
			}
			case "pr":
			{
				var n=parseInt(p.replace("pr",""));
				o.PP[n]=templ.m_res[pp[p]].o;continue;
			}
			case "po":
			{
				var n=parseInt(p.replace("po",""));
				o.PP[n]=templ.m_objs[pp[p]].Content;continue;
			}
		}
		if(p.substring(0,1)!="p")continue;
		var n=parseInt(p.replace("p",""));
		o.PP[n]=pp[p];
	}
}

function DG_ParseUrl()
{
	var queryStr=new Object();
	var url=document.location;
	url.search.replace( new RegExp("([^?=&]+)(=([^&]*))?","g"),function($0,$1,$2,$3){queryStr[$1]=$3;});
	return queryStr;
}

Array.prototype.dgType="array";
String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"");}

