var doODCheckName = true;
var counter=0;
var openStreamApp = false;
function getScrollPageOffsetLeft(el) {
	var rects = el.getClientRects();
	var left = 100000;
	for (var i=0;i<rects.length;i++) {
		if (left>rects[i].left) left = rects[i].left;
	}
	return left;
}
function getScrollPageOffsetTop(el) {
	var rects = el.getClientRects();
	var top = 100000;
	for (var i=0;i<rects.length;i++) {
		if (top>rects[i].top) top = rects[i].top;
	}
	return top;
}

function getPageOffsetLeft(el) {
  var left = el.offsetLeft;
  if (el.offsetParent != null) left += getPageOffsetLeft(el.offsetParent);
  return left;
}

function getPageOffsetTop(el) {
  var top = el.offsetTop;
  if (el.offsetParent != null) top += getPageOffsetTop(el.offsetParent);
  return top;
}

var onloadFuncs;
if (!onloadFuncs) onloadFuncs = new Array();

function ODAddOnLoad(f) {
	onloadFuncs.push(f);
}

function OD_doOnloadFuncs() {
	for (var i=0;i<onloadFuncs.length;i++) {
		try {
			onloadFuncs[i]();
		} catch (ex) {
			showInfoException(ex);
		}
	}
}


function OD_Onload() {
	OD_doOnloadFuncs();
	if (document.body.resizeChildren) {
		window.onresize = ODResizeTimeout;
		ODResizeTimeout();
	}
	if (!openStreamApp && window['_LoadingBlock']) {
		_LoadingBlock.style.display='none';
		_BodyBlock.style.display='block';
		OD_signalBlockShow();
	}
}
var _ODResizeTimeout
function ODResizeTimeout() {
	if (_ODResizeTimeout) clearTimeout(_ODResizeTimeout);
	_ODResizeTimeout = setTimeout("ODResize();",00);
}

var doneResizeElements = null;
function ODResize() {
	try {
		var list = document.body.resizeChildren;
		doneResizeElements = new Object();
		if (list) {
			//stackleft("ODResize");
			//document.body.style.overflow='hidden';
			var w = document.body.clientWidth;
			var h = document.body.clientHeight;
			ODResizeChildren(document.body,w,h);
			clearAlertLast();
		}
		//discardElement(doneResizeElements);
		doneResizeElements= null;
	} catch (ex) {
		ODAlert("ODResize error:"+ex);
		showInfoException(ex);
	}
}

var recurseCount = 0;
var ODResizeChildrenCnt = 0;
function ODResizeChildren(el,w,h) {
	if (!el.id) el.id="ODResizeChildrenID"+ODResizeChildrenCnt++;
	if (!doneResizeElements || !doneResizeElements[el.id]) {
		if(el.id && doneResizeElements) doneResizeElements[el.id] = true;
		//if (el == document.body) ODAlert("start "+el.resizeChildren[0].id);
		recurseCount++;
		//if (recurseCount>10) stackleft("recurseCount "+recurseCount);

		if ((""+w)!="undefined" && (""+h)!="undefined") {
			el.resizeChildrenWidth = w;
			el.resizeChildrenHeigth = h;
		}
		var list = el.resizeChildren;
		if (list) {
			//alertLast("ODResizeChildren w:"+w+" h:"+h+" "+el.id+" list.length:"+list.length);
			if ((""+w)=="undefined") w = el.resizeChildrenWidth;
			if ((""+h)=="undefined") h = el.resizeChildrenHeigth;
			for (var i=0;i<list.length;i++) {
				if (list[i].resizeFromParent) {
					var callFunc = list[i].resizeFromParent;
					callFunc(w,h,list[i]);
				} else ODAlert("noResizeFromParent:"+list[i].id+" "+list[i].outerHTML);
			}
		}
		recurseCount--;
		//if (el == document.body) ODAlert("end "+el.resizeChildren[0].id);
	} else {
		//ODAlert(el.id);
	}
}

