


// Browser Detect  v2.1.6
// documentation: http://www.dithered.com/javascript/browser_detect/index.html
// license: http://creativecommons.org/licenses/by/1.0/
// code by Chris Nott (chris[at]dithered[dot]com)


function BrowserDetect() {
   var ua = navigator.userAgent.toLowerCase(); 

   // browser engine name
   this.isGecko       = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
   this.isAppleWebKit = (ua.indexOf('applewebkit') != -1);

   // browser name
   this.isKonqueror   = (ua.indexOf('konqueror') != -1); 
   this.isSafari      = (ua.indexOf('safari') != - 1);
   this.isOmniweb     = (ua.indexOf('omniweb') != - 1);
   this.isOpera       = (ua.indexOf('opera') != -1); 
   this.isIcab        = (ua.indexOf('icab') != -1); 
   this.isAol         = (ua.indexOf('aol') != -1); 
   this.isIE          = (ua.indexOf('msie') != -1 && !this.isOpera && (ua.indexOf('webtv') == -1) ); 
   this.isMozilla     = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
   this.isFirefox     = (ua.indexOf('firefox') != -1);
   this.isNS          = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && !this.isOpera && !this.isSafari && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
   
   // spoofing and compatible browsers
   this.isIECompatible = ( (ua.indexOf('msie') != -1) && !this.isIE);
   this.isNSCompatible = ( (ua.indexOf('mozilla') != -1) && !this.isNS && !this.isMozilla);
   
   // rendering engine versions
   this.geckoVersion = ( (this.isGecko) ? ua.substring( (ua.lastIndexOf('gecko/') + 6), (ua.lastIndexOf('gecko/') + 14) ) : -1 );
   this.equivalentMozilla = ( (this.isGecko) ? parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) ) : -1 );
   this.appleWebKitVersion = ( (this.isAppleWebKit) ? parseFloat( ua.substring( ua.indexOf('applewebkit/') + 12) ) : -1 );
   
   // browser version
   this.versionMinor = parseFloat(navigator.appVersion); 
   
   // correct version number
   if (this.isGecko && !this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('/', ua.indexOf('gecko/') + 6) + 1 ) );
   }
   else if (this.isMozilla) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('rv:') + 3 ) );
   }
   else if (this.isIE && this.versionMinor >= 4) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('msie ') + 5 ) );
   }
   else if (this.isKonqueror) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('konqueror/') + 10 ) );
   }
   else if (this.isSafari) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('safari/') + 7 ) );
   }
   else if (this.isOmniweb) {
      this.versionMinor = parseFloat( ua.substring( ua.lastIndexOf('omniweb/') + 8 ) );
   }
   else if (this.isOpera) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('opera') + 6 ) );
   }
   else if (this.isIcab) {
      this.versionMinor = parseFloat( ua.substring( ua.indexOf('icab') + 5 ) );
   }
   
   this.versionMajor = parseInt(this.versionMinor); 
   
   // dom support
   this.isDOM1 = (document.getElementById);
   this.isDOM2Event = (document.addEventListener && document.removeEventListener);
   
   // css compatibility mode
   this.mode = document.compatMode ? document.compatMode : 'BackCompat';

   // platform
   this.isWin    = (ua.indexOf('win') != -1);
   this.isWin32  = (this.isWin && ( ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1) );
   this.isMac    = (ua.indexOf('mac') != -1);
   this.isUnix   = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1)
   this.isLinux  = (ua.indexOf('linux') != -1);
   
   // specific browser shortcuts
   this.isNS4x = (this.isNS && this.versionMajor == 4);
   this.isNS40x = (this.isNS4x && this.versionMinor < 4.5);
   this.isNS47x = (this.isNS4x && this.versionMinor >= 4.7);
   this.isNS4up = (this.isNS && this.versionMinor >= 4);
   this.isNS6x = (this.isNS && this.versionMajor == 6);
   this.isNS6up = (this.isNS && this.versionMajor >= 6);
   this.isNS7x = (this.isNS && this.versionMajor == 7);
   this.isNS7up = (this.isNS && this.versionMajor >= 7);
   
   this.isIE4x = (this.isIE && this.versionMajor == 4);
   this.isIE4up = (this.isIE && this.versionMajor >= 4);
   this.isIE5x = (this.isIE && this.versionMajor == 5);
   this.isIE55 = (this.isIE && this.versionMinor == 5.5);
   this.isIE5up = (this.isIE && this.versionMajor >= 5);
   this.isIE6x = (this.isIE && this.versionMajor == 6);
   this.isIE6up = (this.isIE && this.versionMajor >= 6);
   
   this.isIE4xMac = (this.isIE4x && this.isMac);
}
var browser = new BrowserDetect();


