// ajax loader
var PageLoader = {
  // initializer
  init: function() {
    this.content = $('content-main');
    this.cartContents = $('shopping-cart-contents');
    this.body = $(document.body);

    this.request = new Request.HTML({
      update: this.content,
      link: 'cancel',
      method: 'get',
      onSuccess: this.loadFinished.bind(this)
    });

    this.buyRequest = new Request.HTML({
      update: this.cartContents,
      link: 'chain',
      method: 'get',
      onSuccess: this.loadBuyFinished.bind(this)
    });

    this.attach();
    this.attachBuyLinks();

    unFocus.History.addEventListener('historyChange', this.historyListener.bind(this));

    // deep linking
    var url = this.cleanUrl(unFocus.History.getCurrent(), true);
    this.historyListener(url);
  },
  // attach generic ajax links
  attach: function() {
    $$('.ajax-link').each(this.attachLink, this);
  },
  // attach links inside content element
  attachContentLinks: function() {
    this.content.getElements('.ajax-link').each(this.attachLink, this);
    this.content.getElements('.ajax-letter-link').each(this.attachLetterLink, this);
  },
  // attach buy track links
  attachBuyLinks: function() {
    this.content.getElements('.buy-link').each(this.attachBuyLink, this);
  },
  // attach single link
  attachLink: function(elem) {
    // prevent double attach
    if (!elem.retrieve('loaderAttached')) {
      elem.addEvent('click', this.elemClick.bindWithEvent(this, elem));
      elem.store('loaderAttached', true);
    }
  },
  // attach artist letter links
  attachLetterLink: function(elem) {
    elem.addEvent('click', this.elemLetterClick.bindWithEvent(this, elem));
  },
  // attach buy mp3/wav links
  attachBuyLink: function(elem) {
    elem.addEvent('click', this.elemBuyClick.bindWithEvent(this, elem));
  },
  // ajax link click handler
  elemClick: function(e, elem) {
    e.stop();

    var url = elem.get('href');
    if (url) {
      url = this.cleanUrl(url);
      unFocus.History.addHistory(url);
    }

    return false;
  },
  // artist letter click handler
  elemLetterClick: function(e, elem) {
    e.stop();

    var url = elem.get('href');
    if (url) {
      var letterElemId = url.split('#').getLast();
      var letterElem = $(letterElemId);

      if (letterElem) {
        this.scroll(letterElem.getPosition().y);
      }
    }

    return false;
  },
  // buy mp3/wav click handler
  elemBuyClick: function(e, elem) {
    e.stop();
    
    var elemId = elem.get('id');
    if (elemId) {
      var props = elemId.split('-');
      if (props.length == '3') {
        if (props[0] == 'track') {
          var id = props[1].toInt();
          var mode = props[2];

          this.elemBuySetText(elem, mode);
          this.doBuyRequest(id, mode);
          BHPlayer.addCartItem(id);
        }
      }
    }

    return false;
  },
  playerBuyRequest: function(id, mode) {
    var y = $('shopping-cart-contents').getPosition().y;
    BHPlayer.setBought(id);
    this.doBuyRequest(id, mode);
  },
  doBuyRequest: function(id, mode) {
    var url = '/add-to-cart/' + id + '/' + mode;
    this.buyRequest.get(url);
  },
  elemBuySetText: function(elem, mode) {
    if (mode == 'wav') {
      var secondElemId = elem.get('id').replace('wav', 'mp3');
    }
    else {
      var secondElemId = elem.get('id').replace('mp3', 'wav');
    }

    if (!elem.retrieve('oldHtml')) {
      elem.store('oldHtml', elem.get('html'));
    }

    elem.set('html', '<div class="c">Added!</div>');

    var secondElem = $(secondElemId);
    if (secondElem) {
      var h = secondElem.retrieve('oldHtml');
      if (h) {
        secondElem.set('html', h);
        secondElem.store('oldHtml', null);
      }
    }
  },
  // url clean-up
  cleanUrl: function(url, forceBlank) {
    url = url.replace('http://downloads.bounce-heaven.com/', '').trim();

    if (url[ url.length - 1] == '/') {
      url = url.substring(0, url.length - 1);
    }

    if (url[ 0 ] == '.') {
      url = '/' + url.substring(1);
    }

    if (url == '' && !forceBlank) {
      url = '/';
    }

    return url;
  },
  // loads content url
  load: function(url) {
    this.content.empty().addClass('content-loading');
    this.url = url;
    this.request.get(url);
  },
  // content loader callback
  loadFinished: function() {
    this.content.removeClass('content-loading');
    this.attachContentLinks();
    this.attachBuyLinks();

    var t = $('document-title').get('html');
    if (t) {
      document.title = t.replace('&amp;', '&');
    }

    if (_gaq) {
      _gaq.push(['_trackPageview', '/' + this.url]);
    }
  },
  // buy mp3/wav loader callback
  loadBuyFinished: function() {
    BHPlayer.getNewPosition();
    BHPlayer.scroll();
  },
  // scrolls to passed y position
  scroll: function(y) {
    var s = this.body.getScroll();
    scroll(s.x, y);
  },
  // history manager callback
  historyListener: function(url) {
    if (url) {
      this.scroll(0);
      this.load(url);
    }
    else {
      _gaq.push(['_trackPageview']);
    }
  }
}

