var Player = Class.create({
  element: null,
  mp3player: null,
  embedCode: '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="340" height="90"><param name="movie" value="http://visionstreetwear.com/site/flash/vision_player.swf?file={{filename}}&artist={{artist}}&songTitle={{title}}"/><param name="quality" value="high"/><param name="bgcolor" value="#000000"/><embed src="http://visionstreetwear.com/site/flash/vision_player.swf?file={{filename}}&artist={{artist}}&songTitle={{title}}" quality="high" bgcolor="#000000" width="340" height="90" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"/></object>',

  initialize: function(element, autoPlay) {
    this.element = $(element);

    this._image = this.element.down('.album-art');
    this._controls = this.element.down('.player-controls');
    this._tracklist = this.element.down('.track-list');
    this._tabDisplay = this.element.down('.tab-display');
    this._tabControl = this.element.down('.tab-control');
    this._aboutDisplay = this.element.down('.about');
    this._embedDisplay = this.element.down('.embed');

    this._navItem = $('music_player');
    this._navItemAnchor = this._navItem.down('a')
    this._navItemTooltip = this._navItem.down('.tip');
    this._playPause = this._navItem.down('a em');

    this.mp3player = new Mp3Player(this._controls.id, this._tracklist, '/site/flash/player.swf', autoPlay, 280, 40);

    this.setupObservers();
  },

  setupObservers: function() {
    document.observe('mp3player:onBuilt', function(event) {
      trace(this._currentTrack);
      //this.highlightTrack();
    }.bind(this));

    document.observe('mp3player:onPlay', function(event) {
      this.highlightTrack(event.memo.track);
    }.bind(this));

    this.element.select('.track a.title').each(function(anchor) {
      anchor.observe('click', this.playTrack.bindAsEventListener(this));
    }.bind(this));

    this.element.select('.tab-control a').each(function(anchor) {
      anchor.observe('click', function(event) {
        event.stop();
        this._tabControl.select('a').each(function(a) { a.removeClassName('active') }.bind(this));
        anchor.addClassName('active');
        this._tabDisplay.select('.tab').each(function(tab) { tab.hide() }.bind(this));
        $(anchor.rel).show();
      }.bind(this));
    }.bind(this));

    this._navItemAnchor.observe('mousemove', function(event) {
      var state = this.mp3player.getState();
      if (state == 'empty' || state == 'stopped' || state == 'error') return;

      if (this._hideNavItemTooltip) this._hideNavItemTooltip.cancel();
      var position = this._navItemAnchor.positionedOffset();
      var top = position.top + this._navItemAnchor.getHeight() + 5;
      var right = 0;

      this._navItemTooltip.setStyle({opacity: '1', position: 'absolute', display: 'block', top: top + 'px', right: right + 'px', 'z-index': 11});
    }.bindAsEventListener(this));

    this._navItemAnchor.observe('mouseout', function() {
      this._hideNavItemTooltip = new Effect.DropOut(this._navItemTooltip, {
        duration: .5,
        transition: Effect.Transitions.easeFrom
      });
    }.bind(this));

    this._playPause.observe('click', function(event) {
      var element = Event.element(event);
      this.mp3player.playToggle();
      if (element.hasClassName('playing')) element.removeClassName('playing');
      else element.addClassName('playing');
      event.stop();
    }.bindAsEventListener(this));
  },

  highlightTrack: function(track) {
    if (this._currentTrack) {
      this._currentTrack.removeClassName('active');
    }

    this._currentTrack = track;
    if (!this._currentTrack) return;
    var albumArt = this._currentTrack.down('.title').rel.split('|');
    if (albumArt[0]) this._image.src = albumArt[0];
    else this._image.src = 'site/images/blank.gif';

    this._currentTrack.addClassName('active');

    this.updateTooltip();
  },

  updateTooltip: function() {
    var track = this.mp3player.playlist.currentTrack();
    var artist = track.down('.title span').innerHTML;
    var title = track.down('.title').innerHTML.replace('<span>' + artist + '</span> - ', '');
    var albumArt = track.down('.title').rel.split('|');
    this._navItemTooltip.innerHTML = '<img src="' + albumArt[1] + '" align="left"/><label>' + title + '<br/>By ' + artist + '</label>';

    this._embedDisplay.down('#embed_code').value = this.embedCode.replace(/{{artist}}/g, artist).replace(/{{title}}/g, title.replace('<i></i>', '').replace('<I></I>', '')).replace(/{{filename}}/g, track.down('a').href);

    this._navItemTooltip.setStyle({visibility: 'hidden', display: 'block'});
    this._navItemTooltip.setStyle({width: (this._navItemTooltip.down('label').getWidth() + 73 + 20) + 'px'});
    this._navItemTooltip.setStyle({visibility: 'visible', display: 'none'});

    this._aboutDisplay.innerHTML = '';
    this._aboutDisplay.appendChild(new Element('h2').update(artist));
    this._aboutDisplay.appendChild(new Element('div').update(track.down('.information').innerHTML));
  },

  playTrack: function(event) {
    event.stop();
    var track = Event.element(event).up('.track');
    
    this.highlightTrack(track);
    this.mp3player.loadAndPlayTrack(track);
  },

  toggle: function(forcePause) {
//    if (this.mp3player.getState() == 'playing' && forcePause && !this._autoPaused) {
//      this.mp3player.pause();
//      this._autoPaused = true;
//    } else if (this._autoPaused) {
//      this.mp3player.play();
//      this._autoPaused = false;
//    }
  }
});


