function comparePageDescriptors(a, b) {
  var prefix_length = a.length;
  if ( b.length > a.length ) prefix_length = b.length;

  for ( var i = 0 ; i < prefix_length ; i++ ) {
    if ( a[i] > b[i] ) {
      return 1;
    } else if ( a[i] < b[i] ) {
      return -1;
    }
  }

  if ( a.length > b.length ) {
    return -1; // longer comes later
  } else if ( a.length < b.length ) {
    return 1; // shorter comes earlier
  } else {
    return 0;
  }
}

function getHighestPage() {
  var cookies = document.cookie.split("; ");
  for ( var i = 0 ; i < cookies.length ; i++ ) {
    var split = cookies[i].split("=");
    if ( split[0] == "highestPage" ) {
      if ( /^\d+(:\d+)*$/.exec(split[1]) ) {
        var page = split[1].split(':');
        for ( var j = 0 ; j < page.length ; j++ ) {
          page[j] = parseInt(page[j]);
        }
        return page;
      }
    }
  }
  return null;
}

function pageDescriptorToURL(page) {

  function zeroFillNumber(value, places) {
    value = String(value);
    while (value.length < places) {
      value = "0" + value;
    }
    return value;
  }

  if ( page.length != 2 ) return null;

  return "http://lastbus.rydia.net/comic/" + zeroFillNumber(page[0], 3) + "-" + zeroFillNumber(page[1], 2) + ".html"
}

function pageDescriptorFromURL(url) {
  var match = /\/comic\/(?:(0)|0*(\d+))-(?:(0)|0*(\d+))(?:-\w+)*(?:\.\w+)?$/.exec(url);
  if (match) {
    var chapter = parseInt( match[1] || match[2] );
    var page = parseInt( match[3] || match[4] );
    return [ chapter, page ];
  } else {
    return null;
  }
}

function getCurrentPage() {
  return pageDescriptorFromURL(window.location);
}

function setHighestPage(page) {
  var date = new Date();
  date.setTime(date.getTime() + 2*365*24*60*60*1000);
  document.cookie = "highestPage=" + page.join(':') + "; expires=" + date.toGMTString() + "; domain=lastbus.rydia.net; path=/";
}

function getHighestPageURL() {
  var highest_page = getHighestPage();
  if (highest_page) {
    return pageDescriptorToURL(highest_page);
  } else {
    return null;
  }
}

function setupComicPage() {
  var current_page = getCurrentPage();
  var highest_page = getHighestPage();

  if ( highest_page && current_page ) {
    var comparison = comparePageDescriptors( current_page, highest_page );
    if ( comparison >= 0 ) {
      setHighestPage(current_page);
    } else if ( comparison < 0 ) {
      var form = document.getElementById("highestPageReset");
      if (form) {
        var button = document.createElement("button");
        button.onclick = function () {
          form.removeChild(button);
          var p = document.createElement("p");
          p.setAttribute("class", "note");
          p.appendChild(document.createTextNode("The "));
          var returning_reader = document.createElement("strong");
          returning_reader.appendChild(document.createTextNode("returning reader"));
          p.appendChild(returning_reader);
          p.appendChild(document.createTextNode(" link has been moved back to this page.  It will advance with you as you read more."));
          form.appendChild(p);
          setHighestPage(current_page);
          return true;
        };
        button.appendChild(document.createTextNode("move returning reader link here"));
        form.appendChild(button);
      }
    }
  } else if (current_page) {
    setHighestPage(current_page);
  }

  if (highest_page) {
    var div = document.getElementById("returningReader");
    if (div) {
      var p = document.createElement("p");
      var caption = document.createElement("strong");
      caption.appendChild(document.createTextNode("Returning reader?"));
      p.appendChild(caption);
      p.appendChild(document.createTextNode(" Pick up "));
      var a = document.createElement("a");
      a.setAttribute("href", pageDescriptorToURL(highest_page));
      a.appendChild(document.createTextNode("where you left off"));
      p.appendChild(a);
      p.appendChild(document.createTextNode("."));
      div.appendChild(p);
    }
  }
}

