/*
Copyright 2005 skyvector.com. All Rights reserved.
You may not use this script for any purpose without permission.
*/

var chart;
var slider;
var zoomer;
var datalayerdiv;
var switcherdiv;
var tile=new Array();
var tilesrc=new Array();
var vwidth;
var vheight;
var orig_vwidth;
var orig_vheight;
var setid=1;
var protoid=1;
var scale=1;
var tilesize=256;
var tiledir='http://sea.skyvector.com/sail/tiles';
var scrolltimeout;
var http_request = false;
var weather=0;
var autoswap=0;
var mapwidth;
var mapheight;

function makeRequester(){
   var http_request;
   if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      http_request = new XMLHttpRequest();
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
     }
   }
   if(!http_request){
      return false;
   }
   return http_request;
}

function getDataLayer (url){
   var http_request=makeRequester();
   http_request.onreadystatechange = function() { rcvDataLayer(http_request); };
   http_request.open('GET',url,true);
   http_request.send(null);
}

function rcvDataLayer(request){
   if (request.readyState == 4) {
      if (request.status == 200) {
         var html = request.responseText;
         var xmldoc= request.responseXML;
         var dataLayer=xmldoc.getElementsByTagName('dataLayer').item(0);
         var switchers=xmldoc.getElementsByTagName('switchers').item(0);
         if(dataLayer){
            var html=dataLayer.firstChild.data;
            if(html){
               if(!datalayerdiv){
                  datalayerdiv=document.getElementById("datalayer");
               } 
               if(!datalayerdiv){
                  datalayerdiv=document.getElementById("datalayer");
               } 
               if(datalayerdiv){
                  datalayerdiv.innerHTML=html;
               }
            }
         }
         if(switchers){
            var html=switchers.firstChild.data;
            if(html){
               if(!switcherdiv){
                  switcherdiv=document.getElementById("switchers");
               } 
               if(!switcherdiv){
                  switcherdiv=document.getElementById("switchers");
               } 
               if(switcherdiv){
                  switcherdiv.innerHTML=html;
               }
            }
         }
      }
      void(request);
   }
}



function makeRequest(url){
   http_request=makeRequester();
   http_request.onreadystatechange = xmlResponse;
   http_request.open('GET',url,true);
   http_request.send(null);
}


function xmlResponse(){
   if (http_request.readyState == 4) {
      if (http_request.status == 200) {
         var xmldoc= http_request.responseXML;
         var func=xmldoc.getElementsByTagName('func').item(0);
         if(func){
            var f=func.firstChild.data;
            if(f) eval(f);
         }
      }else{
          //error with response;
      }
   }
}

function airport(a){
   makeRequest("/perl/airport?i="+escape(a));
}

var scalors=new Array(.5,1,1.5,2,3,4,6,8,12,16,24,36,48,72,96);
var sizes=new Array();