var afterEvalFunctions = new Array();
var evalCallBackWaitingCount = 0;
function OD_evalCallBack(str) {
	evalCallBackWaitingCount--;
	evalCallBack(str);
	if (afterEvalFunctions.length>0) {
		var loopArray = afterEvalFunctions;
		afterEvalFunctions = new Array();
		for (var i=0;i<loopArray.length;i++) {
			loopArray[i]();
		}
	}	
}
function evalCallBack(str) {
	var doMultiCall = false;
	if (ODStartMultiCall) doMultiCall = ODStartMultiCall();
	//var start = (new Date()).getTime();
	try {
		eval(str);
		//var duration = ((new Date()).getTime()-start)
		//if (duration>1000) ODAlert(duration+" "+str);
	} catch (ex) {
		ODAlert(ex.message+":"+str);
		showInfoException(ex);
	} finally {
		if (doMultiCall) ODFlushMultiCall();
	}
}

function ODCheckName(name) {
	if (doODCheckName && window[name]) ODAlert("Name "+name+" is used more than once");
}

var keepEx = null;
var oldonError = null;
function showInfoException(ex) {
	if (alertsOn) {
		keepEx = ex;
		setTimeout("checkException()",1);
	}
}
function checkException() {
	oldonError = window.onerror;
	window.onerror=myOnError;
	throw(keepEx);
}
function myOnError(msg,url,line) {
	ODAlert(msg+" "+url+" "+line);
	window.onerror = oldonError;
	return true;
}

var designTreeID;
var nodeDivTags = new Array();
var nodeDivIDs = new Array();
var nodeDivIDNames = new Object();
var nodeDivShowBlocks = new Object();
var divNodeShowBlocks = new Object();
var nodeIdDivgroup = new Object();
var nodeDivShowBlocksAll = new Array();
var linkNodes = new Object();
var linkNodeParents = new Object();
var showNodeFuncs = new Object();
var hideNodeFuncs = new Object();
var resizeParentChildList = new Object();
var lastNode = null;
var currentNode = null;
var currentDivGroupNode = new Object();
var _navName = "IE"

var ODPropClasses = new Array();
function addPropClass(propClass,vecstr) {
}


if (navigator.appName=="Netscape") {
	_navName = "Netscape";
}


function showNodeDivsByName(name) {
	var id = nodeDivIDNames[name];
	showNodeDivs(id);
}
function hideDivGroupByName(name) {
	var id = nodeDivIDNames[name];
	hideDivGroup(id);
}
function hideDivGroup(nodeId, except) {
	var divgroup = nodeIdDivgroup[nodeId];
	for (var i=0;i<nodeDivShowBlocksAll.length;i++) {
		var div = nodeDivShowBlocksAll[i];
		if (div.divgroup==divgroup) {
			if (div.style) {
				if (div.style.display!="none") {
					if (!except || !arrayContains(except,div)) {
						div.style.display ="none";
						var vec = divNodeShowBlocks[div.id];
						if (vec) {
							for(var j=0;j<vec.length;j++) signalHideNodeDivs(vec[j]);
						}
					}
				}
			}
		}
	}
}

var startDeb = false;
function showNodeDivs(nodeId) {
	if (linkNodes[nodeId] && linkNodes[nodeId]!=nodeId) {
		showNodeDivs(linkNodes[nodeId]);
	} else {
		var vec = nodeDivShowBlocks[nodeId];

		hideDivGroup(nodeId,vec);

		if (vec) {
			var signalIDs = new Array();
			for (var i=0;i<vec.length;i++) {
				var div = vec[i];
				div.style.display ="block";
				var vec2 = divNodeShowBlocks[div.id];
				if (vec2) {
					for(var j=0;j<vec2.length;j++) {
						if (!arrayContains(signalIDs,vec2[j])) signalIDs.push(vec2[j]);
					}
				}
			}
			for(var j=0;j<signalIDs.length;j++) {
				signalShowNodeDivs(signalIDs[j]);
			}
		}
		lastNode = currentNode;
		currentNode = nodeId;
		var divgroup = nodeIdDivgroup[nodeId];
		if (divgroup) currentDivGroupNode[divgroup]=nodeId;
		if (linkNodeParents[nodeId]) {
			linkNodes[linkNodeParents[nodeId]] = nodeId;
		}
	}

}

function getCurrentDivGroupNode(divgroup) {
	return currentDivGroupNode[divgroup];
}

