/* YoutubeRepeater player control code               */
/* Any use, dublication or derivative work based on  */
/* more than 1-2 functions from this code must first */
/* get acknowledgement from YoutubeRepeater prior to */
/* publication on the Internet.                      */
/* http://www.youtuberepeater.com/ContactUs          */

var ytplayer = null;
var volume = null;

// repeat vars
var repeat_mini = 0;
var repeat_url = '';

// start & end times for the video
var videoID  = '';
var startSec = 0;
var endSec   = 0;
var currSec  = 0;

// google analytics event
function gaEvent(s) 
{
  try 
  { 
    pageTracker._trackEvent(s, videoID); 
  } catch(err) {}
}

// preload all needed images so that they show fast
function preloadImages() 
{
  var d = document;
  if (d.images) 
  { 
    if (!d.ytpi) d.ytpi = new Array();
    var i;
    var j = d.ytpi.length;
    var a = preloadImages.arguments; 
    for (i=0; i<a.length; i++)
    {
      if (a[i].indexOf('#')!=0)
      { 
        d.ytpi[j] = new Image; 
        d.ytpi[j++].src = a[i];
      }
    }
  }
}

// get window width
var WW = 0;
var HH = 0;
function getWidthAndHeight()
{
  // diff browsers have diff ways... 
  if (typeof (window.innerWidth) == 'number')
  {
    // firefox & opera work very nice
    WW = window.innerWidth;
    HH = window.innerHeight;
  }
  else if (document.documentElement)
  {
    // IE 6+
    WW = document.documentElement.clientWidth;
    HH = document.documentElement.clientHeight;
  }
  else
  {
    WW = document.body.clientWidth;
    HH = document.body.clientHeight;
  }
  if (typeof (WW) != 'number') WW = 0;
  if (typeof (HH) != 'number') HH = 0;
}

function updateHTML(elmId, value) 
{
  var o = document.getElementById(elmId);
  if (o) o.innerHTML = value;
}

function updateImage(elmId, imgName)
{
  var o = document.getElementById(elmId);
  if (o) o.src = 'images/' + imgName;
}


// YOUTUBE
// YOUTUBE
// YOUTUBE


function onYouTubePlayerReady(playerId) 
{
  ytplayer = document.getElementById('myytplayer');
  setInterval (updateYTInfo, 250);
  ytplayer.addEventListener('onStateChange', 'onYTChange');
  ytplayer.addEventListener('onError', 'onYTError');
  ytplayer.loadVideoById(videoID, currSec);
  if (currVol) ytplayer.setVolume(currVol);
  // if we allow volume - set it's value
  if (volume && currVol) volume.setValue(currVol);
}

// state change (0 - finished playing)
function onYTChange(newState) 
{
  if (newState == 0) 
  {
    // finished playing one song - go to the next one (if possible)
    rePlay ();
  }
  else if (newState == 1)
  {
    // started playing
    if (inside_play_button == true)
      updateImage ('btnPlay', 'btn_pause_red.gif');
    else
      updateImage ('btnPlay', 'btn_pause_grey.gif');
    gaEvent('Play');
  }
  else if (newState == 2 || newState == 5)
  {
    // paused or stopped
    if (inside_play_button == true)
      updateImage ('btnPlay', 'btn_play_red.gif');
    else
      updateImage ('btnPlay', 'btn_play_grey.gif');
    gaEvent('Pause');
  }
}

// player error - most likely video removed - go to next one
function onYTError(errorCode) 
{
  gaEvent('Error'+errorCode);
  if (errorCode == 100)
  {
    alert("The video cannot play.  Please try again or go directly to YouTube.com");
  }
  else if (errorCode == 101 || errorCode == 150)
  {
    alert("The author of this video did not allow it to be embedded outside of YouTube.com");
  }
  else
  {
    alert("Unknown Youtube error: " + errorCode);
  }
}

// update info is called every 250ms
function updateYTInfo() 
{
  getWidthAndHeight(); // WW & HH
  
  // time
  var c = getCurrentTime();
  var t = getDuration();
  if (c <= 0 || t <= 0)
  {
    if (WW < 160) updateHTML ('time', '...');
    else updateHTML ('time', 'loading');
  }
  else
  {
    if (WW < 160) updateHTML ('time', formatTimeStr(c));
    else 
    {
      if (startSec <= 0 && (endSec <= 0 || endSec >= t)) updateHTML ('time', formatTimeStr(c)+' / '+formatTimeStr(t));
      else updateHTML ('time', formatTimeStr(c)+' / '+formatTimeStr(startSec)+'-'+formatTimeStr(endSec));
    }
  }
  
  // hq
  if (inside_hq_button == false)
  {
    if (isHQAvail())
    {
      if (isHQPlaying()) updateImage ('btnHQ', 'btn_hq_red.gif');
      else updateImage ('btnHQ', 'btn_hq_grey.gif');
    }
    else updateImage ('btnHQ', 'btn_hq_dis.gif');
  }
  
  // volume
  var vn = getVolume0to4();
  if (inside_volume) updateVolumeImage (vn, 'red');
  else updateVolumeImage (vn, 'grey');
  
  // rewind if playing outside of our range?
  if (endSec > 4 && endSec < t && c >= endSec && getPlayerState() == 1)
  {
    rePlay();
  }
}

