var opac = 0.0;
var validPosition = true;

function isStyledMap() {
 return document.getElementById("map_overview_spacer");
}

function findPos(obj) {
 var curX = 0;
 var curY = 0;
 if (obj.offsetParent) {
  do {
   curX += obj.offsetLeft;
   curY += obj.offsetTop;
  } while (obj = obj.offsetParent);
 }
 return [curX,curY];
}

function searchChildNodesRecursive(id) {

 function recursive(el) {
  if (el.hasChildNodes()) {
   for (var i = 0; i < el.childNodes.length; i++) {
    if (el.childNodes[i].nodeName != 'BR' && el.childNodes[i].nodeName != '#text' && el.childNodes[i].nodeName != '#comment') {
     recursive(el.childNodes[i]);
    } else if (el.childNodes[i].nodeName == '#text') {
     if (el.childNodes[i].textContent.search(/[a-z\.\(\)]* \(at\) ([a-z]* \(dot\) [a-z]*)|([a-z]* \(dot\) [a-z]* \(dot\) [a-z]*)/i) != -1)
      el.childNodes[i].textContent = el.childNodes[i].textContent.replace(/ \(dot\) /g, '.').replace(' (at) ', '@');
    }
   }
  } else if (el.innerHTML.search(/[a-z\.\(\)]* \(at\) ([a-z]* \(dot\) [a-z]*)|([a-z]* \(dot\) [a-z]* \(dot\) [a-z]*)/i) != -1)
   el.innerHTML = el.innerHTML.replace(/ \(dot\) /g, '.').replace(' (at) ', '@');
 }

 recursive(document.getElementById(id));
}

function convertEmail() {
 searchChildNodesRecursive("left");
 searchChildNodesRecursive("right");
}

function mailto(node, subj, body) {
  addr = node.innerHTML;
  node.onlick = '';
  node.href = 'mailto:' + addr.replace(/ (dot) /g, '.').replace(' (at) ', '@');
  if (subj) node.href += '?subject=' + subj;
  if (body) node.href += '&body=' + encodeURI(body);
}

function move(obj, ref, x, y) {
 if (isStyledMap() && document.getElementById(ref)) {
  pos = findPos(document.getElementById(ref));
  if (!document.getElementById(obj)) {
   alert("Error parsing document.getElementById('" + obj + "')");
  } else {
  document.getElementById(obj).style.left = pos[0] + x + "px";
  document.getElementById(obj).style.top = pos[1] + y + "px";}
 }
}

function moveCorners(obj, ref) {
 move(obj + "-tl", ref, 0, 0);
 move(obj + "-tr", ref, (obj == "overview" ? -2 : 0) + ((document.getElementById(ref).style.width).replace("px","") - (document.getElementById(obj + "-tr").style.width).replace("px","")), 0);
 move(obj + "-bl", ref, 0, (obj == "overview" ? -1 : 0) + ((document.getElementById(ref).style.height).replace("px","") - (document.getElementById(obj + "-bl").style.height).replace("px","")));
 move(obj + "-br", ref, (obj == "overview" ? -2 : 0) + ((document.getElementById(ref).style.width).replace("px","") - (document.getElementById(obj + "-br").style.width).replace("px","")), (obj == "overview" ? -1 : 0) + ((document.getElementById(ref).style.height).replace("px","") - (document.getElementById(obj + "-br").style.height).replace("px","")));
}

function toggleCorners(obj) {
 toggle(obj + "-tl");
 toggle(obj + "-tr");
 toggle(obj + "-bl");
 toggle(obj + "-br");
}

function fadeInCorners(obj) {
 fadeIn(obj + "-tl");
 fadeIn(obj + "-tr");
 fadeIn(obj + "-bl");
 fadeIn(obj + "-br");
}

function fadeOutCorners(obj) {
 fadeOut(obj + "-tl");
 fadeOut(obj + "-tr");
 fadeOut(obj + "-bl");
 fadeOut(obj + "-br");
}

