
/* Initialize
-------------------------------------------------*/
$(document).ready(function(){
	tran.buildFromLangList();
	tran.loadTrans();
	if(url_src){
		tran.setFromLang(url_src);
	}
	tran.loadFromText();
	$('#addTranButn')
		.click(tran.toggleAddTrans);
	$('#fromText')
		.click(tran.focusOnInput)
		.blur(tran.resetInput)
		.keydown(tran.watchInput)
		.keyup(tran.updateContentArea)
		.keyup(tran.findAccents)
		.bind('paste', tran.pasted);
	$('#shareTab')
		.mouseover(
			function(){
				$('#shareTab ul').show();
			}
		)
		.mouseout(
			function(){
				$('#shareTab ul').hide();
			}
		)
	$('#tipsButn')
		.click(
			function(){
				dialog.showThis('tips');
				return false;
			});
	$('#linkButn')
		.click(
			function(){
				dialog.showMakeALink();
				return false;
			});
	$('#accentButn')
		.click(
			function(){
				dialog.showThis('typeAccents');
				return false;
			});
	$('#contributeButn')
		.click(
			function(){
				dialog.showThis('contribute');
				return false;
			});
	$('#aboutButn')
		.click(
			function(){
				dialog.showThis('about');
				return false;
			});
});

/* SuperCevirmen
--------------------------------------------*/
tran = {
	//Functions
	buildFromLangList : function(){
		var langs = [];
		for(j in tran.langByCode){
			langs.push(j);
		}
		numLangs = langs.length;
		$('#setFromLang')
			.prepend(
				$('<div/>')
					.attr('id', 'fromLangWrap')
					.append(
						$('<ul/>')
							.attr('id', 'fromLangs-1')
					)
					.append(
						$('<ul/>')
							.attr('id', 'fromLangs-2')
					)
				)					
		for(var i=-1; i<numLangs; i++){
			var code="auto", lang="Otomatik", col=1;
			if(i>-1){
				code = langs[i];
				lang = tran.langByCode[code];
			}
			if(i>((numLangs-2)/2)){
				col=2;
			}
			$('#fromLangs-'+col)
				.append(
					$('<li/>')
						.attr('class', 'fromLangOption')
						.append(
							$('<a/>')
							.attr('href', '#')
							.attr('id', 'fromLang-'+code)
							.click(function(){
								tran.setFromLang($(this).attr('id'));
							})
							.text(lang)
						)
					);
			if(code == tran.setFromTextLang){
				$('#fromLang-'+code).addClass('on');
			}
		}	
		$('#setFromLang')
			.mouseover(function(){
					$('#fromLangWrap').show();
				})
			.mouseout(function(){
					$('#fromLangWrap').hide();
				});
	},
	toggleAddTrans : function(){
		if(tran.mainAreaState == 'input'){
			tran.showAddTrans();
		}
		else{
			tran.showTranInput();
		}
		tran.updateActvTrans();
	},
	showAddTrans : function(){
		if(tran.mainAreaState != 'addTran'){
			tran.storeMainHtml = $('#tranMain')
									.children().each(function(){
										$(this).hide();	
									});
		}
		else{
			$('#selTranTbl').remove();
		}
		tran.mainAreaState = 'addTran';
		var numInCol = 9, c=0, currTr;
		tran.resetAddTransButton();
		l = tran.langByCode;
		
		$('#tranMain')
			.append(
				$('<table/>')
					.attr('id', 'selTranTbl')
			);
		for(i in l){
			if(!(i in util.cmpObj(tran.translators))){
				if((c % numInCol)==0){
					currTr = $('<tr/>');
					$('#selTranTbl').append(currTr);
				}
				currTr
					.append(
						$('<td/>')
							.attr('class', 'selTranTd')
							.append(
								$('<a/>')
									.attr('id', 'addTranButn-'+i)
									.attr('href', '#')
									.attr('class', 'tranButn rc3')
									.click(function(){
											tran.addTran($(this).attr('id'));
											tran.showAddTrans();
										}
									)
									.text(l[i])
							)
					);	
				c++;		
			}
		}
		
	},
	showTranInput : function(){
		tran.mainAreaState = 'input';
		tran.resetAddTransButton();
		$('#selTranTbl').remove();
		$('#fromText').show();
	},
	resetAddTransButton : function(){
		if(tran.mainAreaState == 'addTran'){
			$('#addTranButn')
				.text('Tamam')
				.removeClass('addingTrans');
		}
		else{
			if(tran.translators.length > 0){
				$('#addTranButn')
					.text('+')
					.addClass('addingTrans');
			}
			else{
				$('#addTranButn')
					.text('Çevirmen Ekle')
					.removeClass('addingTrans');
			}
		}
	},
	addTran : function(code){
		code = tran.extractCode(code);
		tran.translators.push(code);
		$('#translators')
			.append(
				$('<div/>')
					.attr('id', 'tran-'+code)
					.attr('class', 'aTranslator')
					.append(
						$('<div/>')
							.attr('class', 'lang')
							.text(tran.langByCode[code])
					)
					.append(
						$('<div/>')
							.attr('id', 'transdTxt-'+code)
							.attr('class', 'translatedText')
					)
			);
		translate.doOne(code);
		tran.updateActvTrans();
		tran.updateInputVal();
		tran.saveTrans();
	},
	remTran : function(code){
		code = tran.extractCode(code);
		var l = tran.translators;
		for(i in l){
			if(l[i] == code){
				tran.translators = util.compact(l, i);
			}
		}	
		$('#tran-'+code).remove();
		tran.updateActvTrans();
		tran.updateInputVal();
		tran.resetAddTransButton();
		tran.saveTrans();
	},
	saveTrans : function(){
		var transCodes=[];
		for(var t=0; t<tran.translators.length; t++){
			transCodes[t] = tran.translators[t];
		}
		util.createCookie("translators", transCodes, 30);
	},
	loadTrans : function(){
		var translators = util.readCookie('translators');
		if(url_trs){
			url_trs = url_trs.replace(/ /g, '').replace(/%20/g, '');
			translators = url_trs.split(',');
		}
		var variste=0;		if(translators){
			if(translators.length){
				for(var t=0; t<translators.length; t++){
					tran.addTran(translators[t]);
					variste=1;
				}
			}if(tran.translators.length>0){
				document.getElementById('fromText').focus();
			}
		}if(variste==0){tran.addTran('tr');tran.addTran('en');tran.addTran('de');}
	},
	loadFromText : function(){
		if(url_txt){
			if(tran.translators.length<1){
				tran.addTran('en');
			}
			$('#fromText').val(url_txt.stripSlashes());
			tran.clearInput = false;
			translate.start();
			tran.updateContentArea();
		}
	},
	updateActvTrans : function(){
		var complete = false, c = 0;
		while(!complete){
			$('#actvTrans').empty();
			var j = 0;
			for(i in tran.translators){
				
				$('#actvTrans')
					.append(
						$('<li/>')
							.attr('class', 'actvTran')
							.append(
								$('<a/>')
									.attr('href', '#')
									.attr('id', 'actvTran-'+tran.translators[i])
									.attr('class', 'rc3')
									.text(tran.langByCode[tran.translators[i]])
									.click(function(){
												tran.remTran($(this).attr('id'));
												if(tran.mainAreaState=='addTran'){
													tran.showAddTrans();
												}
											}
									)
							)
					);
				if((j+1)==((tran.translators.length)-c)){
					break;
				}
				j++;
			}
		
			if($('#actvTran-'+tran.translators[0]).offset().top < $('#actvTran-'+tran.translators[j]).offset().top){
				c++;
			}
			else{
				if(c){
					$('#actvTran-'+tran.translators[j]).parent().remove();
					$('#actvTrans')
					.append(
						$('<li/>')
							.attr('class', 'actvTran')
							.append(
								$('<a/>')
									.attr('href', '#')
									.attr('id', 'actvTran-more')
									.attr('class', 'rc3')
									.text((c+1)+' more')
							)
							.mouseover(function(){
										$('#moreActvTrans').show();
									})
							.mouseout(function(){
								$('#moreActvTrans').hide();
							})
					);
					var right = $('#tranMain').offset().left + $('#tranMain').width();
					$('#actvTran-more').parent().css('width', 
							((right-10) - $('#actvTran-more').offset().left) + 'px');
					$('#actvTran-more').parent()
						.append($('<ul/>')
								.attr('id', 'moreActvTrans')
						);
					var w=$('#actvTran-more').width();
					for(var k=j; k<tran.translators.length; k++){
						$('#moreActvTrans')
						.append(
							$('<li/>')
								.attr('class', 'actvTran moreActvTran')
								.append(
									$('<a/>')
									.attr('href', '#')
									.attr('id', 'moreActvTran-'+tran.translators[k])
									.text(tran.langByCode[tran.translators[k]])
									.css('width', 'auto')
									.click(function(){
												tran.remTran($(this).attr('id'));
												if(tran.mainAreaState=='addTran'){
													tran.showAddTrans();
												}
											}
									)
								)
						);
						if($('#moreActvTran-'+tran.translators[k]).width() > w){
							w = $('#moreActvTran-'+tran.translators[k]).width();
						}
						if((k+1) == tran.translators.length){
						 	$('#moreActvTran-'+tran.translators[k]).addClass('rc3');
						 	$('#moreActvTran-'+tran.translators[k]).addClass('rcb');
						}
					}
					for(k=j; k<tran.translators.length; k++){
						$('#moreActvTran-'+tran.translators[k]).css('width', w+'px');
						if(w>$('#actvTran-more').width()){
							$('#moreActvTran-'+tran.translators[k]).css('margin-left', 
															'-'+ (w-$('#actvTran-more').width())+'px');
							if(k==j){
								$('#moreActvTran-'+tran.translators[k]).addClass('rc6');
								$('#moreActvTran-'+tran.translators[k]).addClass('rct');
								$('#moreActvTran-'+tran.translators[k]).addClass('rcl');
							}
						}
					}
				}
				$('#moreActvTrans').hide();
				complete=true;
			}
			if(c>50){
				break;
			}
		}
	},
	setFromLang : function(code){
		code = tran.extractCode(code);
		$('#fromLang-'+tran.setFromTextLang).removeClass('on');
		tran.setFromTextLang = code;
		$('#fromLang-'+tran.setFromTextLang).addClass('on');
		if(code=='auto'){
			$('#fromTextLang').html('Otomatik Tespit');
		}
		else{
			$('#fromTextLang').html(tran.langByCode[code]);
		}
		translate.start();
	},
	extractCode : function(code){
		if(code.indexOf('-')>-1){
			code = code.split('-');
			code = code[1];
		}
		return code;
	},
	focusOnInput : function(){
		if(tran.clearInput && (tran.translators.length > 0)){
			$('#fromText').val('');
			tran.clearInput = false;
		}
	},
	updateInputVal : function(){
		if(tran.clearInput){
			if(tran.translators.length>0){
				$('#fromText').val('Buraya yazmaya baslayin. Gerisini SuperCevirmen´e birakin.');
			}
			else{
				$('#fromText').val('Çevirmen ekleyin ve metninizi buraya yazin. Gerisini SuperCevirmen´e birakin.');
			}
		}
	},
	resetInput : function(){
		if($('#fromText').val().trim() == ""){
			tran.clearInput=true;
			tran.updateInputVal();
		}
	},
	watchInput : function(e){
		if(tran.translators.length < 1){
			e.stopPropagation();
			e.preventDefault();
			return false;
		}
		else{
			var key  = (window.event) ? event.keyCode : e.keyCode;
			switch(key){
				case 9: //Tab
					tran.updateInputVal();
				break;
				
				case 13: //Enter
					translate.start();
					e.stopPropagation();
					e.preventDefault();
					return false;
				break;
		
				case 32: //Space
					translate.start();
				break;
		
				case 27:
					setTimeout(function(){$('#fromText').val("");}, 100);		
				break;
	
				default:
					setTimeout("translate.waitThenStart('"+$('#fromText').val().length+"')", 750);
				break;
			}
		}	
	},
	pasted : function(){
		setTimeout(function(){
			translate.start();
			tran.updateContentArea();
		}, 20);
		
	},
	updateContentArea : function(){
		if($('#fromText').val().trim() != ""){
			$('#content-main-default').hide();
			$('#translators').show();
		}
		else{
			$('#translators').hide();
			$('#content-main-default').show();
			
		}
	},
	findAccents : function(){
		var accents = {
			"[`A":192,
			"[`a":224, 
			"[`E":200,
			"[`e":232,
			"[`I":204,
			"[`i":236,
			"[`O":210,
			"[`o":242,
			"[`U":217,
			"[`u":249,
			"['A":193,
			"['a":225, 
			"['E":201,
			"['e":233,
			"['I":205,
			"['i":237,
			"['O":211,
			"['o":243,
			"['U":218,
			"['u":250,
			"['Y":221,
			"['y":253,
			"[^A":194,
			"[^a":226, 
			"[^E":202,
			"[^e":234,
			"[^I":206,
			"[^i":238,
			"[^O":212,
			"[^o":244,
			"[^U":219,
			"[^u":251,
			"[~A":195,
			"[~a":227, 
			"[~N":209,
			"[~n":241,
			"[~O":213,
			"[~o":245,
			"[:A":196,
			"[:a":228, 
			"[:E":203,
			"[:e":235,
			"[:I":202,
			"[:i":239,
			"[:O":214,
			"[:o":246,
			"[:U":220,
			"[:u":252,
			"[:Y":159,
			"[:y":255,
			"[!]":161,
			"[?]":191,
			"[C]":199,
			"[c]":231,
			"[OE":140,
			"[oe":156,
			"[ss":223,
			"[O]":216,
			"[o]":248,
			"[A]":197,
			"[a]":229,
			"[AE":198,
			"[ae":230,
			"[P]":222,
			"[p]":254,
			"[D]":208,
			"[d]":240,
			"[S]":138, 
			"[s]":154,
			"[Z]":142,
			"[z]":158
		};
		var cPos = util.getCaretPosition(document.getElementById('fromText'));
		if(cPos-3>-1){
			var recent = $('#fromText').val().substr(cPos-3, 4);
			var foundAccent=false;
			var rL = recent.length;
			for(var a in accents){
				if(recent.indexOf(a)>-1){
					recent = recent.replace(a, String.fromCharCode(accents[a]));
					foundAccent=true;
				}
			}
			if(foundAccent){
				$('#fromText').val($('#fromText').val().substr(0, cPos-3) + recent.substr(0, recent.length) + $('#fromText').val().substr(cPos-3+rL));
			}
		}
	},
	transCSV : function(){
		var output = [];
		$.each(tran.translators, function(i, val){
			output.push(val);
		});
		return output.join(',');
	},
	//Variables
	translators : [],
	clearInput : true,
	mainAreaState : 'input',
	setFromTextLang : 'auto',
	fromTextLang : '', 
	fromTextCode : '',
	langByCode : {
		"tr":"Türkçe",
		"en":"Ingilizce",		
		"de":"Almanca",
		"fr":"Fransizca",
		"it":"Italyanca",
		"ru":"Rusça",
		"es":"Ispanyolca",
		"af":"Afrika Dili",
		"sq":"Arnavutça",
		"ar":"Arapça",
		"be":"BeyazRusça",
		"bg":"Bulgarca",
		"zh_CN":"Çince | S",
		"zh_TW":"Çince | T",
		"cs":"Çekçe",
		"da":"Danca",
		"id":"Endonezce",
		"et":"Estçe",
		"ca":"Katalanca",
		"fa":"Farsça",
		"tl":"Filipino",
		"fi":"Fince",
		"cy":"Galce",
		"gl":"Galiçyaca",
		"hr":"Hirvatça",
		"nl":"Hollandaca",
		"hi":"Hindi",
		"iw":"Ibranice",
		"sv":"Isveççe",
		"ga":"Irlandaca ",
		"is":"Izlandaca",
		"ja":"Japonca",
		"ko":"Korece",
		"pl":"Lehçe",
		"lv":"Letonca",
		"lt":"Litvanyaca",
		"hu":"Macarca",
		"ms":"Malayca",
		"mt":"Maltaca",
		"no":"Norveççe",
		"pt":"Portekizce",
		"ro":"Romence",
		"sr":"Sirpça",
		"sk":"Slovakça",
		"sl":"Slovence",
		"sw":"Swahili",
		"th":"Tayca",
		"uk":"Ukraynaca",
		"vi":"Vietnamca",
		"yi":"Yiddish",
		"el":"Yunanca"		
	}
};

