/**
 * @author Brad Petit
 */


Das.util.clone = function(o) {
    if(!o || 'object' !== typeof o) {
        return o;
    }
    var c = '[object Array]' === Object.prototype.toString.call(o) ? [] : {};
    var p, v;
    for(p in o) {
        if(o.hasOwnProperty(p)) {
            v = o[p];
            if(v && 'object' === typeof v) {
                c[p] = Das.util.clone(v);
            }
            else {
                c[p] = v;
            }
        }
    }
    return c;
}; // eo function clone 


Das.Translator = (function(){
	var isTranslated = false, defaultLang = "en", ready = false, textready = false, lang;
	var originalText = [];
	var translatedText = [];
	var langSelect = {};
	
	var tagConfig = {
		namespace: 'translate'
	};
	
	function detectLanguage(){
		l = Das.Cookie.get("das_lang");

		if(l){
			lang = l;
			isTranslated = true;
			Das.Translator.translatePage();
		}else{
			lang = defaultLang;
			isTranslated = false;
			Das.Translator.translatePage();
		}
		ready = true;
		Das.Translator.fireEvent('ready', Das.Translator);
		
	}
	
	function setLangSelect(){
		if(lang == defaultLang){
			langSelect.dom.innerHTML = "Espanol";
			langSelect.dom.search = "?es";
		}else{
			langSelect.dom.innerHTML = "English";
			langSelect.dom.search = "?en";
		}
	}
	
	return {
		cache: originalText,
		init: function(onReady, scope){
			if(ready){
				Ext.callback(onReady, scope, [this]);
				return;
			}
			
			if(!Ext.isReady){
				Ext.onReady(function(){
					Das.Translator.init(onReady, scope);
				});
				return;
			}
			
			this.addEvents('ready','langchange','textready','translate','beforetranslateready','translationready');
			
			if(onReady){
                this.on('ready', onReady, scope);
            }
			langSelect = Ext.select("a[id^=lang-select]");
			detectLanguage();
			//setLangSelect();
			
			langSelect.each(function(el, elements, index){
				el.on("click", function(e, el){
				e.preventDefault();
				what = el.search || el.parentNode.search;
				if (what != "?en") {
					lang = what.substr(1);
					Das.Cookie.set("das_lang", lang, 0,'',host,0);
					
					this.collectOriginalText();
					
					this.fireEvent("langchange", this, lang, true);
				}else{
					lang = defaultLang;
					Das.Cookie.del("das_lang",'',host);
					this.fireEvent("langchange", this, lang, false);
				}
				
				Das.Translator.translatePage();
				
			}, this);
			}, Das.Translator);

			
			if(isTranslated){
				Das.Translator.translatePage();
			}
			
		},
		
		collectOriginalText: function(){
			var text = Ext.select("*[class*=translate]");
			
			text.each(function(el, elements, index){
				var cfg = tagConfig;
				var otext = document.createAttribute(cfg.namespace);
					otext.value = el.dom.innerHTML;
					if (!el.dom.attributes.getNamedItem(cfg.namespace)) {
						el.dom.attributes.setNamedItem(otext);
					}
			}, this);
			
			textready = true;

			this.fireEvent('textready', this, text);
			return text;
		},
		
		translatePage: function(force){
			force = force || false;
			if(defaultLang == lang){
				this.untranslatePage();
				return;
			}
			var text = this.collectOriginalText();
			if(ready && textready){
				var results;
				
				text.each(function(el, elements, index){
					
					var t = el.dom.attributes.getNamedItem("translate").nodeValue;
					if (!el.dom.attributes.getNamedItem(lang)) {
						google.language.translate(t, defaultLang, lang, this.getResults.createDelegate(this, [elements.elements[index]], true));
					}else{
						var block = el.dom.attributes.getNamedItem(lang).nodeValue;
						el.dom.innerHTML = block;						
					}
				}, this);
				isTranslated = true;
				this.fireEvent('translate', this);
			}
		},
		getResults: function(results, el){
			if (!results.error) {
				var node = document.createAttribute(lang);
				node.value = results.translation;
				el.attributes.setNamedItem(node);
				el.innerHTML = results.translation;
			}else{
				return false;
			}
		},
		untranslatePage: function(){
			var text = Ext.select("*[class*=translate]");
			
			text.each(function(el, elements, index){
				try {
					var t = el.dom.attributes.getNamedItem("translate").nodeValue;
					el.dom.innerHTML = t;
				}catch(e){}
			});
			isTranslated = false;
		},
		isTranslated: function(){
			return isTranslated;
		},
		translate: function(t, to, v){
			var c = this.container;
			if (to != defaultLang) {
				google.language.translate(t, defaultLang, to, this.prepareResults.createDelegate(window, [c], true));
			}
		},
		prepareResults: function(result, container){
			Das.Translator.fireEvent("change", result.translation);
		},
		getTranslation: function(){
			return this.results;
		}
		
	};
})();
Ext.apply(Das.Translator, new Ext.util.Observable());
