var tree;

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Google",
			identity: "Webkit"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Webkit"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var uniqueID = 10000;
var BrowserMode = document.compatMode?(document.compatMode=="BackCompat"?"standards":"strict"):null;

// trim functions from http://www.somacon.com/p355.php
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

function getUniqueID()
{
    uniqueID++;
    return "id_"+String(uniqueID);
}


function StopPropagation(ev)
{
    if (BrowserDetect.browser=="Explorer") {
        ev.cancelBubble = true;
    } else {
	    ev.stopPropagation();
	}
}


function PX(val)
{
	if (val=="") return "0px";
	return String(val)+"px";
}

function unPX(str)
{
	if (str.indexOf("px")>0) {
		return str.slice(0,str.length-2);
	}
	return str;
}

//split a string s with the delimeter del
function split(s,del){
arrS= new Array();
var i=0;
var j=0;
var k=0;
var delim=new String(del);

//Is the delimeter in the string
if(s.indexOf(delim)!=-1){
for (i=0; i<s.length;i++){
if(s.charAt(i)==delim){
if(k==0){
arrS[j]=s.substring(k,i);
}else{
arrS[j]=s.substring(k+1,i);
}
k=i;
j++;
}
}
arrS[j]=s.substring(k+1,s.length);
}else{
arrS[0]=s;
}
return arrS;
}



	
function IsPCase(w)
{
	if (w.length<=1) return false;
	if ( (w.charAt(0)>='A' && w.charAt(0)<='Z') && (w.charAt(1)>='a' && w.charAt(1)<='z') ) return true;
	if ( w.charAt(0)>='0' && w.charAt(0)<='9') return true;
	return false;
}

function EndsInPunctuation(wd)
{
	if (wd.length<=1) return false;
	var puncs = ".!\:\n";
	var endchar = wd.substring(wd.length-1);
	if (puncs.indexOf(endchar)!=-1) return true;
	return false;
}
	

function toPC(s)
{
	if (s.charAt(0)=="*") return s.substring(1);
	
	var sa = new Array();
	var sep = new Array();
	var separators = " \n>";
	var l;
	var ret = "";

	var drop = 0;
	for (l=0;l<s.length;l++) {
		if ( separators.indexOf(s.charAt(l))!=-1 ) {
			sa.push(s.substring(drop,l));
			sep.push(s.charAt(l));
			drop=l+1;
		}
	}
	sa.push(s.substring(drop));
	sep.push("");	

	var nextp = true;
	var ret = "";
	for (l=0;l<sa.length;l++) {
		var done = false;
		var w = sa[l];

		if (IsPCase(w)) {
			ret += w + sep[l];
			nextp = false;
			done = true;
		} 
		
		if(EndsInPunctuation(w)) {
			nextp = true;
		} 
		
		if (nextp && !done) {
			ret += w.charAt(0).toUpperCase() + w.substring(1).toLowerCase() + sep[l];
			nextp = false;
			done = true;
		}
		
		if (!done) {
			ret += w + sep[l];
			nextp = false;
		}
		
		if (sep[l]=="\n") nextp = true;
		
	}
	return ret;
}


//Converts string to ProperCase with spaces and hyphens
function OldtoPC(s){
	var i;
	var returnString = "";
	var tmpS=s.toLowerCase();
	var arrS= new Array();
	var arrS2 = new Array();
	
	//search each word in array arrS
	arrS=split(tmpS," ");
	
	for (i = 0; i < arrS.length; i++){ 
		var thisWord=arrS[i];
		//Check to see if word contains a hyphen
			if(thisWord.indexOf("-")!=-1){
				arrS2 = split(thisWord,"-");
				for(var j=0; j < arrS2.length; j++){
					var thisWord2=arrS2[j];
					returnString = returnString + thisWord2.charAt(0).toUpperCase() + thisWord2.substring(1,thisWord2.length)+"-";
				}
				returnString = returnString.substring(0,returnString.length-1)+" ";
			} else {
				returnString = returnString + thisWord.charAt(0).toUpperCase() + thisWord.substring(1,thisWord.length)+" ";
			}
	}

	returnString = returnString.substring(0,returnString.length-1);
	
	return returnString;
}

function NiceM(met)
{
    len = Number(met.substring(0,met.length-2));
    
    ret = len+String("&nbsp;m");
    if (len>100) ret = (len/1000).toFixed(1)+String("&nbsp;km");
        
    return String(ret);
}


function MurderChildren(node) {
	if (node==null) return;
	if (!node.childNodes) return;
	while (node.childNodes.length >= 1) 
	{
		node.removeChild(node.firstChild);
	}
}

// Correctly handle PNG transparency in Win IE 5.5 or higher.
// http://homepage.ntlworld.com/bobosola. Updated 02-March-2004

function PNG_GIF(url)
{
	var arVersion = navigator.appVersion.split("MSIE")
	var version = parseFloat(arVersion[1])
	
    // if the browser doesn't support PNGs 100%, return .gif else .png
	if ((version >= 5.5) && (version < 7)) {
	    return url+".gif";
	}
	
	return url+".png";
}


