
var fake_player = function() {
  var paused = 0.0, // total paused so far
    pause_started = 0.0, // pause started
    play_started = 0, // play started
    playing = false;
  return {
    getCurrentTime: function() {
      
      if ( play_started == 0 ) {
        return 0.0;
      }
      else {
        if ( playing ) {
          return ( new Date().getTime() - play_started - paused ) / 1000.0;
        }
        else {
          return ( pause_started - play_started - paused ) / 1000.0;
        }
      }
    },

    getDuration: function() {
      return 999.0;
    },

    playVideo: function() {
      if ( !playing ) {
        playing = true;
        if ( play_started != 0 ) {
          paused += new Date().getTime() - pause_started;
        }
        else {
          play_started = new Date().getTime();
        }
      }
    },

    pauseVideo: function() {
      if ( playing ) {
        playing = false;
        pause_started = new Date().getTime();
      }
    },

    seekTo: function( newpos, dummy ) {
      paused = 0.0;
      pause_started = 0.0;
      playing = true;
      play_started = new Date().getTime() - newpos * 1000.0;
    },
    
    fake: true
  }
},

load_url_callback = { 
    success:load_url_success, 
    failure: load_url_failure, 
    argument: []
},

checkPlayerTimeout = null,
  instrument,
  first = true;

  function getInternetExplorerVersion() {
    // Returns the version of Windows Internet Explorer or a -1
    // (indicating the use of another browser).
    var rv = -1, // Return value assumes failure.
      ua, re
    if (navigator.appName == 'Microsoft Internet Explorer') {
       ua = navigator.userAgent;
       re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
       if (re.exec(ua) != null)
          rv = parseFloat( RegExp.$1 );
    }
    return rv;
  }

  function load_url_failure(o) {
    show_error( "Failed to load URL" ); 
  }

  function note_formatter(elCell, oRecord, oColumn, oData) {
    var note = oRecord.getData("note").replace('#','s').replace(' ','_'); 
    if ( note == "None" ) {
      elCell.innerHTML = "None";
    }
    else {
      elCell.innerHTML = "<span style='float:left'>" + oRecord.getData("note") + "</span> <img src='http://static.supernifty.com.au/images/cache/chord_" + instrument.replace(" ", "-" ) + "_" + note + ".png' style='float: right; vertical-align: middle' width='64' height='64'/>";
    }
  }

  function load_url_success(o) {
    parse_xml(o.responseXML.documentElement)
  }

  function transpose_media(amt) {
    transpose_all(amt);
    document.getElementById("media_key").innerHTML = "Done";
  }

  function parse_xml(root) {
    show_progress( "Please wait. Parsing..." ); 
    var details = xml_details(root),
      params, more_params, atts, dataSource;
    // doc details
    document.getElementById("title").innerHTML = details['title'];
    document.getElementById("artist").innerHTML = details['artist'];
    instrument = details['instrument'];
    alert( "about to so" );
    set_option( 'instrument', instrument );
    alert( "about to check mk" );
    if ( details['media_key'] ) {
      alert( "about to set mk" );
      document.getElementById("media_key").innerHTML = "<a href='javascript:void(0)' onclick='transpose_media(" + details['media_key'] + "); return false'>Transpose to performance</a>";
      alert( "done set mk" );
    }
    alert( "done check mk" );
    // media
    if ( details['media_type'] == "youtube" ) {
      params = "&enablejsapi=1&rel=0&showsearch=0&playerapiid=player";
      more_params = { allowScriptAccess: "always" };
      atts = { id: "player" };
      swfobject.embedSWF(details['media_url'] + params, "media", "425", "356", "8", null, null, more_params, atts);
    }
    else if ( details['media_type'] == "none" ) {
      noMediaPlayer( "player" );
    }
    else {
      show_error( "Unsupported media type '" + details['media_type'] + "'" );
      return;
    }
    // playalong events

    YAHOO.widget.DataTable.Formatter.note_formatter = note_formatter;
    dataSource = new YAHOO.util.DataSource(details['event_data']);
    dataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY;
    dataSource.responseSchema = { fields: ["note","lyric","start","finish"] }; 
    dataTable = new YAHOO.widget.DataTable("data", columnDefinitions, dataSource, { scrollable: true, height: "280px" } ); 
    dataTable.subscribe('rowSelectEvent', onRowSelect );

    // select first row
    dataTable.selectRow(dataTable.getTrEl(0));
    selected_row_index = 0;
    selected_row_max = details['events_length'];

    // progress bar
    progress = new YAHOO.widget.ProgressBar({id:'progress', value:0});
    progress.get('anim').duration = 0;
    progress.render('progress');
    //
    // good
    show_good( 'Ready. Press play to start.' );
    // events
    YAHOO.util.Event.addListener(document.getElementById("instrument"), "change", instrumentChanged); 
  }

  function instrumentChanged(e) {
    instrument_item = document.getElementById("instrument");
    instrument = instrument_item.options[instrument_item.selectedIndex].value;
    if ( dataTable != null ) {
      dataTable.render();
    }
  }

  function onRowSelect(e) {
    e.el.scrollIntoView( false );
    scroll = dataTable.getBdContainerEl().scrollTop;
    var index = dataTable.getTrIndex(e.el),
      total = dataTable.getTrIndex(dataTable.getLastTrEl());
    if ( index > 1 && index < total-1 ) {
      if ( isIE8 ) {
        scroll += 72; // the mystery of ie
      }
      else {
        scroll += 160;
      }
    }
    else if ( index > 2 && index < total ) {
      scroll += 80;
    }
    setTimeout( fixScroll, 0 );
  }

  function fixScroll() {
    //var anim = new YAHOO.util.Scroll( dataTable.getBdContainerEl(), { scroll: { to:[0,scroll] } } ); 
    //anim.duration = 0.5;
    //anim.animate();
    dataTable.getBdContainerEl().scrollTop = scroll;
  }

  function onYouTubePlayerReady(playerId) {
    player = document.getElementById("player");
    setInterval(updateYoutubePlayerInfo, 250);
    player.addEventListener("onStateChange", "onYouTubePlayerStateChange" );
  }

  function onYouTubePlayerStateChange(newState) {
    if ( first && ( newState == 1 || newState == 2 ) ) { // playing
      checkPlayerTimer = setTimeout( checkPlayer, 4000 );
      first = false;
    }
  }

  function noMediaPlayer(playerId) {
    player = fake_player();
    setInterval(updateYoutubePlayerInfo, 250);
    var target = document.getElementById("media"),
      message = '<b>Sorry!</b><br/>The Youtube video is no longer available for this song.<br/><br/><b>You can still play along!</b><br/>Just use the controls on the right.';
    if ( target ) {
      document.getElementById("media").style.width = '320px';
      document.getElementById("media").innerHTML = message;
    }
    show_good( message );
  }

  // rely on youtube for song position (?)
  function updateYoutubePlayerInfo() {
    var newPlayTime = player.getCurrentTime();
    newPlayTime += 0.1; // delay fix
    if ( newPlayTime != playTime ) {
      setPlayTime( newPlayTime );
    }
  }

  function setPlayTime( newValue ) {
    playTime = newValue;
    // update the display
    // check selected row
    var oRecord = dataTable.getRecord( selected_row_index ),
      newRow, origColor, pulseColor, rowColorAnim, onComplete, percent;
    if ( playTime > oRecord.getData("finish") || playTime < oRecord.getData("start") ) {
      dataTable.unselectRow(dataTable.getTrEl(selected_row_index));
      // forward
      while ( playTime > oRecord.getData("finish") && selected_row_index < selected_row_max-1) {
        ++selected_row_index;
        oRecord = dataTable.getRecord( selected_row_index );
      }
      // backward
      while ( playTime < oRecord.getData("start") && selected_row_index > 0) {
        --selected_row_index; 
        oRecord = dataTable.getRecord( selected_row_index );
      }
      newRow = dataTable.getTrEl(selected_row_index);
      // update final finish time if last row
      if ( selected_row_index == selected_row_max-1 && oRecord.getData("finish") == 9999 ) {
        oRecord.setData( "finish", player.getDuration() );
      }
      dataTable.selectRow(newRow);
      origColor = YAHOO.util.Dom.getStyle(newRow.cells[0], "backgroundColor");
      pulseColor = "#ff0";
      rowColorAnim = new YAHOO.util.ColorAnim(newRow.cells, { backgroundColor:{to:origColor, from:pulseColor}, duration:1});
      onComplete = function() {
        rowColorAnim = null;
        YAHOO.util.Dom.setStyle(newRow.cells, "backgroundColor", "");
      }
      rowColorAnim.onComplete.subscribe(onComplete);
      rowColorAnim.animate();
    }
    // set progress
    percent = 100 * ( playTime - oRecord.getData("start") ) / ( oRecord.getData("finish") - oRecord.getData("start") );
    progress.set('value', percent );

  }

  function checkPlayer() {
    if ( player && !player.fake && player.getCurrentTime() == 0 ) {
      noMediaPlayer( "player" );
    }
    checkPlayerTimer = null;
  }

  function play() {
    if (player) {
      player.playVideo();
      if ( first ) {
        checkPlayerTimer = setTimeout( checkPlayer, 4000 );
        first = false;
      }
    }
  }

  function pause() {
    if (player) {
      player.pauseVideo();
      if ( checkPlayerTimer ) {
        checkPlayerTimer.clearTimeout();
        checkPlayerTimer = null;
      }
    }
  }

  function restart() {
    if (player) {
      player.seekTo( 0, true );
      player.playVideo();
    }
  }


