if (typeof console == 'undefined') {
    var console = {};
    console.log = function(msg) { return; };
}

var Cms = function(namespace, locale, editModeEnabled) {
	this.contentApi = null;
	this.namespace = namespace;
	this.locale = locale ? locale : "";
	this.content = {};
	this.editModeEnabled = editModeEnabled;
	this.baseUrl = ("https:" == document.location.protocol) ? "https://cmsdelux.appspot.com" : "http://www.cmsdeluxe.com";
	this.selectorStrategy = null;
	this.localeStrategy = null;
	this.avoidFOUC = true;
	this.selectorFOUC = "body";
	this.demoMode = false;
	
	this.init = function() {		
		this.contentApi = new ContentApi(this.demoMode ? (this.baseUrl + "/demo") : this.baseUrl);				
		if(this.locale == "" && this.localeStrategy != null) {
			this.locale = this.localeStrategy.getLocale();
		}
		if(!this.selectorStrategy) {
			this.chooseSelectorStrategy();
		}
		
		// Load content when DOM loaded
		$(function(){
			if(cms.avoidFOUC) {				
				$(cms.selectorFOUC).hide();
			}	
			cms.loadContent(function(response) {	
				$.each(response.content, function() {
					cms.content[this.key] = this;
				});
				cms.applyContent(cms.content);
				if(cms.avoidFOUC) {
					$(cms.selectorFOUC).show();
				}	
			});
		});
		console.log($.getUrlParameter("deluxe"));		
		if ($.getUrlParameter("deluxe") == "false") {
			$.cookie("deluxe", "false");
		} else if($.getUrlParameter("deluxe")) {
			$.cookie("deluxe", "true");			
		}
		if($.cookie("deluxe") == "true") {
			this.editModeEnabled = true;
		}
		$(function(){
			if(cms.editModeEnabled) {
				
				loadResource(cms.baseUrl + "/js/head-min.js", "js");				
				loadResource(cms.baseUrl + "/css/deluxe.editmode.all.css", "css");
				
				head.js(
						cms.baseUrl + "/js/jquery-ui-1.8.12.custom.min.js", 
						cms.baseUrl + "/tiny_mce/tiny_mce.js", 
						cms.baseUrl + "/codemirror/lib/codemirror.js", 
						cms.baseUrl + "/codemirror/mode/css/css.js",
						cms.baseUrl + "/codemirror/mode/xml/xml.js",
						cms.baseUrl + "/codemirror/mode/javascript/javascript.js",
						cms.baseUrl + "/codemirror/mode/htmlmixed/htmlmixed.js",
						cms.baseUrl + "/js/deluxe.editor.js",
						cms.baseUrl + "/js/deluxe.editmode.js",
						cms.baseUrl + "/codemirror/mode/css/complete.js",
						cms.baseUrl + "/codemirror/mode/javascript/complete.js",
						cms.baseUrl + "/jquery-file-upload/jquery.fileupload.js",
						cms.baseUrl + "/jquery-file-upload/jquery.fileupload-ui.js",
						cms.baseUrl + "/js/beutify-html.js",
						cms.baseUrl + "/jquery-file-upload/jquery.fileupload-uix.js",						
						function() {					   
							cmsEditor.init();
							cmsEditor.loadEditor();		   
						}
				);
			}
		});
		return this;
	},	
	
	this.enableDemoMode = function() {
		var overrideDemo = $.getUrlParameter("od");
		this.demoMode = !overrideDemo;		
	},
	
	this.chooseSelectorStrategy = function() {		
		if($.browser.msie || $.getUrlParameter("crawler")) {
			this.selectorStrategy = new IE7SelectorStrategy();
		} else {
			this.selectorStrategy = new NamespaceSelectorStrategy();
		}		
	},
	
	this.loadContent = function(successHandler) {
		if(this.path == null) {
			var result = this.selectorStrategy.getAllKeys();
			if(result.keys.length > 0) {
				this.contentApi.getContentTextByKeys(this.namespace, result, this.locale, successHandler);
			}
		} else {
			this.contentApi.getContentText(this.namespace, this.path, this.locale, successHandler);
		}
	},
	
	/*
	 * Applies the content in the provided map where key = cms:key and value = content
	 */	
	this.applyContent = function(map) {
		$.each(map, function(key, content) { 		  
			var element = cms.selectorStrategy.getKeyElement(key); 
			if(element && element.html && element.attr("value") != 'undefined') {				
				try {
					if(element.get(0).tagName.toLowerCase() == "input") {
						element.attr("value", content.value);
					} else if(element.get(0).tagName.toLowerCase() == "script") {
						jQuery.globalEval(content.value);
						element.html(content.value);
					} else if(element.get(0).tagName.toLowerCase() == "style" && $.browser.msie) {
						var url = cms.contentApi.getCssUrl(cms.namespace, content.key, content.locale);						
						loadResource(url, "css");
					} else {						
						element.html(content.value);
					}
					element.attr("cms:status", "done");				
				} catch(e) {
					console.log("Failed to apply content on element " + element);
				}
			}
		});
	},
	
	/* 
	 * Finds elements with cms:key attribute and not cms:status="done"
	 * and ajaxs loads content for these.
	 */	
	this.ajaxContentLoaded = function() {
		console.log("ajaxContentLoaded");
		var keysToLoad = {};
		keysToLoad.keys = [];
		var contentMap = {};
		
		$.each(cms.selectorStrategy.getAllElements(), function() {
			var status = this.getAttribute("cms:status");			
			if(status == null || status == 'undefined') {
				var key = this.getAttribute("cms:key");
				console.log("Found new content to load: " + key);
				if(!cms.content[key]) {
					keysToLoad.keys.push(key);
				} else {
					contentMap[key] = cms.content[key];
				}
			}
		});
		
		if(keysToLoad.keys.length > 0) {
			console.log("Loading new content: " + $.toJSON(keysToLoad.keys));
			cms.contentApi.getContentTextByKeys(this.namespace, keysToLoad, this.locale, function(response) {
				$.each(response.content, function() {
					contentMap[this.key] = this;
					cms.content[this.key] = this;
					console.log("Adding " + $.toJSON(this));
					cms.applyContent(contentMap);					
					if(typeof(cmsEditor) != "undefined" && cmsEditor != null) {
						cmsEditor.elementEditMode(this.key);
					}
				});
			});
		} else {
			cms.applyContent(contentMap);
		}				
	}
};

