$clang->gT("ARMSCII-8 Armenian") ,"ascii"=>$clang->gT("US ASCII") ,"auto"=>$clang->gT("Automatic") ,"big5"=>$clang->gT("Big5 Traditional Chinese") ,"binary"=>$clang->gT("Binary pseudo charset") ,"cp1250"=>$clang->gT("Windows Central European") ,"cp1251"=>$clang->gT("Windows Cyrillic") ,"cp1256"=>$clang->gT("Windows Arabic") ,"cp1257"=>$clang->gT("Windows Baltic") ,"cp850"=>$clang->gT("DOS West European") ,"cp852"=>$clang->gT("DOS Central European") ,"cp866"=>$clang->gT("DOS Russian") ,"cp932"=>$clang->gT("SJIS for Windows Japanese") ,"dec8"=>$clang->gT("DEC West European") ,"eucjpms"=>$clang->gT("UJIS for Windows Japanese") ,"euckr"=>$clang->gT("EUC-KR Korean") ,"gb2312"=>$clang->gT("GB2312 Simplified Chinese") ,"gbk"=>$clang->gT("GBK Simplified Chinese") ,"geostd8"=>$clang->gT("GEOSTD8 Georgian") ,"greek"=>$clang->gT("ISO 8859-7 Greek") ,"hebrew"=>$clang->gT("ISO 8859-8 Hebrew") ,"hp8"=>$clang->gT("HP West European") ,"keybcs2"=>$clang->gT("DOS Kamenicky Czech-Slovak") ,"koi8r"=>$clang->gT("KOI8-R Relcom Russian") ,"koi8u"=>$clang->gT("KOI8-U Ukrainian") ,"latin1"=>$clang->gT("cp1252 West European") ,"latin2"=>$clang->gT("ISO 8859-2 Central European") ,"latin5"=>$clang->gT("ISO 8859-9 Turkish") ,"latin7"=>$clang->gT("ISO 8859-13 Baltic") ,"macce"=>$clang->gT("Mac Central European") ,"macroman"=>$clang->gT("Mac West European") ,"sjis"=>$clang->gT("Shift-JIS Japanese") ,"swe7"=>$clang->gT("7bit Swedish") ,"tis620"=>$clang->gT("TIS620 Thai") ,"ucs2"=>$clang->gT("UCS-2 Unicode") ,"ujis"=>$clang->gT("EUC-JP Japanese") ,"utf8"=>$clang->gT("UTF-8 Unicode")); if (isset($_POST['csvcharset']) && $_POST['csvcharset']) //sanitize charset - if encoding is not found sanitize to 'auto' { $uploadcharset=$_POST['csvcharset']; if (!array_key_exists($uploadcharset,$encodingsarray)) {$uploadcharset='auto';} $filterduplicatetoken=(isset($_POST['filterduplicatetoken']) && $_POST['filterduplicatetoken']=='on'); $filterblankemail=(isset($_POST['filterblankemail']) && $_POST['filterblankemail']=='on'); } } if ($subaction == "importldap" || $subaction == "uploadldap" ) { $filterduplicatetoken=(isset($_POST['filterduplicatetoken']) && $_POST['filterduplicatetoken']=='on'); $filterblankemail=(isset($_POST['filterblankemail']) && $_POST['filterblankemail']=='on'); } $tokenoutput = ""; if ($subaction == "export" && ( bHasSurveyPermission($surveyid, 'tokens', 'export')) )//EXPORT FEATURE SUBMITTED BY PIETERJAN HEYSE { $bquery = "SELECT * FROM ".db_table_name("tokens_$surveyid").' t'; if ($_POST['tokenstatus']==3 && $thissurvey['anonymized']=='N') { $bquery .= " JOIN ".db_table_name("survey_$surveyid")." s on t.token=s.token "; } if ($_POST['tokenstatus']==2 && $thissurvey['anonymized']=='N') { $bquery .= " LEFT JOIN ".db_table_name("survey_$surveyid")." s on t.token=s.token "; } $bquery.=' where 1=1'; if (trim($_POST['filteremail'])!='') { if ($databasetype=='odbc_mssql' || $databasetype=='odbtp' || $databasetype=='mssql_n' || $connect->databaseType == 'mssqlnative') { $bquery .= ' and CAST(email as varchar) like '.db_quoteall('%'.$_POST['filteremail'].'%', true); } else { $bquery .= ' and email like '.db_quoteall('%'.$_POST['filteremail'].'%', true); } } if ($_POST['tokenstatus']==1) { $bquery .= " and completed<>'N'"; } if ($_POST['tokenstatus']==2) { $bquery .= " and completed='N'"; if ($thissurvey['anonymized']=='N') { $bquery .=" and s.token is null "; } } if ($_POST['tokenstatus']==3 && $thissurvey['anonymized']=='N') { $bquery .= " and completed='N' and s.token is not null"; } if ($_POST['invitationstatus']==1) { $bquery .= " and sent<>'N'"; } if ($_POST['invitationstatus']==2) { $bquery .= " and sent='N'"; } if ($_POST['reminderstatus']==1) { $bquery .= " and remindersent<>'N'"; } if ($_POST['reminderstatus']==2) { $bquery .= " and remindersent='N'"; } if ($_POST['tokenlanguage']!='') { $bquery .= " and language=".db_quoteall($_POST['tokenlanguage']); } $bquery .= " ORDER BY tid"; $bresult = db_execute_assoc($bquery) or die ("$bquery
".htmlspecialchars($connect->ErrorMsg())); $bfieldcount=$bresult->FieldCount(); //HEADERS should be after the above query else timeout errors in case there are lots of tokens! header("Content-Disposition: attachment; filename=tokens_".$surveyid.".csv"); header("Content-type: text/comma-separated-values; charset=UTF-8"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Pragma: cache"); // Export UTF8 WITH BOM $tokenoutput = chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF')); $tokenoutput .= "tid,firstname,lastname,email,emailstatus,token,language,validfrom,validuntil,invited,reminded,remindercount,completed,usesleft"; $attrfieldnames = GetAttributeFieldnames($surveyid); $attrfielddescr = GetTokenFieldsAndNames($surveyid, true); foreach ($attrfieldnames as $attr_name) { $tokenoutput .=", $attr_name"; if (isset($attrfielddescr[$attr_name])) $tokenoutput .=" <".str_replace(","," ",$attrfielddescr[$attr_name]).">"; } $tokenoutput .="\n"; while ($brow = $bresult->FetchRow()) { if (trim($brow['validfrom']!='')) { $datetimeobj = new Date_Time_Converter($brow['validfrom'] , "Y-m-d H:i:s"); $brow['validfrom']=$datetimeobj->convert('Y-m-d H:i'); } if (trim($brow['validuntil']!='')) { $datetimeobj = new Date_Time_Converter($brow['validuntil'] , "Y-m-d H:i:s"); $brow['validuntil']=$datetimeobj->convert('Y-m-d H:i'); } $tokenoutput .= '"'.trim($brow['tid']).'",'; $tokenoutput .= '"'.trim($brow['firstname']).'",'; $tokenoutput .= '"'.trim($brow['lastname']).'",'; $tokenoutput .= '"'.trim($brow['email']).'",'; $tokenoutput .= '"'.trim($brow['emailstatus']).'",'; $tokenoutput .= '"'.trim($brow['token']).'",'; $tokenoutput .= '"'.trim($brow['language']).'",'; $tokenoutput .= '"'.trim($brow['validfrom']).'",'; $tokenoutput .= '"'.trim($brow['validuntil']).'",'; $tokenoutput .= '"'.trim($brow['sent']).'",'; $tokenoutput .= '"'.trim($brow['remindersent']).'",'; $tokenoutput .= '"'.trim($brow['remindercount']).'",'; $tokenoutput .= '"'.trim($brow['completed']).'",'; $tokenoutput .= '"'.trim($brow['usesleft']).'",'; foreach ($attrfieldnames as $attr_name) { $tokenoutput .='"'.trim($brow[$attr_name]).'",'; } $tokenoutput = substr($tokenoutput,0,-1); // remove last comma $tokenoutput .= "\n"; } echo $tokenoutput; exit; } // Bouceprocessing if($subaction=='bounceprocessing') { if($thissurvey['bounceprocessing'] != 'N' && bHasSurveyPermission($surveyid,'tokens','update')) { $bouncetotal=0; $checktotal=0; if($thissurvey['bounceprocessing']=='G') { $accounttype=strtoupper(getGlobalSetting('bounceaccounttype')); $hostname=getGlobalSetting('bounceaccounthost'); $username=getGlobalSetting('bounceaccountuser'); $pass=getGlobalSetting('bounceaccountpass'); $hostencryption=strtoupper(getGlobalSetting('bounceencryption')); } else { $accounttype=strtoupper($thissurvey['bounceaccounttype']); $hostname=$thissurvey['bounceaccounthost']; $username=$thissurvey['bounceaccountuser']; $pass=$thissurvey['bounceaccountpass']; $hostencryption=strtoupper($thissurvey['bounceaccountencryption']); } @list($hostname,$port) = split(':', $hostname); if(empty($port)) { if($accounttype=="IMAP") { switch($hostencryption) { case "OFF": $hostname = $hostname.":143"; break; case "SSL": $hostname = $hostname.":993"; break; case "TLS": $hostname = $hostname.":993"; break; } } else { switch($hostencryption) { case "OFF": $hostname = $hostname.":110"; break; case "SSL": $hostname = $hostname.":995"; break; case "TLS": $hostname = $hostname.":995"; break; } } } $flags=""; switch($accounttype) { case "IMAP": $flags.="/imap"; break; case "POP": $flags.="/pop3"; break; } switch($hostencryption) // novalidate-cert to have personal CA , maybe option. { case "OFF": $flags.="/notls"; // Really Off break; case "SSL": $flags.="/ssl/novalidate-cert"; break; case "TLS": $flags.="/tls/novalidate-cert"; break; } if(@$mbox=imap_open('{'.$hostname.$flags.'}INBOX',$username,$pass)) { imap_errors(); $count=imap_num_msg($mbox); if($count>0) { $lasthinfo=imap_headerinfo($mbox,$count); $datelcu = strtotime($lasthinfo->date); $datelastbounce= $datelcu; $lastbounce = $thissurvey['bouncetime']; while($datelcu > $lastbounce) { $header = explode("\r\n",@imap_body($mbox,$count,FT_PEEK)); // Don't put read foreach ($header as $item) { if (preg_match('/^X-surveyid/',$item)) { $surveyidBounce=explode(": ",$item); } if (preg_match('/^X-tokenid/',$item)) { $tokenBounce=explode(": ",$item); if($surveyid == $surveyidBounce[1]) { $bouncequery = "UPDATE ".db_table_name("tokens_{$surveyid}")." SET emailstatus='bounced', usesleft=0 WHERE token=".db_quoteall($tokenBounce[1]); $bmark=$connect->Execute($bouncequery); $readbounce=imap_body($mbox,$count); // Put read if (isset($thissurvey['bounceremove']) && $thissurvey['bounceremove']) // TODO Y or just true, and a imap_delete { $deletebounce=imap_delete($mbox,$count); // Put delete } $bouncetotal++; } } } $count--; $lasthinfo=@imap_headerinfo($mbox,$count); $datelc=$lasthinfo->date; $datelcu = strtotime($datelc); $checktotal++; } if($bouncetotal>0) { echo sprintf($clang->gT("%s messages were scanned out of which %s were marked as bounce by the system."), $checktotal,$bouncetotal); } else { echo sprintf($clang->gT("%s messages were scanned, none were marked as bounce by the system."),$checktotal); } } else { echo sprintf($clang->gT("Your inbox is empty.")); } @imap_close($mbox); $entertimestamp = "update ".db_table_name("surveys")." set bouncetime='$datelastbounce' where sid='$surveyid'"; $executetimestamp = $connect->Execute($entertimestamp); } else { echo $clang->gT("Please check your settings"); } } else { echo $clang->gT("We are sorry but you don't have permissions to do this."); } exit(0); // if bounceprocessing : javascript : no more todo } if ($subaction == "delete" && bHasSurveyPermission($surveyid, 'tokens','delete')) { $_SESSION['metaHeader']=""; } if ($subaction == "deletegroup" && bHasSurveyPermission($surveyid, 'tokens','delete')) { $_SESSION['metaHeader']=""; } // MAKE SURE THAT THERE IS A SID if (!isset($surveyid) || !$surveyid) { $tokenoutput .= "\t
" .$clang->gT("Token control")."
\n" ."\t
".$clang->gT("Error")."
" ."
".$clang->gT("You have not selected a survey")."

