var IMAGE = 0;
var TERRAIN = 1;
var VECTOR = 2;
var ANNOTATION = 3;

var fadeT = new Object();
var cycle_on = false;
var fade = new Array();
var step = new Array();
var isOn;

var colorbar = new Object();
colorbar['color']           = 'green';
colorbar['height']          = 5;
colorbar['widthDifference'] = 0;
colorbar['offsetLeft']      = 5;
colorbar['offsetTop']       = 9;


function makeLayersHTML()
{
  document.write(
    "<tr>\n",
    "  <td height=\"1%\" align=\"left\">\n",
    "    <font face=\"Geneva, Arial, Helvetica, san-serif\" color=\"#FFFFFF\"><b><i><u>Map Layers</u></i></b></font>\n",
    "  </td>\n",
    "</tr>\n");
  for(var i=0; i < layers.length; i++)
  {
    document.write(
      "\n<tr>\n",
      "  <td height=\"1%\" align=\"left\">\n",
      "    <font face=\"Geneva, Arial, Helvetica, san-serif\" color=\"#FFFFFF\" size=\"-1\">\n",
      "      <input type=\"checkbox\" id=\"" + i + "\" name=\"" + layers[i].name + "\" ");
    if(layers[i].type == IMAGE || layers[i].type == TERRAIN) {
      if(layers[i].type == IMAGE) {
        document.write(
        "       onclick=\'if(cycle_on)stopCycleFade();fadeToggle(this.checked,this.name,1.0,this.id);disableSlider(this.id,!this.checked)\'>" + layers[i].label + "\n");
	  } else {
	    document.write(
        "       onclick=\'GeoPlayer.SceneSetShowDataFlag(this.checked,1);disableSlider(this.id,!this.checked,this.id)\'>" + layers[i].label + "\n");
	  }
      document.write(
      "    </font>\n",
      "    <br>\n",
      "    <table width=\"100%\">\n",
      "      <tr>\n",
      "        <td width=\"10\">&nbsp;\n",
      "        </td>\n",
      "        <td>\n",
      "          <div id=\"slider_" + i + "\"></div>\n",
      "          <br>\n",
      "        </td>\n",
      "      </tr>\n",
      "    </table>\n");
	} else
      document.write(
      "       onclick=\'SetOverlayGlobe(" + i + ", this.checked);GeoPlayer.SceneSetShowDataFlag(this.checked," + layers[i].type + ")\'>" + layers[i].label + "\n",
      "    </font>\n");
    document.write(
      "  </td>\n",
      "</tr>\n");
  }
}


function makeFlyToHTML()
{
  document.write(
    "\n<tr>\n",
    "  <td height=\"1%\" align=\"left\">\n",
    "    <font face=\"Geneva, Arial, Helvetica, san-serif\" color=\"#FFFFFF\"><b><i><u>Fly To</u></i></b></font>\n",
    "  </td>\n",
    "</tr>\n",
    "<tr>\n",
    "  <td height=\"1%\" align=\"left\">\n",
    "    <font face=\"Geneva, Arial, Helvetica, san-serif\" color=\"#FFFFFF\">\n",
    "      <select name=\"FlyToMenu\" onChange=\"MM_jumpMenu(\'parent\',this,1)\">\n",
    "        <option selected>destination ...</option>\n");
    for(var i=0; i < loc.length; i++)
      document.write("        <option value=\"" + i + "\">" + loc[i].label + "</option>\n");
    document.write(
    "      </select>\n",
		"    </font>\n",
    "  </td>\n",
    "</tr>\n");
}

function disableSlider(id, value)
{
  layers[id].slider.setDisabled(value);
}

