// 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];
			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;
//	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.Widgets=new Array();
DG_CF.New=function(typeName)
{
	var fnc=DG_CF[typeName];
	if(!fnc)return null;
	var o=fnc();
	o.DgType=typeName;
	return o;
}
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 wcs=new Array();
	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;
		if(DG_IsInitClass(d,dgType))continue;
		DG_CF.LoadWidget(d,dgType);

//		wcs[wcs.length]=dgType;
/*		if(DG_CF.Widgets[dgType]) dgType+="&n1";
		var w=new DG_WidgetReg(d,dgType);
		DG_CF.Widgets[dgType]=w;
		wcs[wcs.length]=w;
*/	}
//	DG_CF.LoadWidgets(wcs);
/*
    for(var i=0;i<wcs.length;i++)
    {
		var w=wcs[i];
		DG_CF.LoadWidget(w);
    }
*/   for(var i=0;i<divs.length;i++)
    {
		var d=divs[i];
		var pp=d.getAttributeNode("dgPP");
		if(pp)
		{	
			pp=pp.value;
			var p1;
			eval("p1="+pp);
			var o=d.JSO;
			if(o.SetPP){o.SetPP(p1);o.ApplyPP();}
		}
    }
}
DG_IsInitClass=function(d,dgType)
{
	var 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);
	if(o.m_tree)
	{
		var render = new DG_Render();
		render.SetTemplate(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)
{
	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_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==null){e = event;}
	if(isCancel)DG_CancelEvent(e);
	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;
		}
	}
	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_EventPos2(e,obj,isCancel)
{
	e=DG_EventPos(e,obj,isCancel);
	return {x:e.X,y:e.Y};
}

function DG_CancelEvent(e)
{
	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=v;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":"visible";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)?"bold":"";break;//is bold
	case 26:s.fontSize=v;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 90:s.borderLeft=v;break;
	case 91:s.borderTop=v;break;
	case 92:s.borderRight=v;break;
	case 93:s.borderBottom=v;break;

	case 200:o.onclick=v;break;
	}
}
function DG_IsStr(o){return(o.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)
{
	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");
	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_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.style.textAlign="left";
	sp.appendChild(t);
	sp.Text = t;
	sp.SetText=function(txt){DG_SetSpanText(sp,txt);}
	return sp;
}
function DG_CreateScriptTag(id)
{	
	// 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);
	var p = document.body;
	if( olds != null )
	{
		p = olds.parentNode;
		p.removeChild( olds );
	}
	// 2. load new script
	var s = DG_New("script");
	s.id = id;
	s.type = 'text/javascript';
	s.defer = true;
	p.appendChild(s);
	return s;
}
function DG_CreateTextBox(p,d)
{
	var o = DG_New("INPUT");
	o.type="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.v==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)
{
	if(!s)return;
	for(var i=a.length-1;i>=0;i--)
	{
		s.options.remove(i);
	}	
	for(var i=0;i<a.length;)
	{
		var v=a[i++];var t=a[i++];
		s.options[s.options.length]=new Option(t,v);
	}
	if(sel)s.options[sel].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, imgId)
{
	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!=imgId)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_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);
	}
}

//-----------------------------------------------------------
//  class Area
//-----------------------------------------------------------
function DG_Area(x,y,w,h,cursor,alt,highlight,onClick)
{
	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.Contains=function(pt){return((pt.x>x1)&&(pt.x<x2)&&(pt.y>y1)&&(pt.y<y2));}
};

//-----------------------------------------------------------
//  class Ctrl2
//-----------------------------------------------------------
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 ); //"../trans2.png" );
//			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);
		var pos={x:e.X,y:e.Y};
		m_ctrlImg.onclickPos=pos;
		var a=FindObj(pos);
		if(a&&a.OnClick!=null)a.OnClick.OnClick();
	}

	m_mainDiv.onmousemove=function(e)
	{
		e = DG_EventPos(e, m_ctrlImg)
		var pos = {x:e.X,y:e.Y};

		//--------------------------------------------
		var a = FindObj(pos);
		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 pos = {x:e.X,y:e.Y};
		var a = FindObj(pos);
//		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 pos={x:e.X,y:e.Y};
		var a=FindObj(pos);
		if(a&&a.OnClick!=null)a.OnClick(a);
	}
	m_img.onmousemove=function(e)
	{
		e=DG_EventPos(e,m_img);
		var pos={x:e.X,y:e.Y};
		var a=FindObj(pos);
		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(23,false);}
	this.Show=function(){ var v=true;if(myself.OnShow)v=myself.OnShow(); m_div.SS(23,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)
{
	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,imgs,fncs)
{
	if(!ss)return;
	for(var s in ss)
	{
		var cmd=s.substring(0,2);
		if(cmd=="si")
		{
			var n=parseInt(s.replace("si",""));
			o.SS(n,imgs(ss[s])); continue;
		}
		else if(cmd=="sf")
		{
			var n=parseInt(s.replace("sf",""));
			o.SS(n,fncs(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,imgs,fncs)
{
	if(!pp)return;
	for(var p in pp)
	{
		var cmd=p.substring(0,2);
		if(cmd=="pi")
		{
			var n=parseInt(p.replace("pi",""));
			o.PP[n]=imgs(pp[p]); continue;
		}
		else if(cmd=="pf")
		{
			var n=parseInt(p.replace("pf",""));
			o.PP[n]=fncs(pp[p]); continue;
		}
		if(p.substring(0,1)!="p")continue;
		var n=parseInt(p.replace("p",""));
		o.PP[n]=pp[p];
	}
}