function play()    { if (ytplayer) ytplayer.playVideo(); }
function pause()   { if (ytplayer) ytplayer.pauseVideo(); }
function stop()    { if (ytplayer) ytplayer.stopVideo(); }

function mute()    { if (ytplayer) ytplayer.mute(); }
function unMute()  { if (ytplayer) ytplayer.unMute(); }
function isMuted() { if (ytplayer) return ytplayer.isMuted(); else return true; }
function getVolume()  { if (ytplayer) return ytplayer.getVolume(); else return 0; }
function setVolume(v) { if (ytplayer) ytplayer.setVolume(v); }

function getCurrentTime() { if (ytplayer) return ytplayer.getCurrentTime(); else return 0; }
function getDuration()    { if (ytplayer) return ytplayer.getDuration(); else return -1; }
function getPlayerState() { if (ytplayer) return ytplayer.getPlayerState(); else return -1; }
function getBytesLoaded() { if (ytplayer) return ytplayer.getVideoBytesLoaded(); else return -1; }
function getBytesTotal()  { if (ytplayer) return ytplayer.getVideoBytesTotal(); else return -1; }
function getStartBytes()  { if (ytplayer) return ytplayer.getVideoStartBytes(); else return -1; }
function getAvailQualities()   { if (ytplayer) return ytplayer.getAvailableQualityLevels(); else return ''; } // returns Array of strings
function getPlaybackQuality()  { if (ytplayer) return ytplayer.getPlaybackQuality(); else return '';  }  // returns string (large, medium and small)
function setPlaybackQuality(q) { if (ytplayer) ytplayer.setPlaybackQuality(q); } // string param

function seekTo(seconds)  { if (ytplayer) ytplayer.seekTo(seconds, true); }

function formatTimeStr(total_secs)
{ 
  var m = parseInt (total_secs / 60);
  var s = parseInt (total_secs - m * 60);
  if (s < 10) return m + ':0' + s;
  else return m + ':' + s;
}

function rePlay ()
{
  if (ytplayer)
  {
    pause ();
    seekTo (startSec);
    play ();
    httpPostRepeat (); // post before next play in case of a msg
    gaEvent('Repeat');
  }
  else
  {
    alert ('player did not initialize');
  }
}

// POSTING
// POSTING

var ok_to_post = true;
function setOkToPost() { ok_to_post = true; }
function httpPostRepeat() 
{
  if (!ok_to_post) return;
  var RR1 = createHttpPostRepeat();
  if (RR1 != null)
  {
    RR1.onreadystatechange = function() 
    {
      if (RR1.readyState == 4) 
      {
        HandleOurPostMsg(RR1);
      }
    }
    RR1.send('m='+repeat_mini+'&v='+videoID+'&s='+startSec+'&e='+endSec+'&w='+WW+'&h='+HH);
  }
  // next post at least in 1 minute or half of the video duration
  ok_to_post = false;
  var t = Math.max(60,getDuration()/2);
  setTimeout ('setOkToPost()', t*1000);
}
function createHttpPostRepeat()    
{
  var req = null;
  try 
  {
    if (window.XMLHttpRequest) req = new XMLHttpRequest();
    else if (window.ActiveXObject) req = new ActiveXObject("Microsoft.XMLHTTP");
    req.open('POST', repeat_url, true);
    req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  }
  catch (err) { req = null; }
  return req;
}
// handle if there's a message in response
function HandleOurPostMsg(RR1)
{
  // check if there's a message for better video
  var s = RR1.responseText;
  var sMsg = GetMyParam(s,'msg');
  var sURL = GetMyParam(s,'url');
  var sID  = GetMyParam(s,'id');
  var sNew = GetMyParam(s,'new');
  // alert ('s=' + s + '\r\nmsg=' + sMsg + '\r\nurl=' + sURL + '\r\nid=' + sID + '\r\nnew=' + sNew);
  if (sMsg != '')
  {
    // show alert or confirm, go to new url if needed
    pause();
    var c = 0;
    try // if this fails, we still need to update server not to send anymore messages
    {
      if (sURL != '') 
      {
        self.focus();
        c = confirm(sMsg);
        if (c)
        {
          if (sNew == '1') window.open(sURL, "_blank", "menubar=1,toolbar=1,location=1,scrollbars=1,status=1,directories=1,resizable=1");
          else window.location = sURL;
        }
      }
      else alert (sMsg);
    }
    catch (err) { }
    if (!c) play(); // if we did not load another video, start repeating this one again
    // update our server with the answer
    var RR2 = createHttpPostRepeat();
    RR2.onreadystatechange = function() { } // nothing
    RR2.send('id='+sID+'confirm='+Number(c));
  }
}
function GetMyParam(s,pName) // get a param from our response
{
  var i1 = s.indexOf('<'  + pName + '>');
  if (i1 >= 0)
  {
    i1 += pName.length+2;
    var i2 = s.indexOf('</' + pName + '>');
    if (i2 > i1) return s.substring (i1, i2);
  }
  return '';
}

