// ==UserScript==
// @name           OlisMapAll
// @namespace      tag:janet.mcknight@oucs.ox.ac.uk,2009-05-20:OlisMapAll
// @description    Adds map links to OLIS record pages
// @include        http://library.ox.ac.uk/WebZ/*
// ==/UserScript==

//<!-- this is the HTML we're expecting -->
//<table ... class="data-holdings">
//<tbody><tr valign="top">
//<th>Location</th><th>Shelfmark</th><th>Status</th><th>&nbsp</th>
//</tr>
//<tr valign="top">
//<td width="33%">Bodleian<br>BOD Bookstack</td><td width="33%">M02.E04939</td><td width="33%">In place </td>
//</tr>
//<tr valign="top">
//<td width="33%">Continuing Ed<br>CED Main Libr</td><td width="33%">930.092 RAH</td><td width="33%">Available </td>
//</tr>
//</tbody></table>

// alert("olismapall.user.js v2.2.1");

function getElementsByClass(searchClass,tag) {
  var classElements = new Array();
  if (tag == null) {
    tag = '*';
  }
  var els = document.getElementsByTagName(tag);
  var elsLen = els.length;
  var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
  for (i = 0, j = 0; i < elsLen; i++) {
    if (pattern.test(els[i].className) ) {
      classElements[j] = els[i];
      j++;
    }
  }
  return classElements;
}

function getScript(url) {
    /* gets a URL (for JSON) and puts it in a <script> tag in the <head> */

    var scriptTag;
    var tagId = "oxpscript";
    var head = document.getElementsByTagName("head")[0];
    if (scriptTag = document.getElementById(tagId)) { head.removeChild(scriptTag); }
    scriptTag = document.createElement("script");
    scriptTag.setAttribute("type","text/javascript");
    scriptTag.setAttribute("src",url);
    scriptTag.setAttribute("id",tagId);
    head.appendChild(scriptTag); 

    if (scriptTag != document.getElementById(tagId))
    {
    	if( document.createElement && document.childNodes ) {
    	    document.write('<script type="text\/javascript" src="' + url + '"><\/script>');
    	}
    }

}

function searchOxpoints(allCodes) {

	var url = "http://m.ox.ac.uk/oxpoints/hasOLISCode/" + allCodes + ".gjson"; 
	getScript(url);

}

// var maplink = '<br><a href="http://maps.google.co.uk">';

var oxpoints1 = 'http://m.ox.ac.uk/cgi-bin/oxmap.pl?codes='; 

var libraryholdings = getElementsByClass("data-holdings")[0];
var holdingsParent = libraryholdings.parentNode;
var tablerows = libraryholdings.getElementsByTagName("tr");

var bodCodes = new Array;

var availHash = new Array;
availHash['Reference'] = 'green';
availHash['In place'] = 'green';
availHash['Available'] = 'green';
availHash['DUE BACK'] = 'red';
availHash['MISSING'] = 'red';
availHash['Withdrawn'] = 'red';
availHash['In Processing'] = 'red';
availHash['Sent for repair'] = 'red';
availHash['Apply Staff'] = 'orange';
availHash['Please check shelf'] = 'orange';

var codeStatus = new Array;

