/*

Funzioni JavaScript per il sito LB PROGRAMMING PAGE

Copyright (C) 2006 by Leonardo Berti

Questo modulo dipende dal modulo database che contiene la traduzione nel linguaggio corrente
ad esempio data_it.js per la lingua italiana

*/

//categorie dei programmi
var CAT_NONE=0; //non specificato
var CAT_GAMES=1;
var CAT_TIPS=2;
var CAT_UTILITY=4;
var CAT_OLD_STUFF=8;
var CAT_MISC=16;
var CAT_DATABASE=32;

//flags per tutte le categorie
var CAT_ALL=0xffff;

//linguaggi di programmazione
var PL_NONE=0;
var PL_CPP=1; //C/C++
var PL_VB=2; //Visual Basic
var PL_JAVA=4; //Java
var PL_QB=8; //Basic
var PL_PASCAL=16;
var PL_VBNET=32; //VB.NET
var PL_VCNET=64;
var PL_DHTML=128; //Dynamic HTML
var PL_PERL=256;
var PL_ASSEMBLY=512;
var PL_OTHER=1024;

var PL_ALL=0xffff;

//opzioni di rendering
var RD_NONE=0x0;
var RD_SCREENSHOT=0x1; //renderizza lo screenshot
var RD_DESCRIPTION=0x2; //descrizione
var RD_EXTRADATA=0x4; //altri dati (os,lang,date)

var RD_ALL=0xffff;

function maskNull(val)
{
  if (val==null) return "";
  else return val.toString();
}

function writeStyle()
{

  document.writeln("<style type=\"text/css\">");
  
  document.writeln(".tx {color:#66cc66;}");
  document.writeln(".tx1 {color:#99ffcc;}");
  document.writeln(".tx1h {color:#ffffff;}");
  document.writeln(".tx2 {font-size:small;color:#66cc66;}");
  document.writeln(".tx2h {font-size:small;color:#99ffcc;}");
  document.writeln(".txp {color:#ff99ff;}"); //rosa
  document.writeln(".box {border-style:raised;border-color:#66cc66;}");
  document.writeln(".input {color:#66cc66;background-color:#003300;}");
  document.writeln(".h {font-size:small;color:#99ffcc;cursor:pointer;}");
  document.writeln("A:link {color:#99FFFF;}");
  document.writeln("A:visited {color:#99CCFF;}");
  document.writeln("A:active {color:#CCFFCC;}");

  document.writeln("body {color:#66cc66;background-color:#000000;font-family:sans-serif;font-face:verdana;}");
  document.writeln("</style>");

}


//anti SPAM (almeno si spera)
function getMailAddress()
{
  
  var s="";
  
  s+="lbprograming";
  s+="@";
  s+="altervista";
  s+=".";
  s+="org";
  
  return s;

}

//Crea un elemento Project

function Project(name,version,os,category,type,plang,compiler,descr,screenshot,date,url,download_url,license)
{
  this.name=maskNull(name);
  this.version=maskNull(version);
  this.os=maskNull(os);
  this.category=category;
  this.type=maskNull(type);
  this.plang=plang;
  this.compiler=maskNull(compiler);
  this.descr=maskNull(descr);
  this.screenshot=maskNull(screenshot); //nome immagine senza url (il path viene aggiunto da renderProject)
  this.date=maskNull(date);
  this.url=maskNull(url);
  this.download_url=maskNull(download_url);
  this.license=maskNull(license);
  //proprietà extra
  this.keywords="";
  //link alla pagina con il codice sorgente
  this.source="";

  return this;

};

function setKeywords(project,keywords)
{
  if (project!=null) project.keywords=escape(keywords);
}

function setSource(project,sourceLink)
{
  this.source=maskNull(sourceLink);
}

//il progetto viene riassunto in una scheda orizzontale
//con descrizione e screenshot
//index=id progetto
//opzioni

