var currentTilt=0;
var currentFoV=80;
var housenumberlistboxtxt;
var reloadTimer=null;
var sendViewTimer=null;
var compassimages=new Array();
var lastviewchange=0;
var lastviewpan=0;
var prevdocwidth=-1;
var prevdocheight=-1;


function navigateToFile(file)
{
  location.replace(file);
}

function getVar(name)
{
  var s = document.location.search;
  return getVarFromSearchString(s,name);
}

function getVarFromUrl(url,name)
{
  var comps=url.split("?");
  if(comps.length < 2) return "";
  var s = "?"+comps[1];
  comps=s.split("#");
  s=comps[0];
  return getVarFromSearchString(s,name);
}

function getVarFromSearchString(s,name)
{
  s = "&"+s.substr(1,s.length-1);
  var p=s.indexOf("&"+name+"=");
  if(p >= 0)
  {
    s=s.substr(p+name.length+2,s.length-p-name.length-2);
    var pp=s.indexOf("&");
    if(pp >= 0)
    {
      s=s.substr(0,pp);
    }
    return(urlUnescape(s));
  }
  return "";
}

function urlUnescape(t)
{
  var tt="";
  var i;
  for (i=0; i<=t.length;i++)
  {
    var c=t.charAt(i);
    if(c == "+") c=" ";
    tt=tt+c;
  }
  return(unescape(tt));
}

function fillListBox(listbox,texts,firsttxt)
{
  listbox.options[0]=new Option(firsttxt);
  for(var i=0;i<=texts.length;i++)
  {
    listbox.options[i+1]=new Option(texts[i]);
  }
  for(var i=listbox.options.length;i>texts.length;i--)
  {
    listbox.options[i]=null;
  }
  listbox.selectedIndex=0;
}

function emptyListBox(listbox)
{
  for(var i=listbox.options.length;i>=0;i--)
  {
    listbox.options[i]=null;
  }
  listbox.selectedIndex=0;
}

function htmlEncode(s)
{
  // to do
  return s;
}

function createStreetListbox(streettxt,numbertxt)
{
  var tags="";
  housenumberlistboxtxt=numbertxt;

  tags += "<select name=streets onChange=\"streetChanged(this.selectedIndex,this.form.housenumbers);\"><option selected>"+htmlEncode(streettxt)+"</option>";
  for(var i=0;i<streets.length;i++)
  {
    tags += "<option>"+htmlEncode(streets[i])+"</option>";
  }
  tags += "</select>";

  tags += "<select name=housenumbers onChange=\"housenumberChanged(this.form.streets.selectedIndex,this.selectedIndex);\"><option>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</option>";
  tags += "</select>";
  return tags;
}

function streetChanged(streetno,housenumberslistbox)
{
  if(streetno > 0)
  {
    fillListBox(housenumberslistbox,housenumbers[streetno-1],housenumberlistboxtxt);
  }
  else
  {
    emptyListBox(housenumberslistbox);
  }
}

function housenumberChanged(streetno,housenumberno)
{
  if(streetno < 1) return;
  if(housenumberno< 1) return;
  var urllist=urls[streetno-1];
  var url=urllist[housenumberno-1];
  if( (window.opener) && (!window.opener.closed) )
  {
    if( (window.opener.bodyLoaded) && (extractFileNameFromLocation(window.opener.location.href) == extractFileNameFromLocation(url)))
    {
      var newpano=getVarFromUrl(url,"pano")
      var newangle=0;
      var hasangle=false;
      if(getVarFromUrl(url,"angle") != "")
      {
        hasangle=true;
        newangle=getVarFromUrl(url,"angle");
      }
      window.opener.openPanoramaFile(newpano,hasangle,newangle);      
    }
    else
    {
//alert(url);
      window.opener.location.replace(url);
    }
  }
  else
  {
    window.opener=null;
    window.opener=window.open(url,"citytour_main");
  }
}

function extractFileNameFromLocation(p)
{
  var comps=p.split("#");
  p=comps[0];
  comps=p.split("?");
  p=comps[0];
  comps=p.split("/");
  if(comps.length < 1) return p;
  var filename;
  if(comps.length > 1)
  {
    filename=comps[comps.length-2]+"/"+comps[comps.length-1];
  }
  else
  {
    filename=comps[comps.length-1];
  }
  return filename;
}