function signalShowNodeDivs(nodeId) {
	var doMultiCall = window.startMultiCall && startMultiCall();
	var funcs = showNodeFuncs[nodeId];
	if (funcs) {
		for (var i=0;i<funcs.length;i++) {
			var func = funcs[i];
			if (startDeb) ODAlert(func);
			if (func) func(nodeId);
		}
	}
	OD_signalBlockShow();
	if (doMultiCall) flushMultiCall();
}
function signalHideNodeDivs(nodeId) {
	var doMultiCall = window.startMultiCall && startMultiCall();
	var funcs = hideNodeFuncs[nodeId];
	if (funcs) {
		for (var i=0;i<funcs.length;i++) {
			var func = funcs[i];
			func(nodeId);
		}
	}
	if (doMultiCall) flushMultiCall();
}

function addDivShowBlockNetscape(nodeId,divid,divgroup,nodeName) {
	var div = document.getElementById(divid);
	addDivShowBlock(nodeId,div,divgroup,nodeName);
}

function addDivShowBlock(nodeId,div,divgroup,nodeName) {
	if (nodeName) {
		nodeDivIDs.push(nodeId);
		nodeDivIDNames[nodeName] = nodeId
	}
	var vec = nodeDivShowBlocks[nodeId];
	if (vec == null) {
		vec = new Array();
		nodeDivShowBlocks[nodeId] = vec;
	}
	vec.push(div);

	if (div.id) {
		var vec = divNodeShowBlocks[div.id];
		if (vec == null) {
			vec = new Array();
			divNodeShowBlocks[div.id] = vec;
		}
		vec.push(nodeId);
	}

	nodeDivShowBlocksAll.push(div);
	div.divgroup = divgroup;
	div.nodeId = nodeId;
	nodeIdDivgroup[nodeId] = divgroup;
}
function showLastNode() {
	showNodeDivs(lastNode);
}

function setLinkNodeParent(parent,children) {
	for (var i=0;i<children.length;i++) {
		linkNodeParents[children[i]]=parent;
	}
}

function setLinkNode(parent,child) {
	linkNodes[parent] = child;
}
function setLinkNodeByName(parent,child) {
	var parentid = nodeDivIDNames[parent];
	var childid = nodeDivIDNames[child];
	setLinkNode(parentid,childid);
}

function addOnShowNodeByName(name,func) {
	var nodeId = nodeDivIDNames[name];
	addOnShowNode(nodeId,func);
}

function addOnShowNode(nodeId,func) {
	var funcs = showNodeFuncs[nodeId];
	if (!funcs) funcs = showNodeFuncs[nodeId] = new Array();
	funcs.push(func);
}


function addOnHideNodeByName(name,func) {
	var nodeId = nodeDivIDNames[name];
	addOnHideNode(nodeId,func);
}

function addOnHideNode(nodeId,func) {
	var funcs = hideNodeFuncs[nodeId];
	if (!funcs) funcs = hideNodeFuncs[nodeId] = new Array();
	funcs.push(func);
}
var count=0;
function sendNewSize(el,w,h) {
	ODAlert(el.id+" uses sendNewSize, use ODResizeChildren instead");
	var pid = el.id;
	if (el.nodeName=="BODY") pid="BODY";
	var list = resizeParentChildList[pid];
	if (list) {
		for (var i=0;i<list.length;i++) {
			try {
				list[i].newSize(w,h);
			} catch (ex) {
				showInfoException(ex);
			}
		}
	}
}

var debugstr1='';

function findParentResize(el,child,notagain) {
	if (el==null) {
		if (child!=null && child.length) {
			for (var i=0;i<child.length;i++) {
				ODAlert(child[i].outerHTML);
			}
		}
	} else {
		if (!child) {
			child=el;
			return findParentResize(el.parentNode,child,notagain);
		} else {
			if (el.nodeName=="BODY" || el.isResizeParent) {
				var pid = el.id;
				if (el.nodeName=="BODY") pid="BODY";
				ODAlert(child.id+" uses findParentResize, use ODFindParentResize instead");
				var list = resizeParentChildList[pid];
				if (!list) {
					 resizeParentChildList[pid] = list = new Array();
				}
				list.push(child);

			} else {
				return findParentResize(el.parentNode,child,notagain);
			}
		}
	}
}


