function makeEl(params, styleParams)
{
  var el;
  el = document.createElement(params.elType || 'div');
  if (params.id) el.id = params.id;
  if (params.className) el.className = params.className;
  if (params.text) el.appendChild(document.createTextNode(params.text));
  if (typeof(params.left) != 'undefined') el.style.left = params.left;
  if (typeof(params.top) != 'undefined') el.style.top = params.top;
  if (params.src) el.src = params.src;
  if (params.href) el.href = params.href;
  if (params.value) el.value = params.value;
  if (params.name) el.name = params.name;
  if (params.type) el.type = params.type;
  if (params.title) el.title = params.title;
  if (params.rowSpan) el.rowSpan = params.rowSpan;
  if (params.colSpan) el.colSpan = params.colSpan;
  if (params.innerHTML) el.innerHTML = params.innerHTML;
  if (styleParams) {
    for(var p in styleParams) {
      el.style[p] = styleParams[p];
    }
  }
  if (params.parentNode) {
    var parentEl;
    if (typeof(params.parentNode) == 'string') {
      parentEl = document.getElementById(params.parentNode);
    } else {
      parentEl = params.parentNode;
    }
    parentEl.appendChild(el);
  }
  return el;
}

function getEl(id) { return document.getElementById(id); }


////////////////////////////////////////////////////////////////////////////////
// Called by the Flash MP3 player when it is ready.
function flashMp3Ready()
{
  Music.player = getEl('mp3Player');
  if (Music.player && Music.player.mp3Pause) {
    if (Music.mp3File) {
      Music.player.mp3Set(Music.mp3File);
    }
    Music.player.setOnFinish('Music.mp3Finished');
    Music.player.setOnPlay('Music.onPlay');
    Music.player.setOnPause('Music.onPause');
    if (Music.autoPlay) {
      Music.player.mp3Play();
    }
  }
};


////////////////////////////////////////////////////////////////////////////////
// Read a page's GET URL variables and return them as an associative array.
// Taken from http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
      hash = hashes[i].split('=');
      vars.push(hash[0]);
      vars[hash[0]] = hash[1] || '';
    }
    return vars;
}

var Music = {
  selectedSong:null,
  ajaxTimer:null,
  player:null,
  mp3File:null,
  autoPlay:false,

  init:function() {
    var urlVars = getUrlVars();
    Music.embedNeolaoPlayer();
    var chosenSongEl = null;
    var chosenSong = urlVars['song'];
    var visibleIndex = 0;
    ForEach(songs, function(song, i) {
        var slug = Music.makeSongSlug(song.name);
	if (chosenSong === slug) {
	  song.hidden = false;
	}
        if (!song.hidden) {
          var el = makeEl({parentNode:'song-list',
			   elType:'li',
 			   className:(visibleIndex % 2 == 0) ? 'even' : 'odd',
			   text:song.name,
			   'id':'song_' + i});
	  makeEvent(el, 'click', Music.songClicked);
	  if (!chosenSongEl || chosenSong === slug) {
	    chosenSongEl = el;
	  }
	  visibleIndex++;
	}
      });
    Music.songClicked.call(chosenSongEl);
    if (urlVars['play'] !== undefined) {
      Music.play();
      Music.autoPlay = true;
    }
  },

  embedNeolaoPlayer:function()
  {
    var flashvars = {
      height:"30",
      slidercolor1:"00A1FF",
      slidercolor2:"00ffff",
      buttoncolor:"7cca2c",
      mp3:'../mp3/Eddy Boston - ' + songs[0].name.replace('?', '') + '.mp3?v=2',
      autoplay:"0",
      autoload:"1",
      showloading:"always",
      volume:'100',
      showvolume:'1'
    };
    var params = {
      wmode: "transparent"
    };
    var attributes = {
      id: "mp3Player"
    };
    var el;
    swfobject.embedSWF("../js/player_mp3_maxi.swf", "mp3Player_content", "200", "20", "9.0.0", "../js/expressInstall.swf",
		       flashvars, params, attributes);
  },

  songClicked:function(event) {
    var songName = this.innerHTML;
    getEl('song-title').innerHTML = songName;
    var songSlug = Music.makeSongSlug(songName);
    Music.ajaxTimer = setTimeout(function() {
      getEl('song-text').innerHTML = '<img src="../images/ajax-loader.gif" alt="loading..." />';
    }, 500);
    doHttpRequest(songSlug + '.txt?v=2', {}, false,
		  function(resp) {
		    clearTimeout(Music.ajaxTimer);
		    Music.ajaxTimer = null;
		    // I have to use outerHTML to work around IE bug.
		    var preEl = getEl('song-text');
		    if ('outerHTML' in preEl) {
		      preEl.outerHTML = '<pre id="song-text">' + resp + '</pre>';
		    } else {
		      preEl.innerHTML = resp;
		    }
		    preEl = null;
		  },
		  function() {
		    clearTimeout(Music.ajaxTimer);
		    Music.ajaxTimer = null;
		    getEl('song-text').innerHTML = '';
		  });
    if (Music.selectedSong) {
      removeClassName(Music.selectedSong, 'selected-song');
    }
    Music.selectedSong = this;
    addClassName(Music.selectedSong, 'selected-song');
    var mp3File = ('../mp3/Eddy Boston - ' + songName + '.mp3').replace('?', '') + "?v=2";
    var pdfFile = ('../pdf/Eddy Boston - ' + songName + '.pdf').replace('?', '');
    var	player = getEl('mp3Player');
    Music.mp3File = mp3File;
    if (Music.player && Music.player.mp3Set) {
      player.mp3Set(mp3File);
    }
    getEl('song').style.display='';
    getEl('download-link').href = mp3File;
    getEl('download-link').innerHTML = 'Download mp3';
    var songIndex = parseInt(this.id.substring(5), 10);
    var el = getEl('pdf-link-li');
    if (songs[songIndex].haveMusic) {
      el.style.display = '';
      el.children[0].href = pdfFile;
    } else {
      el.style.display = 'none';
    }
    el = null;
  },

  makeSongSlug:function(name) {
    return name.toLowerCase().replace(/ /g, '-').replace('?', '').replace(/'/g, '');
  },

  mp3Finished:function()
  {
    var songIndex = 0;
    if (Music.selectedSong) {
      songIndex = parseInt(Music.selectedSong.id.substring(5), 10);
      songIndex = Music.nextSongIndex(songIndex);
    }
    Music.songClicked.call(getEl('song_' + songIndex));
    Music.play();
  },

  nextSongIndex:function(songIndex)
  {
    songIndex = (songIndex + 1) % songs.length;
    while (songs[songIndex].hidden) {
      songIndex = (songIndex + 1) % songs.length;
    }
    return songIndex;
  },
  
  play:function() {
    if (Music.player) {
      Music.player.mp3Play();
    }
  },

  pause:function() {
    if (Music.player) {
      Music.player.mp3Pause();
    }
  },

  onPlay:function() {
    getEl('listen-button').style.display = 'none';
    getEl('pause-button').style.display = '';
  },

  onPause:function() {
    getEl('listen-button').style.display = '';
    getEl('pause-button').style.display = 'none';
  }

};
