if(!com){var com=new Object();}
if(typeof com.lbi=="undefined"){com.lbi=new Object();}
if(typeof com.lbi.utils=="undefined"){com.lbi.utils=new Object();}
if(typeof com.lbi.utils.DomUtils=="undefined"){com.lbi.utils.DomUtils=new Object();}

com.lbi.utils.DomUtils = function(){
}
/**
 * Injector{tag_name:String, attribute_maps:Object)
 * 
*/
com.lbi.utils.DomUtils.createAttributesInjector = function(tag_name, attribute_maps)
{
	return {tag_name:tag_name, attribute_maps:attribute_maps};
}
com.lbi.utils.DomUtils.createAttributeMap = function (attribute_name, map)
{
	return {attribute_name:attribute_name, map:map};
}
com.lbi.utils.DomUtils.getDefaultAttributes = function (allowed_attributes)
{
	var isInArray = com.lbi.utils.DomUtils.isInArray;
	var default_attributes = ["id", "src", "href", "class"];
	for(var i=0; i<allowed_attributes.length; i++){
		var attribute = allowed_attributes[i];
		if(!isInArray(attribute, default_attributes)){
			default_attributes.push(attribute);
		}
	}
	return default_attributes;
}
//TODO: provide full support for attributes
com.lbi.utils.DomUtils.innerHTML = function (src_obj, attributes_injectors, allowed_attributes)
{
	var InnerHTML = com.lbi.utils.DomUtils.innerHTML;
	var getNodeAttributes = com.lbi.utils.DomUtils.getNodeAttributes;
	var getInjectedAttributes = com.lbi.utils.DomUtils.getInjectedAttributes;
	var removeComments = com.lbi.utils.DomUtils.removeComments;
	var str_out='';
	
	var children=src_obj.childNodes;
	
	if (typeof src_obj.childNodes != 'undefined')
	{
		for (var i=children.length-1; i>=0; i--)
		{
			var c_node=children[i];
			
			
			if(c_node.nodeType==1) // element
			{
				var tag_name = c_node.tagName.toLowerCase();
				attr_str = "";
				//attr_str += c_node.getAttributeNode("id") ? getCarouselData(c_node.getAttributeNode("id").nodeValue) : "";
				attr_str += getNodeAttributes(c_node, allowed_attributes);
				var id = com.lbi.utils.DomUtils.getNodeAttribute(c_node, "id");
				if(attributes_injectors != null && id != null){
					var attr_inj_str = getInjectedAttributes(tag_name, id, attributes_injectors);
					attr_str += attr_inj_str;
				}
				str_out = 	'<' + tag_name + attr_str + '>' + InnerHTML(c_node, attributes_injectors, allowed_attributes) +  '</' + tag_name + '>' + str_out;
			}else if(c_node.nodeType==8) // comment
			{
			}else{// 3 = text
				str_out = c_node.nodeValue + str_out;			
			}
		}
	}
	return str_out;
}

com.lbi.utils.DomUtils.getInjectorByTagName = function(tag_name, attributes_injectors)
{
	for(var i=0; i<attributes_injectors.length; i++)
	{
		var injector = attributes_injectors[i];
		if(injector.tag_name.toLowerCase() == tag_name.toLowerCase()) return injector;
	}
	return null;
}

com.lbi.utils.DomUtils.getInjectedAttributes = function(tag_name, id, attributes_injectors)
{
	var injector = com.lbi.utils.DomUtils.getInjectorByTagName(tag_name, attributes_injectors);
	if(injector == null) return "";
	var res = "";
	var attribute_maps = injector.attribute_maps;
	for(var i=0; i<attribute_maps.length; i++){
		var attribute_map = attribute_maps[i];
		var attribute_name = attribute_map.attribute_name;
		var attribute_value = attribute_map.map[id];
		//if(attribute_value == null) alert("can't find value for id:" + id + " tag_name:" + tag_name + " attribute_name:" + attribute_name);
		if(attribute_value != null)	res += " " + attribute_name + "='" + attribute_value + "'";
	}
	return res;
}

com.lbi.utils.DomUtils.getNodeAttribute = function($node, $attribute)
{
	var attributes = com.lbi.utils.DomUtils.getNodeAttributesArray($node);
	for(var i=0; i<attributes.length; i++){
		var attribute = attributes[i];
		if(attribute.nodeName.toLowerCase() == $attribute.toLowerCase()) return attribute.nodeValue;
	}
	return null;
}

com.lbi.utils.DomUtils.getNodeAttributesArray = function($node)
{
	return $node.attributes ? $node.attributes : $node.getAttributes();
}

com.lbi.utils.DomUtils.getNodeAttributes = function($node, allowed_attributes){
	var isInArray = com.lbi.utils.DomUtils.isInArray;
	//var allowed_tags = (allowed_attributes != null ? allowed_attributes : ["id", "src", "href", "class"]);
	var res = "";
	var arr = com.lbi.utils.DomUtils.getNodeAttributesArray($node);
	for(var j=0; j<arr.length; j++){
		var attr_node = arr[j];
		var attr_name = attr_node.nodeName.toLowerCase();
		if(allowed_attributes != null){
			if(isInArray (attr_name, allowed_attributes)){
				res += " " + attr_name + "='" + attr_node.nodeValue + "'";
			}
		}else{
			res += " " + attr_name + "='" + attr_node.nodeValue + "'";
		}
	}
	//alert(res);
	return res;
}
com.lbi.utils.DomUtils.isInArray = function ($element, $array){
	for(var i=0; i<$array.length; i++){
		if($array[i] == $element) return true;
	}
	return false;
}