function setTooltip(ref, info) {
 var tooltip = document.getElementById("tooltip");
 move("tooltip", ref, (document.getElementById("pop-out").style.width).replace("px", "") / 2 - 37, 2);
 var textinfo = document.createElement("span");
 textinfo.innerHTML = tooltips.text[info];
 tooltip.childNodes[3].appendChild(textinfo);
}

function getLargestHeight() {
 var largest = null;
 var obj = new Array(3);
 obj[0] = window.innerHeight;
 obj[1] = document.body.scrollHeight - 63;
 obj[2] = document.height;
 for (i = 0; i < 3; i++) {
  if (obj[i] > largest) largest = obj[i];
 }
 return largest + "px";
}

function fitResize() {
 if (!isStyledMap()) return;

 moveCorners("layer", "map");
 move("overview", "map", 480, 165);
 moveCorners("overview", "map_overview_spacer");
 document.getElementById("pr_mid").style.height = (window.innerHeight - 135) + "px";
 document.getElementById("mapslayer").style.height = getLargestHeight();
}

var topLayer = null;
function toggleMaps() {
 toggle("mapsbox");
 toggleCorners("layer");
 toggleCorners("overview");
 fadeOut("mapslayer");
 toggle("mapslayer");
 topLayer = null;
}

function googlemaps() {
 topLayer = "mapslayer";
 if (isStyledMap()) {
  var mapslayer = document.getElementById("mapslayer");
  mapslayer.style.height = getLargestHeight();
  mapslayer.onclick = function() {
   if (validPosition) {
    switch (topLayer) {
     case "mapslayer": toggleMaps();
     break;
     case "preview": togglePreview();
     break;
     default: toggleMaps();
     break;
    }
   }
  };
  toggle("mapslayer");
  fadeIn("mapslayer");

  window.setTimeout(function() {
   toggle("loading");
  }, 500);

  window.setTimeout(function() {
   toggle("loading");
   toggle("mapsbox");

   readData();
   moveCorners("layer", "map");
   toggleCorners("layer");

   move("overview", "map", 480, 165);
   toggle("overview");
  
   window.setTimeout("moveCorners('overview', 'map_overview_spacer')",1);

   toggleCorners("overview");
   document.getElementById("directions").innerHTML = "";

   opac = 0.0;
   setTooltip("pop-out", "directions");
   toggle("tooltip");
   fadeIn("tooltip");
  }, 2600);
 } else readData();
}

function toggle(name, displayType) {
 var panel = typeof name != "string" ? name : document.getElementById(name);
 if (displayType) {
  panel.style.display = displayType;
 } else {
  if (panel && (panel.style.display == "block" || panel.style.display == "")) {
   panel.style.display = "none";
  } else {
   panel.style.display = "block";
  }
 }
}

function toggleRoute() {
 toggle("tooltip", "none");

 if (document.getElementById("directions").innerHTML == "") {
  setDirections(document.getElementById("fromAddress").value, document.getElementById("toAddress").value);
 } else {
  map.clearOverlays();
  buildMap(0);
  document.getElementById("directions").innerHTML = "";
 }

 toggle("bot");
 toggle("route");
 document.getElementById("mapslayer").style.height = getLargestHeight();

 var box = document.getElementById("mapsbox");
 if ((box.style.marginTop).replace("px","") == 150) {
  box.style.marginTop = "40px";
 } else {
  box.style.marginTop = "150px";
 }

 moveCorners("layer", "map");

 move("overview", "map", 480, 165);
 moveCorners("overview", "map_overview_spacer");
}

