
var asyncTranslator = new Translator(function( text, replace ){
	myCustomTranslationFunction(text, replace);
});
asyncTranslator.sync = false;


// Array.forEach( function ) - Apply a function to each element
Array.prototype.forEach = function( f ) {
 var i = this.length, j, l = this.length;
 for( i=0; i<l; i++ ) { if( ( j = this[i] ) ) { f( j ); } }
};


String.prototype.chunk = function(n) {
	var b = '';
	var chunks = new Array();
	var s = this;
	while (s.length > n) {
		var c = s.substring(0,n); // get the next substring from the remainder of the text
		var d = c.lastIndexOf(' '); // find the last whitespace in the substring
		var e =c.lastIndexOf('\n'); // find the last newline in the substring
		if (e != -1) d = e; // if a newline found, set cutoff to this index
		if (d == -1) d = n; // if cutoff still not found, use n
		//b +=  c.substring(0,d) + '\n'; 
		chunks[chunks.length] = c.substring(0,d);
		s = s.substring(d+1); // set s to the rest of the text
	}
	chunks[chunks.length] = s;
	//alert(chunks.join(' '));
	return chunks;
};



$(document).ready(function(){


  $("input[@name='transmethod']").change(function() {
  	var currentLang = $('[name=selected_language]').val();
	if (currentLang != 'none') {
		if ($("input[@name='transmethod']:checked").val() == 'auto') {
			location.reload(true);
		} else {
			location.reload(true);
			//showTranslateButtons();
		}
	}
  });

  $('[name=selected_language]').change(function() {
	// see if 'auto' is selected
	if ($("input[@name='transmethod']:checked").val() == 'auto') {
		location.reload(true);
	} else {
		location.reload(true);
		//showTranslateButtons();
	}
  });

  $(".translate").click(function () {
      var translate = $(this).attr("translate");
      var lang = $('[name=selected_language]').val();
      //toggleTransl("#"+translate, lang);
      var entry = $('#'+translate);
      translateEntry(entry);
  });
  
    $.translate().ready(function(){
      var options = '<option value="none">Do not translate</option>';
      var langs = $.translate().getLanguages(true);
      for (l in langs) {
        var code = google.language.Languages[l];
        options += '<option value="'+code+'">'+l+'</option>';
      }
      // now add to the select boxes
      $('[name=selected_language]').each(function () {
        $(this).html(options);    
      });
      // set to default (english)
      $(this).val('none');
      
      remember('[name=selected_language]');
      rememberTransmethod();
      var currentLang = $('[name=selected_language]').val();
      //alert(currentLang);
	if (currentLang != 'none') {
		if ($("input[@name='transmethod']:checked").val() == 'auto') {
			translate();
		} else {
			showTranslateButtons();
		}
	}
  });

});

function showTranslateButtons() {
var currentLang = $('[name=selected_language]').val();
//alert(currentLang);
$(".entry-asset").each(function() { // loop over the entries
	var entry = $(this);
	var entryContent = entry.find(".asset-body").text();   
	var trimmedContent = entryContent.replace(/^\s+|\s+$/g, '') ;
	var length = trimmedContent.length;
	if (length > 500)  length = 200;
	var correctSizeContent = trimmedContent.substr(0,length);
	//alert('answer?');
	google.language.detect(correctSizeContent, function(result) {
	//alert('answer back');
		if (!result.error && result.language) {
			if (result.language != currentLang) {			
				var button = entry.find("[name=translatebutton]");
				//button.attr("value","Translate from: " + result.language);
				button.show();
			} else {
				var entryId = entry.attr("id");
				var button = entry.find("[name=translatebutton]");
				var infoDiv = entry.find('#transl-nfo-'+entryId);
				//infoDiv.text('['+result.language+']');
				button.hide();
			}
		}
		if (result.error) {
			var entryId = entry.attr("id");
			var infoDiv = entry.find('#transl-nfo-'+entryId);
			infoDiv.text('google language detect failed');
		}
	});
});
}

function setTransInfo(entry, text) {
	var entryId = entry.attr("id");
	var infoDiv = entry.find('#transl-nfo-'+entryId);
	infoDiv.text(text);
}

