﻿
// item per page
var item_page = 100;

// link
var link_longdo = 'http://dict.longdo.com';
var link_lexitron = 'http://lexitron.nectec.or.th';
var link_wikipedia = 'http://www.wikipedia.org';
var link_wiktionary = 'http://www.wiktionary.org';

// result parsed from json
var result = null;

var start = null;
var end = null;



/* create ajax queue manager */
var ajaxManager = $.manageAjax.create('cacheQueue', {
	queue : true,
	abortOld : false,
	cacheResponse : true
});

function register() {
	$('#status img').attr('src', 'http://www.wooword.com/images/results.jpg');
	$('#result').html('');
	$('#underline, #status, #result, #pagination, #suggestion, #total, #footer, #footer-line').hide();
	$('#search-box div.right').addClass('progress');
}

function dispatch() {
	$("#status div#time").html("(" + (end - start) / 1000.0 + " seconds.)");
	$('#underline, #status, #result, #footer, #footer-line').fadeIn();
	$('#search-box div.right').removeClass('progress');
}

function renderEntry(index, jq) {

	var data = result;
	var max = Math.min((index + 1) * item_page, data.length);
	var content = '';

	for ( var i = index * item_page; i < max; i++) {

		var word = data[i].word;
		var definition = data[i].definition;
		var type = data[i].type;
		var relate = data[i].relate;
		var syn = data[i].synonym;
		var ant = data[i].antonym;
		var reference = data[i].reference;
		var src = data[i].src;
		var odd = (i % 2) == 0;

		// start entry
		if (odd)
			content += '<div class="entry odd">';
		else
			content += '<div class="entry">';

		// word
		content += '<div class="word">' + styleWord(word) + '</div>';

		// start definition div
		content += '<div class="meaning">';
		content += '<p>';

		// type
		if (type != '')
			content += ' (' + type + ')   ';

		// definition
		content += styleWord(definition) + '</p>';

		// relate
		if (relate != '')
			content += '<p><span>Relate | คำใกล้เคียง:</span> ' + link_word(relate) + '</p>';
		// synonyme
		if (syn != '')
			content += '<p><span>Synonym | คำพ้องความหมาย:</span> ' +link_word(syn) + '</p>';

		// antonym
		if (ant != '')
			content += '<p><span>Antonym | คำตรงข้าม:</span> ' + link_word(ant) + '</p>';

		content += '<p><span>Usage examples & more info | ตัวอย่างประโยค และข้อมูลเพิ่มเติม:</span> ' + link_google(word) + '</p>';
		
		// reference
		content += '<p><span> Reference | อ้างอิง:</span> ' + link_source(reference) + '</p>';

		// end right div
		content += '</div>';

		// add clear div
		content += '<div class="clear"></div>';

		// end entry div
		content += '</div>';
	}
	$('#result').html(content);

	$('#result div.entry').hover(function() {
		$(this).addClass('hover');
	}, function() {
		$(this).removeClass('hover');
	});
	
	$('#result div.entry div.meaning a.link-word').click(function(e) {
		e.preventDefault();
		var x = $(this).html();
		$('#search-box-input').val(x);
		sleep(800);
		query();
	});

	return false;
}

function render(event) {

	try {
		// parse json data
		var data = jQuery.parseJSON(event);
		end = new Date();
		if (data.pass) {
			result = data.pass;
			$("#pagination").pagination(result.length, {
				items_per_page : item_page,
				callback : renderEntry
			});

			$('#total')
					.html(
							'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' + result.length + ' records');
			$('#total').fadeIn();

		} else if (data.fail) {
			var fail = data.fail;
			if (fail.length == 0) {
				$('#status img').attr('src', 'http://www.wooword.com/images/nomatch.jpg');
			} else {
				var str = ':&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
				for ( var k = 0; k < fail.length; k++) {
					str += '<a class="suggestion-word" href="#">' + fail[k] + '</a>';
					if (k != fail.length - 1)
						str += ', ';
				}
				$('#status img').attr('src', 'http://www.wooword.com/images/didumean.jpg');
				$('#status div#suggestion').html(str);
				$('#suggestion a.suggestion-word').click(function(e) {
					e.preventDefault();
					var x = $(this).html();
					$('#search-box-input').val(x);
					sleep(800);
					query();
				});
				$('#suggestion').fadeIn();
			}

		} else {
			// else ?
		}
	
		dispatch();

	} catch (e) {

	}
}

function styleWord(s) {
	var word = jQuery.trim($('#search-box-input').val()).toLowerCase();
	var styleWord = '<span class="style-word">' + word + '</span>';
	var lower = s.toLowerCase();
	var replacement = lower.replace(word, styleWord);
	return replacement;
}

function link_google(word) {
	var googling = 'http://www.google.com/dictionary?langpair=th|en&q='+ word +'&hl=en&aq=f';
	var replacement  = '<a href=' + encodeURI(googling) + ' target="_blank">กดที่นี่</a>';
	return replacement;
}

