var nodes = new Array();
var nodeIndex = new Object();
var canvasSize = 400;  // really set in HTML
var paths = new Array();
var circles = new Array();
var selectedNode = null;

function addMatch(nid, linkid, rtext, mtype, dt1, dt2, level){
  //alert('addMatch '+nid+' '+linkid+', '+rtext+', '+mtype+', '+dt1+', '+dt2+', '+level);
  var m = new Object();
  m.rtext = rtext;
  m.mtype = mtype;
  m.link = linkid;
  m.dt1 = dt1;
  m.dt2 = dt2;
  m.level = level;
  node = nodeIndex[nid];
  node.matches[linkid] = m;
}

function addLink(nid, link){
  //alert('addLInk '+nid+', '+link);
  n = nodeIndex[nid];
  n.links[n.links.length] = link;
}
function addPath(node1, node2, path){
  //alert('Adding path'+node1.id+node2.id);
  paths[node1.id+node2.id] = path;
  paths[node2.id+node1.id] = path;
}
function Node(nid, source, sourceName){
  //alert("Node"+', '+nid+', '+source+", "+sourceName);
  //alert('New node "'+nodes.length+'"');
  this.id = nid;
  this.src = source;
  this.srcName = sourceName;
  nodeIndex[nid] = this;
  //alert('new node '+nid);
  this.pos = nodes.length;
  nodes[nodes.length] = this;
  this.links = new Array();
  this.matches = new Array();
  this.ready = false;
  this.selected = false;
}
var flagWidth = 16;
var flagHeight = 11;
var circleSize = 4;
function computePositions(){
  //alert('canvasSize '+canvasSize);
  circleSize = 4 + Math.round(nodes.length/6);
  var midX = canvasSize/2;
  var midY = canvasSize/2;
  var distFromCenter = (canvasSize/2)-30;
  var xmapDistFromCenter = distFromCenter + 4+flagWidth+circleSize/2;
  var ymapDistFromCenter = distFromCenter + 4+flagHeight+circleSize/2;
  var xlinkDistFromCenter = distFromCenter - (2+circleSize/2);
  var ylinkDistFromCenter = distFromCenter - (2+circleSize/2);
  var angleShift = 2*Math.PI/nodes.length;
  var angle = 0.0;
  for (var i=0; i<nodes.length; i++){
    //alert('angle '+angle);
    angle += angleShift;
    nodes[i].x = Math.round(midX + distFromCenter*Math.sin(angle));
    nodes[i].y = Math.round(midY + distFromCenter*Math.cos(angle));
    // mx, my for flags
    nodes[i].mx = Math.round(midX + xmapDistFromCenter*Math.sin(angle));
    nodes[i].my = Math.round(midY + ymapDistFromCenter*Math.cos(angle));
    nodes[i].linkx = Math.round(midX + xlinkDistFromCenter*Math.sin(angle));
    nodes[i].linky = Math.round(midY + ylinkDistFromCenter*Math.cos(angle));
    if (nodes.length==1){
      nodes[i].x = Math.round(midX);
      nodes[i].y = Math.round(midY);
      nodes[i].mx = Math.round(midX + (4+flagWidth+circleSize/2)*Math.sin(angle));
      nodes[i].my = Math.round(midY + (4+flagWidth+circleSize/2)*Math.cos(angle));
    }
  }
}
function linkHoverIn(event){
  //this.attr({stroke:linkHiColor});
  //var t = this.Vpaper.text(event.clientX, event.clientY, "HI from link");
  //this.Vtt = t;
}
function linkHoverOut(event){
  //this.attr({stroke:linkLoColor});
  //alert('this.Vtt '+this.Vtt);
  //this.Vtt.remove();
}
function highlightLinks(node){
  for (var i=0; i<node.links.length; i++){
    nodej = nodeIndex[node.links[i]];
    var p = paths[node.id+nodej.id];
    if (p){
      p.attr({stroke:linkHiColor});
      p.toFront();
    } else {
      //alert('missing '+node.id+', '+nodej.id);
    }
  }
  node.circle.attr({stroke:circleHiColor, fill:circleHiColor});
  //$('#nodeInfo').html('<h4>'+node.srcName+'</h4><p>'+node.id+'</p>').show();
  $('#nodeInfo').html('<h4>'+node.srcName+'</h4><p>'+node.id+'</p>').css({visibility:"visible"});
  //alert('"'+'#PreferredForms'+(node.pos+1)+'"');
  //alert($('#PreferredForms'+(node.pos+1)).html());
  $('#PreferredForms'+(node.pos+1)).addClass('selected');
}
function unHighlightLinks(node){
  for (var i=0; i<node.links.length; i++){
    nodej = nodeIndex[node.links[i]];
    p = paths[node.id+nodej.id];
    if (p) p.attr({stroke:linkLoColor});
  }
  node.circle.attr({stroke:circleLoColor, fill:circleLoColor});
  //$('#nodeInfo').hide();
  $('#nodeInfo').css({visibility:"hidden"});
  $('#PreferredForms'+(node.pos+1)).removeClass('selected');
}
function bringNodesFront(){
  for (var i=0; i<nodes.length; i++){
    //nodes[i].circle.toFront().unclick(clickFunction);
    //nodes[i].circle.click(clickFunction());
  }
}
var linkLoColor = "#ccc";
var linkHiColor = "#ff7600";
var circleLoColor = "#ccc";
var circleHiColor = "#ff7600";

