PHP Classes

File: HTMLForm.php

Recommend this page to a friend!
  Classes of Michele Castellucci   HTMLForm   HTMLForm.php   Download  
File: HTMLForm.php
Role: Class source
Content type: text/plain
Description: The main class
Class: HTMLForm
Generate XHTML forms with Javascript validation
Author: By
Last change: Added a new information type: postal code (cap) that it is validated with a new regular expression for numeric strings (REGEXP_NUMSTRING).

Added a new hidden input in the form (fieldList) to identificate which fields are originally presents in the form.
So, form receiver method (insertIntoDBFromPOST) can for example recognize a field that has been disabled via Javascript (not present in POST data), and empty that field in the database.
Also optimized some thing about this issue in insertIntoDBFromPOST() to cooperate with DBNavigator.php class.
Date: 16 years ago
Size: 70,666 bytes
 

Contents

Class file image Download
<?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 &amp; // -in modifica deve essere scritta &amp; (per scrivere letteralmente "&amp;" bisogna avere "&amp;mp;") // -quindi viene memorizzato come &amp; $valore=str_replace("&","&amp;",$valore); //(>) -in visualizzazione deve essere scritta &gt; // -in modifica (textbox) deve essere scritta &gt; // -quindi viene memorizzato come &gt; // lo stesso vale per (<) $valore=str_replace(">","&gt;",$valore); $valore=str_replace("<","&lt;",$valore); //(") -in visualizzazione può essere scritto " o &quot; // -in modifica deve essere scritta &quot; // ma sulle textarea però può anche essere scritta " // -quindi viene memorizzato come " e rimpiazzato in &quot; solo in fase di modifica // si potrebbe memorizzare qui solo &quot; 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\">&raquo;&raquo;</span> <em>".$heading."</em>"; if ($inputType!="TEXTAREA") //le virgolette possono restare così in modifica nelle textarea's { ///SOSTITUZIONE " con &quot; if (is_array($value)) { $oldValue=$value; $value=array(); foreach ($oldValue as $key=>$val) $value[str_replace("\"","&quot;",$key)]=str_replace("\"","&quot;",$val); } else $value=str_replace("\"","&quot;",$value); if (is_array($selected)) { $oldSelected=$selected; $selected=array(); foreach ($oldSelected as $key=>$val) $selected[str_replace("\"","&quot;",$key)]=str_replace("\"","&quot;",$val); } else $selected=str_replace("\"","&quot;",$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=\"&nbsp;Reset&nbsp;\" />"; $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> &nbsp; "; } 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> &nbsp; "; } 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> &nbsp;":"")." ".($italic?"<button type=\"button\" onclick=\"this.blur();command('{$id}','Italic');\" $button_style><em>Italic</em></button> &nbsp;":"")." ".($underline?"<button type=\"button\" onclick=\"this.blur();command('{$id}','Underline');\" $button_style><span style=\"text-decoration:underline\">Underline</span></button> &nbsp;":"")." ".($ulist?"<button type=\"button\" onclick=\"this.blur();command('{$id}','insertunorderedlist');\" $button_style>&bull; List</button> &nbsp;":"")." ".($jleft?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifyleft');\" $button_style>Justify Left</button> &nbsp;":"")." ".($jcenter?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifycenter');\" $button_style>Justify Center</button> &nbsp;":"")." ".($jright?"<button type=\"button\" onclick=\"this.blur();command('{$id}','justifyright');\" $button_style>Justify Right</button> &nbsp;":"")." ".($link?"<button type=\"button\" onclick=\"this.blur();command('{$id}','CreateLink');\" $button_style>&raquo;Link&laquo;</button> &nbsp;":"")." ".($unformat?"<button type=\"button\" onclick=\"this.blur();command('{$id}','RemoveFormat');\" $button_style><em>Un</em>Format</button> &nbsp;":"")." {$select_font} {$font_size} <button type=\"button\" onclick=\"if (confirm('Really empty TextArea?')) {this.blur();command('{$id}','Empty')};\" $button_style >Empty</button> &nbsp; <button type=\"button\" onclick=\"this.blur();command('{$id}','Code');\" $button_style >View code</button> &nbsp; {$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="&nbsp;"; } } 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="&nbsp;"; } 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="&nbsp;"; //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,'&amp;'); 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,'&amp;'); 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='&nbsp;'; } 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 } } ?>