sizes[1]=[215000,210841];
sizes[2]=[211879,28166];
sizes[3]=[8700,10841];
sizes[4]=[11882,8162];
sizes[5]=[11916,8171];
sizes[6]=[11886,8129];
sizes[7]=[11915,8171];
sizes[8]=[10988,8165];
sizes[9]=[11932,8194];
sizes[10]=[11878,8193];
sizes[11]=[11901,8178];
sizes[12]=[11877,8179];
sizes[13]=[11917,8170];
sizes[14]=[11904,8092];
sizes[15]=[11837,8157];
sizes[16]=[11057,8180];
sizes[17]=[11862,8184];
sizes[18]=[10997,8153];
sizes[19]=[11036,8162];
sizes[20]=[10980,8141];
sizes[21]=[11818,8103];
sizes[22]=[11907,8223];
sizes[23]=[11065,8151];
sizes[24]=[11031,8167];
sizes[25]=[11890,8132];
sizes[26]=[11897,8130];
sizes[27]=[11855,8195];
sizes[28]=[11856,8177];
sizes[29]=[11922,8210];
sizes[30]=[11200,8205];
sizes[31]=[11020,8116];
sizes[32]=[11098,8151];
sizes[33]=[10981,8086];
sizes[34]=[11177,8181];
sizes[35]=[11035,8200];
sizes[36]=[11291,8150];
sizes[37]=[11436,8140];
sizes[38]=[6810,5684];
sizes[39]=[11041,8123];
sizes[40]=[10919,8121];
sizes[41]=[11024,8175];
sizes[42]=[11006,4144];
sizes[43]=[11039,8172];
sizes[44]=[11001,8129];
sizes[45]=[11027,8208];
sizes[46]=[10932,8116];
sizes[47]=[10952,8146];
sizes[48]=[10991,8192];
sizes[49]=[10934,8133];
sizes[50]=[10984,8193];
sizes[51]=[11051,8145];
sizes[52]=[11873,4132];
sizes[53]=[10995,4136];
sizes[54]=[10801,4109];
sizes[55]=[11017,8104];
sizes[100]=[7978,3975];
sizes[101]=[5997,5046];
sizes[102]=[7987,5831];
sizes[103]=[6991,5876];
sizes[104]=[6007,5007];
sizes[105]=[4980,4018];
sizes[106]=[5998,5804];
sizes[107]=[4989,3991];
sizes[108]=[7900,5803];
sizes[109]=[6032,5056];
sizes[110]=[5988,4010];
sizes[111]=[5991,5408];
sizes[112]=[4956,4015];
sizes[113]=[7002,4007];
sizes[114]=[10965,3997];
sizes[115]=[5977,4970];
sizes[116]=[6996,5994];
sizes[117]=[4986,3993];
sizes[118]=[5962,4000];
sizes[119]=[7952,4010];
sizes[120]=[4993,4788];
sizes[121]=[5979,5003];
sizes[122]=[4979,3990];
sizes[123]=[11834,4099];
sizes[124]=[4970,3982];
sizes[125]=[6943,4996];
sizes[126]=[7974,4069];
sizes[127]=[6974,4435];
sizes[128]=[5022,5056];
sizes[129]=[5968,5143];
sizes[130]=[7407,3981];
sizes[200]=[9088,6208];
sizes[201]=[7999,6087];
sizes[202]=[7424,6128];
sizes[203]=[9053,4070];
sizes[204]=[8030,4015];
sizes[205]=[7040,5904];
sizes[206]=[5082,2970];
sizes[207]=[7040,6144];
sizes[208]=[9056,6160];
sizes[230]=[9022,4028];

var htiles;
var vtiles;
var hmax;
var vmax;

var posx;
var posy;
var scrollx=0;
var scrolly=0;
var dragstartx=0;
var dragstarty=0;
var dragon=0;
var zoomstartx=0;
var zoomon=0;

function pan(x,y,force){
   posx=Math.floor(x);
   posy=Math.floor(y);
   newscrollx=Math.floor(vwidth/2)-posx;
   newscrolly=Math.floor(vheight/2)-posy;
   if(force || newscrollx != scrollx || newscrolly != scrolly){
      //msg.innerHTML=("scrolled to ("+posx+","+posy+") which is at ("+newscrollx+","+newscrolly+")");
      //msg.innerHTML=(protoid+","+scale+","+posx+","+posy+", scrolltop="+chart.scrollTop );
      scrollx=newscrollx;
      scrolly=newscrolly;
      slider.style.top=scrolly+"px";
      slider.style.left=scrollx+"px";
      var tx=scrollx>0 ? 0 : Math.floor(-1*scrollx/tilesize); //first tile to load
      var ty=scrolly>0 ? 0 : Math.floor(-1*scrolly/tilesize); //first tile to load
      for(var i=ty ; i < ty+vtiles; i++){
         for(var j=tx ; j < tx+htiles; j++){
            var ix=j % htiles; //image x array element
            var iy=i % vtiles; //image y array element
            var itop=i*tilesize; //image top
            var ileft=j*tilesize; //image left
            var filename="";
            if (i >=0 && i < vmax && j >=0 && j < hmax ){
               filename=tiledir + "/tile_" + setid + "_" + protoid + "_" + scale + "_" + j + "_" + i + ".jpg";
            }else{
               filename=tiledir + "/clear.gif";
            }
            if (tilesrc[iy][ix] != filename){
               tile[iy][ix].src = tiledir + "/clear.gif";
               delay=Math.floor((Math.abs(ileft+(.5*tilesize)-posx)+Math.abs(itop+(.5*tilesize)-posy))/20);
               setTimeout("tile["+iy+"]["+ix+"].src=\""+filename+"\"",delay);
   //msg.innerHTML="tile.src="+tilesrc[iy][ix]+" and delay="+delay;
               tilesrc[iy][ix] = filename;
               if (tile[iy][ix].style.top == itop+"px" && tile[iy][ix].style.left == ileft+"px"){
               }else{
                  tile[iy][ix].style.top=itop+"px";
                  tile[iy][ix].style.left=ileft+"px";
               }
            }
         }
      }
      if (scrolltimeout) clearTimeout(scrolltimeout);
      scrolltimeout=setTimeout("reScroll()",600);
   }
}