// POSTING
// POSTING


// HELPERS
// HELPERS

function isHQAvail ()
{
  try {
    var s = getAvailQualities().toString();
    if (s.indexOf('large') >= 0) return true;
  } catch (err) { }
  return false;
}
function isHQPlaying ()
{
  try {
    var s = getPlaybackQuality();
    if (s.indexOf('large') >= 0 || s.indexOf('hd720') >= 0) return true;
  } catch (err) { }
  return false;
}
function getVolume0to4 ()
{
  if (isMuted()) return 0;
  var v = getVolume();
  if (v <= 0) return 0;
  else if (v < 25) return 1;
  else if (v < 50) return 2;
  else if (v < 75) return 3;
  else return 4;
}
function updateVolumeImage (vn, red_grey)
{
  updateImage ('btnVol', 'btn_vol_' + red_grey + vn + '.gif');
}
function isVolumeBarVisible ()
{
  var vol = document.getElementById('popup_vol');
  if (vol == null) return false;
  if (vol.style.visibility == 'visible') return true;
  return false;
}
function showVolumeBar (b)
{
  var vol = document.getElementById('popup_vol');
  if (b == true) vol.style.visibility = 'visible';
  else vol.style.visibility = 'hidden';
}

// CONTROLS
// CONTROLS
// CONTROLS

var inside_play_button = false;
function onPlayHover()
{
  inside_play_button = true;
  if (getPlayerState() == 1) updateImage ('btnPlay', 'btn_pause_red.gif');
  else updateImage ('btnPlay', 'btn_play_red.gif');
}

function onPlayOut()
{
  inside_play_button = false;
  if (getPlayerState() == 1) updateImage ('btnPlay', 'btn_pause_grey.gif');
  else updateImage ('btnPlay', 'btn_play_grey.gif');
}

function onPlayClick()
{
  if (getPlayerState() == 1) pause ();
  else 
  {
    if (opener && opener.closed == false) 
    {
      try { opener.pause(); } catch (err) { }
    }
    play ();
  }
  return false;
}

function onTimeHover() {  }
function onTimeOut()   {  }
function onTimeClick() { return false; }

var inside_hq_button = false;
function onHQHover() 
{
  inside_hq_button = true;
  if (isHQAvail())
  {
    if (isHQPlaying()) updateImage ('btnHQ', 'btn_hq_grey.gif');
    else updateImage ('btnHQ', 'btn_hq_red.gif');
  }
}
function onHQOut()
{
  inside_hq_button = false;
  if (isHQAvail())
  {
    if (isHQPlaying()) updateImage ('btnHQ', 'btn_hq_red.gif');
    else updateImage ('btnHQ', 'btn_hq_grey.gif');
  }
}
function onHQClick() 
{  
  if (isHQAvail())
  {
    if (isHQPlaying()) 
    {
      setPlaybackQuality('medium');
    }
    else 
    {
      // if large is avail - use it, if not - use hd720
      var s = getAvailQualities().toString();
      if (s.indexOf('large') >= 0) setPlaybackQuality('large');
      else if (s.indexOf('hd720') >= 0) setPlaybackQuality('hd720');
    }
  }
  return false;
}

var inside_volume = false;
var delay_hide = null;
function delayHideVolume()
{
  inside_volume = false;
  showVolumeBar(false);
  updateVolumeImage (getVolume0to4(), 'grey');
}
function onVolHover() 
{
  inside_volume = true;
  clearTimeout(delay_hide);
  updateVolumeImage (getVolume0to4(), 'red');
  showVolumeBar(true);
}
function onVolOut()   
{
  delay_hide = setTimeout('delayHideVolume()', 200);
}
function onVolClick() 
{
  if (isMuted()) unMute ();
  else mute();
  return false;
}
function onVolBarHover()
{
  inside_volume = true;
  clearTimeout(delay_hide);
}
function onVolBarOut()
{
  delay_hide = setTimeout('delayHideVolume()', 200);
}







// CALL INITS
// CALL INITS
// CALL INITS

google.load('swfobject', '2.1');
preloadImages ('images/btn_play_grey.gif',  'images/btn_play_red.gif', 
               'images/btn_pause_grey.gif', 'images/btn_pause_red.gif', 
               'images/btn_hq_grey.gif',    'images/btn_hq_red.gif', 'images/btn_hq_dis.gif',
               'images/btn_vol_grey0.gif',  'images/btn_vol_red0.gif',
               'images/btn_vol_grey1.gif',  'images/btn_vol_red1.gif',
               'images/btn_vol_grey2.gif',  'images/btn_vol_red2.gif',
               'images/btn_vol_grey3.gif',  'images/btn_vol_red3.gif',
               'images/btn_vol_grey4.gif',  'images/btn_vol_red4.gif');
              