/**
* @param object sliderObj
* @param int val (the value)
*/
function bsSliderChange(sliderObj, val, newPos)
{
  // find out which layer this is
  for(var i=0; i < layers.length; i++)
  {
    if(layers[i].slider == sliderObj)
      break;
  }
  if(i == layers.length)
  {
    alert("bsSliderChange: Don't recognize layer");
    return;
  }
  
  if(fadeT[layers[i].name] != null)
  {
    clearInterval(fadeT[layers[i].name]);
    fadeT[name] = null;
  }
  if(fade[layers[i].name] != null)
  {
    clearInterval(fade[layers[i].name]);
    fade[name] = null;
  }

  switch(layers[i].type)
  {
    case IMAGE:
    {
      GeoPlayer.GlobeViewSetAlpha(val, layers[i].name);
      break;
    }
    case TERRAIN:
    {
      GeoPlayer.SceneSetTerrainScale(val);
      break;
    }
    default:
      alert("bsSliderChange: Don't recognize layer type: ", layers[i].type);
      return;
  }
}


function makeSlider(min, max, default_value, draw_name, sliderChange)
{
  slider = new Bs_Slider();
  slider.attachOnChange(sliderChange);
  slider.width         = 110;
  slider.height        = 26;
  slider.minVal        = min;
  slider.maxVal        = max;
  slider.valueInterval = (max - min) / slider.width;
  slider.valueDefault  = default_value;
  slider.arrowAmount   = 0;
  slider.imgDir        = '../js/img/';
  slider.setBackgroundImage('background.gif', 'no-repeat');
  slider.setSliderIcon('slider.gif', 13, 18);
  slider.useInputField = 2;
  slider.styleValueFieldClass = 'sliderInput';
  slider.colorbar = colorbar;
  slider.setDisabled(false);
  slider.drawInto(draw_name);
  return slider;
} 


function MM_jumpMenu(targ,selObj,restore){ //v3.0
  var i = selObj.options[selObj.selectedIndex].value;
  GeoPlayer.FlyView(loc[i].lat, loc[i].lon, loc[i].azi, loc[i].tilt, loc[i].twist, loc[i].dist, loc[i].orbit);
  if (restore) selObj.selectedIndex=0;
}


function MaxWin()
{
  var offset = (navigator.appName == "Microsoft Internet Explorer"
               && navigator.userAgent.indexOf("Mac") == -1)? 4: 0;
  var width = screen.availWidth+2 * offset;
  var height = screen.availHeight+2 * offset;

  window.moveTo(-offset, -offset);
  window.resizeTo(width, height);
}



function fadeToggle(checked, name, duration, id)
{
  var nsteps = 50;
  var start_alpha, alpha;
  // start_alpha = alpha = GeoPlayer.GlobeViewGetAlpha(name);
  start_alpha = alpha = layers[id].slider.getValue();
  var delay = duration / nsteps * 1000;
  var step = checked? alpha/nsteps: (0 - alpha)/nsteps;
  var target = checked? alpha: 0;
  if(checked)
  { // was off, start at 0 alpha and enable globe
    alpha = 0;
    GeoPlayer.GlobeViewSetAlpha(0.0, name);
    GeoPlayer.GlobeViewSetEnable(true, name);
  }

  var str = "fadeAlpha(\"" + name + "\"," + step + "," + target + "," + start_alpha + ");\0";
  if (fadeT[name]!= null) {
    clearInterval(fadeT[name]);
  }
  fadeT[name] = setInterval(str, delay);
}


function fadeAlpha(name, step, target, start_alpha)
{
  var alpha = GeoPlayer.GlobeViewGetAlpha(name);

 // fade alpha up or down to desired level
  alpha += step;
  if(step > 0) // going from zero up to target
    alpha = (alpha > target)? target: alpha;
  else        // going from target down to zero 
    alpha = (alpha < 0.0)? 0.0: alpha;
  GeoPlayer.GlobeViewSetAlpha(alpha, name);
 
  if(alpha == target)
  {
    clearInterval(fadeT[name]);
    fadeT[name] = null;
    //if(alpha == 0)
    //{ // disable globe if we reach 0 alpha
    //  GeoPlayer.GlobeViewSetEnable(false, name);
    //  GeoPlayer.GlobeViewSetAlpha(start_alpha, name);
    //}
  }
}