function renderProjectRow(index,options)
{
  if (index==null || isNaN(index))
  {
     alert("Invalid param in function renderProject!");
     return false;
  }
  else if (_data==null) alert("Projects database not initialized!");
  else if (index<0 || index>=_data.length) alert("Project index out of bound!");
  else
  {   

    if (isNaN(options) || options==null) options=RD_NONE;

    document.writeln("<table border=\"1\"><tr>");

    var tmp="";
    var tmp1="";
    var p=_data[index];
    
    //screenshot

    if ((options & RD_SCREENSHOT)>0)
    {

      if (p.screenshot != "")
      {
        if (p.url!="")
        {
           document.writeln("<td align=\"center\"><img width='200' align=\"bottom\" height='150' style=\"cursor:pointer;\" onclick=\"openURL('"+escape(p.url)+"',false);\" src=\"immagini/"+p.screenshot+"\">");
        }
        else document.writeln("<td><img align=\"bottom\" width=\"220\" src=\"immagini/"+p.screenshot+"\">");
      }
      else document.writeln("<td><img align=\"bottom\" src=\"immagini/tpixel.png\" width=\"200\" height=\"150\">");

    }
    
    //titolo
    //document.writeln("<td style=\"width:200px;\" nowrap=\"nowrap\">"+p.name);
    document.writeln("<div class=\"tx1\">"+p.name+"</div>");

    if (p.version!="") document.writeln("&nbsp; "+p.version);
    
    document.writeln("</td>"); //fine titolo
    
    //descrizione

    if (options & RD_DESCRIPTION)
    {
     if (p.descr != "") document.writeln("<td style=\"font-size:small;width:360px\" ><p>"+p.descr+"</p></td>");
     else document.writeln("<td>&nbsp;</td>");
    }

    //linguaggio,sistema op.,categoria
    if (options & RD_EXTRADATA)
    {
        tmp=plToString(p.plang);
        if (p.compiler!="") tmp+= " ("+p.compiler+")";

        document.writeln("<td><table style=\"font-size:small\" cellpadding=\"0\" border=\"1\">");
        document.writeln("<tr><td nowrap title=\""+_tr("linguaggio di programmazione")+"\">"+tmp+"</td></tr>"); //linguaggio
        document.writeln("<tr><td nowrap title=\""+_tr("sistema operativo")+"\">"+p.os+"</td></tr>"); //sistema operativo
        document.writeln("<tr><td>"+p.date+"</td></tr>"); //data
        document.writeln("<tr><td nowrap title=\""+_tr("categoria")+"\">"+catToString(p.category)+"</td></tr>"); //categoria
        document.writeln("</table>");
    }
    else document.writeln("<td nowrap>");

    if (p.download_url!="") document.writeln("<a href=\"data/"+p.download_url+"\">download</a><br>");
    else document.writeln("<br>");

    if (p.source!="") document.writeln("<a href=\""+p.source+"\">"+_tr("codice sorgente")+"</a><br>");

    if (p.url!="") document.writeln("<a href=\""+p.url+"?lang="+getLangStr()+"\">"+_tr("altre informazioni")+"</a>");
    else document.writeln("&nbsp;");

    document.writeln("</td>");
    document.writeln("</tr></table>"); //fine tabella
  }
}

//Crea la parte HTML di visualizzazione del progetto
//il progetto viene riassunto in una scheda verticale)
function renderProject(index)
{ 

  if (index==null || isNaN(index))
  {
     alert("Invalid param in function renderProject!");
     return false;
  }
  else if (_data==null) alert("Projects database not initialized!");
  else if (index<0 || index>=_data.length) alert("Project index out of bound!");
  else
  {

    document.writeln("<table border=\"1\">");

    var tmp="";
    var tmp1="";
    var p=_data[index];

    tmp=p.name;

    if (p.version!="") tmp+=" v."+p.version;

    if (p.date!="") tmp1="  data:"+p.date;

    //titolo
    document.writeln("<tr><td><span style=\"font-weight:bold\">"+tmp+"</span>"+tmp1+"</td></tr>");

    if (p.category!="")
    {
         tmp=_txcat+":"+catToString(p.category);

         if (p.type!="") tmp += " ("+p.type+")";

         //categoria
         document.writeln("<tr><td>"+tmp+"</td></tr>");
    }

    //linguaggio programmazione

    if (p.lang!=null)
    {
       tmp=_txlanguage+": "+plToString(p.plang);

       if (p.compiler!="") tmp+=" ("+_txcompiler+" "+p.compiler+")";

       document.writeln("<tr><td>"+tmp+"</td></tr>");
    }

    //screenshot

    if (p.screenshot != "")
    {
      if (p.url!="")
      {
         document.writeln("<tr><td align=\"center\"><img style=\"cursor:pointer;\" onclick=\"openURL('"+escape(p.url)+"',true);\" src=\"immagini/"+p.screenshot+"\"></img></td></tr>");
      }
      else document.writeln("<tr><td><img src=\"immagini/"+p.screenshot+"\"></img></td></tr>");
    }

    //se si vogliono tabelle di dimensione diversa cambiare lo stile width
    if (p.descr != "") document.writeln("<tr><td style=\"width:320px\" ><p>"+p.descr+"</p></td></tr>");
    
    if (p.license !="") document.writeln("<tr><td><p>"+_txlicense+":"+p.license+"</p></td></tr>");

    //pagina del progetto
    if (p.url != "") document.writeln("<tr><td><a class=\"txp\" href=\""+p.url+"?lang="+getLangStr()+"\">"+_txprjhome+"</a></td></tr>");

    //cambiare qui il nome della dir. che contiene il file
    if (p.download_url != "") document.writeln("<tr><td><a class=\"tx1\" href=\"data/"+p.download_url+"\">"+_txdownload+"</a></td></tr>");

    document.writeln("</table>");

  }
}

