$(function() {
  // show the search form for javascript-enabled browsers
  $("#search").show();

	$("#searchbutton").click(function() {
		doSearch();
	});

	$("#showallbutton").click(function() {
		$("#query").val('');
		list_all();
	});

	//capture the return key
	$(".search").bind("keydown", function(e) {
		var ch = String.fromCharCode( e.which );
		//puts( "zomg key down: " + ch );
		if (e.keyCode == 13) {
			doSearch();
			return false;
		}
	});

	// Add convenience content generation functions
	var tags = ["div", "li", "ul" ];
	jQuery.each( tags, function(str) {
		str = tags[str];
		$[str] = function(a) { 
			return '<'+str+'>' + a + '</'+str+'>';
		};
	});

	// By default, list all abstracts
	list_all();

});

// Show listings of all the abstracts
function list_all() {
	$('#output').empty();
	jQuery.each( docs, function(doc) {
		puts ( gen_listing( docs[doc], '' ) );
	});
}


function puts( str ) {
	$("#output").append( "<div>" + str + "</div>\n" );
	//$.div(str)).appendTo( $("#output") );
}
	

function register_expand_click_events() {
	$("a.toggler").click( function( event ) {
		event.stopImmediatePropagation();

		//puts( "URL:" +  url );
		var index = $(this).attr("href");
		var div = $(this).next().next().next();

		var query = $("#query").val();
		var txt = docs[index]['summary'];
		var re = new RegExp( query, "g" );

		div.empty();
		div.append( JsAutoP(txt).replace( re, strong_query ) );

		div.toggle( 400 );
		return false;
	});
}


function doSearch( ) {
	$('#output').empty();

	var query = $("#query").val();
	var fieldselect = $(".fieldselect:checked").val();
	var fsmap = {
		'title': "title",
		'authors': "authors",
		'summary': "contents",
		'any': "any"
	};
		
	var fieldselectname = fsmap[fieldselect];
	//puts( fieldselectname );
	//puts( q );
	

	strong_query = '<strong>'+query+'</strong>';
	var results = new Array();

	for( p in docs ) {
		var page = docs[p];

		var searchtxt = "";

		if ( fieldselect == 'any' ) {
			searchtxt = searchtxt + page['title']; 
			searchtxt = searchtxt + page['authors']; 
			searchtxt = searchtxt + page['summary']; 
		}
		else {
			searchtxt = page[fieldselect]; 
		}

		var re = new RegExp( query, "i" );
		var i = searchtxt.search( re );
		if ( i != -1 ) {

			var match = searchtxt.match( re )[0];
			var strong_match = '<strong>'+match+'</strong>';

			var preroll = searchtxt.substring( i-20, i );
			var pstroll = searchtxt.substring( i+query.length, i+query.length+20 );
			var str = "..." + preroll + strong_match + pstroll + "...";
			exerptdiv ='<div class="exerpt">'+str+'</div>';

			results.push( gen_listing( page, exerptdiv ) );
		}
	}

	puts( 
		"Search for " + strong_query + 
		" in field: <i>" + fieldselectname + "</i>" + 
		" yielded " + results.length + 
		" matches:" );

	for ( r in results ) {
		puts (results[r]);
	}

	register_expand_click_events();

}

function gen_listing( doc, extradiv ) {

	var name = doc['title'];
	var filename = doc['filename'];

	//var url = doc[0];
	
	//extradiv = $(document.createElement("div")).text( str );
	//extradiv = $(document.createElement("div")).text( str );

	//lnk = '<a class="toggler" href="'+p+'" >'+name+'</a>';
	index      = '<h3 class="indexid"><a href="pdfs/'+filename+'.pdf" >'+doc['id']+'</a></h3>';
	lnk        = '<div class="title"><a href="pdfs/'+filename+'.pdf" >'+name+'</a></div>';
	authordiv  = '<div class="author">'+doc['authors']+'</div>';
	contentdiv = '<div class="toggler"></div>';

	//puts( lnk + ": <ul><li>" + str + "</li><li>" + div + '</li></ul>' );
	//puts( '<div class="searchresult">' + lnk + ": " + extradiv + contentdiv  + '</div>' );
	return '<div class="searchresult">' + 
			'<table cellspacing="1" width="100%"><tr><td rowspan="2" class="abstract-number">' + 
				index + 
			'</td><td class="desc">' + 
				lnk + authordiv + extradiv + contentdiv + 
			'</td></tr></table>' + 
		'</div>';
}


function JsAutoP(s) {
  if (!s || s.search(/n|r/) == -1) {
    return s;
  }
  var  X = function(x, a, b) {return x.replace(new RegExp(a, 'g'), b)};
  var  R = function(a, b) {return s = X(s, a, b)};
  var blocks = '(table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select'
  blocks += '|form|blockquote|address|math|style|script|object|input|param|p|h[1-6])';
  s += '\n';
  R('<br />\\s*<br />', '\n\n');
  R('(<' + blocks + '[^>]*>)', '\n$1');
  R('(</' + blocks + '>)', '$1\n\n');
  R('\r\n|\r', '\n'); // cross-platform newlines
  R('\n\n+', '\n\n');// take care of duplicates
  R('\n?((.|\n)+?)\n\\s*\n', '<p>$1</p>\n');// make paragraphs
  R('\n?((.|\n)+?)$', '<p>$1</p>\n');//including one at the end
  R('<p>\\s*?</p>', '');// under certain strange conditions it could create a P of entirely whitespace
  R('<p>(<div[^>]*>\\s*)', '$1<p>');
  R('<p>([^<]+)\\s*?(</(div|address|form)[^>]*>)', '<p>$1</p>$2');
  R('<p>\\s*(</?' + blocks + '[^>]*>)\\s*</p>', '$1');
  R('<p>(<li.+?)</p>', '$1');// problem with nested lists
  R('<p><blockquote([^>]*)>', '<blockquote$1><p>');
  R('</blockquote></p>', '</p></blockquote>');
  R('<p>\\s*(</?' + blocks + '[^>]*>)', '$1');
  R('(</?' + blocks + '[^>]*>)\\s*</p>', '$1');
  R('<(script|style)(.|\n)*?</\\1>', function(m0) {return X(m0, '\n', '<PNL>')});
  R('(<br />)?\\s*\n', '<br />\n');
  R('<PNL>', '\n');
  R('(</?' + blocks + '[^>]*>)\\s*<br />', '$1');
  R('<br />(\\s*</?(p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)', '$1');
  if (s.indexOf('<pre') != -1) {
    R('(<pre(.|\n)*?>)((.|\n)*?)</pre>', function(m0, m1, m2, m3) {
      return X(m1, '\\\\([\'\"\\\\])', '$1') + X(X(X(m3, '<p>', '\n'), '</p>|<br />', ''), '\\\\([\'\"\\\\])', '$1') + '</pre>';
    });
  }
  return R('\n</p>$', '</p>');
}

