function clean(str){
	var bad_classes = ["ui-droppable", "ui-draggable"];
	for(var i = 0; i < bad_classes.length; i++){
		 str = str.replace(new RegExp(bad_classes[i],"g"),"");
	}
	str = str.replace(new RegExp("style=\"(.*?)\"","g"),"");
	str = str.replace(new RegExp("class=\"\s*\"","g"),"");
	str = str.replace(new RegExp("style=\"\s*\"","g"),"");
	str = str.replace(new RegExp("  ","g")," ");
	return trim(str);
}

function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function clean_html(html){	
}

function is_empty(obj){
	for(var o in obj){return false;}
	return true;
}

function initialize_sms(){
	$("#update_content").click(function(){
		var element = $(context).attr("id")
		if(!(element in ui_content)) ui_content[element] = {};
		var node_content = ui_content[element];
		
		node_value = $("#node_html").val();
		var re = /<(script).*?>[.\s\S\w\W]*?<\/(script)>/gi;
		if(node_value.search(re) >= 0) node_value = node_value.replace(/script/g,"script2");
		
		switch($(context)[0].nodeName.toLowerCase()){
			case "div":
			case "span":
				node_content.html = node_value;
				$(context).html(node_value);
				break;
			case "a":
				node_content.html = node_value;
				node_content.href = $("#node_href").val();
				$(context).attr("href",node_content.href);
				$(context).html(node_content.html);
				break;
			case "label":
				node_content.text = $("#node_text").val();
				$(context).text(node_content.text);
				break;
			case "img":
				node_content.src = $("#node_src").val();
				$(context).attr("src",node_content.src);
				break;
		}
		
		show_normal();
		recursive_update($(context).parent(),$(context),node_content);
		restore_view();
		api.update_content(data_source["_id"],function(){
			$("#sms").addClass("hidden");
			parse_html();
		});
	});
}

function clean_content(safe_content){
	var re = /<(script).*?>[.\s\S\w\W]*?<\/(script)>/gi;
	if(safe_content.search(re) >= 0) safe_content = safe_content.replace(/script/g,"script2");
	return safe_content
}

function recursive_update(parent_node, source_node, source_content){
	var new_parent = $(parent_node).parent();
	var source_id = $(source_node).attr("id");
	var parent_id = $(parent_node).attr("id");
		if(parent_id in ui_content){
			try{
				var parent_elem = $("<div>" + ui_content[parent_id].html + "</div>");
				// now we need to affect the changes from source_content
				for(attr in source_content){
					if(attr != "html") $("#" + source_id,parent_elem).attr(attr,source_content[attr]);
					else $("#" + source_id,parent_elem).html(source_content[attr])
					ui_content[parent_id].html = clean_content($(parent_elem).html());
				}
			}catch(exception){}
		}
		if(parent_id == "contentHolder") return true;
		return recursive_update(new_parent,source_node,source_content)
}

function render_sms(the_node){
	$(".sms_details").addClass("hidden");
	context = $(the_node).data("context") || the_node;
	context_index = $(the_node).data("context_index") || 0;
	var context_id = $(context).attr("id");
	
	if($(context).attr("sms") == "true" && context_index == 0){ // this node has editable content
		$("#sms").removeClass("hidden");
		
		switch($(context)[0].nodeName.toLowerCase()){
			case "div":
			case "span":
				if(!is_empty(ui_content[context_id])) 
					$("#node_html").val(ui_content[context_id].html)
				else
					$("#node_html").val(clean($(context).html()));
				$("#html_details").removeClass("hidden");
				break;
			
			case "a":
				if(!is_empty(ui_content[context_id])) 
					$("#node_html").val(ui_content[context_id].html)
				else
					$("#node_html").val(clean($(context).html()));
				$("#node_href").val(trim($(context).attr("href")));
				$("#html_details").removeClass("hidden");
				$("#href_details").removeClass("hidden");
				break;
				
			case "img":
				update_image_elem({data:{elem:$("#node_src"), container:$("#img_src")}});
			
				$("#node_src").keyup(function(){
					$("#img_src").attr("src", $(this).val());
					$("#img_src").val($(this).val());
				});
				var img_src = (typeof $(context).attr("src") != "undefined") ? $(context).attr("src") : "";
				try{
					img_src = (img_src.split("url(")[1]).split(")")[0];
				}catch(exception){}
				$("#node_src").val(img_src);
				$("#img_src").attr("src",img_src);
				$("#src_details").removeClass("hidden");
				break;
				
			case "label":
				$("#node_text").val(clean($(context).text()));
				$("#text_details").removeClass("hidden");
				break;
		}
	}
	else{
		clear_sms();
		$("#sms").addClass("hidden");
	}
	
}

function clear_sms(){
	$("#node_text").val("");
	$("#node_html").val("");
	$("#node_href").val("");
}