﻿var Dictionary = {

	caretpos: 0,

    mouseOver: function(component) {
    	var mail = "ma";
    	mail += "il";
    	mail += "@";
    	mail += "japanese-dict";    	
    	mail += ".com";
    	component.href="mailto:" + mail;		
        component.innerHTML="M@il - Contact us";
    },        
	
	appendLetter: function(button) {		
		var letter = button.value;
		var word = $("word");		
		if (letter == "CR") {
			word.value="";
			Dictionary.caretpos = 0;
		}		
		else if (letter == "<") {
			if (word.value.length > 0 && Dictionary.caretpos > 0) {
				var firstpart=word.value.substring( 0, Dictionary.caretpos - 1 );
				var secondpart="";
				if (word.value.length > Dictionary.caretpos) {
					secondpart = word.value.substring( Dictionary.caretpos, word.value.length );
				}
				word.value = firstpart + secondpart;
				Dictionary.caretpos--;
			}
		}
		else if (letter == "_") {
			var firstpart=word.value.substring( 0, Dictionary.caretpos );
			var secondpart="";
			if (word.value.length > Dictionary.caretpos) {
				secondpart = word.value.substring( Dictionary.caretpos, word.value.length );
			}
			word.value = firstpart + " " + secondpart;				
			Dictionary.caretpos++;
		}
		else {				
			var firstpart=word.value.substring( 0, Dictionary.caretpos );
			var secondpart="";
			if (word.value.length > Dictionary.caretpos) {
				secondpart = word.value.substring( Dictionary.caretpos, word.value.length );
			}
			word.value = firstpart + letter + secondpart;
			Dictionary.caretpos++;		
		}
		//set the caret position						
		Dictionary.setCaretPosition(word);
				
	},
	
	setCaretPosition: function(word, pos) {		
		if (pos) {
			Dictionary.caretpos = pos;
		}
		else {
			pos = Dictionary.caretpos;
		}		
		if (document.selection && navigator.userAgent.indexOf("Opera") == -1) {
			//IE
			word.focus();
			var selrange = document.selection.createRange();
			selrange.moveStart ('character', -word.value.length);
			selrange.moveEnd ('character', -word.value.length);
			selrange.moveStart ('character', pos);
			selrange.select();
		}
		else if (word.selectionStart) {	
			//Firefox, Opera, Safari
			word.select();
			word.selectionStart = pos;
			word.selectionEnd = word.selectionStart;
		}
		
		//test
		//var resultdiv = $("result");
		//resultdiv.innerHTML = Dictionary.caretpos + " " + word.value;
		//test
	},
	
	getCaretPosIE: function() {
		var word = $("word");
		var i=word.value.length + 1;
		if (word.createTextRange){
			theCaret = document.selection.createRange().duplicate();
			while ( theCaret.parentElement() == word
				&& theCaret.move("character",1)==1 ) --i;
		}
		return i==word.value.length+1?-1:i;
	},
	
	storeCaretPosition: function() {
				
		var word = $("word");
		if (document.selection && navigator.userAgent.indexOf("Opera") == -1) {			
			//IE
			var word = $("word");
			Dictionary.caretpos = Dictionary.getCaretPosIE() - 1;		
			if (Dictionary.caretpos < 0) {						
				Dictionary.caretpos = word.value.length;			
			}			
		}
		else if (word.selectionStart || word.selectionStart == 0) {
			//Firefox, Opera, Safari
			Dictionary.caretpos = word.selectionStart;
			//word.select();
		}
		
		//test		
		//var resultdiv = $("result");	
		//resultdiv.innerHTML = Dictionary.caretpos + " " + word.value;
		//test
		
	},

    observeEnter: function() {
        Event.observe('word','keydown',function(event) {			
			if (event.keyCode == 13) {
				Dictionary.search();
			}
        });
    },
	
	search: function() {
		Dictionary.showSearchText();
		var word = Dictionary.encode($("word").value);
		var lang = $("language").value;
		var strictness = $("strictness").value;
		var resultdiv = $("result");			
		var url = "/jpsearch2.php?word="+word+"&language="+lang+"&strictness="+strictness;			
		new Ajax.Request(url, {
		  method: 'get',
		  onSuccess: function(transport) {
			resultdiv.innerHTML=transport.responseText;
			//reset caret position
			var wordfield = $("word");
			var pos = wordfield.value.length;
			Dictionary.setCaretPosition(wordfield, pos);			
		  }
		});
	},
	
	searchFromResults: function(string) {
		Dictionary.showSearchText();
		$("word").value = string;
		var word = Dictionary.encode(string);
		var lang = $("language").value;
		//select the opposite language
		if (lang == "japanese") {
			lang = "english";
		}
		else if (lang == "english") {
			lang = "japanese";
		}
		$(lang).selected = true;
		var strictness = $("strictness").value;
		var resultdiv = $("result");			
		var url = "/jpsearch2.php?word="+word+"&language="+lang+"&strictness="+strictness;			
		new Ajax.Request(url, {
		  method: 'get',
		  onSuccess: function(transport) {
			resultdiv.innerHTML=transport.responseText;
			//reset caret position			
			var wordfield = $("word");
			Dictionary.caretpos = wordfield.textLength;
			Dictionary.setCaretPosition(wordfield);
		  }
		});
	},
	
	showSearchText: function() {
		var resultdiv = $("result");
		resultdiv.innerHTML="<table class='noresult'><tr class='rowcolor2'><td colspan='2' class='resultheader'>検索中 Searching...</td></tr></table>";
	},
		
	encode: function(string) {
		return escape(Dictionary.utf8_encode(string));
	},
    
	utf8_encode: function(string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
		}
		return utftext;
	},
	
	changekb: function(kbtype) {
	
		//hide all keyboards but the selected
		var kbnames = ["kanjikb","hiraganakb","katakanakb","romajikb"];
		var divelement;
		
		//hide the kanji keyboards		
		for (var kanjilines = 1; kanjilines <= 23; kanjilines++) {
			divelement = $("kanjikb" + kanjilines);
			if (divelement != null) {
				divelement.hide();
			}
		}
		//hide the romaji, hiragana and katakana keyboards
		divelement = $("hiraganakb");
		divelement.hide();
		divelement = $("katakanakb");
		divelement.hide();
		divelement = $("romajikb");
		divelement.hide();		
		
		//hide the kanjilines combo if not the kanji keyboard is selected
		var kanjilinesddl = $("kanjilines");
		var kanjilineslabel = $("kanjilineslabel");
		if (kbtype == "kanjikb") {
			kanjilinesddl.show();
			kanjilineslabel.show();
		}
		else {
			kanjilinesddl.hide();
			kanjilineslabel.hide();
		}
		
		//show the selected
        var divindex;        
        for (divindex = 0; divindex < kbnames.length; divindex++) {
			var kbname = kbnames[divindex];            
			if (kbname == kbtype) {				
				if (kbtype == "kanjikb") {
					var selectedkanjilines = kanjilinesddl.selectedIndex + 1;
					divelement = $(kbname + selectedkanjilines);					
				}
				else {
					divelement = $(kbname);
				}
				if (divelement != null) {
					divelement.show();
				}
			}			
        }		
	},
	
	showsign: function(letter) {		
		var divelement = $("sign");
		if (letter != "_" && letter != "<" && letter != "CR") {
			divelement.innerHTML = letter;
		}
	}

};