function link_source(source) {
	var s = source.toLowerCase();
	var replacement = '';
	if (s == 'longdo') {
		replacement = '<a href=' + link_longdo + ' target="_blank">' + s
				+ '</a>';
	} else if (s == 'wikipedia') {
		replacement = '<a href=' + link_wikipedia + ' target="_blank">' + s
				+ '</a>';
	} else if (s == 'wiktionary') {
		replacement = '<a href=' + link_wiktionary + ' target="_blank">' + s
				+ '</a>';
	} else if (s == 'lexitron') {
		replacement = '<a href=' + link_lexitron + ' target="_blank">' + s
				+ '</a>';
	} else if (s == 'megawiki') { 
		//hack
		replacement = '<a href="http://www.wooword.com">' + 'omegawiki' + '</a>';
	} else {
		replacement = '<a href="http://www.wooword.com">' + s + '</a>';
	}
	return replacement;
}

function link_word(s) {
	
	var mySplits = s.split(";");
	var str = '';
	for (var i = 0; i < mySplits.length; i++)
	{
		str += '<a class="link-word" href="#">'+mySplits[i]+'</a>';
		if (i != mySplits.length -1)
			str += ', ';
	}


	return str;
}

function  sleep(milliseconds) {
	var start = new Date().getTime();
	for ( var i = 0; i < 1e7; i++) {
		if ((new Date().getTime() - start) > milliseconds) {
			break;
		}
	}
}



function query() {

	try {

		var word = $('#search-box-input').val();
		word = jQuery.trim(word);

		if (word != null && word != '') {
			
			register();
			// encode for non-english
			word = encodeURI(word);

			if ($('#option input:checked')) {
				var option = $('#option input:checked').parent().attr('id');
				var x = $('#option input:checked').parent();
				var url = '';
				if (option == 'auto') {
					url = 'http://www.wooword.com/index.php/query/w/d7875a33d9cd0dc71c62d1661650e682ee376474/';
				} else if (option == 'start') {
					url = 'http://www.wooword.com/index.php/query/s/d7875a33d9cd0dc71c62d1661650e682ee376474/';
				} else if (option == 'end') {
					url = 'http://www.wooword.com/index.php/query/e/d7875a33d9cd0dc71c62d1661650e682ee376474/';
				}
			}

			start = new Date();

			ajaxManager.add( {
				success : render,
				url : url + word
			});
		}
	} catch (e) {
		
	
	}

}


$(document).ready(function() {

	/* settings */
	var auto = "automatic search word for best match/ ค้นหาคำศัพท์อัตโนมัติ";
	var start = "automatic search word starts with char(s)/ ค้นหาคำศัพท์ที่ขึ้นต้นด้วยคำที่ระบุ";
	var end = "automatic search word ends with char(s)/ ค้นหาคำศัพท์ที่ลงท้ายด้วยตัวคำที่ระบุ";

	var text = "";

		// reset textbox at first load
		//$('#search-box-input').val('');
		if ($('#search-box-input').val() == '')
			$('#search-box-input').blur();
		else 
			text = $('#search-box-input').val();
			
		$('#search-box-input').focus(function() {
			$(this).addClass('active');
		});

		$('#search-box-input').blur(function() {
			if ($(this).val() == '')
				$(this).removeClass('active');

		});

		// start with option: auto
		$('#option ul li:first-child').addClass('active');
		$('#option-help p').text(auto);

		// change option when mouse is on hover
		$('#option ul li').hover(function() {
			$(this).addClass('active');
			$(this).siblings().removeClass('active');
		}, function() {
			$(this).removeClass('active');
			$(this).parent().find('input:checked').parent().addClass('active');
		});



		// handle hint reflect to option
		$('#option li#auto').mouseover(function() {
			$('#option-help p').text(auto);
		});

		$('#option li#start').mouseover(function() {
			$('#option-help p').text(start);
		});

		$('#option li#end').mouseover(function() {
			$('#option-help p').text(end);
		});

		$('#option ul').mouseout(function() {
			if ($('#option ul li#auto').hasClass('active')) {
				$('#option-help p').text(auto);
			} else if ($('#option ul li#start').hasClass('active')) {
				$('#option-help p').text(start);
			} else if ($('#option ul li#end').hasClass('active')) {
				$('#option-help p').text(end);
			}
		});

		// attach livesearch feature to input text
		$('#search-box-input').livesearch( {
			searchCallback : query,
			queryDelay : 800,
			innerText : "",
			minimumSearchLength : 1
		});
		
		$('#option ul li').click(function(e) {

			e.preventDefault();

			$(this).addClass('active').siblings().removeClass('active');
			$(this).children().attr('checked', true);

			sleep(800);
			query();
		});
		

		$('#container').show();
		if (text != "") {
			$('#search-box-input').val(text);
			$('#search-box-input').focus();
			query();
		}

	});