function getScreenWidth()
{
  var w=800;
  if(screen)
  {
    if(screen.width)
    {
      w=screen.width;
    }
  }
  return w;
}

function getScreenHeight()
{
  var w=600;
  if(screen)
  {
    if(screen.height)
    {
      w=screen.height;
    }
  }
  return w;
}

function openPanoramaFile(filename,setangle,angle)
{
  var i=findPanorama(filename);
  if(i >= 0)
  {
    openPanoramaNum(i,setangle,angle)
  }
}

function openPanoramaNum(index,setangle,angle)
{
  if(!setangle) setangle=false;  // un-null;
  angle -= 0;
  var filename=panolist[index];
  var url;  
  var p=filename.lastIndexOf(".");
  url="../panohtml/"+filename.substr(0,p)+".html?setangle="+(setangle? 1:0)+"&angle="+angle;
  var target=multipleviewers? "_blank":"citytour_viewer";
  var popupwin = window.open(url,target,"fullscreen=0,toolbar=0,location=0,directories=0,status=1,menubar=0,scrollbars=0,resizable=1,width="+viewerwidth+",height="+viewerheight);
  if(!popupwin)
  {
    alert("Failed to open a new window to show the MaxiView. If your webbrowser has a 'popup blocker', please disable it.");
  }
}

function mapBodyOnLoad()
{
  bodyLoaded=true;
  if(getVar("pano") != "")
  {
    var newpano=getVar("pano");
    var newangle=0;
    var hasangle=false;
    if(getVar("angle") != "")
    {
      hasangle=true;
      newangle=getVar("angle");
    }
    var cmd="openPanoramaFile(\""+newpano+"\","+hasangle+","+newangle+");";
    setTimeout(cmd,100);
  }
  checkAllCompassesAlive();
}

function mapBodyOnUnload()
{
}

function findPanorama(filename)
{
  for(var i=0;i<panolist.length;i++)
  {
    if(panolist[i] == filename)
    {
      return i;
    }
  }
  return -1;
}

function viewerIsClosed(w)
{
  var img=getViewersCompass(w);
  hideCompass(img);
}

function getViewersCompass(w)
{
  return w.compassimg;
}

// called by the viewer window
function setCompass(filename,angle,w)
{
  var img=getViewersCompass(w);
//  try
//  {
    if(!bodyLoaded) return;
    if(filename != w.currentCompassFile)
    {
      if(panolist)
      {
        w.currentCompassFile=filename;
        var currentCompassFileIsOnMap=false;
        for(var i=0; i<panolist.length; i++)
        {
          if(panolist[i] == filename)
          {
            currentCompassFileIsOnMap=true;
            if(!img)
            {
              img=createCompass(w);
            }
            moveCompass(img,compassx[i],compassy[i]);
            showCompass(img);
            break;
          }
        }
        if(!currentCompassFileIsOnMap)
        {
          hideCompass(img);
        }
      }
    }
    rotateCompass(img,angle);
//  }
//  catch(e)
//  {
//    w.compassimg=null;
//  }
}

function showCompass(img)
{
  if(!img) return;
  img.style.visibility="visible";
}

function hideCompass(img)
{
  if(!img) return;
  img.style.visibility="hidden";
}

function moveCompass(img,x,y)
{
  if(!img) return;
  img.style.left=x+"px";
  img.style.top=y+"px";
}

function rotateCompass(img,angle)
{
  if(!img) return;
  while(angle < 0) angle += 360;
  angle=Math.floor((angle+10)/20)*20;
  while(angle >= 360) angle -= 360;
  if(angle == 0) angle="0";
  if(isNaN(angle))
  {
    hideCompass(img);
  }
  else
  {
    var imagefile="../images/compass"+angle+".gif";
    img.src=imagefile;
    if(angle != img.lastangle)
    {
      img.src=imagefile;
      img.lastangle=angle;
    }
    showCompass(img);
  }
}