function getCookieVal(offset) {
	var endstr = document.cookie.indexOf ( ";", offset );
	if ( endstr == -1 ) {
		endstr = document.cookie.length;
	} 
	return unescape(document.cookie.substring(offset, endstr));
}

function getCookie(name){
  var arg = name + "=";
  var alen = arg.length;
  var clen = document.cookie.length;
  var i = 0;
  while ( i < clen ) {
    var j = i + alen;
    if ( document.cookie.substring( i, j ) == arg ) {
      return getCookieVal ( j );
    }
    i = document.cookie.indexOf( " ", i ) + 1;
    if ( i == 0 ){
      break;
    }
  }
  return null;
}


function setCookie(name, value) {
  var argv = setCookie.arguments;
  var argc = setCookie.arguments.length;
  var expires = (argc > 2) ? argv[2] : null;
  var path = (argc > 3) ? argv[3] : null;
  var domain = (argc > 4) ? argv[4] : null;
  var secure = (argc > 5) ? argv[5] : false;

  document.cookie = name + "=" + escape (value) +
    ( ( expires == null ) ? "" : ( "; expires=" + expires.toGMTString() ) ) +
    ( ( path == null ) ? "" : ( "; path=" + path ) ) +
    ( ( domain == null ) ? "" : ( "; domain=" + domain ) ) +
    ( ( secure == true ) ? "; secure" : "" );
}

function deleteCookie(name) {
  var exp = new Date();
  exp.setTime ( exp.getTime() - 1 );  // This cookie is history
  var cval = getCookie ( name );
  document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString() + "; path=/";
}

function arrayContains(array,value) {
	var result =false;
	for (var i=0;result==false && i<array.length;i++) {
		result = (array[i] == value);
	}
	return result;
}

function _sp(count) {
	var str = "";
	for(var i=0;i<count;i++) str+=" ";
	return str;
}

function trim(str) {
   return str.replace(/^\s*|\s*$/g,"");
}


function stringToVector(str) {
	var result = new Array();
	if (str) {
		if (str.length>0 && str.charAt(0)=='[') reg = new RegExp("]");
		else reg = new RegExp(">");
		
		var vec = trim(str).split(reg);
		for(var i=0;i<vec.length;i++) result.push(decodeString(vec[i].substring(1)))
	}
	return result;
}

function vectorToString(vec) {
	var startTime = (new Date()).getTime();
	if(vec.length>0) {
		var encodedVec = new Array();
		for (var i=0;i<vec.length;i++) encodedVec.push(encodeString(vec[i]));
		return "["+encodedVec.join("][")+"]";
	} else return "";
}

var encodeStringFrom=null;
var encodeStringTo =null;
var encodeEscapeFrom = new Array();
var encodeEscapeTo = new Array();
function fillEncodeStrings() {
	encodeStringFrom = new Array();
	encodeStringTo = new Array();
	encodeStringFrom.push(">"); encodeStringTo.push("&sgt;");
	encodeStringFrom.push("<"); encodeStringTo.push("&slt;");
	encodeStringFrom.push("["); encodeStringTo.push("&sbo;");
	encodeStringFrom.push("]"); encodeStringTo.push("&sbc;");
	encodeStringFrom.push("&"); encodeStringTo.push("&samp;");
	encodeStringFrom.push('"'); encodeStringTo.push("&squot;");
	encodeStringFrom.push("\n"); encodeStringTo.push("&s#13;");
	encodeStringFrom.push("\r"); encodeStringTo.push("&s#10;");
	
	encodeEscapeFrom = new Array();
	encodeEscapeTo = new Array();
	encodeEscapeFrom.push(">"); encodeEscapeTo.push("&gt;");
	encodeEscapeFrom.push("<"); encodeEscapeTo.push("&lt;");
	encodeEscapeFrom.push("["); encodeEscapeTo.push("&sbo;");
	encodeEscapeFrom.push("]"); encodeEscapeTo.push("&sbc;");
	encodeEscapeFrom.push("&"); encodeEscapeTo.push("&amp;");
	encodeEscapeFrom.push('"'); encodeEscapeTo.push("&quot;");
	encodeEscapeFrom.push("\n"); encodeEscapeTo.push("&#13;");
	encodeEscapeFrom.push("\r"); encodeEscapeTo.push("&#10;");
}