" ."
\n" ."
\n"; return; } // MAKE SURE THAT THE SURVEY EXISTS $thissurvey=getSurveyInfo($surveyid); if ($thissurvey===false) { $tokenoutput .= "\t
\n
\n" .$clang->gT("Token control")."
\n" ."\t
".$clang->gT("Error")."
" ."
".$clang->gT("The survey you selected does not exist") ."

\n\t
" ."
\n"; return; } else // A survey DOES exist { if($subaction != 'bounceprocessing') { $tokenoutput .= "\t
\n" ."
".$clang->gT("Token table could not be created.")."
\n" .$clang->gT("Error").": \n" . $connect->ErrorMsg() . "\n" ."
".htmlspecialchars(implode(" ",$sqlarray))."
\n" ."
" ."\n" ."
\n" ."\n"; } else { $createtokentableindex = $dict->CreateIndexSQL("{$tabname}_idx", $tabname, array('token')); $dict->ExecuteSQLArray($createtokentableindex, false) or safe_die ("Failed to create token table index
$createtokentableindex

".$connect->ErrorMsg()); if ($connect->databaseType == 'mysql' || $connect->databaseType == 'mysqli') { $query = 'CREATE INDEX idx_'.$tabname.'_efl ON '.$tabname.' ( email(120), firstname, lastname )'; $result=$connect->Execute($query) or safe_die("Failed Rename!
".$query."
".$connect->ErrorMsg()); } $tokenoutput .= "\t