for (var i = 1; i < tablerows.length; i++)
{
	var myRow = tablerows[i];
	var codeTD;
	var bookTD;
	var bodCode;
	var bookStatus;
	var bookColor;
	var newLines = new RegExp("^(\r|\n)*", "g");

	if (codeTD = myRow.getElementsByTagName("td")[0])
	{
	  var bodDetails = codeTD.innerHTML.split("<br>");
          bodCode = bodDetails[1];
	  bodCode = bodCode.replace(newLines, "");
          if (bodCode.match(/ /)) { 
	      encodedBodCode = bodCode.replace(/ /g, "%252B"); 
	      bodCode = bodCode.replace(/ /g, "+"); 
	  }
          if (bodCode.match(/^[A-Z]{3}/)) { bodCodes[i-1] = bodCode; }   
	  var oxpmaplink = '<a href=\"http://maps.google.co.uk/?z=16&amp;q=http://m.ox.ac.uk/oxpoints/hasOLISCode/' + encodedBodCode + '.kml">';
	  codeTD.innerHTML = codeTD.innerHTML + '<br>' + oxpmaplink + "Show library on a map</a>";
        }

	if (bookTD = myRow.getElementsByTagName("td")[2])
	{
          bookStatus = bookTD.innerHTML;
	  if (bookStatus.match(/^DUE BACK/)) { bookStatus = 'DUE BACK'; }
	  else if (bookStatus.match(/^\s*$/)) { bookStatus = 'Available'; }

          bookColor = availHash[bookStatus];

	  if (bookColor == 'green')
	  {
	      // green overrides everything;
	      codeStatus[bodCode] = 'green';
	  }
	  else if (bookColor == 'orange')
	  {
	      if (codeStatus[bodCode] != 'green')
	      {
		  codeStatus[bodCode] = 'orange';
	      }
	  }
	  else if (bookColor == 'red')
	  {
	      if (codeStatus[bodCode] != 'green' && codeStatus[bodCode] != 'orange')
	      {
		  codeStatus[bodCode] = 'red';
	      }
	  }
	  else
	  {
	      codeStatus[bodCode] = 'white'; // we don't know what it is
	  }

	}

}

var bibliodata = getElementsByClass("data-bibliographic")[0];
var bibliorows = bibliodata.getElementsByTagName("tr");
var bookFields = new Array;

for (var i = 0; i < bibliorows.length; i++)
{
    var newLines = new RegExp("[\r\n]", "g");
    var myRow = bibliorows[i];
    var field = myRow.getElementsByTagName("th")[0].innerHTML;
    var value = myRow.getElementsByTagName("td")[0].innerHTML;
    field = field.replace(newLines, "");
    value = value.replace(newLines, "");

    if (field.match(/Title/))
    {
	bookFields['Title'] = value;
    }
    else if (field.match(/Author/))
    {
	var author = myRow.getElementsByTagName("td")[0].getElementsByTagName("a")[0].innerHTML;
	bookFields['Author'] = author;
    }
}


var allBodCodes = bodCodes.join('%7C');
var allPairs = new Array;

for (var i = 0; i < bodCodes.length; i++)
{
    var thisCode = bodCodes[i];
    allPairs[i] = thisCode + "~" + codeStatus[thisCode];
}

var allCodesStatuses = allPairs.join('%7C');

//var oxmapslink = '<a href=\"' + oxpoints1 + allBodCodes + '.kml\" target="_blank\">';
//var oxpoints1 = 'http://m.ox.ac.uk/cgi-bin/oxmap.pl?codes='; 
var oxmapslink = '<a href=\"' + oxpoints1 + allCodesStatuses + '\" target="_blank\">';

var mapslinkspan = document.createElement("span");
mapslinkspan.setAttribute("class","mapslink");
//mapslinkspan.innerHTML = oxmapslink + "Show all libraries on a map</a>";

var mapsform = document.createElement("form");
mapsform.setAttribute("id","mapsform");
mapsform.setAttribute("action","http://m.ox.ac.uk/cgi-bin/oxmap.pl");
mapsform.setAttribute("method","POST");

var codesInput = document.createElement("input");
codesInput.setAttribute("type","hidden");
codesInput.setAttribute("name","codes");
codesInput.setAttribute("value",allCodesStatuses);

var titleInput = document.createElement("input");
titleInput.setAttribute("type","hidden");
titleInput.setAttribute("name","title");
titleInput.setAttribute("value",bookFields['Title']);

var authorInput = document.createElement("input");
authorInput.setAttribute("type","hidden");
authorInput.setAttribute("name","author");
authorInput.setAttribute("value",bookFields['Author']);

var submit = document.createElement("input");
submit.setAttribute("type","submit");
submit.setAttribute("name","map-submit");
submit.setAttribute("id","map-submit");
submit.setAttribute("value","Show all libraries on a map");

mapsform.appendChild(codesInput);
mapsform.appendChild(titleInput);
mapsform.appendChild(authorInput);
mapsform.appendChild(submit);
mapslinkspan.appendChild(mapsform);

holdingsParent.insertBefore(mapslinkspan, libraryholdings);