function PNG_Check(obj)
{
	var arVersion = navigator.appVersion.split("MSIE")
	var version = parseFloat(arVersion[1])
	
    // if the browser doesn't support PNGs 100%, return .gif else .png
	if ((version >= 5.5) && (version < 7)) {
			ur = obj.src;
			urn = ur.replace(/png/gi,"gif");
			if (urn!=ur) {
				obj.src = urn;
			}
	}
}


function PNG_Check_Str(str)
{
	var arVersion = navigator.appVersion.split("MSIE")
	var version = parseFloat(arVersion[1])
	
   // if the browser doesn't support PNGs 100%, return .gif else .png
	if ((version >= 5.5) && (version < 7)) {
			return str.replace(/png/gi,"gif");
	} else return str;
}


function PNG(url,width,height,title,left,top,id,cursor,absleft,abstop)
{
	var arVersion = navigator.appVersion.split("MSIE")
	var version = parseFloat(arVersion[1])
	var extra = "";
	var extrastyle = "";
	var idbit = "";
	var titlebit = "";
	var absbit = "";

    if (!isUndefined(id)) {
        idbit = "id='"+id+"'";
    }
    if (!isUndefined(absleft) && !isUndefined(abstop)) {
        absbit = ";position:absolute;left:"+String(absleft)+"px;top:"+String(abstop)+"px;";
    }
    if (!isUndefined(title)) {
        titlebit="title='"+title+"'"
    }

	if ((version >= 5.5) && (version < 7) && (document.body.filters)) {
	    if (isNumber(left)) {
	        extra+="margin-left:-"+String(left)+"px;";
	        width += left;
	    }
	    if (isNumber(top)) {
	        extra+="margin-top:-"+String(top)+"px;";
	        height += top;
	    }

	    if (!isUndefined(cursor)) {
	        extra+="cursor:"+cursor+";";
	    }

	    if (extra!="") {
	        extrastyle = extra;
	    }

	    if (isUndefined(width)) width="auto";
	    if (isUndefined(height)) height="auto";
	    
	    var widpx = width=="auto"?"auto":(String(width)+"px");
	    var heipx = height=="auto"?"auto":(String(height)+"px");

	    ret = "<div "+idbit+" "+titlebit+" style=\""+extrastyle+"overflow:hidden;width:"+widpx+";height:"+heipx+";filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"', sizingMethod='crop');"+absbit+"\"></div>";
	    return ret;
	} else {
	    if (isNumber(left)) {
	        extra+="margin-left:-"+String(left)+"px;";
	    }
	    if (isNumber(top)) {
	        extra+="margin-top:-"+String(top)+"px;";
	    }
	    if (!isUndefined(cursor)) {
	        extra+="cursor:"+cursor+";";
	    }

	    if (isUndefined(width) || width.length==0) width="auto";
	    if (isUndefined(height) || height.length==0) height="auto";
	    widpx = width=="auto"?"auto":(String(width)+"px");
	    heipx = height=="auto"?"auto":(String(height)+"px");

	    if (extra!="") {
	        extrastyle = " style=\""+extra+"\"";
	    }
	    ret = "<div style='overflow:hidden;width:"+widpx+";height:"+heipx+";"+absbit+"'><img "+idbit+" "+titlebit+" src='"+url+"' "+extrastyle+"></div>";
	    return ret;
	}
}


function GIF(url,width,height,title,left,top,id,cursor)
{
	var extra = "";
	var extrastyle = "";
	var idbit = "";
	var titlebit = "";

    if (!isUndefined(id)) {
        idbit = "id='"+id+"'";
    }
    if (!isUndefined(title)) {
        titlebit="title='"+title+"'"
    }

	if (isNumber(left)) {
	    extra+="margin-left:"+String(left)+"px;";
	}
	if (!isUndefined(cursor)) {
	    extra+="cursor:"+cursor+";";
	}
	if (isUndefined(width)) width="auto";
	if (isUndefined(height)) height="auto";
	if (extra!="") {
	    extrastyle = " style=\""+extra+"\"";
	}
	ret = "<img "+idbit+" "+titlebit+" src='"+url+"' width="+String(width)+" height="+String(height)+extrastyle+">";
	return ret;
}

function isAlien(a) {
   return isObject(a) && typeof a.constructor != 'function';
}
function isArray(v) {
     return v && typeof v === 'object' && typeof v.length === 'number' &&
	          !(v.propertyIsEnumerable('length'));
}
function isBoolean(a) {
    return typeof a == 'boolean';
}
function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}
function isFunction(a) {
    return typeof a == 'function';
}
function isNull(a) {
    return a === null;
}
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}
function isObject(a) {
    return (a && typeof a == 'object') || isFunction(a);
}
function isString(a) {
    return typeof a == 'string';
}
function isUndefined(a) {
    return typeof a == 'undefined';
} 



// This script can be reused as long as the following 
// copyright notice is not removed.  
// SetInterval and ClearInterval Compatibility Script
// Copyright 1999 InsideDHTML.com, LLC. All rights reserved
// See www.insideDHTML.com for more information.