/* Translating
--------------------------------------------*/
translate = {
	start: function(){
		tran.value = encodeURI($('#fromText').val());
		if(!tran.clearInput){
			if(tran.setFromTextLang=='auto'){
			  $.getJSON('http://ajax.googleapis.com/ajax/services/language/detect?callback=?&v=1.0&q='+tran.value, translate.detectResult);
			  return false;
			}
			else{
				tran.fromTextCode=tran.setFromTextLang;
				translate.doAll();
				return false;
			}
		}
	},
	waitThenStart: function(then){
		var now = $('#fromText').attr('value').length;
		if(then>=(now-1)){
			translate.start();
		}
	},
	detectResult: function(result){
		result = result.responseData;
		if(!result){
			return;
		}
		var language = 'unnamed';
		var code = '';
		if (result.language) {
	
			for (l in tran.langByCode) {
				if (l == result.language) {
					language = tran.langByCode[l];
					code = l;
					break;
				}
			}
			tran.fromTextLang = language.toLowerCase();
			tran.fromTextCode = code;
			$('#fromTextLang').html(tran.fromTextLang.ucfirst()+'<br/><span>Tespit Edildi</span>');
			translate.doAll();
		}
	},
	doAll: function(){
		for(var t=0; t<tran.translators.length; t++){
			var lang = tran.translators[t];
			translate.doOne(lang);
		}
	},
	doOne: function(lang){
		lang = lang.replace('_', '-');
		if(!tran.clearInput){
			$.getJSON('http://ajax.googleapis.com/ajax/services/language/translate?callback=?&v=1.0&q='+tran.value+'&langpair='+tran.fromTextCode+'%7C'+lang,
			function(result){
					result = result.responseData;
					if(!result){
						return;
					}	
					if (result.translatedText) {
						lang = lang.replace('-', '_');						
						$('#transdTxt-'+lang).html(result.translatedText);
					}
				}
			);
		}
	}
};
