
//globals
	var wordCollection 	= [];
	var firstNode = null;
	var tubes 			= []; 
	var highlightTubes 	= [];
	
	
	var canvasW = 900;
	var canvasH = 500;
	var tubeColor = 'rgb(3, 3, 3)';
	var highlightTubeColor = 'rgb(130, 3, 3)';
	var tubeWidth = 1;
	
	var wordContainerId = 'newWordContainer';
	
	
	            
	            
	var hOffset = 0;
	var wOffset = 0; 
	
	var tubePrefix = "#node_";

	

//
function init()
{
	LoadListeners();
	refreshAll();
	updateOffsets();

	if (jQuery.url.param("t"))
	{
        tags = jQuery.url.param("t").split(",");

        for(var i = 0; i < tags.length; i++)
        {
            taxonomize(cleanMe(tags[i]));
            
        }
		

	} 
}

function drawBackground(node)
{
	var pos = node.offset();

	ct = getCanvas();
	ct.fillStyle = "#DDCCCC";
	var t = Math.abs(hOffset - pos.top + node.height() - 10);
	var l = Math.abs(wOffset - pos.left + (node.width() / 2));
	ct.fillRect(l ,t ,100,30);
}



function LoadListeners()
{
	$('#btNewWord').click(function()
	{
		postNewWord();
		return false;
	});

	$('#newNodeLink').click(function()
	{
		newNode();
		return false;
	});

	$('#tbNewWord').keyup(function(e) 
	{
		if(e.keyCode == 13) 
		{
			postNewWord();
		}
	});


	$('#canvas').click(function()
	{
		$('div.node').css('background','#EEE');
		redrawCanvas();
		return false;
	});
    $("#tbNewWord").autocomplete(
    		"/async/tagsearch",
    		{
    			delay:10,
    			minChars:4,
    			matchSubset:1,
    			matchContains:1,
    			cacheLength:10,
    			onFindValue:findValue,
    			formatItem:formatItem,
    			autoFill:true
    		});            


}

function refreshLinkMeNodes()
{
	$('.linkMe').click(function()
	{
		toggleLinkMe($(this));
		
		
		if (firstNode == null)
			firstNode = $(this);
		else
			linkNodes(firstNode , $(this));
		
		return false;
	});

}
function linkNodes(n1 , n2)
{
        getCanvas().clearRect(0, 0, canvasW, canvasH);
		firstNode = null;
		
		//does this actually work?
		
		if (n1.parent().get(0).previousSibling.textContent == n2.parent().get(0).previousSibling.textContent )
		{
			redrawCanvas();
			return;
		}
		//alert('linking...');
		$.ajax({
		  type: "POST",
		  url: "/async/linkwords",
		  data: "n1="+n1.attr('word')+"&n2="+n2.attr('word'),
		  success: function(msg){

			
				tubes.push([tubePrefix+n1.attr('word'), tubePrefix+n2.attr('word')]);
				redrawCanvas();
			
				$('.linkMe').html("+");
				firstNode = null;
		  }
		});

}


function toggleLinkMe(e)
{
	
	if (e.html() == "-")
	{
		e.html("+");		
	}
	else
	{
		e.html("-");
		
	}
}
function refreshAll()
{
	updateOffsets();
	refreshDraggables();
	refreshLinkMeNodes();


}
function updateOffsets()
{
	var pos = $("#canvas").offset();
	wOffset = pos.left - 50;
	hOffset = pos.top - 10;
}
function refreshDraggables()
{
	$(".drag").draggable(
	{
//        helper: 'clone',
//        opacity: 0.5
	}
	);
	$("div.node").bind('mouseup' , function()
	{
		redrawCanvas();
	})
	$("div.node").bind('mousedown' , function(e)
	{
		drawBackground($(this));
	})
	$("div.node").bind('click' , function()
	{
		select($(this));
	})

}
function select(e)
{
	$('div.node').css('background','#EEE');
	
	if (e.id != wordContainerId)
	{
		$(e).css('background' , '#FE8787');
		
		var nodeIdSelected = tubePrefix+getWordFromNode($(e));
		for (var i = 0; i < tubes.length; i++)
		{
			if (tubes[i][0] == nodeIdSelected)
				drawHighlightTube(getCanvas(), $(e) , $(tubes[i][1]))

			if (tubes[i][1] == nodeIdSelected)
				drawHighlightTube(getCanvas(), $(e) , $(tubes[i][0]))
			
		
		}
		
		 
	}
}
function more(word)
{
	taxonomize(word);
}
function postNewWord()
{
	$('div.node').css('background','#EEE');

	var cleanWord = cleanMe($("#tbNewWord").val());
	taxonomize(cleanWord);
}
function taxonomize(word)
{
	$.ajax({
	  type: "POST",
	  url: "/async/newword",
	  data: "word="+word,
	  success: function(msg){
	  	var words = eval(msg);

	    drawWord(word);

    	var wordsToDraw = [];

	    for (i=0;i<words.length;i++)
	    {
			wordsToDraw.push(words[i][0]);
			wordsToDraw.push(words[i][1]);

			tubes.push([tubePrefix+words[i][0], tubePrefix+words[i][1]]);
	    }

		for(i=0;i < wordsToDraw.length; i++)
			drawWord(wordsToDraw[i]);

	    refreshAll();
		redrawCanvas();
	  }
	});

}