function encodeString(str) {
	if (!encodeStringFrom) fillEncodeStrings();
	return stringConverting(str,encodeStringFrom,encodeStringTo);
}
function decodeString(str) {
	if (str.indexOf("&s")<0) return str;
	if (!encodeStringFrom) fillEncodeStrings();
	return stringConverting(str,encodeStringTo,encodeStringFrom);
}

function stringConverting(str,arrayFrom,arrayTo) {
	str=""+str;
	var result = "";
	if (str) {
			var minArray = new Array();
			for (var j=0;j<arrayFrom.length;j++) {
				minArray.push(str.indexOf(arrayFrom[j],0));
			}
			var temp = "";
			var count = 0;
			var length = str.length
			var i=0;
			var found = 0;
			while (found>=0) {
				found=-1;
				var minIndex = length;

				for (var j=minArray.length;j>=0;j--) {
					var index = minArray[j];
					if (index>=0 && index<minIndex) {
						minIndex = index;
						found = j;
					}
				}
				if (found>=0) {
					temp+=str.substring(i,minIndex)+arrayTo[found];
					i=minIndex+arrayFrom[found].length;
					minArray[found] = str.indexOf(arrayFrom[found],i);
				} else {
					temp+=str.substr(i);
				}

				count++;
				if (count>50) {
					count = 0;
					result+=temp;
					temp="";
				}
			}
			result+=temp;
	}
	return result;
}

var ParentResizeArray = new Array();
var ParentResize_EventAttached = false;
var ODFindParentResizeCount=0;
function ODFindParentResize(el,child,notagain) {
	if (!child) {
		ODFindParentResizeCount=0;
		child=el;
		return ODFindParentResize(el.parentNode,child,notagain);
	} else if (el) {
		if (ODFindParentResizeCount++>50 && ODFindParentResizeCount<55) ODAlert("ODFindParentResize "+ODFindParentResizeCount);
		if (el.nodeName=="BODY" || el.isResizeParent) {
			
			var pid = el.id;
			if (el.nodeName=="BODY") pid="BODY";
			var list = el.resizeChildren;
			if (!list) {
				list = el.resizeChildren = new Array();
				if (!ParentResize_EventAttached) {
					ParentResize_EventAttached= true;
					window.attachEvent("onunload",ParentResize_cleanupAll);
				}
				ParentResizeArray.push(el);
			}
			if (!arrayContains(list,child)) list.push(child);
			if (child.resizeParent && child.resizeParent!=el) ODAlert("Double ODFindParentResize "+el.id);
			child.resizeParent = el;
			return el;
		} else {
			return ODFindParentResize(el.parentNode,child,notagain);
		}
	} //else ODAlert("no el :"+stacktrace());
	return null;
}


function ODRemoveParentResize(child) {
	if (child) {
		var el = child.resizeParent;
		if (el) {
			var list = el.resizeChildren;
			if (list) {
				removeFromArray(list,child);
				if (list.length==0) {
					removeFromArray(ParentResizeArray,el);
					el.resizeChildren=null;
				}
			}
			child.resizeParent=null;
		}
	}
}


function ParentResize_cleanupAll() {
	for (var i=ParentResizeArray.length-1;i>=0;i--) {
		ParentResizeArray[i].resizeChildren=null;
	}
}

function OD_checkVisible_Old(node) {
	var visible = true;
	while (node && visible) {
		if (node.style && node.style.display) visible=(node.style.display!='none');
		node = node.parentNode;
	}
	return visible;
}

function OD_checkVisible(checkNode) {
	if (!checkNode) ODAlert("OD_checkVisible checkNode==null\n"+stacktrace());
	if (checkNode.lastNotVisibleParent && checkNode.lastNotVisibleParent.style.display=='none') return false;
	else {
		var visible = true;
		var node = checkNode;
		while (node && visible) {
			if (node.style && node.style.display && node.style.display=='none') visible=false;
			else node = node.parentNode;
		}
		if (!visible) checkNode.lastNotVisibleParent = node;
		else checkNode.lastNotVisibleParent = null;
		return visible;
	}
}