function translateEntry(entry) {
	//try to find out the language of the entry
	var currentLang = $('[name=selected_language]').val();
//	var entryContent = entry.find(".asset-body").text();   
	//google.language.detect(entryContent, function(result) {
//		if (!result.error && result.language) {
//			if (result.language != currentLang) {
				// lang is different from selected language, so translate
				var entryTitle = $(entry).find('.asset-name');
				var entryBody = $(entry).find('.asset-body');
				entryTitle.each(function(i) {
					asyncTranslator.traverse( this );
				});				
				
				entryBody.each(function(i) {
					asyncTranslator.traverse( this );
					setTransInfo(entry,'translated by google');
				});				
				
				//alert(entryBody.text());
//				entryTitle.translate(currentLang, {toggle:false,complete: function() {
//					var entryId = entry.attr("id");
//					var infoDiv = entry.find('#transl-nfo-'+entryId);
//					infoDiv.text('translated by google');
//				},error: function(){}});
//				entryBody.translate(currentLang, {timeout:15000,complete: function(translation) {
//					alert(translation.text());
//					var entryId = entry.attr("id");
//					var infoDiv = entry.find('#transl-nfo-'+entryId);
//					infoDiv.text('translated by google');
//				},onTimeout: function(){
//					var entryId = entry.attr("id");
//					var infoDiv = entry.find('#transl-nfo-'+entryId);
//					infoDiv.text('translation timeout');
//				},error: function(){}});
				// indicate that translation has occured to user

//			}
//		}	   
//	});
}

/* Translates all entries that are not detected to be in the selected langauage
 */
function translate() {
	var currentLang = $('[name=selected_language]').val();
	if (currentLang != 'none') {
		$(".entry-asset").each(function() { // loop over the entries
			var entry = $(this);
			translateEntry(entry);		   
		});
	}
}

function rememberTransmethod() {
	var name='transmethod';
	var transmethod = $("input[@name='transmethod']:checked");
	var val = transmethod.val();

	if( $.cookie( name ) ){
		if ($.cookie(name) == 'auto') {
			$("input[@name='transmethod'][@value='auto']").attr("checked",true);
		} else {
			$("input[@name='transmethod'][@value='manual']").attr("checked",true);
		}
	}

	$("input[@name='transmethod']").change(
		function(){
			$.cookie(name, $(this).val(), { path: '/', expires: 365 });
		}
	);
}

function remember( selector ){
	$(selector).each(
		function(){
			//if this item has been cookied, restore it
			var name = $(this).attr('name');
			if( $.cookie( name ) ){
				$(this).val( $.cookie(name) );
			}
			//assign a change function to the item to cookie it
			$(this).change(
				function(){
					$.cookie(name, $(this).val(), { path: '/', expires: 365 });
				}
			);
		}
	);
}

function myCustomTranslationFunction(text, replace) {
	var currentLang = $('[name=selected_language]').val();
	if (text.length > 500) {
		var finalText = '';
		var chunks = text.chunk(500);
		var processed = 1;
		//alert('chunks:'+chunks.length);
		chunks.forEach(function(arrayElm) {
			//alert(arrayElm);
			google.language.translate({'text':arrayElm,'type':'text'},'', currentLang,function(result) {
				processed++;
				//alert(processed);
				if (result.translation) {
					//alert('source:\n'+arrayElm+'\n\n'+'result:\n'+result.translation);
					finalText += result.translation;				
				}
				if (processed == chunks.length) {
					// done
					//alert(finalText);
					replace(finalText);
				}
			});
		});		
	} else {
		google.language.translate({'text':text,'type':'text'},'',currentLang,function(result) {
			if (result.translation) {
				//alert(result.translation);
				replace(result.translation);
			}
		});
	}
}

$.fn.textNodes = function() {
  var ret = [];
  $.each(this[0].childNodes, function() {
      if ( this.nodeType == 3 || $.nodeName(this, "br") ) 
        ret.push( this );
      else $.each(this.childNodes, arguments.callee);
  });
  return $(ret);
}