\n" .$clang->gT("A token table has been created for this survey.")." (\"".$dbprefix."tokens_$surveyid\")

\n" ."\n"; } return; } elseif (returnglobal('restoretable') == "Y" && returnglobal('oldtable') && bHasSurveyPermission($surveyid, 'surveyactivation','update')) { $query = db_rename_table(returnglobal('oldtable') , db_table_name_nq("tokens_$surveyid")); $result=$connect->Execute($query) or safe_die("Failed Rename!
".$query."
".$connect->ErrorMsg()); LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed $tokenoutput .= "\t

\n" ."
".$clang->gT("Import old tokens")."
" ."
".$clang->gT("A token table has been created for this survey and the old tokens were imported.")." (\"".$dbprefix."tokens_$surveyid\")

\n" ."\n" ."
\n"; return; } else { $query=db_select_tables_like("{$dbprefix}old\_tokens\_".$surveyid."\_%"); $result=db_execute_num($query) or safe_die("Couldn't get old table list
".$query."
".$connect->ErrorMsg()); $tcount=$result->RecordCount(); if ($tcount > 0) { while($rows=$result->FetchRow()) { $oldlist[]=$rows[0]; } } $tokenoutput .= "\t
\n" ."
".$clang->gT("Warning")."
\n" ."
".$clang->gT("Tokens have not been initialised for this survey.")."

\n"; if (bHasSurveyPermission($surveyid, 'surveyactivation','update') || bHasSurveyPermission($surveyid, 'tokens','create')) { $tokenoutput .= $clang->gT("If you initialise tokens for this survey then this survey will only be accessible to users who provide a token either manually or by URL.") ."

\n"; $thissurvey=getSurveyInfo($surveyid); if ($thissurvey['anonymized'] == 'Y') { $tokenoutput .= "".$clang->gT("Note: If you turn on the -Anonymized responses- option for this survey then LimeSurvey will mark your completed tokens only with a 'Y' instead of date/time to ensure the anonymity of your participants.") ."

\n"; } $tokenoutput .= $clang->gT("Do you want to create a token table for this survey?"); $tokenoutput .= "

\n"; $tokenoutput .= "\n"; $tokenoutput .= "
\n"; } else { $tokenoutput .= $clang->gT("You don't have the permission to activate tokens."); $tokenoutput .= "\n"; } // Do not offer old postgres token tables for restore since these are having an issue with missing index if ($tcount>0 && $databasetype!='postgres' && bHasSurveyPermission($surveyid, 'surveyactivation','update')) { $tokenoutput .= "
".$clang->gT("Restore options")."
\n" ."
\n" ."
\n" .$clang->gT("The following old token tables could be restored:")."

\n" ."

\n" ."\n" ."\n" ."\n" ."
\n"; } return; } } #Lookup the names of the attributes /*$query = "SELECT attribute1, attribute2 FROM ".db_table_name('surveys')." WHERE sid=$surveyid"; $result = db_execute_assoc($query) or safe_die("Couldn't execute query:
$query
".$connect->ErrorMsg()); $row = $result->FetchRow(); if ($row["attribute1"]) {$attr1_name = $row["attribute1"];} else {$attr1_name=$clang->gT("Attribute 1");} if ($row["attribute2"]) {$attr2_name = $row["attribute2"];} else {$attr2_name=$clang->gT("Attribute 2");}*/ // IF WE MADE IT THIS FAR, THEN THERE IS A TOKENS TABLE, SO LETS DEVELOP THE MENU ITEMS if($subaction != 'bounceprocessing') { $tokenoutput .= "\t\n"; } // SEE HOW MANY RECORDS ARE IN THE TOKEN TABLE $tksq = "SELECT count(tid) FROM ".db_table_name("tokens_$surveyid"); $tksr = db_execute_num($tksq); $tkr = $tksr->FetchRow(); $tkcount = $tkr[0]; // GIVE SOME INFORMATION ABOUT THE TOKENS if ($subaction=='') { $tokenoutput .= "\t
".$clang->gT("Token summary")."
\n" ."
\n" ."\t\n" ."\n"; $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE token IS NULL OR token=''"; $tksr = db_execute_num($tksq); while ($tkr = $tksr->FetchRow()) {$tokenoutput .= "\n";} $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE (sent!='N' and sent<>'')"; $tksr = db_execute_num($tksq); while ($tkr = $tksr->FetchRow()) {$tokenoutput .= "\n";} $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE emailstatus = 'OptOut'"; $tksr = db_execute_num($tksq); while ($tkr = $tksr->FetchRow()) {$tokenoutput .= "\n";} $tksq = "SELECT count(*) FROM ".db_table_name("tokens_$surveyid")." WHERE (completed!='N' and completed<>'')"; $tksr = db_execute_num($tksq) or safe_die ("Couldn't execute token selection query
$abquery
".$connect->ErrorMsg()); while ($tkr = $tksr->FetchRow()) {$tokenoutput .= "\n" ."\t\n" ."
\n" .$clang->gT("Total records in this token table")." $tkcount
".$clang->gT("Total with no unique Token")." $tkr[0] / $tkcount
".$clang->gT("Total invitations sent")." $tkr[0] / $tkcount
".$clang->gT("Total opted out")." $tkr[0] / $tkcount
".$clang->gT("Total surveys completed")." $tkr[0] / $tkcount\n";} $tokenoutput .= "

\n"; } ############################################################################################# // NOW FOR VARIOUS ACTIONS: if(isset($surveyid) && getEmailFormat($surveyid) == 'html') { $ishtml=true; } else { $ishtml=false; } if ($subaction == "exportdialog" && bHasSurveyPermission($surveyid, 'tokens','export') )//EXPORT FEATURE SUBMITTED BY PIETERJAN HEYSE { $langquery = "SELECT language FROM ".db_table_name("tokens_$surveyid")." group by language"; $langresult = db_execute_assoc($langquery); $tokenoutput .= "\t
".$clang->gT("Token export options")."
\n"; $tokenoutput .= "
\n" ."" ."

" ."" ."" ."" ."

"; } $tokenoutput .= ""; if($subaction=="surveysettingsave") { global $connect; @$fieldvalue = array("bounceprocessing"=>$_POST['bounceprocessing'], "bounce_email"=>$_POST['bounce_email'], ); if(@$_POST['bounceprocessing']=='L') { $fieldvalue['bounceaccountencryption']=$_POST['bounceaccountencryption']; $fieldvalue['bounceaccountuser']=$_POST['bounceaccountuser']; $fieldvalue['bounceaccountpass']=$_POST['bounceaccountpass']; $fieldvalue['bounceaccounttype']=$_POST['bounceaccounttype']; $fieldvalue['bounceaccounthost']=$_POST['bounceaccounthost']; } $connect->AutoExecute("{$dbprefix}surveys", $fieldvalue, 2,"sid=$surveyid",get_magic_quotes_gpc()); $tokenoutput .= "
".$clang->gT("Bounce settings")."
\n" ."
" ."\t
".$clang->gT("Bounce settings have been saved.")."
\n" ."
"; } if ($subaction=='bouncesettings'){ $settings=getSurveyInfo($surveyid); $tokenoutput .= "\t
".$clang->gT("Bounce settings")."
\n"; $tokenoutput .= "
\n" ."
" ."\t\n
  • \n" ."\t\t
  • \n" ."\t
  • \n" ."\t\t
  • \n" . "\t
  • \n" . "\t\t
  • \n" . "\t
  • \n" . "\t\t\n"."".$clang->gT("Enter your hostname and port, e.g.: imap.gmail.com:995")."\n" . "\t
  • \n" . "\t\t
  • \n" . "\t
  • \n" . "\t\t
  • \n"; $tokenoutput.= "\t
  • \n" . "\t\t
  • \n
    ".""; $tokenoutput .= "\t


    \n"; } if ($subaction == "deleteall" && bHasSurveyPermission($surveyid, 'tokens', 'delete')){ $query="DELETE FROM ".db_table_name("tokens_$surveyid"); $result=$connect->Execute($query) or safe_die ("Couldn't update sent field
    $query
    ".$connect->ErrorMsg()); $tokenoutput .= "
    ".$clang->gT("Delete all token entries")."
    \n" ."
    ".$clang->gT("All token entries have been deleted.")."

    \n"; $subaction=""; } if ($subaction == "clearinvites" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { $query="UPDATE ".db_table_name("tokens_$surveyid")." SET sent='N', remindersent='N', remindercount=0"; $result=$connect->Execute($query) or safe_die ("Couldn't update sent field
    $query
    ".$connect->ErrorMsg()); $tokenoutput .= "
    ".$clang->gT("Reset token invitation status")."
    \n" ."
    ".$clang->gT("All token entries have been set to 'Not invited'.")."

    \n"; $subaction=""; } if ($subaction == "cleartokens" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { $query="UPDATE ".db_table_name("tokens_$surveyid")." SET token=''"; $result=$connect->Execute($query) or safe_die("Couldn't reset the tokens field
    $query
    ".$connect->ErrorMsg()); $tokenoutput .= "
    ".$clang->gT("Remove unique token numbers")."
    \n" ."
    ".$clang->gT("All unique token numbers have been removed.")."

    \n"; $subaction=""; } if (!$subaction && (bHasSurveyPermission($surveyid, 'tokens', 'update') || bHasSurveyPermission($surveyid, 'tokens', 'delete'))) { $tokenoutput .= "\t
    ".$clang->gT("Token database administration options")."
    \n" ."
    "; if (bHasSurveyPermission($surveyid, 'tokens', 'update')) { $tokenoutput .="
    \n"; } if ($subaction == "browse" || $subaction == "search") { if (!isset($limit)) {$limit = 100;} if (!isset($start)) {$start = 0;} if ($limit > $tkcount) {$limit=$tkcount;} $next=$start+$limit; $last=$start-$limit; $end=$tkcount-$limit; if ($end < 0) {$end=0;} if ($last <0) {$last=0;} if ($next >= $tkcount) {$next=$tkcount-$limit;} if ($end < 0) {$end=0;} $baselanguage = GetBaseLanguageFromSurveyID($surveyid); //ALLOW SELECTION OF NUMBER OF RECORDS SHOWN if($subaction != 'bounceprocessing') { $tokenoutput .="\t\n"; $tokenoutput .= "\n"; //COLUMN HEADINGS $tokenoutput .= "\t\n" ."\n" //Checkbox ."\n" // ID ."\n" //Actions ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n" ."\n"; $attrfieldnames=GetTokenFieldsAndNames($surveyid,true); foreach ($attrfieldnames as $attr_name=>$attr_translation) { $tokenoutput .= "\n"; } $tokenoutput .="\t\n"; $tokenfieldorder=array('tid', 'firstname', 'lastname', 'email', 'emailstatus', 'token', 'language', 'sent', 'remindersent', 'remindercount', 'completed', 'usesleft', 'validfrom', 'validuntil'); foreach ($attrfieldnames as $attr_name=>$attr_translation) { $tokenfieldorder[]=$attr_name; } while ($brow = $bresult->FetchRow()) { $brow['token'] = trim($brow['token']); if (trim($brow['validfrom'])!=''){ $datetimeobj = new Date_Time_Converter($brow['validfrom'] , "Y-m-d H:i:s"); $brow['validfrom']=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); }; if (trim($brow['validuntil'])!=''){ $datetimeobj = new Date_Time_Converter($brow['validuntil'] , "Y-m-d H:i:s"); $brow['validuntil']=$datetimeobj->convert($dateformatdetails['phpdate'].' H:i'); }; if ($bgc == "evenrow") {$bgc = "oddrow";} else {$bgc = "evenrow";} $tokenoutput .= "\t\n"; $tokenoutput .= "\n"; foreach ($tokenfieldorder as $tokenfieldname) { if ($tokenfieldname =='email' && $brow['emailstatus'] != 'OK') { if ($brow['emailstatus']!='OptOut') { $tokenoutput .= "\n"; } else { $tokenoutput .= "\n"; } } // elseif ($tokenfieldname != 'emailstatus') else { if ($tokenfieldname=='tid') { $tokenoutput.=""; } else { $tokenoutput .= '\n"; } } if ($tokenfieldname=='tid') { $tokenoutput .= "\n"; } } $tokenoutput .= "\t\n"; } // Multiple item actions if ($bresult->rowCount() > 0) { $tokenoutput .= "\n" . "\n" . "\n"; } //End multiple item actions $tokenoutput .= "
    " ."" .""
        .$clang->gT("Sort by: ")
        ."ID"."ID".$clang->gT("Actions")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("First name")
        ."".$clang->gT("First name")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Last name")
        ."".$clang->gT("Last name")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Email address")
        ."".$clang->gT("Email address")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Email status")
        ."".$clang->gT("Email status")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Token")
        ."".$clang->gT("Token")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Language")
        ."".$clang->gT("Language")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Invitation sent?")
        ."".$clang->gT("Invitation sent?")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Reminder sent?")
        ."".$clang->gT("Reminder sent?")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Reminder count")
        ."".$clang->gT("Reminder count")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Completed?")
        ."".$clang->gT("Completed?")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Uses left")
        ."".$clang->gT("Uses left")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Valid from")
        ."".$clang->gT("Valid from")."" ."" .""
        .$clang->gT("Sort by: ")
        .$clang->gT("Valid until")
        ."".$clang->gT("Valid until")."" ."" ."".htmlspecialchars($attr_translation,ENT_QUOTES,'utf-8')."
    " ."" ."$brow[$tokenfieldname]" ."" ."$brow[$tokenfieldname]".$brow[$tokenfieldname]."'.htmlspecialchars($brow[$tokenfieldname])."\n"; if (bHasSurveyPermission($surveyid, 'tokens','update')) { if ((($brow['completed'] == "N" || $brow['completed'] == "") && $brow['token']) || $thissurvey['alloweditaftercompletion']=='Y') { $toklang = ($brow['language'] == '') ? $baselanguage : $brow['language']; $tokenoutput .= "\n"; } else { $tokenoutput .= ""; } $tokenoutput .=" "; } if (bHasSurveyPermission($surveyid, 'tokens','delete')) { $tokenoutput .="gT("Are you sure you want to delete this entry?","js")." (".$brow['tid'].")')) {".get2post("$scriptname?action=tokens&sid=$surveyid&subaction=delete&tid=".$brow['tid']."&limit=$limit&start=$start&order=$order")."}\" />"; } if ($brow['completed'] != "N" && $brow['completed']!="" && $surveyprivate == "N" && $thissurvey['active']=='Y') { // Get response Id $query="SELECT id FROM ".db_table_name('survey_'.$surveyid)." WHERE token='{$brow['token']}' ORDER BY id desc"; $result=db_execute_num($query) or safe_die ("
    Could not find token!
    \n" .$connect->ErrorMsg()); list($id) = $result->FetchRow(); // UPDATE button to the tokens display in the MPID Actions column if ($id) { $tokenoutput .= "\n"; } } elseif ($brow['completed'] == "N" && $brow['token'] && $brow['sent'] == "N" && trim($brow['email'])!='' && bHasSurveyPermission($surveyid, 'tokens','update')) { $tokenoutput .= ""; } elseif ($brow['completed'] == "N" && $brow['token'] && $brow['sent'] != "N" && trim($brow['email'])!='') // reminder button { $tokenoutput .= ""; } $tokenoutput .= "\n
    "; if (bHasSurveyPermission($surveyid, 'tokens','delete')) { $tokenoutput .= "" . "gT("Are you sure you want to delete the selected entries?","js") ."')) {".get2post("{$scriptname}?action=tokens&sid={$surveyid}&subaction=delete&tids=document.getElementById('tokenboxeschecked').value&limit={$limit}&start={$start}&order={$order}")."}}else{alert('".$clang->gT("No tokens selected",'js')."');}\" />"; } if (bHasSurveyPermission($surveyid, 'tokens','update')) { $tokenoutput .= " " . "" . " " . ""; } $tokenoutput .= "\n"; $tokenoutput .= "
    \n
    \n"; } if ($subaction == "kill" && bHasSurveyPermission($surveyid, 'surveyactivation', 'update')) { $date = date('YmdHis'); $tokenoutput .= "
    ".$clang->gT("Delete Tokens Table")."
    \n" ."
    \n"; // ToDo: Just delete it if there is no token in the table if (!isset($_POST['ok']) || !$_POST['ok']) { $tokenoutput .= "
    ".$clang->gT("Warning")."

    \n" .$clang->gT("If you delete this table tokens will no longer be required to access this survey.")."
    ".$clang->gT("A backup of this table will be made if you proceed. Your system administrator will be able to access this table.")."
    \n" ."( \"old_tokens_{$surveyid}_$date\" )

    \n" ."\n" ."\n"; } elseif (isset($_POST['ok']) && $_POST['ok'] == "surething") { $oldtable = "tokens_$surveyid"; $newtable = "old_tokens_{$surveyid}_$date"; $deactivatequery = db_rename_table( db_table_name_nq($oldtable), db_table_name_nq($newtable)); if ($databasetype=='postgres') { // If you deactivate a postgres table you have to rename the according sequence too and alter the id field to point to the changed sequence $oldTableJur = db_table_name_nq($oldtable); $deactivatequery = db_rename_table(db_table_name_nq($oldtable),db_table_name_nq($newtable).'_tid_seq'); $deactivateresult = $connect->Execute($deactivatequery) or die ("oldtable : ".$oldtable. " / oldtableJur : ". $oldTableJur . " / ".htmlspecialchars($deactivatequery)." / Could not rename the old sequence for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    ".$clang->gT("Main Admin Screen").""); $setsequence="ALTER TABLE ".db_table_name_nq($newtable)."_tid_seq ALTER COLUMN tid SET DEFAULT nextval('".db_table_name_nq($newtable)."_tid_seq'::regclass);"; $deactivateresult = $connect->Execute($setsequence) or die (htmlspecialchars($setsequence)." Could not alter the field tid to point to the new sequence name for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    Survey was not deactivated either.

    ".$clang->gT("Main Admin Screen").""); $setidx="ALTER INDEX ".db_table_name_nq($oldtable)."_idx RENAME TO ".db_table_name_nq($newtable)."_idx;"; $deactivateresult = $connect->Execute($setidx) or die (htmlspecialchars($setidx)." Could not alter the index for this token table. The database reported the following error:
    ".htmlspecialchars($connect->ErrorMsg())."

    Survey was not deactivated either.

    ".$clang->gT("Main Admin Screen").""); } else { $deactivateresult = $connect->Execute($deactivatequery) or die ("Couldn't deactivate because:
    \n".htmlspecialchars($connect->ErrorMsg())." - Query: ".htmlspecialchars($deactivatequery)."

    \nAdmin\n"); } LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed $tokenoutput .= '
    '.$clang->gT("The tokens table has now been removed and tokens are no longer required to access this survey.")."
    ".$clang->gT("A backup of this table has been made and can be accessed by your system administrator.")."
    \n" ."(\"{$dbprefix}old_tokens_{$surveyid}_$date\")"."

    \n" ."\n"; } $tokenoutput .= "
    \n"; } if ($subaction == "email" && bHasSurveyPermission($surveyid, 'tokens','update')) { if (getEmailFormat($surveyid) == 'html') { $ishtml=true; } else { $ishtml=false; } $tokenoutput .= PrepareEditorScript(); $tokenoutput .= "\t
    " .$clang->gT("Send email invitations")."
    \n" ."\t

    \n"; // Wrapping Div if (!isset($_POST['ok']) || !$_POST['ok']) { if ($thissurvey['active']!='Y') { $tokenoutput .="
    ".$clang->gT('Warning!')."
    ".$clang->gT("This survey is not yet activated and so your participants won't be able to fill out the survey.")."
    "; } $tokenoutput .= "\n
    \n" // Tabs Div . "\n"; $tokenoutput .= "
    "; // Form foreach ($surveylangs as $language) { //GET SURVEY DETAILS $thissurvey=getSurveyInfo($surveyid,$language); $bplang = new limesurvey_lang($language); if ($ishtml===true) { $aDefaultTexts=aTemplateDefaultTexts($bplang); } else { $aDefaultTexts=aTemplateDefaultTexts($bplang,'unescaped'); } if (!$thissurvey['email_invite']) { if ($ishtml===true) { $thissurvey['email_invite']=html_escape($aDefaultTexts['invitation']); } else { $thissurvey['email_invite']=$aDefaultTexts['invitation']; } } if (!$thissurvey['email_invite_subj']) { $thissurvey['email_invite_subj']=$aDefaultTexts['invitation_subject']; } $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; $subject=Replacefields($thissurvey['email_invite_subj'], $fieldsarray,false); $textarea=Replacefields($thissurvey['email_invite'], $fieldsarray,false); if ($ishtml!==true){$textarea=str_replace(array('',''),array(''),$textarea);} $tokenoutput .= '
    '."\n"; // Language Tab Div $tokenoutput .= "\t
      \n" ."
    • \n" ."\" />
    • \n" ."
    • \n" ."
    • \n" ."
    • \n" ."\n" . getEditor("email-inv","message_$language","[".$clang->gT("Invitation email:", "js")."](".$language.")",$surveyid,'','',$action) ."
    • \n" ."\t
    \n"; // End Language Tab Div } //$tokenoutput .= "
    "; // TIBO: commenting this unexpected end div /* if (isset($tokenid)) { $tokenoutput .= "
  • ".$tokenid ."
  • "; } if (isset($tokenids) && count($tokenids) > 0) { $tokenoutput .= "
  • ".implode(", ", $tokenids) ."
  • "; } else { $tokenoutput .= "
  • " .$clang->gT("All tokens who have not yet been sent an invitation") ."
  • "; } */ $tokenoutput .="\t

    \n" ."\t

    \n" ."\t\n" ."\t\n" ."\t\n" ."\t\n"; if (isset($tokenid)) {$tokenoutput .= "\t\n";} if (isset($tokenids)) {$tokenoutput .= "\n\n";} $tokenoutput .= "

    \n"; } else { $tokenoutput .= "
    \n" ."\t
    \n"; $tokenoutput .= $clang->gT("Sending invitations..."); $tokenoutput .= "\n\t
    \n"; if (isset($tokenid)) {$tokenoutput .= " (".$clang->gT("Sending to Token ID").": {$tokenid})";} if (isset($tokenids)) {$tokenoutput .= " (".$clang->gT("Sending to Token IDs").": ".implode(", ", $tokenids).")";} $tokenoutput .= "
    \n"; if (isset($_POST['bypassbademails']) && $_POST['bypassbademails'] == 'Y') { $SQLemailstatuscondition = " AND emailstatus = 'OK'"; } else { $SQLemailstatuscondition = " AND emailstatus <> 'OptOut'"; } $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND token !='' AND email != '' $SQLemailstatuscondition"; if (isset($tokenid)) {$ctquery .= " AND tid='{$tokenid}'";} if (isset($tokenids)) {$ctquery .= " AND tid IN ('".implode("', '", $tokenids)."')";} $tokenoutput .= "\n"; $ctresult = $connect->Execute($ctquery) or safe_die("Database error!
    \n" . $connect->ErrorMsg()); $ctcount = $ctresult->RecordCount(); $ctfieldcount = $ctresult->FieldCount(); $emquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE ((completed ='N') or (completed='')) AND ((sent ='N') or (sent='')) AND token !='' AND email != '' $SQLemailstatuscondition"; if (isset($tokenid)) {$emquery .= " and tid='{$tokenid}'";} if (isset($tokenids)) {$emquery .= " AND tid IN ('".implode("', '", $tokenids)."')";} $tokenoutput .= "\n\n\n\n"; $emresult = db_select_limit_assoc($emquery,$maxemails) or safe_die ("Couldn't do query.
    \n$emquery
    \n".$connect->ErrorMsg()); $emcount = $emresult->RecordCount(); $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); $baselanguage = GetBaseLanguageFromSurveyID($surveyid); array_unshift($surveylangs,$baselanguage); foreach ($surveylangs as $language) { $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); if ($ishtml) $_POST['message_'.$language] = html_entity_decode($_POST['message_'.$language], ENT_QUOTES, $emailcharset); } $attributes=GetTokenFieldsAndNames($surveyid); if ($emcount > 0) { $tokenoutput .= "\n" ."
    ".$clang->gT("Warning")."

    \n" ."
    " .$clang->gT("There are more emails pending than can be sent in one batch. Continue sending emails by clicking below.")."

    \n"; $tokenoutput .= str_replace("{EMAILCOUNT}", "$lefttosend", $clang->gT("There are {EMAILCOUNT} emails still to be sent.")); $tokenoutput .= "

    \n"; $tokenoutput .= "\n" ."\n" ."\n" ."\n" ."\n" ."\n"; if (isset($tokenids)) { $tokenoutput .= "\n"; } foreach ($surveylangs as $language) { $message = html_escape($_POST['message_'.$language]); $subject = html_escape($_POST['subject_'.$language]); $tokenoutput .="\n" ."\n" ."\n"; } $tokenoutput .="
    \n"; } $oMail->SmtpClose(); } else { $tokenoutput .= "
    ".$clang->gT("Warning")."
    \n".$clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:") ."
     "; } } //$tokenoutput .= "
    \n\n"; $tokenoutput .= "\n"; // TIBO only close on div, cause dialog-modal will cklose wrapper } if ($subaction == "remind" && bHasSurveyPermission($surveyid, 'tokens','update')) { $tokenoutput .= PrepareEditorScript(); $tokenoutput .= "\t
    " .$clang->gT("Send email reminder")."

    \n"; if (!isset($_POST['ok']) || !$_POST['ok']) { if ($thissurvey['active']!='Y') { $tokenoutput .="
    ".$clang->gT('Warning!')."
    ".$clang->gT("This survey is not yet activated and so your participants won't be able to fill out the survey.")."
    "; } //GET SURVEY DETAILS $tokenoutput .= "
    "; $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); $baselang = GetBaseLanguageFromSurveyID($surveyid); array_unshift($surveylangs,$baselang); $tokenoutput .= "
    "; foreach ($surveylangs as $language) { //GET SURVEY DETAILS $thissurvey=getSurveyInfo($surveyid,$language); if (!$thissurvey['email_remind']) {$thissurvey['email_remind']=str_replace("\n", "\r\n", $clang->gT("Dear {FIRSTNAME},\n\nRecently we invited you to participate in a survey.\n\nWe note that you have not yet completed the survey, and wish to remind you that the survey is still available should you wish to take part.\n\nThe survey is titled:\n\"{SURVEYNAME}\"\n\n\"{SURVEYDESCRIPTION}\"\n\nTo participate, please click on the link below.\n\nSincerely,\n\n{ADMINNAME} ({ADMINEMAIL})\n\n----------------------------------------------\nClick here to do the survey:\n{SURVEYURL}")."\n\n".$clang->gT("If you do not want to participate in this survey and don't want to receive any more invitations please click the following link:\n{OPTOUTURL}"));} $tokenoutput .= '

    '.getLanguageNameFromCode($language,false); if ($language==$baselang) { $tokenoutput .= "(".$clang->gT("Base language").")"; } $tokenoutput .= "

      \n" ."
    • \n" ."\" />
    • \n" ."
    • \n"; $fieldsarray["{ADMINNAME}"]= $thissurvey['adminname']; $fieldsarray["{ADMINEMAIL}"]=$thissurvey['adminemail']; $fieldsarray["{SURVEYNAME}"]=$thissurvey['name']; $fieldsarray["{SURVEYDESCRIPTION}"]=$thissurvey['description']; $fieldsarray["{EXPIRY}"]=$thissurvey["expiry"]; $subject=Replacefields($thissurvey['email_remind_subj'], $fieldsarray, false); $textarea=Replacefields($thissurvey['email_remind'], $fieldsarray, false); if ($ishtml!==true){$textarea=str_replace(array('',''),array(''),$textarea);} $tokenoutput .= "
    • \n"; $tokenoutput .= "\t
    • \n" ."\n" ."\n" . getEditor("email-rem","message_$language","[".$clang->gT("Reminder Email:", "js")."](".$language.")",$surveyid,'','',$action) ."
    • \n" ."
    "; } $tokenoutput .= "

    \n" ."\n" ."\t\n" ."\t\n" ."\t\n"; if (isset($tokenid)) {$tokenoutput .= "\t\n";} if (isset($tokenids)) {$tokenoutput .= "\n\n";} $tokenoutput .= "

    \n"; } else { $tokenoutput .= "
    \n" . "
    "; $tokenoutput .= $clang->gT("Sending Reminders") ."

    \n"; $surveylangs = GetAdditionalLanguagesFromSurveyID($surveyid); $baselanguage = GetBaseLanguageFromSurveyID($surveyid); array_unshift($surveylangs,$baselanguage); foreach ($surveylangs as $language) { $_POST['message_'.$language]=auto_unescape($_POST['message_'.$language]); $_POST['subject_'.$language]=auto_unescape($_POST['subject_'.$language]); } if (isset($starttokenid)) {$tokenoutput .= " (".$clang->gT("From Token ID").": {$starttokenid})";} if (isset($tokenid)) {$tokenoutput .= " (".$clang->gT("Sending to Token ID").": {$tokenid})";} if (isset($tokenids)) {$tokenoutput .= " (".$clang->gT("Sending to Token IDs").": ".implode("|", $tokenids).")";} if (isset($_POST['bypassbademails']) && $_POST['bypassbademails'] == 'Y') { $SQLemailstatuscondition = " AND emailstatus = 'OK'"; } else { $SQLemailstatuscondition = " AND emailstatus <> 'OptOut'"; } if (isset($_POST['maxremindercount']) && $_POST['maxremindercount'] != '' && intval($_POST['maxremindercount']) != 0) { $SQLremindercountcondition = " AND remindercount < ".intval($_POST['maxremindercount']); } else { $SQLremindercountcondition = ""; } if (isset($_POST['minreminderdelay']) && $_POST['minreminderdelay'] != '' && intval($_POST['minreminderdelay']) != 0) { // $_POST['minreminderdelay'] in days (86400 seconds per day) $compareddate = date_shift( date("Y-m-d H:i:s",time() - 86400 * intval($_POST['minreminderdelay'])), "Y-m-d H:i", $timeadjust); $SQLreminderdelaycondition = " AND ( " . " (remindersent = 'N' AND sent < '".$compareddate."') " . " OR " . " (remindersent < '".$compareddate."'))"; } else { $SQLreminderdelaycondition = ""; } $ctquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed ='N' or completed ='') AND sent<>'' AND sent<>'N' AND token <>'' AND email <> '' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; if (isset($starttokenid)) {$ctquery .= " AND tid > '{$starttokenid}'";} if (isset($tokenid) && $tokenid) {$ctquery .= " AND tid = '{$tokenid}'";} if (isset($tokenids)) {$ctquery .= " AND tid IN (".implode(", ", $tokenids).")";} $tokenoutput .= "\n"; $ctresult = $connect->Execute($ctquery) or safe_die ("Database error!
    \n" . $connect->ErrorMsg()); $ctcount = $ctresult->RecordCount(); $ctfieldcount = $ctresult->FieldCount(); $emquery = "SELECT * FROM ".db_table_name("tokens_{$surveyid}")." WHERE (completed = 'N' or completed = '') AND sent <> 'N' and sent <>'' AND token <>'' AND EMAIL <>'' $SQLemailstatuscondition $SQLremindercountcondition $SQLreminderdelaycondition"; if (isset($starttokenid)) {$emquery .= " AND tid > '{$starttokenid}'";} if (isset($tokenid) && $tokenid) {$emquery .= " AND tid = '{$tokenid}'";} if (isset($tokenids)) {$emquery .= " AND tid IN (".implode(", ", $tokenids).")";} $emquery .= " ORDER BY tid "; $emresult = db_select_limit_assoc($emquery, $maxemails) or safe_die ("Couldn't do query.
    $emquery
    ".$connect->ErrorMsg()); $emcount = $emresult->RecordCount(); $attributes=GetTokenFieldsAndNames($surveyid); if ($emcount > 0) { $tokenoutput .= "\n" ."\t\n" ."\n" ."\t\n" ."\t" ."\n" ."\t\n" ."\t\n" ."\t\n" ."\t\n" ."\t\n"; //Include values for constraints minreminderdelay and maxremindercount if they exist if (isset($_POST['minreminderdelay']) && $_POST['minreminderdelay'] != '' && intval($_POST['minreminderdelay']) != 0) { $tokenoutput .= "\t\n"; } if (isset($_POST['maxremindercount']) && $_POST['maxremindercount'] != '' && intval($_POST['maxremindercount']) != 0) { $tokenoutput .= "\t\n"; } // foreach ($surveylangs as $language) { $message = html_escape($_POST['message_'.$language]); $tokenoutput .="\n" ."\n" ."\n"; } $tokenoutput.="\t\n" ."\t\n"; } $tokenoutput .= "\t\n" ."
    \n"; $oMail = new PHPMailer; while ($emrow = $emresult->FetchRow()) { unset($fieldsarray); $to=array(); $aEmailaddresses=explode(';',$emrow['email']); foreach($aEmailaddresses as $sEmailaddress) { $to[]=$emrow['firstname']." ".$emrow['lastname']." <{$sEmailaddress}>"; } $fieldsarray["{EMAIL}"]=$emrow['email']; $fieldsarray["{FIRSTNAME}"]=$emrow['firstname']; $fieldsarray["{LASTNAME}"]=$emrow['lastname']; $fieldsarray["{TOKEN}"]=$emrow['token']; $fieldsarray["{LANGUAGE}"]=$emrow['language']; $fieldsarray["{SID}"]=$fieldsarray["{SURVEYID}"]=$surveyid; $fieldsarray["{SURVEYNAME}"]=$thissurvey["surveyls_title"]; foreach ($attributes as $attributefield=>$attributedescription) { $fieldsarray['{'.strtoupper($attributefield).'}']=$emrow[$attributefield]; $fieldsarray['{TOKEN:'.strtoupper($attributefield).'}']=$emrow[$attributefield]; } $emrow['language']=trim($emrow['language']); if ($emrow['language']=='') {$emrow['language']=$baselanguage;} //if language is not give use default $found = array_search($emrow['language'], $surveylangs); if ($found==false) {$emrow['language']=$baselanguage;} $from = $_POST['from_'.$emrow['language']]; if (getEmailFormat($surveyid) == 'html') { $ishtml=true; } else { $ishtml=false; } if ($ishtml == false) { $fieldsarray["{OPTOUTURL}"]="$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; if ( $modrewrite ) { $fieldsarray["{SURVEYURL}"]="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; $barebone_link=$fieldsarray["{SURVEYURL}"]; } else { $fieldsarray["{SURVEYURL}"]="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; $barebone_link=$fieldsarray["{SURVEYURL}"]; } } else { $fieldsarray["{OPTOUTURL}"]="".htmlspecialchars("$publicurl/optout.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; if ( $modrewrite ) { $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}").""; $barebone_link="$publicurl/$surveyid/lang-".trim($emrow['language'])."/tk-{$emrow['token']}"; } else { $fieldsarray["{SURVEYURL}"]="".htmlspecialchars("$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}").""; $barebone_link="$publicurl/index.php?lang=".trim($emrow['language'])."&sid=$surveyid&token={$emrow['token']}"; $_POST['message_'.$emrow['language']] = html_entity_decode($_POST['message_'.$emrow['language']], ENT_QUOTES, $emailcharset); } } $msgsubject=Replacefields($_POST['subject_'.$emrow['language']], $fieldsarray); $sendmessage=Replacefields($_POST['message_'.$emrow['language']], $fieldsarray); $msgsubject = str_replace("@@SURVEYURL@@", $barebone_link, $msgsubject); $sendmessage = str_replace("@@SURVEYURL@@", $barebone_link, $sendmessage); $customheaders = array( '1' => "X-surveyid: ".$surveyid, '2' => "X-tokenid: ".$fieldsarray["{TOKEN}"]); if (trim($emrow['validfrom'])!='' && convertDateTimeFormat($emrow['validfrom'],'Y-m-d H:i:s','U')*1>date('U')*1) { $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) delayed: Token is not yet valid.")."
    ", $fieldsarray); } elseif (trim($emrow['validuntil'])!='' && convertDateTimeFormat($emrow['validuntil'],'Y-m-d H:i:s','U')*1gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) skipped: Token is not valid anymore.")."
    ", $fieldsarray); } elseif (SendEmailMessage($oMail, $sendmessage, $msgsubject, $to, $from, $sitename,$ishtml,getBounceEmail($surveyid),null,$customheaders)) { // Put date into remindersent $today = date_shift(date("Y-m-d H:i:s"), "Y-m-d H:i", $timeadjust); $udequery = "UPDATE ".db_table_name("tokens_{$surveyid}")."\n" ."SET remindersent='$today',remindercount = remindercount+1 WHERE tid={$emrow['tid']}"; // $uderesult = $connect->Execute($udequery) or safe_die ("Could not update tokens
    $udequery
    ".$connect->ErrorMsg()); //orig: $tokenoutput .= "({$emrow['tid']})[".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']}]
    \n"; $tokenoutput .= "({$emrow['tid']}) [".$clang->gT("Reminder sent to:")." {$emrow['firstname']} {$emrow['lastname']} (".htmlspecialchars($to[0]).")]
    \n"; } else { unset($oMail); $oMail = new PHPMailer; $tokenoutput .= $emrow['tid'] ." ".ReplaceFields($clang->gT("Email to {FIRSTNAME} {LASTNAME} ({EMAIL}) failed. Error Message:")." ".$maildebug."
    ", $fieldsarray); if ($debug>0) { $tokenoutput .= "
    Subject : $msgsubject

    ".htmlspecialchars($maildebugbody)."
    "; } } $lasttid = $emrow['tid']; } $oMail->SmtpClose(); if ($ctcount > $emcount) { $lefttosend = $ctcount-$maxemails; $tokenoutput .= "
    \n" ."".$clang->gT("Warning")."

    \n" .$clang->gT("There are more emails pending than can be sent in one batch. Continue sending emails by clicking below.")."

    \n" .str_replace("{EMAILCOUNT}", $lefttosend, $clang->gT("There are {EMAILCOUNT} emails still to be sent.")) ."
    \n" ."\n" ."
    \n"; } else { $tokenoutput .= "
    ".$clang->gT("Warning")."
    \n" .$clang->gT("There were no eligible emails to send. This will be because none satisfied the criteria of:")."\n" ."
     
    \n"; } $tokenoutput .= "
    \n"; } } if ($subaction == "tokenify" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { $tokenoutput .= "
    ".$clang->gT("Create tokens")."
    \n"; $tokenoutput .= "
    \n"; if (!isset($_POST['ok']) || !$_POST['ok']) { $tokenoutput .= "".$clang->gT("Clicking yes will generate tokens for all those in this token list that have not been issued one. Is this OK?")."

    \n" ."\n" .$clang->gT("Yes")."' onclick=\"".get2post("$scriptname?action=tokens&sid=$surveyid&subaction=tokenify&ok=Y")."\" />\n" ."\n" ."
    \n"; } else { //get token length from survey settings $tlquery = "SELECT tokenlength FROM ".db_table_name("surveys")." WHERE sid=$surveyid"; $tlresult = db_execute_assoc($tlquery); while ($tlrow = $tlresult->FetchRow()) { $tokenlength = $tlrow['tokenlength']; } //if tokenlength is not set or there are other problems use the default value (15) if(!isset($tokenlength) || $tokenlength == '') { $tokenlength = 15; } // select all existing tokens $ntquery = "SELECT token FROM ".db_table_name("tokens_$surveyid")." group by token"; $ntresult = db_execute_assoc($ntquery); while ($tkrow = $ntresult->FetchRow()) { $existingtokens[$tkrow['token']]=true; } $newtokencount = 0; $invalidtokencount=0; $tkquery = "SELECT tid FROM ".db_table_name("tokens_$surveyid")." WHERE token IS NULL OR token=''"; $tkresult = db_execute_assoc($tkquery) or safe_die ("Mucked up!
    $tkquery
    ".$connect->ErrorMsg()); while (($tkrow = $tkresult->FetchRow()) && $invalidtokencount<50) { $isvalidtoken = false; while ($isvalidtoken == false && $invalidtokencount<50) { $newtoken = sRandomChars($tokenlength); if (!isset($existingtokens[$newtoken])) { $isvalidtoken = true; $existingtokens[$newtoken]=true; $invalidtokencount=0; } else { $invalidtokencount ++; } } if(!$invalidtokencount) { $itquery = "UPDATE ".db_table_name("tokens_$surveyid")." SET token='$newtoken' WHERE tid={$tkrow['tid']}"; $itresult = $connect->Execute($itquery); $newtokencount++; } } if(!$invalidtokencount){ $tokenoutput .= "
    ".sprintf($clang->gT("%s tokens have been created."),$newtokencount)."
    \n"; }else{ $tokenoutput .= "\t\t
    ".$clang->gT("Error")."
    \n" ."\t\t

    ".sprintf($clang->gT("Only %s new tokens were added after %s trials."),$newtokencount,$invalidtokencount)."\n" ."\t\t".$clang->gT("Try with a bigger token length.")."

    \n"; } } $tokenoutput .= "
    \n"; } if ($subaction == "delete" && bHasSurveyPermission($surveyid, 'tokens','delete')) { $tokenoutput .= "
    \n" ."\t
    " .$clang->gT("Delete") ."\t
    \n" ."\t


    "; if(isset($tokenids) && count($tokenids)>0) { if(implode(", ", $tokenids) != "") { $dlquery = "DELETE FROM ".db_table_name("tokens_$surveyid")." WHERE tid IN (".implode(", ", $tokenids).")"; $dlresult = $connect->Execute($dlquery) or safe_die ("Couldn't delete record {$tokenid}
    ".$connect->ErrorMsg()."\n\n$dlquery"); $tokenoutput .= $clang->gT("Marked tokens have been deleted."); } else { $tokenoutput .= $clang->gT("No tokens were selected for deletion"); } } elseif (isset($tokenid)) { $dlquery = "DELETE FROM ".db_table_name("tokens_$surveyid")." WHERE tid={$tokenid}"; $dlresult = $connect->Execute($dlquery) or safe_die ("Couldn't delete record {$tokenid}
    ".$connect->ErrorMsg()); $tokenoutput .= $clang->gT("Token has been deleted."); } $tokenoutput .= "

    ".$clang->gT("Reloading Screen. Please wait.")."

    \n" ."

    \n
    \n"; } if ($subaction == "managetokenattributes" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { $tokenoutput .= "
    ".$clang->gT("Manage token attribute fields")."
    \n"; $tokenfields=GetTokenFieldsAndNames($surveyid,true); $nrofattributes=0; $tokenoutput.='
    ' .""; $exampledataquery = "SELECT * FROM ".db_table_name("tokens_$surveyid"); $exampledata = db_select_limit_assoc($exampledataquery,1) or safe_die ("Could not get example data!
    $exampledataquery
    ".$connect->ErrorMsg()); $examplerow = $exampledata->FetchRow(); foreach ($tokenfields as $tokenfield=>$tokendescription) { $nrofattributes++; $tokenoutput.=""; } $tokenoutput.="
    ".$clang->gT("Attribute field")."".$clang->gT("Field description")."".$clang->gT("Example data")."
    $tokenfield"; if ($examplerow!==false) { $tokenoutput.=htmlspecialchars($examplerow[$tokenfield]); } else { $tokenoutput.=$clang->gT(''); } $tokenoutput.="

    " .'' ."\n" ."\n" ."

    \n" .'


    '; $tokenoutput .= "
    ".$clang->gT("Add token attributes")."

    \n"; $tokenoutput .=sprintf($clang->gT('There are %s user attribute fields in this token table'),$nrofattributes).'

    ' .'
    ' .'

    ' .'' .'' .'

    ' .'

    ' .'' ."" ."" ."" ."

    " .'
    ' .'

    '; } if ($subaction == "updatetokenattributedescriptions" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { // find out the existing token attribute fieldnames $tokenattributefieldnames=GetAttributeFieldNames($surveyid); $fieldcontents=''; foreach ($tokenattributefieldnames as $fieldname) { $fieldcontents.=$fieldname.'='.strip_tags($_POST['description_'.$fieldname])."\n"; } $updatequery = "update ".db_table_name('surveys').' set attributedescriptions='.db_quoteall($fieldcontents,true)." where sid=$surveyid"; $execresult=db_execute_assoc($updatequery); $tokenoutput .= "\t
    ".$clang->gT("Update token attribute descriptions")."
    \n" ."\t
    "; if ($execresult===false) { $tokenoutput.="\t\t
    ".$clang->gT("Updating token attribute descriptions failed:")."".htmlspecialchars($connect->ErrorMsg())."
    " ."\t\t
    \n"; } else { $tokenoutput.="\t\t
    ".$clang->gT("Token attribute descriptions were successfully updated.")."
    " ."\t\t
    \n"; } $tokenoutput .= "\t
    "; } $tokenoutput .= "
    "; if ($subaction == "updatetokenattributes" && bHasSurveyPermission($surveyid, 'tokens', 'update')) { $number2add=sanitize_int($_POST['addnumber'],1,100); // find out the existing token attribute fieldnames $tokenfieldnames = array_values($connect->MetaColumnNames("{$dbprefix}tokens_$surveyid", true)); $tokenattributefieldnames=array_filter($tokenfieldnames,'filterforattributes'); $i=1; for ($b=0;$b<$number2add;$b++) { while (in_array('attribute_'.$i,$tokenattributefieldnames)!==false) { $i++; } $tokenattributefieldnames[]='attribute_'.$i; $fields[]=array('attribute_'.$i,'C','255'); } $dict = NewDataDictionary($connect); $sqlarray = $dict->ChangeTableSQL("{$dbprefix}tokens_$surveyid", $fields); $execresult=$dict->ExecuteSQLArray($sqlarray, false); $tokenoutput .= "\t
    ".$clang->gT("Update token attributes")."
    \n" ."\t
    "; if ($execresult==0) { $tokenoutput.="\t\t
    ".$clang->gT("Adding attribute fields failed:")."".htmlspecialchars($connect->ErrorMsg())."
    " ."\t\t
    \n"; } else { $tokenoutput.="\t\t
    ".sprintf($clang->gT("%s field(s) were successfully added."),$number2add)."
    " ."\t\t
    \n"; } $tokenoutput .= "\t
    "; LimeExpressionManager::SetDirtyFlag(); // so that knows that token tables have changed } if (($subaction == "edit" && bHasSurveyPermission($surveyid, 'tokens','update')) || ($subaction == "addnew" && bHasSurveyPermission($surveyid, 'tokens','create'))) { if ($subaction == "edit") { $edquery = "SELECT * FROM ".db_table_name("tokens_$surveyid")." WHERE tid={$tokenid}"; $edresult = db_execute_assoc($edquery); $edfieldcount = $edresult->FieldCount(); while($edrow = $edresult->FetchRow()) { //Create variables with the same names as the database column names and fill in the value foreach ($edrow as $Key=>$Value) {$$Key = $Value;} } } if ($subaction != "edit") { $edquery = "SELECT * FROM ".db_table_name("tokens_$surveyid"); $edresult = db_select_limit_assoc($edquery, 1); $edfieldcount = $edresult->FieldCount(); } $tokenoutput .= "
    "; if ($subaction == "edit") { $tokenoutput .=$clang->gT("Edit token entry"); } else { $tokenoutput .=$clang->gT("Add token entry"); } $tokenoutput .="
    " ."
    \n" ."