function reScroll(){
   if (chart){
      if (chart.scrollTop !=0) chart.scrollTop=0;
      if (chart.scrollLeft !=0) chart.scrollLeft=0;
      if(weather || autoswap){
         getDataLayer("/perl/dataLayer?wx="+weather+"&autoswap="+autoswap+"&a="+setid+"-"+protoid+"-"+scale+"-"+posx+"-"+posy+"-"+vwidth+"-"+vheight);
      }
      //getDataLayer("/perl/grid?a="+setid+"-"+protoid+"-"+scale+"-"+posx+"-"+posy+"&h="+vheight+"&w="+vwidth);
      document.cookie="StartLoc="+setid+"-"+protoid+"-"+scale+"-"+posx+"-"+posy+"; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/;";
   }
}

function check_weather(check){
   if (check){
      weather=1;
      reScroll();
   }else{
      weather=0;
      if(datalayerdiv){
         datalayerdiv.innerHTML='';
      }
      reScroll();
   }
}
function check_autoswap(check){
   if (check){
      autoswap=1;
      reScroll();
   }else{
      autoswap=0;
      if(datalayerdiv){
         datalayerdiv.innerHTML='';
      }
      reScroll();
   }
}

function zoom(z){
   scale=parseInt(scale);
   if (z=="OUT"){
      if (scale < 10){
         posx=Math.floor(posx*scalors[scale]/scalors[(scale+1)]);
         posy=Math.floor(posy*scalors[scale]/scalors[(scale+1)]);
         scale++;
         initMap();
      }
   }else if (z=="IN"){
      if (scale > 1){
         posx=Math.floor(posx*scalors[scale]/scalors[(scale-1)]);
         posy=Math.floor(posy*scalors[scale]/scalors[(scale-1)]);
         scale--;
         initMap();
      }
   }else{
      if (z >= 1 && z <= 10){
         posx=Math.floor(posx*scalors[scale]/scalors[z]);
         posy=Math.floor(posy*scalors[scale]/scalors[z]);
         scale=z;
         initMap();
      }
   }
}

