
//FUNZIONE CHE APRE UN FILE XML DATO IL PATH DEL FILE STESSO
function loadDb(path)
{
	var response="";
	var xmlDoc;
	try //Internet Explorer
	{
 		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
	}
	catch(e)
	{
		try //Firefox, Mozilla, Opera, etc.
		{
	 		xmlDoc=document.implementation.createDocument("","",null);
		}
		catch(e) 
		{
			alert(e.message);
		}
	}
	try 
	{
		xmlDoc.async=false;
		xmlDoc.load(path);
		response="xmlDoc is loaded, ready for use";
	}
	catch(e) 
	{
		alert(e.message);
	}
	return xmlDoc;
					
}

//FUNZIONE CHE CONVERTE IL FILE XML IN UN ARRAY ASSOCIATIVO
function select(tabella,xmlDoc)
{
	var albero=new Array();
	for(j=0;j<xmlDoc.getElementsByTagName(tabella).length;j++)
	{
		x=xmlDoc.getElementsByTagName(tabella)[j].childNodes;
		y=xmlDoc.getElementsByTagName(tabella)[j].firstChild;
		var nodo=new Array();
		for (i=0;i<x.length;i++)
		{
			if (y.nodeType==1)
			{//Process only element nodes (type 1)
				if(nodo[y.nodeName]!=null)
				{
					if(!(nodo[y.nodeName] instanceof Array))
					{
						var temp=new Array();
						temp[0]=nodo[y.nodeName];
						temp[1]=y.childNodes[0].nodeValue;
						nodo[y.nodeName]=temp;
						//alert('Sto creando un array '+y.nodeName);
					}
					else{
						nodo[y.nodeName][nodo[y.nodeName].length]=y.childNodes[0].nodeValue;
						//alert('Ho inserito nel array '+y.nodeName);
					}
				}
				else{
					nodo[y.nodeName]=y.childNodes[0].nodeValue;
				}
			  	//document.write(y.nodeName + "<br />");
			  	//document.write(y.childNodes[0].nodeValue + "<br />");
			}
			y=y.nextSibling;
		}
			albero[j]=nodo;
	}
	return albero;
}

function selectDistinct(tabella,campo,xmlDoc)
{
	var tab=select(tabella,xmlDoc);
	var selected=new Array();
	for(var i=0;i<tab.length;i++)
	{
		selected[i]=tab[i][campo];
	}
	return removeDuplicateElement(selected);
}

//FUNZIONE CHE EFFETTUA UNA OPERAZIONE DI JOIN TRA I CONTENUTI DI DUE FILE XML. PER COMODITA SI PASSANO
//IN INPUT GLI ARRAY ASSOCIATIVI IN RIFERIMENTO ALLE DUE TABELLE (I FILE XML). LA VARIABILE CAMPO E IL 
//PARAMETRO SECONDO CUI FARE LA JOIN
function join(albero1, albero2, campo)
{
	var alberoJoined=new Array();
	var indice=0;
	//alert(campo);
	for(var i=0;i<albero1.length; i++)
	{
		var valore1=albero1[i][campo];
		for(var j=0;j<albero2.length;j++)
		{
			if(albero2[j][campo]==valore1)
			{
				var albero=new Array();
				for(nome in albero2[j])
				{
					if(albero1[i][nome]==null){
						albero[nome]=albero2[j][nome];
						//alert(albero[nome]);
					}
				}
				var z=albero.length;
				for(altroNome in albero1[i])
				{
					albero[altroNome]=albero1[i][altroNome];
				}
				alberoJoined[indice]=albero;
				indice++;
			}
		}
	}
	return alberoJoined;
}


function whereCondition(albero,campo,operatore,valore)
{
	var alberoFiltered=new Array();
	var indice=0;
	//alert(campo);
	for(var i=0;i<albero.length; i++)
	{
		var ilCampo=albero[i][campo];
		if(nelFiltro(ilCampo,operatore,valore))
		{
			alberoFiltered[indice]=albero[i];
			indice ++;
		}
	}
	return alberoFiltered;
}

function nelFiltro(campo,operatore,valore)
{
	if(operatore == '>')
		if(campo > valore) return true;
	if(operatore == '>=')
		if(campo >= valore) return true;
	if(operatore == '==')
		if(campo == valore) return true;
	if(operatore == '<=')
		if(campo <= valore) return true;
	if(operatore == '<')
		if(campo < valore) return true;
	if(operatore == '!=')
		if(campo != valore) return true;
	return false;
}	

function removeDuplicateElement(arrayName)
      {
        var newArray=new Array();
        label:for(var i=0; i<arrayName.length;i++ )
        {  
          for(var j=0; j<newArray.length;j++ )
          {
            if(newArray[j]==arrayName[i]) 
            continue label;
          }
          newArray[newArray.length] = arrayName[i];
        }
        return newArray;
      }


function mergesort(arr,campo)
{
   var left = new Array();
   var right = new Array();
   var len = arr.length;

   if (len <= 1) return arr;

   var middle = Math.floor(len / 2);
   for (var i = 0; i < middle; i++) left.push(arr[i]);
   for (var i = middle; i < len; i++) right.push(arr[i]);

   left = mergesort(left,campo);
   right = mergesort(right,campo);

   return merge(left, right,campo);
}

function merge(left, right,campo)
{
   var retval = new Array();
   while(left.length > 0 && right.length > 0)
   {
      if (lt_or_eq(left[0][campo], right[0][campo])) retval.push(left.shift());
      else retval.push(right.shift());
   }

   if (left.length > 0) return retval.concat(left);
   if (right.length > 0) return retval.concat(right);

   return retval;
}

var desc=false;

function lt_or_eq(obj1, obj2)
{
   return (desc) ? obj1 >= obj2 : obj1 <= obj2;
}