function getRandomLeft()
{
	return Math.round(Math.random() * 325) + 10;
}

function getRandomTop()
{
	return Math.round(Math.random() * 425) + 40;
}

function drawDeleteLink(a , b)
{
	var wA = getWordFromNode(a);
	var wB = getWordFromNode(b);
	
	if (wA == wB)
	return;
	
	var left = Math.abs(a.offset().left + b.offset().left - wOffset*2 - 30 ) / 2 ; 
	
	var top  = Math.round(Math.abs(a.offset().top + b.offset().top - hOffset ) / 2);
	
	
	 
	
	var t = '<div class="deleteNode" style="left:'+left+'px;top:'+top+'px;"><a href="#" onclick="deleteLink(\''+wA+'\',\''+wB+'\');return false;" class="deleteLink">X</a></div>';

	$("#nodes").prepend(t);
	

}
function deleteLink(wordA , wordB)
{

		$.ajax({
		  type: "POST",
		  url: "/async/deletelink",
		  data: "n1="+wordA+"&n2="+wordB,
		  success: function(msg){
			tubes = tubes.filter(function(t)
			{
				if (tubePrefix+wordA == t[0] && tubePrefix+wordB == t[1])
					return false;
		
				if (tubePrefix+wordB == t[0] && tubePrefix+wordA == t[1])
					return false;
		
				return true;
			});

			redrawCanvas();
		    refreshAll();
		  }
		  
		});

}
function getWordFromNode(n)
{
	return n.get(0).childNodes[2].firstChild.nodeValue;

}
function drawWord(word)
{
	if (wordCollection.contains(word))
		return;

    wordCollection.push(word);

	var nodeId = "node_"+word;
	var h = getRandomLeft()+'px'
	var w = getRandomTop()+'px'
	var link = '<span class="linker"><a class="linkMe"  word="'+word+'" href="#">+</a></span>';
	var more = '<a href="#" class="moreNode" onclick="more(\''+word+'\');return false;">+</a>';
	
	var t = '<div style="left:'+h+';top:'+w+';" class="node drag" id="'+
	nodeId+'">'+more+'<a href="#" onclick="hideNode(\''+nodeId+'\');return false;" class="hideNode">x</a>'+
	'<span class="word" >'+word+'</span>'+link+'</div>';
	
	$("#nodes").prepend(t);
}
function hideNode(nodeId)
{
	$("#"+nodeId).remove();
		var n = nodeId.split("_");
		
	tubes = tubes.filter(function(t)
	{
		return !(t[0] == "#"+nodeId || t[1] == "#"+nodeId);
	});	
	wordCollection = wordCollection.filter(function(t)
	{


		return t != n[1];
	});
	redrawCanvas();
}
function redrawCanvas() 
{
    var ctx = getCanvas();
        ctx.clearRect(0, 0, canvasW, canvasH);
		$(".deleteNode").remove();
 
        for(var i = 0; i < tubes.length ;i++)
            drawTube(ctx, $(tubes[i][0]), $(tubes[i][1]));
}
function getCanvas()
{
	var canvas = $("#canvas").get(0);
	
    if(canvas.getContext) 
        return canvas.getContext('2d');
      
	return null;
}

// Draw a tube between two nodes
function drawHighlightTube(ctx , a , b)
{

    drawLine(ctx, a.offset().left, a.offset().top, b.offset().left, b.offset().top, highlightTubeColor);

}


function drawTube(ctx, a, b) 
{	
	drawDeleteLink(a,b);

    drawLine(ctx, a.offset().left, a.offset().top, b.offset().left, b.offset().top, tubeColor);
    
}
function drawLine(ctx, x1, y1, x2, y2, tubeColor) 
{

    ctx.strokeStyle = tubeColor;
    ctx.lineWidth = tubeWidth;
    ctx.beginPath();
    ctx.moveTo(x1 - wOffset, y1 - hOffset);
    ctx.lineTo(x2 - wOffset, y2 - hOffset);
    ctx.stroke();
}
