var Sitemap = function(param_xml , param_tree) {
	Sitemap.instance = this;
	this._xmlTree = param_xml;
	this._tree = param_tree;
};


Sitemap.getInstance = function(){
	if(Sitemap.instance != undefined)
		return Sitemap.instance;
};	


Sitemap.prototype =  {

	tree:function() {
		return jQuery.extend(true, {}, this._tree);
	},
	

	getSectionByURL:function(param_url) {
		var myTree = this.tree();
		
		var tabLength = myTree.sections.length;
		for (var i = 0; i < tabLength ; ++i) {
			if (myTree.sections[i].url == param_url)
				return myTree.sections[i];
		}
		
		console.warn('Sitemap.getSectionByURL : url "' + param_url + '" not found');
		return null;
	},
		

	getSectionById:function(param_id) {
		var myTree = this.tree();
		var tabLength = myTree.sections.length;
		for (var i = 0; i < tabLength ; ++i) {
			if (myTree.sections[i].id == param_id)
				return myTree.sections[i];
		}
		
		console.warn('Sitemap.getSectionById : id "' + param_id + '" not found');
		return null;
	},
	
	
	isNode:function(param_url , param_map) {			
		var dataSrc = this._tree.sections;
		var tabLength = param_map.length;
		for (var i = 0; i < tabLength ; ++i) {
			dataSrc = dataSrc[param_map[i]].sections;
		}
		
		tabLength = dataSrc.length
		for (i = 0; i < tabLength ; ++i) {
			if (dataSrc[i].url == param_url)
				return i;
		}
		return -1;
	},

	
	getNode:function(param_map) {
		var myTree = this.tree();
		
		var dataSrc = myTree.sections;
		var tabLength = param_map.length;
		for (var i = 0; i < tabLength ; ++i) {
			if (i == tabLength - 1)
				return dataSrc[param_map[i]];
			dataSrc = dataSrc[param_map[i]].sections;
		}
		
		console.warn('Sitemap.getNode : map "' + param_map + '" not found');
		return null;
	},
	
	
	findChildrenAssets:function(param_map) {
		var assetList = [];
		var sectionInfo;
		var tempMap = [];
		var tabLength = param_map.length;
		for(var i = 0; i < tabLength ; ++i){
			tempMap.push(param_map[i]);
			sectionInfo = this.getNode(tempMap);
			if(sectionInfo != null)
				assetList = assetList.concat(sectionInfo.assets);				
		}
		return assetList;
	},
	
	
	mapToChunks:function(param_map) {
		var chunks = [];
		var slice;
		var tabLength = param_map.length;
		for (var i  = 0 ; i < tabLength ; ++i) {
			slice = param_map.slice(0 , i + 1);
			chunks[i] = this.getNode(slice).url;
		}
		
		return chunks;
	},
	
	
	getChildNodeById:function(param_base_node , param_id){
		if( !param_base_node.hasOwnProperty('sections'))
			return null;
		
		var len = param_base_node.sections.length;
		for(var i = 0; i < len ; ++i){
			if(param_base_node.sections[i].hasOwnProperty('id') && param_base_node.sections[i].id == param_id)
				return param_base_node.sections[i];
		}
		return null;
	},
	
	
	getChildNodeIndex:function(param_base_node , param_id){
		if( !param_base_node.hasOwnProperty('sections'))
			return -1;
		
		var len = param_base_node.sections.length;
		for(var i = 0; i < len ; ++i){
			if(param_base_node.sections[i].hasOwnProperty('id') && param_base_node.sections[i].id == param_id)
				return i;
		}

		return -1;
	},
	
	
	findOccurencesOf:function(param_node_name , param_map ){
		var result = [];
		var baseNode;
		
		if(param_map == undefined){
			baseNode = _tree;
			param_map = [];
		}
		else{
			baseNode = this.getNode(param_map);
			if(baseNode == null){
				console.error('Sitemap.findOccurencesOf : invalid map provided');
				return null
			}
		}
		
		this.findNodeIn(param_node_name , baseNode, param_map , result);
		return result;
	},
	
	
	findNodeIn:function(param_node_name ,param_node,  param_map , param_found){
		if(param_node.hasOwnProperty(param_node_name))
			param_found.push(param_map);
		
		if(param_node.hasOwnProperty('sections')){
			var nextMap;
			var len = param_node.sections.length;
			for(var i = 0; i < len ; ++i){
				nextMap = param_map.concat();
				nextMap.push(i);
				this.findNodeIn(param_node_name , param_node.sections[i] , nextMap , param_found);
			}
		}
	}
		
		
		
};
