dojo.require("dojox.xmpp.util");
dojo.require("dojox.fx.Shadow");
dojo.require("dojo.parser");

// some dummy defaults
sourceLanguage = "en"; 
targetLanguage = "es"; 

sourceTxtPlain = "";
hintIsCleared = false;

trim = function(s) {
    return s.replace(/^\s+|\s+$/g,"");
};

myEncodeURI = function(x){
    return encodeURI(x).replace(/&/g,'%26');
};

var myGetJSON = (function(){
	var unique = 0;
	return function(url, callback, context) {
	    // INIT
	    var name = "_jsonp_" + unique++;
	    //if (url.match(/\?/)) url += "&callback="+name;
	    //else url += "?callback="+name;
	    
	    // Create script
	    var script = document.createElement('script');
	    script.type = 'text/javascript';
	    script.src = url;
	    
	    // Setup handler
	    window[name] = function(data){
		callback.call((context || window), data);
		document.getElementsByTagName('head')[0].removeChild(script);
		delete window[name];
	    };
	    
	    // Load JSON
	    document.getElementsByTagName('head')[0].appendChild(script);
	};
    })();

howManyEqual = function(x, reference) {
    for( var i=0; i<x.length && i<reference.length && x[i]==reference[i]; i++) {}
    return i;
};


howManyOfTailEqual = function(x, reference, iStop) {
    for( var i=0; x.length-i-1 >= iStop && x.length-i-1 >= 0 && reference.length-i-1 >= 0 && x[x.length-i-1]==reference[reference.length-i-1]; i++) {}
    return i;
};


plainToHTML = function(x) {
    return x.replace(/&/g,'&amp;').replace(/>/g, '&gt;').replace(/</g, '&lt;').replace(/\"/g, '&quot;')
};

htmlToPlain = function(x) {
    return x.replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&amp;/g, '&').replace(/&quot;/g, '"')
};


function myFunc2(a1,a2,a3,a4,a5) {
    //console.log(a2.translatedText);
    var tmp = dojo.create('div', {innerHTML : a2.translatedText});
    //notTheSame2 = tmp.innerHTML;
    //roundTripTxtPlain = dojox.xmpp.util.stripHtml(notTheSame2);
    somewhatClearedFromHTML = tmp.innerHTML;
    roundTripTxtPlain = htmlToPlain(somewhatClearedFromHTML);
    i1 = howManyEqual(roundTripTxtPlain, sourceTxtPlain);
    i2 = howManyOfTailEqual(roundTripTxtPlain, sourceTxtPlain,i1);

    dojo.style("round_trip", "background", 'white');

    start = '<span style="background:lightgreen;">'+roundTripTxtPlain.substring(0,i1)+'</span>';
    mid = '<span style="background:orange;">'+roundTripTxtPlain.substring(i1,roundTripTxtPlain.length-i2)+'</span>';
    tail = '<span style="background:lightgreen;">'+roundTripTxtPlain.substring(roundTripTxtPlain.length-i2,roundTripTxtPlain.length)+'</span>';
    dojo.byId("round_trip").innerHTML = start+mid+tail;
};



function myFunc(a1,a2,a3,a4,a5) {
    if(a2!==undefined && a2.translatedText!==undefined) {
	html1 = a2.translatedText.replace(/\\003c/g, '&lt;').replace(/</g, '&lt;'); // text comes as HTML
    } else {
	html1 = "";
    }
    dojo.byId("forward_trans").innerHTML = html1;

    if(a2===undefined || a2.detectedSourceLanguage===undefined) {
	srcLng = sourceLanguage;
	dojo.byId("source_text_title").innerHTML="Enter your text: ("+srcLng+")";
    } else {
	srcLng = a2.detectedSourceLanguage;
	dojo.byId("source_text_title").innerHTML="Enter your text: ("+srcLng+"?)";
    }
    dojo.byId("forward_trans_title").innerHTML="Get your halfway translation: ("+srcLng+"→"+targetLanguage+")";
    dojo.byId("roundtrip_trans_title").innerHTML="Check the round-trip translation: ("+srcLng+"→"+targetLanguage+"→"+srcLng+")";
    //notTheSame = a2.translatedText; //htmlToPlain(dojo.byId("forward_trans").innerHTML);
    somewhatClearedFromHTML1 = dojo.byId("forward_trans").innerHTML;
    plain1 = htmlToPlain(somewhatClearedFromHTML1);
    url2 = "http://www.google.com/uds/Gtranslate?context=23&q="+myEncodeURI(plain1)+"&langpair="+targetLanguage+"%7C"+srcLng+"&key=notsupplied&v=1.0&callback=myFunc2";
    tweetThisURL = "http://twitter.com/home/?status="+myEncodeURI(plain1);
    dojo.query("#forward_trans_titlebar a")[0].href = tweetThisURL;
    dojo.style("forward_trans", "background", 'white');
    myGetJSON(url2);
};

function getTrans(){
    //    console.log('editor2 onChange handler: ' + arguments[0]);
    sourceTxtPlain = dojo.byId("source").value;
    url = "http://www.google.com/uds/Gtranslate?context=22&q="+myEncodeURI(sourceTxtPlain)+"&langpair="+sourceLanguage+"%7C"+targetLanguage+"&key=notsupplied&v=1.0&callback=myFunc";
    myGetJSON(url); // "http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=myFunc",
}

function changeSourceLanguage(){
    sourceLanguage = dojo.byId("source_language").value;
    dojo.style("round_trip", "background", 'lightgray');
    dojo.style("forward_trans", "background", 'lightgray');
    getTrans();
}

function changeTargetLanguage(){
    targetLanguage = dojo.byId("target_language").value;
    dojo.style("round_trip", "background", 'lightgray');
    dojo.style("forward_trans", "background", 'lightgray');
    getTrans();
}

dojo.addOnLoad(function(){
	// rewrite dummy defaults:
	sourceLanguage = dojo.byId("source_language").value;
	targetLanguage = dojo.byId("target_language").value;

	// now fix bad parsings
	dojo.parser.parse();
	
	n = dojo.query("textarea")[0];
	
	dojo.connect(n, 'onkeyup', function(e) {
		$(this).stopTime();
		dojo.style("round_trip", "background", 'lightgray');
		dojo.style("forward_trans", "background", 'lightgray');
		var e = arguments[0];
		if(e.keyCode==32 || e.keyCode==13 ||e.keyCode==190 || e.keyCode==188||e.keyCode==49||e.keyCode==191) {
		    getTrans();
		} else {
		    $(this).oneTime("1200ms",getTrans);
		}
	    });
	
	dojo.connect(n, 'onfocus', function(e) {
		if(!hintIsCleared) {
		    hintIsCleared = true;
		    this.value='';
		    dojo.style("source", "color", 'black');
		}
	    });
	
	dojo.query(".hasShadow").forEach(function(n){
		var foo = new dojox.fx.Shadow({ node: n });
		foo.startup();
	    });	
	
    });