//TODO: refactor to more generic selector strategies..
var IE7SelectorStrategy = function(nextStrategy) {
	this.nextStrategy = nextStrategy;
	this.res = [];
	
	this.getKeyElement = function(key) {
		var element = {};
		
		element =  $("*").filter(function(){
			return this.getAttribute && this.getAttribute("cms:key") == key
		});
		
		if(element && element.lenght > 0) {
			return element;
		}
				
		if(this.nextStrategy) {
			return nextStrategy.getKeyElement(key);
		} else {
			return element;
		}		
	},
	
	this.getAllElements = function() {
		var result = [];			
		$("*").each(function(index, value){
    		if(value.getAttribute("cms:key")) {    			    			
    			result.push(this);
    		}
    	});		
		return result;
	},
	
	this.getAllKeys = function() {
		var result = new Object();
		result.keys = [];
		console.log("Looking for cms:key elements..");
				
		$("*").each(function(index, value){
    		if(value.getAttribute("cms:key")) {    			
    			//console.log("found " + value.getAttribute("cms:key"));
    			result.keys.push(value.getAttribute("cms:key"));
    		}
    	});
		
		//console.log("..found " + result.keys.length);
		return result;
	}
}

var NamespaceSelectorStrategy = function(nextStrategy) {
	this.nextStrategy = nextStrategy;
	
	this.getKeyElement = function(key) {
		var element = null;
		element = $("[cms\\:key='" + key + "']");
		if(element.lenght > 0) {
			return element;
		}
				
		if(this.nextStrategy) {
			return nextStrategy.getKeyElement(key);
		} else {
			return element;
		}		
	},
	
	this.getAllKeys = function() {
		var result = new Object();
		result.keys = [];
		console.log("Looking for cms:key elements..");
		$("*[cms\\:key]").each(function(index, value){
			result.keys.push(value.getAttribute("cms:key"));
		});
		return result;
	},
	
	this.getAllElements = function() {
		var result = [];			
		$("*[cms\\:key]").each(function(index, value) {
    		if(value.getAttribute("cms:key")) {    			    			
    			result.push(this);
    		}
    	});		
		return result;
	}
}

var LocaleCookieStrategy = function(cookieName) {
	this.cookieName =  cookieName;
	this.getLocale = function() {
		return $.cookie(cookieName);
	}
}

var CountryLanguageCookieStrategy = function(countryCookieName, languageCookieName) {
	this.countryCookieName =  countryCookieName;
	this.languageCookieName =  languageCookieName;
	this.getLocale = function() {
		return $.cookie(this.languageCookieName) + "_" + $.cookie(this.countryCookieName);
	}
}