var aTracking = new Array()

var version = parseInt(navigator.appVersion)
var appName = navigator.appName
var ns4 = version>=4 && appName=="Netscape"

//if (!ns4) {
//    origSetTimeout = window.setTimeout;
//}

function runInterval(sIndex,repeat) {
  if (aTracking[sIndex]) {
    var args = aTracking[sIndex].arguments
    // Call function and pass in any extra argument
    var callargs="aTracking[sIndex].code(";

    for(i=0;i < args.length;++i) {
      callargs=callargs+"args["+i+"]";
      if(i < args.length-1) callargs+=",";
    }
    callargs=callargs+")";
    eval(callargs);
    // Start up timer for next iteration
    if (repeat)
        aTracking[sIndex].timerID = setTimeout("runInterval(" + sIndex + ")",aTracking[sIndex].interval)
     else
        newClearInterval(sIndex);
  }
}

function newSetInterval(func,interval) {
 var fCall = func
 if (typeof func!="function") 
  var fCall= new Function(func)
 var nextIdx = aTracking.length
 aTracking[nextIdx] = new Object
 aTracking[nextIdx].interval = interval
 aTracking[nextIdx].code = fCall
 aTracking[nextIdx].arguments = new Array()
 for (var i=2;i < arguments.length;i++) 
  aTracking[nextIdx].arguments[aTracking[nextIdx].arguments.length] = arguments[i]
 aTracking[nextIdx].timerID = setTimeout("runInterval(" + nextIdx + ",true)",interval)
 return nextIdx
}

function newSetTimeout(func,interval) {
 var fCall = func
 if (typeof func!="function") 
  var fCall= new Function(func)
 var nextIdx = aTracking.length
 aTracking[nextIdx] = new Object
 aTracking[nextIdx].interval = interval
 aTracking[nextIdx].code = fCall
 aTracking[nextIdx].arguments = new Array()
 for (var i=2;i < arguments.length;i++) 
  aTracking[nextIdx].arguments[aTracking[nextIdx].arguments.length] = arguments[i]
 aTracking[nextIdx].timerID = setTimeout("runInterval(" + nextIdx + ",false)",interval)
 return nextIdx
}

function newClearInterval(idx) {
 if (aTracking[idx]) {
  clearTimeout(aTracking[idx].timerID)
  aTracking[idx] = null
 }
}


//if (!ns4) {
// window.setInterval = newSetInterval
// window.setTimeout = newSetTimeout
// window.clearInterval = newClearInterval
//}



function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function getScrollX() {
	return getScrollXY()[0];

}
function getScrollY() {
	return getScrollXY()[1];
}

function getAbsoluteLeft(o) {
	// Get an object left position from the upper left viewport corner
	// Tested with relative and nested objects
	oLeft = o.offsetLeft            // Get left position from the parent object
	while(o.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent    // Get parent object reference
		oLeft += oParent.offsetLeft // Add parent left position
		o = oParent
	}
	// Return left postion
	return oLeft;
}


function getAbsoluteTop(o) {
	// Get an object top position from the upper left viewport corner
	// Tested with relative and nested objects
	oTop = o.offsetTop            // Get top position from the parent object
	while(o.offsetParent!=null) { // Parse the parent hierarchy up to the document element
		oParent = o.offsetParent  // Get parent object reference
		oTop += oParent.offsetTop // Add parent top position
		o = oParent
	}
	// Return top position
	return oTop;
}


function getViewTop(o) {
	// Get an object top position from the upper left window, take into account if it's scrolled
	ret = getAbsoluteTop(o);
	ret -= getScrollY();
	return ret;
}


function associateObjWithEvent(obj, methodName){
    return (function(e){
        e = e||window.event;
        return obj[methodName](e, this);
    });
}



function getObj(name)
{
  if (document.getElementById)
  {
		return document.getElementById(name);
  }
  else if (document.all)
  {
		return document.all[name];
  }
  else if (document.layers)
  {
   	return document.layers[name];
  }
}


function FixedString(number, places)
{
	ret = String(number);
	while (ret.length<places) {
		ret = "0" + ret;
	}
	return ret;
}



function createCookie(name,value,days,overrideDomain) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	ck = name+"="+value+expires+"; ";
	if (overrideDomain) {
		ck += "domain="+overrideDomain+"; ";
	}
	ck += "path=/; ";
	document.cookie = ck;
}

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 c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


// converts "dist" km to degrees
function DistanceDegree(lon1,lat1,dist)
{  
    var AVG_ERAD          = 6371.0;
    var DE2RA             = 0.01745329252;
    var az                  = 0;
    var RA2DE = 57.2957795129;
    var PI = 3.14159265359;
  
	var b = dist / AVG_ERAD;
	var sinb = Math.sin(b);
	var cosb = Math.cos(b);
	var sinc = Math.sin(DE2RA * (90.0 - lat1));
	var cosc = Math.cos(DE2RA * (90.0 - lat1));
	var azrad = DE2RA * az;

	var a = Math.acos(cosb*cosc + sinc*sinb*Math.cos(azrad));
	var B = Math.asin(sinb*Math.sin(azrad)/Math.sin(a));

	lat2 = RA2DE * ((PI/2.0) - a);
	lon2 = RA2DE * B + lon1;
    
    var ret = Math.sqrt(Math.pow(lat2-lat1,2)+Math.pow(lon2-lon1,2));
    return ret;
}