function createCompass(w)
{
  var img=document.createElement("IMG");
  img.style.position="absolute";
  img.style.zIndex=100;
  hideCompass(img);
  document.getElementById("map").appendChild(img);
  w.compassimg=img;
  img.viewerwindow=w;
  compassimages[compassimages.length]=img;
  return img;
}

function checkAllCompassesAlive()
{
  for(var i=0; i < compassimages.length; i++)
  {
    var compassimg=compassimages[i];
    if(compassimg.style.visibility != "hidden")
    {
      if(compassimg.viewerwindow.closed)
      {
        hideCompass(compassimg);
      }
    }
  }
  setTimeout("checkAllCompassesAlive()",1000);
}

function getViewer()
{
  if(panoviewertype == 0)
  {
    return document.getElementById("ptviewer");
  }
  else
  {
    return document.getElementById("maxiviewer");
  }
}

function panoWindowResized()
{
  if(panoviewertype == 0)
  {
    if(reloadTimer != null)
    {
      clearTimeout(reloadTimer);
    }
    reloadTimer=setTimeout("reloadPTViewer()",800);
  }
}

function isWindowSizeChanged()
{
  var changed=(document.body.offsetWidth != prevdocwidth)
            ||(document.body.offsetHeight != prevdocheight);
  prevdocwidth=document.body.offsetWidth;
  prevdocheight=document.body.offsetHeight;
  return changed;
}

function reloadPTViewer()
{
  reloadTimer=null;
  var viewer=getViewer();
  var isautopanning=viewer.getAutoPan();
  viewer.stop();
  viewer.start();
  if(isautopanning)
  {
    viewer.startAutoPan(autopan, 0.0, 1.0);
  }
}

function getPan()
{
  var pan;
  if(panoviewertype == 0)
  {
    pan=getViewer().pan();
    pan += northangle;
  }
  else
  {
    pan=getViewer().pan;
  }
  return pan;
}

function setPanWithRetry(pan)
{
  var success=setPan(pan);
  if(!success)
  {
    setTimeout("setPanWithRetry("+pan+")",100);
  }
}


function setPan(pan)
{
  var success=true;
  var pan;
  if(panoviewertype == 0)
  {
    var panrelative=pan-northangle;
    getViewer().stopAutoPan();
    getViewer().gotoView(panrelative,getViewer().tilt(), getViewer().fov());
    var panset=getViewer().pan();
    var dif=panset-panrelative;
    while(dif > 180.0) dif -= 360.0;
    while(dif < -180.0) dif += 360.0;
    dif=Math.abs(dif);
    if(dif > 1.0)
    {
      success=false;
    }
  }
  else
  {
    getViewer().autorotate=false;
    getViewer().pan=pan;
  }
  return success;
}

function onSendViewTimer()
{
  sendViewTimer=window.setTimeout("onSendViewTimer();",100);
  sendView();
  if(autoclose_seconds > 0)
  {
    var date=new Date();
    var nowms=date.valueOf();
    var pan=getPan();
    var autopanning=false;
    if(panoviewertype == 0)
    {
      autopanning=getViewer().getAutoPan();
    }
    else
    {
      autopanning=getViewer().autorotate;
    }
    var idle=(pan == lastviewpan) || autopanning;
    lastviewpan=pan;
    if( (lastviewchange == 0) || (!idle) )
    {
      lastviewchange=nowms;
    }
    var secondsidle=(nowms - lastviewchange)/1000;
    if(secondsidle >= autoclose_seconds)
    {
      window.close();
    }
  }
}

function clearSendViewTimer()
{
  if(sendViewTimer) window.clearTimeout(sendViewTimer);
  sendViewTimer=null;
}

function panoBodyOnLoad()
{
  window.focus();
  if(panoviewertype == 0)
  {
    initPTViewer();
  }
  else
  {
    initMaxiViewer();
  }
  onSendViewTimer();
  window.focus();
  isWindowSizeChanged();
}

function initPTViewer()
{
  getViewer().showHS();
  processParameters();
}

