

var id=-1;
var lo=-2.7,hi=-0.3;
var passbandobjstart=0;
var passbandobjwidth=0;
var mode=0;


var band=0;
var centerfreq=band_centerfreq[band];
var waterslowness=4;

var khzperpixel=band_samplerate[band]/1024;

function ajaxFunction()
{
  document.soundapplet.setparam(
      "f="+freq
     +"&band="+band
     +"&lo="+lo
     +"&hi="+hi
     +"&mode="+mode
     +"&name="+encodeURIComponent(document.usernameform.username.value) 
     );
}

var freq=3610;
var scaleobj;
var scaleobjs = new Array();
var scaleimgs = new Array();
var passbandobj;
var edgelowerobj;
var edgeupperobj;
var carrierobj;

var band_effcenterfreq = new Array();
var band_effsamplerate = new Array();

function iscw()
{
   return hi-lo < 1.0;
}

function nominalfreq()
{
   if (iscw()) return freq+(hi+lo)/2;
   return freq;
}


function dosetfreq(f)
{
   freq=f;
   ajaxFunction();
   var x=scaleobj.offsetLeft+(f-centerfreq)/khzperpixel+512;
   var y=scaleobj.offsetTop+15;
   passbandobj.style.top=y+"px";
   edgelowerobj.style.top=y+"px";
   edgeupperobj.style.top=y+"px";
   carrierobj.style.top=y+"px";
   carrierobj.style.left=x+"px";
   x=x+passbandobjstart;
   passbandobj.style.left=x+"px";
   edgelowerobj.style.left=(x-11)+"px";
   edgeupperobj.style.left=(x+passbandobjwidth)+"px";
}


function zoomchange(id,zoom,start)
{
   band_effsamplerate[id] = band_samplerate[id]/(1<<zoom);
   band_effcenterfreq[id] = band_centerfreq[id] - band_samplerate[id]/2 + (start*(band_samplerate[id]/(1<<band_maxzoom[id]))/1024) + band_effsamplerate[id]/2;
   scaleimgs[id].src = band_scaleimgz[id][zoom];
   scaleimgs[id].style.left = - start/(1<<(band_maxzoom[id]-zoom));
   if (id==band) {
      khzperpixel = band_effsamplerate[band]/1024;
      centerfreq = band_effcenterfreq[band];
      updbw();
   }
}

function setfreq(f)
{
   dosetfreq(f);
   var nomfreq=nominalfreq();
   if (freq.toFixed) document.freqform.frequency.value=nomfreq.toFixed(2)+" kHz";
   else document.freqform.frequency.value=nomfreq+" kHz";
}

function setfreqif(str)
// called when frequency is entered textually
{
   f=parseFloat(str);
   if (f<=0) return;
   if (iscw()) f-=(hi+lo)/2;
   if (f>centerfreq-band_samplerate[band]/2-4 && f<centerfreq+band_samplerate[band]/2+4) {
      dosetfreq(f);
      return;
   }
   for (i=0;i<nbands;i++) {
      c=band_centerfreq[i];
      w=band_samplerate[i]/2+4;
      if (f>c-w && f<c+w) {
         band_vfo[i]=f;
         setband(i);
         document.freqform.frequency.value=str;
         return;
      } 
   }
}


function setmode(m)
{
   if (m=="AM") mode=1;
   else mode=0;
}


function getMouseXY(e)
{
   e = e || window.event;
   if (e.pageX || e.pageY) return {x:e.pageX, y:e.pageY};
   return {
     x:e.clientX + document.body.scrollLeft - document.body.clientLeft,
     y:e.clientY + document.body.scrollTop  - document.body.clientTop
   };
// from: http://www.webreference.com/programming/javascript/mk/column2/
}

var dragging=false;
var dragorigX;
var dragorigval;

function useMouseXY(e)
{
   var pos=getMouseXY(e);
//   setfreq((pos.x-scaleobj.offsetLeft-512)*khzperpixel+centerfreq)
   setfreq((pos.x-scaleobj.offsetLeft-512)*khzperpixel+centerfreq-(hi+lo)/2);
}

function useMouseXYloweredge(e)
{
   var pos=getMouseXY(e);
   lo=dragorigval+(pos.x-dragorigX)*khzperpixel;
   updbw();
}

function useMouseXYupperedge(e)
{
   var pos=getMouseXY(e);
   hi=dragorigval+(pos.x-dragorigX)*khzperpixel;
   updbw();
}

function useMouseXYpassband(e)
{
   var pos=getMouseXY(e);
   setfreq(dragorigval+(pos.x-dragorigX)*khzperpixel);
}