/**
 * This JavaScript object serves as a wrapper of the calls in Geosition Client Controls, that 
 * interfaces with Geosition Client in the best way possible, depending on which browser
 * version is being used.
 */
function MapControls(session, frameset) {
  this.session = session;
  this.frameset = frameset;
  this.batch = false;
  this.buffer = "";
}

MapControls.prototype.isAvailable = function() {
  if (this.frameset) {
    var obj = this.getController();
    return (obj != null);
  }

  return false;
}

MapControls.prototype.getController = function() {
  var frame = this.frameset;

  if(!frame.frames) {
    frame = frame.contentWindow;
  }

  if(frame.frames) {
    return frame.frames["controller_136"];
  }

  return null;
}

MapControls.prototype.callMethod = function(name, args) {
  var call = "controller?action=callClientControls&nocache=1184165791816&session=07EAA002270FEAD920AE430937722CCA.bettan&callMethod=" + name;
  for (var i = 0; i < args.length; i++) {
    call += "&arg" + i + "=" + args[i];
  }
  this.callInternal(call);
}

/* Used for performing multiple consecutive calls using LiveConnect. */
MapControls.prototype.call = function(calls) {
  if (this.batch) {
    this.buffer += calls;
  } else {
    this.callInternal("controller?action=callClientControls&nocache=1184165791816&session=07EAA002270FEAD920AE430937722CCA.bettan&call=" + escape(calls));
  }
}

MapControls.prototype.startBatch = function() {
  this.batch = true;
}

MapControls.prototype.endBatch = function() {
  if (this.buffer != "") {
    this.batch = false;
    this.call(this.buffer);
    this.buffer = "";
  }
}

MapControls.prototype.clearBatch = function() {
  this.buffer = "";
}

MapControls.prototype.callInternal = function(relativeUrl) {
  var callee = this.frameset;
  var call = "http://api.geosition.com/136/client/" + relativeUrl;
  if (this.hasMapConnection()) {
    callee = this.getController();
    if (callee) {
      if (callee.location) {
        callee.location = call;
      } else {
        callee.src = call;
      }
    }
  }
}

MapControls.prototype.hasMapConnection = function() {
  if (!this.isAvailable()) {
    alert("Ett fel har uppstått vid kommunikation med kartan.");
    return false;
  } 
  
  if ((browser.isMac && (browser.isIE || (browser.isNS && browser.versionMinor < 7.02))) // Not supported on the Mac platform
       || (browser.isWin && browser.isNS && browser.versionMajor >= 6 && browser.versionMinor <= 6.01) // Not supported on the Windows platform
       || (browser.isOpera && browser.versionMajor < 6)) { // Not supported on any browsers
    alert("Denna browser har inte stöd för LiveConnect, som krävs för att kommunicera med kartan.");
    return false;
  }

  return true;
}

/* Wrapper methods for LiveConnect calls. */


MapControls.prototype.getMapPosition = function() {
  this.call("getMapPosition();");

}

MapControls.prototype.setCenter = function(x, y) {
  this.call("setCenter('" + x + "', '" + y + "');");

}

MapControls.prototype.setMapPosition = function(x, y, scale) {
  this.call("setMapPosition('" + x + "', '" + y + "', '" + scale + "');");

}

MapControls.prototype.setItemOverview = function(message) {
  this.call("setItemOverview('" + message + "');");

}

MapControls.prototype.setItemInSessionOverview = function() {
  this.call("setItemInSessionOverview();");

}

MapControls.prototype.setScale = function(scale) {
  this.call("setScale('" + scale + "');");

}

MapControls.prototype.zoomIn = function() {
  this.call("zoomIn();");

}

MapControls.prototype.zoomOut = function() {
  this.call("zoomOut();");

}

MapControls.prototype.setState = function(message) {
  this.call("setState('" + message + "');");

}

MapControls.prototype.updateState = function() {
  this.call("updateState();");

}

MapControls.prototype.showPoint = function(id, x, y, icon) {
  this.call("showPoint('" + id + "', '" + x + "', '" + y + "', '" + icon + "');");

}

MapControls.prototype.hidePoint = function(id) {
  this.call("hidePoint('" + id + "');");

}

MapControls.prototype.markItem = function(db, item) {
  this.call("markItem('" + db + "', '" + item + "');");

}

