// 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, db) {
  dbResult = new Array();
  
  switch (fun) {
    case "SelectEqual":
      dbResult = SelectEqual(campo1, valore1, db);
      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;
    default:
      dbResult = db;
  }

  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;
}

// 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;
}