function mouseup(e)
{
   if (dragging) {
      dragging=false;
      document.onmousemove(e);
      document.onmousemove = null;
   }
}

function imgmousedown(ev,bb)
{
   dragging=true;
   document.onmousemove = useMouseXY;
   if (band!=bb) {
      setband(bb);
      useMouseXY(ev);
   }
   if (document.waterfallform.freezeunused.checked) waterfallspeed(waterslowness);
}

function mousedownlower(ev)
{
   var pos=getMouseXY(ev);
   dragging=true;
   document.onmousemove = useMouseXYloweredge;
   dragorigX=pos.x;
   dragorigval=lo;
}

function mousedownupper(ev)
{
   var pos=getMouseXY(ev);
   dragging=true;
   document.onmousemove = useMouseXYupperedge;
   dragorigX=pos.x;
   dragorigval=hi;
}

function mousedownpassband(ev)
{
   var pos=getMouseXY(ev);
   dragging=true;
   document.onmousemove = useMouseXYpassband;
   dragorigX=pos.x;
   dragorigval=freq;
}

function docmousedown(ev)
{
   if (!ev && event.srcElement) {
      // for IE:
      var fobj = event.srcElement;
      if (fobj.className == "scale" || fobj.className=="scaleabs") {
         fobj = ev.target;
         // bovenstaande geeft onder IE een foutmelding; dat (b)lijkt de enige manier te zijn om de default-actie van de muisklik te onderdrukken :-(
         return false;
      }
      return true;
   }
   // for FF etc.:
   var fobj = ev.target;
   if (fobj.className == "scale" || fobj.className=="scaleabs") return false;
   return true;
}


document.onmouseup = mouseup;
document.onmousedown = docmousedown;

var wfcnt=0;


function setband(b)
{
   if (b<0 || b>=nbands) return;
   band_vfo[band]=freq;

   if ( (centerfreq>9000 && band_centerfreq[b]<=9000) || (band_centerfreq[b]>9000 && centerfreq<=9000)) {
      var tmp=hi;
      hi=-lo;
      lo=-tmp;
   }

   band=b;
   scaleobj = scaleobjs[b];
   centerfreq = band_effcenterfreq[band];
   khzperpixel = band_effsamplerate[band]/1024;
   updbw();
   setfreq(band_vfo[band]);
   waterfallspeed(waterslowness);
}

var interval_updatesmeter;
var interval_ajax3;

function test_serverbusy()
{
   id=document.soundapplet.getid();
   if (id==0) {
      document.body.innerHTML="Sorry, the WebSDR server is too busy right now; please try again later.\n";
      clearInterval(interval_updatesmeter);
      clearInterval(interval_ajax3);
   }
}

var smeterobj;
var numericalsmeterobj;
var smeterpeakobj;
var numericalsmeterpeakobj;
var smeterpeak=0;
var smeterpeaktimer=2;

var allloadeddone=false;

function updatesmeter()
{
   if (!allloadeddone) {
      if (!document.soundapplet) return;
      if (!document.soundapplet.isActive()) return;
      allloadeddone=true;
      allloaded();
   }

   var s=document.soundapplet.smeter;
   numericalsmeterobj.innerHTML = (s/100.0-127).toFixed(1);
   if (s>=0) smeterobj.style.width= s*0.0191667+"px";
   else smeterobj.style.width="0px";
   smeterpeaktimer--;
   if ((smeterpeak<s-0.1) || (smeterpeaktimer<=0)) {
      smeterpeak=s;
      smeterpeaktimer=10;
      if (smeterpeak>=0) smeterpeakobj.style.width= smeterpeak*0.0191667 +"px";
      else smeterpeakobj.style.width="0px";
      numericalsmeterpeakobj.innerHTML = (smeterpeak/100.0-127).toFixed(1);
   }

   if (id<0) test_serverbusy();
}


// var chseq=0;

function ajaxFunction3()
{
  var xmlHttp;
  try { xmlHttp=new XMLHttpRequest(); }
    catch (e) { try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (e) { alert("Your browser does not support AJAX!"); return false; } } }
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      if (xmlHttp.responseText!="") eval(xmlHttp.responseText);
      }
    }
  var url="/~~othersj?chseq="+chseq;
  xmlHttp.open("GET",url,true);
  xmlHttp.send(null);
}


