// Script for MIDI player

    var win = null;

    var numSelections = 0, numSongs=0;
    var delay=0;
    var firstTrack=null, lastTrack=null;
    var titles = null;        // titles of selections
    var ctitle="";          // title of current selection
    var timer=0;
    var trackList = null;     // array of track details
    var pl = new Array();     // playlist - array of indices into trackList
    var cselect=0;        // current disk  selection
    var cplay=0;	    // current index in playlist
    var iplay=0;	    // count of tracks played from current list
    var DocString = ""
    var nextTime = 0    // time before loading next track
    var MidiUrl = "http://web.aanet.com.au/d-e/SD/";

    function OpenMidiPlayer()
    {
      var d, t;
      var u = 'playmidi.html';
      if (arguments.length >= 1)
      {
	d = arguments[0];
	u = u + '?d=' + d.toString();
      }
      if (arguments.length == 2)
      {
	t = arguments[1];
	u = u + ',t=' + t.toString();
      } 
      win = window.open(u,'pma8','width=255,height=180,resizable=yes,status=yes');
      //  win.blur();
      //window.focus();
      document.cookie = "PlayMidiOpened=yes";	// just a temporary cookie
    }


    function SwitchAutoPlay()
    {
      // save preference
      var expires = new Date();
      expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);
     if (document.apForm.apCheck.checked)
       setCookie("AutoPlay", "yes", expires);
     else
       setCookie("AutoPlay", "no", expires);
    }

    function Greetings()
    {
      var expires = new Date();
      expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);
      setCookie("DefaultSelection", "4", expires);  // christmas selection
      OpenMidiPlayer();
      window.open("xmc/xmc.html", "Greetings");
    }




  function ExitPlayMidi()
  {
    // won't always be called on exit - eg in Netscape 4
    // clear the temporary cookie
   setCookie("PlayMidiOpened", "no");	
  }

  function CloseMidiPlayer()
  {
    setCookie("PlayMidiOpened", "no");	
    close();
  }

  // functions to set up the play list
  
  
  function Track(n, a, u, l)
  {
    this.name = n;    // track title
    this.artist = a;  // original artist
    this.url = MidiUrl + u;     // url
    this.length = l;  // length (seconds)
    return this;
  }
  
  function AddTrack(n, a, u, l) {
    trackList[trackList.length] = new Track(n, a, u, l);
  }

 
  function Setup()
  {
      // set up playlist
  trackList = new Array();
  numSelections=8;	// 8 different selections
  firstTrack = new Array(numSelections);    
  lastTrack = new Array(numSelections);    
  titles = new Array(numSelections);    

  // Armidale Eights selection
  titles[0] = "Popular Songs";
  firstTrack[0] = 0;
  AddTrack("Dancing Queen", "Abba", "midi/DancingQueen.mid", 218);
  AddTrack("Some Days Are Diamonds", "John Denver", "midi/SomeDaysAreDiamonds.mid", 243);
  AddTrack("Sweet Caroline", "Neil Diamond", "midi/SweetCaroline.mid", 219);
  AddTrack("Tennessee Waltz", "Roy Acuff", "midi/TennesseeWaltz.mid", 151);
  AddTrack("Lookin Out My Back Door", "C. C. R.", "midi/LookinOutMyBackDoor.mid", 142);
  AddTrack("Take me home, country roads", "John Denver", "midi/TakeMeHomeCountryRoads.mid", 183);
  AddTrack("Brown-Eyed Girl", "Van Morisson", "midi/BrownEyedGirl.mid", 231);
  AddTrack("O Lonesome Me", "Don Gibson", "midi/LonesomeMe.mid", 165);
  AddTrack("Cracklin' Rosie", "Neil Diamond", "midi/cracklinrose.mid", 169);
  AddTrack("Honky Tonk Angels", "Kitty Wells", "midi/honkytnkangels_kittywells.mid", 176);
  AddTrack("I just want to dance with you", "George Straight", "midi/DanceWithYou.mid", 216);
  AddTrack("Something", "Beatles", "midi/Something.mid", 204);
  AddTrack("Jamaica Farewell", "Harry Belafonte", "midi/Jamaica.mid", 107);
  AddTrack("If You're Going To San Francisco", "Scott McKenzie", "midi/sanfran.mid", 180);
  AddTrack("I Still Call Australia Home", "Peter Allen", "midi/IStillCallAustraliaHome.mid", 147);
  lastTrack[0] = trackList.length-1;
  // Country & Western
  titles[1] = "Country & Western";
  firstTrack[1] = trackList.length; 
   AddTrack("Blue eyes cryin in the rain", "Willie Nelson", "midi/BlueEyesCryinInTheRain.mid", 148);
  AddTrack("Seven Spanish Angels", "Willie Nelson", "midi/SevenSpanishAngels.mid", 254);
   AddTrack("King of the road", "Roger Miller", "midi/KingOfTheRoad.mid", 145);
   AddTrack("Watermelon Wine", "Tom T. Hall", "midi/watermelonwine.mid", 243);
   AddTrack("Before The Next Teardrop Falls", "Freddie Fender", "midi/NextTearDropFalls.mid", 162);
   AddTrack("Green Grass Of Home", "Tom Jones", "midi/Greengrass.mid", 180);
   AddTrack("Always On My Mind", "Willie Nelson", "midi/YouWereAlwaysOnMyMind.mid", 282);
   AddTrack("Please Help Me, I'm Falling", "Hank Locklin", "midi/PleaseHelpMeImFalling.mid", 183);
   AddTrack("Live, Laugh, Love", "Clay Walker", "midi/LiveLaughLove.mid", 195);
   AddTrack("Life's a Dance", "John Michael Montgomery", "midi/LifesADance.mid", 205);
   AddTrack("Home On The Range", "Brewster Higley", "midi/HomeOnTheRange.mid", 185);
   AddTrack("Back Home Again", "John Denver", "midi/BackHomeAgain.mid", 280);
   AddTrack("Bobby McGee", "Kris Kristopherson", "midi/BobbyMcGee.mid", 210);
  lastTrack[1] = trackList.length-1;
  // irish/scottish tracks
  titles[2] = "Irish & Scottish tunes";
  firstTrack[2] = trackList.length; 
  AddTrack("Mountains Of Mourne", "W.P. French/ W.H. Collisson", "midi/Mourne.mid", 173);
  AddTrack("Black Velvet Band", "Traditional", "midi/blackvel.mid", 112);
  AddTrack("The Wild Rover", "Traditional", "midi/wildrover.mid", 163);
  AddTrack("Flower Of Scotland", "Roy Williamson", "midi/FlowerOfScotland.mid", 102);
  AddTrack("Danny Boy", "Fred E. Weatherly", "midi/DannyBoy.mid", 256);
  AddTrack("The Meeting Of The Waters", "Traditional", "midi/MeetingOfTheWaters.mid", 177);
  AddTrack("Mull Of Kintyre", "Paul McCartney", "midi/MullOfKintyre.mid", 289);
  lastTrack[2] = trackList.length-1;
  // Beatles tracks
  titles[3] = "Beatles Songs";
  firstTrack[3] = trackList.length;
  AddTrack("Help", "Beatles", "midi/Help.mid", 152);
  AddTrack("Act Naturally", "Beatles", "midi/ActNaturally.mid", 186);
  AddTrack("Here Comes The Sun", "Beatles", "midi/HereComesTheSun.mid", 182);
  AddTrack("Let It Be", "Beatles", "midi/LetItBe.mid", 235);
  AddTrack("Obladi Oblada", "Beatles", "midi/ObladiOblada.mid", 183);
  AddTrack("When I'm 64", "Beatles", "midi/WhenIm64.mid", 158);
  lastTrack[3] = trackList.length-1;
  numSongs = trackList.length;	      // total number of tracks in main selections

  // christmas tracks
  titles[4] = "Christmas Music";
  firstTrack[4] = trackList.length;
  AddTrack("So this is Christmas", "John Lennon", "midi/happyxmas.mid", 197);
  AddTrack("Winter Wonderland", "", "midi/WinterWonderland.mid", 149);
  AddTrack("Marys Boy Child", "", "midi/maryboych.mid", 137);
  AddTrack("Silent Night", "", "midi/SilentNight.mid", 169);
  AddTrack("Rudolph the Red-Nosed Reindeer", "", "midi/rednose.mid", 138);
  AddTrack("Feliz Navidad", "", "midi/feliznv.mid", 167);
  lastTrack[4] = trackList.length-1;
  numSongs = trackList.length;	      // total number of tracks in main selections including xmas

  // extra selection just for fun
  titles[5] = "Comedy tunes";
  firstTrack[5] = trackList.length;
  AddTrack("Look on the Bright Side of Life", "Monty Python", "midi/alwayslook.mid", 213);
  AddTrack("When You're Smiling", "George Formby", "midi/smiling.mid", 152);
  AddTrack("Give Me Sunshine", "Morecombe & Wise", "midi/ericerni.mid", 159);
  AddTrack("Lumberjack Song", "Monty Python", "midi/lumberjack-song.mid", 164);
  AddTrack("Sooty", "The Sooty Show", "midi/sooty.mid", 33);
  AddTrack("Daydream Believer", "The Monkees", "midi/DaydreamBeliever_Monkees.mid", 188);
  AddTrack("Chicken Dance", "", "midi/chicken.mid", 77);
  lastTrack[5] = trackList.length-1;
  
  // song sung blue
  titles[6] = "Song Sung Blue Selection";
  firstTrack[6] = trackList.length; 
  AddTrack("Song Sung Blue", "Neil Diamond", "midi/SongSungBlue.mid", 242);
  AddTrack("Some Broken Hearts Never Mend", "", "midi/somebrokenheartsnevermend.mid", 155);
  AddTrack("Gentle On My Mind", "John Hartford", "midi/GentleOnMyMind.mid", 190);
  AddTrack("Annie's Song", "John Denver", "midi/AnniesSong.mid", 235);
  AddTrack("Blue eyes cryin in the rain", "Willie Nelson", "midi/BlueEyesCryinInTheRain.mid", 148);
  AddTrack("Somewhere Over The Rainbow", "Judy Garland", "midi/SomewhereOverTheRainbow.mid", 186);
  AddTrack("Why worry", "Dire Straits", "midi/WhyWorry.mid", 233);
  lastTrack[6] = trackList.length-1;

  // golden oldies
  titles[7] = "Golden Oldies";
  firstTrack[7] = trackList.length; 
  AddTrack("Down On The Corner", "C.C.R.", "midi/DownontheCorner_CreedenceClearwaterRevival.mid", 159);
  AddTrack("Love is in the air", "John Paul Young", "midi/LoveIsInTheAir.mid", 225);
  AddTrack("Heart Of Glass", "Blondie", "midi/HeartOfGlass.mid", 208);
  AddTrack("Dream Lover", "Bobby Darin", "midi/DreamLover.mid", 149);
  AddTrack("Land Down Under", "Men At Work", "midi/Downunder.mid", 225);
  AddTrack("This Ole House", "Rosemary Clooney", "midi/this-ole-house.mid", 196);
  AddTrack("Y.M.C.A.", "Village People", "midi/YMCA.mid", 234);
  AddTrack("Do Wah Diddy Diddy", "Manfred Mann", "midi/DoWahDiddyDiddy.mid", 149);
  lastTrack[7] = trackList.length-1;


  // if we change above, make sure numSelections is reset correctly
  // and check selections in controls.htm
  
  delay = 9000; // time (ms) to wait before reloading
  timer = 0;
  iplay = 0;	// used to keep track of number played continuosly
  cplay = 0;  // current index in playlist
  cselect = 0;
  ctitle = titles[0];

}
  