function clickFunction(){
  //alert('click '+this.Vnode);
  if (selectedNode){
    unHighlightLinks(selectedNode);
    selectedNode.selected = false;
  }
  if (!this.Vnode || selectedNode==this.Vnode){
    selectedNode = null
      return;
  }
  if (this.Vnode){
    highlightLinks(this.Vnode);
    bringNodesFront();
    this.Vnode.selected = true;
    selectedNode = this.Vnode;
  }
}
function shortNodeTitle(node){
  return node.id+' '+node.srcName;
}
function genNodeTitle(node){
  if (selectedNode==node) return shortNodeTitle(node);
  if (selectedNode && node.matches[selectedNode.id])
    return '(Match: '+node.matches[selectedNode.id].mtype+') '+node.id;
  return shortNodeTitle(node);
}

function hoverIn(object, event){
  object.attr({title:genNodeTitle(object.Vnode)});
  if (selectedNode) return;
  highlightLinks(object.Vnode);
  bringNodesFront();
}
function hoverOut(object, event){
  object.attr({title:shortNodeTitle(object.Vnode)});
  if (selectedNode) return;
  unHighlightLinks(object.Vnode);
  bringNodesFront();
}
function nodeHoverIn(event){
  hoverIn(this, event);
}
function nodeHoverOut(event) {
  hoverOut(this, event);
}

function selectNode(id){

  hoverIn(circles[id], null);
}
function unselectNode(id){
  //alert('out '+id);
  hoverOut(circles[id], null);
}

function drawNodes(paper){
  for (var i=0; i<nodes.length; i++){
    nodes[i].circle = paper.circle(nodes[i].x, nodes[i].y, circleSize).attr({fill:circleLoColor, "fill-opacity":1, stroke:circleLoColor, "stroke-width":2, title:nodes[i].id+' '+nodes[i].srcName});
    nodes[i].circle.Vnode = nodes[i];
    if (nodes[i].srcName.match(/^SUDOC/)){
      tfHeight = 16;
    }
    else { tfHeight = flagHeight;}
    nodes[i].image = paper.image(viafBase+'images/flags/'+nodes[i].src+'.png', nodes[i].mx-flagWidth/2, nodes[i].my-tfHeight/2, flagWidth, tfHeight).attr({title:nodes[i].id+' '+nodes[i].srcName});
    nodes[i].image.Vnode = nodes[i];
    nodes[i].circle.hover(nodeHoverIn, nodeHoverOut);
    nodes[i].image.hover(nodeHoverIn, nodeHoverOut);
    nodes[i].circle.click(clickFunction);
    nodes[i].image.click(clickFunction);
    circles[nodes[i].id] = nodes[i].circle;
  }
}

function drawLinks(paper){
  var midX = canvasSize/2;
  var midY = canvasSize/2;
  for (var i=0; i<nodes.length; i++){
    var nodei = nodes[i];
    for (var j=0; j<nodes[i].links.length; j++){
      var nodej = nodeIndex[nodes[i].links[j]];
      if (nodej.pos > nodei.pos){
        var mx = (((nodei.x+nodej.x)/2)+midX)/2;
	var my = (((nodei.y+nodej.y)/2)+midX)/2;
	var cpath = [["M", nodei.linkx, nodei.linky], ["C", mx, my, mx, my, nodej.linkx, nodej.linky]];
	var path = paper.path(cpath).attr({stroke:linkLoColor, "stroke-width":2})
	  path.Vnode1 = nodei;
	path.Vpaper = paper;
	path.Vnode2 = nodej;
	//path.attr({title:'Matched on '+nodei.matches[nodej.id].mtype});
	addPath(nodei, nodej, path);
      }
    }
  }
}
function drawGraph(paper){
  r = paper.rect(0, 0, canvasSize, canvasSize).attr({stroke:"#fff", "stroke-width":0, fill:"#fff"});
  computePositions();
  drawLinks(paper);
  drawNodes(paper);
  r.click(clickFunction);
}