MapControls.prototype.markItemCenter = function(db, item, x, y) {
  this.call("markItemCenter('" + db + "', '" + item + "', '" + x + "', '" + y + "');");

}

MapControls.prototype.showAreaGeocoder = function(n, color, width) {
  this.call("showAreaGeocoder('" + n + "', '" + color + "', '" + width + "');");

}

MapControls.prototype.showAreaGeocoderPreset = function(n, coordinates, color, width) {
  this.call("showAreaGeocoderPreset('" + n + "', '" + coordinates + "', '" + color + "', '" + width + "');");

}

MapControls.prototype.showLineGeocoder = function(n, color, width) {
  this.call("showLineGeocoder('" + n + "', '" + color + "', '" + width + "');");

}

MapControls.prototype.showLineGeocoderPreset = function(n, coordinates, color, width) {
  this.call("showLineGeocoderPreset('" + n + "', '" + coordinates + "', '" + color + "', '" + width + "');");

}

MapControls.prototype.showPointGeocoder = function(n, icon) {
  this.call("showPointGeocoder('" + n + "', '" + icon + "');");

}

MapControls.prototype.showPointGeocoderPreset = function(n, x, y, icon) {
  this.call("showPointGeocoderPreset('" + n + "', '" + x + "', '" + y + "', '" + icon + "');");

}

MapControls.prototype.hideGeocoder = function(n) {
  this.call("hideGeocoder('" + n + "');");

}

MapControls.prototype.resetGeocoder = function(n) {
  this.call("resetGeocoder('" + n + "');");

}

MapControls.prototype.showGeocoderButton = function(n) {
  this.call("showGeocoderButton('" + n + "');");

}

MapControls.prototype.hideGeocoderButton = function(n) {
  this.call("hideGeocoderButton('" + n + "');");

}


/* Deprecated calls. */

/* This call is deprecated! Use hidePoint. */
MapControls.prototype.unMarkPositionIcon = function() {
  this.hidePoint('0');
}

/* This call is deprecated! Use markItemCenter. */
MapControls.prototype.markItemPreset = function(x, y, db, item) {
  this.markItemCenter(db, item, x, y);
}

/* This call is deprecated! Use setCenter. */
MapControls.prototype.setPosition = function(x, y) {
  this.setCenter(x, y);
}

/* This call is deprecated! Use setMapPosition. */
MapControls.prototype.setPositionAndScale = function(x, y, scale) {
  this.setMapPosition(x, y, scale);
}

/* This call is deprecated! Use showPoint. */
MapControls.prototype.markPositionIcon = function(x, y, icon) {
  this.showPoint('0', x, y, icon);
}


/* Deprecated geocoder calls. */

/* This call is deprecated! Use show...Geocoder calls. */
MapControls.prototype.geocode = function(url) {
  this.showPointGeocoder(0, url);
}

/* This call is deprecated! Use show...Geocoder calls. */
MapControls.prototype.geocodePreset = function(x, y, url) {
  this.showPointGeocoderPreset(0, x, y, url);
}

/* This call is deprecated! Use show...Geocoder calls. */
MapControls.prototype.geocode = function(n, active, url) {
  var call = "showPointGeocoder(" + n + ", '" + url + "');";
  if (!active) {
    call += "hideGeocoderButton(" + n + ");";
  }
  this.call(call);
}

/* This call is deprecated! Use show...Geocoder calls. */
MapControls.prototype.geocodeMultiPreset = function(x, y, n, active, url) {
  var call = "showPointGeocoderPreset(" + n + ", '" + x + "', '" + y + "', '" + url + "');";
  if (!active) {
    call += "hideGeocoderButton(" + n + ");";
  }
  this.call(call);
}

/* This call is deprecated! Use show...Geocoder calls. */
MapControls.prototype.enableGeocoder = function(n) {
  this.callMethod("enableGeocoder", new Array("" + n));
}

/* This call is deprecated! Use hideGeocoder... calls. */
MapControls.prototype.disableGeocoder = function(n) {
  hideGeocoder(n);
}

/* This call is deprecated! Use hideGeocoder... calls. */
MapControls.prototype.inactivateGeocoder = function(n) {
  hideGeocoderButton(n);
}

/* The methods below are useless without live connect support. */

/* This call is deprecated! Use getMapPosition. */
MapControls.prototype.getPositionAndScale = function(callback) {
  this.callMethod("getPositionAndScale", new Array(callback));
}