var Mp3Player = Class.create(SwfInstance, {
  playlist: null,

  initialize: function($super, element, playlistElement, url, autoPlay, width, height, options) {
    this.playlist = new Mp3Playlist(playlistElement);

    url += (this.playlist.currentTrackUrl()) ? '?' + Math.floor(Math.random() * 1000000) + '&as=0&file=' + this.playlist.currentTrackUrl() : '';
    $super(url, element, width, height, '10.0.0', {}, {wmode: 'transparent'}, {style: 'position:relative;top:4600px;'}, options);
  },

  setupObservers: function() {
    Event.observe(document, 'flash:onBuilt', this.onBuilt.bindAsEventListener(this));

    Event.observe(document, 'flash:onSongOver', this.loadNextTrack.bindAsEventListener(this));
    Event.observe(document, 'flash:onPlay', this.onPlay.bindAsEventListener(this));
  },
  
  onBuilt: function() {
    this.registerEvent('onSongOver', "SwfInstance.fireEvent('', 'flash:onSongOver')");
    this.registerEvent('onPlay', "SwfInstance.fireEvent('', 'flash:onPlay')");
    SwfInstance.fireEvent('', 'flash:onPlay');
    $('submusic_player').setStyle({visibility: 'hidden'});
    trace('testing');
  },

  onPlay: function() {
    SwfInstance.fireEvent('', 'mp3player:onPlay', {track: this.playlist.currentTrack()});
  },

  loadNextTrack: function() {
    this.loadAndPlay(this.playlist.nextTrack());
  },

  loadAndPlayTrack: function(track) {
    this.playlist.setCurrentTrack(track);
    this.loadAndPlay(this.playlist.currentTrackUrl());
  },

  loadAndPlay: function(url) {
    if (!url) return;
    this.load(url);
		this.play();
	},

  play: function() {
    this.swf.TCallLabel('/', 'play');
  },

	pause: function() {
    this.swf.TCallLabel('/', 'pause');
  },

  load: function(url) {
    this.swf.SetVariable('currentSong', url);
		this.swf.TCallLabel('/', 'load');
	},

  playToggle: function() {
    //if (this.getState() == 'empty') return;
    this.swf.TCallLabel('/', 'playToggle');
  },

  getState: function() {
		// returns 'empty', 'loading', 'playing', 'stopped', 'paused', 'finished', 'error'
    try {
      if (!this.swf || !this.swf.GetVariable) return 'stopped';

      var ps = this.swf.GetVariable('playingState');
      var ls = this.swf.GetVariable('loadingState');

      if (ps == 'playing') {
        if (ls == 'loaded') return ps;
        else return ls;
      }

      if (ps == 'stopped') {
        if (ls == 'empty') return ls;
        if (ls == 'error') return ls;
        else return ps;
      }

      return ps;
    } catch(e) {}
	},

	registerEvent: function(eventName, action) {
		// eventName is a string with one of the following values: onPlay, onStop, onPause, onError, onSongOver, onBufferingComplete, onBufferingStarted
		// action is a string with the javascript code to run.
    this.swf.SetVariable(eventName, action);
	}
});


var Mp3Playlist = Class.create(Enumerable, {
  element: null,
  tracks: [],

  initialize: function(element) {
    this.element = $(element);
    this.tracks = $(element).select('.track').collect(function(track) { return track; });

    this._currentTrack = parseInt(readCookie('Mp3Playlist.currentTrack'));
    if (!this.tracks[this._currentTrack]) this._currentTrack = 0;
  },

  setCurrentTrack: function(newTrack) {
    var index = 0;
    this.tracks.each(function(track) {
      if (track == newTrack) this._currentTrack = index;
      index++;
    }.bind(this))

    createCookie('Mp3Playlist.currentTrack', this._currentTrack);
  },

  currentTrack: function() {
    return this.tracks[this._currentTrack];
  },

  currentTrackUrl: function() {
    return (this.tracks[this._currentTrack]) ? this.tracks[this._currentTrack].down('a').href : '';
  },

  nextTrack: function() {
    this._currentTrack++;
    if (this._currentTrack >= this.tracks.length) this._currentTrack = 0;

    createCookie('Mp3Playlist.currentTrack', this._currentTrack);

    return this.currentTrackUrl();
  },

  // implement _each to use Enumerable methods
  _each: function(iterator) {
    return this.tracks._each(iterator);
  },

  _currentTrack: 0
});

function createCookie(name, value, days) {
  var expires = '';
  if (days) {
    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = '; expires=' + date.toGMTString();
  }
  document.cookie = name + '=' + value + expires + '; path=/';
}

function readCookie(name) {
  var nameEQ = name + '=';
  var ca = document.cookie.split(';');
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') c = c.substring(1, c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
  }
  return null;
}