function Load(SongURL, SongTitle, SongArtist)
{

  // embed appropriate player into the top frame

  var WriteSongTitle = "yes";
  
  DocString = ""

  // table layout for song info and player
  DocString = DocString + '<table width=250 border=0>\n<tr><td align=center valign=middle height=30>\n';
  DocString = DocString + '<font face=verdana,helvetica,arial size=-2 color="#00ffff "><i><b>\n';
  DocString = DocString + SongTitle + '<\/b><br>' + SongArtist + '\n';
  DocString = DocString + "<\/i></font><\/td><\/tr>\n";
  DocString = DocString + '<tr><td height=55 align=center valign=middle>\n';

  // code for player
  if (navigator.appName == "Netscape") // Find out if the browser is Navigator.
  {
    var NSMajorVersion = navigator.appVersion.charAt(0)   // Find major version number.
    if (NSMajorVersion > "2") // Is major version greater than 2?
    {
	  // Crescendo player has been discontinued, so use MIME type to load the first
	  // MIDI plug-in that matches the file's MIME type or, if the file MIME type is
	  // not matched by any plug-in, Mplayer.exe will be OLE-embedded on Windows.
	  DocString = DocString + '<EMBED SRC="' + SongURL + '" \n'
	  DocString = DocString + 'Loop="false" \n'	      // Disable looping
	  DocString = DocString + 'AUTOSTART="true" \n' 
	  DocString = DocString + 'HEIGHT=55 WIDTH=210'
	  DocString = DocString + '>\n'
	}
    else
    {
      // This is version 2 of Netscape, so use MIME type to load the first
      // MIDI plug-in that matches the file's MIME type or, if the file MIME type is
      // not matched by any plug-in, Mplayer.exe will be OLE-embedded on Windows.
      DocString = DocString + 'SRC="' + SongURL + '" \n'
    }
  }
  else	  // Find out if the browser is Microsoft Internet Explorer 3.0 or greater.
  {
    if (navigator.appName == "Microsoft Internet Explorer")
    {
	      DocString = DocString + '<EMBED SRC=\"' + SongURL + '\" \n'
	      DocString = DocString + 'AUTOSTART="true" \n' 
	      DocString = DocString + 'Loop="false" \n'	      // Disable looping
	      DocString = DocString + 'HEIGHT=45 WIDTH=200>\n'
    }
    else
    {
      // The browser may be Netscape 1.x, or MSIE 2.0, or some other browser.
      // For MSIE 2.0,
      DocString = DocString + '<BGSOUND SRC="' + SongURL + '">' + '<BR>\n'
    }
  } //end browser sniffing

  // finish table and document
  DocString = DocString + '<\/td><\/tr>';

  DocString = DocString + '<tr><td align=center valign=middle>\n';
  DocString = DocString + '<font face=verdana,helvetica,arial size=-2 color="#00ffff "><i><b>\n';
  DocString = DocString + ctitle + '<\/b>\n';
  DocString = DocString + "<\/i></font><\/td><\/tr>\n";

  DocString = DocString + '<\/table>\n';

} 
  
