   window.onerror=tellerror
   var newwin
   var isrunning=0
   var OFF = -10000
   var MID  = -600
   var LOUD = -200
   var LO = -1000
   var volume=MID
   var lesguignols = ""
   var v = -1
   var date = new Date()
   var min = 0
   var dur = 0
   var timerID1 = null
   var timerID2 = null
   var timerID3 = null
   var scratch = ""
   var isLinux = 0  // assume windows
   var http = new Object()
   var cataloniavideo = ""
   var tele5videos = new Array()
   var a3videos = new Array()
   var telecinco = ""
   var antena3 = ""
   var youtube = 0    // is youtube running ??
   var rtverunning = 0
   var libertadurl = ""
   var leflash = ""
   var lastrtve = -1
   var lastrtvv = -1
   var so = null    // the flash video player for rtve (and others...)
   var tv2 = new Image()
   tv2.src = "/gifs/gbntv4.jpg"

   var dmatrix = new Array (
	[0,6,5,4,3,2,1,0],
	[1,0,6,5,4,3,2,1],
	[2,1,0,6,5,4,3,2],
	[3,2,1,0,6,5,4,3],
	[4,3,2,1,0,6,5,4],
	[5,4,3,2,1,0,6,5],
	[6,5,4,3,2,1,0,6],
	[7,6,5,4,3,2,1,0]
)

   var france2url = "mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/horsgv/regions/siege/infos/f2/";
   var france2backup_url = "mms://sdmc.contents.edgestreams.net/horsgv/regions/siege/infos/f2/";
   var france3url = "mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/horsgv/regions/siege/infos/f3/";
   var fr2_flash = "mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/1219021289/ftvigrp.download.akamai.com/10199/horsgv/regions/siege/infos/f2/flashinfos/flashinfo.wmv?WMCashe=0"

   // 4verites
   // http://les-4-verites.france2.fr/IMG/asx/arton390.asx
   // mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/horsgv/regions/siege/france2/4v/4v_20060320.wmv?WMCache=0
   // 0730h
   // bruxelles jt80YYYYMMDD_128.wmv
   // cauet: mms://streamtf1.yacast.net/tf1webcast/lamethodecauet/DDMMYY/cauet_1.wmv       fridays ??
   // old 50 minutes:   "mms://streamtf1.yacast.net/tf1webcast/emissions/50mninside/" + tf1_saturday + "1.wmv", // 85

   // in case you need it: www.bfmtv.fr/divers/player_bfmtv.asx

   function dformat( d ) {
      var retdate = "";
      var year = d.getFullYear();
      var month = d.getMonth() + 1;
      var day = d.getDate();
      if (month < 10) { 
         month = '0' + month 
      }
      else {
         month += ''
      }
      if (day < 10) { 
         day = '0' + day 
      }
      else {
         day += ''
      }
      retdate = month + day + year

      return retdate;  // return MMDDYYYY
   }

   function mkfrance2date ( d ) {  // wants YYYYMMDD
      return d.substr(4,4) + d.substr(0,2) + d.substr(2,2) 
   }

   function mktf1date ( d ) {
      // wants day + month + year;
      return d.substr(2,2) + d.substr(0,2) + d.substr(4,4) 
   }

   function mktf1date2 ( d ) {
      // wants ddmmyy
      return d.substr(2,2) + d.substr(0,2) + d.substr(6,2) 
   }

   function mkfrance3date ( d ) {
      // wants YYYYMMDD
      return d.substr(4,4) + d.substr(0,2) + d.substr(2,2) 
   }

   function mkcplusdate ( d ) {    // 060320  YYMMDD
      // wants YYMMDD
      return d.substr(6,2) + d.substr(0,2) + d.substr(2,2) 
   }

   var thedate = dformat( date )  // gets me MMDDYYYY
   var tf1date = mktf1date( thedate );
   var tf1date2 = mktf1date2 ( thedate );
   var france2date = mkfrance2date( thedate );
   var france3date = mkfrance3date( thedate );
   var france2am = france2url + "8h/HD_8h_" + france2date + ".wmv";
   var france2pm = france2url + "13h/HD_13h_" + france2date + ".wmv";
   var france2eve = france2url + "20h/HD_20h_" + france2date + ".wmv";

   var france2backup_am = france2backup_url + "8h/HD_8h_" + france2date + ".wmv"
   var france2backup_pm = france2backup_url + "13h/HD_13h_" + france2date + ".wmv"
   var france2backup_eve = france2backup_url + "20h/HD_20h_" + france2date + ".wmv"
   var bruxdate = yesterday( date )
   var cplusdate = mkcplusdate( thedate )
   var sunday = mkcplusdate( LastWeek( date, 0 ) ) 
   var tf1sunday = mkfrance2date( LastWeek( date, 0 ) )
   var saturday = mkcplusdate( LastWeek( date, 6 ) )
   var tf1_saturday = mkfrance3date( LastWeek( date, 6 ) )
   var friday =  mktf1date2( LastWeek( date, 5 ) )

   videos = new Array(
      "http://live1.telemadrid.stream.flumotion.com/telemadrid/live1.asf.asx", // 0 telemadrid sat
      "mms://a1116.l1558540568.c15585.e.lm.akamaistream.net/D/1116/15585/v0001/reflector:40568",  // 1
      "mms://cache2.gva.es/tvvi?rtvv",  //2
      "mms://cache.gva.es/tvvi?rtvv",   //3
      "mms://a978.l597235165.c5972.e.lm.akamaistream.net/D/978/5972/v0001/reflector:35165",  //4
      "mms://212.203.114.83:8080",  //5
      "http://les-4-verites.france2.fr/IMG/asx/arton390.asx",   //6
      "http://ondemand.telemadrid.stream.flumotion.com/telemadrid/ondemand/emision/tn1_" + france2date + ".wmv", //7
      "http://ondemand.telemadrid.stream.flumotion.com/telemadrid/ondemand/emision/tn2_" + france2date + ".wmv", //8
      "http://ondemand.telemadrid.stream.flumotion.com/telemadrid/ondemand/emision/tn3_" + france2date + ".wmv", //9
      "http://www.rtve.es/rne/audio/reelive.asx", // 10
      "http://www.rtve.es/rne/audio/RNE5.asx", // 11
      "http://www.rtve.es/rne/audio/r1live.asx", // 12
      "mms://wmod.streaming.rfi.fr.edgestreams.net/rfi/francais/audio/directs/r001/rfimonde.wsx", // 13
      "http://www.georgie.org/europe1.asx", // 14
      "http://cache.yacast.fr/V4/franceinfo/finfo.asx", // 15
      "http://cache.yacast.fr/V4/franceinter/finter.asx", // 16
      "http://www.cadenaser.com/player/SER-TIC1.asx",    // 17
      "http://football.direct8.fr/live.php",  // 18
      "mms://vodstream.tf1.fr/tf1webcast/meteo/meteo20h.asf",   // 19
      "mms://vodstream.tf1.fr/tf1webcast/meteo/meteo13h.asf",   // 20
      "mms://vodstream.tf1.fr/tf1webcast/emissions/automoto/" + tf1sunday + "/integrale.wmv",  //21 automoto
      "http://195.10.10.102:80/barcelonatv/barcelonatv.asf", // 22
      "mms://stream1.france24.yacast.net/f24_livefr",  //23
      "http://live2.telemadrid.stream.flumotion.com/telemadrid/live2.asf.asx", // 24  la otra
      "http://www.bfmtv.com/divers/player_bfmtv.asx",  // 25
      "http://www.libertaddigital.tv/directo/ldtv.asx",  // 26  libertad digital direct
      "http://www.rtve.es/rne/audio/RNE4.asx",   // 27  radio 4 catalan
      "http://212.78.144.130/asf/flaixdirecte.asx", // 28
      "mms://wm.ondemand.pa.edgestreams.net/reflector:49850",   // 29
      "http://barcelonatv.stream.flumotion.com/barcelonatv/barcelonatv.asf.asx",  // 30  asx for barcelonatv
      fr2_flash,   // 31
      "mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/horsgv/regions/siege/france2/telematin/vod/telematin_" + france2date + ".wmv?WMCache=0", // 32 telematin
      "mms://2x4.telecomdatacenter.com.ar/2x4",   // 33   tango!
      "mms://antena3livewm.fplive.net/antena3wmlive-live/canal24h")  // 34
   function vplay(v) {
      if (videos[v] == "") {
         return
      }

      document.getElementById('splash').style.visibility = "hidden"
      // document.getElementById('tv').style.visibility = "visible"
      document.getElementById('flvplayer').style.visibility = "hidden"

      if (rtverunning) {
         rtverunning=0

         so.addVariable("file","")
         so.write("flvplayer");
         // document.getElementById('flvplayer').style.visibility = "hidden"
      }

      if (isLinux) {   // play externally and hope for the best...
         window.location.href = videos[v];
      }
      else {   // else windows 
         document.getElementById('tv').innerHTML="<embed type='application/x-mplayer2' src='" + videos[v] + "' name='VideoPlayer' id='VideoPlayer' displaysize='4' autosize='0' width='320' height='290' showcontrols='1' autsostart='0' loop='0' windowlessvideo='1' showdisplay='0' showstatusbar='1'></embed>"

         document.getElementById('tv').style.visibility = "visible"
      }
   }

   function highlight() {
      style.backgroundColor = "#000099";
   }

   function extPlay() {
      var w = null;
      var myv = "";

      window.location.href = VideoPlayer.src;
   }

   function padout(number) { 
      return (number < 10) ? '0' + number : number; 
   }

   function ampm(time) {
      var hours = time.getHours(), minutes = padout(time.getMinutes());
      var adjhours = (hours == 0) ? 12 : ((hours < 13) ? hours : hours-12);
      return ((adjhours < 10) ? ' ' : '') + adjhours + ':' + minutes + ((hours < 12) ? ' am' : ' pm');
   }

   function updateClock() {
      var time = new Date();
      var hours = time.getHours();
      var minutes = time.getMinutes();
      var gmt = time.toGMTString();
      gmt = gmt.substring(0,22);
      timerID1 = setTimeout("updateClock()",30000)
  }

   function getHTTPObject() {
      var xmlhttp;
      // test for netscape:
      if (window.XMLHttpRequest) {
         xmlhttp = new XMLHttpRequest();
      }
      else {
        try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
          try {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (e) {
               xmlhttp = false;
            }
        }
      }
      return xmlhttp;
   }

   function doquery2(qt) {
     // alert("doing type = " + qt);
     http[qt] = getHTTPObject()
 
     if (http[qt] != null) {
        http[qt].open("GET", "/cgi-bin/ajax3.cgi?" + qt,true); 
        http[qt].onreadystatechange = function() { proc( http[qt] ) };

        http[qt].send(null);
     }
     else {
        alert("Uh oh...");
     }
   }

   function proc(httpreq) {
      if (httpreq.readyState == 4) {
         if (httpreq.status == 200) {
          //  document.getElementById('dynamic').innerText = "Yes, master?...";
            // response comes back in the form of:
            // TYPE=1~~~hit...~~~hit...~~~hit...
            // OR
            // "TYPE=1~~~No Videos."

            // scratch = httpreq.responseText;

            //alert("RAW: " + httpreq.responseText)

            var t = ""
            scratch = unescape(httpreq.responseText);
            //alert("COOKED: " + scratch);

            hits = scratch.split("~~~");
            // type is in hits[0]
            var type = hits[0].replace("TYPE=","");
            //alert("at this point type = " + type);

            // if (hits[1] == "No Videos.") {
            if (hits[1].indexOf('No Vide') > -1 ) {
               if (type != 9) {
             //     alert( hits[1] + " for query type " + type)
                  alert( hits[1] + " from broadcaster at this time.")
               }
               return
            }

            if (type == 9) {  // f2 periodic flash
               leflash = hits[1]
               document.getElementById('leflash').innerHTML = "F2 flash"
            }
         } 
         else {
            alert("Error: " + http.statusText)
         }
      }
   }

   function shutdown() {
      if (newwin) {
         newwin.close()
      }
   }

   function IsLeapYear( year ) { 
      return ( ( (year % 4 == 0) && (year % 100 != 0) ) || (year % 400 == 0) ) ? 1 : 0;
   }

   function LastWeek(d,w) {
      var retval = ""
      var dow=d.getDay()
      var dt=d.getDate()
      var yr=d.getFullYear()
      var m=d.getMonth()+1

      var backup = dmatrix[dow][w]   // <-- number of days to back up
      // eg to get from friday to tuesday:  5 - 2 = 3 days to back up
      // if (w == 6) {
      //   alert('to get to day ' + w + ' i back up ' + backup + ' day(s)')
      //  }

      backup = dt - backup  // <-- today's date minus number of days to backup
      // eg today is friday the 28th, so tuesday is 28 - 3 = the 25th
      // if today were friday the 2nd, then tuesday is 2 - 3 = the -1st
      // so we have to not only go back 3 days, but also 1 month (and
      // maybe even 1 year, depending on what month that throws us into

      if (backup > 0) {
         if (m < 10) { 
            m = '0' + m 
         }
         else {
            m += ''
         }
         if (backup < 10) { 
            backup = '0' + backup 
         }
         else {
            backup += ''
         }
         retval = m + backup + yr;
         return(retval);
      }
      else {
         if (m == 1) {  // we have to go back a year!
            yr--;
         }

         switch(m) {
            case 1:
               m=12;
               dt=31+backup;
               break;

            case 3:  // leapyear processing!
                  // we have to go back a month, but last day could be 29 instead of 28
               m--;
               dt = 28 + backup;   // (IsLeapYear( yr) ? 29: 28) + backup;
               break;

            case 5,7,8,10,12:
               m--;
               dt=31+backup;
               break;

            default:
               m--;
               dt=30+backup;
               break;
         }  // end switch{}

         if (m < 10) { 
            m = '0' + m 
         }
         else {
            m += ''
         }
         if (dt < 10) { 
            dt = '0' + dt 
         }
         else {
            dt += ''
         }
         retval = m + dt + yr;
         return(retval);   // MMDDYYYY  later we format for tf1 or canalplus
      }  // big else{}
   }

   function yesterday(d) {
      var dt=d.getDate()
      var yr=d.getFullYear()
      var m=d.getMonth()+1
      var retval = ""

      dt--  // back up 1 day
      if (dt == 0) {  // need to back up 1 month
         m--

         if (m == 0) {  //  need to back up 1 year!
            yr--
            m = 12
         }

         // figure out last day of month
         switch(m) {
            case 1,3,5,7,8,10,12:
               dt=31
               break

            case 2:  // leapyear processing!
               dt = (IsLeapYear( yr ) ? 29: 28)
               break

            default:
               dt=30
               break
         }  // end switch{}

      }   // if dt == 0

      if (m < 10) { 
         m = '0' + m 
      }
      else {
         m += ''
      }
      if (dt < 10) { 
         dt = '0' + dt 
      }
      else {
         dt += ''
      }
      retval = yr + m + dt
      return( retval )
   }

   function changeDate( e ) {
      // a simpler version of yesterday()
      var newDate = new Date()
      newDate.setDate( newDate.getDate() + parseInt(e.value))
      return(newDate)
   }

   function tellerror(msg,url,linenumber) {
      // document.status = msg + 'at LN ' + linenumber
      alert(msg + ' at LN ' + linenumber)
      return true
   }

   function flv(t,s) {
      // more stations using flv.  we have 3:
      // rtve, tmv and canal9  t=0,1,2 respectively
      // rtve & rtvv use multiple servers; we have to iterate our 
      // way through a list.  var lastrtve keeps track of where we are

      var server
      // got 204 once for rtve ...
      var rtve_servers = new Array (220,221,222,223,224,225,102,103,104)
      var rtvv_servers = new Array (215,216,217,218,219,215)

      if ((t < 0) || (t > 2)) {
         alert("Bad location: " + t)
         return
      }

      document.getElementById('splash').style.visibility = "hidden"
      document.getElementById('tv').style.visibility = "hidden"
      document.getElementById('tv').innerHTML=""
      document.getElementById('flvplayer').style.visibility = "visible"

      if (so == null)
         so = new SWFObject("player.swf", "mymovie", "320", "280", "8", "#336699");

      switch (t) {
         case 0:   // rtve
            if (lastrtve > 9) {  // they've cycled through.  no video
               rtverunning = 0
               alert("Sorry.  It doesn\'t like like there\'s" + "\r\n" + "a video from RTVE at this time.")
               lastrtve = -1   // reset everything 
               return
            }

            lastrtve++
            s = lastrtve 
       
            server = rtve_servers[s]
            document.getElementById('rtveserver').innerHTML="(" + server + ")"
            so.addVariable("file","http://195.10.10." + server + ":80/rtve/24h.flv")
            break
         
         case 1:   // tmv
            so.addVariable("file","tmvlive.flv")
            so.addVariable("streamer","rtmp://149.6.38.58/canaltvmlive")
            break

         case 2:   // canal9 local
            if (lastrtvv > 4) {  // they've cycled through.  no video
               rtverunning = 0
               alert("Sorry.  It doesn\'t like like there\'s" + "\r\n" + "a video from RTVV at this time.")
               lastrtvv = -1   // reset everything 
               return
            }

            lastrtvv++
            s = lastrtvv 
       
            server = rtvv_servers[s]
            document.getElementById('rtvvserver').innerHTML="(" + server + ")"

            so.addVariable("file","http://195.10.10." + server + ":80/rtvv/canal9.flv")
            break

         default:
            alert("Bad location: " + t)
      }

      so.addVariable("autostart","true")
      so.addVariable("allowscriptaccess","always")
      so.write("flvplayer");
      rtverunning = 1
   } 

   function sreset(s) {
      if (s == 0)
         lastrtve = -1
      else if (s == 1)
         lastrttv = -1
   }

   function amilinux() {
      isLinux = navigator.userAgent.indexOf('Linux') != -1 ? 1:0
   }

   function vplaybyname(vn) {
      if (videos[v] == "") {
         return
      }

      document.getElementById('splash').style.visibility = "hidden"
      //document.getElementById('tv').style.visibility = "visible"
      // document.getElementById('flvplayer').style.visibility = "hidden"

      if (rtverunning) {
         rtverunning=0

         so.addVariable("file","")
         so.write("flvplayer");
         document.getElementById('flvplayer').style.visibility = "hidden"
      }

      if (isLinux) {   // play externally and hope for the best...
         window.location.href = videos[v];
      }
      else {
         document.getElementById('tv').innerHTML="<embed type='application/x-mplayer2' src='" + vn + "' name='VideoPlayer' id='VideoPlayer' displaysize='4' autosize='0' width='320' height='290' showcontrols='1' autsostart='0' loop='0' windowlessvideo='1' showdisplay='0' showstatusbar='0'></embed>"

      document.getElementById('tv').style.visibility = "visible"
      }
   }


