// Select.js
//
// In questo file sono contenute le funzioni che implemen-
// tano le ricerche in base ai parametri che  vengono pas-
// sati. Il codice con cui sono state scritte  dipende  in
// parte  dal tipo di base di dati che si vuole  trattare,
// ma  cio'  non  e'  che il punto di partenza per realiz-
// zazioni piu' generiche e flessibili. Si riportano a tal
// proposito  alcuni esempi di funzioni che possono essere
// sfruttate per ricerche combinate.

// Questa  funzione definisce una specie di "interfaccia".
// Nel caso in cui si aggiungono nuovi tipi di ricerca, si
// deve aggiungerli anche qui di seguito, indicando  quali
// campi passargli e via dicendo.
//

function doSelect(fun, campo1, valore1, campo2, valore2, SortFlag, db) {
  dbResult = new Array();

  switch (fun) {
    case "SelectEqual":
      dbResult = SelectEqual(campo1, valore1, db);
      break;
	case "SelectNotEqual":
      dbResult = SelectNotEqual(campo1, valore1, db);
      break;
	case "SelectNotEqualSorted":
      dbResult = SelectNotEqual(campo1, valore1, db);
	  dbResult.sort();
      break;
    case "SelectIsIn":
      dbResult = SelectIsIn(campo1, valore1, db);
      break;
    case "SelectEqAnd":
      dbResult = SelectEqAnd(campo1, valore1, campo2, valore2, db);
      break;
    case "SelectEqOr":
      dbResult = SelectEqOr(campo1, valore1, campo2, valore2, db);
      break;
    case "SelectIsInAnd":
      dbResult = SelectIsInAnd(campo1, valore1, campo2, valore2, db);
      break;
    case "SelectIsInOr":
      dbResult = SelectIsInOr(campo1, valore1, campo2, valore2, db);
      break;
	case "SelectIsInSorted":
      dbResult = SelectIsIn(campo1, valore1, db);
	  dbResult.sort();
      break;
	case "SelectLastOrder":
      dbResult = SelectLastOrder(db);
      break;
	case "SelectNewEntries":
	  dbResult = SelectNewEntries(db);
	  break;
    default:
      dbResult = db;
	  SortFlag = "true"; // default per tutto il database
  }

  if (SortFlag == "true") { dbResult.sort(); }

  return dbResult;
}

// SelectEqual prende in ingresso il numero del campo,  il
// valore  che bisogna cercare al suo interno e la base di
// dati in cui effettuare la ricerca. Per chi ha un minimo
// di  pratica con il linguaggio di interrogazioni SQL, in
// pratica equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE campo = valore
//
function SelectEqual(campo, valore, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo = '' + dbMatrix[i][campo]; 

    if (valoreCampo.toUpperCase() == valore.toUpperCase()) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectNotEqual prende in ingresso il numero del campo,  il
// valore  che bisogna cercare al suo interno e la base di
// dati in cui effettuare la ricerca. Per chi ha un minimo
// di  pratica con il linguaggio di interrogazioni SQL, in
// pratica equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE campo <> valore
//
function SelectNotEqual(campo, valore, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo = '' + dbMatrix[i][campo]; 

    if (valoreCampo.toUpperCase() != valore.toUpperCase()) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectIsIn prende  in ingresso il numero del campo,  il
// valore  che bisogna cercare al suo interno e la base di
// dati in cui effettuare la ricerca. Per chi ha un minimo
// di  pratica con il linguaggio di interrogazioni SQL, in
// pratica equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE valore ISIN campo
//
// (e' una versione generalizzata di SelectEqual)
//
function SelectIsIn(campo, valore, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo = '' + dbMatrix[i][campo].toUpperCase();

    if (valoreCampo.indexOf(valore.toUpperCase()) != -1) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectEqAnd prende in ingresso il  numero di due campi,
// i valori che bisogna cercare al loro interno e la  base
// di dati in cui effettuare la ricerca. In SQL equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE (campo1 = valore1) AND (campo2 = valore2)
//
function SelectEqAnd(campo1, valore1, campo2, valore2, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo1 = '' + dbMatrix[i][campo1];
    valoreCampo2 = '' + dbMatrix[i][campo2];

    if ( (valoreCampo1.toUpperCase() == valore1.toUpperCase())
      && (valoreCampo2.toUpperCase() == valore2.toUpperCase()) ) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectEqOr prende in ingresso il  numero di due campi,
// i valori che bisogna cercare al loro interno e la  base
// di dati in cui effettuare la ricerca. In SQL equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE (campo1 = valore1) OR (campo2 = valore2)
//
function SelectEqOr(campo1, valore1, campo2, valore2, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo1 = '' + dbMatrix[i][campo1];
    valoreCampo2 = '' + dbMatrix[i][campo2];

    if ( (valoreCampo1.toUpperCase() == valore1.toUpperCase())
      || (valoreCampo2.toUpperCase() == valore2.toUpperCase()) ) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectIsInAnd prende in ingresso il numero di due campi,
// i valori  che bisogna cercare al loro interno e la  base
// di dati in  cui effettuare la ricerca. In SQL equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE (valore1 ISIN campo1) AND (valore2 ISIN campo2)
//
// (e' una versione generalizzata di SelectEqAnd)
//
function SelectIsInAnd(campo1, valore1, campo2, valore2, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo1 = '' + dbMatrix[i][campo1].toUpperCase();
    valoreCampo2 = '' + dbMatrix[i][campo2].toUpperCase();

    if ( (valoreCampo1.indexOf(valore1.toUpperCase()) != -1)
      && (valoreCampo2.indexOf(valore2.toUpperCase()) != -1) ) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}

// SelectIsInOr  prende in ingresso il numero di due campi,
// i valori  che bisogna cercare al loro interno e la  base
// di dati in  cui effettuare la ricerca. In SQL equivale a
//
// SELECT *
// FROM dbMatrix
// WHERE (valore1 ISIN campo1) OR (valore2 ISIN campo2)
//
// (e' una versione generalizzata di SelectEqAnd)
//
function SelectIsInOr(campo1, valore1, campo2, valore2, dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=0; i<dbMatrix.length; i++) {
    // Si effettua un casting a tipo stringa
    valoreCampo1 = '' + dbMatrix[i][campo1].toUpperCase();
    valoreCampo2 = '' + dbMatrix[i][campo2].toUpperCase();

    if ( (valoreCampo1.indexOf(valore1.toUpperCase()) != -1)
      || (valoreCampo2.indexOf(valore2.toUpperCase()) != -1) ) {
      ResultMatrix[count] = new Array();
      ResultMatrix[count] = dbMatrix[i];
      count++;
    }
  }

  return ResultMatrix;
}
// SelectLastOrder ritorna il database in ordine inverso,
// ossia dall'ultimo elemento al primo.
function SelectLastOrder(dbMatrix) {

  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=dbMatrix.length-1; i>-1; i--) {
	ResultMatrix[count] = new Array();
    ResultMatrix[count] = dbMatrix[i];
    count++;
  }
  return ResultMatrix;
}

// SelectNewEntries ritorna gli ultimi 10 elementi immessi
// nel database.
function SelectNewEntries (dbMatrix) {
  var ResultMatrix = new Array();
  var count = 0;

  // Inizializzazione dei vari campi
  for (i=dbMatrix.length-1; count<10; i--) {
	ResultMatrix[count] = new Array();
    ResultMatrix[count] = dbMatrix[i];
    count++;
  }
  return ResultMatrix;
}
