<!DOCTYPE html>
<html>
  <head>
	  <title>DeReKo-Word-Vector-Distances: <%= $word %></title>
    <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
		<link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Condensed" rel="stylesheet">
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
		<script src = "https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
		<script src = "https://cdn.datatables.net/fixedcolumns/3.2.3/js/dataTables.fixedColumns.min.js"></script>
		<script src = "https://cdn.datatables.net/plug-ins/1.10.16/sorting/scientific.js"></script>
		<link rel="stylesheet" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css">
    <script
			src="http://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
			integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
			crossorigin="anonymous"></script>
    <script>
		 var urlParams = new URLSearchParams(window.location.search);

     $('#firstable').hide();
		 $(document).ready(function() {

			 $("input").bind("keydown", function(event) {
				 // track enter key
				 var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode));
				 if (keycode == 13) { // keycode for enter key
					 // force the 'Enter Key' to implicitly click the Update button
					 document.getElementById('SEARCH').click();
					 return false;
				 } else  {
					 return true;
				 }});

       if (localStorage) { // let's not crash if some user has IE7
         var index = parseInt(localStorage['tab']||'0');
			   $("#tabs").tabs({ active: index });
       }

       $( "#tabs" ).on( "tabsactivate", function( event, ui ) {
         if (localStorage) localStorage['tab'] = ui.newTab.index();
       });

		   $(function(){
			   $("#SEARCH").click(function() {
				   window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
			   });
		   });

			 $('#firsttable').DataTable({
				 "sScrollY": "780px",
				 "bScrollCollapse": true,
				 "bPaginate": false,
				 "bJQueryUI": true,
				 "dom": '<"top">rt<"bottom"flp><"clear">',
				 "aoColumnDefs": [
					 { "sWidth": "10%", "aTargets": [ -1 ] }
				 ]
			 } );

       $( "#first" ).clone().prependTo( "#tabs-2" );

       function changeCharColor(txt, heat) {
         var newText = "";
         for (var i=0, l=txt.length; i<l; i++) {
           newText += (i == 5 ? txt.charAt(i) : '<span style="background-color:'+getHeatColor(heat[i]/maxHeat)+'">'+txt.charAt(i)+'</span>');
         }
         return newText;
       }

       function getHeatColor(value) {
         var hue=((1-value)*120).toString(10);
         return ["hsl(",hue,",90%,70%)"].join("");
       }

			 function bitvec2window(n, heat) {
				 var str = n.toString(2).padStart(10, "0")
										.replace(/^([0-9]{5})/, '$1x')
										.replace(/0/g, '·')
										.replace(/1/g, '+');
			   return changeCharColor(str, heat);
			 }

			 var collocatorData = <%= b(Mojo::JSON::to_json($collocators)) %>;
       var maxHeat; // = Math.max.apply(Math,collocatorData.map(function(o){return o.cprob;}))

			 if (collocatorData != null) {
         maxHeat = Math.max.apply(Math,collocatorData.map(function(o){return Math.max.apply(Math,o.heat);}))
				 var t = $('#secondtable').DataTable({
           data: collocatorData,
					 "sScrollY": "800px",
					 "bScrollCollapse": true,
					 "bPaginate": false,
					 "bJQueryUI": true,
					 "dom": '<"top">rt<"bottom"flp><"clear">',
					 "columns": [
						 { "data": "rank", type: "allnumeric" },
						 { "data": "pos", width: "7%", sClass: "dt-center mono compact", render: function ( data, type, row ) {return bitvec2window(data, row.heat) }},
						 { "data": "max",  render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "conorm", render: function ( data, type, row ) {return data.toFixed(3) }},
						 { "data": "prob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "cprob", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) }  },
						 { "data": "overall", type: "scientific", render: function ( data, type, row ) {return data.toExponential(3) } },
						 { "data": "word",  sClass: "collocator" }
					 ],
					 "columnDefs": [
						 { className: "dt-right", "targets": [0,2,3,4,5,6] },
						 { className: "dt-center", "targets": [ 1] },
						 { "searchable": false,
							 "orderable": false,
							 "targets": 0
						 },
						 { "type": "scientific", targets: [2,3,4,5,6] },
						 { "orderSequence": [ "desc" ], "targets": [ 2, 3, 4, 5, 6 ] },
						 { "orderSequence": [ "asc", "desc" ], "targets": [ 1, 7 ] },
					 ],
					 "order": [[ 4, 'desc' ]],
				 } );

				 t.on( 'order.dt search.dt', function () {
					 t.column(0, {order:'applied'}).nodes().each( function (cell, i) {
						 cell.innerHTML = i+1;
					 } );
				 } ).draw();
			 }
			 $("#tabs").css("visibility", "visible"); // now we can show the tabs

		 });

		 $(function(){
			 $("#dropdownoptions").dialog({
				 title: "Options",
				 autoOpen: false,
				 modal: false,
				 draggable: false,
				 height: "auto",
				 width: "auto",
				 resizable: false,
				 buttons: {
					 "Cancel": function() {
						 $( this ).dialog( "close" );
					 },
					 "Apply": function() {
						 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
					 }
				 }
			 });
		 });

		 $(function(){
			 $("td.collocator").click(function(){
				 queryKorAPCII(this.textContent + " /w5 " + urlParams.get('word'));
			 });
		 });

		 $(function(){
			 $("#showoptions").click(function(){
				 $("#dropdownoptions").dialog("open");
				 var target = $(this);
				 $("#dropdownoptions").dialog("widget").position({
					 my: 'left bottom',
					 at: 'left bottom',
					 of: target
				 });
			 });
		 });

		 $( function() {
			 $( "#no_iterations" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 1000 ) {
						 $( this ).spinner( "value", 1000 );
						 return false;
					 } else if ( ui.value > 10000 ) {
						 $( this ).spinner( "value", 10000 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#neighbours" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 0 ) {
						 $( this ).spinner( "value", 0 );
						 return false;
					 } else if ( ui.value > 200 ) {
						 $( this ).spinner( "value", 200 );
						 return false;
					 }
				 }
			 });
		 } );

		 $( function() {
			 $( "#cutoff" ).spinner({
				 spin: function( event, ui ) {
					 if ( ui.value < 100000 ) {
						 $( this ).spinner( "value", 100000 );
						 return false;
					 } else if ( ui.value > 2000000 ) {
						 $( this ).spinner( "value", 2000000 );
						 return false;
					 }
				 }
			 });
		 } );

     $( function() {
			 $( "#tabs" ).tabs().addClass('tabs-min');
		 } );

		 $( function() {
			 $( ".controlgroup-vertical" ).controlgroup({
				 "direction": "vertical"
			 });
		 } );

		 $(function() {
			 $( document ).tooltip({
				 content: function() {
					 return $(this).attr('title');
				 }}
			 )
		 })

    </script>
	  <script src="//d3js.org/d3.v3.min.js" charset="utf-8"></script>
	  <script src="/derekovecs/js/tsne.js"></script>
	  <script src="/derekovecs/js/som.js"></script>
	  <script src="/derekovecs/js/labeler.js"></script>
    <style>
     body, input {
	     font-family: Lato, sans-serif;
	     font-size: 11pt;
     }

		 h1,  h2, h3 {
			 margin: 5px 10px 0 0;
			 color: rgb(246,168,0);
			 font-family: "Univers LT Std 47 Cn Lt", "Univers LT Std 67 Cn Lt", "Roboto Condensed", "Univers LT Std 67 Cn Bold", "UniversLTStd-BoldCn", "Times", 'League Gothic', Impact, sans-serif;
			 font-weight: bold;
			 line-height: 1.35;
			 letter-spacing: normal;
			 text-transform: uppercase;
			 text-shadow: none;
			 word-wrap: break-word;
		 }


		 showoptions, #SEARCH {
			 margin-left: 10px;
			 margin-right: 10px;
		 }

		 .tabs-left-vertical .ui-tabs-nav {
			 position: absolute;
			 width: 21em;
			 transform: translate(-100%,0%) rotate(-90deg);
			 transform-origin: 100% 0%;
		 }

		 .tabs-left-vertical .ui-tabs-nav li {
			 float: right;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 padding-left: 3.5em;
		 }

		 .tabs-left-vertical .ui-tabs-panel {
			 height: 20em;
		 }

		 .mono {
			 font-family: "DejaVu Sans Mono", Inconsolata, SourceCodePro, Courier;
		 }

		 .ui-tooltip-content {
			 font-size: 9pt;
			 color: #222222;
		 }

		 svg > .ui-tooltip-content {
			 font-size: 8pt;
			 color: #222222;
		 }

		 a.merged {
			 color: green;
			 fill: green;
		 }

		 #first a {
			 text-decoration: none;
		 }

		 a.marked, #first a.marked {
			 text-decoration: underline;
		 }

		 a.target {
			 color: red;
			 fill: red;
		 }

		 table.display {
			 width: 40% important!;
			 margin: 1;  /* <- works for me this way ****/
		 }

		 table.dataTable thead th, table.dataTable thead td, table.dataTable tbody td {
			 padding: 2px 2px;
			 //  border-bottom: 1px solid #111;
		 }

		 #collocators {
			 margin-bottom: 15px;
		 }

		 #header {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #topwrapper {
			 width: 100%;
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #wrapper {
			 //   border: 1px solid red;
			 overflow: hidden; /* will contain if #first is longer than #second */
		 }

		 #pagetitle {
			 max-width: 460px;
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }

		 #options {
			 float: left;
			 width: 800px;
			 margin: 10px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 #word {
			 width: 50%;
		 }

		 #first {
			 margin-right: 20px;
			 float: left;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
			 //    border: 1px solid green;
		 }
		 #tabs {
			 margin-right: 20px;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }

		 .tabs-min {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-widget-header {
			 background: transparent;
			 border: none;
			 border-bottom: 1px solid #c0c0c0;
			 -moz-border-radius: 0px;
			 -webkit-border-radius: 0px;
			 border-radius: 0px;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default {
			 background: transparent;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active {
			 background: transparent url(img/uiTabsArrow.png) no-repeat bottom center;
			 border: none;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-default a {
			 color: #c0c0c0;
		 }

		 .tabs-min .ui-tabs-nav .ui-state-active a {
			 color: rgb(246,168,0);
		 }

		 #embed {
			 max-width: 802px;
			 border: 1px solid #333;
		 }

		 #second {
			 min-width: 800px;
			 //       border: 1px solid #333;
			 overflow: hidden; /* if you don't want #second to wrap below #first */
		 }
		 #som2 svg {
			 border: 1px solid #333;
		 }

		 #cost {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 4px;
			 margin-bottom: 12px;
		 }

		 #sominfo1, #sominfo {
			 font-size: 8pt;
			 color: #222222;
			 margin-top: 0px;
		 }

		 #somcolor1, #somcolor2, #somcolor3 {
			 display: inline-block;
			 height: 10px;
			 width: 10px;
		 }

		 #third {
			 border: 1px solid #333;
		 }

    </style>
    <script>

     var opt = {epsilon: <%= $epsilon %>, perplexity: <%= $perplexity %>},
		     mapWidth = 800, // width map
		     mapHeight = 800,
		     jitterRadius = 7;

     var T = new tsnejs.tSNE(opt); // create a tSNE instance

     var Y;

     var data;
     var labeler;

     function applyJitter() {
			 svg.selectAll('.tsnet')
					.data(labels)
					.transition()
					.duration(50)
					.attr("transform", function(d, i) {
						T.Y[i][0] = (d.x - mapWidth/2 - tx)/ss/20;
						T.Y[i][1] = (d.y - mapHeight/2 - ty)/ss/20;
						return "translate(" +
											  (d.x) + "," +
											  (d.y) + ")";
					});
     }

     function updateEmbedding() {
			 var Y = T.getSolution();
			 svg.selectAll('.tsnet')
					.data(data.words)
					.attr("transform", function(d, i) {
						return "translate(" +
											   ((Y[i][0]*20*ss + tx) + mapWidth/2) + "," +
											   ((Y[i][1]*20*ss + ty) + mapHeight/2) + ")"; });
     }

     var svg;
     var labels = [];
     var anchor_array = [];
     var text;

     function drawEmbedding() {
			 $("#embed").empty();
			 var div = d3.select("#embed");

			 // get min and max in each column of Y
			 var Y = T.Y;

			 svg = div.append("svg") // svg is global
								.attr("width", mapWidth)
								.attr("height", mapHeight);

			 var g = svg.selectAll(".b")
									.data(data.words)
									.enter().append("g")
									.attr("class", "tsnet");

			 g.append("a")
				.attr("xlink:href", function(word) {
					return (data.urlprefix+word);})
				.attr("class", function(d, i) {
					var res="";
					if(data.marked[i]) {
						res="marked ";
					}
					if(data.target.indexOf(" "+d+" ") >= 0) {
						return res+"target";
					} else if(data.ranks[i] < data.mergedEnd) {
						return res+"merged";
					} else {
						return res;
					}
				})
				.attr("title", function(d, i) {
					if(data.mergedEnd > 0) {
						if(data.ranks[i] >= data.mergedEnd) {
         			return "rank: "+i +"  "+"freq. rank: "+(data.ranks[i]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
						} else {
         			return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " (merged vocab)";
						}
					} else {
						return "rank: "+i +"  "+"freq. rank: "+data.ranks[i].toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
					}
				})
				.append("text")
				.attr("text-anchor", "top")
				.attr("font-size", 12)
				.text(function(d) { return d; });

			 var zoomListener = d3.behavior.zoom()
														.scaleExtent([0.1, 10])
														.center([0,0])
														.on("zoom", zoomHandler);
			 zoomListener(svg);
     }

     var tx=0, ty=0;
     var ss=1;
     var iter_id=-1;

     function zoomHandler() {
			 tx = d3.event.translate[0];
			 ty = d3.event.translate[1];
			 ss = d3.event.scale;
			 updateEmbedding();
     }

     var stepnum = 0;

     function stopStep() {
			 clearInterval(iter_id);
			 text = svg.selectAll("text");

			 // jitter function needs different data and co-ordinate representation
			 labels = d3.range(data.words.length).map(function(i) {
				 var x = (T.Y[i][0]*20*ss + tx) + mapWidth/2;
				 var y = (T.Y[i][1]*20*ss + ty) + mapHeight/2;
				 anchor_array.push({x: x, y: y, r: jitterRadius});
				 return {
					 x: x,
					 y: y,
					 name: data.words[i]
				 };
			 });

			 // get the actual label bounding boxes for the jitter function
			 var index = 0;
			 text.each(function() {
				 labels[index].width = this.getBBox().width;
				 labels[index].height = this.getBBox().height;
				 index += 1;
			 });


			 //	 setTimeout(updateEmbedding, 1);
			 //	 setTimeout(
					 labeler =	 d3.labeler()
												 .label(labels)
												 .anchor(anchor_array)
												 .width(mapWidth)
												 .height(mapHeight)
												 .update(applyJitter);
			 //         .start(1000);

			 iter_id = setInterval(jitterStep, 1);
     }

     var jitter_i=0;

     function jitterStep() {
			 if(jitter_i++ > 100) {
				 clearInterval(iter_id);
			 } else {
				 labeler.start2(10);
				 applyJitter();
			 }
     }

     var last_cost=1000;

     function step() {
			 var i = T.iter;

			 if(i > <%= $no_iterations %>) {
				 stopStep();
			 } else {
				 var cost = Math.round(T.step() * 100000) / 100000; // do a few steps
				 $("#cost").html("tsne iteration " + i + ", cost: " + cost.toFixed(5));
				 if(i % 250 == 0 && cost >= last_cost) {
					 stopStep();
				 } else {
					 last_cost = cost;
					 updateEmbedding();
				 }
			 }
     }

     function showMap(j) {
			 data=j;
			 T.iter=0;
			 T.initDataRaw(data.vecs); // init embedding
			 drawEmbedding(); // draw initial embedding

			 if(iter_id >= 0) {
				 clearInterval(iter_id);
			 }
			 //T.debugGrad();
			 iter_id = setInterval(step, 1);
			 if(true) { // (<%= $show_som %>) {
				 makeSOM(j, <%= $no_iterations %>);
			 }
     }
     var queryword;

     function onload() {
       queryword = document.getElementById('word');
     }

     function queryKorAP() {
       window.open('http://korap.ids-mannheim.de/kalamar/?q='+queryword.value, 'KorAP');
     }

     function queryKorAPCII(query) {
       window.open('http://korap.ids-mannheim.de/kalamar/?ql=cosmas2&q='+query, 'KorAP');
     }
    </script>
  </head>
  <body onload="onload()">
		<div id="header">
			<div id="pagetitle">
				<h1>DeReKo-Vectors</h1>
			</div>
			<div id="options"  class="widget">
				<form id="queryform">
					<input id="word" type="text" name="word"  placeholder="Word(s) to be searched" value="<%= $word %>"
								 title="When looking for multiple words use spaces as separators to search around the average vector and | as separator to get the neighbours for each word."/>
					<input id="SEARCH" type="button" value="SEARCH">
					<input type="button" id="showoptions" name="showoptions" value="Options" />
				</form>
				<div id="dropdownoptions" style="display: none">
					<form id="optionsform">
						<div class="controlgroup-vertical">
							<label for="cutoff">cut-off</label>
							<input id="cutoff" type="text" name="cutoff" size="10"  value="<%= $cutoff %>" title="Only consider the most frequent x word forms.">
							<label for="dedupe">dedupe</label>
							<input id="dedupe" type="checkbox" name="dedupe" value="1" <%= ($dedupe ? "checked" : "") %> title="radically filter out any near-duplicates">
							% if($mergedEnd > 0) {
								<label for="sbf">backw.</label>
								<input id="sbf" type="checkbox" name="sbf" value="1" <%= ($searchBaseVocabFirst ? "checked" : "") %> title="If checkecked base vocabulary will be searched first. Otherwise merged vocabulray will be searched first.">
							% }
							<label for="neighbours">max. neighbours:</label>
							<input id="neighbours" size="4" name="n" value="<%= $no_nbs %>">
							<label for="no_iterations">max. iterations</label>
							<input id="no_iterations" name="N" size="4" value="<%= $no_iterations %>">
							<!-- <label for="dosom">SOM</label>
									 <input id="dosom" type="checkbox" name="som" value="1" <%= ($show_som ? "checked" : "") %>> -->
							% if($collocators) {
								<label for="sortby">window/sort</label>
								<select id="sortby" name="sort">
									<option value="0"  <%= ($sort!=1 && $sort!=2? "selected":"") %>>auto focus</option>
									<!-- <option value="1"  <%= ($sort==1? "selected":"") %>>any single position</option>
											 <option value="2" <%= ($sort==2? "selected":"") %>>whole window</option> -->
								</select>
							% }
							<input type="button" value="→ KorAP" onclick="queryKorAP();" title="query word with KorAP"/>
						</div>
					</form>
				</div>
			</div>
		</div>
		<div id="topwrapper">
			<div style="visibility: hidden;" id="tabs">
				<ul>
					<li><a href="#tabs-1">Semantics (TSNE-map)</a></li>
					<li><a href="#tabs-2">Semantics (SOM)</a></li>
					<li><a href="#tabs-3">Syntagmatic (collocators)</a></li>
				</ul>
				<div id="tabs-1">
					% if($lists && (@$lists) > 0 && (@$lists)[0]) {
						<div id="wrapper">
							<div id="first" style="width: 320px">
								<table class="display compact nowrap" id="firsttable">
									<thead>
										<tr>
											<th align="right">#</th><th align="right">cos</th><th align="left">similars</th>
										</tr>
									</thead>
									<tbody>
										% my $j=0; my @words; my @vecs; my @ranks; my @marked;
										% for my $list (@$lists) {
											% my $i=0; while($list) {
												% my $item = (@$list)[$i];
												% my $c = ($collocators? (@$collocators)[$i] : 0);
												% last if(!$c && !$item);
												<tr>
													<td align="right">
  													<%= ++$i %>.
													</td>
													% if($item) {
														% if(!grep{$_ eq $item->{word}} @words) {
															%   push @vecs, $item->{vector};
															%   push @words, $item->{word};
															%   push @ranks, $item->{rank};
															%   push @marked, ($marked->{$item->{word}}? 1 : 0);
														% }
														<td align="right">
  														<%= sprintf("%.3f", $item->{dist}) %>
														</td>
														<td>
															% my $class = ($marked->{$item->{word}}? "marked " : "");
															% my $r = $item->{rank};
															% if($r < $mergedEnd) {
																%   $class .= "merged";
																%   $r .= " (merged vocab)";
															% } elsif($mergedEnd!=0 && $r > $mergedEnd) {
															%   $r -= $mergedEnd;
													% }
  												<a class="<%= $class =%>"
														 title="freq. rank: <%= $r =%>"
														 href="<%= url_with->query([word => $item->{word}]) =%>">
														<%= $item->{word} =%>
													</a>
														</td>
											% } else {
														<td colspan="2"/>
											% }
												</tr>
												% last if($i >= $no_nbs);
										% }
					% }
									</tbody>
								</table>
							</div>
							<script>
							 % use Mojo::ByteStream 'b';
							 % my $urlprefix = url_with->query([word=>'']);
							 $(window).load(function() {
								 var result = <%= b(Mojo::JSON::to_json($lists)) %>;
                 var nvecs = [],
                     nwords = [],
                     nranks = [],
                     nmarked = [];
                 for(var i = 0; i < result.length; i++) {
                   nwords = nwords.concat(result[i].map(function(a){return a.word;}));
                   nvecs = nvecs.concat(result[i].map(function(a){return a.vector;}));
                   nranks = nranks.concat(result[i].map(function(a){return a.rank;}));
                   nmarked = nmarked.concat(result[i].map(function(a){return a.marked;}));
                 }
                 var urlprefix =  new URLSearchParams(window.location.search);
                 urlprefix.set("word","");
                 showMap({target: " "+urlParams.get('word')+" ", mergedEnd: 0, words: nwords, vecs: nvecs, ranks: nranks, marked: nmarked, urlprefix: "?"+urlprefix} );
                 //								 showMap(<%= b(Mojo::JSON::to_json({target => " $word ", mergedEnd=> $mergedEnd, words => \@words, vecs => \@vecs, ranks => \@ranks, marked => \@marked, urlprefix => "?"+$urlprefix})); %>);
							 });
							</script>
						  <div id="second">
							  <div id="embed">
							  </div>
							  <div id="cost">
							  </div>
						  </div>
					  </div>
            % } elsif($word !~ /^\s*$/) {
						<div id="wrapper">
							<div id="not-found-dialog" title="Not found">
								<p>ERROR: "<%= $word %>" not found in vocabluary.</p>
								<p>If you are sure you have spelled the word as intended, you can try to increase the cutoff parameter in the options menu.</p>
							</div>
							<script>
							 $( function() {
								 $( "#not-found-dialog" ).dialog({
									 autoOpen: true,
									 modal: true,
									 draggable: false,
									 height: "auto",
									 width: "auto",
									 resizable: false,
									 buttons: {
										 "OK": function() {
											 $( this ).dialog( "close" );
										 },
										 "Apply": function() {
											 window.open($(location).attr('pathname')+'?'+$('form').serialize(), "_self");
										 }
									 }
								 });
							 });
							</script>
							</div>
						% }
				</div>
        <div id="tabs-2">
					<div id="som2" style="width: 800; height: 800px">
					</div>
					<div id="sominfo1"><span id="somcolor1">   </span> <span id="somword1"> </span> <span id="somcolor2">   </span> <span id="somword2"> </span> <span id="somcolor3">   </span></div>
					<div id="sominfo">SOM iteration <span id="iterations">0</span></div>
        </div>
				<div id="tabs-3">
					<div style="width: 800px" id="secondt">
						<table class="display compact nowrap" id="secondtable">
							<thead>
								<tr>
									% if($collocators) {
										<th>#</th>
										<th align="center" title="The columns (c) around the target are considered for summation are marked with *.">w'</th>
										<th align="right" title="Raw (max.) activation of the collocator in the output layers.">max(a)</th>
										<th title="Co-normalized raw activation sum of the collocator in the selected columns." align="right">⊥Σa</th>
										<th title="Sum of activations over the selected colunns normalized by the total activation sum of the selected columns." align="right">Σa/Σc</th>
										<th title="Sum of the column normalized activations over the selected colunns." align="right">Σ(a/c)</th>
										<th title="Sum of the activations over the whole window normalized by the total window sum (no auto-focus)." align="right">Σa/Σw</th>
										<th align="left">collocator</th>
									% }
								</tr>
							</thead>
							<tbody>
								<tr>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="right">
									</td>
									<td align="left">
									</td>
								</tr>
							</tbody>
						</table>
					</div> <!-- - tab2 -->
			  </div> <!-- tabs -->
      </div>
		</div> <!-- topwrapper  -->
		<div style="clear: both;"></div>
		</div>
    % if($training_args) {
      <p>
        Word vector model trained with <a href="https://code.google.com/p/word2vec/">word2vec</a> using the following parameters: <pre><%= $training_args %></pre>
      </p>
    % }
	</body>
</html>
