	function findContainerByTag(c, cn, n) {
	  var p = c;
	  if (!n)
	  	n = 1;
	  var h = 0;
	  while (true) {
	    if (!p)
	      return null;
	    if (p.tagName){	    
		    if (p.tagName && p.tagName.toLowerCase()==cn) {
		      if (++h==n)	
			      return p;
		    }
		}
	    p = p.parentNode;
	  }
	}
	
	function findContainerByAttr(c, attr) {
	  var p = c;
	  while (true) {
	    if (!p)
	      return null;
	    var res = eval("p."+attr);
	    if (res)
	      return p
	    p = p.parentNode;
	  }
	}
	
	function findContainerByAttrPre(c, attr, pre) {
	  var p = c;
	  while (true) {
	    if (!p)
	      return null;
	    var res = eval("p."+attr);
	    if (res && res.substring(0, pre.length)==pre)
	      return p
	    p = p.parentNode;
	  }
	}
	
	function findContainerByTagAttrPre(c, tag, attr, pre) {
	  var p = c;
	  while (true) {
	    if (!p)
	      return null;
	    if (p.tagName){	
		    if (p.tagName.toLowerCase()==tag)
		    {
			    var res = eval("p."+attr);
			    if (res && res.substring(0, pre.length)==pre)
			      return p
			}
		}
	    p = p.parentNode;
	  }
	}
	
	function findContainerByAttrExclusiv(c, attr, exclusive) {
	  var p = c;
	  while (true) {
	    if (!p)
	      return null;
	    var res = eval("p."+attr);
	    if (res && res.indexOf(exclusive)<0)
	      return p
	    p = p.parentNode;
	  }
	  return null;
	}
	
	function findContainerByTagAttrExclusiv(c, tag, attr, exclusive) {
	  var p = c;
	  var t = tag.toLowerCase();
	  while (true) {
	    if (!p)
	      return null;
	    if (p.tagName){	
		    if (p.tagName.toLowerCase()==t) {	    	
		    	var res = eval("p."+attr);
			    if (res && res.indexOf(exclusive)<0)
			      return p
			}
		}
	    p = p.parentNode;
	  }
	  return null;
	}
	
	function msg(s) {
		var w = window.open("about:blank");
		w.document.open();
		w.document.write("<html><body><textarea id=\"tt\" style=\"width:850px;height:500px\"></textarea></body></html>");
		w.document.close();
	  var tt = w.document.getElementById("tt");
	  tt.value = s;
	}
	function showHTML(s) {
		var w = window.open("about:blank");
		w.document.open();
		w.document.write(s);
		w.document.close();
		w.document.body.background = "/RemoteScriptGuru/html/coolshare/html/images/rulebk2.jpg";
	}
	
	function cleanInner(s) {
	    	s = s.replace(/__doClobber__="true"/g, "");
	    return s;
	}
	
	function parseXml(xml) {
	   var dom = null;
	   if (window.DOMParser) {
	      try { 
	         dom = (new DOMParser()).parseFromString(xml, "text/xml"); 
	      } 
	      catch (e) { dom = null; }
	   }
	   else if (window.ActiveXObject) {
	      try {
	         dom = new ActiveXObject('Microsoft.XMLDOM');
	         dom.async = false;
	         if (!dom.loadXML(xml)) // parse error ..
	
	            window.alert(dom.parseError.reason + dom.parseError.srcText);
	      } 
	      catch (e) { dom = null; }
	   }
	   else
	      alert("cannot parse xml string!");
	   return dom;
	}
	
	function dom2JSON(n) {
		var res = "";
		var k=0;
		res += "{";
		for (var i in n) {
			if (k>0)
			    res+=",";
			if ((typeof n[i]) == "object") {
			    res += dom2JSON(n[i]);
			} else {
			    res+="'"+i+"':'"+n[i]+"'";
			    k++;
			}
		}
		res += "}";
		return res;
	}

	
	function createCookie(name,value,days) {
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+escape(value)+expires+"; path=/";
	}

	function readCookie(name) {
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length,c.length));
		}
		return null;
	}
	
	function clearTable(t) {
		var tb = getTBody(t);
		var trs = getChildren(tb);
		for (var i=trs.length-1; i>-1; i--) {
			if (trs[i].id)
				tb.removeChild(trs[i]);
		}
	}
	
	function toString(s) {
		if ((typeof s)=="string")
			return "'"+s+"'";
		else if ((typeof s)=="object") {
			var res = "[";
			for (var i=0; i<s.length; i++) {
				if (i>0)
					res += ",";
					res += toString(s[i]);
			}
			res += "]";
			return res;
		}
		return s;
	}
	
	function unionMap(m1, m2) {
	    var res = {}
		for (var i in m1)
			res[i] = m1[i];
		for (var i in m2)
			res[i] = m2[i];
		return res;
	}
	
	function isArrayEmpty(a) {
		if (!a)
			return 0;
		if (a.length)
			return a.length==0;
		for (var i in a) {
			return false;
		}
		return true;
	}
	
	function arrayLength(a) {
		try {
			if (a.length)
				return a.length;
			var res = 0;
		
			for (var x in a) {
				res++;	
			}
		} catch (ee) {
			return 0
		}
		return res;
	}
	
	function getFirst(a) {
		for (var i in a) 
			return a[i];
	}
	
	function getSurfix(a, s) {
		var len = s.length;
		for (var i in a) {
			if (i.substring(i.length-len)==s)
				return a[i];
		}
		return null;
	}
	