	var STARTING_PARAGRAPH ='';
	var EXCERPTS = [];
	var ID = 0;
	var SCROLL_IN_PROGRESS = false;
    var LINK_PREFIX = '/taxonomize/?t=';
    var GARDEN_LINK_PREFIX = '/garden/t/';
    function UpdateTaxonomizeLink()
    {
        var taxlink = LINK_PREFIX;
        var gardenlink = GARDEN_LINK_PREFIX;
        var link = "";
        var i = 0;
        for (var ex in EXCERPTS)
        {
            if (EXCERPTS[ex].tags)
            {
                
                for(var j = 0; j < EXCERPTS[ex].tags.length; j++)
                {
                    if (i != 0)
                    
                        link += ',';
                    link += EXCERPTS[ex].tags[j].word;
                    
                    i++;
                }
            }
            
        }
        $('.taxonomizelink').attr('href' , taxlink + link);
        $('.gardenlink').attr('href' , gardenlink + link);

    }
	function Excerpt(paragraph , text , tags , neighbours)
	{
		this.id = null;
		this.paragraph = paragraph;
		this.text = text;
		this.tags = tags;
		this.neighbours = neighbours;

	}
	Excerpt.prototype.getId = function()
	{
		return this.id;
	}
	Excerpt.prototype.Render = function()
	{
		$("#row_"+this.paragraph + " .references").append(this.getReferenceHtml());


		$("#excerpt_"+this.id).fadeIn();

        UpdateTaxonomizeLink();

    	$("#excerpt_"+this.id).hover(function()
    	{
    		var txt = $(this).find('.text').html();
    		var paragraph = $(this).find('.p').html();

    		var words = txt.replace(/^\s+|\s+$/g, '').split(' ');


    		var i = 0;
    		var select = "";
    		while( i < words.length)
    		{

    			if (select[select.length - 1] != ' ' )
    				select += ' ';

    			if (i < words.length)
    				select += words[i];

				i++;
    		}

       		$('#row_'+paragraph+' .content').each(function() { $.highlight(this, select); });



    	}
    	,function()
    	{
			var paragraph = $(this).find('.p').html();

			$('#row_'+paragraph+'  .content').removeHighlight();
    	});
		loadToggleListener($("#excerpt_"+this.id + ' .toggle'));
		loadDeleteListener($("#excerpt_"+this.id + ' .delete'));

	}
	Excerpt.prototype.getReferenceHtml = function()
	{
var link = "";
var tagsForLink = [];
var h = '<div id="excerpt_'+this.id+'"  class="excerptblock" style="display:none;" >\n\
	<div class="heading"><div class="toggle">-</div><div class="open">open</div><div class="delete">x</div></div>\n\
	<span class="p" style="display:none;">'+this.paragraph+'</span>\n\
	<div class="text">'+this.text+'</div>\n\
	<div class="tags">\n\
		<div class="title">tags</div>\n\
		<ul class="toggleme">';

		for (var i = 0 ; i < this.tags.length; i++)
		{
            if (! tagsForLink.contains(this.tags[i].word))
                tagsForLink.push(this.tags[i].word);
			h += '<li><a href="'+LINK_PREFIX+this.tags[i].word+'" >'+this.tags[i].word+'</a></li>';
		}


		h += '</ul>\n\
	</div>\n\
	<div class="neighbours">\n\
		<div class="title">neighbours</div><ul class="toggleme">';
		for (var i = 0 ; i < this.neighbours.length; i++)
		{
            if (! tagsForLink.contains(this.neighbours[i]))
                tagsForLink.push(this.neighbours[i]);

			h += '<li><a href="/?t='+this.neighbours[i]+'">'+this.neighbours[i]+'</a></li>';
		}
        for(var i=0; i< tagsForLink.length; i++)
        {
            if (i != 0)
                link += ',';

            link += tagsForLink[i];
        }

		h += '</ul>\n\
        <div class="title"><a href="'+LINK_PREFIX+link+'">taxonomize</a> | <a href="'+GARDEN_LINK_PREFIX+ link+'">garden</a></div>\n\
	</div>\n\
</div>';

	return h;
	}

	Excerpt.prototype.Delete = function()
	{
        $.ajax({
        		type: "POST" ,
        		url: "/text/deleteexcerpt",
        		data: "id="+this.id ,
        		success: function(msg)
        		{
        			$("#excerpt_"+msg).fadeOut(function()
        			{
        				$("#excerpt_"+msg).remove();
        			});

        			EXCERPTS.filter(function(item)
        			{
        				return (item.id != msg)
        			});

        		}
        	});
	}
	function deleteTag(tagname)
	{
		$('#tag_'+tagname).remove();
		return false;
	}
	function loadToggleListener(emt)
	{
		$(emt).click(function()
		{
			$(this).parent().parent().find('.toggleme').toggle();
			return false;
		});
	}
	function loadDeleteListener(emt)
	{
		emt.click(function()
		{

			var id = $(this).parent().parent().get(0).id;

				id = id.split("_");

			EXCERPTS[id[1]].Delete();
			return false;
		});
	}
	function getAllExcerpts()
	{
        $.ajax({
        		type: "POST" ,
        		url: "/text/getallexcerpts",
        		data: "text_id=1" ,
        		success: function(msg)
        		{
        			var ex =  $.parseJSON(msg);

        			for (var i = 0 ; i < ex.length ; i ++ )
        			{
        				addJsonExcerptToExcerpts(ex[i]);

                        setTimeout(scrollTo , i * 500, "#row_"+ex[i]['model'].paragraph);

        			}


        		}
        	});
	}
    function scrollTo(row)
    {
        $(window).scrollTo(row, 500);
    }
	function addJsonExcerptToExcerpts(ex)
	{
		EXCERPTS[ex['model'].id] = new Excerpt(ex['model'].paragraph , ex['model'].text , ex['tags'] , ex['neighbours']);
		EXCERPTS[ex['model'].id].id =ex['model'].id;
		EXCERPTS[ex['model'].id].Render();

	}
	function init()
	{
		$(".drag").draggable();
		$('#tagbox').scrollFollow( {relativeTo: "bottom"} );
		getAllExcerpts();
		$('.sifterblock').mousedown(function()
		{

			STARTING_PARAGRAPH = this.id;
		});
		$(window).mouseup(function()
		{
			if (!STARTING_PARAGRAPH)
				return;

            var selObj = window.getSelection();

            if (true) //selObj.focusNode.length > 5)
            {
            	$("#tagbox .form").html(getTagboxHtml(STARTING_PARAGRAPH, selObj+""));
                $('#frtagbox').submit(function()
                	{
                		var tag = cleanMe($('#tbtagbox').val());
                		$('#tagbox .tags').append('<li id="tag_'+tag+'"><span class="tag" >' +tag+ '</span><a href="#" onclick="deleteTag(\''+tag+'\')">x</a> </li>');
                		return false;
                	});
                $("#tbtagbox").autocomplete(
                		"/async/tagsearch",
                		{
                			delay:10,
                			minChars:4,
                			matchSubset:1,
                			matchContains:1,
                			cacheLength:10,
                			onFindValue:findValue,
                			formatItem:formatItem,
                			autoFill:true
                		});
            	$('#tagbox').show();
            }
            STARTING_PARAGRAPH = null;

		   return false;
		});



	}
function getTagboxHtml(p, selected)
{
	var html = '<span class="paragraph">'+p+'</span><span class="excerpt">'+selected+'</span><form id="frtagbox">\n\
		tag: <input type="text" name="tbtagbox" id="tbtagbox" />\n\
		<ul class="tags"></ul><a href="#" onclick="savetag();return false;">save</a>\n\
	</form>\n\
	';
	return html;
}
function savetag()
{
	var ex = new Excerpt($('#tagbox .paragraph').html() , $('#tagbox .excerpt').html().replace(/^\s+|\s+$/g, '') , getTags());
	$.ajax({
		type: "POST" ,
		url: "/text/saveexcerpt",
		data: "excerpt="+$.toJSON(ex) ,
		success: function(msg)
		{
			var ex = $.parseJSON(msg);
			addJsonExcerptToExcerpts(ex);

		}
	});

}

function getTags()
{
	var tags = [];
	$('#tagbox .tag').each(function()
	{
		var tag = $(this).html();
		if (!tags.contains(tag))
			tags.push(tag);
	});
	return tags;
}