function startCycleFade(layer, cycle_time, delay)
{
  cycle_on = true;
  var inc = delay / cycle_time;
  for(i=0; i<layer.length; i++)
  {
    var start_alpha = ((layer.length - 1) - i) / (layer.length - 1);
    start_alpha = (start_alpha > 1.0)? 1.0: (start_alpha < 0.0)? 0.0: start_alpha;
    layers[layer[i]].slider.setValue(start_alpha);
    GeoPlayer.GlobeViewSetEnable(true, layers[layer[i]].name);
    document.getElementById(layer[i]).checked = true;
    layers[layer[i]].slider.setDisabled(false);

    var str = "cycleAlpha(\"" + layer[i] + "\");\0";
    if (fade[layer[i]] != null) {
      clearInterval(fade[layer[i]]);
    }
    step[layer[i]]= inc;
    fade[layer[i]] = setInterval(str, delay * 1000);
  }
}

 
function cycleAlpha(layer, start_alpha)
{
  var alpha = GeoPlayer.GlobeViewGetAlpha(layers[layer].name);
  alpha = (alpha > 0.999)? 1.0: (alpha < 0.0)? 0.0: alpha;

 // fade alpha up or down between 0 & 1.0
  step[layer] = (alpha >= 1.0)? -step[layer]: (alpha <= 0.0)? -step[layer]: step[layer];
  alpha += step[layer];
  alpha = (alpha > 1.0)? 1.0: (alpha < 0.0)? 0.0: alpha;
  layers[layer].slider.setValue(alpha);
}  


function stopCycleFade()
{
  for(i=0; i<fade.length; i++)
  {
    clearInterval(fade[i]);
    fade[i] = null;
  }
  cycle_on = false;
}


function initLayers()
{
  // Build a slider for each layer
  for(i=0; i < layers.length; i++)
  {
    switch(layers[i].type)
    {
      case IMAGE:
      {
        layers[i].slider = makeSlider(layers[i].min, layers[i].max, layers[i].default_value, "slider_"+i, bsSliderChange);
        isOn = GeoPlayer.GlobeViewGetEnable(layers[i].name);
        document.getElementById(i).checked = isOn;
        layers[i].slider.setValue(GeoPlayer.GlobeViewGetAlpha(layers[i].name));
        layers[i].slider.setDisabled(!isOn);
        break;
      }
      case TERRAIN:
      {
        layers[i].slider = makeSlider(layers[i].min, layers[i].max, layers[i].default_value, "slider_"+i, bsSliderChange);
        isOn = GeoPlayer.SceneGetShowDataFlag(1);
        document.getElementById(i).checked = isOn;
        layers[i].slider.setValue(GeoPlayer.SceneGetTerrainScale());
        layers[i].slider.setDisabled(!isOn);
        break;
      }
      case VECTOR:
      case ANNOTATION:
      {
        document.getElementById(i).checked = GeoPlayer.SceneGetShowDataFlag(layers[i].type);
        break;
      }
      default:
        break;
    }
  }
}


function SetOverlayGlobe(layer_num, on)
{
  var other = (layers[layer_num].type == VECTOR)? ANNOTATION: VECTOR;
  
  if(on)
    GeoPlayer.GlobeViewSetEnable(on, layers[layer_num].globe);
  else
    for(i=0; i < layers.length; i++)
      if((layers[i].type == other) && (!GeoPlayer.SceneGetShowDataFlag(other)))
          GeoPlayer.GlobeViewSetEnable(on, layers[layer_num].globe);
}



function init()
{
  //MaxWin();

  // ititialize widget's state
  GeoPlayer.GeoPlayerInit();
  initLayers();
  GeoPlayer.showprogress = 1;
}
