var tag_state = {};
var state_store;
var tag_add_msg = "Add to My References";
var tag_del_msg = "Remove from My References";

function tagToggle (tagged) {
  var flag = document.createElement ("img");
  if (tagged) {
    flag.setAttribute ("src", "/img/flagged.gif");
    flag.setAttribute ("alt", tag_del_msg);
    flag.setAttribute ("title", tag_del_msg);
  } else {
    flag.setAttribute ("src", "/img/unflagged.gif");
    flag.setAttribute ("alt", tag_add_msg);
    flag.setAttribute ("title", tag_add_msg);
  }
  return flag;
}

function tagMessage (tagged) {
  var message = document.createElement ("span");
  if (tagged) {
    message.appendChild (document.createTextNode (tag_del_msg))
  } else {
    message.appendChild (document.createTextNode (tag_add_msg))
  }
  return message;
}

function setTagToggleImg (element, tagged) {
  var children = element.childNodes;
  for (var i = 0; i < children.length; ++i) {
    var nodeName = children[i].nodeName.toUpperCase ();
    if (nodeName == "IMG") {
      element.replaceChild (tagToggle(tagged), children[i]);
    } else if (nodeName == "SPAN") {
      element.replaceChild (tagMessage (tagged), children[i]);
    }
  }
}

function makeRequest(element) {
  var url = element.href;
  var http_request = false;
  if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    http_request = new XMLHttpRequest();
    if (http_request.overrideMimeType) {
      http_request.overrideMimeType('text/xml');
    }
  } else if (window.ActiveXObject) { // IE
    try {
      http_request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
	http_request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {}
    }
  }

  if (!http_request) {
    // Unrecoverable error: cannot create an XMLHTTP instance.
    return false;
  }

  http_request.onreadystatechange = function() {
    if (http_request.readyState == 4) {
      if (http_request.status == 200) {
	var tagged;
	var okay = false;
	var response = http_request.responseXML.documentElement;
	switch (response.nodeName) {
	case "tagged":
	  tagged = true;
	  okay = true;
	  break;
	case "untagged":
	  tagged = false;
	  okay = true;
	  break;
	case "nosession":
	  alert("You must be logged in to save records.");
	  break;
	default:
	  alert("Error tagging record. Unexpected response from the server.");
	}
	if (okay.valueOf ()) {
	  tag_state[element.parentNode.id] = tagged;
	  state_store.value = JSON.stringify(tag_state);
	  setTagToggleImg (element, tagged);
          // Update the My References list.
          var ref_list = document.getElementById ("my-references-list");
	  if (ref_list) {
	    var li_id = response.getAttribute("id");
	    if (tagged) {
	      var title = response.childNodes[0].nodeValue;
	      var li = document.createElement ("li");
	      li.setAttribute ("id", li_id);
	      li.appendChild (document.createTextNode (title));
	      ref_list.insertBefore (li, ref_list.firstChild);
	    }
	    else { // untagged
	      var li = document.getElementById (li_id);
	      if (li) {
		ref_list.removeChild (li);
	      }
	    }
	  }
	}
      } else {
	alert('Error tagging record. No response from server.');
      }
    }
  };
  // Try to fool the IE page cache...
  url += "&random=";
  url += String(Math.random ());
  http_request.open('GET', url, true);
  http_request.setRequestHeader ("X-Method", "ajax");
  http_request.send(null);
}

function tagRecord(whichRec) {
  if (document.getElementById) {
    makeRequest(whichRec);
  }
  return false;
}

function restoreState () {
  for (var rid in tag_state) {
    var element = document.getElementById (rid);
    if (element) {
      var children = element.childNodes;
      for (var i = 0; i < children.length; ++i) {
	if (children[i].nodeName.toUpperCase () == "A") {
	  setTagToggleImg (children[i], tag_state[rid]);
	  break;
	}
      }
    }
  }
}

function checkState() {
  state_store = document.getElementById("state");
  if (state_store.value) {
    tag_state = JSON.parse(state_store.value);
    restoreState ();
  }
}

function truncate_title(title)
{
  if (title.length > 50) {
    return title.substring (0, 50)+"...";
  } else {
    return title;
  }
}

function display_feed(feed) {
  var feed_div_id;
  var link = document.createElement ("a");
  link.href = "/feed-reader"+feed["type"];
  if (feed["type"] == '/saved-searches/') {
    feed_div_id = "search-history";
    link.title = "View and edit your search history";
  } else {
    feed_div_id = "my-references";
    link.title = "View and edit your references";
  }
  var feed_div = document.getElementById (feed_div_id);
  if (feed_div) {
    var h2 = document.createElement ("h2");
    link.appendChild (document.createTextNode (feed["title"]));
    h2.appendChild (link);
    feed_div.appendChild (h2);
    var ul = document.createElement ("ul");
    if (feed["type"] == '/saved-searches/') {
      ul.id = "search-history-list";
    } else {
      ul.id = "my-references-list";
    }
    ul.setAttribute ("class", "feed-list");
    for (var i = 0; i < feed["items"].length; ++i) {
      var item = feed["items"][i];
      var li = document.createElement("li");
      if (item["href"]) {
	var link = document.createElement ("a");
	link.href = item["href"];
	link.title = "View search results";
	link.appendChild (document.createTextNode (truncate_title (item["title"])));
	li.appendChild (link);
      } else {
	li.appendChild (document.createTextNode (truncate_title (item["title"])));
      }
      if (item["hits"]) {
	li.appendChild (document.createTextNode (" : "+item["hits"]+" hits."));
      }
      if (item["date"]) {
	li.appendChild (document.createTextNode (" "+item["date"]+"."));
      }
      if (item["id"]) {
	li.id = item["id"];
      }
      if (i % 2 == 0) {
	li.setAttribute ("class", "highlight");
      }
      ul.appendChild (li);
    }
    feed_div.appendChild (ul);
  }
}

function load_feed(type, num_to_load) {
  var feed_script = document.getElementById(type+"-script");
  if (!feed_script) {
    var scriptElement = document.createElement("script");
    scriptElement.setAttribute("id", type+"-script");
    scriptElement.setAttribute("src",
			       "http://"+location.host+"/bin/feed-json/"+type+"/?callback=display_feed&show="+num_to_load);
    scriptElement.setAttribute("type", "text/javascript");
    document.documentElement.firstChild.appendChild(scriptElement);
  }
}

function load_feeds(num) {
  var num_to_load = 6;
  if (num) {
    num_to_load = num;
  }
  if (document.cookie.indexOf ('SID=!') == -1) {
    load_feed ("saved-searches", num_to_load);
    load_feed ("my-references", num_to_load);
  } else {
    div = document.getElementById ("search-history");
    if (div) {
      p = document.createElement ("p");
      p.appendChild (document.createTextNode ("You can keep a record of your searches and save references by logging into Copac."));
      div.appendChild (p);
    }
  }
}