var OD_ListenBlockShowFuncs = new Array();
var OD_ListenBlockShowParams = new Array();
function OD_AddListenBlockShow(func,param) {
	OD_ListenBlockShowFuncs.push(func);
	OD_ListenBlockShowParams.push(param);
}

function OD_signalBlockShow() {
	var doMultiCall = false;
	if (window['ODStartMultiCall']) doMultiCall = ODStartMultiCall();
	for (var i=0;i<OD_ListenBlockShowFuncs.length;i++) {
		var startTime = (new Date).getTime();
		OD_ListenBlockShowFuncs[i](OD_ListenBlockShowParams[i]);
		var time = (new Date).getTime()-startTime;
	}
	if (doMultiCall) ODFlushMultiCall();
}

function funcname(f) {
	var s = null;
	var m = f.toString().match(/function (\w*)/)
	if (m) s = m[1];
 	if ((s == null) || (s.length==0)) return "anonymous";
 	return s;
}

// version for ie6
function stacktrace_old() {
	 var s = "";
	 for (var a = arguments.caller; a !=null; a = a.caller) {
		s += "->"+funcname(a.callee) + "\n";
		if (a.caller == a) {s+="*"; break;}
	 }
	 return s;
}

// IE7 version 
function stacktrace() {
	var s = "";
	var func = arguments.callee.caller;
	var count = 0;
	while (func && count++<40) {
		s+=" ->"+funcname(func)+"\n";
		func = func.caller;
	}
	if (func) s+=" ->...\n";
	return s;
}

function getScrollPageOffsetLeft(el) {
	var rects = el.getClientRects();
	var left = 100000;
	for (var i=0;i<rects.length;i++) {
		if (left>rects[i].left) left = rects[i].left;
	}
	return left;
}
function getScrollPageOffsetTop(el) {
	var rects = el.getClientRects();
	var top = 100000;
	for (var i=0;i<rects.length;i++) {
		if (top>rects[i].top) top = rects[i].top;
	}
	return top;
}

function arrayContains(array,value) {
	var result =false;
	for (var i=0;result==false && i<array.length;i++) {
		result = (array[i] == value);
	}
	return result;
}


function removeFromArray(array,value) {
	var index = arrayIndexOf(array,value);
	if (index>=0) array.splice(index,1);
}

function arrayIndexOf(array,value,start) {
	if (!start) start=0;
	var result =-1;
	for (var i=start;result==-1 && i<array.length;i++) {
		if (array[i] == value) result = i;
	}
	return result;
}

function arrayInsertAt(array,value,index) {
	array.splice(index,0,value);
}

function arrayInsertBefore(array,value,before) {
	var index = arrayIndexOf(array,before,0);
	if (index<0) array.push(value);
	else {
		arrayInsertAt(array,value,index);
	}
}

function createTable() {
	var table = document.createElement("Table");
	table.border=0;
	table.cellSpacing=0;
	table.cellPadding=0;
	table.id = "createTable";
	return table;
}

function two_diggits(num) {
	if (num<10) return "0"+num;
	else return num;
}

function dateStr(vdate) {
	var str = two_diggits(vdate.getDate())+"-"+two_diggits(vdate.getMonth()+1)+"-"+vdate.getFullYear()+" "+two_diggits(vdate.getHours())+":"+two_diggits(vdate.getMinutes())+":"+two_diggits(vdate.getSeconds());
	return str;
}

function shortDateStr(vdate) {
	var str = two_diggits(vdate.getDate())+"-"+two_diggits(vdate.getMonth()+1)+"-"+vdate.getFullYear();
	return str;
}

function getInputChecks(div) {
	var result = new Array();
	var types = new Array();
	var inputs = div.getElementsByTagName("INPUT");
	for (var i=0;i<inputs.length;i++) {
		var input = inputs[i];
		if (input.type=='checkbox' || input.type=='radio') {
			result.push(input.checked);
			types.push(input.type);
		}
	}
	return result;
}

function setInputChecks(div,array) {
	var result = new Array();
	var types = new Array();
	var inputs = div.getElementsByTagName("INPUT");
	var count = 0;
	for (var i=0;i<inputs.length;i++) {
		var input = inputs[i];
		if (input.type=='checkbox' || input.type=='radio') {
			input.checked = array[count++];
		}
	}
	return result;
}

