<?php
/**
* @author Michele Castellucci <castellucci@cottonbit.it>
*
* questo file contiene la classe HTMLForm, la classe Adv_TextArea e 3 funzioni esterne
*/
define("REGEXP_NOTNULL","/^(.|\\n|\\r|\\r\\n)+$/"); //vale per le text e le textarea (ritorni a capo)
define("REGEXP_NUMREAL","/^-{0,1}((\d{1,})|(\d{1,}\.\d{1,}))$/");
define("REGEXP_NUMINT","/^-{0,1}\d{1,}$/");
define("REGEXP_DATE","/^\d{2}\/\d{2}\/\d{4}$/");
define("REGEXP_EMAIL","/^.{1,}@.{1,}\..{1,}$/");
define("REGEXP_IMAGE","/^.+\.((gif)|(jpg)|(png))$/");
define("REGEXP_FILE","/^.+\..{2,4}$/");
define("REGEXP_NUMSTRING","/^\d+$/");
/**
* Questo metodo consente di inserire sulla tabella $table i dati contenuti nell'array globale $_POST e $_FILES, per ogni
* campo presente su $table. Il metodo proverà a costruire una query SQL di inserimento o modifica a prescindere dal valore di
* $_POST['edit_'.$table]. Per una documentazione più dettagliata consultare HTMLForm.doc
*/
function insertIntoDBFromPOST($table,$submit_button,$primaryKey='id',$fileSavePath="uploaded_files",$resizeImg=false,$keepOriginal=false)
{
if (!isset($_POST[$submit_button])) return 0; else unset($_POST[$submit_button]);
/* echo"<pre>";
print_r($_POST);
echo "</pre><br /><br />";*/
if (!isset($_POST['edit_'.$table]) || $_POST['edit_'.$table]=='0') //oppure la chiave primaria è una stringa...
$edit=0; else $edit=1;
//unset($_POST['edit_'.$table]);
$query=$edit==1?"UPDATE $table SET ":"INSERT INTO $table {{{}}} VALUES {{{}}}";
//print_r($_FILES);
$fieldList=explode(",",$_POST['fieldList']);
$POST=$_POST;
//cerca la corrispondenza tra i post inviati e quelli non inviati ma presenti nel form
foreach ($fieldList as $v)
if ( !isset($POST[$v])
&& !isset($POST[$v."_ifr"])
&& !isset($POST[$v."_day"])
&& !isset($POST[$v."_mon"])
&& !isset($POST[$v."_yea"])
&& substr($v,0,1)!='@') $POST[$v]='';
foreach($POST as $nome=>$valore)
{
if ($valore=='ignore_this_post') continue;
if ($nome==$primaryKey) continue;
if ($nome=='fieldList') continue;
if (substr($nome,strlen($nome)-4,4)=="_day") {$data_generica=$valore;continue;}
if (substr($nome,strlen($nome)-4,4)=="_mon") {$data_generica=$valore."-".$data_generica;continue;}
if (substr($nome,strlen($nome)-4,4)=="_yea") {$valore=$valore."-".$data_generica; $nome=substr($nome,0,strlen($nome)-4);}
if (is_array($valore)) //set
$valore=implode(",",$valore);
if ($nome=="verification_code" && $_SESSION['verification_string']!=$valore) return array("wrong_vercode",$nome);//codice di verifica errato
if (substr($nome,0,7)=="verify_") //verifica via php della compilazione dei campi
{
$field_to_verify=substr($nome,7);//campo da verificare
/*echo "<pre>".print_r($_POST,true)."</pre>";*/
if (!isset($_POST[$field_to_verify]) && !isset($_FILES[$field_to_verify])) //si tratta della data che è divisa in 3 POST oppure di enum che non effettua il submit
{
if (isset($_POST[$field_to_verify."_day"]))//data
$_POST_field_to_verify=$_POST[$field_to_verify."_day"]."/".$_POST[$field_to_verify."_mon"]."/".$_POST[$field_to_verify."_yea"];
else
if (isset($_POST[$field_to_verify."_ifr"]))//iframe
$_POST_field_to_verify=$_POST[$field_to_verify."_ifr"];
else //ENUM e SET
return array('format_conflict',$field_to_verify);
}
else
if (isset($_POST[$field_to_verify]))
$_POST_field_to_verify=$_POST[$field_to_verify];
else
if (isset($_FILES[$field_to_verify]))
$_POST_field_to_verify=$_FILES[$field_to_verify]['name'];
$valore=stripslashes($valore);
if ($valore==1) $valore=REGEXP_NOTNULL; //
//controllo valori
if ($valore===REGEXP_NOTNULL)
{
if (trim(strip_tags($_POST_field_to_verify))!="")
$ok=true;
else $ok=false;
}
else
if (preg_match($valore,strtolower($_POST_field_to_verify))==1)
$ok=true;
else
$ok=false;
if ($ok==true) continue; else
//die ($field_to_verify."---".$_POST_field_to_verify);
return array('format_conflict',$field_to_verify);
}
if (substr($nome,strlen($nome)-4,4)=="_ifr")
{
$nome=substr($nome,0,strlen($nome)-4);
$valore=str_replace("\n"," ",$valore); //elimina carattere di ritorno a capo
$valore=str_replace("\r","",$valore); //elimina carattere di ritorno a capo
$valore=str_replace("<P>","",$valore);
$valore=str_replace("</P>","",$valore);
$valore=str_replace("<BR>","<br />",$valore);
$valore=str_replace("<br>","<br />",$valore);
$valore=str_replace("STRONG>","strong>",$valore);
$valore=str_replace("EM>","em>",$valore);
$valore=str_replace("UL>","ul>",$valore);
$valore=str_replace("LI>","li>",$valore);
$valore=str_replace("U>","u>",$valore);
$valore=str_replace("A>","a>",$valore);
$valore=str_replace("<A","<a",$valore);
$valore=str_replace("onclick=window.open(this.href);return false","onclick=\"window.open(this.href);return false\"",$valore);
$valore=autochiudi_tag("img",$valore);
$valore=autochiudi_tag("br",$valore);
$valore=autochiudi_tag("IMG",$valore);
$valore=autochiudi_tag("BR",$valore);
$valore=autochiudi_tag("hr",$valore);
$valore=autochiudi_tag("HR",$valore);
}
else
{
//$valore=str_replace('"',"'",$valore);
//$valore=str_replace("\n","<br />",$valore);
//SOSTITUZIONE CARATTERI PARTICOLARI
//(&) -in visualizzazione deve essere scritta &
// -in modifica deve essere scritta & (per scrivere letteralmente "&" bisogna avere "&mp;")
// -quindi viene memorizzato come &
$valore=str_replace("&","&",$valore);
//(>) -in visualizzazione deve essere scritta >
// -in modifica (textbox) deve essere scritta >
// -quindi viene memorizzato come >
// lo stesso vale per (<)
$valore=str_replace(">",">",$valore);
$valore=str_replace("<","<",$valore);
//(") -in visualizzazione può essere scritto " o "
// -in modifica deve essere scritta "
// ma sulle textarea però può anche essere scritta "
// -quindi viene memorizzato come " e rimpiazzato in " solo in fase di modifica
// si potrebbe memorizzare qui solo " ma per maggiore flessibilità non si fa
//tutte queste considerazioni non valgono per la textarea con IFRAME che gestisce tutto autonomamente
//QUESTE SOSTITUZIONI VENGO APPLICATE ANCHE IN FASE DI RICERCA NEL DBNAVIGATOR - funzione convertSpecialChars!!!
//PER TROVARE I CARATTERI EFFETTIVAMENTE MEMORIZZATI
}
//////////////////////////////////////////CHECK COLUMN EXISTENCE
$founded=false;
$result=mysql_query("DESCRIBE $table");
while ($row=mysql_fetch_array($result))
{
if ($row['Field']==$nome || strpos($nome,'delete_')!==false) //..
{
$founded=true;
if ($row['Key']=="UNI") //controllo chiavi uniche
{
if (is_array($_POST[$primaryKey])) return array('query_error',"Si è inviato un input di un campo univoco in un form di modifica di più record");
//controllo se esiste un record con un campo con lo stesso valore
$result2=mysql_query("SELECT * FROM {$table} WHERE {$primaryKey}!='".$_POST[$primaryKey]."' AND {$nome}=\"{$valore}\"")
or die ('errore controllo univocità '.mysql_error());
if (mysql_num_rows($result2)>0) return array('key_conflict',$nome);
}
break;
}
}
if ($founded==false) continue; //se non c'è un campo della tabella con nome=al post allora ignora il post MANCA SU _FILES
///////////////////////////////////////////////////////////////
if ($edit==1) //query di aggiornamento
{
if (strpos($nome,'delete_')!==false) //ELIMINA FILE CORRENTE
{
if (is_array($_POST[$primaryKey])) return array('query_error',"Si è inviato un input di eliminazione file in un form di modifica di più record");
$nome=substr($nome,7,strlen($nome));
$valore="";
//echo "-->".$nome."<--";
$row=mysql_fetch_array(mysql_query("SELECT $nome FROM $table WHERE $primaryKey='{$_POST[$primaryKey]}'"));
if ($row[$nome]!="" && file_exists($fileSavePath."/".$row[$nome]))
{
unlink($fileSavePath."/".$row[$nome]); //elimina il file
if (file_exists($fileSavePath."/small_".$row[$nome])) unlink($fileSavePath."/small_".$row[$nome]); //se è un'immagine elimina anche quella piccola
}
}
if ($nome==$primaryKey) continue;
$query.="`$nome`='$valore', ";
}
else //query di inserimento
{
//die('ciao');
if ($nome==$primaryKey && (int)($_POST[$primaryKey])) $valore=""; //se la chiave primaria è intera mettila a '' per fare l'autoincrement
$exp=explode("}}}",$query);
$exp[0].="`".$nome."`,";
$exp[1].="'".$valore."',";
$query=implode("}}}",$exp);
}
}
if (!is_array($_POST[$primaryKey])) //non si assegnano più file ad un record
foreach ($_FILES as $nome=>$file)
{
//print_r($_FILES);
//die('');
if ($file['error']==1) return array('file_too_big',$nome);
if (!$file['size']>0) continue;
$file['name']=str_replace(array('"',"'"," ","&"),"_",stripslashes($file['name'])); //sostituisce i caratteri non ammessi con _
if (!file_exists($fileSavePath)) mkdir($fileSavePath,0777); //CREA LA DIRECTORY PER SALVARE I FILE
$result=mysql_query("SELECT $nome FROM $table WHERE $primaryKey!='{$_POST[$primaryKey]}'");
while ($row=mysql_fetch_array($result))
{
//controllo se esiste un record con un file collegato con lo stesso nome
if ($row[$nome]==$file['name']) return array('file_conflict',$nome);
}
if ($edit==1) //query di aggiornamento
{
if ($nome==$primaryKey) continue;
$row=mysql_fetch_array(mysql_query("SELECT $nome FROM $table WHERE $primaryKey='{$_POST[$primaryKey]}'"));
if ($row[$nome]!="" && file_exists($fileSavePath."/".$row[$nome]))
{
unlink($fileSavePath."/".$row[$nome]); //elimina il file precedente
if (file_exists($fileSavePath."/small_".$row[$nome])) unlink($fileSavePath."/small_".$row[$nome]); //se è un'immagine elimina anche quella piccola
}
$query.="$nome='{$file['name']}', ";
}
else //query di inserimento
{
if ($nome==$primaryKey && (int)($_POST[$primaryKey])) $valore=""; //se la chiave primaria è intera mettila a '' per fare l'autoincrement
$exp=explode("}}}",$query);
$exp[0].="`".$nome."`,";
$exp[1].="'".$file['name']."',";
$query=implode("}}}",$exp);
}
}
foreach ($_FILES as $nome=>$file)//copia fisica dei file per evitare upload inutili
{
if (!$file['size']>0) continue;
$file['name']=str_replace(array('"',"'"," ","&"),"_",stripslashes($file['name'])); //sostituisce i caratteri non ammessi con _
$ext=strtolower(substr($file['name'],(strlen($file['name'])-4),4)); //prende le ultime 4 lettere
if ($resizeImg && ($ext==".gif" || $ext==".jpg" || $ext==".png"))
{
resize_img($file['tmp_name'],$resizeImg,$resizeImg,$fileSavePath."/small_".$file['name'],$ext);
}
if (($resizeImg && $keepOriginal) || !$resizeImg) copy($file['tmp_name'],$fileSavePath."/".$file['name']);
}
// ELIMINA LE VIRGOLE FINALI
if ($edit==1)
{
if ($query=="UPDATE $table SET ") //nessuna modifica ai campi
return 1;
else
{
if (is_array($_POST[$primaryKey]))
{
foreach($_POST[$primaryKey] as $id)
$cond[]="{$primaryKey}=\"{$id}\"";
$cond=implode (" OR ",$cond);
}
else
$cond="`$primaryKey`='{$_POST[$primaryKey]}'";
$query=substr($query,0,strlen($query)-2);
$query.=" WHERE ".$cond;
}
}
else
{
$exp=explode("}}}",$query);
$exp[0]=substr($exp[0],0,count($exp[0])-2);
$exp[1]=substr($exp[1],0,count($exp[1])-2);
$query=implode(")",$exp);
$query=str_replace("{{{","(",$query);
}
//////
/* print_r($_POST);
die($query);*/
$executeQuery=false;
if (!mysql_query($query)) //le 2 condizioni finali servono x query "vuote" (senza campi)
{
//echo "ERRORE QUERY: ".$query;
return array('query_error',mysql_error()."($query)");
} else return 1;
}
/**
* Questa funzione ridimensiona l'immagine con percorso $pathimage con formato $ext (estenzione) alle dimensioni $new_sizex, $new_sizey e salva l'immagine
* redimensionata sul percorso $dest_file.
*/
function resize_img($pathimage, $new_sizex, $new_sizey, $dest_file,$ext)
{
$imagename = $pathimage;
if(file_exists($pathimage))
{
switch ($ext)
{
case '.jpg':$pic = imagecreatefromjpeg($pathimage); break;
case '.gif':$pic = imagecreatefromgif($pathimage); break;
case '.png':$pic = imagecreatefrompng($pathimage); break;
}
$sizex = imagesx($pic) ;
$sizey = imagesy($pic) ;
if (($sizex > $new_sizex) || ($sizey > $new_sizey) )
{
if($sizex>$sizey)
{
$s0x = $new_sizex ;
$s0y = (($new_sizex * $sizey)/$sizex) ;
settype ($s0y, "integer") ;
}
else
if ($sizex<$sizey)
{
$s0y = $new_sizey ;
$s0x = (($new_sizey * $sizex)/$sizey) ;
settype ($s0x, "integer") ;
} else
{
$s0x = $new_sizex ;
$s0y = $new_sizey ;
}
$gd_info=gd_info();
if(strstr($gd_info['GD Version'],"2.")) ///mmmmmmhhh.......
{
$out = imagecreatetruecolor( $s0x, $s0y) ;
imagecopyresampled ($out, $pic, 0, 0, 0, 0, $s0x, $s0y, $sizex, $sizey) ;
}else
{
$out = imagecreate( $s0x, $s0y) ;
imagecopyresized($out, $pic, 0, 0, 0, 0, $s0x, $s0y, $sizex, $sizey) ;
}
switch ($ext)
{
case '.jpg':$pic = imagejpeg($out, $dest_file,100); break;
case '.gif':$pic = imagegif($out, $dest_file) ; break;
case '.png':$pic = imagepng($out, $dest_file) ; break;
}
//imagedestroy($pic);
imagedestroy($out);
return 1 ;
} else //
{
copy($pathimage, $dest_file) ;
return 1;
}
} else //!file_exists
{
return 0 ;
}
}
/**
* Questa classe consente di costruire
* un form XHTML accessibile con metodi avanzati di validazione dati Javascript. Il form costruito è inserito in una tabella di 2 colonne.
*/
class HTMLForm
{
/**
* Contiene il codice XHTML del form creato
* @var string
*/
var $result="";
/**
* nome del form
* @var string
*/
var $name;
/**
* La largezza della prima colonna della tabella del form
* @var int
*/
var $width1;
/**
* La largezza della seconda colonna della tabella del form
* @var int
*/
var $width2;
/**
* Contiene il codice JavaScript di validazione del form
* @var string
*/
var $validateFunction="";
/**
* Array contenente come indici i nomi di tutti gli input inseriti
* @var array
*/
var $input=array();
/**
* Distanza orizzontale tra un input e il successivo, in poche parole l'altezza della riga vuota tra 2 input
* @var int
*/
var $horizSpace;
/**
* Booleano che indica se i paramentri iniziali sono stati reimpostati dopo l'istanziamento della classe
* @var boolean
*/
var $params_redefined=false;
/**
* Contiene il codice XHTML del form creato da aggiungere in coda.
* @var string
*/
var $result_end="";
/**
* Contiene il codice JavaScript di validazione del form da aggiungere in coda
* @var string
*/
var $validateFunction_end="";
/**
* Contiene il nome dell'input focalizzato
* @var string
*/
var $focused_field="";
/**
* Contiene il messaggio abbinato all'input focalizzato
* @var string
*/
var $focused_msg="";
/**
* Contiene un booleano che indica se visualizzare i label degli input e gli input su una nuova riga
* @var boolean
*/
var $ever_new_line=false;
/**
* Contiene la lingua con cui si stampa il form
* @var string
*/
var $lang=array();
/**
* Contiene un booleano che indica se le funzioni comuni di Adv_TextArea sono state già stampate
* @var boolean
*/
var $Adv_TextArea_common_javascript_functions_PRINTED=false;
var $removeServerValidation='';
/**
Definisce $field (aggiunto o da aggiungere tramite addInput ) come un campo ‘focused’ ovvero come un campo in cui è impostato automaticamente il focus. Inoltre inserisce $msg sulla riga di spaziatura della tabella situata sopra l’input.
Il focus e l’inserimento del messaggio vengono effettuati tramite una funzione javascript associata all’evento onload della finestra. Il javascript viene aggiunto ALLA FINE di tutto l’output generato da HTMLForm.
*/
function setFocused($field,$msg)
{
$this->focused_field=$field;
$this->focused_msg=$msg;
}
/** Imposta la lingua dei testi del form */
function setLanguage($lang)
{
$lang=strtolower($lang);
$this->lang['languageName']=$lang;
if ($lang=='english')
{
$this->lang['insertPassword']="Insert new password";
$this->lang['passwordsDifferent']="Inserted passwords are different";
$this->lang['authorizeTreatment']="You must authorize personal data treatment";
$this->lang['insertVerifyCode']="You must insert verify code";
$this->lang['day']="day";
$this->lang['month']="month";
$this->lang['year']="year";
$this->lang['old']="Old";
$this->lang['rewrite']="Rewrite";
$this->lang['new']="New";
$this->lang['missingInformation']="Missing information";
$this->lang['notValidNumber']="This is not a valid number";
$this->lang['notValidInt']="This is not a valid int number";
$this->lang['notDate']="This is not a date";
$this->lang['notValidEmail']="This is not a valid E-mail address";
$this->lang['notImage']="Selected file is not an image";
$this->lang['notFile']="Selected file is not valid";
$this->lang['incompleteInformation']="Incomplete information";
$this->lang['deleteCurrent']="Delete current";
$this->lang['selectAnOption']="Select an option";
$this->lang['selectTheOption']="Select the option";
$this->lang['selectTheOption']="Select at least one option";
$this->lang['notNumericString']="This is not a numeric string";
}else
{
$this->lang['insertPassword']="Inserire la nuova password";
$this->lang['passwordsDifferent']="Le password inserite sono differenti";
$this->lang['authorizeTreatment']="Devi autorizzare il trattamento personale dei dati";
$this->lang['insertVerifyCode']="Devi inserire il codice di verifica";
$this->lang['day']="giorno";
$this->lang['month']="mese";
$this->lang['year']="anno";
$this->lang['old']="Vecchia";
$this->lang['rewrite']="Riscrivi";
$this->lang['new']="Nuova";
$this->lang['missingInformation']="Informazione mancante";
$this->lang['notValidNumber']="Il valore inserito non è un numero";
$this->lang['notValidInt']="Il valore inserito non è un numero valido";
$this->lang['notDate']="Il valore non è una data";
$this->lang['notValidEmail']="Il valore inserito non è un indirizzo E-mail valido";
$this->lang['notImage']="Il file selezionato non è una immagine";
$this->lang['notFile']="Il file selezionato non è valido";
$this->lang['incompleteInformation']="Informazione incompleta";
$this->lang['deleteCurrent']="Elimina corrente";
$this->lang['selectAnOption']="Selezione una opzione";
$this->lang['selectTheOption']="Seleziona l'opzione";
$this->lang['selectOneOption']="Seleziona almeno una opzione";
$this->lang['notNumericString']="Il valore inserito non è una stringa numerica";
}
}
/**
* Definisce i parametri generali del form, VEDI COSTRUTTORE
*/
function defineParams($name,$target,$width1,$width2,$summary="",$method="post",$horizSpace=14,$ever_new_line=false)
{
if (!$this->params_redefined) //può ridefinire i paramentri solo una volta
{
$this->ever_new_line=$ever_new_line;
$this->horizSpace=$horizSpace;
$this->name=$name;
$this->width1=$width1;
$this->width2=$width2;
$begin="<form method=\"$method\" action=\"$target\" id=\"$name\" enctype=\"multipart/form-data\">
<table summary=\"$summary\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:".($width1+$width2)."%\" >";
$this->result=substr($this->result,strpos($this->result,'%" >')+4); //elimina il tag form e table
$this->result=$begin.$this->result;
$this->params_redefined=true;
}
}
/*
* Costruttore della classe: $width1 e $width2 sono la larghezza delle 2 colonne della tabella in percentuale.
* $horizSpace è il valore in pixel della distanza inserita tra un input ed un altro.
* La spaziatura avviene ad ogni esecuzione del metodo addInput() inserendo una riga vuota della tabella, a tale riga viene associato un id che consenta di poterla identificare per inserire un messaggio su un input impostato a ‘focused’: vedi metodo setFocused() .
*/
function HTMLForm($name,$target,$width1,$width2,$summary="",$method="post",$horizSpace=14,$ever_new_line=false)
{
$this->ever_new_line=$ever_new_line;
$this->horizSpace=$horizSpace;
$this->name=$name;
$this->width1=$width1;
$this->width2=$width2;
$this->result="<form method=\"$method\" action=\"$target\" id=\"$name\" enctype=\"multipart/form-data\">
<table summary=\"$summary\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:".($width1+$width2)."%\" >";
$this->setLanguage("italiano");
}
/*
* Aggiunge alla tabella del form una cella con testo $text arbitrario.
*/
function addExternalContent($text,$at_end=false)
{
if ($at_end)
$this->result_end.="<tr><td colspan=\"2\" style=\"height:".$this->horizSpace."px;\"></td></tr>
<tr><td colspan=\"2\">{$text}</td></tr>";
else
$this->result.="<tr><td colspan=\"2\" style=\"height:".$this->horizSpace."px;\"></td></tr>
<tr><td colspan=\"2\">{$text}</td></tr>";
}
/*
* Aggiunge alla tabella del form una cella con testo $text arbitrario.
*/
function addExternalValidation($js,$at_end=false)
{
if ($at_end)
$this->validateFunction_end.=$js;
else
$this->validateFunction.=$js;
}
/*
* aggiunge al form una textarea (semplice) non editabile contenente il testo $law (tipicamente l’attuale legge sulla privacy) e una checkbox con validazione di tipo NOT_NULL con intestazione ($heading).
*/
function addPrivacyInput($law,$heading,$class="")
{
$class=$class==""?"":"class=\"$class\"";
$this->result_end.="
<tr>
<td colspan=\"2\" style=\"width:".($this->width1+$this->width2)."%\" >
<label for=\"%frmName%_privacy_textarea\"></label>
<br /><textarea id=\"%frmName%_privacy_textarea\" $class readonly=\"readonly\" style=\"width:".($this->width1+$this->width2)."%;height:100px\" cols=\"0\" rows=\"0\">$law</textarea>
</td>
</tr>
<tr>
<td colspan=\"2\" style=\"width:".($this->width1+$this->width2)."%\" >
<input type=\"checkbox\" name=\"%frmName%_privacy_checkbox\" id=\"%frmName%_privacy_checkbox\" value=\"ignore_this_post\" />
<label for=\"%frmName%_privacy_checkbox\"><strong>$heading</strong></label><br />
</td>
</tr>
";
$this->validateFunction_end.="if ( document.getElementById('%frmName%').%frmName%_privacy_checkbox.checked==false)
{alert('{$this->lang['authorizeTreatment']}'); document.getElementById('%frmName%').%frmName%_privacy_checkbox.focus(); return false;}
";
}
/*
* aggiunge 2 password input con validazione di tipo NOT_NULL e una aggiuntiva validazione che verifica che il contenuto del primo input sia uguale a quello del secondo. Il nome del primo input è naturamente $name, quello del secondo “{$name}_retyped” (questo dato è chiaramente inutile quindi in fase di ricezione dati deve essere eliminato)
*/
function addInsertPasswordInputs($name,$heading="",$class="")
{
$this->addInput("password",$name,"",$heading,false,false,true,$class);
$this->addInput("password",$name."_retyped","",$this->lang['rewrite']." ".$heading,false,false,true,$class);
$this->validateFunction.="
if ( document.getElementById('%frmName%').{$name}.value!=document.getElementById('%frmName%').{$name}_retyped.value )
{
document.getElementById('%frmName%').{$name}.focus();
alert(\"{$this->lang['passwordsDifferent']}\");
return false;
}";
}
/*
* aggiunge 3 password input “{$name}_old” , $name, “{$name}_retyped” (la vecchia password, la nuova password, la nuova password ridigitata) che permettono di modificare facoltativamente la password. Vengono inserite 2 validazioni:
* La prima effettua validazione di tipo NOT_NULL sulla nuova password, solo se si è inserito un valore per la vecchia password.
* La seconda verifica che la nuova password sia uguale a quella ridigitata
* sempre se si è inserito un valore per la vecchia password.
*/
function addChangePasswordInputs($name,$heading="",$class="")
{
$this->addInput("password",$name."_old","",$this->lang['old']." ".$heading,false,false,false,$class);
$this->addInput("password",$name,"",$this->lang['new']." ".$heading,false,false,false,$class);
$this->addInput("password",$name."_retyped","",$this->lang['rewrite']." ".$heading,false,false,false,$class);
$this->validateFunction.="
if ( document.getElementById('%frmName%').{$name}_old.value!='' &&
document.getElementById('%frmName%').{$name}.value==document.getElementById('%frmName%').{$name}_retyped.value &&
document.getElementById('%frmName%').{$name}.value==''
)
{
document.getElementById('%frmName%').{$name}.focus();
alert(\"{$this->lang['insertPassword']}\");
return false;
}
if ( document.getElementById('%frmName%').{$name}_old.value!='' && document.getElementById('%frmName%').{$name}.value!=document.getElementById('%frmName%').{$name}_retyped.value )
{
document.getElementById('%frmName%').{$name}.focus();
alert(\"{$this->lang['passwordsDifferent']}\");
return false;
}";
}
/*
* aggiunge 3 password input “{$name}_old” , $name, “{$name}_retyped” (la vecchia password, la nuova password, la nuova password ridigitata) che permettono di modificare facoltativamente la password. Vengono inserite 2 validazioni:
* La prima effettua validazione di tipo NOT_NULL sulla nuova password, solo se si è inserito un valore per la vecchia password.
* La seconda verifica che la nuova password sia uguale a quella ridigitata
* sempre se si è inserito un valore per la vecchia password.
*/
function addChangePasswordInputsWithoutOldPassword($name,$heading="",$class="")
{
$this->addInput("password",$name,"",$this->lang['new']." ".$heading,false,false,false,$class);
$this->addInput("password",$name."_retyped","",$this->lang['rewrite']." ".$heading,false,false,false,$class);
$this->validateFunction.="
if (
document.getElementById('%frmName%').{$name}.value!=document.getElementById('%frmName%').{$name}_retyped.value &&
(document.getElementById('%frmName%').{$name}.value!='' || document.getElementById('%frmName%').{$name}_retyped.value!='')
)
{
document.getElementById('%frmName%').{$name}.focus();
alert(\"{$this->lang['passwordsDifferent']}\");
return false;
}
";
}
/*
* aggiunge un input testuale con intestazione $heading e classe del foglio di stile $class ed una immagine contenente un codice di verifica.
* Tale POST verrà controllato dal metodo insertIntoDBFromPost per controllare
* che il valore inserito sia uguale al codice generato, contenuto nella variabile di sessione $_SESSION['verification_string'].
* L'immagine contenente il codice di verifica è generata dal file verimage.php
*/
function addVerificationCode($heading="",$class="",$otherHTML="")
{
if ($class!="") $class="class=\"{$class}\"";
if ($otherHTML!="") $otherHTML="<br />{$otherHTML}";
if (file_exists("verimage.php")) //cartella corrente dello script
$path="verimage.php";
else
if (file_exists("classes/verimage.php")) //cartella corrente dello script
$path="classes/verimage.php";
else
if (file_exists("../classes/verimage.php")) //cartella superiore dello script
$path="../classes/verimage.php";
else
if (file_exists("writein3/classes/verimage.php")) //cartella del writein
$path="writein3/classes/verimage.php";
$this->result_end.="
<tr>
<td colspan=\"2\" style=\"height:".$this->horizSpace."px;\" id=\"verification_code_message\">
</td>
</tr>
<tr>
<td style=\"width:".$this->width1."%\" >
<label for=\"verification_code\"><strong>$heading</strong></label>
</td>
<td style=\"width:".$this->width2."%\">
<img src=\"".$path."\" alt=\"codice di verifica\" style=\"vertical-align:bottom;border:1px solid #FF0000;\" />
<input id=\"verification_code\" name=\"verification_code\" $class style=\"width:50%\" />
{$otherHTML}
</td>
</tr>
";
$this->validateFunction_end.="
if ( document.getElementById('%frmName%').verification_code.value=='')
{
alert('{$this->lang['insertVerifyCode']}');
document.getElementById('%frmName%').verification_code.focus();
return false;
}";
}
/*
* Aggiunge un input al form, VEDI HTMLForm.doc per spiegazione dettagliata....ritorna true o false ad indicare se l'input è stato aggiunto (o no xkè presente)
*/
function addInput($inputType,$name,$value,$heading="",$bool=false,$selected=null,$validate=false,$class="",$at_end=false)
{
$inputType=strtoupper($inputType);
$result="";
$validateFunction="";
$isArrayInput=preg_match("/.+\[.*\]/",$name);
if (isset($this->input[$name]) && !$isArrayInput) return false;
$this->input[$name]=($inputType=='FILE' || $inputType=='PASSWORD'?'@':'').$name;
if ($class!="") $class="class=\"$class\"";
//if ($name==$this->focused_field) $heading="<span style=\"color:#FF0000\">»»</span> <em>".$heading."</em>";
if ($inputType!="TEXTAREA") //le virgolette possono restare così in modifica nelle textarea's
{
///SOSTITUZIONE " con "
if (is_array($value))
{
$oldValue=$value;
$value=array();
foreach ($oldValue as $key=>$val)
$value[str_replace("\"",""",$key)]=str_replace("\"",""",$val);
}
else $value=str_replace("\"",""",$value);
if (is_array($selected))
{
$oldSelected=$selected;
$selected=array();
foreach ($oldSelected as $key=>$val)
$selected[str_replace("\"",""",$key)]=str_replace("\"",""",$val);
}
else $selected=str_replace("\"",""",$selected);
}
if ($inputType=="TEXTAREA" && ( (is_array($bool) && count($bool>0)) || $bool===true)) //bool indica la textarea avanzata
{
$inputType="ADV_TEXTAREA";
$this->validateFunction.="save_iframe_text('{$name}'); "; //SALVATAGGIO DATI IFRAME
}
if ($inputType!="HIDDEN")
{
if ($name==$this->focused_field)
{
$focused_msg_style="color:#FF0000;padding:6px 0px 6px 0px;";
$focused_input_style="border:1px solid #FF0000";
$focused_msg=$this->focused_msg;
}
else
{
$focused_msg_style="";
$focused_input_style="";
$focused_msg="";
}
$result.="
<tr>
<td colspan=\"2\" style=\"height:".$this->horizSpace."px;{$focused_msg_style}\" id=\"{$name}_message\">
{$focused_msg}
</td>
</tr>"; //aggiunge una riga vuota
}
if ($inputType=="DATE")
{
$is_day_empty="(document.getElementById('%frmName%').{$name}_day.disabled=='' && document.getElementById('%frmName%').{$name}_day.value=='')";
$is_mon_empty="(document.getElementById('%frmName%').{$name}_mon.disabled=='' && document.getElementById('%frmName%').{$name}_mon.value=='')";
$is_yea_empty="(document.getElementById('%frmName%').{$name}_yea.disabled=='' && document.getElementById('%frmName%').{$name}_yea.value=='')";
$is_day_filled="(document.getElementById('%frmName%').{$name}_day.disabled=='' && document.getElementById('%frmName%').{$name}_day.value!='')";
$is_mon_filled="(document.getElementById('%frmName%').{$name}_mon.disabled=='' && document.getElementById('%frmName%').{$name}_mon.value!='')";
$is_yea_filled="(document.getElementById('%frmName%').{$name}_yea.disabled=='' && document.getElementById('%frmName%').{$name}_yea.value!='')";
}
if ($validate || is_array($validate)) //validazione javascript
{
//print_r($validate);
if (is_array($validate))
{
$not_null=$validate[0];
$validate=$validate[1];
}
else
$not_null=true;
if ($inputType=="DATE")
{
$validateCondition="($is_day_empty || $is_mon_empty || $is_yea_empty)";
$validateFunction.="
if {$validateCondition}
{
if {$is_day_empty}
{alert('$heading {$this->lang['day']}: {$this->lang['missingInformation']}'); document.getElementById('%frmName%').{$name}_day.focus(); return false;}
else if {$is_mon_empty}
{alert('$heading {$this->lang['month']}: {$this->lang['missingInformation']}'); document.getElementById('%frmName%').{$name}_mon.focus(); return false;}
else if {$is_yea_empty}
{alert('$heading {$this->lang['year']}: {$this->lang['missingInformation']}'); document.getElementById('%frmName%').{$name}_yea.focus(); return false;}
}
";
}
else if ($inputType=="RADIO")
{
if (count($value)>1)
{
$cond=array();
$cond2=array();
for($i=0;$i<count($value);$i++)
{
$cond[] ="document.getElementById('%frmName%').{$name}[$i].checked==false";
$cond2[]="document.getElementById('%frmName%').{$name}[$i].disabled==''";
}
$cond=implode(" && ",$cond);
$cond2=implode(" || ",$cond2);
}
else
{
$cond="document.getElementById('%frmName%').{$name}.checked==false";
$cond2="document.getElementById('%frmName%').{$name}.disabled==''";
}
//se sono tutti non selezionati ed almeno uno è selezionabile, ferma il form
$validateCondition="((".$cond.") && (".$cond2."))";
$validateFunction.="if {$validateCondition} {alert(\"$heading: {$this->lang['selectAnOption']}\"); document.getElementById('%frmName%').{$name}[0].focus(); return false;}
";
}
else if ($inputType=="CHECKBOX")
{
if (!is_array($value))
$validateFunction.="if ( document.getElementById('%frmName%').{$name}.disabled=='' && document.getElementById('%frmName%').{$name}.checked==false) {alert(\"{$this->lang['selectTheOption']}\"); document.getElementById('%frmName%').{$name}.focus(); return false;}
";
else
{
$cond=array();
$cond2=array();
$i=0;
foreach($value as $val)
{
$cond[] ="document.getElementById('%frmName%').elements['{$name}[{$i}]'].checked==false";
$cond2[]="document.getElementById('%frmName%').elements['{$name}[{$i}]'].disabled==''";
$i++;
}
$cond=implode(" && ",$cond);
$cond2=implode(" || ",$cond2);
$validateCondition="((".$cond.") && (".$cond2."))";
$validateFunction.="if {$validateCondition} {alert(\"{$heading}: {$this->lang['selectOneOption']}\"); document.getElementById('%frmName%').elements['{$name}[0]'].focus(); return false;}
";
}
}
else if ($inputType=="ADV_TEXTAREA")
{
$validateCondition="(!validate_iframe('{$name}'))";
$validateFunction.="if {$validateCondition}
{
alert(\"$heading: {$this->lang['missingInformation']}\");
return false;
}";
}
else
{
if (is_bool($validate)) $validate=REGEXP_NOTNULL; //Se il valore di $validate impostato a true viene usato per altri tipi di input come TEXT, PASSWORD, FILE, allora $validate viene interpretato come la costante predefinita NOT_NULL.
switch($validate)
{
case REGEXP_NOTNULL:$check=".match($validate)==null"; $msg="$heading: {$this->lang['missingInformation']}"; break;
case REGEXP_NUMREAL: $check=".match($validate)==null"; $msg="$heading: {$this->lang['notValidNumber']}"; break;
case REGEXP_NUMINT: $check=".match($validate)==null"; $msg="$heading: {$this->lang['notValidInt']}"; break;
case REGEXP_DATE: $check=".match($validate)==null"; $msg="$heading: {$this->lang['notDate']}"; break;
case REGEXP_EMAIL: $check=".match($validate)==null"; $msg="$heading: {$this->lang['notValidEmail']}"; break;
case REGEXP_IMAGE: $check=".toLowerCase().match($validate)==null"; $msg="$heading: {$this->lang['notImage']} (gif,jpg o png)"; break;
case REGEXP_FILE: $check=".toLowerCase().match($validate)==null"; $msg="$heading: {$this->lang['notFile']}"; break;
case REGEXP_NUMSTRING: $check=".toLowerCase().match($validate)==null"; $msg="$heading: {$this->lang['notNumericString']}"; break;
default :$check="==''"; $msg="$heading: {$this->lang['missingInformation']}.."; break;
}
//echo $name."-".$validate."-".$check."<br>";
$and=$not_null===false?"&& document.getElementById('%frmName%').$name.value!=''":"";
$validateCondition="(document.getElementById('%frmName%').$name.disabled=='' && document.getElementById('%frmName%').$name.value{$check} $and)";
$validateFunction.=" if {$validateCondition}
{alert(\"$msg\"); document.getElementById('%frmName%').$name.focus(); return false;}
";
}
if ($not_null===true) $heading.=" (*)"; //visualizza l'asterisco per i campi (strettamente) obbligatori
}
else //non obbligatorio
if ($inputType=="DATE") //controllo che si selezionino tutte e tre le select si seleziona giorno o mese o ora e non si seleziona giorno o mese o ora
{
$validateFunction.= "
if (
( {$is_day_filled} || {$is_mon_filled} || {$is_yea_filled} )
&&
( {$is_day_empty} || {$is_mon_empty} || {$is_yea_empty} )
)
{
alert('$heading: {$this->lang['incompleteInformation']}');
document.getElementById('%frmName%').{$name}_day.focus();
return false;
}
";
}
if ($this->ever_new_line && $inputType!='HIDDEN')
$result.="<tr><td colspan=\"2\" style=\"width:".($this->width1+$this->width2)."%\" ><strong><label for=\"$name\">$heading</label></strong><br />";
else
switch($inputType) //tabella
{
case 'CHECKBOX':break;
case 'SELECT':
case 'FILE':
case 'PASSWORD':
case 'TEXT':
case 'DATE':
$result.="<tr>
<td style=\"width:{$this->width1}%\"><strong><label for=\"$name\">$heading</label></strong></td>
<td style=\"width:{$this->width2}%\">
";
break;
case 'RADIO':
$result.="<tr>
<td style=\"width:{$this->width1}%\"><strong><label for=\"$name\">$heading</label></strong></td>
<td style=\"width:{$this->width2}%;{$focused_input_style}\">
";
break;
case 'TEXTAREA':
case 'ADV_TEXTAREA':$result.="<tr><td colspan=\"2\" style=\"width:".($this->width1+$this->width2)."%\" ><strong><label for=\"$name\">$heading</label></strong><br />"; break;
case 'HIDDEN':$result.="<tr><td colspan=\"2\" style=\"height:0px\" >
";
}
switch($inputType) //tag input
{
case 'FILE':if ($bool) $script="var cb=document.getElementById('%frmName%').delete_{$name};
if (document.getElementById('%frmName%').$name.value!='') {cb.disabled=true; cb.checked=true;}
else {cb.disabled=false; cb.checked=false;}
"; else $script="";
$result.="<input $class type=\"file\" id=\"$name\" name=\"$name\" value=\"$value\"
onchange=\"$script\" onkeyup=\"$script\" />";
if ($bool) $result.="<br /><input $class type=\"checkbox\" value=\"1\" name=\"delete_{$name}\" style=\"{$focused_input_style}\" onchange=\"
if (document.getElementById('%frmName%').delete_{$name}.checked==true) document.getElementById('%frmName%').$name.disabled=true;
else document.getElementById('%frmName%').$name.disabled=false\" />{$this->lang['deleteCurrent']} $heading
";
break;
case 'TEXT':$result.="<input $class style=\"width:85%;{$focused_input_style}\" maxlength=\"255\" type=\"text\" id=\"$name\" name=\"$name\" value=\"$value\" size=\"30\" />
";
break;
case 'PASSWORD':$result.="<input $class style=\"width:85%;{$focused_input_style}\" type=\"password\" id=\"$name\" name=\"$name\" value=\"$value\" size=\"30\" />
";
break;
case 'HIDDEN':$result.="<input type=\"hidden\" name=\"$name\" value=\"$value\" />";
break;
case 'CHECKBOX':
if (!is_array($value)) //checkbox semplice
{
if ($selected) $selected="checked=\"checked\"";
$result.="<tr>
<td colspan=\"2\">
<input $class type=\"checkbox\" id=\"$name\" name=\"$name\" value=\"$value\" style=\"{$focused_input_style}\" $selected style=\"vertical-align:middle\" />
<strong><label for=\"$name\">$heading</label></strong>
";
}
else //checkbox con più scelte
{
$result.="<tr>
<td style=\"width:{$this->width1}%\">
<strong><label for=\"$name\">$heading</label></strong>
</td>
<td style=\"width:{$this->width2}%\">
";
$first=true;
$i=0;
foreach ($value as $key=>$val)
{
if ($first)
{
$first=false;
$id="id=\"{$name}\" ";
}else $id="";
if (in_array($key,$selected)) $sel="checked=\"checked\""; else $sel="";
$result.="<input type=\"checkbox\" {$id}name=\"{$name}[{$i}]\" value=\"{$key}\" {$sel} /> {$val}<br />";
++$i;
}
}
break;
case 'ADV_TEXTAREA':
$adv_textarea_params=array();
if (isset($bool['imagesPath']) && isset($bool['imagesPath']['absolute']) && isset($bool['imagesPath']['relative']))
$adv_textarea_params['imagesPath']=$bool['imagesPath'];
else
if (isset($bool['absolute']) && isset($bool['relative'])) //per compatibilità (moduli newsletter)
//si consente il passaggio dei 2 valori direttamente su bool
$adv_textarea_params['imagesPath']=$bool;
else
$adv_textarea_params['imagesPath']="";
$adv_textarea_params['fontSize']=isset($bool['fontSize'])?$bool['fontSize']:'';
$adv_textarea_params['selectFont']=isset($bool['selectFont'])?$bool['selectFont']:'';
$adv_textarea_params['bodyStyleOrCSS']=isset($bool['bodyStyleOrCSS'])?$bool['bodyStyleOrCSS']:'';
if (!$this->Adv_TextArea_common_javascript_functions_PRINTED) //stampa una volta sola
{
Adv_TextArea::print_common_javascript_functions();
$this->Adv_TextArea_common_javascript_functions_PRINTED=true;
}
$result.=Adv_TextArea::get_xhtml_and_javascript($name,addslashes($value),$class,"width:100%;",true,true,true,true,true,true,true,true
,true
,$adv_textarea_params['fontSize']
,$adv_textarea_params['selectFont']
,$adv_textarea_params['imagesPath']
,$adv_textarea_params['bodyStyleOrCSS']);
break;
case "TEXTAREA":
$value=str_replace("<br />","\n",$value); ////////!
//if ($bool) $bool="readonly=\"readonly\""; else $bool="";
$result.="
<textarea $class id=\"$name\" name=\"$name\" style=\"width:100%;{$focused_input_style}\" cols=\"0\" rows=\"0\" >$value</textarea>
";
break;
case 'RADIO'://$result.="<FIELDSET>";
$i=0;
if ($bool) $bool=""; else $bool="<br />";
$first=true;
foreach($value as $thevalue=>$hdn)
{
if ($first)
{
$first=false;
$id="id=\"$name\" ";
}
else $id="";
if ((string)($thevalue)==(string)($selected))
$checked="checked=\"checked\"";
else $checked="";
$result.="<input type=\"radio\" {$id}name=\"$name\" value=\"$thevalue\" $checked />$hdn $bool";$i++;
}
break;
case 'SELECT':
if (is_int($bool))
{
$mult="multiple=\"multiple\" size=\"{$bool}\"";
$arr="[]";
}else
{
$mult="";
$arr="";
}
$result.="<select $class $mult id=\"$name\" name=\"{$name}{$arr}\" style=\"width:auto;{$focused_input_style}\">
";
$i=0;
foreach($value as $thevalue=>$hdn)
{
if
(
(is_array($selected) && in_array((string)($thevalue),$selected))
||
(!is_array($selected) && (string)($thevalue)==(string)($selected) )
)
$sel="selected=\"selected\"";
else
$sel="";
$result.="<option value=\"$thevalue\" $sel>$hdn</option>
";$i++;
}
$result.="</select>
";
break;
case 'DATE':
$selected=explode("-",$selected);
$three_array=$this->dateArray($value[0],$value[1]);
//if (strstr($heading," (*)")) $heading=substr($heading,0,strpos($heading," (*)"));
$name_heading=str_replace("_"," ",$name);
$result.="<table id=\"{$name}\" border=\"0\" summary=\"Selezione ".str_replace("_"," ",$name)."\" style=\"{$focused_input_style}\">";
$result.="<tr><td><label for=\"{$name}_day\"></label></td>";
$result.="<td><select $class id=\"{$name}_day\" name=\"{$name}_day\" style=\"width:auto\">
";
$i=0;
foreach($three_array[0] as $thevalue=>$hdn)
{
if (isset($selected[2]) && $thevalue==$selected[2]) $sel="selected=\"selected\""; else $sel="";
$result.="<option value=\"$thevalue\" $sel>$hdn</option>
";$i++;
} $result.="</select></td></tr>
";
$result.="<tr><td><label for=\"{$name}_mon\"></label></td>";
$result.="<td><select $class id=\"{$name}_mon\" name=\"{$name}_mon\" style=\"width:auto\">
";
$i=0;
foreach($three_array[1] as $thevalue=>$hdn)
{
if (isset($selected[1]) && $thevalue==$selected[1]) $sel="selected=\"selected\""; else $sel="";
$result.="<option value=\"$thevalue\" $sel>$hdn</option>
";$i++;
} $result.="</select></td></tr>
";
$result.="<tr><td><label for=\"{$name}_yea\"></label></td>"; //intestazioni per l'accessibilità
$result.="<td><select $class id=\"{$name}_yea\" name=\"{$name}_yea\" style=\"width:auto\">
";
$i=0;
foreach($three_array[2] as $thevalue=>$hdn)
{
if (isset($selected[0]) && $thevalue==$selected[0]) $sel="selected=\"selected\""; else $sel="";
$result.="<option value=\"$thevalue\" $sel>$hdn</option>
";$i++;
} $result.="</select></td></tr></table>
";
break;
}
if (isset($not_null) && $not_null==true)
{
$result.="<input type=\"hidden\" id=\"verify_{$name}\" name=\"verify_{$name}\" value=\"{$validate}\" />
";
if (isset($validateCondition)) //aggiunge il js per disabilitare gli input già validati con js ed eliminare la validazione via php
$this->removeServerValidation.="if (!{$validateCondition}) {document.getElementById('%frmName%').verify_{$name}.name='';}";
}
$result.="</td></tr>";
//if ($bool) $result.="<br />";
if ($at_end)
{
$this->result_end.=$result;
$this->validateFunction_end.=$validateFunction;
}else
{
$this->result.=$result;
$this->validateFunction.=$validateFunction;
}
return true;
}
function buildForm($caption,$class="",$reset=true)
{
$fieldList=array();
foreach($this->input as $k=>$v)
$fieldList[]=preg_replace('/\[.*\]/','',$v);
$this->result.="<input type=\"hidden\" name=\"fieldList\" value=\"".implode(",",$fieldList)."\" />";
$this->result.=$this->result_end; //aggiungo gli input da mettere alla fine del form
$this->validateFunction.=$this->validateFunction_end.$this->removeServerValidation;
$this->result=str_replace("%frmName%",$this->name,$this->result);
$this->validateFunction=str_replace("%frmName%",$this->name,$this->validateFunction);
$this->result="
<script type=\"text/javascript\">
<!--
validateFunction_{$this->name}=function ()
{
$this->validateFunction
return true;
}
//--></script> ".$this->result; //questione di estetica del codice
if ($class!="") $class="class=\"$class\"";
$this->result.="<tr><td colspan=\"2\" style=\"height:".($this->horizSpace*2)."px\" ></td></tr>
<tr>
<td colspan=\"2\" style=\"text-align:center;width:".($this->width1+$this->width2)."%\" >
<input $class type=\"submit\" name=\"{$this->name}_submit\" value=\"$caption\"
onclick=\"return validateFunction_{$this->name}()\" onkeypress=\"if (this.event.keyCode!=13) return false; else return validateFunction_{$this->name}()\" /> ";
if ($reset) $this->result.="
<input $class type=\"reset\" name=\"{$this->name}_reset\" value=\" Reset \" />";
$this->result.="</td>
</tr>
</table>
</form>";
if ($this->focused_field!="") $this->result.="
<script type=\"text/javascript\">
function focus_it()
{
document.getElementById('{$this->focused_field}').focus();
document.getElementById('{$this->focused_field}').style.border='1px solid #FF0000';
document.getElementById('{$this->focused_field}_message').style.color='#FF0000';
document.getElementById('{$this->focused_field}_message').style.paddingTop='6px';
document.getElementById('{$this->focused_field}_message').style.paddingBottom='6px';
document.getElementById('{$this->focused_field}_message').innerHTML=\"".str_replace('"',"'",$this->focused_msg)."\";
}
//window.onload=new Function (\"focus_it();\");
focus_it();
</script>";
return $this->result;
}
/*
* restituisce un array di 3 elementi che a loro volta contengono un array con un numero di elementi pari rispettivamente a 31 (i giorni), 12 (i mesi), ($end_year-$start_year) (gli anni). Ogni sottoarray contiene come valore l’intestazione del dato che è diversa dalla chiave solo nel caso dei mesi (“11”=>”Novembre”) mentre negli altri casi è uguale (“1984=>”1984”)
*/
function dateArray($start_year,$end_year)
{
$result=array();
if ($this->lang['languageName']=='english')
$value=array(""=>"Day");
else
$value=array(""=>"Giorno");
for ($i=1;$i<=31;$i++)
{
$j=($i<10)?"0$i":$i;
$value[$j]=$i;
}
$result[]=$value;
if ($this->lang['languageName']=='english')
$value=array(""=>"Month");
else
$value=array(""=>"Mese");
for ($i=1;$i<=12;$i++)
{
$j=($i<10)?"0$i":$i;
switch($i)
{
case "1":$show=$this->lang['languageName']=='english'?"January":"Gennaio";break;
case "2":$show=$this->lang['languageName']=='english'?"February":"Febbraio";break;
case "3":$show=$this->lang['languageName']=='english'?"March":"Marzo";break;
case "4":$show=$this->lang['languageName']=='english'?"April":"Aprile";break;
case "5":$show=$this->lang['languageName']=='english'?"May":"Maggio";break;
case "6":$show=$this->lang['languageName']=='english'?"June":"Giugno";break;
case "7":$show=$this->lang['languageName']=='english'?"July":"Luglio";break;
case "8":$show=$this->lang['languageName']=='english'?"August":"Agosto";break;
case "9":$show=$this->lang['languageName']=='english'?"September":"Settembre";break;
case "10":$show=$this->lang['languageName']=='english'?"October":"Ottobre";break;
case "11":$show=$this->lang['languageName']=='english'?"November":"Novembre";break;
case "12":$show=$this->lang['languageName']=='english'?"December":"Dicembre";break;
}
$value[$j]=$show;
}
$result[]=$value;
if ($this->lang['languageName']=='english')
$value=array(""=>"Year");
else
$value=array(""=>"Anno");
for ($i=$start_year;$i<=$end_year;$i++)
{
$value[$i]=$i;
}
$result[]=$value;
return $result;
}
}
/*
* Questa classe permette di creare una textarea con tasti di formattazione del testo utilizzando un IFRAME in modalità design.
*/
class Adv_TextArea
{
/*
* ritorna una stringa contenente il codice XHTML che definisce una textarea (IFrame) con tasti bold,italic,underline,list,link e il codice JavaScript (non racchiuso in una funzione) necessario ad inizializzare la textarea appena creata.
* Inoltre è presente un hidden input (necessario per inserire fisicamente i dati) con id uguale ad “{$id}_ifr” (nome necessario per far riconoscere al metodo insertIntoDBFromPOST che si tratta di testo contenente tag HTML da correggere in XHTML)
*/
function get_xhtml_and_javascript($id,$value,$class,$style,
$bold,$italic,$underline,$ulist,$jleft,$jcenter,$jright,$link,$unformat,
$fontSize=false,$selectFont=false,$filesPath="",$bodyStyleOrCSS=false)
{
if (!$bodyStyleOrCSS) $bodyStyleOrCSS="font-size:14px;font-family:Arial,Helvetica,sans serif;";
$value=str_replace("\n","<br />",$value);
$value=str_replace("\r","",$value);
//$value=str_replace(array("\n","\r"),"<br />",$value);
$button_style="style=\"color:#111111;border:1px solid #666666;margin:0px 4px 4px 0px;vertical-align:middle\"";
if (is_array($filesPath))
{
$handle=opendir($filesPath['relative']);
$imgDiv="";
$fileDiv="";
$count=0;
while (false !== ($file = readdir($handle)))
{
if (is_dir($file)) continue;
if (preg_match("/\.((gif)|(png)|(jpg)|(jpeg))$/i",$file)!=0 )
{
if ($count % 3 == 0 ) $clear="both"; else $clear="none";
//notare che nel src metto il path relative e quando aggiungo tale valore (un src di img) alla textarea, viene aggiunto autom. il path assoluto
$imgDiv.="<div style=\"margin:5px;width:100px;height:100px;float:left;text-align:center\">";
$imgDiv.="<img src=\"{$filesPath['relative']}/{$file}\" style=\"clear:{$clear};cursor:pointer;"
.getImageResizedValues("{$filesPath['relative']}/{$file}",100,100).";\"
onclick=\"document.getElementById('preview_images_{$id}').style.display='none';command('{$id}','InsertImage',
{imgSrc:this.src,float:this.parentNode.parentNode.parentNode.getElementsByTagName('select')[0].value
,border:this.parentNode.parentNode.parentNode.getElementsByTagName('select')[1].value})\"
alt=\"{$file}\" title=\"{$file}\" />
</div>";
++$count;
}
else //FILE NON DI IMMAGINE
{
$fileDiv.="<div style=\"margin:6px\">
<a href=\"{$filesPath['relative']}/{$file}\"
onclick=\"document.getElementById('preview_files_{$id}').style.display='none';command('{$id}','FileLink',{url:this.href,newWindow:this.parentNode.parentNode.parentNode.getElementsByTagName('select')[0].value});return false;\">
{$file}
</a>
</div>";
}
}
if ($imgDiv=="") $dis="alt=\"No image available\" title=\"No image available\" disabled=\"disabled\""; else $dis="$button_style";
$insert_images="
<div style=\"float:left\">
<button type=\"button\" $dis onclick=\"document.getElementById('preview_images_{$id}').style.display=document.getElementById('preview_images_{$id}').style.display=='block'?'none':'block';\" _onclick=\"this.blur();command('{$id}','InsertImage',document.getElementById('choose_image_{$id}').value);\" >
Insert Image
</button>
<div id=\"preview_images_{$id}\" style=\"display:none;position:absolute;width:350px;border:1px solid #000;background-color:#DDD;font-size:10px;font-family:Arial,Verdana\">
<div style=\"border-bottom:1px solid #000;padding:4px\">
Before you select an image, select the mode (float) and the border you want apply to the image.<br />
<strong>Float:</strong>
<select style=\"font-size:10px;font-family:Arial,Verdana;margin-bottom:3px\">
<option value=\"none\" selected=\"selected\">none</option>
<option value=\"left;margin:3px 4px 3px 0px\" >Left</option>
<option value=\"right;margin:3px 0px 3px 4px\">Right</option>
</select>
<strong>Border:</strong>
<select style=\"font-size:10px;font-family:Arial,Verdana;margin-bottom:3px\">
<option value=\"none\" selected=\"selected\">none</option>
<option value=\"1px solid #000\">Black</option>
<option value=\"1px solid #999\">Grey</option>
</select>
</div>
<div style=\"height:350px;overflow:auto\">
{$imgDiv}
</div>
</div>
</div>
";
if ($fileDiv=="") $dis="alt=\"No File available\" title=\"No File available\" disabled=\"disabled\""; else $dis="$button_style";
$insert_file_link="
<div style=\"float:left\">
<button type=\"button\" $dis onclick=\"document.getElementById('preview_files_{$id}').style.display=document.getElementById('preview_files_{$id}').style.display=='block'?'none':'block';\">
Link to Existing File
</button>
<div id=\"preview_files_{$id}\" style=\"display:none;position:absolute;border:1px solid #000;background-color:#DDD;font-size:10px;font-family:Arial,Verdana\">
<div style=\"padding:5px\">
<strong>Open link to the file in a NEW WINDOW ?</strong>
<select style=\"font-size:10px;font-family:Arial,Verdana;margin-bottom:3px\">
<option value=\"Yes\" selected=\"selected\">Yes</option>
<option value=\"No\" >No</option>
</select>
<hr />{$fileDiv}
</div>
</div>
</div>
";
}
else $insert_images="<br />";
if ($selectFont!=false)
{
if (!is_array($selectFont))//valori di default
$selectFont=array('Arial','Verdana','Georgia','Geneva','Courier new','Times new roman');
$option="<option value=\"\">Font family</option>";
foreach($selectFont as $font)
$option.="<option value=\"{$font}\">{$font}</option>";
$select_font="<select $button_style onchange=\"this.blur();command('{$id}','fontname',this.value);this.selectedIndex=0\">
{$option}
</select>
";
}
else $select_font="";
if ($fontSize!=false)
{
if (!is_array($fontSize))//valori di default
$fontSize=array('start'=>8,'end'=>'23');
$option="<option value=\"\">Font size</option>";
for($i=$fontSize['start'];$i<=$fontSize['end'];$i++)
$option.="<option value=\"{$i}\">{$i}</option>";
$font_size="<select $button_style onchange=\"this.blur();command('{$id}','fontsize',this.value);this.selectedIndex=0\">
{$option}
</select>
";
}
else $font_size="";
$result="
<div style=\"background-color:#EEEEEE;padding:5px;color:#000\" >
".($bold?"<button type=\"button\" onclick=\"this.blur();command('{$id}','Bold');\" $button_style><strong>Bold</strong></button> ":"")."
".($italic?"<button type=\"button\" onclick=\"this.blur();command('{$id}','Italic');\" $button_style><em>Italic</em></button> ":"")."
".($underline?"<button type=\"button\" onclick=\"this.blur();command('{$id}','Underline');\" $button_style><span style=\"text-decoration:underline\">Underline</span></button> ":"")."
".($ulist?"<button type=\"button\" onclick=\"this.blur();command('{$id}','insertunorderedlist');\" $button_style>• List</button> ":"")."
".($jleft?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifyleft');\" $button_style>Justify Left</button> ":"")."
".($jcenter?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifycenter');\" $button_style>Justify Center</button> ":"")."
".($jright?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifyright');\" $button_style>Justify Right</button> ":"")."
".($link?"<button type=\"button\" onclick=\"this.blur();command('{$id}','CreateLink');\" $button_style>»Link«</button> ":"")."
".($unformat?"<button type=\"button\" onclick=\"this.blur();command('{$id}','RemoveFormat');\" $button_style><em>Un</em>Format</button> ":"")."
{$select_font}
{$font_size}
<button type=\"button\" onclick=\"if (confirm('Really empty TextArea?')) {this.blur();command('{$id}','Empty')};\" $button_style >Empty</button>
<button type=\"button\" onclick=\"this.blur();command('{$id}','Code');\" $button_style >View code</button>
{$insert_images}
{$insert_file_link}
<div style=\"clear:both\">
To copy and paste use [CTRL + C] and [CTRL + V]<br />
<strong>Important:</strong> Don't paste text directly from Word, paste first into a simple editor like NotePad
</div>
</div>
<iframe {$class} style=\"{$style}\" id=\"{$id}\" name=\"{$id}\" ></iframe>
<input type=\"hidden\" name=\"{$id}_ifr\" id=\"{$id}_ifr\" value=\"\" />
<script type=\"text/javascript\">
////INIZIALIZZAZIONE
initialize_iframe('$id',\"$value\",'{$bodyStyleOrCSS}');
//////////////
</script>
";
return $result;
}
/*
* restituisce una stringa contenente 4 funzioni javascript necessarie ad effettuare la validazione della textarea, il salvataggio dei dati nell’hidden input associato e l’esecuzione dei comandi predefiniti di per applicare i tag di formattazione testo alla textarea.
*/
function print_common_javascript_functions()
{
?>
<script type="text/javascript">
<!--
initialize_iframe=function (id,value,bodyStyleOrCSS)
{
if (bodyStyleOrCSS.match(/.+\.(css|CSS)/))
{
bodyStyle='';
css="<link rel=\"stylesheet\" type=\"text/css\" href=\""+bodyStyleOrCSS+"\" />";
}
else
{
bodyStyle="style='"+bodyStyleOrCSS+"'";
css='';
}
iFrameDoc = (document.all)? "window.document.frames('"+id+"').document;": "document.getElementById('"+id+"').contentDocument;";
eval(iFrameDoc).open();
eval(iFrameDoc).write(css+"<body "+bodyStyle+">"+value+"</body>");
eval(iFrameDoc).close();
eval(iFrameDoc).designMode = "on";
eval(iFrameDoc).onkeydown=function () ///Solo per IE, INSERISCE BR qundo si preme invio
{
iFrameDoc = (document.all)? "window.document.frames('"+id+"');": "document.getElementById('"+id+"');";
if (eval(iFrameDoc).event.keyCode==13)
{
r=eval(iFrameDoc).document.selection.createRange();
r.pasteHTML('<br />');
r.select();
r.collapse(false);
return false;
}
}
eval(iFrameDoc).onfocus=function ()
{
iFrameDoc = (document.all)? "window.document.frames('"+id+"').document;": "document.getElementById('"+id+"').contentDocument;";
if (pure_text(eval(iFrameDoc).body.innerHTML)=="") eval(iFrameDoc).body.innerHTML=" ";
}
}
pure_text=function (res)
{
var temp = new Array();
if (res.indexOf("<")!=-1) ///////////////////////////////////elimina i tag
{
//alert ('elimina_tag');
temp = res.split('<'); res="";
for (i=0;i<temp.length;i++)
{
if ( temp[i].substr(0,3).toLowerCase()!='img' ) //le immagini vengono considerate come contenuto
res=res+temp[i].substring(temp[i].indexOf('>')+1);
else
res=res+'<'+temp[i].substring(0,temp[i].indexOf('>')+1);
}
}
if (res.indexOf("&")!=-1)////////////////////////////////elimina le entita
{
//alert ('elimina_entita');
temp = res.split("&"); res="";
for (i=0;i<temp.length;i++) { res=res+temp[i].substring(temp[i].indexOf(';')+1); }
}
//if (res.charAt(0)==" " && res.charAt(res.length)==" ")
//res=res.substring(res.indexOf(" ")+1,res.lastIndexOf(" ")-1);
while (res.charAt(0)==" " && res.length!=0) {res=res.substring(1);} //LEFT TRIM
while (res.charAt(res.length)==" " && res.length!=0) {res=res.substring(0,res.length-1);} //RIGHT TRIM
return res;
}
save_iframe_text=function (iframe)
{
var iFrameDoc = (document.all)? "document.frames(\""+iframe+"\").document\;": "document.getElementById(\""+iframe+"\").contentDocument\;";
if (eval(iFrameDoc).designMode=='on')
{
document.getElementById(iframe+"_ifr").disabled=false;
if (pure_text(eval(iFrameDoc).body.innerHTML)!="")
document.getElementById(iframe+"_ifr").value=eval(iFrameDoc).body.innerHTML;
else
document.getElementById(iframe+"_ifr").value=" ";
}
else //se è disabilitata l'iframe, disabilita l'input hidden di dati (l'input di verifica viene disabilitato col js generato da htmlform)
{
document.getElementById(iframe+"_ifr").disabled=true;
}
}
validate_iframe=function (iframe)
{
var iFrameDoc = (document.all)? "document.frames(\""+iframe+"\").document\;": "document.getElementById(\""+iframe+"\").contentDocument\;";
var iFrameFoc = (document.all)? "document.frames(\""+iframe+"\").focus()\;": "document.getElementById(\""+iframe+"\").contentWindow.focus()\;";
if ( eval(iFrameDoc).designMode=='on' && pure_text(eval(iFrameDoc).body.innerHTML)=="" ) //se non è disabilitato ed è vuoto fallisce la validazione
{
////alert(eval(iFrameDoc).body.innerHTML);
eval(iFrameDoc).body.innerHTML=" "; //pulisce :\
eval(iFrameFoc);
return false;
}
return true;
}
command=function (iframe,command,param)
{
var iFrameDoc = (document.all)? "document.frames(\""+iframe+"\").document\;": "document.getElementById(\""+iframe+"\").contentDocument\;";
var iFrameFoc = (document.all)? "document.frames(\""+iframe+"\").focus()\;": "document.getElementById(\""+iframe+"\").contentWindow.focus()\;";
eval(iFrameFoc); //FOCUS - Explorer lo vuole prima del comando altrimenti non inserisce bene le immagini
if (command=='CreateLink')
{
href=prompt("Insert full URL or command\nEX:\nhttp://www.cottonbit.it\nmailto:info@cottonbit.it");
if (href!=null) //se href==null è stato premuto Annulla
{
//if (href.indexOf('http://') != 0) {href='http://'+href;} //aggiunge http://
eval(iFrameDoc).execCommand("CreateLink",false,href);
if (confirm("Open link in new window?"))
{
href=href.replace(/&/g,'&');
nuovo_html=eval(iFrameDoc).body.innerHTML;
nuovo_html=nuovo_html.replace("<a href=\""+href+"\">","<a href=\""+href+"\" onclick=\"window.open(this.href);return false\">");
nuovo_html=nuovo_html.replace("<A href=\""+href+"\">","<A href=\""+href+"\" onclick=\"window.open(this.href);return false\">");
eval(iFrameDoc).body.innerHTML=nuovo_html;
}
}
}
else if (command=='FileLink') //link ad un file già caricato dall'utente
{
eval(iFrameDoc).execCommand("CreateLink",false,param.url);
if (param.newWindow=='Yes')
{
param.url=param.url.replace(/&/g,'&');
nuovo_html=eval(iFrameDoc).body.innerHTML;
nuovo_html=nuovo_html.replace("<a href=\""+param.url+"\">","<a href=\""+param.url+"\" onclick=\"window.open(this.href);return false\">");
nuovo_html=nuovo_html.replace("<A href=\""+param.url+"\">","<A href=\""+param.url+"\" onclick=\"window.open(this.href);return false\">");
eval(iFrameDoc).body.innerHTML=nuovo_html;
}
}
else if (command=='InsertImage')
{
eval(iFrameDoc).execCommand(command,false,param.imgSrc);
//param.float contiene il valore di float + l'attributo margin
nuovo_html=eval(iFrameDoc).body.innerHTML;
nuovo_html=nuovo_html.replace(new RegExp("<(img|IMG) src=(\")?"+param.imgSrc+"(\")?>")
,"<img style=\"float:"+param.float+";border:"+param.border+"\" src=\""+param.imgSrc+"\" alt=\"\">");
eval(iFrameDoc).body.innerHTML=nuovo_html;
}
else if (command=='Code')
{
////if (eval(iFrameDoc).body.innerHTML.indexOf("\n")!=-1) alert("Ci sono i caratteri di ritorno a capo!");
alert(eval(iFrameDoc).body.innerHTML);
}
else if (command=='Empty')
{
eval(iFrameDoc).body.innerHTML=' ';
}
else if (command=='fontsize')
{
eval(iFrameDoc).execCommand(command,false,2);
nuovo_html=eval(iFrameDoc).body.innerHTML;
nuovo_html=nuovo_html.replace("<font size=\"2\">","<span style=\"font-size:"+param+"px\">");
nuovo_html=nuovo_html.replace("</font>","</span>");
nuovo_html=nuovo_html.replace("<FONT size=2>","<span style=\"font-size:"+param+"px\">");
nuovo_html=nuovo_html.replace("</FONT>","</span>");
eval(iFrameDoc).body.innerHTML=nuovo_html;
}
else eval(iFrameDoc).execCommand(command,false,param);
}
-->
</script>
<?php
}
}
?>
|