function Reload()
{
// arg[0] = 0, -1, 1 or 2
  var m;
  if (arguments.length == 0)
    m = 0;	       // default is to load random track
  else
  m = arguments[0];
  if (timer != 0)	{
     clearTimeout(timer);
     timer = 0;
   }
  // first get index of current track in playlist
  var whichone = cplay;
  if (m==0)
    whichone = -1;   // pick another one at random
  else if (m == -1)
  {
    whichone--;       // previous track
    if (whichone < 0)
      whichone = pl.length-1;
  }
  else if (m == 1)
  {
    whichone++; 	// next track
    if (whichone > pl.length-1)
      whichone = 0;
  }
  else if (m == 2)	// new playlist
    whichone = cplay;
  else
    whichone = -1;
     // if (whichone out of range) pick random
    if (whichone < 0 || whichone > pl.length-1)
    {
       whichone = RandomInteger(pl.length);
    }
    cplay = whichone;
    var trk = pl[whichone];
    Load(trackList[trk].url, trackList[trk].name, trackList[trk].artist);
    iplay++;
    if ( (iplay < (pl.length)) && (iplay < 6) )
    {	 // only play through selection once, up to maximum of six tracks
      // set timer to reload next track
      //timer = setTimeout("Reload(1)", trackList[trk].length*1000 + delay);
      nextTime = trackList[trk].length*1000 + delay;
    }
    else
    {
      // close the midi-player after 300 seconds, in case user forgets
      timer = setTimeout("CloseMidiPlayer()", trackList[trk].length*1000+ 300*1000);
      iplay--;	// in case next/prev is clicked before timeout
      nextTime = 0;
    }


  }

   function PrevSelection()
  {
    cselect = cselect-1;
    if (cselect < 0)
      cselect = numSelections-1;
    ChangeSelection(cselect);
  }
 
  function NextSelection()
  {
    cselect = cselect+1;
    if (cselect >= numSelections)
      cselect = 0;
    ChangeSelection(cselect);
  }

  function ChangeSelection()
  {
    if (timer)	{
      clearTimeout(timer);
      timer = null;
    }
    var d;
    if (arguments.length == 0)
     d=0;
    else
     d=arguments[0];
    if (d >= numSelections)
      d = 0;

    var first = firstTrack[d];
    var last = lastTrack[d];

    if (d < 0)
    {
      MakePlayList(0, numSongs-1, 6);	   // make a random selection of 6 from all tracks
   	  ctitle = "Random selection";
    }
    else
    {
      MakePlayList(first, last);
   	  ctitle = titles[d];
   	}

    if (d != numSelections-1)  // ie not the 'just for fun' selection
    {
     var expires = new Date();
     expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);
     setCookie("DefaultSelection", d, expires);
    }	

   iplay = 0;	  // reset tracks played counter
   cplay = 0;	  // set index of first track to play
   // if a particular track was specified, find the corresponding index
   if (arguments.length == 2)
   {
     for (i=0; i<pl.length; i++)
     {
       if (pl[i] == (arguments[1]+first))   // optional second argument is number of track to play
       {
	 cplay = i;	      // index in list of specified track to start
	 break;
       }
     }
   }
   Reload(2);	    // reload player with new playlist

  }

  function MakePlayList(trk1, trk2)
  {
    var ntracks, nplay;
    if ((arguments.length == 3) && (arguments[2] <= trk2 - trk1 + 1))
      nplay = arguments[2];	  // ie choose nplay tracks
    else
      nplay = trk2 - trk1 + 1;

    // set up initial play list
    ntracks = trk2 - trk1 + 1;
    pl.length = ntracks;
    var i, j, r, tmp;
    for (i=trk1; i<=trk2; i++)
     pl[i-trk1] = i;

    // randomise the order
    for (j=0; j<nplay; j++)
    {
      r = RandomInteger(ntracks - j) + j;
      // swap elements j and r
      tmp = pl[j];
      pl[j] = pl[r];
      pl[r] = tmp;
    }
    // reset the list length
    if (nplay < ntracks)
      pl.length = nplay;

  }

  function RandomInteger(N)
  {
    // get a random integer in range 0 to N-1 inclusive
    if (N < 1)
      return 0;
    var i = Math.floor(Math.random()*N);
    if (i > N-1) i = N-1;
    return i;
  }



