// 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.SetPP=function(pp)
	{
		if(!this.PPN||!pp)return;
		for(var i=0;i<this.PPN.length;i++)
		{
			var n=this.PPN[i];
			if(pp[n]) this.PP[i]=pp[n];
		}
	}
	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.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.New=function(typeName)
{
	var fnc=DG_CF[typeName];
	if(!fnc)return null;
	var o=fnc();
	o.DgType=typeName;
	return o;
}


//==============================================================================================
// 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)
{
	e = DG_Event(e);
	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=v+"px"; this.W=v;break;
	case 6:s.height=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:this.title = v; this.alt = v; break;
	case 11:s.visibility=(v)?"visible":"hidden"; break;
	case 12:s.left=v+"px";this.X=v;break;
	case 13:s.top=v+"px";this.Y=v;break;
	case 14:this.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:s.display=(v)?"block":"none";break;
	case 24:s.fontFamily=v;break;
	case 25:s.fontWeight=(v)?"bold":"";break;
	case 26:s.fontSize=v;break;
	case 27:s.fontStyle=(v)?"italic":"";break;
	case 35:s.padding=v+"px";break;
	}
}

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_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";
	DG_AddChild(o,p,d);
	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);
	}
}

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=document.getElementById("output");
	if(txt)txt.value=s;
}

//-----------------------------------------------------------
//  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(pos){return((pos.x>x1)&&(pos.x<x2)&&(pos.y>y1)&&(pos.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);
	}
}