function initMaxiViewer()
{
  getViewer().tilt=tiltinit;
  getViewer().minfov=fovmin;
  getViewer().maxfov=fovmax;
  getViewer().fov=fovinit;
  getViewer().mintilt=tiltmin;
  getViewer().maxtilt=tiltmax;
  getViewer().autorotate=(autopan > 0);
  getViewer().autorotatespeed=autopan;
//  getViewer().file=panofilefull;
  getViewer().file=expandRelativeUrl(panofilefull);
  processParameters();
  addhotspots();
}

function expandRelativeUrl(relurl)
{
  if(relurl.substr(0,1) == "/")
  {
    alert("ToDo");
  }
  else
  {
    var curdir=String(window.location);
    var p=curdir.lastIndexOf("/");
    if(p >= 0)
    {
      curdir=curdir.substr(0,p+1);
      while(relurl.substr(0,3)=="../")
      {
        relurl=relurl.substr(3,relurl.length-3);
        curdir=curdir.substr(0,curdir.length-1);
        var pp=curdir.lastIndexOf("/");
        if(pp > 0)
        {
          curdir=curdir.substr(0,pp+1);
        }
      }
      var url=curdir + relurl;
      return url;
    }
    else
    {
      alert("ToDo");
    }
  }
}



function panoBodyOnUnLoad()
{
  var callingwindow=window.opener;
  if(callingwindow)
  {
    if(!callingwindow.closed)
    {
      if(callingwindow.bodyLoaded)
      {
        callingwindow.viewerIsClosed(window);
      }
    }  
  }
}

function processParameters()
{
   var setangle=false;
   var newangle=0;
   if(getVar("setangle") != "")
   {
     setangle=getVar("setangle")-0;
     setangle=(setangle != 0);
   }
   if(setangle)
   {
     newangle=getVar("angle")-0;
     setPanWithRetry(newangle);
   }
   else
   {
/*
     if(autopan != 0)
     {
       if(panoviewertype == 0)
       {
         getViewer().startAutoPan(autopan, 0.0, 1.0 );
       }
     }
*/
   }
}

// send the view to the calling window
function sendView()
{
  var callingwindow=window.opener;
  if(callingwindow)
  {
    if(!callingwindow.closed)
    {
      var currentpan=getPan()+0;
      if(!isNaN(currentpan))
      {
          if(callingwindow.bodyLoaded)
          {
            callingwindow.setCompass(currentpano,currentpan,window);
          }
      }
    }
  }
}

function addhotspots()
{
  if(hotspots)
  {
    var numhotspots=hotspots.length/2;
    for(var i=0; i < numhotspots; i++)
    {
      var pan=hotspots[2*i];
      var filename=hotspots[2*i+1];
      var href="javascript:hotspotclicked('"+filename+"')";
      if(panoviewertype == 0)
      {
      }
      else
      {
        getViewer().AddHotspot(pan,0,href);
      }
    }
  }
}

function hotspotclicked(href)
{
  panoBodyOnUnLoad();
  href += "?setangle=1&angle="+getPan();
  window.location=href;
}

function DoAutorotationStartl() {
        getViewer().startAutoPan( -0.5, 0.0, 1.0 );
}
function DoAutorotationStartu() {
        getViewer().startAutoPan( 0.0, 0.5, 1.0 );
}
function DoAutorotationStartd() {
        getViewer().startAutoPan( 0.0, -0.5, 1.0 );
}
function DoAutorotationStartr() {
        getViewer().startAutoPan( 0.5, 0.0, 1.0 );
}

function DoAutorotationStop() {
        getViewer().stopAutoPan();
}
function DoZoomIn() {
	getViewer().startAutoPan( 0.0, 0.0, 1.0/1.03 );
}
function DoZoomOut() {
	getViewer().startAutoPan( 0.0, 0.0, 1.03 );
}

function DoShowHideHotspots() {
	getViewer().toggleHS();
}
function DoReset() {
	getViewer().gotoView( 0, 0, 100 );
}
function DisplayPan() {
	status = getViewer().pan().toString() ;
}
function DisplayTilt() {
	status = getViewer().tilt().toString() ;
}
function DisplayFov() {
	status = getViewer().fov().toString() ;
}

function ptviewerInits()
{
}