function DistanceMeter(lon1, lat1, lon2, lat2)
{
  var DE2RA             = 0.01745329252;
  var AVG_ERAD          = 6371.0;
  var FLATTENING        = 1.0/298.257223563;
  var ERAD              = 6378.135;

   lat1 = DE2RA * lat1;
   lon1 = -DE2RA * lon1;
   lat2 = DE2RA * lat2;
   lon2 = -DE2RA * lon2;

   var F = (lat1 + lat2) / 2.0;
   var G = (lat1 - lat2) / 2.0;
   var L = (lon1 - lon2) / 2.0;

   var sing = Math.sin(G);
   var cosl = Math.cos(L);
   var cosf = Math.cos(F);
   var sinl = Math.sin(L);
   var sinf = Math.sin(F);
   var cosg = Math.cos(G);

   var S = sing*sing*cosl*cosl + cosf*cosf*sinl*sinl;
   if (S==0) return 0;
   var C = cosg*cosg*cosl*cosl + sinf*sinf*sinl*sinl;
   if (C==0) return 0;
   var W = Math.atan2(Math.sqrt(S),Math.sqrt(C));
   if (W==0) return 0;
   var R = Math.sqrt((S*C))/W;
   var H1 = (3 * R - 1.0) / (2.0 * C);
   var H2 = (3 * R + 1.0) / (2.0 * S);
   var D = 2 * W * ERAD;
   return (D * (1 + FLATTENING * H1 * sinf*sinf*cosg*cosg - FLATTENING*H2*cosf*cosf*sing*sing)) * 1000;
}


function ScriptBase()
{
	var scr = document.getElementsByTagName("script");
	var ret = "";
	for (var l=0;l<scr.length;l++) {
		var src = scr[l].src;
		if (src.indexOf("aatmaps.js")>0) {
			ret = src.substr(0,src.indexOf("aatmaps.js"));
		}
	}
	return ret;
}


function BaseUrl()
{
	return ScriptBase();
//	var url_base = String(window.location);
	// start at 8 to skip http://
//	var pos = url_base.indexOf("/",8);
//	if (pos==-1) return "";
//	return url_base.substr(0,pos);
}

function sessionID()
{
	var ret = "";
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	for (l=0;l<32;l++) {
		ret = ret + chars.charAt(Math.random()*chars.length);
	}
	return ret;
}


function JustDomain(furl)
{
	if (furl.substring(0,7)=="http://") {
		furl = furl.slice(7);
	}
	if (furl.substring(0,7)=="https://") {
		furl = furl.slice(8);
	}
	if (furl.indexOf("/")>0) {
		furl = furl.slice(0,furl.indexOf("/"));
	}
	if (furl.substring(0,4)=="www.") {
		furl = furl.slice(4);
	}
	return furl;
}

function SourceElement(ev)
{
    var srcEl = null;

    if (BrowserDetect.browser=="Explorer" || BrowserDetect.browser=="Opera") srcEl=ev.srcElement;
    if (BrowserDetect.browser=="Firefox" || BrowserDetect.browser=="Mozilla") {
    	if (ev.explicitOriginalTarget && ev.explicitOriginalTarget.childNodes>0)
	    	srcEl = ev.explicitOriginalTarget;
    	else
  	  	srcEl=ev.originalTarget;
    }
    if (BrowserDetect.browser=="Webkit") srcEl=ev.srcElement;

    return srcEl;
}


function XRelative(pixels, relativeTo)
{
		if (BrowserDetect.browser=="Explorer" && BrowserMode!="strict") return pixels;
		return pixels + getAbsoluteLeft(relativeTo);
}


function YRelative(pixels, relativeTo)
{
		if (BrowserDetect.browser=="Explorer" && BrowserMode!="strict") return pixels;
		return pixels + getAbsoluteTop(relativeTo);
}


function XContainerToDoc(pixels, relativeTo)
{
		if (BrowserDetect.browser!="Explorer") return pixels;
		return pixels + getAbsoluteLeft(relativeTo);
}


function YContainerToDoc(pixels, relativeTo)
{
		if (BrowserDetect.browser!="Explorer") return pixels;
		return pixels + getAbsoluteTop(relativeTo);
}


function XAbsolute(pixels, relativeTo)
{
//		if (BrowserDetect.browser=="Explorer") return pixels + getAbsoluteLeft(relativeTo);
		return pixels + getAbsoluteLeft(relativeTo);
}


function YAbsolute(pixels, relativeTo)
{
//		if (BrowserDetect.browser=="Explorer") return pixels + getAbsoluteTop(relativeTo);
		return pixels + getAbsoluteTop(relativeTo);
}