function sendchat()
{
  var xmlHttp;
  try { xmlHttp=new XMLHttpRequest(); }
    catch (e) { try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (e) { alert("Your browser does not support AJAX!"); return false; } } }
  var url="/~~chat";
  url=url+"?name="+encodeURIComponent(document.usernameform.username.value)+"&msg="+encodeURIComponent(document.chatform.chat.value);
  xmlHttp.open("GET",url,true);
  xmlHttp.send(null);
  document.chatform.chat.value="";
  return false;
}

function sendlogclear()
{
  document.logform.comment.value="";
}

function sendlog()
{
  var xmlHttp;
  try { xmlHttp=new XMLHttpRequest(); }
    catch (e) { try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (e) { try { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (e) { alert("Your browser does not support AJAX!"); return false; } } }
  var url="/~~loginsert";
  url=url
     +"?name="+encodeURIComponent(document.usernameform.username.value)
     +"&freq="+nominalfreq()
     +"&call="+encodeURIComponent(document.logform.call.value)
     +"&comment="+encodeURIComponent(document.logform.comment.value)
     ;
  xmlHttp.open("GET",url,true);
  xmlHttp.send(null);
  document.logform.call.value="";
  document.logform.comment.value="";
  xmlHttp.onreadystatechange=function()
    {
    if(xmlHttp.readyState==4)
      {
      document.logform.comment.value=xmlHttp.responseText;
      }
    }
  setTimeout("document.logform.comment.value=''",1000);
  return false;
}




function updbw()
{
   if (lo>hi) {
      if (document.onmousemove == useMouseXYloweredge) lo=hi;
      else hi=lo;
   }
   if (lo<-3.9) lo=-3.9;
   if (hi>3.9) hi=3.9;
   var x6=document.getElementById('numericalbandwidth6');
   var x60=document.getElementById('numericalbandwidth60');
   x6.innerHTML=(hi-lo+0.091).toFixed(2);
   passbandobjstart=Math.round((lo-0.045)/khzperpixel);
   passbandobjwidth=Math.round((hi+0.045)/khzperpixel)-passbandobjstart;
   passbandobj.style.width=passbandobjwidth+"px";
   x60.innerHTML=(hi-lo+0.551).toFixed(2);
   setfreq(freq);
}


// from http://www.quirksmode.org/js/cookies.html
function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}


function waterfallspeed(sp)
{
   if (document.waterfallform.freezeunused.checked) {
      for (i=0;i<nbands;i++)
         if (i==band) document["waterfallapplet"+i].setslow(sp);
         else document["waterfallapplet"+i].setslow(100);
   } else {
      for (i=0;i<nbands;i++)
         document["waterfallapplet"+i].setslow(sp);
   }
   waterslowness=sp;
}

function waterfallheight(si)
{
   for (i=0;i<nbands;i++) {
      document["waterfallapplet"+i].height=si;
      document["waterfallapplet"+i].setSize(1024,si);
      document["waterfallapplet"+i].setheight(si);
   }

   var y=scaleobj.offsetTop+15;
   passbandobj.style.top=y;
   edgelowerobj.style.top=y;
   edgeupperobj.style.top=y;
}

function waterfallmode(m)
{
   for (i=0;i<nbands;i++) {
      document["waterfallapplet"+i].setmode(m);
   }
}


function allloaded()
{
   if (centerfreq>9000 && hi<0) { tmp=hi; hi=-lo; lo=-tmp; }
   updbw();
   setfreq(centerfreq+10);

//   if (document.soundapplet.javaversion()<"1.4.2") 
//      document.getElementById("javawarning").innerHTML='<b><i>Your Java version is '+document.soundapplet.javaversion()+', which is too old for the WebSDR. Please install version 1.4.2 or newer from <a href="http://www.java.com">http://www.java.com</a> if you hear no sound.</i></b>'

   test_serverbusy();

   waterfallspeed(waterslowness);
}