function initMap(p_chart,p_set,p_protoid,p_scale,p_x,p_y,p_mapwidth,p_mapheight){
   if(p_chart){
      chart=document.getElementById(p_chart);
      if (!chart){return false};
      chart.style.position='relative';
      chart.style.border='1px solid #808080';
      chart.style.backgroundColor='#D5E6E6';
      chart.style.overflow='hidden';
   }else{
      if (!chart){return false};
   }
   if(p_set){
      setid=p_set;
   }
   if(p_scale){
      scale=p_scale;
   }
   if(p_protoid){
      protoid=p_protoid;
   }
   if(p_x){
      posx=p_x;
   }
   if(p_y){
      posy=p_y;
   }
   if(p_mapwidth){
      mapwidth=p_mapwidth;
   }
   if(p_mapheight){
      mapheight=p_mapheight;
   }
   if(!mapwidth){
      if(sizes[protoid]){
         mapwidth=sizes[protoid][0];
         mapheight=sizes[protoid][1];
      }else{
         mapwidth=12000;
         mapheight=12000;
      }
   }
   if(!posx || posx>(mapwidth/scalors[scale])){
      posx=Math.floor((mapwidth/2)/scalors[scale]);
   }
   if(!posy || posy>(mapheight/scalors[scale])){
      posy=Math.floor((mapheight/2)/scalors[scale]);
   }
   if (!orig_vwidth) orig_vwidth=chart.clientWidth;
   if (!orig_vheight) orig_vheight=chart.clientHeight;
   if (!orig_vwidth) orig_vwidth=chart.style.pixelWidth;
   if (!orig_vheight) orig_vheight=chart.style.pixelHeight;
   
   vwidth=chart.clientWidth;
   vheight=chart.clientHeight;
   if (!vwidth) vwidth=chart.style.pixelWidth;
   if (!vheight) vheight=chart.style.pixelHeight;
   htiles=Math.ceil(vwidth/tilesize)+1;
   vtiles=Math.ceil(vheight/tilesize)+1;

   hmax=Math.ceil((mapwidth/scalors[scale])/tilesize);
   vmax=Math.ceil((mapheight/scalors[scale])/tilesize);
   var zoomerx=vwidth-140;
   var zoomery=vheight-23;
   var html="<div style=\"position: absolute; z-index: 1; top: " + zoomery + "px; left: " + zoomerx + "px;\"><img width=\"134\" height=\"17\" border=\"0\" usemap=\"#zoomermap\" src=\"/images/zc.png\"/><map name=\"zoomermap\"> <area title=\"Zoom Out\" alt=\"Zoom Out\" shape=\"rect\" coords=\"0,0,19,16\" href=\"javascript:;\" onclick=\"zoom('OUT'); return false\"/> <area title=\"Zoom In\" alt=\"Zoom In\" shape=\"rect\" coords=\"114,0,133,16\" href=\"javascript:;\" onclick=\"zoom('IN'); return false\"/> <area shape=\"rect\" coords=\"20,0,34,16\" href=\"javascript:;\" onclick=\"zoom(10); return false;\"/> <area shape=\"rect\" coords=\"35,0,42,16\" href=\"javascript:;\" onclick=\"zoom(9); return false;\"/> <area shape=\"rect\" coords=\"43,0,50,16\" href=\"javascript:;\" onclick=\"zoom(8); return false;\"/> <area shape=\"rect\" coords=\"51,0,58,16\" href=\"javascript:;\" onclick=\"zoom(7); return false;\"/> <area shape=\"rect\" coords=\"59,0,66,16\" href=\"javascript:;\" onclick=\"zoom(6); return false;\"/> <area shape=\"rect\" coords=\"67,0,74,16\" href=\"javascript:;\" onclick=\"zoom(5); return false;\"/> <area shape=\"rect\" coords=\"75,0,82,16\" href=\"javascript:;\" onclick=\"zoom(4); return false;\"/> <area shape=\"rect\" coords=\"83,0,90,16\" href=\"javascript:;\" onclick=\"zoom(3); return false;\"/> <area shape=\"rect\" coords=\"91,0,98,16\" href=\"javascript:;\" onclick=\"zoom(2); return false;\"/> <area shape=\"rect\" coords=\"99,0,112,16\" href=\"javascript:;\" onclick=\"zoom(1); return false;\"/> </map> </div> <img id=\"zoomer\" border=\"0\" width=\"10\" height=\"21\" src=\"/images/zs.png\" style=\"position: absolute; z-index: 2; top: " + (zoomery-2) + "px; left: " + (zoomerx+26+((10-scale)*8)) + "px;\"/> ";
   var centerx=Math.floor(vwidth/2)-6;
   var centery=Math.floor(vheight/2)-6;
   html += "<img style=\"z-index: 1; position: absolute; top: " + centery + "px; left: " + centerx + "px;\" src=\"/images/crosshairs.gif\" width=\"11\" height=\"11\" border=\"0\"/>";
   html += "<div id=\"switchers\" style=\"top: 0px; left: 0px; height: 30px; width: " + vwidth + "px; z-index: 1; position: absolute; text-align: right\"></div>";
   html += "<div id=\"slider\" style=\"position: absolute; z-index: 0; width: 20px; height: 20px; top: -10px; left: -20px;\">";
   for (var i=0; i < vtiles; i++){
      for (var j=0; j < htiles; j++){
         html += "<img style=\"position: absolute; z-index: 0; top: "+i*tilesize+"px; left: "+j*tilesize+"px;\" id=\"img_"+j+"_"+i+"\" border=\"0\" width=\"" + tilesize + "\" height=\"" + tilesize + "\" src=\""+tiledir + "/clear.gif\"/>";
      }
   }
   html += "<div id=\"datalayer\" style=\"position: absolute; z-index: 1;\"><img src=\""+tiledir + "/clear.gif\"/></div>";
   html += "</div>";
   chart.innerHTML=html;
   if(navigator.userAgent.indexOf("MSIE")>0){
      chart.style.width=orig_vwidth;
      chart.style.height=orig_vheight;
   }
   slider=document.getElementById("slider");   
   datalayerdiv=document.getElementById("datalayer");
   switcherdiv=document.getElementById("switchers");
   for (var i=0; i < vtiles; i++){
      tile[i]=new Array();
      tilesrc[i]=new Array();
      for (var j=0; j < htiles; j++){
         tile[i][j]=document.getElementById("img_"+j+"_"+i);
         tilesrc[i][j]='x';
         if(tile[i][j]){
         }else{ alert("tile img element ("+j+","+i+")not found")}
      }
   } 
   pan(posx,posy,1);
   chart.onmousedown=mdown;
   chart.onmouseup=mup;
   //chart.onmouseout=mup;
   chart.onmousemove=mmove;
   chart.ondblclick=mdc;
   chart.ondrag= function (){return false;};
   chart.ondragend= function (){return false;};
   chart.ondragenter= function (){return false;};
   chart.ondragleave= function (){return false;};
   chart.ondragover= function (){return false;};
   chart.ondragstart= function (){return false;};
   zoomer=document.getElementById("zoomer");
   if (zoomer){
      zoomer.minleft=(zoomerx+26);
      zoomer.maxleft=(zoomerx+26+(9*8));
      zoomer.onmousedown=zmdown;
      zoomer.onmouseup=mup;
      zoomer.ondrag= function (){return false;};
      zoomer.ondragend= function (){return false;};
      zoomer.ondragenter= function (){return false;};
      zoomer.ondragleave= function (){return false;};
      zoomer.ondragover= function (){return false;};
      zoomer.ondragstart= function (){return false;};
   }
}
function zmdown(e){
   if (!e){
      e=window.event;
   }
   zoomon=1;
}
function mup(e){
   if (!e){
      e=window.event;
   }
   dragon=0;
   if(zoomon && zoomer){
      zoomon=0;
      var left=e.clientX-chart.offsetLeft-4;
      if (left < zoomer.minleft) left=zoomer.minleft;
      if (left > zoomer.maxleft) left=zoomer.maxleft;
      
      var a=(left - zoomer.minleft);
      var newscale=Math.round(10-(a/8));
      if (newscale != scale){
         setTimeout("zoom("+newscale+")",90);
      }
   }
   return false;
}
   
function mdown(e){
   if(!e){
      e=window.event;
   }
   dragon=1;
   dragstartx=posx+e.clientX-chart.offsetLeft;
   dragstarty=posy+e.clientY-chart.offsetTop; 
   return false;
}

function mmove(e) {
   if(!e){
      e=window.event;
   }
   var x=e.clientX-chart.offsetLeft;
   var y=e.clientY-chart.offsetTop;
   if (zoomon==1){
      if(zoomer){
         var left=x-4;
         if (left < zoomer.minleft) left=zoomer.minleft;
         if (left > zoomer.maxleft) left=zoomer.maxleft;
         zoomer.style.left=left;
      } 
   }else if (dragon==1){
      pan(dragstartx-x,dragstarty-y);
   }
   return false;
}
function mdc(e){
   if(!e){
      e=window.event;
   }
   var x=e.clientX-chart.offsetLeft;
   var y=e.clientY-chart.offsetTop;
   var xp=Math.floor(posx-((vwidth/2)-x));
   var yp=Math.floor(posy-((vheight/2)-y));
   pan(xp,yp);
   return false;
}
function setProto(p){
   protoid=p;
   initMap();
}