function getXRelative(pixels, relativeTo)
{
	if (BrowserDetect.browser=="Explorer") return pixels;
	return pixels - getAbsoluteLeft(relativeTo);
}


function getYRelative(pixels, relativeTo)
{
	if (BrowserDetect.browser=="Explorer") return pixels;
	return pixels - getAbsoluteTop(relativeTo);
}

function REF_LEFT_BUTTON()
{
	if (BrowserDetect.browser=="Firefox" || BrowserDetect.browser=="Mozilla") return 0;
	if (BrowserDetect.browser=="Webkit") return 0;
	if (BrowserDetect.browser=="Opera") return 0;
	return 1;
}

function REF_RIGHT_BUTTON()
{
	return 2;
}

function WeeBar(val,pix)
{
	numpix = (val/100)*pix;
	ret = "<table bgcolor=#bbbbbb height=8 cellspacing=0 cellpadding=0><tr><td alt='Search Ranking.  This entry has a ranking of "+String(val)+"%' bgcolor=#44ff44 width="+String(numpix)+"></td><td width="+String(pix-numpix)+"></td></tr></table>";
	return ret;
}



function FormatUrl(proto, data, refnum, clicksource, callbackname)
{
		var base_link = "ajax_loglink.asp";
		// strip off the protocol bits at the beginning
		if(data.indexOf("//")>0) {
			data = data.substr(data.indexOf("//")+2);
		}
		
		var address = data.trim();
		var caption = address;
		
		if(caption.indexOf("//")>0) {
			caption = caption.substr(0,caption.indexOf("/"));
		}
	
		// pop on the protocol bit again
		var targ = ""
		switch (proto.toLowerCase()) {
			case "http" : 
				data = "http://"+data.trim();
				targ = "target=\"_new\""
				break;
			case "https" : 
				data = "https://"+data.trim();
				targ = "target=\"_new\""
				break;
			case "mailto" : 
				data = "mailto:"+data.trim();
				break;
		}
		
		ajax = base_link+"?fmt=js&jscb=typ="+proto+"&addr="+address+"&ref="+String(refnum)+"&src="+clicksource;
		if (isUndefined(callbackname)) {
			ret = "<a id=\"genlink_"+String(Math.random())+"\" "+targ+" href=\""+data+"\">"+caption+"</a>";
		} else {
			ret = "<a id=\"genlink_"+String(Math.random())+"\" "+targ+" onclick=\"ajaxlog('"+ajax+"')\" href=\""+data+"\">"+caption+"</a>";
		}		
		
		return ret;
}

function EnsureVisible(ref,layername,ctrlname)
{
	var notree = false;
	if (isUndefined(tree)) {
		notree = true;
	} else {
		if (isNull(tree)) notree = true;
	}
	if (notree) {
		// if we don't have a tree with everything in, then use a callback to update the current bubble
		ReplaceBubble(ref, "point."+ref, layername, ctrlname);
		return;
	}
	
	for (var tl=0;tl<tree.tdata.length;tl++) {
		var titem = tree.tdata[tl];
		if (titem.ref==-1) {
			var thisref = titem.entrydata.results.ref;
			if (thisref==ref) {
				// got the point, make sure it's onscreen
				var pt = GetPoint(titem.entrydata,titem.icon,true);
				return;
			}
		}
	}
}


function IsNumeric(input)
{    
	var RE = /^-{0,1}\d*\.{0,1}\d+$/;    
	return (RE.test(input));
}


function LinesOf(str)
{
	return str.length/50;
}