function togglePreview() {
 var preview = document.getElementById("preview");
 var map = document.getElementById("map");
 var dir = document.getElementById("directions");

 topLayer = "preview";

 if (preview.style.display == "block" || preview.style.display == "") {			// no preview
  document.getElementById("map_spacer").appendChild(map);
  document.getElementById("directions_spacer").appendChild(dir);
  map.style.width = 500 + "px";
  map.style.height = 392 + "px";
  dir.style.width = "100%";
  dir.style.height = "auto";
  dir.style.overflowY = "scroll";
  dir.style.marginLeft = "74px";

  toggle("mapsbox");
  toggleCorners("layer");
  toggleCorners("overview");
  toggle("tooltip", "block");
  fadeIn("mapsbox");
  /*fadeInCorners("layer");
  fadeInCorners("overview");*/
  window.setTimeout(function(){toggle('preview');toggle('overview');},53);
 } else {														// is preview
  document.getElementById("map_spacer_preview").appendChild(map);
  document.getElementById("directions_spacer_preview").appendChild(dir);
  map.style.width = 512 + "px";
  map.style.height = 800 + "px";
  dir.style.width = "100%";
  dir.style.height = "auto";
  dir.style.overflow = "hidden";
  dir.style.marginLeft = "0px";

  var clone_map = map.cloneNode(true);
  var clone_dir = dir.cloneNode(true);
  window.frames['htmlDocument'].document.getElementById("map_spacer_iframe").appendChild(clone_map);
  document.getElementById("directions_spacer_iframe").appendChild(clone_dir);
  document.getElementById("pr_mid").style.height = (window.innerHeight - 135) + "px";

  toggle("preview");
  toggle("overview");
  fadeOut("mapsbox");
  /*fadeOut("overview");
  fadeOutCorners("layer");
  fadeOutCorners("overview");*/
  toggleCorners("layer");
  toggleCorners("overview");
  toggle("tooltip", "none");
  window.setTimeout("toggle('mapsbox')",67);
 }
}

var fadeInRunning = false;
var fadeOutRunning = false;
function fadeIn(name) {
 var obj = typeof name != "string" ? name : document.getElementById(name);
 if(!fadeOutRunning) {
  opac = opac + 0.1;
  if(!/msie/i.test(navigator.userAgent)) {
   obj.style.opacity = opac;
  } else {
   obj.style.filter = "alpha(opacity=" + (opac*100) + ")";
  }
 } else {
  opac = 1.0;
 }
 if(opac < 1.0) {
  name = typeof name != "string" ? name.id : name;
  window.setTimeout("fadeIn('"+name+"')",67);
  fadeInRunning = true;
  return true;
 } else {
  fadeInRunning = false;
  return false;
 }
}

function fadeOut(name, hide) {
 var obj = typeof name != "string" ? name : document.getElementById(name);
 if(!fadeInRunning) {
  opac = opac - 0.1;
  if(!/msie/i.test(navigator.userAgent)) {
   obj.style.opacity = opac;
  } else {
   obj.style.filter = "alpha(opacity=" + (opac*100) + ")";
  }
 } else {
  opac = 0.0;
 }
 if(opac > 0.0) {
  name = typeof name != "string" ? name.id : name;
  window.setTimeout("fadeOut('"+name+"', "+hide+")",67);
  fadeOutRunning = true;
  return true;
 } else {
  fadeOutRunning = false;
  opac = 0.0;
  if (hide) obj.style.display = 'none';
  return false;
 }
}

var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}

function pdfCreate() {
 var clone = new Array();
 clone['map'] = document.getElementById("map").cloneNode(true);
 clone['dir'] = document.getElementById("directions").cloneNode(true);
 window.frames['htmlDocument'].document.getElementById("map_spacer_iframe").appendChild(clone['map']);
 window.frames['htmlDocument'].document.getElementById("directions_spacer_iframe").appendChild(clone['dir']);
 window.frames['htmlDocument'].document.getElementById("html_code").value = Base64.encode(window.frames['htmlDocument'].document.getElementById("container").innerHTML);
 window.frames['htmlDocument'].document.forms['generated'].submit();
}

window.onload = function() {
 convertEmail();

 if (document.getElementById("googlemaps")) {
  move("googlemaps", "direction", -4, -12);
  toggle("googlemaps");
 }
};