// Copyright 2008 Google Inc.
// All Rights Reserved.
/**
  * @fileoverview SkyLayerManager
  * 
  * @author  ( )
  */

/*
  Sky layer manager class
  Used to call and get values from a QuadtreeDisplay easily

  @return {Object} this

  @see quadtreeDisplay.js
*/
function SkyLayerManager(map) {
  function createIcon(image) {
    var icon = new GIcon(G_DEFAULT_ICON);
    icon.image = image;
    icon.iconSize = new GSize(16, 16);
    icon.iconAnchor = new GPoint(8, 8);
    icon.shadowSize = new GSize(0, 0);
    return icon;
  }
  var me = this;
  me.map = map;
  me.sliders = {};
  var tileBaseDir = 'http://mw1.google.com/mw-planetary/sky/mapscontent_v1/overlayTiles/';
  var tileBaseDirMatch = 'http\\:\\/\\/mw1\\.google\\.com\\/mw-planetary\\/sky\\/mapscontent_v1\\/overlayTiles\\/';
  me.overlays = {'Spitzer':[tileBaseDir + 'spitzer/zoom{Z}/spitzer_{X}_{Y}.png', 0, false, undefined, 
                            tileBaseDirMatch + 'spitzer\\/zoom\\d+\\/spitzer_\\d+_\\d+\\.png', 100], 
                 'ChandraXO':[tileBaseDir + 'chandracomp/zoom{Z}/chandracomp_{X}_{Y}.png', 0, false, undefined, 
                              tileBaseDirMatch + 'chandracomp\\/zoom\\d+\\/chandracomp_\\d+_\\d+\\.png', 100], 
                 'Galex':[tileBaseDir + 'galex/zoom{Z}/galex_{X}_{Y}.png', 0, false, undefined, 
                          tileBaseDirMatch + 'galex\\/zoom\\d+\\/galex_\\d+_\\d+\\.png', 100], 
                 'IRAS':[tileBaseDir + 'iras/zoom{Z}/iras_{X}_{Y}.png', 0, false, undefined, 
                         tileBaseDirMatch + 'iras\\/zoom\\d+\\/iras_\\d+_\\d+\\.png', 100], 
                 'WMAP':[tileBaseDir + 'wmap/zoom{Z}/wmap_{X}_{Y}.png', 0, false, undefined, 
                         tileBaseDirMatch + 'wmap\\/zoom\\d+\\/wmap_\\d+_\\d+\\.png', 100], 
                 'Cassini':[tileBaseDir + 'cassini/zoom{Z}/cassini_{X}_{Y}.png', 0, false, undefined, 
                            tileBaseDirMatch + 'cassini\\/zoom\\d+\\/cassini_\\d+_\\d+\\.png', 100]};
  return me;
}

SkyLayerManager.prototype.setSlider = function(overlay, slider) {
  this.sliders[overlay] = slider;
};

SkyLayerManager.prototype.getOverlayVisibility = function(overlay) {
  return this.overlays[overlay][2];
};

SkyLayerManager.prototype.getOverlayOpacity = function(overlay) {
  return this.overlays[overlay][1];
};

SkyLayerManager.prototype.setOverlayVisibility = function(overlay, visible) {
  try { var optionBox = document.getElementById('qtb' + overlay); }
  catch(ex) { var optionBox = {className: ''}; }
  if (visible) {
    if (!this.overlays[overlay][3]) {
      var tilelayer = new GTileLayer(null);
      tilelayer.tileUrlTemplate_ = this.overlays[overlay][0];
      tilelayer.tileBBox = bBox[overlay];
      tilelayer.getTileUrl = function(tile, zoom) {
        var is404 = true;
        if (this.tileBBox[zoom] === undefined) return "";
        for (var i = 0; i < this.tileBBox[zoom].length; i += 4) {
          if (this.tileBBox[zoom][i] <= tile.x && this.tileBBox[zoom][i + 1] >= tile.x &&
              this.tileBBox[zoom][i + 2] <= tile.y && this.tileBBox[zoom][i + 3] >= tile.y) {
            is404 = false;
            break;
          }
        }
        if (is404) {
          if (/safari/ig.test(navigator.userAgent.toLowerCase()))
            return "images/img/transparent.gif";
          return "";
        }
        var url = tilelayer.tileUrlTemplate_;
        url = url.replace('{X}', tile.x);
        url = url.replace('{Y}', tile.y);
        return url.replace('{Z}', zoom);
      };
      tilelayer.currentOpacity = this.overlays[overlay][1] / 100;
      tilelayer.isPng = function() { return true;};
      tilelayer.getOpacity = function() { return this.currentOpacity; }
      this.overlays[overlay][3] = new GTileLayerOverlay(tilelayer); 
      this.map.addOverlay(this.overlays[overlay][3]);
      this.overlays[overlay][2] = true;
      try { optionBox.className = 'quadtreeBoxButtonSelected'; } catch(ex) { }
    }
  } else {
    this.map.removeOverlay(this.overlays[overlay][3]);
    this.overlays[overlay][3] = undefined;
    this.overlays[overlay][2] = false;
    try { optionBox.className = 'quadtreeBoxButton'; } catch(ex) { }
  }
};

SkyLayerManager.prototype.cOverlay = function(overlay, opts) {
  if (!this.overlays[overlay][2]) {
    this.overlays[overlay][1] = this.overlays[overlay][5];
    try {
      if (parseInt(opts['maxZoom']) > 0 && this.map.getZoom() > parseInt(opts['maxZoom']))
        this.map.setCenter(this.map.getCenter(), parseInt(opts['maxZoom']));
    } catch (ex) {
    }
  } else {
    this.overlays[overlay][1] = 0;
  }
  this.setOverlayVisibility(overlay, !this.overlays[overlay][2]);
  try {
    try {
      var sliderTr = document.getElementById('_tr' + overlay);
      sliderTr.style.display = this.overlays[overlay][2] ? 'block' : (opts['sliderVisible']?'block':'none');
      sliderTr.style.visibility = this.overlays[overlay][2] ? 'visible' : (opts['sliderVisible']?'visible':'hidden');
    } catch(ex) {
    }
    var slider = this.sliders[overlay];
    slider.setValue(this.overlays[overlay][1]);
  } catch(ex) {
  }
};

SkyLayerManager.prototype.setOpacity = function(overlay, opacity, opts) {
  this.overlays[overlay][1] = opacity;
  if (opacity) {
    this.overlays[overlay][5] = opacity;
    try {
      if (parseInt(opts['maxZoom']) > 0 && this.map.getZoom() > parseInt(opts['maxZoom']))
        this.map.setCenter(this.map.getCenter(), parseInt(opts['maxZoom']));
    } catch (ex) {
    }
    if (!this.overlays[overlay][3]) {
      this.cOverlay(overlay);
      return;
    }
  } else {
    if (this.overlays[overlay][3]) {
      this.overlays[overlay][5] = 100;
      return;
    }
  }
  if (this.overlays[overlay][3]) {
    try {
      var opac = (opacity / 100).toString();
      var opacIE = 'alpha(opacity=' + opacity.toString() + ')';
      this.overlays[overlay][3].getTileLayer().currentOpacity = parseFloat(opac);
      var matching = new RegExp(this.overlays[overlay][4]);
      for (var i in document.images) {
        try {
          if (matching.exec(document.images[i].src)) {
            document.images[i].style.opacity = opac;
            document.images[i].style.filter = opacIE;
          }
        } catch (ex) {
        }
      }
    } catch (ex) {
    }
  }
};

