// Configuration variables.
ROOT_DIR='files/';
XML_FILE_NAME="data.xml";

FOLDER="Folder";
FILE="File";
EXE="Exe";
DOC="Doc";
ZIP="Zip";
MOV="Mov";

// Global variables

g_xmlFileUrl=ROOT_DIR+XML_FILE_NAME;

if(navigator.userAgent.search(/Gecko/)!=-1) g_Navigator='moz';
else if(navigator.userAgent.search(/MSIE/)!=-1) g_Navigator='ie';
else g_Navigator='moz';

// Variable that stores the current path.
var g_curPath='';

// Recursive function that removes all children from a given node.
function removeChildren( node ){	
	while( node.hasChildNodes() ){
		removeChildren( node.lastChild );
		node.removeChild( node.lastChild );
	}	
}

function getElementTitle(name){
	switch(name){			
		case FOLDER:		return 'Carpeta';		break;
		case FILE:			return 'Archivo';		break;
		case EXE:			return 'Ejecutable';	break;
		case DOC:			return 'Documento';	break;
		case ZIP:			return 'Carpeta comprimida';	break;
		case MOV:			return 'Clip de película';	break;
	}
}

function getExtensionType(ext){
	switch( ext.toLowerCase() ){
		case 'exe':
		case 'bat':
		case 'msi':	return EXE;
		
		case 'doc':
		case 'txt':
		case 'pdf':
		case 'html':		
		case 'rtf':	return DOC;
		
		case 'zip':
		case 'ace':
		case 'rar':	return ZIP;
		
		case 'avi':
		case 'mpg':
		case 'mpeg':
		case 'ogm':
		case 'mov':	return MOV;
		
		default:	return FILE;
	}
}
		
function importXML(){		
	// Mozilla
	if (document.implementation && document.implementation.createDocument){		
		xmlDoc = document.implementation.createDocument( "", "", null);		
		xmlDoc.onload = printData;		
	}
	// Internet Explorer
	else if (window.ActiveXObject){		
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.onreadystatechange = function () {
			if (xmlDoc.readyState == 4) printData();
		}
	}
	else{
		alert( "Su navegador no puede mostrar la página correctamente" );
		return;				
	}
	
	// Try to load the XML file.
	try{				
		xmlDoc.load(g_xmlFileUrl);
	}
	// In Mozilla browsers, an exception is raised if the xml file does not exist.
	catch( e ){		
		openURL( g_curPath, true );
	}
}
	
function printData(){	
	var xmlLabel, tr, td1, td2, td3, thead,tbody, body, a, pathNav;
	
	xmlBody=xmlDoc.documentElement;
	// If the XML document doesn't have a body element we just try to open the URL.
	if( !xmlBody ){			
		openURL( g_curPath, true );
		return;		
	}
	
	var xmltable=document.createElement('TABLE');
	xmltable.setAttribute('border',0);
	xmltable.setAttribute('cellSpacing','0');
	xmltable.setAttribute('cellPadding','2');
	xmltable.setAttribute('border','1');
	xmltable.setAttribute('width','100%');
	
	thead=document.createElement('THEAD');
	xmltable.appendChild(thead);		
		
	htmlLabel=document.getElementById('label');	
	removeChildren( htmlLabel );
	xmlLabel=xmlBody.getAttribute('label');		
	htmlLabel.appendChild(document.createTextNode( xmlLabel ));
			
	pathNav=document.getElementById( 'pathNav' );
	if( g_curPath != '' ){
		pathNav.innerHTML="<a href=\"javascript:openURL('')\">Inicio</a>";
		
		var dirs=g_curPath.split( '/' );
		var path='';		
		for( var i=0; i<dirs.length; i++ ){
			path+=dirs[i]+'/';			
			if( i+2 == dirs.length ){
				pathNav.innerHTML+='/'+dirs[i];
			}
			else{
				pathNav.innerHTML+='/'+"<a href=\"javascript:openURL( '"+path+"' )\">"+dirs[i]+"</a>";	
			}
		}		
	}else{
		pathNav.innerHTML="Inicio";
	}		
	
	tr=document.createElement('tr');		
	thead.appendChild(tr);
	
	td1=document.createElement('th');	
	td1.className='iconCell';
	td1.appendChild(document.createTextNode('Tipo'));
	tr.appendChild(td1);
	
	td2=document.createElement('th');
	td2.className='nameCell';
	td2.appendChild(document.createTextNode('Nombre'));
	tr.appendChild(td2);
	
	td3=document.createElement('th');
	td3.className='descCell';
	td3.appendChild(document.createTextNode('Descripción'));
	tr.appendChild(td3);				
	
	tbody=document.createElement('tbody');
	xmltable.appendChild(tbody);
	
	printElements(xmlBody.childNodes,tbody,'');
	
	document.getElementById('data').appendChild(xmltable);
}

function printElements(body,tbody,level){
	var baseURL='';
	
	for(var i=0; i<body.length; i++){
		/* Correction for Mozilla based browsers which create nodes if the xml file contanis
		 tabs, spaces or carriage returns. */
		if(body[i].tagName!='element')continue;
		
		var type=null;
		var name=body[i].getAttribute('name');
		var url=body[i].getAttribute('link');
		var desc=body[i].getAttribute('description');
		
		if(url){
			var pattern=new RegExp( '/[^/]+$' );
			baseURL=url.replace( pattern, "/" );
					
			if( url.charAt(url.length-1) == '/' ){
				type=FOLDER;
			}else{
				var index=url.search( /\.([^\.]+)$/ );
				ext=url.substring(index+1);
				ext.toLowerCase();
				type=getExtensionType(ext);
			}
		}
		if( g_curPath != '' ){
			url=g_curPath+url;	
		}
		if( type == FOLDER ){
			url="javascript:openURL('"+url+"')";
		}else{
			url=ROOT_DIR+url;
		}
		
		tr=document.createElement('tr');			
		tbody.appendChild(tr);		
		
		td=document.createElement('td');		
		td.className='iconCell';
		tr.appendChild(td);
		
		a=document.createElement('a');		
		a.className='icon'+type;
		a.href=url;
		a.title=getElementTitle( type );
		td.appendChild(a);						
				
		span=document.createElement('span');
		span.appendChild( document.createTextNode( getElementTitle( type ) ) );
		a.appendChild(span);
		
		td=document.createElement('td');		
		td.className='nameCell';
		a=document.createElement('A');		
		a.href=url;
		a.appendChild(document.createTextNode(name));
		td.appendChild(a);
		tr.appendChild(td);
		
		td=document.createElement('td');		
		td.className='descCell';
		td.appendChild(document.createTextNode(desc));
		tr.appendChild(td);
						
		printElements(body[i].childNodes,tbody,level+1);		
	}
}

function openURL( url, ignoreXMLFile ){		
	
	if( ignoreXMLFile==true ){		
		location.href=ROOT_DIR+url;
	}else{
		g_xmlFileUrl=ROOT_DIR+url+XML_FILE_NAME;				
		
		var pathNav=document.getElementById( 'pathNav' );
		removeChildren( pathNav );
		removeChildren( document.getElementById( 'data' ) );
	
		g_curPath=url;
			
		importXML();
	}
}