var onYouTubePlayerReady = null;
var onYouTubePlayerStateChange = null;
var onYouTubePlayerError = null;

var jtcMSS = Class.create({

initialize: function(options){
  // create YouTube event listeners
  if (!onYouTubePlayerReady){
    onYouTubePlayerReady = function(playerid){
      playerid=unescape(playerid);
      this.debug('window.onYouTubePlayerReady()', 'pushing call to '+playerid);
      this.videos.get(playerid).onYouTubePlayerReady(playerid);
    }.bind(this);
  }
  if (!onYouTubePlayerStateChange){
    onYouTubePlayerStateChange = function(newState){
      this.debug('onYouTubePlayerStateChange()', 'playerState: ' + newState);
      var video = this.getCurrentVideo();
      if (video){
        switch (newState){
          case 1: // playing
            this.setMediaStarted();
            break;
          case 5: // cued
            this.setMediaStopped();
            break;
          default:
            break;
        }
        // pass state change to the video itself to handle internally
        video.onYouTubePlayerStateChange(newState);
      }
    }.bind(this);
  }
  if (!onYouTubePlayerError){
    onYouTubePlayerError = function(errorCode){
      this.debug('onYouTubePlayerError()', 'An error occured of type: ' + errorCode);
    }.bind(this);
  }

  this.name = 'initialized';
  this.slide_show = null;
  this.videos = $H();
  this.media_playing = false;
  this.has_mouse = false;
  this.options = Object.extend({
    id: 'jtcMSS',
    transition: 750,
    speed: 5000,
    class_slide: 'jtcMSS_fade',
    class_thumb_highlight: 'jtcMSS_highlight',
    widget_tmpl: new Template(
        '<div class="_main">#{slides}</div><div class="_links">#{links}</div><div class="_descriptions">#{descriptions}#{controls}</div>'
      ),
    slide_tmpl: new Template(
        '<div class="#{class_slide}" id="sld_#{id_code}" style="#{style_slide}"><a href="#{link}" rel="#{id_code}"><img src="#{image}" title="#{title}" alt="#{title}" style="#{image_style}"/></a><div id="video_#{id_code}"></div></div>'
      ),
    link_tmpl: new Template(
        '<div class="#{class_thumb_highlight}"><a href="" rel="#{id_code}"><img src="#{thumb}" title="#{title}" alt="#{title}" /></a></div>'
      ),
    desc_tmpl: new Template(
        '<div class="#{class_slide}" id="desc_#{id_code}" style="width:100%;height:100%;#{style_slide}">#{description}#{controls}</div>'
      ),
    controls_tmpl: new Template(
'<div class="media_controls" style="background-color: gray; padding-left:3px; padding-top:3px; position:absolute;position: absolute; right: 4px; bottom: 4px;float:right:z-index:100px;">'+
'<a class="play" href=""><img style="width:32px;border:0;" src="/qs/images/icons/blue/play_btn.png" title="Play" alt="Play" /></a>'+
'<a class="pause" href=""><img style="width:32px;border:0;" src="/qs/images/icons/blue/pause_btn.png" title="Pause" alt="Pause" /></a>'+
'<a class="stop" href=""><img style="width:32px;border:0;" src="/qs/images/icons/blue/stop_btn.png" title="Stop" alt="Stop" /></a>'+
//'<a class="mute" href=""><img style="width:32px;border:0;" src="/qs/images/icons/blue/sound_btn.png" title="Mute" alt="Mute" /></a>'+
//'<a class="unMute" href=""><img style="width:32px;border:0;" src="/qs/images/icons/blue/sound_btn.png" title="Unmute" alt="Unmute" /></a>'+
'</div>'
      ),
    slides: null,
    debug: null
  }, options || {});
  this.options.transition = parseInt(this.options.transition)/1000;
  if (this.options.slides){
    this.setupHTML();
    $($(this.options.id).select('._links')[0]).select('a').each(function(s){s.observe('click',this.loadSlide.bind(this));}.bind(this));
    $(this.options.id).observe('mouseenter',this.mouseEntered.bind(this));
    $(this.options.id).observe('mouseleave',this.mouseLeft.bind(this));

    this.videos.each(function(pair){ pair.value.loadPlayer();});

    this.start();
  }

},

playVideo: function(){
  var video = this.getCurrentVideo();
  if (video){
    video.playVideo();
    this.setMediaStarted();
  }
},

pauseVideo: function(){
  var video = this.getCurrentVideo();
  if (video){
    video.pauseVideo();
  }
},

stopVideo: function(){
  var video = this.getCurrentVideo();
  if (video){
    video.stopVideo();
    this.setMediaStopped();
  }
},

muteVideo: function(){
  var video = this.getCurrentVideo();
  if (video){
    video.muteVideo();
  }
},

unMuteVideo: function(){
  var video = this.getCurrentVideo();
  if (video){
    video.unMuteVideo();
  }
},

setVideoVolume: function(){
  var volume = parseInt(document.getElementById("volumeSetting").value);
  var video = this.getCurrentVideo();
  if (video){
    video.setVideoVolume(volume);
  }
},

setupHTML: function(){
  var ss = {slides:'', links:'', descriptions:'', controls:''};
  var opts = Object.clone(this.options);
  var self = this;
  this.options.slides.each(function(s, idx){
    var obj = Object.extend(opts, s);
    obj.style_slide = obj.image_style = '';
    obj.controls='';
    if (idx!=0){
      obj.class_thumb_highlight = '';
      obj.style_slide = 'display:none;';
    }
    if (obj.video){
      obj.image_style = 'display:none';
      self.debug('setupHTML()', 'creating jtcYTC video object for '+obj.id_code);
      var vid = new jtcYTC({
        replace_el: 'video_'+obj.id_code,
        object_id: obj.id_code,
        video_id: obj.id_code,
        debug: obj.debug
      });
      self.videos.set(obj.id_code, vid);
      obj.image = vid.getImage(0);
      obj.thumb = vid.getImage(1);
      obj.controls = self.options.controls_tmpl.evaluate({});
    }
    ss.slides += self.options.slide_tmpl.evaluate(obj);
    ss.links += self.options.link_tmpl.evaluate(obj);
    ss.descriptions += self.options.desc_tmpl.evaluate(obj);
  });
  this.debug('setupHTML()', 'writing media slide show to element, '+this.options.id);
  $(this.options.id).update(this.options.widget_tmpl.evaluate(ss));
  $(this.options.id).select('a').each(function(s){
    // catch any empty anchors and prevent them from doing anything...
    if (s.readAttribute('href').blank()) {
      s.writeAttribute('href', null);
    }
  });
  $$('.media_controls a').each(function(s){
	var ctrl = $w(s.className)[0];
    $(s).observe('click',function(e){e.stop();self[ctrl+'Video']();});
  });
},

loadSlide: function(e, el){
  this.debug('loadSlide()');
  if (e){
    e.stop();
    el = el || e.element();
  }
  if (el == null) return;

  while (el.tagName && el.tagName.toLowerCase() != 'a'){
    el = el.up();
  }

  var slid=el.getAttribute('rel');
  $('sld_'+slid).siblings().invoke('fade', {duration: this.options.transition });
  $('desc_'+slid).siblings().invoke('fade', {duration: this.options.transition });
  $('sld_'+slid).appear({duration: this.options.transition });
  $('desc_'+slid).appear({duration: this.options.transition });

  var cdiv = el.up();
  var tclass = this.options.class_thumb_highlight;
  cdiv.siblings().invoke('removeClassName', tclass);
  cdiv.addClassName(tclass);
},

nextSlide: function(){
  this.debug('nextSlide()');
  var curthumb = this.getCurrentThumb();
  if (curthumb){
	this.debug('nextSlide()', 'getting next element from '+curthumb.tagName);
    var nextthumb = curthumb.next();
    if (nextthumb==undefined){
      nextthumb = curthumb.up().firstDescendant();
    }
    this.loadSlide(null, nextthumb.firstDescendant());
  }
},

getCurrentThumb: function(){
  this.debug('getCurrentThumb()');
  return $($(this.options.id).select('._links')[0]).descendants().find(function(s){return s.hasClassName(this.options.class_thumb_highlight);}.bind(this));
},

getCurrentVideo: function(){
	var video = false;
    var curthumb = this.getCurrentThumb();
    if (curthumb){
      video = this.videos.get(curthumb.firstDescendant().getAttribute('rel'));
    }
    return video;
},

start: function(){
  if (!this.media_playing && !this.has_mouse){
    this.debug('start()', 'starting slideshow');
    this.slide_show = setInterval(function(){this.nextSlide();}.bind(this), this.options.speed);
  }
},

stop: function(){
  this.debug('stop()', 'stopping slideshow');
  clearInterval(this.slide_show);
},

mouseEntered: function(e){
  if (!this.has_mouse){
    this.debug('mouseEntered()', 'mouse has entered player space');
    this.stop();
    this.has_mouse = true;
  }
},

mouseLeft: function(e){
  if (this.has_mouse){
    this.debug('mouseLeft()', 'mouse has left the building');
    this.has_mouse = false;
    this.start();
  }
},

setMediaStarted: function(){
  this.debug('setMediaStarted()', 'started media playback');
  this.stop();
  this.media_playing = true;
},

setMediaStopped: function(){
  if (this.media_playing){
    this.debug('setMediaStopped()', 'media playback has stopped');
    this.media_playing = false;
    this.start();
  }
},

debug: function(method, msg){
  msg = msg||'';
  if (this.options.debug && $(this.options.debug)){ $(this.options.debug).insert({top:'jtcMSS::'+method+': '+msg+'<br/>'}); }
}

});