function getEmbed(name) {
	var result = null;
	for (var i=0;i<document.embeds.length;i++) {
		var embed = document.embeds[i];
		if (embed.id==name) result = embed;
	}
	return result;
}
function getOffsetLeft (el) {
  var ol = el.offsetLeft;
  while (((el = el.offsetParent) != null))
    ol  += el.offsetLeft - el.scrollLeft;
  return ol;
}

function getOffsetTop (el) {
  var ot = el.offsetTop;
  while (((el = el.offsetParent) != null))
    ot += el.offsetTop - el.scrollTop;
  return ot;
}


function nothing() {
}
function returnFalse() {
	return false;
}

function returnTrue() {
	return true;
}

var cachedInsertBlocks = new Object();
function hideInsertBlock(blockName) {
	var block = cachedInsertBlocks[blockName];
	if (!block) {
		block = cachedInsertBlocks[blockName] = document.getElementById("DIVBlock_"+blockName);
	}
	if (block) {
		if (block.length) {
			for (var i=0;i<block.length;i++) block[i].style.display='none';
		} else block.style.display='none';
	}
}

function showInsertBlock(blockName) {
	var block = cachedInsertBlocks[blockName];
	if (!block) {
		block = cachedInsertBlocks[blockName] = document.getElementById("DIVBlock_"+blockName);
	}
	if (block) {
		if (block.length) {
			for (var i=0;i<block.length;i++) block[i].style.display='block';
		} else block.style.display='block';
	}
}

var ODPropClasses = new Object();
function ODAddPropClass(propClass,vec) {
	ODPropClasses[propClass] = vec;
}

function ODGetPropClass(propClass) {
	return ODPropClasses[propClass];
}








function ODGetPropClassProperty(propClass,property,defaultValue) {
	var result =null;
	var vec = ODGetPropClass(propClass);
	if (vec) {
		for (var i=0;i<vec.length && result==null;i++) if (vec[i]==property) result = vec[i+1];
	}
	if (result==null || result=="") result = defaultValue;
	return result;
}


function insertIntoSpan(span,html) {
	span.innerHTML = html;
}
function createElementFromHTML(html) {
	return document.createElement(html);
}
function checkNull(val,def) {
	if (val==null || val=="") return def;
	else return val;
}
function removeNode(node) {
	discardElement(node);
}
function isParentOf(parent,child) {
	if (parent==child) return true;
	else {
		if (child && child.parentNode) return isParentOf(parent,child.parentNode);
		else return false;
	}
}

function isChildOf(child,parent) {
	if (child==parent) return true;
	if (child && child.parentNode) return isChildOf(child.parentNode,parent);
	else return false;
}

function findPopupDocumentBody(el) {
	if (!el) return document.body;
	else if (el.popupId) return el;
	else return findPopupDocumentBody(el.parentNode);
}

function getPopupPosition(x,y,width,height) {
	var result=new Object();
	var bodyW = document.body.clientWidth;
	var bodyH = document.body.clientHeight;
	if (x+width>bodyW) {
		if(x-width>0) x=x-width;
		else x=0;
	}
	if (y+height>bodyH) {
		if(y-height>0) y=y-height;
		else y=0;
	}
	result.x=x;
	result.y=y;
	return result;
}