function doSearch(vform){
  var curURL = new String(document.location).toLowerCase();
  tviafBase='http://'+curURL.split('/')[2]+'/viaf/';
  query = '';
  if (!vform['searchTerms'].value) vform['searchTerms'].value="dempsey";
  var vv = vform['searchTerms'].value.replace("\-", " ");
  // don't cut out stuff between non-filing indicators
  vv = vv.replace("\u0098", " ");
  vv = vv.replace("\u009C", " ");
  fields = vform['selector0'].value;
  // swap next two lines to not expect source
  subsection = vform['selector1'].value;
  //subsection = 'viaf';
  if (fields.substr(0,1)=='X'){
    query += fields.substr(1) + '+exact+"' + vv + '"';
  } else{
    query += fields + '+all+"' + vv + '"';
  }
  //query  += fields + '+all+"' + vv + '"';
  //query  += fields + '"' + vv + '"';
  if (subsection != 'viaf'){
    query += '+and+local.sources+any+"'+subsection+'"';
  }
  nq = tviafBase+"search?query="+query+'&stylesheet='+viafBase+'xsl/results.xsl&sortKeys=holdingscount&maximumRecords=100';
    document.location = nq;
    return false;
}
function updateSearchForm(vform, index, term, subsection){
  //alert('index '+index+', term '+term+', subsection '+subsection);
  vform['searchTerms'].value = term;
  vform['selector0'].value = index;
  vform['selector1'].value = subsection
}
function updateSearchForms(index, relation, term, subsection){
  //alert('index '+index+', relation '+relation+', term '+term+', subsection '+subsection);
  if (!index){
    index = readCookie('searchIndex');
    if (index=='') index = 'cql.any+all+';
    term = decodeURIComponent(readCookie('searchTerm'));
    subsection = readCookie('subsection');
    if (subsection=='') subsection='viaf';
  }
  if (relation=='exact'){
    index = 'X'+index;
  }
  updateSearchForm(document.visibleForm, index, term, subsection);
  if (document.visibleFormBottom){
    updateSearchForm(document.visibleFormBottom, index, term, subsection);
  }
  document.visibleForm.searchTerms.focus();
  createCookie('searchIndex', index);
  createCookie('searchTerm', encodeURIComponent(term));
  createCookie('subsection', subsection);
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return '';
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function showhidelist(id)	{
	
	document.getElementById('viewListLink').style.display = 'none';
	document.getElementById('hideListLink').style.display = 'none';
	document.getElementById('countryList').style.display = 'none';
	
	if (id == 'viewListLink')	{
		
	document.getElementById('hideListLink').style.display = 'block';
	document.getElementById('countryList').style.display = 'block';
	}
	else {
		
	document.getElementById('viewListLink').style.display = 'block';
	document.getElementById('hideListLink').style.display = 'none';
	document.getElementById('countryList').style.display = 'none';
	}

}


// var state = [];
// state ["AltFormsContent"] =  "none";
// state ["GraphContent"] =  "block";
// state ["TitleLinksContent"] = "block";
// state ["RelatedNamesContent"] =  "block";
// state ["SelectedTitlesContent"] =  "block";
// state ["DatamapContent"] =  "none";
// state ["PublishersContent"] =  "none";
// state ["HistoryContent"] =  "none";
// state ["UnimarcContent"] =  "none";
// state ["Marc21Content"] =  "none";
// state ["AltFormsContent"] =  "none";
// state ["AboutContent"] =  "none";
// state ["TimelineContent"] =  "none";
// state ["CountriesContent"] =  "none";
		


//function  sectionShowHide(id)	{
	//alert(id);
	//var sec = document.getElementById(id);
	
	//$('#id').toggle();
	  ///if(sec.style.display == 'none'){
	  //SlideDown(id, {duration: .5});
	  //document.getElementById(id + 'Open').style.display = 'none';
	  //document.getElementById(id + 'Close').style.display = 'inline';
   	//}
	
	//else{
	//SlideUp(id, {duration: .5});
	  //document.getElementById(id + 'Open').style.display = 'inline';
	  //document.getElementById(id + 'Close').style.display = 'none';
	//}
//} 

function mapSwitch(view)            {
            
            document.getElementById("map-world").style.display='none';
            document.getElementById("map-euro").style.display='none';
            document.getElementById("map-asia").style.display='none';
            
            id = "map-" + view;
            //alert(id);
            document.getElementById(id).style.display = 'block';
            
            if (view == "world")          {
                        document.getElementById("mapbutton-world").className = 'mapbutton-on';
                        document.getElementById("mapbutton-euro").className = 'mapbutton-off';
                        document.getElementById("mapbutton-").className = 'mapbutton-off';
            }
            
            if (view == "euro") {
                        document.getElementById("mapbutton-world").className = 'mapbutton-off';
                        document.getElementById("mapbutton-euro").className = 'mapbutton-on';
                        document.getElementById("mapbutton-").className = 'mapbutton-off';
            }
            
            else {
                        document.getElementById("mapbutton-world").className = 'mapbutton-off';
                        document.getElementById("mapbutton-euro").className = 'mapbutton-off';
                        document.getElementById("mapbutton-").className = 'mapbutton-on';      
            }
            
            
            
}

function doMouseDown(e, id){
  if (!e) var e=window.event;
  //alert('which '+e.which);
  if (e.button=='2'){  // right mouse button
    document.location = "http://viaf.org/processed/"+id;
    return false;
  }
  return true
}
function doMouseUp(e){
  if (!e) var e=window.event;
  if (e.button=='2'){  // right mouse button
    return false;
  }
  return true;
}