function DecodeMetaDesc(display, ref, source,layername,ctrlname,retlines)
{
	if (!layername) layername="poiLayer";
	var numLines = 0;

	var ret = "";
	var reg = /\[(.*?)\]\{(.*?)\}/g;
	var other = "";
	
	var mPic = "";
	var mPicfname = "";
	var mUsercontent = "";
	var mPicShown = false;
	var nPicCount = 0;

	var arr = display.match(reg);
	if (!isNull(arr)) {
		var al;
		var pics="";
		var pdfs="";
		var url_title="Website";
		for (al=0;al<arr.length;al++) {
			reg.lastIndex = 0;
			var mat = reg.exec(arr[al]);
			if (!isNull(mat)) {
				// mat[1] = symbol
				// mat[2] = data
				data = mat[2];
				symbol = mat[1].toLowerCase();
				
				switch(symbol) {
				
					case "picfname" : mPicfname = data; break;
					case "usercontent" : mUsercontent = data; break;
					case "pic" : mPic = data; break;
					case "submitter email" : break; // can't reveal this
					case "url title" : 
						url_title = data;
						break;
					case "url" : 
						if (data.length>8) {
							returl = FormatUrl("http",data,ref,source,"ajaxlog"); 
							ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>*URL*:</td><td style='font-size:11px;'>"+returl+"</td></tr>";
							numLines++;
						}
						break;
					case "_inside" : 
						ents = data.split("|");
						inside = "<table>";
						for (el=0;el<ents.length;el++) {
							ent = ents[el].split("$");
							inside = inside + "<tr><td style='font-size:11px;'><a onClick=\""+layername+".FindPoint('point."+ref+"').SetStyle('icon');EnsureVisible('"+ent[0]+"','"+layername+"','"+ctrlname+"');myMap.Init(false);\" href= '#'>" + ent[1] + "</a></td></tr>";
							numLines++;
						}
						inside = inside + "</table>"
						ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>Inside:</td><td style='font-size:11px;'>"+inside+"</td></tr>";
						numLines++;
						break;
					case "_isinside" : 
						ents = data.split("|");
						inside = "<table>";
						for (el=0;el<ents.length;el++) {
							ent = ents[el].split("$");
							inside = inside + "<tr><td style='font-size:11px;'><a onClick=\""+layername+".FindPoint('point."+ref+"','point."+ent[0]+"').SetStyle('icon');EnsureVisible('"+ent[0]+"','"+layername+"','"+ctrlname+"');myMap.Init(false);\" href= '#'>" + ent[1] + "</a></td></tr>";
							numLines++;
						}
						inside = inside + "</table>"
						ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>In Building:</td><td style='font-size:11px;'>"+inside+"</td></tr>";
						numLines++;
						break;
					case "email" : 
						if (data.length>3) {
							returl = FormatUrl("mailto",data,ref,source,"ajaxlog"); 
							ret += "<tr valign=center><td nowrap=true style='font-size:11px;' align=right>"+toPC(mat[1])+":</td><td style='font-size:11px;'>"+returl+"</td></tr>";
							numLines++;
						}
						break;

					default :
					
						if (symbol.substr(0,4)=="_pic" && IsNumeric(symbol.substr(4,1)) ) {
							if (nPicCount%3==0) pics+="<br>";
							nPicCount++;
							pics+="<a href='"+ScriptBase()+"userphoto_view.asp?p="+data+"' target='_new'><img id='genlink_"+data+"' height=32 style='border:1px solid black;' border=0 src='"+ScriptBase()+"userphoto_thumb.asp?s=32&p="+data+"'></a>&nbsp;";
						} else if (symbol.substr(0,4)=="_pdf") {
							pdfs+="<a href='"+ScriptBase()+"pdf_view.asp?p="+data+"' target='_new'><img id='genlink_"+data+"' height=32 style='border:1px solid black;' border=0 src='img/pdf_icon_small.gif'></a>&nbsp;";
						} else {
							if (data.toLowerCase()=="yes") {
								if (other.length>1) other+=", ";
								other += mat[1];
							} else {
								if (mat[1]=="_rawhtml") {
									var retbit = "<span id='rawhtml'>"+mat[2]+"</span>";
									return retlines?(new Array(retbit,0)):(retbit);
								}
								if (mat[1].charAt(0)!='_' && data.length!=0 && data.toLowerCase()!="no") {
									data = toPC(data);
									ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>"+toPC(mat[1])+":</td><td style='font-size:11px;'>"+data+"</td></tr>";
									numLines+=LinesOf(data);
								}
							}
						}
						break;

				}
				
			}
		} // for
		
		ret = ret.replace("*URL*", url_title);
		
		if (pics.length>1) {
			ret+="<tr valign=top><td nowrap=true style='font-size:11px;' align=right>Attached Images:</td><td style='font-size:11px;'>"+pics+"</td></tr>";
			numLines+=3;
		}

		if (pdfs.length>1) {
			ret+="<tr valign=top><td nowrap=true style='font-size:11px;' align=right>Attached Documents:</td><td style='font-size:11px;'>"+pdfs+"</td></tr>";
			numLines+=3;
		}

	} else {
	}
	
	if (other.length>0) {
		ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>Other:</td><td style='font-size:11px;'>"+other+"</td></tr>";
		numLines++;
	}
	
	if (retlines) return new Array(ret,numLines);
		else return ret;
}


function MetaPopup(caption, meta, ref, source, ctrlname)
{
	var iconname="icon_small/"+"0"+".png";
  ret = "";
  ret = ret + "<table cellpadding=2 cellspacing=0 width=350>";
  ret = ret + "<tr><td valign=center nowrap=true colspan=2 style='font-size:12px;'><table><tr><td>"+PNG(iconname,16,16)+"</td><td style='font-size:12px;'><b>"+caption+"</b></td></tr></table> </td></tr>";
  ret = ret + DecodeMetaDesc(meta, ref, source, ctrlname);
  ret = ret + "</table>";
  return ret;
}


function GetWindowSize(dimension) {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  if (dimension=="w") return myWidth;
  if (dimension=="h") return myHeight;
  return 0;
}


function URLEncode (clearString) {
  var output = '';
  var x = 0;
  clearString = clearString.toString();
  var regex = /(^[a-zA-Z0-9_.]*)/;
  while (x < clearString.length) {
    var match = regex.exec(clearString.substr(x));
    if (match != null && match.length > 1 && match[1] != '') {
    	output += match[1];
      x += match[1].length;
    } else {
      if (clearString[x] == ' ')
        output += '+';
      else {
        var charCode = clearString.charCodeAt(x);
        var hexVal = charCode.toString(16);
        output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
      }
      x++;
    }
  }
  return output;
}

