function updateMapLinksWithGeoLinkToken() {
  ajaxCall({
    "serverScript" : "/o2/GeoLink/getUserGeoLinkToken",
    "handler"      : "updateMapLinksWithGeoLinkTokenCallback",
    "onError"      : "setTimeout('updateMapLinksWithGeoLinkToken();', 200)"
  });
}

function updateMapLinkWithGeoLinkToken(url, callback) {
  ajaxCall({
    "serverScript" : "/o2/GeoLink/getUserGeoLinkToken",
    "params"       : "url=" + escape(url) + "&callback=" + callback,
    "handler"      : "updateMapLinkWithGeoLinkTokenCallback",
    "onError"      : "setTimeout('updateMapLinksWithGeoLinkToken();', 200)"
  });
}

function updateMapLinksWithGeoLinkTokenCallback(params) {
  // o2EnableDebug();
  var links = getElementsByClassName("mapLink", null, "a");
  for (var i = 0; i < links.length; i++) {
    var link = links[i];
    link.href = updateUrlWithGeoLinkToken(link.href, params["token"]);
    link.removeAttribute("onclick");
    link.onclick = new Function();
  }
}

function updateMapLinkWithGeoLinkTokenCallback(params) {
  var url = updateUrlWithGeoLinkToken( params["url"], params["token"] );
  var func;
  eval("func = window." + params["callback"]);
  func.call(null, url);
}

function updateUrlWithGeoLinkToken(url, token) {
  var token = upperCaseEscapeChars( token );
  url = url.replace(/token=[^&\'\"]*/,  "token=" + token);
  return url;
}

function upperCaseEscapeChars(str) {
  var newStr = "";
  for (var i = 0; i < str.length; i++) {
    var char = str.substr(i, 1);
    if (char === "%") {
      var escape = str.substr(i+1, 2);
      newStr += "%" + escape.toUpperCase();
      i += 2;
    }
    else {
      newStr += char;
    }
  }
  return newStr;
}
