// BEGIN GENERAL FUNCTIONS ----------------------------

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
	oldonload();
      }
      func();
    }
  }
}

function not_implemented() {
  alert('Not yet implemented');
}

function debug(string) {
  var obj = document.getElementById('debug');
  obj.style.position = 'absolute';
  obj.style.zIndex = '2000';
  obj.style.width = '300px';
  obj.style.height = '350px';
  obj.style.overflow = 'auto';
  obj.style.backgroundColor = '#ffffff';
  obj.innerHTML = obj.innerHTML + string + '<br />';
}

function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, true);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
  }
}

function toggle_div(div_id) {
  var obj = document.getElementById(div_id);
  
  if (obj.style.display == 'none') {
    obj.style.display = 'block';
  } else {
    obj.style.display = 'none';
  }
}

function trim(string) {
  if (typeof string != 'string') return string;
  
  return string.replace(/^\s+/, '').replace(/\s+$/,'');
}

function encode_entities(string) {
  return string.replace(/</, '&lt;').replace(/>/, '&gt;').replace(/&/, '&amp;').replace(/"/, '&quot;').replace(/'/, '&#39;');
}

function open_email_client(username, domain, subject) {
  if (subject != undefined && subject != 'undefined' && subject != null && subject != '') {
    document.location = 'mailto:' + username + '@' + domain + '?subject=' + subject;
  } else {
    document.location = 'mailto:' + username + '@' + domain;
  }
}

function parse_json(json) {
  if (json == null || json == undefined || json == '') return '';
  
  var obj = eval('(' + json + ')');
  return obj;
}

function getElementMouseX(e, element) {
  if (!e) var e = window.event;
  
  var mouse_x = 0;
  if (e.pageX) {
    mouse_x = e.pageX;
  } else if (e.clientX) {
    mouse_x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
  }
  
  var element_mouse_x = 0;
  var element_x = 0;
  
  if (e.offsetX != undefined) {
    element_mouse_x = e.offsetX;
  } else {
    var obj = element;
    if (obj.offsetParent) {
      do {
	element_x += obj.offsetLeft;
      } while (obj = obj.offsetParent);
    }
    
    element_mouse_x = mouse_x - element_x;
  }
  
  return element_mouse_x;
}

function check_uncheck(form, field_name){
  for(var i = 0;i < form[field_name].length;i++){
    if(form[field_name][i].checked==true){
	form[field_name][i].checked = false;	  
    } else {
	form[field_name][i].checked = true;	
	}
  }
}

function submit_approved(form, field_name){
  var values = '';
  var $url_redirect = '';
  if(form[field_name].length > 1){
    for(var i = 0;i < form[field_name].length;i++){
	  if(form[field_name][i].checked == true){
        values = values + 'box' + i + form[field_name][i].value + '=' + form[field_name][i].value + '&';
	  }
    }
  } else {
    values = values + 'box' + 0 + document.getElementById(field_name).value + '=' + document.getElementById(field_name).value + '&';
  }
  $url_redirect = SITE_URL + 'pending_requests/approve/';
  document.location.href = $url_redirect + '?' + values;
}
function submit_decline(form, field_name){
  var values = '';
  if(form[field_name].length > 1){
    for(var i = 0;i < form[field_name].length;i++){
	  if(form[field_name][i].checked == true){
        values = values + 'box' + i + form[field_name][i].value + '=' + form[field_name][i].value + '&';
	  }
    }
  } else {
    values = values + 'box' + 0 + document.getElementById(field_name).value + '=' + document.getElementById(field_name).value + '&';
  }
  $url_redirect = SITE_URL + 'pending_requests/decline/';
  document.location.href = $url_redirect + '?' + values;
}

// END GENERAL FUNCTIONS ----------------------------


// BEGIN AUDIO PLAYER FUNCTIONS ----------------------------

var CART_ITEMS;
var CARTS;
var TRACKS_ON_PAGE = []; // this will be updated later as the page loads (if it's a title page)
var PROJECT_TRACKS = []; // this is the list of tracks currently in the project
var PROJECT_ID = 0; // this is the list of tracks currently in the project
// be careful not to call this function before the project mini HTML has loaded
function update_project_mini(json) {
  var project_mini_items;
  if (document.getElementById('project_mini_items')) {
    project_mini_items = document.getElementById('project_mini_items');
  }
  
  CART_ITEMS = parse_json(json);
  
  // reset the "in project" buttons
  /*for (var i in TRACKS_ON_PAGE) {
    if (document.getElementById('tracklink_' + TRACKS_ON_PAGE[i])) {
      document.getElementById('tracklink_' + TRACKS_ON_PAGE[i]).innerHTML = LANGUAGE.ADD_TO_PROJECT;
    }
  }*/
  
  if (project_mini_items) project_mini_items.innerHTML = '';
  
  var change_current_project_wrapper = document.createElement('div');
  change_current_project_wrapper.id = 'change_current_project_wrapper';
  var change_current_project = document.createElement('strong');
  change_current_project.appendChild(document.createTextNode(LANGUAGE.CHANGE_CURRENT_PROJECT));
  var project_mini_project_list = document.createElement('span');
  project_mini_project_list.id = 'project_mini_project_list';
  change_current_project_wrapper.appendChild(change_current_project);
  change_current_project_wrapper.appendChild(project_mini_project_list);
  if (project_mini_items) project_mini_items.appendChild(change_current_project_wrapper);
  
  var cart_item;
  var cart_item_title;
  var cart_item_subtitle;
  var cart_item_title_holder;
  var cart_item_subtitle_holder;
  var close_button;
  var close_button_holder;
  var audio_button;
  var audio_button_holder;
  var from_project;
  var counter = 0;
  prepped_tracks['prerun'] = [];
  for (var catalogueid in CART_ITEMS) {
    if (CART_ITEMS[catalogueid][0].item == null) CART_ITEMS[catalogueid][0].item = {};
    
    cart_item_title = document.createTextNode(CART_ITEMS[catalogueid][0].item.cataloguename);
    cart_item_title_holder = document.createElement('DIV');
    cart_item_title_holder.className = 'title';
    cart_item_title_holder.appendChild(cart_item_title);
    
    cart_item = document.createElement('LI');
    cart_item.appendChild(cart_item_title_holder);
    
    if (project_mini_items) project_mini_items.appendChild(cart_item);
    
    for (var i in CART_ITEMS[catalogueid]) {
      if (CART_ITEMS[catalogueid][i].item == null) CART_ITEMS[catalogueid][i].item = {};
      
      if (CART_ITEMS[catalogueid][i].item.trackid != undefined) {
	PROJECT_TRACKS.push(CART_ITEMS[catalogueid][i].item.trackid);
	prepareTrackForPlaylist(CART_ITEMS[catalogueid][i].item.trackid);
      }
      
      close_button = document.createElement('IMG');
      close_button.alt = '';
      close_button.border = '0';
      close_button.src = TEMPLATE_URL + 'images/icons/16x16/x.gif';
      close_button_holder = document.createElement('SPAN');
      close_button_holder.className = 'close_button_holder';
      eval('close_button_holder.onclick = function(){remove_track_from_cart("' + CART_ITEMS[catalogueid][i].id + '");}');
      close_button_holder.appendChild(close_button);
      
      audio_button = document.createElement('IMG');
      audio_button.alt = '';
      audio_button.border = '0';
      audio_button.src = TEMPLATE_URL + 'images/icons/16x16/sound_clip.gif';
      audio_button.id = 'audio_button_' + CART_ITEMS[catalogueid][i].item.trackid;
      eval('audio_button.onclick = function(){playSongsFromTrackId("' + CART_ITEMS[catalogueid][i].item.trackid + '");}');
      audio_button_holder = document.createElement('DIV');
      audio_button_holder.className = 'audio_button_holder';
      audio_button_holder.appendChild(audio_button);
      
      cart_item_subtitle = document.createTextNode(CART_ITEMS[catalogueid][i].item.tracktitle);
      cart_item_subtitle_holder = document.createElement('DIV');
      cart_item_subtitle_holder.className = (counter++ % 2 == 0) ? 'subtitle_even' : 'subtitle_odd';
      cart_item_subtitle_holder.appendChild(close_button_holder);
      cart_item_subtitle_holder.appendChild(audio_button_holder);
      cart_item_subtitle_holder.appendChild(cart_item_subtitle);
      
      cart_item = document.createElement('LI');
      cart_item.appendChild(cart_item_subtitle_holder);
      
      if (project_mini_items) project_mini_items.appendChild(cart_item);
      
      /*if (document.getElementById('tracklink_' + CART_ITEMS[catalogueid][i].item.trackid)) {
	document.getElementById('tracklink_' + CART_ITEMS[catalogueid][i].item.trackid).innerHTML = LANGUAGE.IN_PROJECT;
      }*/
    }
  }
  addTracksToPlaylist();
  
  if (counter > 0) {
    recommendation_link_holder = document.createElement('DIV');
    recommendation_link_holder.className = 'recommendation_link_holder';
    recommendation_link = document.createElement('A');
    recommendation_link.href = SITE_URL + 'search/recommend/';
    recommendation_link.alt = '';
    recommendation_link.innerHTML = LANGUAGE.RECOMMEND_SIMILAR_TRACKS;
    
    recommendation_link_holder.appendChild(recommendation_link);
    if (project_mini_items) project_mini_items.appendChild(recommendation_link_holder);
  }
  
  if (document.getElementById('project_count')) {
    // no longer updating this via js... it was only used on the project page
    //document.getElementById('project_count').innerHTML = counter + '';
  }
  
  updateCartList();
}

function update_project_mini_name(json) {
  var max_project_name = 25;
  
  var project_name = parse_json(json);
  project_name = encode_entities(trim(project_name));
  if (project_name != '') {
    if (project_name.length >= max_project_name) {
      project_name = project_name.substring(0, max_project_name-3) + '...';
    }
  } else {
    project_name = LANGUAGE.UNTITLED_PROJECT;
  }
  
  if (document.getElementById('project_name')) document.getElementById('project_name').innerHTML = project_name;
}

function set_project_id(json) {
  var project_id = parse_json(json);
  PROJECT_ID = project_id;
}

function toggle_project_mini() {
  var project_mini_arrow = document.getElementById('project_mini_arrow');
  
  toggle_div('project_mini_items_wrapper');
  toggle_div('project_mini_top');
  toggle_div('project_mini_bottom');
  
  if (project_mini_arrow.src == TEMPLATE_URL + 'images/icons/16x16/bullet_arrow_down.gif') {
    project_mini_arrow.src = TEMPLATE_URL + 'images/icons/16x16/bullet_arrow_up.gif'
  } else {
    project_mini_arrow.src = TEMPLATE_URL + 'images/icons/16x16/bullet_arrow_down.gif'
  }
}

function add_track_to_cart(track_id, cart_id) {
  //if (cart_id && track_is_in_cart(track_id)) return;
  
  var data = '';
  data += '&add_to_cart=' + track_id;
  data += '&type=track';
  
  if (cart_id != PROJECT_ID) {
    data += '&cart_id=' + cart_id;
    ajax_post(PROJECT_ENGINE_URL, data);
  } else {
    data += '&show_cart_items=1';
    ajax_post(PROJECT_ENGINE_URL, data, update_project_mini);
  }
}

function remove_track_from_cart(cart_item_id, cart_id) {
  AudioPlayer.stopSong(); // stop the audio player, since we're messing with the tracks
  
  var data = '';
  data += '&remove_from_cart=' + cart_item_id;
  data += '&type=track';
  data += '&show_cart_items=1';
  if (cart_id) {
    data += '&cart_id=' + cart_id;
  }
  ajax_post(PROJECT_ENGINE_URL, data, update_project_mini);
}

function track_is_in_cart(track_id) {
  for (var catalogueid in CART_ITEMS) {
    for (var i in CART_ITEMS[catalogueid]) {
      if (CART_ITEMS[catalogueid][i].item == null) CART_ITEMS[catalogueid][i].item = {};
      if (CART_ITEMS[catalogueid][i].item.trackid == track_id) {
	return true;
      }
    }
  }
  
  return false;
}

var prepped_tracks = [];
prepped_tracks['prerun'] = [];
prepped_tracks['prerun_secondary'] = [];
prepped_tracks['success'] = [];
prepped_tracks['success']['AudioPlayer'] = [];
prepped_tracks['success']['AudioPlayerSecondary'] = [];
prepped_tracks['failure'] = [];
prepped_tracks['failure']['AudioPlayer'] = [];
prepped_tracks['failure']['AudioPlayerSecondary'] = [];
var current_track_id;
var current_track_uses_secondary_player;
var AudioPlayer; // needs to be defined on the page where used
var AudioPlayerSecondary; // needs to be defined on the page where used
var CurrentAudioPlayer;
var progress_bar_width = 160;
var progress_bar_offset = 1;
var current_track_duration = 0;
var player_mini_timeout;
var audio_player_loaded = false;

function formatTime(total_seconds) {
  total_seconds = Math.max(0, Math.round(total_seconds * 1));
  
  var seconds = total_seconds % 60;
  var minutes = Math.floor(total_seconds / 60) % 60;
  var hours = Math.floor(total_seconds / (60*60));
  
  if (seconds < 10) seconds = '0' + seconds;
  if (hours > 0 && minutes < 10) minutes = '0' + minutes;
  
  var formatted_time = '';
  if (hours > 0) formatted_time = formatted_time + hours + ':';
  formatted_time = formatted_time + minutes + ':' + seconds;
  
  return formatted_time;
}

function prepareTrackForPlaylist(track_id, use_secondary_player) {
  if (use_secondary_player == true) {
    prepped_tracks['prerun_secondary'].push(track_id);
  } else {
    prepped_tracks['prerun'].push(track_id);
  }
}

function addTracksToPlaylist(use_secondary_player) { // should only be called after AudioPlayer is initialized
  if (use_secondary_player == true) {
    for (var i in prepped_tracks['prerun_secondary']) {
      if (prepped_tracks['success']['AudioPlayerSecondary'][prepped_tracks['prerun_secondary'][i]] != true) {
	AudioPlayerSecondary.addToPlaylist(prepped_tracks['prerun_secondary'][i]);
      }
    }
  } else {
    for (var i in prepped_tracks['prerun']) {
      if (prepped_tracks['success']['AudioPlayer'][prepped_tracks['prerun'][i]] != true) {
	if (AudioPlayer != undefined) AudioPlayer.addToPlaylist(prepped_tracks['prerun'][i]);
      }
    }
  }
}

function playSongsFromTrackId(track_id, use_secondary_player) {
  playerStateChanged('opening', track_id, use_secondary_player);
  if (current_track_id != undefined) playerStateChanged('stopped', current_track_id, current_track_uses_secondary_player);
  current_track_uses_secondary_player = use_secondary_player;
  
  if (!audio_player_loaded) {
    setTimeout(function(){playSongsFromTrackId(track_id, use_secondary_player);}, 1000);
    return;
  }
  
  if (use_secondary_player == true && prepped_tracks['success']['AudioPlayerSecondary'][track_id] == true) {
    current_track_id = track_id;
    if (AudioPlayer != undefined) AudioPlayer.stopSong();
    AudioPlayerSecondary.playSongsFromTrackId(track_id);
    CurrentAudioPlayer = AudioPlayerSecondary;
  } else if (prepped_tracks['success']['AudioPlayer'][track_id] == true) {
    current_track_id = track_id;
    AudioPlayerSecondary.stopSong();
    if (AudioPlayer != undefined) AudioPlayer.playSongsFromTrackId(track_id);
    CurrentAudioPlayer = AudioPlayer;
  } else {
    if (prepped_tracks['failure']['AudioPlayer'][track_id] == true || prepped_tracks['failure']['AudioPlayerSecondary'][track_id] == true) {
      alert(LANGUAGE.ERROR_LOADING_TRACK);
      playerStateChanged('error', track_id, use_secondary_player);
    } else {
      setTimeout(function(){playSongsFromTrackId(track_id, use_secondary_player);}, 1000); // track url may not have been loaded yet, so wait a second and try again
    }
  }
}

function onTrackAddToPlaylistFailure(player_id, track_id) {
  prepped_tracks['failure'][player_id][track_id] = true;
}

function onTrackAddToPlaylistSuccess(player_id, track_id) {
  prepped_tracks['success'][player_id][track_id] = true;
}

function onTrackPlay(player_id, track_id) {
  current_track_id = track_id;
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('playing', track_id, use_secondary_player);
  
  showPlayerMini(track_id, true);
}

function onTrackStop(player_id, track_id) {
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('stopped', track_id, use_secondary_player);
  
  hidePlayerMini(track_id, false);
}

function onTrackResume(player_id, track_id) {
  //var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  //playerStateChanged('playing', track_id, use_secondary_player);
}

function onTrackPause(player_id, track_id) {
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('paused', track_id, use_secondary_player);
}

function onTrackBuffering(player_id, track_id) {
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('buffering', track_id, use_secondary_player);
}

function onTrackFinishedBuffering(player_id, track_id) {
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('playing', track_id, use_secondary_player);
}

function onTrackError(player_id, track_id) {
  var use_secondary_player = (player_id == 'AudioPlayerSecondary') ? true : false;
  playerStateChanged('stopped', track_id, use_secondary_player);
  alert(LANGUAGE.ERROR_LOADING_TRACK);
}

function updateTrackDuration(player_id, track_id, duration) {
  current_track_duration = duration;
  document.getElementById('player_mini_time_total_' + track_id).innerHTML = formatTime(duration);
}

function updateTrackTime(player_id, track_id, track_time) {
  document.getElementById('player_mini_time_' + track_id).innerHTML = formatTime(track_time);
  
  var progress_bar_position = track_time*1 * progress_bar_width/current_track_duration;
  progress_bar_position = Math.round(Math.min(Math.max(0, progress_bar_position - progress_bar_offset), progress_bar_width - progress_bar_offset));
  document.getElementById('player_mini_progress_bar_' + track_id).style.width = progress_bar_position + 'px';
}

function playerStateChanged(state, track_id, use_secondary_player) {
  var image_url;
  var callback_function;
  var mouseover_function;
  var mouseout_function;
  
  var AudioPlayerObject = (use_secondary_player) ? AudioPlayerSecondary : AudioPlayer;
  
  // Opening, Buffering, Playing, Paused, Stopped, Error
  switch (state.toLowerCase()) {
    case 'opening':
    case 'buffering':
      image_url = TEMPLATE_URL + 'images/icons/16x16/waiting.gif';
      callback_function = function(){return false;};
      break;
    case 'playing':
      image_url = TEMPLATE_URL + 'images/icons/16x16/control_pause.gif';
      callback_function = function(){AudioPlayerObject.pauseSong(); return false;};
      mouseover_function = function(){showPlayerMini(track_id, false);};
      mouseout_function = function(){hidePlayerMini(track_id, true);};
      break;
    case 'error':
    case 'stopped':
      image_url = TEMPLATE_URL + 'images/icons/16x16/sound_clip.gif';
      callback_function = function(){playSongsFromTrackId(track_id, use_secondary_player); return false;};
      mouseover_function = function(){return false;};
      mouseout_function = function(){return false;};
      break;
    case 'paused':
      image_url = TEMPLATE_URL + 'images/icons/16x16/control_play.gif';
      callback_function = function(){AudioPlayerObject.resumeSong(track_id); return false;};
      break;
  }
  
  var audio_button_names = ['audio_button_', 'project_audio_button_', 'title_audio_button_'];
  var obj;
  for (var ii in audio_button_names) {
    obj = document.getElementById(audio_button_names[ii] + track_id);
    if (obj != null && obj.src != image_url) {
      obj.src = image_url;
      obj.onclick = callback_function;
      if (mouseover_function != undefined) {
	obj.onmouseover = mouseover_function;
      }
      if (mouseout_function != undefined) {
	obj.onmouseout = mouseout_function;
      }
    }
  }
}

function showPlayerMini(track_id, use_timeout) {
  var obj = document.getElementById('player_mini_wrapper_' + track_id);
  if (!obj) return;
  
  obj.style.display = 'block';
  
  clearTimeout(player_mini_timeout);
  
  if (use_timeout) {
    player_mini_timeout = setTimeout(function(){hidePlayerMini(track_id, false);}, 2000);
    
    obj.onmouseover = function(e) {
      clearTimeout(player_mini_timeout);
    };
  }
  
  obj.onmouseout = function(e) {
    if (!e) var e = window.event;
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
    while (reltg != obj && reltg.nodeName != 'BODY') {
      reltg = reltg.parentNode;
      if (reltg == obj) return;
    }
    
    hidePlayerMini(track_id, false);
  }
  
  var progress_bar = document.getElementById('player_mini_progress_bar_' + track_id).parentNode;
  
  progress_bar.onclick = function(e) {
    var element_mouse_x = getElementMouseX(e, progress_bar);
    
    var element_width = progress_bar.offsetWidth;
    var seek_to = Math.max(0, Math.min(current_track_duration - 1, Math.round((element_mouse_x / element_width) * current_track_duration)));
    CurrentAudioPlayer.seekTo(seek_to); // player mini never shows up in the mini playlist
  }
  
  progress_bar.onmousemove = function(e) {
    var element_mouse_x = getElementMouseX(e, progress_bar);
    
    var element_width = progress_bar.offsetWidth;
    var seek_to = Math.max(0, Math.min(current_track_duration - 1, Math.round((element_mouse_x / element_width) * current_track_duration)));
    
    document.getElementById('player_mini_time_mouse_' + track_id).innerHTML = formatTime(seek_to);
  }
  
  progress_bar.onmouseover = function(e) {
    document.getElementById('player_mini_time_mouse_' + track_id).style.display = 'block';
  }
  
  progress_bar.onmouseout = function(e) {
    document.getElementById('player_mini_time_mouse_' + track_id).style.display = 'none';
  }
}

function hidePlayerMini(track_id, use_timeout) {
  var obj = document.getElementById('player_mini_wrapper_' + track_id);
  if (!obj) return;
  
  clearTimeout(player_mini_timeout);
  
  if (use_timeout) {
    player_mini_timeout = setTimeout(function(){hidePlayerMini(track_id, false);}, 2000);
    
    obj.onmouseover = function(e) {
      clearTimeout(player_mini_timeout);
    };
  } else {
    obj.style.display = 'none';
    
    var progress_bar = document.getElementById('player_mini_progress_bar_' + track_id).parentNode;
    progress_bar.onmousemove = null;
  }
}



function startAudioPlayerSetup() {
  var data = '';
  data += '&get_fms_url=1';
  ajax_post(PROJECT_ENGINE_URL, data, initAudioPlayer);
}

function initAudioPlayer(fms_origin_url) {
  AudioPlayerSecondary = document.getElementById('AudioPlayerSecondary');
  if (AudioPlayerSecondary == undefined || typeof AudioPlayerSecondary.init_player != 'function') {
    // we need to give the Flash player some time to load
    setTimeout(function(){initAudioPlayer(fms_origin_url);}, 500);
    return;
  }
  
  fms_origin_url = parse_json(fms_origin_url);
  
  if (document.getElementById('AudioPlayer')) {
    AudioPlayer = document.getElementById('AudioPlayer');
  }
  
  if (AudioPlayer != undefined && typeof AudioPlayer.init_player == 'function') AudioPlayer.init_player('AudioPlayer', fms_origin_url, PROJECT_ENGINE_URL);
  AudioPlayerSecondary.init_player('AudioPlayerSecondary', fms_origin_url, PROJECT_ENGINE_URL);
  
  addTracksToPlaylist(true);
  
  // disabled because (at least for now) we've decided to go without the project mini
  //if (AudioPlayer != undefined) initProjectMini();
  initProjectMini();
  
  audio_player_loaded = true;
}

function initProjectMini() {
  var data;
  
  data = '';
  data += '&show_cart_items=1';
  ajax_post(PROJECT_ENGINE_URL, data, update_project_mini);

  data = '';
  data += '&get_project_name=1';
  ajax_post(PROJECT_ENGINE_URL, data, update_project_mini_name);

  data = '';
  data += '&get_project_id=1';
  ajax_post(PROJECT_ENGINE_URL, data, set_project_id);

  updateCartList();
}

addLoadEvent(startAudioPlayerSetup);

// END AUDIO PLAYER FUNCTIONS ----------------------------


// BEGIN AJAX LINKS FUNCTIONS ----------------------------

function is_internal(url) {
  return (url.substring(0, SITE_URL.length) == SITE_URL);
}

function get_url_path(url) {
  var path;
  if (is_internal(url)) {
    path = url.replace(SITE_URL, '').replace('?', '%26'); // have to replace ? with & in order to pass query string correctly to the page we're requesting
  } else {
    path = url;
  }
  
  if (path == '') path = 'home';
  
  return path;
}

function handle_ajax_link(path) {
  if (location.pathname == '/') {
    document.getElementById('dummy_page').setAttribute('src', 'dummy_page.php?hash=' + path);
  } else {
    location.href = SITE_URL + '#' + path;
  }
}

function toggle_loading_div(show) {
  var loading_div = document.getElementById('loading_div');
  if (show) {
    loading_div.style.display = 'block';
  } else {
    loading_div.style.display = 'none';
  }
}

function setup_ajax_links(initial_load) {
  if (!document.getElementById || !document.getElementsByTagName) return;
  if (!document.frames && !window.frames) return;
  
  var a_elements_skip = [];
  a_elements_skip[SITE_URL + 'logout/'] = true;
  a_elements_skip[SITE_URL + 'project/new/'] = true;
  a_elements_skip[SITE_URL + 'project/save/'] = true;
  a_elements_skip[SITE_URL + 'project/delete/'] = true;
  a_elements_skip[SITE_URL + 'project/request_download/'] = true;

  var a_elements = document.body.getElementsByTagName('a');
  var hash;
  for (var i in a_elements) {
    if (a_elements[i].onclick == null && !a_elements_skip[a_elements[i].href] && a_elements[i].href != undefined) {
      if (a_elements[i].href.substring(0, 10).toLowerCase() == 'javascript') continue;
      if (!is_internal(a_elements[i].href)) continue;
      if (a_elements[i].target != '') continue;
      
      eval('a_elements[i].onclick = function(){handle_ajax_link("' + get_url_path(a_elements[i].href) + '"); return false;}');
    }
  }
  
  if (initial_load) {
    var loading_div = document.createElement('div');
    loading_div.className = 'loading_div';
    loading_div.id = 'loading_div';
    loading_div.style.display = 'none';
    var loading_div_text = document.createTextNode(LANGUAGE.LOADING);
    loading_div.appendChild(loading_div_text);
    document.getElementById('site').appendChild(loading_div);
    
    setTimeout(check_bookmark, 100);
  }
}

function check_bookmark() {
  //location.replace(SITE_URL + pageload_pathname + '#home');
  check_for_update();
}

function check_for_update() {
  var new_hash = (document.frames) ? document.frames['dummy_page'].get_url_path() : window.frames['dummy_page'].get_url_path();
  
  if (new_hash != location.hash.replace('#', '') && (pageload_pathname != new_hash || (pageload_pathname == '' && new_hash == ''))) {
    if (new_hash == '') {
      new_hash = location.hash.replace('#', '');
      document.getElementById('dummy_page').setAttribute('src', 'dummy_page.php?hash=' + new_hash);
    }
    
    location.replace(SITE_URL + '#' + new_hash);
    
    if (new_hash == 'home') new_hash = '';
    toggle_loading_div(true);
    ajax_get(SITE_URL + new_hash, '', update_content);
  }
  setTimeout(check_for_update, 200);
}

function update_content(page_html) {
  var dummy_page = document.createElement('div');
  dummy_page.innerHTML = page_html;
  dummy_page_divs = dummy_page.getElementsByTagName('div');
  for (var i in dummy_page_divs) {
    if (dummy_page_divs[i].id == 'content') {
      document.getElementById('content').innerHTML = dummy_page_divs[i].innerHTML;
      setup_ajax_links(false);
      
      // delaying the toggling off of the loading div actually provides a better user experience
      // otherwise it can sometimes just flash on and off and the user won't know what it was
      setTimeout(function(){toggle_loading_div(false);}, 300);
      
      return;
    }
  }
}

// END AJAX LINKS FUNCTIONS ----------------------------


// BEGIN PROJECT LIST LINKS FUNCTIONS ----------------------------

function update_project_list(json) {
  CARTS = parse_json(json);
  
  var project_list_holder
  if (document.getElementById('project_list_holder')) {
    project_list_holder = document.getElementById('project_list_holder');
    project_list_holder.innerHTML = '';
  }
  
  var project_mini_project_list;
  if (document.getElementById('project_mini_project_list')) {
    project_mini_project_list = document.getElementById('project_mini_project_list');
  }
  if (project_mini_project_list) project_mini_project_list.innerHTML = '';
  var project_mini_project_list_html = '<select onchange="changeProject(this.options[this.selectedIndex].value);">';
  
  var project_name;
  var project_description;
  var cart_element;
  var cart_element_link;
  var selected;
  var select_project_name;
  var max_project_name = 25;
  for (var i in CARTS) {
    if (trim(CARTS[i].project_name) == '') CARTS[i].project_name = LANGUAGE.UNTITLED_PROJECT;
    
    project_name = CARTS[i].project_name;
    project_description = CARTS[i].project_description;
    
    cart_element = document.createElement('div');
    cart_element_link = document.createElement('a');
    cart_element_link.href = SITE_URL + 'project/?project=' + CARTS[i].CartId;
    cart_element_link.title = project_description;
    cart_element_link.appendChild(document.createTextNode(project_name));
    cart_element.appendChild(cart_element_link);
    
    if (project_list_holder) project_list_holder.appendChild(cart_element);
    
    if (CARTS[i].project_name.length >= max_project_name) {
      select_project_name = encode_entities(CARTS[i].project_name.substring(0, max_project_name-3)) + '...';
    } else {
      select_project_name = project_name;
    }
    
    if (CARTS[i]['CartId'] == PROJECT_ID) {
      selected = 'SELECTED';
    } else {
      selected = '';
    }
    project_mini_project_list_html = project_mini_project_list_html + '<option value="' + CARTS[i]['CartId'] + '" ' + selected + '>' + select_project_name + '</option>';
  }
  
  project_mini_project_list_html = project_mini_project_list_html + '</select>';
  
  if (project_mini_project_list) project_mini_project_list.innerHTML = project_mini_project_list_html;
}

function showAddToProject(track_id, sender) {
  var obj = document.getElementById('add_to_project_list_wrapper_' + track_id);
  if (!obj) return;
  
  obj.style.display = 'block';
  
  if (sender) {
    sender.onclick = function() {hideAddToProject(track_id, sender); return false;};
  }
  
  updateAddToProjectList(track_id);
}

function hideAddToProject(track_id, sender) {
  var obj = document.getElementById('add_to_project_list_wrapper_' + track_id);
  if (!obj) return;
  
  obj.style.display = 'none';
  
  if (sender) {
    sender.onclick = function() {showAddToProject(track_id, sender); return false;};
  }
}

function updateCartList() {
  data = '';
  data += '&show_carts=1';
  ajax_post(PROJECT_ENGINE_URL, data, update_project_list);
}

function changeProject(cart_id) {
  if (cart_id != PROJECT_ID) {
    AudioPlayer.stopSong();
    
    set_project_id(cart_id);
    
    var response_function = function(response) {
      update_project_mini(response);
      
      var data = '';
      data += '&get_project_name=1';
      ajax_post(PROJECT_ENGINE_URL, data, update_project_mini_name);
    };
    
    var data = '';
    data += '&cart_id=' + cart_id;
    data += '&set_current=1';
    data += '&show_cart_items=1';
    ajax_post(PROJECT_ENGINE_URL, data, response_function);
  }
}

function updateAddToProjectList(track_id, refresh_carts) {
  if (refresh_carts) {
    CARTS = undefined;
    updateCartList();
    updateAddToProjectList(track_id);
    return;
  }
  
  if (CARTS == undefined) { // PROJECT_TRACKS and/or CARTS haven't been populated yet, so check once per second until it is
    setTimeout(function(){updateAddToProjectList(track_id);}, 1000);
    return;
  }
  
  var obj = document.getElementById('add_to_project_list_items_' + track_id);
  obj.innerHTML = '';
  
  var cart_element;
  var cart_element_link;
  var cart_element_extra;
  var in_project;
  var this_cart_id;
  for (var i in CARTS) {
    this_cart_id = CARTS[i]['CartId'];
    
    cart_element = document.createElement('div');
    cart_element.id = 'add_to_project_list_item_' + this_cart_id + '_' + track_id;
    
    in_project = false;
    for (var ii in CARTS[i]['track_ids']) {
      if (CARTS[i]['track_ids'][ii] == track_id) {
	in_project = true;
	break;
      }
    }
    
    if (!in_project) {
      onclick_function = function(this_cart_index, this_cart_id, track_id) {
	var cart_element = document.getElementById('add_to_project_list_item_' + this_cart_id + '_' + track_id);
	var cart_element_extra;
	
	add_track_to_cart(track_id, this_cart_id);
	CARTS[this_cart_index]['track_ids'].push(track_id);
	cart_element.innerHTML = '';
	cart_element.appendChild(document.createTextNode(encode_entities(CARTS[this_cart_index].project_name)));
	cart_element_extra = document.createElement('small');
	cart_element_extra.appendChild(document.createTextNode(' (' + LANGUAGE.IN_PROJECT + ')'));
	cart_element.appendChild(cart_element_extra);
      };
      
      cart_element_link = document.createElement('a');
      cart_element_link.href = SITE_URL + 'project/?project=' + CARTS[i].CartId;
      eval("cart_element_link.onclick = function(){onclick_function(" + i + ", " + this_cart_id + ", '" + track_id + "'); return false;}");
      cart_element_link.appendChild(document.createTextNode(encode_entities(CARTS[i].project_name)));
      cart_element.appendChild(cart_element_link);
    } else {
      cart_element.appendChild(document.createTextNode(encode_entities(CARTS[i].project_name)));
      cart_element_extra = document.createElement('small');
      cart_element_extra.appendChild(document.createTextNode(' (' + LANGUAGE.IN_PROJECT + ')'));
      cart_element.appendChild(cart_element_extra);
    }
    
    obj.appendChild(cart_element);
  }
}

function showCreateNewProject(track_id) {
  var new_project_field = document.getElementById('new_project_field_' + track_id);
  var new_project_link = document.getElementById('new_project_link_' + track_id);
  
  new_project_field.style.display = 'block';
  new_project_link.style.display = 'none';
}

function createNewProject(track_id) {
  var new_project_name = document.getElementById('new_project_name_' + track_id);
  var new_project_field = document.getElementById('new_project_field_' + track_id);
  var new_project_link = document.getElementById('new_project_link_' + track_id);
  var add_to_project_list = document.getElementById('add_to_project_list_items_' + track_id);
  
  var project_name = trim(new_project_name.value);
  
  var waiting_image = document.createElement('img');
  waiting_image.src = TEMPLATE_URL + 'images/icons/16x16/waiting.gif';
  waiting_image.border = '0';
  waiting_image.alt = '';
  add_to_project_list.innerHTML = '';
  add_to_project_list.appendChild(waiting_image);
  
  var data = '';
  data += '&create_new_cart=' + project_name;
  ajax_post(PROJECT_ENGINE_URL, data, function(response){updateAddToProjectList(track_id, true);});
  
  new_project_name.value = '';
  new_project_field.style.display = 'none';
  new_project_link.style.display = 'block';
}

// END PROJECT LIST LINKS FUNCTIONS ----------------------------