onload = function () {
  failed_requests = 0;
  set_wait_state(false);
  document.aws_form.onsubmit = function (e) {
    e = e ? e : event;
    if (e.preventDefault) e.preventDefault();
    else e.returnValue = false;
    find();
  }
}
onclick = function (e) {
  e = e ? e : event;
  var element = e.target ? e.target : e.srcElement;
  if (element.id == 'find') {
    find();
    if (e.preventDefault) e.preventDefault();
    else e.returnValue = false;
    return false;
  } else if (element.parentNode.id == 'next') {
    change(1);
  } else if (element.parentNode.id == 'prev') {
    change(-1);
  } else if (element.className == 'more_link') {
    element.parentNode.style.display = 'none';
    var o = element.parentNode.previousSibling.firstChild;
    while (o) {
      if (o.style) o.style.display = 'list-item';
      o = o.nextSibling;
    }
    return false;
  } else if (element.className == 'choose_disc') {
    var split = element.id.split('_');
    var disc_no = parseInt(split[1]);
    var sub_disc_no = parseInt(split[2]);
    var disc = disc_data[displayed_page][disc_no];
    with (document.data_form) {
      title.value = disc.title;
      if (disc.discs && disc.discs.length > 1) title.value += ' / Disc ' + (sub_disc_no + 1);
      artist.value = disc.artist;
      other_info.value = '';
      if (disc.label) other_info.value += disc.label;
      if (disc.label && disc.release_year) other_info.value += ', ';
      if (disc.release_year) other_info.value += disc.release_year;
      tracks.value = '';
      if (sub_disc_no >= 0) {
        var sub_disc = disc.discs[sub_disc_no];
        for (var i = 0; i < sub_disc.length; i ++ ) { tracks.value += (i > 0 ? "\n" : '') + (i + 1) + '. ' + sub_disc[i]; }
      }
      image_URL.value = disc.image ? disc.image : '';
    }
  }
}
function find() {
  if (wait_state) return;
  keywords = escape(document.aws_form.keywords.value);
  region = escape(document.aws_form.region.value);
  disc_data = new Array();
  desired_page = 1;
  displayed_page = null;
  total_pages = null;
  new_items_div();
  show();
}
function change(difference) {
  if (wait_state || displayed_page == null) return;
  desired_page = Math.min(Math.max(desired_page + difference, 1), total_pages);
  show();
}
function get() {
  signing_src = 'aws_signing/sign_query_01.rb?js_callback=signed_url_received&amazon_endpoint=xml-' + region + '.amznxslt.com&amazon_path=/onca/xml&Service=AWSECommerceService&Version=2011-08-01' +
  '&Style=http://mackerron.com/cdcovers/aws_114.xsl&MerchantId=All&ContentType=text/javascript' +
  '&AWSAccessKeyId=1CH6HVQGSJH4Y3T8J7R2&AssociateTag=httpmackecom-20&Operation=ItemSearch' +
  '&SearchIndex=Music&ResponseGroup=Medium,Tracks,Images&Sort=salesrank&AssociateTag=' +
  '&Keywords=' + keywords + '&ItemPage=' + desired_page + '&failed_requests=' + failed_requests + '&callback_function=data_received';
  make_script(signing_src);
  set_wait_state(true);
  timeout = setTimeout(data_timeout, 10000);
}
function make_script(src) {
  var head = dgebtn('head')[0];
  if (window.script) head.removeChild(script);
  script = ce('script');
  script.type = 'text/javascript';
  script.src = src;
  head.appendChild(script);
}
function signed_url_received(url) {
  make_script(url);
}
function data_received(page_no, pages, failed_requests_then, data) {
  if (failed_requests_then < failed_requests) return;
  clearTimeout(timeout);
  disc_data[desired_page] = data;
  total_pages = pages;
  show();
}
function data_timeout() {
  failed_requests ++;
  desired_page = displayed_page;
  alert("Sorry. Your request has timed out because Amazon's servers did not respond within 10 seconds. Please try again.");
  set_wait_state(false);
}
function new_items_div() {
  var aws_result = dgebi('aws_result');
  if (self.items_div) aws_result.removeChild(items_div);
  items_div = cacet(aws_result, 'div');
  return items_div;
}
function show() {
  if (desired_page == displayed_page) return;
  if (! disc_data[desired_page]) {
    get();
    return;
  }
  items_div = new_items_div();
  var prev_ASIN = '';
  var oddness = 0;
  for (var i = 0; i < disc_data[desired_page].length; i ++) {
    var disc = disc_data[desired_page][i];
    var ASIN = disc.ASIN;
    if (ASIN != prev_ASIN) oddness = (oddness == 1 ? 0 : 1);
    prev_ASIN = ASIN;
    var item = cacet(items_div, 'div', 'item oddness_' + oddness);
    var buy_div = cacet(item, 'div', 'amazon_links', 'Amazon');
    cacet(buy_div, 'br');
    cacet(buy_div, 'a', '', 'Buy').href = disc.detail_page;
    var pic_div = cacet(item, 'div', 'picture');
    if (disc.thumbnail) {
      var pic_img = cacet(pic_div, 'img', '');
      with (pic_img) {
        src = disc.thumbnail;
        width = 100;
        height = Math.round(100 * parseInt(disc.thumbnail_size.split('x')[1]) / disc.thumbnail_size.split('x')[0]);
        alt = 'Album art';
      }
    } else cacet(pic_div, 'div', 'no_picture', 'No image available');
    var info = cacet(item, 'div', 'info');
    if (disc.title) var title = cacet(info, 'div', 'title', disc.title);
    if (disc.artist) var artist = cacet(info, 'div', 'artist', disc.artist);
    if (disc.label || disc.release_year) {
      var extra = cacet(info, 'div', 'extra');
      if (disc.label) var label = cacet(extra, 'span', 'label', disc.label);
      if (disc.label && disc.release_year) cat(extra, ', ');
      if (disc.release_year) var release_year = cacet(extra, 'span', 'release_year', disc.release_year);
    }
    if (disc.discs) {
      var discs = disc.discs;
      var all_discs = cacet(item, 'div', 'all_discs');
      for (var j = 0; j < discs.length; j ++) {
        var sub_disc = discs[j];
        if (discs.length > 1) cacet(all_discs, 'div', 'disc_no', 'Disc ' + ( j + 1 ));
        var choose = cacet(all_discs, 'a', 'choose_disc', 'Copy info >');
        choose.href = '#';
        choose.id = 'btn_' + i + '_' + j;
        var ol = cacet(all_discs, 'ol', 'disc');
        for (var k = 0; k < sub_disc.length; k ++ ) {
          var track = sub_disc[k];
          var li = cacet(ol, 'li', k < 3 ? 'first_three' : 'remainder');
          cacet(li, 'span', '', track);
        }
        if (sub_disc.length > 3) {
          var link_div = cacet(all_discs, 'div', 'more_link_div', 'and ');
          cacet(link_div, 'a', 'more_link', (sub_disc.length - 3) + ' more...').href = '#';
        }
      }
    } else {
      var choose = cacet(item, 'a', 'choose_disc', 'Copy info >');
      choose.href = '#';
      choose.id = 'btn_' + i;
    }
    var clearer = cacet(item, 'div', 'clear_both');
  }
  displayed_page = desired_page;
  set_wait_state(false);
}
function set_wait_state(busy) {
  document.aws_form.submit.disabled = busy;
  dgebi('spinner').style.display = busy ? 'block' : 'none';
  dgebi('next').className = busy || ! window.total_pages || displayed_page >= total_pages ? 'disabled' : '';
  dgebi('prev').className = busy || ! window.total_pages || displayed_page <= 1           ? 'disabled' : '';
  var page_info = dgebi('page_info');
  page_info.removeChild(page_info.firstChild);
  cat(page_info, (window.total_pages? 'Page ' + displayed_page + ' of ' + total_pages : 'No pages'));
  wait_state = busy;
}
function dgebi(id) { return document.getElementById(id) };
function dgebtn(tn) { return document.getElementsByTagName(tn); }
function ce(tag_name) { return document.createElement(tag_name) }; // ce = create element
function cat(parent_element, text) { // cat = create + append textnode
  var element = document.createTextNode(text);
  parent_element.appendChild(element);
  return element;
}
function cacet(parent_element, tag_name, class_name, text) { // cacet = create + append classed element + text
  var element = ce(tag_name);
  if (class_name) element.className = class_name;
  if (text) cat(element, text);
  parent_element.appendChild(element);
  return element;
}

