// state is like /snapshots/562?list=best
function stateChange(state) {
  if (ignoreOneChange) {
    ignoreOneChange = false;
    return;
  }
  var ar = state.split("/");
  var our_id = "";

  for(piece in ar)
    if (ar[piece].indexOf && ar[piece].indexOf("?") != -1)
      our_id = ar[piece].split('?')[0];
  toElm = document.getElementById("snapshot_"+our_id);
  if (toElm)
    itemTo(toElm,false);
  else
    window.location = state
}

YAHOO.util.History.register("items", window.location.toString(), stateChange);
YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");


var bookmarkedState = YAHOO.util.History.getBookmarkedState('items');
if (bookmarkedState != null)
  window.location = bookmarkedState;

var startedNext     = false; // the user clicked "Next" in the past
var startedPrevious = false; // the user clicked "Previous" in past

function nextObject(n) {
  if (!n) return null;
  do n = n.nextSibling;
  while (n && n.nodeType != 1);
  return n;
}

function firstObject(parent) {
  if (!parent) return null;
  child = parent.firstChild;
  if (child.nodeType == 1)
    return child;
  else
    return nextObject(child);
}

function previousObject(p) {
  if (!p) return null;
  do p = p.previousSibling;
  while (p && p.nodeType != 1);
  return p;
}

function lastObject(parent) {
  if (!parent) return null;
  child = parent.lastChild;
  if (child.nodeType == 1)
    return child;
  else
    return previousObject(child);
}



var gettingMoreNext     = false;
var gettingMorePrevious = false;
var waitingNext         = false;
var waitingPrevious     = false;

// "snapshot_1244" or "stage_145"
function itemIdFromElement(element) {
  var id = element.id;
  var array = id.split("_");
  return (id.split("_"))[1]
}

function itemClassFromElement(element) {
  var id = element.id;
  var array = id.split("_");
  return array[0];
}


function needsFirstNext() {
 return nextObject(currentItem) == null;
}

function needsNext() {
  return nextObject(nextObject(currentItem)) == null;
}

function needsPrevious() {
  return previousObject(previousObject(currentItem)) == null;
}

function populate() {
  var items = $('items');
  if ((startedNext || needsFirstNext()) && needsNext() && gettingMoreNext == false) {
		var last_item = lastObject(items);
		var id = itemIdFromElement(last_item);
		var klass = itemClassFromElement(last_item);
		gettingMoreNext = true;
    new Ajax.Request('/'+klass+'s/'+id+'/next?'+queryString, {asynchronous:true, evalScripts:true, method:'get'});
  }
  if (startedPrevious && needsPrevious() && gettingMorePrevious == false) {
		var first_item = firstObject(items);
		var id = itemIdFromElement(first_item);
		var klass = itemClassFromElement(first_item);
    gettingMorePrevious = true;
    new Ajax.Request('/'+klass+'s/'+id+'/previous?'+queryString, {asynchronous:true, evalScripts:true, method:'get'});
  }
}

var hasCalledRefresh = false;
var refreshCount = 0;
function refreshAd(){
  refreshCount++;
  if (refreshCount < 3) //refresh every 3 ads
    return false;
  refreshCount = 0;
  try {
    var d=document.getElementById('top_ad');
    if(d){
      var s=d.getElementsByTagName('iframe');
      if(s && s.length){
        newaddition = '&' + new Date().getTime();
        if (hasCalledRefresh) {
          oldsrc = s[0].src;
          s[0].src=oldsrc.substring(0,oldsrc.length-newaddition.length) + newaddition;
        } else {
          s[0].src=s[0].src+newaddition;
          hasCalledRefresh = true;
        }
      }
    }
    return true;
  } catch (err) {
    console.debug("failed to refresh ad");
    console.debug(err);
    return false;
  }
}


function newStuff(next_or_previous) {
  if(waitingPrevious == true)
    previousItem();
  if(waitingNext == true)
    nextItem();
  hideStuff();

  if (next_or_previous == "next")
    gettingMoreNext = false;
  else
    gettingMorePrevious = false;
}

function showStuff() {
  togStuff($$(".spinner"),"block");
  togStuff($$(".main_image"),"none");
}
function hideStuff() {
  togStuff($$(".spinner"),"none");
  togStuff($$(".main_image"),"block");
}

function togStuff(arr, displayStyle) {
  for(s in arr)
    if(arr[s].style)
      arr[s].style.display = displayStyle;
}


function itemTo(newItem, update_url) {
  currentItem.style.display = "none";
  currentItem = newItem;
  currentItem.style.display = "block";
  updateTitle();
  refreshAd();
  if (update_url)
    updateUrl();
}

function hideFlashes() {
  var f = $$('.flash');
  for(var i=0; i<f.length; i++)
    f[i].style.display = "none";
}

function nextItem() {
  if (!YAHOO.env.ua.gecko && !YAHOO.env.ua.ie && !YAHOO.env.ua.webkit)
    return true;
  startedNext = true;

  hideFlashes();

  if (nextObject(currentItem) == null) {
    waitingNext = true;
    showStuff();
    return false;
  }
  waitingNext = false;
  hideStuff();
  if (currentItem) {
    ignoreOneChange = true;
    itemTo(nextObject(currentItem),true);
  }
  return false;
}

function previousItem() {
  // user clicked on the "Previous" link
  if (!YAHOO.env.ua.gecko && !YAHOO.env.ua.ie && !YAHOO.env.ua.webkit)
    return true;
  startedPrevious = true;

  hideFlashes();

  if (previousObject(currentItem) == null) {
    waitingPrevious = true;
    showStuff();
    return false;
  }
  waitingPrevious = false;
  hideStuff();
  if (currentItem) {
    ignoreOneChange = true;
    itemTo(previousObject(currentItem),true);
  }
  return false;
}

function updateUrl() {
  var newState = "/"+itemClassFromElement(currentItem)+"s/"+itemIdFromElement(currentItem)+"?"+queryString;
  if ($('yui-history-iframe'))
    $('yui-history-iframe').contentWindow.document.title = document.title;
  YAHOO.util.History.navigate("items", newState);
}

function updateTitle() {
  document.title = currentItem.childNodes.item(0).innerHTML;
}

window.onload = function() {
  if (YAHOO.env.ua.ie || YAHOO.env.ua.gecko || YAHOO.env.ua.webkit)
    setInterval(populate, 200);

  if (document.addEventListener)
    document.addEventListener("keydown",keydown,false);
  else if (document.attachEvent)
    document.attachEvent("onkeydown", keydown);
  else
    document.onkeydown= keydown;
};

function keydown(e) {
  if(!e) e = event;
  if (!e.target)
    e.target = e.srcElement;

  var key = e.keyCode;
  switch (key) {
  case Event.KEY_RIGHT:
    if(e.target.type == null)
      nextItem();
    break;
  case Event.KEY_LEFT:
    if(e.target.type == null)
      previousItem();
    break;
  }
}