function bodyonload()
{
   var x= readCookie('freezeunused');
   document.waterfallform.freezeunused.checked=(x>0);

   scaleobj = scaleobjs[band];
   passbandobj =document.getElementById('yellowbar');
   edgeupperobj = document.images.edgeupper;
   edgelowerobj = document.images.edgelower;
   carrierobj = document.images.carrier;
   smeterobj = document.getElementById('smeterbar');
   numericalsmeterobj=document.getElementById('numericalsmeter');
   smeterpeakobj = document.getElementById('smeterpeak');
   numericalsmeterpeakobj=document.getElementById('numericalsmeterpeak');
   smeterobj.style.top= smeterpeakobj.style.top;
   smeterobj.style.left= smeterpeakobj.style.left;

   for (i=0;i<nbands;i++) {
      band_effcenterfreq[i]=band_centerfreq[i];
      band_effsamplerate[i]=band_samplerate[i];
   }

   document.freqform.frequency.value=freq;

   interval_ajax3 = setInterval('ajaxFunction3()',5000);

   interval_updatesmeter = setInterval('updatesmeter()',100);

   if (!document.versiontestapplet || !navigator.javaEnabled()) {
      document.getElementById("javawarning").innerHTML='<b><i><font color=red>It seems Java is not installed (or disabled) on your computer. You need to install and enable it for this website to work properly.</font></i></b>'
   } else {
      javaversion = document.versiontestapplet.javaversion();
      if (javaversion<"1.4.2") document.getElementById("javawarning").innerHTML='<b><i><font color=red>Your Java version is '+javaversion+', which is too old for the WebSDR. Please install version 1.4.2 or newer, e.g. from <a href="http://www.java.com">http://www.java.com</a> if you hear no sound.</font></i></b>';
   }

   chatboxobj = document.getElementById('chatbox');
   statsobj = document.getElementById('stats');
   numusersobj = document.getElementById('numusers');
   usersobj = document.getElementById('users');

   ajaxFunction3();
}


function setusernamecookie() {
   createCookie('username',document.usernameform.username.value,365*5);
   var p=document.getElementById("please");
   if (p) p.innerHTML="Your name or callsign: ";
   ajaxFunction();
}

function document_username() {
  var x= readCookie('username');
  if (x) {
    document.write("Your name or callsign: ");
    document.write('<input type="text" value="" name="username" onchange="setusernamecookie()" onclick="">');
    document.usernameform.username.value=x;
  } else {
    document.write('<span id="please"><b><i>Please log in by typing your name or callsign here (it will be saved for later visits in a cookie):<\/i><\/b></span> ');
    document.write('<input type="text" value="" name="username" onchange="setusernamecookie()" onclick="">');
  }
}


function document_waterfalls() {
  var i;
  for (i=0;i<nbands;i++) {
    document.write(
      '<applet code="websdrwaterfall.class" archive="websdr.jar" width=1024 height=99 name="waterfallapplet'+i+'" MAYSCRIPT>' +
      '<param name="rq" value="/~~waterstream'+i+'">' +
      '<param name="maxh" value="200">' +
      '<param name="maxzoom" value="' + band_maxzoom[i] + '">' +
      '<param name="id" value="'+i+'">' +
      '<\/applet>'+
      '<div style="overflow:hidden; width:1024px" id="clipscale'+i+'">' +
        '<img src="'+band_scaleimgz[i][0]+'" onmousedown="imgmousedown(event,'+i+')" class="scale" name="scale'+i+'">' +
      '</div>' +
      '<div style="width:1024px;height:30px;background-color:black" onmousedown="imgmousedown(event,'+i+')"><\/div>' +
      '\n'
    );
    scaleobjs[i] = document.getElementById('clipscale'+i);
    scaleimgs[i] = document.images["scale"+i];
  }
  document.write(
    '<div id="yellowbar" style="position:absolute;width:100px;height:18px;background-color:black" onmousedown="mousedownpassband(event)">' +
       '<div style="position:relative;left:0px;top:2px;height:1px;background-color:yellow;">' +
          '<div style="position:absolute;width:0px;height:0px;"></div>' +
          '</div>' +
       '</div>' +
    '<img src="edgelower.png" name="edgelower" onmousedown="mousedownlower(event)" class="scaleabs" alt="">' +
    '<img src="edgeupper.png" name="edgeupper" onmousedown="mousedownupper(event)" class="scaleabs" alt="">' +
    '<img src="carrier.png" name="carrier" onmousedown="mousedownpassband(event)" class="scaleabs" alt="">' +
    '\n'
  );
}


function document_bandbuttons() {
    if (nbands>1) {
       document.write("<br>")
       var i;
       for (i=0;i<nbands;i++) document.write("<input type=\"button\" value=\""+band_name[i]+"\" onclick=\"setband("+i+")\">\n");
    }
}


function document_soundapplet() {
  document.write(
     '<applet code="websdrsound.class" archive="websdr.jar" width=400 height=100 name="soundapplet" MAYSCRIPT></applet>' +
     '<form action="#"><input type="button" value="show/hide audio status" onclick="document.soundapplet.togglehidestatus()"></form>' +
     '\n' );
}


function document_javatestapplet() {
  document.write(
     '<applet code="versiontest.class" archive="websdr.jar" width=400 height=20 name="versiontestapplet" MAYSCRIPT></applet>'
     );
}

