var PathFinder = function(param_path_list){
	this._pathList = {};
	this.build(param_path_list);
};
		

PathFinder.prototype = {
		
	build:function(param_list) {
		_pathList = {};
				
		var tabLength = param_list.length;
		//construction des objets
		var item;
		var relativeTo;
		//first loop, PathItem generation
		for (var i =  0; i < tabLength ; ++i) {
			item = param_list[i];
			relativeTo = (item.relativeTo != undefined) ? item.relativeTo : ""; 
			this._pathList[item.id] = new PathItem(item.location, relativeTo);
		}
		//second loop, resolving dependencies
		for (var id in this._pathList){
			this._pathList[id].lookforDependency(this._pathList);
		}
		//third loop ... change the PathItem into its built path
		for (id in this._pathList){
			this._pathList[id] = String(this._pathList[id]);
		}
		
		//this._pathList['root'] = param_root;
	},
	
	
	getFolderList:function() {
		var copy = jQuery.extend(true, {}, this._pathList);
		return copy;
	},
	
	
	get:function(param_type) {
		if (!this._pathList.hasOwnProperty(param_type)) {
			console.warn('PathFinder : ' + param_type + ' path unknown');
			return this._pathList['root'];
		}
		else
			return this._pathList[param_type].toString();
	},
	
	
	set:function(param_type , param_value){
		if (_pathList.hasOwnProperty(param_type))
				Log.warn('PathFinder : overwriting folder ' + param_type);
		_pathList[param_type] = param_value;
	},
	
	
	resolve:function(param_path) {
		param_path = param_path.replace(/[[0-9a-z]*]/g ,  replaceFolder);
		return param_path;
	},
	
	
	replaceFolder:function(){
		var folderPath = '';
		var folderName = String(arguments[0]);
		folderName = folderName.substr(1 , folderName.length - 2);
		if (this._pathList.hasOwnProperty(folderName))
			folderPath = this._pathList[folderName];
		else
			console.error('PathFinder : unable to resolve' + '"'+folderName+'"' + 'folder');
		return folderPath;
	}		
};

var PathItem = function(path, dependanceId){	
	this._path = path;
	this._dependanceId = dependanceId;
	this._dependsOn;
};

PathItem.prototype = {
		
	lookforDependency:function(pathItems){
		if( this._dependanceId != '' && pathItems[this._dependanceId] != undefined){
			this._dependsOn = pathItems[this._dependanceId];
		}
	},
	
	toString:function(){
		var str = this._path;
		if(this._dependsOn != undefined){
			str = this._dependsOn.toString() + str;
		}
		return str;
	}
};