function evalFunctions(str) {
	var f = start = 0;
	while (start>=0) {
		var start = str.indexOf("function ",start);
		if (start>=0) {
			
			eval(str.substring(f,start));
			var open = str.indexOf("(",start);
			var funcname = str.substring(start+9,open);
			var close = str.indexOf(")",open);
			var contStart = str.indexOf("{",close)+1;

			var count=1;
			start = contStart;
			while (count>0 && start>=0) {
				var accOpen = str.indexOf("{",start);
				var accClose = str.indexOf("}",start);
				if (accOpen>=0 || accClose>=0) {
					if (accOpen<0) accOpen=str.length+1;
					if (accClose<0) accOpen=str.length+1;
					if (accOpen<accClose) {
						count++;
						start=accOpen+1;
					} else {
						count--;
						start=accClose+1;
					}
				} else start=-1;
			}
			if (start>=0) {
				var cont= str.substring(contStart,start-1);
				var  params = new Array();
				open++;
				while (open>=0) {
					var comma = str.indexOf(",",open);
					if (comma>=0 && comma<close) {
						var param = str.substring(open,comma);
						if (param) params.push(param);
						open=comma+1;
					} else {
						var param = str.substring(open,close);
						if (param) params.push(param);
						open =-1;
					}
				}
				if (params.length==2) {
					try {
						window[funcname] = new Function(params[0],params[1],cont);
					} catch(ex) {
						//ODAlert(params[0]+","+params[1]+","+params[2]+","+params[3]+","+params[4]+","+params[5]+","+params[6]+","+params[7]+","+params[8]+","+params[9]+","+params[10]+","+params[11]+","+cont);
						ODAlert("error at "+start +" funcname:"+funcname+" params[0]:"+params[0]+" cont:"+cont+" \nin:"+str);
					}
				} else {
					for(var i=params.length;i<12;i++) params.push("paramNo_"+i);
					try {
						window[funcname] = new Function(params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],cont);
					} catch(ex) {
						//ODAlert(params[0]+","+params[1]+","+params[2]+","+params[3]+","+params[4]+","+params[5]+","+params[6]+","+params[7]+","+params[8]+","+params[9]+","+params[10]+","+params[11]+","+cont);
						ODAlert("error at "+start +" funcname:"+funcname+" params[0]:"+params[0]+" cont:"+cont+" \nin:"+str);
					}
				}
				
				
				f = start;
			}
			
		} else eval(str.substring(f));
	}
}

function testUrl(str) {
	return (""+document.location).indexOf(str)>=0;
}

function discardElement(element) {
	if (element) {
		 var garbageBin = document.getElementById('IELeakGarbageBin');
		 if (!garbageBin) {
			  garbageBin = document.createElement('DIV');
			  garbageBin.id = 'IELeakGarbageBin';
			  garbageBin.style.display = 'none';
			  document.body.appendChild(garbageBin);
		 }

		 // move the element to the garbage bin
		 garbageBin.appendChild(element);
		 garbageBin.innerHTML = '';
	}
}
function discardElements(elements) {
	if (elements) {
		 var garbageBin = document.getElementById('IELeakGarbageBin');
		 if (!garbageBin) {
			  garbageBin = document.createElement('DIV');
			  garbageBin.id = 'IELeakGarbageBin';
			  garbageBin.style.display = 'none';
			  document.body.appendChild(garbageBin);
		 }

		 // move the element to the garbage bin
		 for (var i=0;i<elements.length;i++) garbageBin.appendChild(elements[i]);
		 garbageBin.innerHTML = '';
	}
}

var stackleftRecursieCount=0;
function stackleftRecursie() {
	stackleftRecursieCount++;
	stackleftRecursie();
}
function stackleft(str) {
	stackleftRecursieCount=0;
	try {
		stackleftRecursie()
	} catch(ex) {
	}
	ODAlert(str+" stackleft:"+stackleftRecursieCount);
}
var alertString = "";
var alertTimeout = null;
function alertLast(str) {
	if (alertString==null) alertString = str;
	else alertString = str+"\n"+alertString;
	if (alertTimeout) clearTimeout(alertTimeout);
	alertTimeout = setTimeout("ODAlert(alertString);alertString=null;",2000);
}

function clearAlertLast() {
	alertString==null;
	if (alertTimeout) clearTimeout(alertTimeout);
}

var alertsOn=false;
var signalODAlert=new Array();
var lastODAlert=null;
function setODAlertsOn(on) {
	alertsOn = on;
}
function ODAlert(str) {
	if (alertsOn) alert(str);
	for (var i=0;i<signalODAlert.length;i++) {
		signalODAlert[i](str);	
	}
	lastODAlert =str;
}

function alertLastODAlert() {
	if (lastODAlert) alert(lastODAlert);
}

// Checks to see if the given object is an Array or a String
function isArray(obj) {
	var result = true;
	try {
		if (obj.substring(0)==obj.substring(0)) result=false;	
	} catch (ex) {
		//showInfoException(ex);
	}
	return result;
}