function URLDecode (encodedString) {
  var output = encodedString;
  var binVal, thisString;
  var myregexp = /(%[^%]{2})/;
  while ((match = myregexp.exec(output)) != null
             && match.length > 1
             && match[1] != '') {
    binVal = parseInt(match[1].substr(1),16);
    thisString = String.fromCharCode(binVal);
    output = output.replace(match[1], thisString);
  }
  return output;
}



 function toAbsURL(s) {
   var l = location, h, p, f, i;
   if (/^\w+:/.test(s)) {
     return s;
   }

   h = l.protocol + '//' + l.host;
   if (s.indexOf('/') == 0) {
     return h + s;
   }

   p = l.pathname.replace(/\/[^\/]*$/, '');
   f = s.match(/\.\.\//g);
   if (f) {
     s = s.substring(f.length * 3);
     for (i = f.length; i--;) {
       p = p.substring(0, p.lastIndexOf('/'));
     }
   }

   return h + p + '/' + s;
 } 
   

function URLRedirect(txt,id,sc,noPopup)
{
	
	var popBit = "";

	var srch1 = /href=["'](.*?)["']/mg;
	var matches = txt.match(srch1);
	
	if (matches!=null) {	
		for (l=0;l<matches.length;l++) {
			var mch = matches[l];
			var beg = mch.substr(0,6);
			var end = mch.substr(mch.length-1,1)
			mch2 = mch.substr(6,mch.length-7);
		
			if (isUndefined(noPopup) || !noPopup) {
				popBit = "target="+end+"new"+end
			}
		
			if (end=="'") {
				mch2 = "href=\""+BaseUrl()+"redirect.asp?i="+String(id)+"&t=http&s="+String(sc)+"&u=["+toAbsURL(mch2)+"]\" "+popBit;
			} else {
				mch2 = "href='"+BaseUrl()+"redirect.asp?i="+String(id)+"&t=http&s="+String(sc)+"&u=["+toAbsURL(mch2)+"]' "+popBit;
			}
			txt = txt.replace(mch,mch2);
		}
	}

	return txt;
}


function CWaitBar(message)
{
    message = message.replace(/[ ]/gi,"&nbsp;");

    this.message = message;
    this.div = null;
    this.state = 0;
    this.requests=0;
}

var gWait = new CWaitBar("Loading Data...");

CWaitBar.prototype.HTML = function(state)
{
    html = "<table bgcolor=red cellspacing=0 cellpadding=3><tr><td style='font-size:12px;color:white;'><b>"+this.message+"</b></td>"

    for (l=0;l<3;l++) {
        html = html + "<td width=16>"
        if (l==state) {
            html = html + "<table width=100% height=100%><tr><td bgcolor=white height=13></td></tr></table>";
        }
        html = html + "</td>";
    }

    html = html + "</tr></table>";
    
    return html;
}


function WaitBarUpdate()
{
    if (gWait==null) return;
    if (gWait.div==null) return;
    gWait.state++;
    if (gWait.state>=3) gWait.state=0;
    gWait.div.innerHTML = gWait.HTML(gWait.state);
    setTimeout("WaitBarUpdate()",500);
}

CWaitBar.prototype.Stop = function()
{
    if (this.requests>0) this.requests--;
    if (this.requests==0) {
    	if (this.div!=null) {
        document.body.removeChild(this.div);
        this.div=null;
      }
    } else {
    	if (this.div!=null) {
        this.div.innerHTML = this.HTML(this.state);
       }
    }
}

CWaitBar.prototype.Start = function()
{
		if (document.body==null) return;
    this.requests++;
    if (this.div==null) {
	    this.div = document.createElement("div");
	      this.div.style.position = "absolute";
	      this.div.style.border = "1px solid black";
	      this.div.innerHTML = this.HTML(this.state);
	      this.div.style.top = 4;
	    	document.body.appendChild(this.div);
        this.div.style.left = document.body.clientWidth - this.div.clientWidth - 6;
        setTimeout("WaitBarUpdate()",500);
    } else {
        this.div.innerHTML = this.HTML(this.state);
    }
}



function Safe(str)
{
	var ret = str;
	ret = ret.replace("<","&lt;");
	ret = ret.replace(">","&gt;");
	return ret;
}



function AddrFormat(addr)
{
    addr = addr.replace(/\\n\\n/gi,"\\n");
    addr = addr.replace(/\\n/gi,"<br>");
    return addr;
}


function CreateCaption(dat,pointref,iconname,source,layername,ctrlname,closeline)
{
	if (!layername) layername="poiLayer";

	var display = isNull(dat.metadata)?"":dat.metadata;
  // if display looks like our HTML, don't, format it
	reg = /\[(.*?)\]\{(.*?)\}/g;
	arr = display.match(reg);
	extra = "";
	var estHeight = 0;

	if (!isNull(arr)) {
		extrafull = DecodeMetaDesc(display,dat.ref,source,layername,ctrlname,true);
		extra = extrafull[0];
		estHeight += extrafull[1]*12;
		var rawid = "<span id='rawhtml'>";
		if (extra.substring(0,rawid.length) == rawid) {
			extra = extra.replace(/&#60;/g,"<");
			if (extra.indexOf("[close]")>0) {
				extra = extra.replace("[close]", "[ <a onClick=\""+layername+".FindPoint('point."+dat.ref+"','point."+dat.inside+"').SetStyle('icon');myMap.Init(false);\" href= '#'>Close </a> ]");
				extra = extra.replace("[close]", "[ <a id='genlink_close' href= '#'>Close </div> ]");
			}
			return extra;
		}
	} else {
		if (!isNull(display) && display.length > dat.caption.length) {
			if (display.length>3) {
				var disp = display.replace(/&gt;/g,">");
				disp = disp.replace(/&lt;/g,"<");
				return disp;
			}
		}
	}
	
    ret = "";
    ret = ret + "<table cellpadding=2 cellspacing=0 width=350>";
    ret = ret + "<tr><td valign=center nowrap=true colspan=2 style='font-size:12px;'><table><tr><td>"+PNG(iconname,16,16)+"</td><td style='font-size:12px;'><b>"+dat.caption+"</b></td></tr></table> </td></tr>";
    estHeight += 14;
    
    if (extra.length>3) {
        ret = ret + extra;
    }

    ret = ret + "<tr><td nowrap=true style='font-size:11px;' align=right>Directions:</td><td nowrap=true style='font-size:11px;'>"+
        "<span style='font-size:11px;color:blue;text-decoration:underline;cursor:pointer;' onClick=\""+layername+".FindPoint('point."+dat.ref+"','point."+dat.inside+"').SetStyle('icon');myMap.MenuCallback('abs.dir.from',"+String(dat.x)+","+String(dat.y)+",myMap)\">From Here</span>, "+
        "<span style='font-size:11px;color:blue;text-decoration:underline;cursor:pointer;' onClick=\""+layername+".FindPoint('point."+dat.ref+"','point."+dat.inside+"').SetStyle('icon');myMap.MenuCallback('abs.dir.to',"+String(dat.x)+","+String(dat.y)+",myMap)\">To Here</span> (See Directions Tab Above)</td></tr>";
  	estHeight += 12;
    ret = ret + "<tr><td colspan=2 nowrap=true style='font-size:11px;' align=center>[ <a href= 'rep_err.asp?r="+dat.ref+"' target='_new'>Report Data Error</a> ]</td></tr>";
  	estHeight += 12;
    ret = ret + "<tr><td colspan=2 nowrap=true style='font-size:11px;' align=center>[ <a href= 'default.asp?point="+dat.uniqueref+"' target='_new'>Link to map showing this point</a> ]</td></tr>";
    if (isUndefined(closeline)) {
    	ret = ret + "<tr><td colspan=2 nowrap=true style='font-size:11px;' align=center>[ <a onClick=\""+layername+".FindPoint('point."+dat.ref+"','point."+dat.inside+"').SetStyle('icon');myMap.Init(false);\" href= '#'>Close </a> ]</td></tr>";
    	estHeight += 12;
    } else {
    	ret = ret + closeline;
    	estHeight += 12;
    }


// editing			ret += "<tr valign=top><td nowrap=true style='font-size:11px;' align=right>Editing:</td><td style='font-size:11px;'><a href='datamaint/EditDirectory.asp?id="+String(dat.ref)+"' target='_new'>Edit This Entry</a></td></tr>";
    
    ret = ret + "</table>";
/*    
    if (estHeight>325) {
    	ret = "<div style='width:375px;height:350px;overflow-y:scroll;' id='genlink_noscroll'>" + ret;
    	ret += "</div>";
    }
*/    
    return ret;
}

function CreditWindow(url)
{
	window.open(url,"creditwindow");	
}

function detect_doctype(){
  var re=/\s+(X?HTML)\s+([\d\.]+)\s*([^\/]+)*\//gi;
  if(typeof document.namespaces != "undefined"){
    if(document.all[0].nodeType==8)
      return re.exec(document.all[0].nodeValue)[3];
    else
      return null;
    }
  else{
    if(document.doctype != null)
      return re.exec(document.doctype.publicId)[3];
    else
      return null;
  }
}


function CheckIcon(icn, icnsize)
{
	var ret = "";
  if (icn.indexOf("://")>0)
  	ret = icn+"_"+String(icnsize)+".png";
  else if (icn.indexOf("*")>0) {
  	var icns = icn.split("*");
  	ret = ScriptBase()+"userphoto_view.asp?p="+( (icnsize*1==16)?icns[0]:icns[1] );
  } 
  else
  	ret = ScriptBase()+"icons/"+icn+"_"+String(icnsize)+".png";
  return ret;
}


function CenterElement(el)
{
	el.style.left = GetWindowSize("w")/2 - el.clientWidth/2;
	el.style.top = GetWindowSize("h")/2 - el.clientHeight/2;
}