//Menu principale
function writeMenu()
{
//Home
document.writeln("<div align=\"center\"><table border=\"0\"><tr><td>|</td><td class=\"box\"><p style=\"cursor:pointer\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" onclick=\"openURL('index.htm',true);\" class=\"tx1\" >"+_txhome+"</p></td><td>|</td><td><p style=\"cursor:pointer\" onclick=\"openURL('games.htm',true);;\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txgames+"</p></td><td>|</td><td><p style=\"cursor:pointer\" onclick=\"openURL('projects.htm',true);\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txprojects+"</p></td><td>|</td>");
//Tips
document.writeln("<td><p style=\"cursor:pointer\" onclick=\"openURL('tips.htm',true);\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txtips+"</p></td>");
//Esperimenti/varie
document.writeln("<td>|</td><td><p style=\"cursor:pointer\" onclick=\"openURL('experiments.htm',true);\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txexperiments+"</p></td>");
//old stuff (messo nella barra laterale)
//document.writeln("<td>|</td><td><p style=\"cursor:pointer\" onclick=\"window.location.href='index.htm';\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txoldstuff+"</p></td>");
//links
document.writeln("<td>|</td><td><p style=\"cursor:pointer\" onclick=\"openURL('links.htm',true);\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txlinks+"</p></td><td>|</td>");
//contact
document.writeln("<td><p style=\"cursor:pointer\" onclick=\"window.location.href='mailto:"+getMailAddress()+"';\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >"+_txcontact+"</p></td><td>|</td>");

if (_lang==LANG_IT){

//versione inglese
//document.writeln("<td nowrap=\"nowrap\" id=\"UKFLAG\" onclick=\"window.location.href='index.htm?lang=EN';\"><p  style=\"cursor:pointer\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >English version</p></td><td>|</td>");

document.writeln("<td style=\"cursor:pointer;\" onclick=\"window.location.href='index.htm?lang=EN';\"><img title=\"English version\" alt=\"English version\" src=\"immagini/ukflag.png\" width=\"32\" height=\"16\"></td>");

}
else {

//versione italiana
//document.writeln("<td id=\"ITFLAG\" onclick=\"window.location.href='index.htm?lang=IT';\"><p  style=\"cursor:pointer\" onmouseover=\"this.className='tx1h'\" onmouseout=\"this.className='tx1'\" class=\"tx1\" >versione Italiana</p></td>");

document.writeln("<td style=\"cursor:pointer;\" onclick=\"window.location.href='index.htm?lang=IT';\"><img title=\"versione Italiana\" alt=\"versione Italia\" src=\"immagini/itflag.png\" width=\"32\" height=\"16\"></td>");


}

//<img src=\"immagini/ukflag.png\" width=\"32\" height=\"16\">

document.writeln("</tr></table></div>");

}

function writeFooter()
{
 document.writeln("<div class=\"tx\" align=\"center\" style=\"font-size:8pt;\" >Copyright &copy; 2006 - lbprogramming</div>");

}

function writePlOptions()
{
   document.writeln("<option>"+plToString(PL_ALL)+"</option>");
   document.writeln("<option>"+plToString(PL_CPP)+"</option>");
   document.writeln("<option>"+plToString(PL_VB)+"</option>");
   document.writeln("<option>"+plToString(PL_JAVA)+"</option>");
   document.writeln("<option>"+plToString(PL_VBNET)+"</option>");
   document.writeln("<option>"+plToString(PL_VCNET)+"</option>");
   document.writeln("<option>"+plToString(PL_DHTML)+"</option>");
   document.writeln("<option>"+plToString(PL_ASSEMBLY)+"</option>");
   document.writeln("<option>"+plToString(PL_QB)+"</option>");
   document.writeln("<option>"+plToString(PL_PASCAL)+"</option>");
   document.writeln("<option>"+plToString(PL_PERL)+"</option>");
   document.writeln("<option>"+plToString(PL_OTHER)+"</option>");
}

function writeCatOptions()
{
   document.writeln("<option>"+catToString(CAT_ALL)+"</option>");
   document.writeln("<option>"+catToString(CAT_GAMES)+"</option>");
   document.writeln("<option>"+catToString(CAT_TIPS)+"</option>");
   document.writeln("<option>"+catToString(CAT_MISC)+"</option>");
   document.writeln("<option>"+catToString(CAT_DATABASE)+"</option>");
   document.writeln("<option>"+catToString(CAT_OLD_STUFF)+"</option>");

}

function writeSearchBar()
{
  
document.writeln("<p class=\"tx\">");
document.writeln(_txWords[0]+"&nbsp;<input id=\"qry\" type=\"text\" maxlength=\"80\" size=\"20\" class=\"tx\" style=\"background-color:#003300\">");
document.writeln("&nbsp;");
document.writeln(_txWords[1]); //categoria
document.writeln("<select type=\"select\" class=\"input\" id=\"selcat\">");

writeCatOptions();

document.writeln("</select>");
document.writeln(_txWords[2]);
document.writeln("<select type=\"select\" class=\"input\" id=\"selpl\">");

writePlOptions();

document.writeln("</select>");
document.writeln("<input type=\"button\" onclick=\"srcPrj();\" class=\"input\" value=\""+_txWords[3]+"\">");
document.writeln("<\p>");
}

function setLangByQS()
{
 if (getQueryStringParam("lang").toUpperCase()=="EN") _lang=LANG_EN;
 else _lang=LANG_IT;

}

function getQueryStringParam(param)
{
   var qry=location.search;

   if (qry.substring(0,1)=="?") qry=qry.substring(1);
   
   var params=qry.split("&");
   var len=params.length;
   var h;

   for (var i=0;i<len;i++)
   {
      h=params[i].split("=");
      
      if (h.length==2)
      {
          if (h[0]==param) return h[1];
      }
   }
   return "";
}


function openURL(url,self)
{
   if (url=="" || url==null)
   {
     alert("Invalid url!");return;
   }

   else 
   {
     
      if (!(url.indexOf(".png")>0 || url.indexOf(".jpg")>0)) //il parametro lingua non si applica nel caso di immagini
      {

          var ch=(url.indexOf("?")>0 ? "&" : "?");
    
          url += ch+"lang="+(_lang==LANG_EN ? "EN" : "IT");
      
      }
      
      if (self) window.location.href=url;
      else window.open(url);
   }
}

//restituisce il numero di elementi trovati
//res=vettore di interi con gli indici dei progetti trovati
//filter_type=applica il filtro per tipo
//filter_lang=filtro linguaggio
//bkeyword=ricerca anche nelle keyword e nella descrizione

function searchProject(qry,filter_type,filter_lang,bkeyword,res)
{
   var maxl=res.length;
   var i;
   var lu;
   var cnt=0;
   var bok;

   if (maxl<=0) return 0;

   for (i=0;i<maxl;i++) res[i]=-1; //resetta i risultati

   if (!_data) return 0; //database non inizializzato

   lu=_data.length;

   qry=qry.toLowerCase();
   
   if (qry=="*" || qry=="%") qry=""; //trova tutto

   //alert(lu);

   for (i=0;i<lu;i++)
   {

       bok=true;

       if (filter_type>0)
       {
           bok = (bok && ((_data[i].category & filter_type)>0));
       }
       
       //alert(_data[i].category);

       if (bok && filter_lang>0)
       {
            bok=(bok && ((_data[i].plang & filter_lang)>0));
       }

       //alert(bok+" - "+_data[i].name);

       if (bok)
       {

         if (_data[i].name.toLowerCase().indexOf(qry)>=0 || qry=="")
         {

           res[cnt++]=i;
           if (cnt==maxl) break;
         }
         else if (bkeyword)
         {
            if ( (_data[i].descr.toLowerCase().indexOf(qry)>=0) || (_data[i].keywords.toLowerCase().indexOf(qry)>=0))

            res[cnt++]=i;
            if (cnt==maxl) break;
         }
       }
   }

   return cnt; //numero di elementi trovati
}

//Restituisce il numero di progetti inseriti
function getProjectCount()
{
   if (!_data) return 0;
   else return _data.length;
}