// flash player wrapper
var BHPlayer = {
  playlist: {},
  cartItems: [],
  ready: false,

  init: function() {
    this.placeholder = $('player-placeholder');
    this.getNewPosition();

    this.playerWrap = $('playerwrap');
    this.playerWrap.setStyles({ width: 255, height: 420 });

    this.playerElem = $('player');
    this.playerElem.setStyles({ position: 'absolute', left: 0, top: this.playerY });
    this.playerElem.set('tween', { duration: 'long', link: 'cancel', transition: 'back:out' });

    // swf player instance
    this.player = new Swiff('player-waveform.swf', {
      id: 'playerswf',
      width: 250,
      height: 410,
      params: { wmode: 'transparent' } // hide background
    }).inject('player');

    this.saveRequest = new Request({
      url: '/save-playlist',
      link: 'chain',
      method: 'post'
    });

    this.currentDelay = 0;
    window.addEvent('scroll', this.onWindowScroll.bind(this));
    this.scroll();
  },
  onWindowScroll: function() {
    if (this.currentDelay) {
      $clear(this.currentDelay);
    }

    this.currentDelay = this.scroll.delay(200, this);
  },
  scroll: function() {
    var windowY = window.getScroll().y;
    var currentY = this.playerElem.getStyle('top').toInt();
    var tweenTo = 0;

    if (windowY > this.playerY) {
      tweenTo = windowY + 20;
    }
    else if (currentY > this.playerY) {
      windowY = this.playerY;
    }
    
    if (tweenTo) {
      this.playerElem.tween('top', tweenTo);
    }
    else {
      this.playerElem.get('tween').cancel();
      this.playerElem.setStyle('top', this.playerY);
    }
  },
  addToPlaylist: function(data) {
    var i, j, item, elem;
    for (i = 0, j = data.length; i < j; i++) {
      var item = data[ i ];
      if (!this.playlist[ item.id ]) {
        this.playlist[ item.id ] = item;
      }

      elem = $('play-link-' + item.id);
      if (elem) {
        elem.addEvent('click', this.play.bindWithEvent(this, [item, true]));
      }

      elem = $('play-link-cue-' + item.id);
      if (elem) {
        elem.addEvent('click', this.play.bindWithEvent(this, [item, false]));
      }
    }
  },
  addCartItem: function(id) {
    var id = id.toInt();
    if (!isNaN(id) && this.cartItems.indexOf(id) == -1) {
      this.cartItems.push(id);
      this.player.remote('bought', id.toString());
    }
  },
  setCartItems: function(items) {
    this.cartItems = items;
  },
  playerReady: function() {
    this.ready = true;

    if (this.oldPlaylist) {
      for (var item in this.oldPlaylist) {
        var id = this.oldPlaylist[ item ].id;
        if (id) {
          this.oldPlaylist[ item ].bought = (this.cartItems.indexOf(id.toInt()) > -1);
        }
      }

      this.player.remote('restore', this.oldPlaylist);
    }
  },
  play: function(e, item, autoStart) {
    e.stop();
    if (this.ready) {
      var id = item.id;
      if (id) {
        item.bought = (this.cartItems.indexOf(id.toInt()) > -1);
      }
      this.player.remote('add', item, autoStart);
    }
    return false;
  },
  restorePlaylist: function(playlist) {
    if (playlist) {
      this.oldPlaylist = playlist;
    }
  },
  save: function(playlist) {
    this.saveRequest.post({
      playlist: JSON.encode(playlist)
    });
  },
  setBought: function(id) {
    this.player.remote('bought', id);
  },
  getNewPosition: function() {
    this.playerY = this.placeholder.getPosition().y;
  }
}

window.addEvent('domready', function() {
  var layoutMain = !!$('layout-main');
  // page loader is used only in main (not cart) layout
  if (layoutMain) {
    PageLoader.init();
    BHPlayer.init();
  }
});

// display decision alert box
function decision(message, url){
	if(confirm(message)) location.href = url;
}

// open browser window
function openPopUp(url, windowName, w, h, scrollbar) {

           var winl = (screen.width - w) / 2;
           var wint = (screen.height - h) / 2;
           winprops = 'height='+h+',width='+w+',top='+wint+',left='+winl+',scrollbars='+scrollbar ;
		   win = window.open(url, windowName, winprops);
           if (parseInt(navigator.appVersion) >= 4) { 
              	win.window.focus(); 
           } 
}

function jumpMenu(target,object,restore){ 
  eval(target+".location='"+object.options[object.selectedIndex].value+"'");
  if (restore) object.selectedIndex=0;
}

function findObj(n, d) {
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function getImage(imageName)
{
		findObj('img').src = imageName;
}

function submitDoc(formName) { 
  var obj;
 
	if (obj=findObj(formName)!=null) 
	{
		findObj(formName).submit(); 
	}
	else 
	{
		alert('The form you are attempting to submit called \'' + formName + '\' couldn\'t be found. Please make sure the submitDoc function has the correct id and name.');
	}

}

