PageRenderTime 39ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/administrator/components/com_rsform/helpers/rsform.php

https://bitbucket.org/biojazzard/joomla-eboracast
PHP | 3227 lines | 2600 code | 468 blank | 159 comment | 485 complexity | d761918b99cf7080f296165c389de889 MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0, MIT, BSD-3-Clause
  1. <?php
  2. /**
  3. * @version 1.4.0
  4. * @package RSform!Pro 1.4.0
  5. * @copyright (C) 2007-2011 www.rsjoomla.com
  6. * @license GPL, http://www.gnu.org/copyleft/gpl.html
  7. */
  8. defined('_JEXEC') or die('Restricted access');
  9. require_once dirname(__FILE__).'/config.php';
  10. require_once dirname(__FILE__).'/version.php';
  11. // Product info
  12. if(!defined('_RSFORM_REVISION')) {
  13. $version = new RSFormProVersion();
  14. define('_RSFORM_PRODUCT', 'RSform!Pro');
  15. define('_RSFORM_VERSION', $version->long);
  16. define('_RSFORM_KEY', $version->key);
  17. define('_RSFORM_REVISION', $version->revision);
  18. }
  19. JTable::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_rsform/tables');
  20. $cache = JFactory::getCache('com_rsform');
  21. $cache->clean();
  22. $lang = JFactory::getLanguage();
  23. $lang->load('com_rsform', JPATH_ADMINISTRATOR, 'en-GB', true);
  24. $lang->load('com_rsform', JPATH_ADMINISTRATOR, $lang->getDefault(), true);
  25. $lang->load('com_rsform', JPATH_ADMINISTRATOR, null, true);
  26. // Create the Legacy adapter
  27. $GLOBALS['RSadapter'] = RSFormProHelper::getLegacyAdapter();
  28. // Legacy function -- RSgetValidationRules()
  29. function RSgetValidationRules()
  30. {
  31. return RSFormProHelper::getValidationRules();
  32. }
  33. function _modifyResponsiveTemplate()
  34. {
  35. $buffer = JResponse::getBody();
  36. $buffer = trim($buffer);
  37. $lines = RSFormProHelper::explode($buffer);
  38. $line = $lines[0];
  39. if (strtolower($line) != '<!doctype html>')
  40. {
  41. // single line
  42. if (strpos($line, '>') !== false) {
  43. $buffer = str_replace($line, '<!doctype html>', $buffer);
  44. } else {
  45. // should be on multiple lines
  46. $i = 0;
  47. while (strpos($line, '>') === false) {
  48. $i++;
  49. $line = $lines[$i];
  50. }
  51. // bail out, we might be modifying something else
  52. if (strpos($line, '<') !== false) {
  53. return;
  54. }
  55. // remove the first lines...
  56. for ($j=0; $j<=$i; $j++) {
  57. unset($lines[$j]);
  58. }
  59. // add this on the first line
  60. array_unshift($lines, '<!doctype html>');
  61. // join the new buffer
  62. $buffer = implode("\r\n", $lines);
  63. }
  64. JResponse::setBody($buffer);
  65. }
  66. }
  67. class RSFormProHelper
  68. {
  69. public static function isJ16()
  70. {
  71. // just for legacy reasons
  72. return true;
  73. }
  74. public static function isJ($version) {
  75. static $cache = array();
  76. if (!isset($cache[$version])) {
  77. $jversion = new JVersion();
  78. $cache[$version] = $jversion->isCompatible($version);
  79. }
  80. return $cache[$version];
  81. }
  82. public static function getDate($date)
  83. {
  84. static $mask;
  85. if (!$mask) {
  86. $mask = RSFormProHelper::getConfig('global.date_mask');
  87. if (!$mask) {
  88. $mask = 'Y-m-d H:i:s';
  89. }
  90. }
  91. return JHTML::_('date', $date, $mask);
  92. }
  93. public static function getLegacyAdapter()
  94. {
  95. static $adapter;
  96. if (empty($adapter))
  97. {
  98. require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/legacy.php';
  99. $adapter = new RSAdapter();
  100. }
  101. return $adapter;
  102. }
  103. public static function getComponentId($name, $formId=0)
  104. {
  105. static $cache;
  106. if (!is_array($cache))
  107. $cache = array();
  108. if (empty($formId))
  109. {
  110. $formId = JRequest::getInt('formId');
  111. if (empty($formId))
  112. {
  113. $post = JRequest::getVar('form');
  114. $formId = (int) @$post['formId'];
  115. }
  116. }
  117. if (!isset($cache[$formId][$name]))
  118. $cache[$formId][$name] = RSFormProHelper::componentNameExists($name, $formId);
  119. return $cache[$formId][$name];
  120. }
  121. public static function checkValue($setvalue, $array)
  122. {
  123. if (!is_array($array))
  124. $array = RSFormProHelper::explode($array);
  125. if (strlen($setvalue))
  126. foreach ($array as $k => $v)
  127. {
  128. @list($value, $text) = explode("|", $v, 2);
  129. if ($value == $setvalue)
  130. $array[$k] = $v.'[c]';
  131. }
  132. return implode("\n", $array);
  133. }
  134. public static function createList($results, $value='value', $text='text')
  135. {
  136. $list = array();
  137. if (is_array($results))
  138. foreach ($results as $result)
  139. if (is_object($result))
  140. $list[] = $result->{$value}.'|'.$result->{$text};
  141. elseif (is_array($result))
  142. $list[] = $result[$value].'|'.$result[$text];
  143. return implode("\n", $list);
  144. }
  145. public static function displayForm($formId, $is_module=false)
  146. {
  147. $mainframe = JFactory::getApplication();
  148. $db = JFactory::getDBO();
  149. $db->setQuery("SELECT Published, FormTitle, MetaTitle, MetaDesc, MetaKeywords, ShowThankyou FROM #__rsform_forms WHERE FormId='".(int) $formId."'");
  150. $form = $db->loadObject();
  151. if (empty($form) || !$form->Published)
  152. {
  153. JError::raiseWarning(500, JText::_('_NOT_EXIST'));
  154. return;
  155. }
  156. $lang = RSFormProHelper::getCurrentLanguage($formId);
  157. $translations = RSFormProHelper::getTranslations('forms', $formId, $lang);
  158. if ($translations)
  159. foreach ($translations as $field => $value)
  160. {
  161. if (isset($form->$field))
  162. $form->$field = $value;
  163. }
  164. $doc = JFactory::getDocument();
  165. if (!$is_module)
  166. {
  167. if ($form->MetaDesc)
  168. $doc->setMetaData('description', $form->MetaDesc);
  169. if ($form->MetaKeywords)
  170. $doc->setMetaData('keywords', $form->MetaKeywords);
  171. if ($form->MetaTitle)
  172. $doc->setTitle($form->FormTitle);
  173. }
  174. $session = JFactory::getSession();
  175. $formparams = $session->get('com_rsform.formparams.'.$formId);
  176. // Form has been processed ?
  177. if ($formparams && $formparams->formProcessed)
  178. {
  179. // Must show Thank You Message
  180. if ($form->ShowThankyou)
  181. {
  182. return RSFormProHelper::showThankYouMessage($formId);
  183. }
  184. // Clear
  185. $session->clear('com_rsform.formparams.'.$formId);
  186. // Must show small message
  187. $mainframe->enqueueMessage(JText::_('RSFP_THANKYOU_SMALL'));
  188. }
  189. // Must process form
  190. $post = JRequest::getVar('form', array(), 'post', 'none', JREQUEST_ALLOWRAW);
  191. if (isset($post['formId']) && $post['formId'] == $formId)
  192. {
  193. $invalid = RSFormProHelper::processForm($formId);
  194. // Did not pass validation - show the form
  195. if ($invalid)
  196. {
  197. $mainframe->triggerEvent('rsfp_f_onBeforeShowForm');
  198. return RSFormProHelper::showForm($formId, $post, $invalid);
  199. }
  200. }
  201. // Default - show the form
  202. $mainframe->triggerEvent('rsfp_f_onBeforeShowForm');
  203. return RSFormProHelper::showForm($formId);
  204. }
  205. public static function WYSIWYG($name, $content, $hiddenField, $width, $height, $col, $row)
  206. {
  207. $editor = JFactory::getEditor();
  208. $params = array('relative_urls' => '0', 'cleanup_save' => '0', 'cleanup_startup' => '0', 'cleanup_entities' => '0');
  209. $id = trim(substr($name, 4), '][');
  210. $content = $editor->display($name, $content , $width, $height, $col, $row, true, $id, null, null, $params);
  211. return $content;
  212. }
  213. public static function getValidationRules()
  214. {
  215. require_once JPATH_SITE.'/components/com_rsform/helpers/validation.php';
  216. $results = get_class_methods('RSFormProValidations');
  217. return implode("\n",$results);
  218. }
  219. public static function readConfig($force=false)
  220. {
  221. $config = RSFormProConfig::getInstance();
  222. if ($force) {
  223. $config->reload();
  224. }
  225. return $config->getData();
  226. }
  227. public static function getConfig($name = null)
  228. {
  229. $config = RSFormProConfig::getInstance();
  230. if (is_null($name)) {
  231. return $config->getData();
  232. } else {
  233. return $config->get($name);
  234. }
  235. }
  236. public static function genKeyCode()
  237. {
  238. $code = RSFormProHelper::getConfig('global.register.code');
  239. return md5($code._RSFORM_KEY);
  240. }
  241. public static function componentNameExists($componentName, $formId, $currentComponentId=0)
  242. {
  243. $db = JFactory::getDBO();
  244. if ($componentName == 'formId')
  245. return true;
  246. $componentName = $db->escape($componentName);
  247. $formId = (int) $formId;
  248. $currentComponentId = (int) $currentComponentId;
  249. $query = "SELECT c.ComponentId FROM #__rsform_properties p LEFT JOIN #__rsform_components c ON (p.ComponentId = c.ComponentId)";
  250. $query .= "WHERE c.FormId='".$formId."' AND p.PropertyName='NAME' AND p.PropertyValue='".$componentName."'";
  251. if ($currentComponentId)
  252. $query .= " AND c.ComponentId != '".$currentComponentId."'";
  253. $db->setQuery($query);
  254. $exists = $db->loadResult();
  255. return $exists;
  256. }
  257. public static function copyComponent($sourceComponentId, $toFormId)
  258. {
  259. $sourceComponentId = (int) $sourceComponentId;
  260. $toFormId = (int) $toFormId;
  261. $db = JFactory::getDBO();
  262. $db->setQuery("SELECT * FROM #__rsform_components WHERE ComponentId='".$sourceComponentId."'");
  263. $component = $db->loadObject();
  264. if (!$component)
  265. return false;
  266. //get max ordering
  267. $db->setQuery("SELECT MAX(`Order`)+1 FROM #__rsform_components WHERE FormId = '".$toFormId."'");
  268. $component->Order = $db->loadResult();
  269. $db->setQuery("INSERT INTO #__rsform_components SET `FormId`='".$toFormId."', `ComponentTypeId`='".$component->ComponentTypeId."', `Order`='".$component->Order."',`Published`='".$component->Published."'");
  270. $db->execute();
  271. $newComponentId = $db->insertid();
  272. $db->setQuery("SELECT * FROM #__rsform_properties WHERE ComponentId='".$sourceComponentId."'");
  273. $properties = $db->loadObjectList();
  274. foreach ($properties as $property)
  275. {
  276. if ($property->PropertyName == 'NAME' && $toFormId == $component->FormId)
  277. {
  278. $property->PropertyValue .= ' copy';
  279. while (RSFormProHelper::componentNameExists($property->PropertyValue, $toFormId))
  280. $property->PropertyValue .= mt_rand(0,9);
  281. }
  282. $db->setQuery("INSERT INTO #__rsform_properties SET ComponentId='".$newComponentId."', PropertyName='".$db->escape($property->PropertyName)."', PropertyValue='".$db->escape($property->PropertyValue)."'");
  283. $db->execute();
  284. }
  285. // copy language
  286. $db->setQuery("SELECT * FROM #__rsform_translations WHERE `reference`='properties' AND `reference_id` LIKE '".$sourceComponentId.".%'");
  287. $translations = $db->loadObjectList();
  288. foreach ($translations as $translation)
  289. {
  290. $reference_id = $newComponentId.'.'.end(explode('.', $translation->reference_id, 2));
  291. $db->setQuery("INSERT INTO #__rsform_translations SET `form_id`='".$toFormId."', `lang_code`='".$db->escape($translation->lang_code)."', `reference`='properties', `reference_id`='".$db->escape($reference_id)."', `value`='".$db->escape($translation->value)."'");
  292. $db->execute();
  293. }
  294. return $newComponentId;
  295. }
  296. public static function getCurrentLanguage($formId=null)
  297. {
  298. $mainframe = JFactory::getApplication();
  299. $lang = JFactory::getLanguage();
  300. $session = JFactory::getSession();
  301. $formId = !$formId ? JRequest::getInt('formId') || JRequest::getInt('FormId') : $formId;
  302. // editing in backend ?
  303. if ($mainframe->isAdmin())
  304. {
  305. if (JRequest::getVar('task') == 'submissions.edit')
  306. {
  307. $cid = JRequest::getVar('cid', array());
  308. if (is_array($cid))
  309. $cid = (int) @$cid[0];
  310. $db = JFactory::getDBO();
  311. $db->setQuery("SELECT `Lang` FROM #__rsform_submissions WHERE SubmissionId='".$cid."'");
  312. $language = $db->loadResult();
  313. return $language;
  314. }
  315. return $session->get('com_rsform.form.'.$formId.'.lang', $lang->getTag());
  316. }
  317. // frontend
  318. else
  319. {
  320. return $lang->getTag();
  321. }
  322. }
  323. public static function getComponentProperties($components)
  324. {
  325. $db = JFactory::getDBO();
  326. if (is_numeric($components))
  327. {
  328. $componentId = (int) $components;
  329. //load component properties
  330. $db->setQuery("SELECT `PropertyName`, `PropertyValue` FROM #__rsform_properties WHERE `ComponentId`='".$componentId."'");
  331. $properties = $db->loadObjectList();
  332. //set up data array with component properties
  333. $data = array();
  334. foreach($properties as $property)
  335. $data[$property->PropertyName] = $property->PropertyValue;
  336. $data['componentId'] = $componentId;
  337. unset($properties);
  338. $db->setQuery("SELECT FormId FROM #__rsform_components WHERE ComponentId='".$componentId."'");
  339. $formId = $db->loadResult();
  340. // language
  341. $lang = RSFormProHelper::getCurrentLanguage($formId);
  342. $translations = RSFormProHelper::getTranslations('properties', $formId, $lang);
  343. foreach ($data as $property => $value)
  344. {
  345. $reference_id = $componentId.'.'.$property;
  346. if (isset($translations[$reference_id]))
  347. $data[$property] = $translations[$reference_id];
  348. }
  349. return $data;
  350. }
  351. elseif (is_array($components))
  352. {
  353. $componentIds = array();
  354. foreach ($components as $componentId)
  355. {
  356. if (is_object($componentId) && !empty($componentId->ComponentId))
  357. $componentIds[] = (int) $componentId->ComponentId;
  358. elseif (is_array($componentId) && !empty($componentId['ComponentId']))
  359. $componentIds[] = (int) $componentId['ComponentId'];
  360. else
  361. $componentIds[] = (int) $componentId;
  362. }
  363. if (!empty($componentIds))
  364. {
  365. $db->setQuery("SELECT `PropertyName`, `PropertyValue`, `ComponentId` FROM #__rsform_properties WHERE `ComponentId` IN (".implode(',', $componentIds).")");
  366. $results = $db->loadObjectList();
  367. $all_data = array();
  368. foreach ($results as $result)
  369. $all_data[$result->ComponentId][$result->PropertyName] = $result->PropertyValue;
  370. foreach ($all_data as $componentId => $properties)
  371. $all_data[$componentId]['componentId'] = $componentId;
  372. $db->setQuery("SELECT FormId FROM #__rsform_components WHERE ComponentId='".$componentIds[0]."'");
  373. $formId = $db->loadResult();
  374. // language
  375. $lang = RSFormProHelper::getCurrentLanguage($formId);
  376. $translations = RSFormProHelper::getTranslations('properties', $formId, $lang);
  377. foreach ($all_data as $componentId => $properties)
  378. {
  379. foreach ($properties as $property => $value)
  380. {
  381. $reference_id = $componentId.'.'.$property;
  382. if (isset($translations[$reference_id]))
  383. $properties[$property] = $translations[$reference_id];
  384. }
  385. $all_data[$componentId] = $properties;
  386. }
  387. return $all_data;
  388. }
  389. }
  390. return false;
  391. }
  392. public static function isCode($value)
  393. {
  394. $RSadapter = RSFormProHelper::getLegacyAdapter();
  395. if (strpos($value, '<code>') !== false)
  396. return eval($value);
  397. return $value;
  398. }
  399. public static function showPreview($formId, $componentId, $data)
  400. {
  401. $mainframe = JFactory::getApplication();
  402. $formId = (int) $formId;
  403. $componentId = (int) $componentId;
  404. // Legacy
  405. $r = array();
  406. $r['ComponentTypeName'] = $data['ComponentTypeName'];
  407. $out ='';
  408. //Trigger Event - rsfp_bk_onBeforeCreateComponentPreview
  409. $mainframe->triggerEvent('rsfp_bk_onBeforeCreateComponentPreview',array(array('out'=>&$out,'formId'=>$formId,'componentId'=>$componentId,'ComponentTypeName'=>$r['ComponentTypeName'],'data'=>$data)));
  410. static $passedPageBreak;
  411. switch($r['ComponentTypeName'])
  412. {
  413. case 'textBox':
  414. {
  415. $defaultValue = RSFormProHelper::isCode($data['DEFAULTVALUE']);
  416. $out.='<td>'.$data['CAPTION'].'</td>';
  417. $out.='<td><input type="text" value="'.RSFormProHelper::htmlEscape($defaultValue).'" size="'.$data['SIZE'].'" /></td>';
  418. }
  419. break;
  420. case 'textArea':
  421. {
  422. $defaultValue = RSFormProHelper::isCode($data['DEFAULTVALUE']);
  423. $out.='<td>'.$data['CAPTION'].'</td>';
  424. $out.='<td><textarea cols="'.$data['COLS'].'" rows="'.$data['ROWS'].'">'.RSFormProHelper::htmlEscape($defaultValue).'</textarea></td>';
  425. }
  426. break;
  427. case 'selectList':
  428. {
  429. $out.='<td>'.$data['CAPTION'].'</td>';
  430. $out.='<td><select '.($data['MULTIPLE']=='YES' ? 'multiple="multiple"' : '').' size="'.$data['SIZE'].'">';
  431. $items = RSFormProHelper::isCode($data['ITEMS']);
  432. $items = str_replace(array("\r\n", "\r"), "\n", $items);
  433. $items = explode("\n",$items);
  434. $special = array('[c]', '[g]', '[d]');
  435. foreach ($items as $item)
  436. {
  437. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  438. if (is_null($txt))
  439. $txt = $val;
  440. // <optgroup>
  441. if (strpos($item, '[g]') !== false) {
  442. $out .= '<optgroup label="'.RSFormProHelper::htmlEscape($val).'">';
  443. continue;
  444. }
  445. // </optgroup>
  446. if(strpos($item, '[/g]') !== false) {
  447. $out .= '</optgroup>';
  448. continue;
  449. }
  450. $additional = '';
  451. // selected
  452. if (strpos($item, '[c]') !== false)
  453. $additional .= 'selected="selected"';
  454. // disabled
  455. if (strpos($item, '[d]') !== false)
  456. $additional .= 'disabled="disabled"';
  457. $out .= '<option '.$additional.' value="'.RSFormProHelper::htmlEscape($val).'">'.RSFormProHelper::htmlEscape($txt).'</option>';
  458. }
  459. $out.='</select></td>';
  460. }
  461. break;
  462. case 'checkboxGroup':
  463. {
  464. $i=0;
  465. $out.='<td>'.$data['CAPTION'].'</td>';
  466. $out.='<td>';
  467. $items = RSFormProHelper::isCode($data['ITEMS']);
  468. $items = str_replace(array("\r\n", "\r"), "\n", $items);
  469. $items = explode("\n",$items);
  470. $special = array('[c]', '[d]');
  471. foreach ($items as $item)
  472. {
  473. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  474. if (is_null($txt))
  475. $txt = $val;
  476. $additional = '';
  477. // checked
  478. if (strpos($item, '[c]') !== false)
  479. $additional .= 'checked="checked"';
  480. // disabled
  481. if (strpos($item, '[d]') !== false)
  482. $additional .= 'disabled="disabled"';
  483. $out.='<input type="checkbox" '.$additional.' value="'.RSFormProHelper::htmlEscape($val).'" id="'.$data['NAME'].$i.'"/><label for="'.$data['NAME'].$i.'">'.$txt.'</label>';
  484. if($data['FLOW']=='VERTICAL') $out.='<br/>';
  485. $i++;
  486. }
  487. $out.='</td>';
  488. }
  489. break;
  490. case 'radioGroup':
  491. {
  492. $i=0;
  493. $out.='<td>'.$data['CAPTION'].'</td>';
  494. $out.='<td>';
  495. $items = RSFormProHelper::isCode($data['ITEMS']);
  496. $items = str_replace(array("\r\n", "\r"), "\n", $items);
  497. $items = explode("\n",$items);
  498. $special = array('[c]', '[d]');
  499. foreach ($items as $item)
  500. {
  501. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  502. if (is_null($txt))
  503. $txt = $val;
  504. $additional = '';
  505. // checked
  506. if (strpos($item, '[c]') !== false)
  507. $additional .= 'checked="checked"';
  508. // disabled
  509. if (strpos($item, '[d]') !== false)
  510. $additional .= 'disabled="disabled"';
  511. $out.='<input type="radio" '.$additional.' value="'.RSFormProHelper::htmlEscape($val).'" id="'.$data['NAME'].$i.'"/><label for="'.$data['NAME'].$i.'">'.$txt.'</label>';
  512. if ($data['FLOW']=='VERTICAL') $out.='<br/>';
  513. $i++;
  514. }
  515. $out.='</td>';
  516. }
  517. break;
  518. case 'calendar':
  519. {
  520. $out.='<td>'.$data['CAPTION'].'</td>';
  521. $out.='<td><img src="'.JURI::root(true).'/administrator/components/com_rsform/assets/images/icons/calendar.png" /> '.JText::_('RSFP_COMP_FVALUE_'.$data['CALENDARLAYOUT']).'</td>';
  522. }
  523. break;
  524. case 'captcha':
  525. {
  526. $out.='<td>'.$data['CAPTION'].'</td>';
  527. $out.='<td>';
  528. switch (@$data['IMAGETYPE'])
  529. {
  530. default:
  531. case 'FREETYPE':
  532. case 'NOFREETYPE':
  533. $out.='<img src="index.php?option=com_rsform&amp;task=captcha&amp;componentId='.$componentId.'&amp;tmpl=component&amp;sid='.mt_rand().'" id="captcha'.$componentId.'" alt="'.$data['CAPTION'].'"/>';
  534. $out.=($data['FLOW']=='HORIZONTAL') ? '':'<br/>';
  535. $out.='<input type="text" value="" id="captchaTxt'.$componentId.'" '.$data['ADDITIONALATTRIBUTES'].' />';
  536. $out.=($data['SHOWREFRESH']=='YES') ? '&nbsp;&nbsp;<a href="" onclick="refreshCaptcha('.$componentId.',\'index.php?option=com_rsform&amp;task=captcha&amp;componentId='.$componentId.'&amp;tmpl=component\'); return false;">'.$data['REFRESHTEXT'].'</a>':'';
  537. break;
  538. case 'INVISIBLE':
  539. $out.='{hidden captcha}';
  540. break;
  541. }
  542. $out.='</td>';
  543. }
  544. break;
  545. case 'fileUpload':
  546. {
  547. $out.='<td>'.$data['CAPTION'].'</td>';
  548. $out.='<td><input type="file" /></td>';
  549. }
  550. break;
  551. case 'freeText':
  552. {
  553. $out.='<td>&nbsp;</td>';
  554. $out.='<td>'.$data['TEXT'].'</td>';
  555. }
  556. break;
  557. case 'hidden':
  558. {
  559. $out.='<td>&nbsp;</td>';
  560. $out.='<td>{hidden field}</td>';
  561. }
  562. break;
  563. case 'imageButton':
  564. {
  565. $out.='<td>'.$data['CAPTION'].'</td>';
  566. $out.='<td>';
  567. $out.='<input type="image" src="'.RSFormProHelper::htmlEscape($data['IMAGEBUTTON']).'"/>';
  568. if($data['RESET']=='YES')
  569. $out.='&nbsp;&nbsp;<input type="image" src="'.RSFormProHelper::htmlEscape($data['IMAGERESET']).'"/>';
  570. $out.='</td>';
  571. }
  572. break;
  573. case 'button':
  574. case 'submitButton':
  575. {
  576. $out.='<td>'.$data['CAPTION'].'</td>';
  577. if (isset($data['BUTTONTYPE']) && $data['BUTTONTYPE'] == 'TYPEBUTTON')
  578. $out.='<td><button type="button">'.RSFormProHelper::htmlEscape($data['LABEL']).'</button>';
  579. else
  580. $out.='<td><input type="button" value="'.RSFormProHelper::htmlEscape($data['LABEL']).'" />';
  581. if($data['RESET']=='YES')
  582. {
  583. if (isset($data['BUTTONTYPE']) && $data['BUTTONTYPE'] == 'TYPEBUTTON')
  584. $out.='&nbsp;&nbsp;<button type="reset">'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'</button>';
  585. else
  586. $out.='&nbsp;&nbsp;<input type="reset" value="'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'"/>';
  587. }
  588. $out.='</td>';
  589. }
  590. break;
  591. case 'password':
  592. {
  593. $out.='<td>'.$data['CAPTION'].'</td>';
  594. $out.='<td><input type="password" value="'.RSFormProHelper::htmlEscape($data['DEFAULTVALUE']).'" size="'.$data['SIZE'].'"/></td>';
  595. }
  596. break;
  597. case 'ticket':
  598. {
  599. $out.='<td>&nbsp;</td>';
  600. $out.='<td>'.RSFormProHelper::generateString($data['LENGTH'],$data['CHARACTERS']).'</td>';
  601. }
  602. break;
  603. case 'pageBreak':
  604. $out.='<td>&nbsp;</td>';
  605. $out.='<td>'.($passedPageBreak ? '<input type="button" value="'.RSFormProHelper::htmlEscape($data['PREVBUTTON']).'" />' : '').' <input type="button" value="'.RSFormProHelper::htmlEscape($data['NEXTBUTTON']).'" /></td>';
  606. $passedPageBreak = true;
  607. break;
  608. case 'rseprotickets':
  609. $out.='<td>'.$data['CAPTION'].'</td>';
  610. $out.='<td>'.JText::_('RSFP_RSEVENTSPRO_TICKETS').'</td>';
  611. break;
  612. default:
  613. $out = '<td colspan="2" style="color:#333333"><em>'.JText::_('RSFP_COMP_PREVIEW_NOT_AVAILABLE').'</em></td>';
  614. break;
  615. }
  616. //Trigger Event - rsfp_bk_onAfterCreateComponentPreview
  617. $mainframe->triggerEvent('rsfp_bk_onAfterCreateComponentPreview',array(array('out'=>&$out, 'formId'=>$formId, 'componentId'=>$componentId, 'ComponentTypeName'=>$r['ComponentTypeName'],'data'=>$data)));
  618. return $out;
  619. }
  620. public static function htmlEscape($val)
  621. {
  622. return htmlentities($val, ENT_COMPAT, 'UTF-8');
  623. }
  624. public static function explode($value)
  625. {
  626. $value = str_replace(array("\r\n", "\r"), "\n", $value);
  627. $value = explode("\n", $value);
  628. return $value;
  629. }
  630. public static function readFile($file, $download_name=null)
  631. {
  632. if (empty($download_name))
  633. $download_name = basename($file);
  634. $fsize = filesize($file);
  635. header("Cache-Control: public, must-revalidate");
  636. header('Cache-Control: pre-check=0, post-check=0, max-age=0');
  637. if (!preg_match('#MSIE#', $_SERVER['HTTP_USER_AGENT']))
  638. header("Pragma: no-cache");
  639. header("Expires: 0");
  640. header("Content-Description: File Transfer");
  641. header("Expires: Sat, 01 Jan 2000 01:00:00 GMT");
  642. if (preg_match('#Opera#', $_SERVER['HTTP_USER_AGENT']))
  643. header("Content-Type: application/octetstream");
  644. else
  645. header("Content-Type: application/octet-stream");
  646. header("Content-Length: ".(string) ($fsize));
  647. header('Content-Disposition: attachment; filename="'.$download_name.'"');
  648. header("Content-Transfer-Encoding: binary\n");
  649. ob_end_flush();
  650. RSFormProHelper::readFileChunked($file);
  651. exit();
  652. }
  653. public static function readFileChunked($filename, $retbytes=true)
  654. {
  655. $chunksize = 1*(1024*1024); // how many bytes per chunk
  656. $buffer = '';
  657. $cnt =0;
  658. $handle = fopen($filename, 'rb');
  659. if ($handle === false) {
  660. return false;
  661. }
  662. while (!feof($handle)) {
  663. $buffer = fread($handle, $chunksize);
  664. echo $buffer;
  665. if ($retbytes) {
  666. $cnt += strlen($buffer);
  667. }
  668. }
  669. $status = fclose($handle);
  670. if ($retbytes && $status) {
  671. return $cnt; // return num. bytes delivered like readfile() does.
  672. }
  673. return $status;
  674. }
  675. public static function getReplacements($SubmissionId, $skip_globals=false)
  676. {
  677. // Small hack
  678. return RSFormProHelper::sendSubmissionEmails($SubmissionId, true, $skip_globals);
  679. }
  680. public static function sendSubmissionEmails($SubmissionId, $only_return_replacements=false, $skip_globals=false)
  681. {
  682. $db = JFactory::getDBO();
  683. $u = JUri::getInstance();
  684. $config = JFactory::getConfig();
  685. $SubmissionId = (int) $SubmissionId;
  686. $mainframe = JFactory::getApplication();
  687. $Itemid = JRequest::getInt('Itemid');
  688. $Itemid = $Itemid ? '&amp;Itemid='.$Itemid : '';
  689. $db->setQuery("SELECT * FROM #__rsform_submissions WHERE SubmissionId='".$SubmissionId."'");
  690. $submission = $db->loadObject();
  691. $submission->values = array();
  692. $db->setQuery("SELECT FieldName, FieldValue FROM #__rsform_submission_values WHERE SubmissionId='".$SubmissionId."'");
  693. $fields = $db->loadObjectList();
  694. foreach ($fields as $field)
  695. $submission->values[$field->FieldName] = $field->FieldValue;
  696. unset($fields);
  697. $formId = $submission->FormId;
  698. $db->setQuery("SELECT * FROM #__rsform_forms WHERE FormId='".$formId."'");
  699. $form = $db->loadObject();
  700. $form->MultipleSeparator = str_replace(array('\n', '\r', '\t'), array("\n", "\r", "\t"), $form->MultipleSeparator);
  701. if (empty($submission->Lang))
  702. {
  703. if (!empty($form->Lang))
  704. $submission->Lang = $form->Lang;
  705. else
  706. {
  707. $lang = JFactory::getLanguage();
  708. $language = $lang->getDefault();
  709. $submission->Lang = $language;
  710. }
  711. $db->setQuery("UPDATE #__rsform_submissions SET Lang='".$db->escape($submission->Lang)."' WHERE SubmissionId='".$submission->SubmissionId."'");
  712. $db->execute();
  713. }
  714. $translations = RSFormProHelper::getTranslations('forms', $form->FormId, $submission->Lang);
  715. if ($translations)
  716. foreach ($translations as $field => $value)
  717. {
  718. if (isset($form->$field))
  719. $form->$field = $value;
  720. }
  721. $placeholders = array();
  722. $values = array();
  723. $db->setQuery("SELECT c.ComponentTypeId, p.ComponentId, p.PropertyName, p.PropertyValue FROM #__rsform_components c LEFT JOIN #__rsform_properties p ON (c.ComponentId=p.ComponentId) WHERE c.FormId='".$formId."' AND c.Published='1' AND p.PropertyName IN ('NAME', 'CAPTION', 'EMAILATTACH', 'WYSIWYG', 'ITEMS')");
  724. $components = $db->loadObjectList();
  725. $properties = array();
  726. $uploadFields = array();
  727. $multipleFields = array();
  728. $textareaFields = array();
  729. $userEmailUploads = array();
  730. $adminEmailUploads = array();
  731. $additionalEmailUploads = array();
  732. $additionalEmailUploadsIds = array();
  733. foreach ($components as $component)
  734. {
  735. // Upload fields - grab by NAME so that we can use it later on when checking $_FILES
  736. if ($component->ComponentTypeId == 9)
  737. {
  738. if ($component->PropertyName == 'EMAILATTACH')
  739. {
  740. $emailsvalues = $component->PropertyValue;
  741. $emailsvalues = trim($emailsvalues) != '' ? explode(',',$emailsvalues) : array();
  742. if (!empty($emailsvalues))
  743. foreach ($emailsvalues as $emailvalue)
  744. {
  745. if ($emailvalue == 'useremail' || $emailvalue == 'adminemail') continue;
  746. $additionalEmailUploadsIds[] = $emailvalue;
  747. }
  748. $additionalEmailUploadsIds = array_unique($additionalEmailUploadsIds);
  749. if (!empty($additionalEmailUploadsIds))
  750. foreach ($additionalEmailUploadsIds as $additionalEmailUploadsId)
  751. {
  752. if (in_array($additionalEmailUploadsId,$emailsvalues))
  753. $additionalEmailUploads[$additionalEmailUploadsId][] = $component->ComponentId;
  754. }
  755. }
  756. if ($component->PropertyName == 'NAME')
  757. $uploadFields[] = $component->PropertyValue;
  758. if ($component->PropertyName == 'EMAILATTACH' && !empty($component->PropertyValue))
  759. {
  760. $emailvalues = explode(',',$component->PropertyValue);
  761. if (in_array('useremail',$emailvalues))
  762. {
  763. $userEmailUploads[] = $component->ComponentId;
  764. //continue;
  765. }
  766. if (in_array('adminemail',$emailvalues))
  767. {
  768. $adminEmailUploads[] = $component->ComponentId;
  769. //continue;
  770. }
  771. }
  772. }
  773. // Multiple fields - grab by ComponentId for performance
  774. elseif (in_array($component->ComponentTypeId, array(3, 4)))
  775. {
  776. if ($component->PropertyName == 'NAME')
  777. $multipleFields[] = $component->ComponentId;
  778. }
  779. // Textarea fields - grab by ComponentId for performance
  780. elseif ($component->ComponentTypeId == 2)
  781. {
  782. if ($component->PropertyName == 'WYSIWYG' && $component->PropertyValue == 'NO')
  783. $textareaFields[] = $component->ComponentId;
  784. }
  785. $properties[$component->ComponentId][$component->PropertyName] = $component->PropertyValue;
  786. }
  787. // language
  788. $translations = RSFormProHelper::getTranslations('properties', $formId, $submission->Lang);
  789. foreach ($properties as $componentId => $componentProperties)
  790. {
  791. foreach ($componentProperties as $property => $value)
  792. {
  793. $reference_id = $componentId.'.'.$property;
  794. if (isset($translations[$reference_id]))
  795. $componentProperties[$property] = $translations[$reference_id];
  796. }
  797. $properties[$componentId] = $componentProperties;
  798. }
  799. $secret = $config->get('secret');
  800. foreach ($properties as $ComponentId => $property)
  801. {
  802. // {component:caption}
  803. $placeholders[] = '{'.$property['NAME'].':caption}';
  804. $values[] = isset($property['CAPTION']) ? $property['CAPTION'] : '';
  805. // {component:name}
  806. $placeholders[] = '{'.$property['NAME'].':name}';
  807. $values[] = $property['NAME'];
  808. // {component:value}
  809. $placeholders[] = '{'.$property['NAME'].':value}';
  810. $value = '';
  811. if (isset($submission->values[$property['NAME']]))
  812. {
  813. $value = $submission->values[$property['NAME']];
  814. // Check if this is an upload field
  815. if (in_array($property['NAME'], $uploadFields))
  816. $value = '<a href="'.JURI::root().'index.php?option=com_rsform&amp;task=submissions.view.file&amp;hash='.md5($submission->SubmissionId.$secret.$property['NAME']).$Itemid.'">'.basename($submission->values[$property['NAME']]).'</a>';
  817. // Check if this is a multiple field
  818. elseif (in_array($ComponentId, $multipleFields))
  819. $value = str_replace("\n", $form->MultipleSeparator, $value);
  820. elseif ($form->TextareaNewLines && in_array($ComponentId, $textareaFields))
  821. $value = nl2br($value);
  822. }
  823. $values[] = $value;
  824. if (isset($property['ITEMS'])) {
  825. $placeholders[] = '{'.$property['NAME'].':text}';
  826. if (isset($submission->values[$property['NAME']])) {
  827. $value = $submission->values[$property['NAME']];
  828. $all_values = explode("\n", $value);
  829. $all_texts = array();
  830. $items = RSFormProHelper::explode(RSFormProHelper::isCode($property['ITEMS']));
  831. $special = array('[c]', '[g]', '[d]');
  832. foreach ($all_values as $v => $value) {
  833. $all_texts[$v] = $value;
  834. foreach ($items as $item) {
  835. $item = str_replace($special, '', $item);
  836. @list($item_val, $item_text) = explode("|", $item, 2);
  837. if ($item_text && $item_val == $value)
  838. {
  839. $all_texts[$v] = $item_text;
  840. break;
  841. }
  842. }
  843. }
  844. if ($all_texts) {
  845. $values[] = implode($form->MultipleSeparator, $all_texts);
  846. } else {
  847. $values[] = $value;
  848. }
  849. } else {
  850. $values[] = '';
  851. }
  852. }
  853. // {component:path}
  854. // {component:localpath}
  855. if (in_array($property['NAME'], $uploadFields))
  856. {
  857. $placeholders[] = '{'.$property['NAME'].':path}';
  858. $placeholders[] = '{'.$property['NAME'].':localpath}';
  859. if (isset($submission->values[$property['NAME']])) {
  860. $filepath = $submission->values[$property['NAME']];
  861. $filepath = substr_replace($filepath, JURI::root(), 0, strlen(JPATH_SITE)+1);
  862. $filepath = str_replace(array('\\', '\\/', '//\\'), '/', $filepath);
  863. $values[] = $filepath;
  864. $values[] = $submission->values[$property['NAME']];
  865. }
  866. else {
  867. $values[] = '';
  868. $values[] = '';
  869. }
  870. }
  871. }
  872. $placeholders[] = '{_STATUS:value}';
  873. $values[] = isset($submission->values['_STATUS']) ? JText::_('RSFP_PAYPAL_STATUS_'.$submission->values['_STATUS']) : '';
  874. $placeholders[] = '{_ANZ_STATUS:value}';
  875. $values[] = isset($submission->values['_ANZ_STATUS']) ? JText::_('RSFP_ANZ_STATUS_'.$submission->values['_ANZ_STATUS']) : '';
  876. $user = JFactory::getUser($submission->UserId);
  877. if (empty($user->id))
  878. $user = JFactory::getUser(0);
  879. $root = $mainframe->isAdmin() ? JURI::root() : $u->toString(array('scheme','host', 'port'));
  880. $confirmation_hash = md5($submission->SubmissionId.$formId.$submission->DateSubmitted);
  881. $hash_link = 'index.php?option=com_rsform&task=confirm&hash='.$confirmation_hash;
  882. $confirmation = $root.($mainframe->isAdmin() ? $hash_link : JRoute::_($hash_link));
  883. if (!$skip_globals)
  884. {
  885. array_push($placeholders, '{global:username}', '{global:userid}', '{global:useremail}', '{global:fullname}', '{global:userip}', '{global:date_added}', '{global:sitename}', '{global:siteurl}','{global:confirmation}','{global:submissionid}', '{global:submission_id}');
  886. array_push($values, $user->username, $user->id, $user->email, $user->name, isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '', RSFormProHelper::getDate($submission->DateSubmitted), $config->get('sitename'), JURI::root(),$confirmation, $submission->SubmissionId, $submission->SubmissionId);
  887. }
  888. $mainframe->triggerEvent('rsfp_onAfterCreatePlaceholders', array(array('form' => &$form, 'placeholders' => &$placeholders, 'values' => &$values, 'submission' => $submission)));
  889. if ($only_return_replacements)
  890. return array($placeholders, $values);
  891. $userEmail = array(
  892. 'to' => str_replace($placeholders, $values, $form->UserEmailTo),
  893. 'cc' => str_replace($placeholders, $values, $form->UserEmailCC),
  894. 'bcc' => str_replace($placeholders, $values, $form->UserEmailBCC),
  895. 'from' => str_replace($placeholders, $values, $form->UserEmailFrom),
  896. 'replyto' => str_replace($placeholders, $values, $form->UserEmailReplyTo),
  897. 'fromName' => str_replace($placeholders, $values, $form->UserEmailFromName),
  898. 'text' => str_replace($placeholders, $values, $form->UserEmailText),
  899. 'subject' => str_replace($placeholders, $values, $form->UserEmailSubject),
  900. 'mode' => $form->UserEmailMode,
  901. 'files' => array()
  902. );
  903. // user cc
  904. if (strpos($userEmail['cc'], ',') !== false)
  905. $userEmail['cc'] = explode(',', $userEmail['cc']);
  906. // user bcc
  907. if (strpos($userEmail['bcc'], ',') !== false)
  908. $userEmail['bcc'] = explode(',', $userEmail['bcc']);
  909. jimport('joomla.filesystem.file');
  910. $file = str_replace($placeholders, $values, $form->UserEmailAttachFile);
  911. if ($form->UserEmailAttach && JFile::exists($file))
  912. $userEmail['files'][] = $file;
  913. // Need to attach files
  914. // User Email
  915. foreach ($userEmailUploads as $componentId)
  916. {
  917. $name = $properties[$componentId]['NAME'];
  918. if (!empty($submission->values[$name]))
  919. $userEmail['files'][] = $submission->values[$name];
  920. }
  921. $adminEmail = array(
  922. 'to' => str_replace($placeholders, $values, $form->AdminEmailTo),
  923. 'cc' => str_replace($placeholders, $values, $form->AdminEmailCC),
  924. 'bcc' => str_replace($placeholders, $values, $form->AdminEmailBCC),
  925. 'from' => str_replace($placeholders, $values, $form->AdminEmailFrom),
  926. 'replyto' => str_replace($placeholders, $values, $form->AdminEmailReplyTo),
  927. 'fromName' => str_replace($placeholders, $values, $form->AdminEmailFromName),
  928. 'text' => str_replace($placeholders, $values, $form->AdminEmailText),
  929. 'subject' => str_replace($placeholders, $values, $form->AdminEmailSubject),
  930. 'mode' => $form->AdminEmailMode,
  931. 'files' => array()
  932. );
  933. // admin cc
  934. if (strpos($adminEmail['cc'], ',') !== false)
  935. $adminEmail['cc'] = explode(',', $adminEmail['cc']);
  936. // admin bcc
  937. if (strpos($adminEmail['bcc'], ',') !== false)
  938. $adminEmail['bcc'] = explode(',', $adminEmail['bcc']);
  939. // Admin Email
  940. foreach ($adminEmailUploads as $componentId)
  941. {
  942. $name = $properties[$componentId]['NAME'];
  943. if (!empty($submission->values[$name]))
  944. $adminEmail['files'][] = $submission->values[$name];
  945. }
  946. $mainframe->triggerEvent('rsfp_beforeUserEmail', array(array('form' => &$form, 'placeholders' => &$placeholders, 'values' => &$values, 'submissionId' => $SubmissionId, 'userEmail'=>&$userEmail)));
  947. // Script called before the User Email is sent.
  948. eval($form->UserEmailScript);
  949. // mail users
  950. $recipients = explode(',',$userEmail['to']);
  951. if(!empty($recipients))
  952. foreach($recipients as $recipient)
  953. if(!empty($recipient))
  954. RSFormProHelper::sendMail($userEmail['from'], $userEmail['fromName'], $recipient, $userEmail['subject'], $userEmail['text'], $userEmail['mode'], !empty($userEmail['cc']) ? $userEmail['cc'] : null, !empty($userEmail['bcc']) ? $userEmail['bcc'] : null, $userEmail['files'], !empty($userEmail['replyto']) ? $userEmail['replyto'] : '');
  955. $mainframe->triggerEvent('rsfp_beforeAdminEmail', array(array('form' => &$form, 'placeholders' => &$placeholders, 'values' => &$values, 'submissionId' => $SubmissionId, 'adminEmail'=>&$adminEmail)));
  956. // Script called before the Admin Email is sent.
  957. eval($form->AdminEmailScript);
  958. //mail admins
  959. $recipients = explode(',',$adminEmail['to']);
  960. if(!empty($recipients))
  961. foreach($recipients as $recipient)
  962. if(!empty($recipient))
  963. RSFormProHelper::sendMail($adminEmail['from'], $adminEmail['fromName'], $recipient, $adminEmail['subject'], $adminEmail['text'], $adminEmail['mode'], !empty($adminEmail['cc']) ? $adminEmail['cc'] : null, !empty($adminEmail['bcc']) ? $adminEmail['bcc'] : null, $adminEmail['files'], !empty($adminEmail['replyto']) ? $adminEmail['replyto'] : '');
  964. //additional emails
  965. $db->setQuery("SELECT * FROM #__rsform_emails WHERE formId = ".$formId." ");
  966. $emails = $db->loadObjectList();
  967. $etranslations = RSFormProHelper::getTranslations('emails', $formId, $submission->Lang);
  968. if (!empty($emails))
  969. foreach ($emails as $email)
  970. {
  971. if (empty($email->from) || empty($email->fromname) || empty($email->subject) || empty($email->message)) continue;
  972. $fromname = isset($etranslations[$email->id.'.fromname']) ? $etranslations[$email->id.'.fromname'] : $email->fromname;
  973. $subject = isset($etranslations[$email->id.'.subject']) ? $etranslations[$email->id.'.subject'] : $email->subject;
  974. $message = isset($etranslations[$email->id.'.message']) ? $etranslations[$email->id.'.message'] : $email->message;
  975. $additionalEmail = array(
  976. 'to' => str_replace($placeholders, $values, $email->to),
  977. 'cc' => str_replace($placeholders, $values, $email->cc),
  978. 'bcc' => str_replace($placeholders, $values, $email->bcc),
  979. 'from' => str_replace($placeholders, $values, $email->from),
  980. 'replyto' => str_replace($placeholders, $values, $email->replyto),
  981. 'fromName' => str_replace($placeholders, $values, $fromname),
  982. 'text' => str_replace($placeholders, $values, $message),
  983. 'subject' => str_replace($placeholders, $values, $subject),
  984. 'mode' => $email->mode,
  985. 'files' => array()
  986. );
  987. if (!empty($additionalEmailUploads))
  988. foreach ($additionalEmailUploads as $additionalEmailId => $additionalEmailUpload)
  989. {
  990. if ($additionalEmailId == $email->id)
  991. foreach ($additionalEmailUpload as $componentId)
  992. {
  993. $name = $properties[$componentId]['NAME'];
  994. if (!empty($submission->values[$name]))
  995. $additionalEmail['files'][] = $submission->values[$name];
  996. }
  997. }
  998. // additional cc
  999. if (strpos($additionalEmail['cc'], ',') !== false)
  1000. $additionalEmail['cc'] = explode(',', $additionalEmail['cc']);
  1001. // additional bcc
  1002. if (strpos($additionalEmail['bcc'], ',') !== false)
  1003. $additionalEmail['bcc'] = explode(',', $additionalEmail['bcc']);
  1004. $mainframe->triggerEvent('rsfp_beforeAdditionalEmail', array(array('form' => &$form, 'placeholders' => &$placeholders, 'values' => &$values, 'submissionId' => $SubmissionId, 'additionalEmail'=>&$additionalEmail)));
  1005. eval($form->AdditionalEmailsScript);
  1006. // mail users
  1007. $recipients = explode(',',$additionalEmail['to']);
  1008. if(!empty($recipients))
  1009. foreach($recipients as $recipient)
  1010. if(!empty($recipient))
  1011. RSFormProHelper::sendMail($additionalEmail['from'], $additionalEmail['fromName'], $recipient, $additionalEmail['subject'], $additionalEmail['text'], $additionalEmail['mode'], !empty($additionalEmail['cc']) ? $additionalEmail['cc'] : null, !empty($additionalEmail['bcc']) ? $additionalEmail['bcc'] : null, $additionalEmail['files'], !empty($additionalEmail['replyto']) ? $additionalEmail['replyto'] : '');
  1012. }
  1013. return array($placeholders, $values);
  1014. }
  1015. public static function escapeArray(&$val, &$key)
  1016. {
  1017. $db = JFactory::getDBO();
  1018. $val = $db->escape($val);
  1019. $key = $db->escape($key);
  1020. }
  1021. public static function componentExists($formId, $componentTypeId)
  1022. {
  1023. $formId = (int) $formId;
  1024. $db = JFactory::getDBO();
  1025. if (is_array($componentTypeId))
  1026. {
  1027. JArrayHelper::toInteger($componentTypeId);
  1028. $db->setQuery("SELECT ComponentId FROM #__rsform_components WHERE ComponentTypeId IN (".implode(',', $componentTypeId).") AND FormId='".$formId."' AND Published='1'");
  1029. }
  1030. else
  1031. {
  1032. $componentTypeId = (int) $componentTypeId;
  1033. $db->setQuery("SELECT ComponentId FROM #__rsform_components WHERE ComponentTypeId='".$componentTypeId."' AND FormId='".$formId."' AND Published='1'");
  1034. }
  1035. return $db->loadColumn();
  1036. }
  1037. public static function cleanCache()
  1038. {
  1039. $cache = JCache::getInstance('page');
  1040. $id = $cache->makeId();
  1041. if ($handler = $cache->_getStorage()) {
  1042. $handler->remove($id, 'page');
  1043. }
  1044. // Test this
  1045. // $cache->clean();
  1046. }
  1047. public static function loadTheme($form)
  1048. {
  1049. jimport('joomla.html.parameter');
  1050. $doc = JFactory::getDocument();
  1051. $registry = new JRegistry();
  1052. $registry->loadString($form->ThemeParams, 'INI');
  1053. $form->ThemeParams =& $registry;
  1054. if ($form->ThemeParams->get('num_css', 0) > 0)
  1055. for ($i=0; $i<$form->ThemeParams->get('num_css'); $i++)
  1056. {
  1057. $css = $form->ThemeParams->get('css'.$i);
  1058. $doc->addStyleSheet(JURI::root(true).'/components/com_rsform/assets/themes/'.$form->ThemeParams->get('name').'/'.$css);
  1059. }
  1060. if ($form->ThemeParams->get('num_js', 0) > 0)
  1061. for ($i=0; $i<$form->ThemeParams->get('num_js'); $i++)
  1062. {
  1063. $js = $form->ThemeParams->get('js'.$i);
  1064. $doc->addScript(JURI::root(true).'/components/com_rsform/assets/themes/'.$form->ThemeParams->get('name').'/'.$js);
  1065. }
  1066. }
  1067. // conditions
  1068. public static function getConditions($formId, $lang=null)
  1069. {
  1070. $db = JFactory::getDBO();
  1071. if (!$lang)
  1072. $lang = RSFormProHelper::getCurrentLanguage();
  1073. // get all conditions
  1074. $db->setQuery("SELECT c.*,p.PropertyValue AS ComponentName FROM `#__rsform_conditions` c LEFT JOIN #__rsform_properties p ON (c.component_id = p.ComponentId) LEFT JOIN #__rsform_components comp ON (comp.ComponentId=p.ComponentId) WHERE c.`form_id` = ".$formId." AND c.lang_code='".$db->escape($lang)."' AND comp.Published = 1 AND p.PropertyName='NAME' ORDER BY c.`id` ASC");
  1075. if ($conditions = $db->loadObjectList())
  1076. {
  1077. // put them all in an array so we can use only one query
  1078. $cids = array();
  1079. foreach ($conditions as $condition)
  1080. $cids[] = $condition->id;
  1081. // get details
  1082. $db->setQuery("SELECT d.*,p.PropertyValue AS ComponentName FROM #__rsform_condition_details d LEFT JOIN #__rsform_properties p ON (d.component_id = p.ComponentId) LEFT JOIN #__rsform_components comp ON (comp.ComponentId=p.ComponentId) WHERE d.condition_id IN (".implode(",", $cids).") AND comp.Published = 1 AND p.PropertyName='NAME'");
  1083. $details = $db->loadObjectList();
  1084. // arrange details within conditions
  1085. foreach ($conditions as $i => $condition)
  1086. {
  1087. $condition->details = array();
  1088. foreach ($details as $detail)
  1089. {
  1090. if ($detail->condition_id != $condition->id) continue;
  1091. $condition->details[] = $detail;
  1092. }
  1093. $conditions[$i] = $condition;
  1094. }
  1095. // all done
  1096. return $conditions;
  1097. }
  1098. // nothing found
  1099. return false;
  1100. }
  1101. public static function showForm($formId, $val='', $validation=array())
  1102. {
  1103. $mainframe = JFactory::getApplication();
  1104. $formId = (int) $formId;
  1105. $db = JFactory::getDBO();
  1106. $doc = JFactory::getDocument();
  1107. $db->setQuery("SELECT `FormId`, `FormLayoutName`, `FormLayout`, `ScriptDisplay`, `ErrorMessage`, `FormTitle`, `CSS`, `JS`, `CSSClass`, `CSSId`, `CSSName`, `CSSAction`, `CSSAdditionalAttributes`, `AjaxValidation`, `ThemeParams` FROM #__rsform_forms WHERE FormId='".$formId."' AND `Published`='1'");
  1108. $form = $db->loadObject();
  1109. $lang = RSFormProHelper::getCurrentLanguage();
  1110. $translations = RSFormProHelper::getTranslations('forms', $form->FormId, $lang);
  1111. if ($translations)
  1112. foreach ($translations as $field => $value)
  1113. {
  1114. if (isset($form->$field))
  1115. $form->$field = $value;
  1116. }
  1117. if ($form->JS)
  1118. $doc->addCustomTag($form->JS);
  1119. if ($form->CSS)
  1120. $doc->addCustomTag($form->CSS);
  1121. if ($form->ThemeParams)
  1122. RSFormProHelper::loadTheme($form);
  1123. $doc->addStyleSheet(JURI::root(true).'/components/com_rsform/assets/css/front.css');
  1124. if ($doc->getDirection() == 'rtl')
  1125. $doc->addStyleSheet(JURI::root(true).'/components/com_rsform/assets/css/front-rtl.css');
  1126. $doc->addScript(JURI::root(true).'/components/com_rsform/assets/js/script.js');
  1127. $calendars = RSFormProHelper::componentExists($formId, 6); //6 is the componentTypeId for calendar
  1128. if(!empty($calendars))
  1129. {
  1130. $doc->addStyleSheet(JURI::root(true).'/components/com_rsform/assets/calendar/calendar.css');
  1131. $hidden = JRequest::getVar('hidden');
  1132. $all_data = RSFormProHelper::getComponentProperties($calendars);
  1133. foreach($calendars as $i => $calendarComponentId)
  1134. {
  1135. $data = $all_data[$calendarComponentId];
  1136. $calendars['CALENDARLAYOUT'][$i] = $data['CALENDARLAYOUT'];
  1137. $calendars['DATEFORMAT'][$i] = $data['DATEFORMAT'];
  1138. $calendars['VALUES'][$i] = '';
  1139. $calendars['EXTRA'][$i] = array();
  1140. if (!empty($hidden[$data['NAME']]))
  1141. $calendars['VALUES'][$i] = preg_replace('#[^0-9\/]+#i', '', $hidden[$data['NAME']]);
  1142. if (!empty($data['MINDATE']))
  1143. $calendars['EXTRA'][$i][] = "'mindate': '".$data['MINDATE']."'";
  1144. if (!empty($data['MAXDATE']))
  1145. $calendars['EXTRA'][$i][] = "'maxdate': '".$data['MAXDATE']."'";
  1146. $calendars['EXTRA'][$i] = '{'.implode(', ', $calendars['EXTRA'][$i]).'}';
  1147. }
  1148. unset($all_data);
  1149. $calendarsLayout = "'".implode("','", $calendars['CALENDARLAYOUT'])."'";
  1150. $calendarsFormat = "'".implode("','", $calendars['DATEFORMAT'])."'";
  1151. $calendarsValues = "'".implode("','", $calendars['VALUES'])."'";
  1152. $calendarsExtra = implode(',', $calendars['EXTRA']);
  1153. }
  1154. $formLayout = $form->FormLayout;
  1155. unset($form->FormLayout);
  1156. $errorMessage = $form->ErrorMessage;
  1157. unset($form->ErrorMessage);
  1158. $db->setQuery("SELECT p.PropertyValue AS name, c.ComponentId, c.ComponentTypeId, ct.ComponentTypeName, c.Order FROM #__rsform_properties p LEFT JOIN #__rsform_components c ON (c.ComponentId=p.ComponentId) LEFT JOIN #__rsform_component_types ct ON (ct.ComponentTypeId=c.ComponentTypeId) WHERE c.FormId='".$formId."' AND p.PropertyName='NAME' AND c.Published='1' ORDER BY c.Order");
  1159. $components = $db->loadObjectList();
  1160. $pages = array();
  1161. $page_progress = array();
  1162. $submits = array();
  1163. foreach ($components as $component)
  1164. {
  1165. if ($component->ComponentTypeId == 41)
  1166. $pages[] = $component->ComponentId;
  1167. elseif ($component->ComponentTypeId == 13)
  1168. $submits[] = $component->ComponentId;
  1169. }
  1170. $start_page = 0;
  1171. if (!empty($validation))
  1172. foreach ($components as $component)
  1173. {
  1174. if (in_array($component->ComponentId, $validation))
  1175. break;
  1176. if ($component->ComponentTypeId == 41)
  1177. $start_page++;
  1178. }
  1179. $find = array();
  1180. $replace = array();
  1181. $all_data = RSFormProHelper::getComponentProperties($components);
  1182. foreach ($components as $component)
  1183. {
  1184. $data = $all_data[$component->ComponentId];
  1185. $data['componentTypeId'] = $component->ComponentTypeId;
  1186. $data['ComponentTypeName'] = $component->ComponentTypeName;
  1187. $data['Order'] = $component->Order;
  1188. // Pagination
  1189. if ($component->ComponentTypeId == 41)
  1190. {
  1191. $data['PAGES'] = $pages;
  1192. $page_progress[] = array('show' => @$data['DISPLAYPROGRESS'] == 'YES', 'text' => @$data['DISPLAYPROGRESSMSG']);
  1193. }
  1194. elseif ($component->ComponentTypeId == 13)
  1195. {
  1196. $data['SUBMITS'] = $submits;
  1197. if ($component->ComponentId == end($submits))
  1198. $page_progress[] = array('show' => @$data['DISPLAYPROGRESS'] == 'YES', 'text' => @$data['DISPLAYPROGRESSMSG']);
  1199. }
  1200. // Caption
  1201. $find[] = '{'.$component->name.':caption}';
  1202. $caption = '';
  1203. if (isset($data['SHOW']) && $data['SHOW'] == 'NO')
  1204. $caption = '';
  1205. elseif (isset($data['CAPTION']))
  1206. $caption = $data['CAPTION'];
  1207. $replace[] = $caption;
  1208. // Body
  1209. $find[] = '{'.$component->name.':body}';
  1210. $replace[] = RSFormProHelper::getFrontComponentBody($formId, $component->ComponentId, $data, $val, in_array($component->ComponentId,$validation), $form->FormLayoutName);
  1211. // Description
  1212. $find[] = '{'.$component->name.':description}';
  1213. $description = '';
  1214. if (isset($data['SHOW']) && $data['SHOW'] == 'NO')
  1215. $description = '';
  1216. elseif (isset($data['DESCRIPTION']))
  1217. $description = $data['DESCRIPTION'];
  1218. $replace[] = $description;
  1219. // Validation message
  1220. $find[] = '{'.$component->name.':validation}';
  1221. $validationMessage = '';
  1222. if (isset($data['SHOW']) && $data['SHOW'] == 'NO')
  1223. $validationMessage = '';
  1224. elseif (isset($data['VALIDATIONMESSAGE']))
  1225. {
  1226. if(!empty($validation) && in_array($component->ComponentId,$validation))
  1227. $validationMessage = '<span id="component'.$component->ComponentId.'" class="formError">'.$data['VALIDATIONMESSAGE'].'</span>';
  1228. else
  1229. $validationMessage = '<span id="component'.$component->ComponentId.'" class="formNoError">'.$data['VALIDATIONMESSAGE'].'</span>';
  1230. }
  1231. $replace[] = $validationMessage;
  1232. }
  1233. unset($all_data);
  1234. $u = RSFormProHelper::getURL();
  1235. //Trigger Event - onInitFormDisplay
  1236. $mainframe->triggerEvent('rsfp_f_onInitFormDisplay',array(array('find'=>&$find,'replace'=>&$replace,'formLayout'=>&$formLayout)));
  1237. $user = JFactory::getUser();
  1238. $jconfig = JFactory::getConfig();
  1239. array_push($find, '{global:formtitle}', '{global:username}', '{global:userip}', '{global:userid}', '{global:useremail}', '{global:fullname}', '{global:sitename}', '{global:siteurl}');
  1240. array_push($replace, $form->FormTitle, $user->get('username'), isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '', $user->get('id'), $user->get('email'), $user->get('name'), $jconfig->get('sitename'), JURI::root());
  1241. $formLayout = str_replace($find,$replace,$formLayout);
  1242. if (strpos($formLayout, 'class="formError"') !== false)
  1243. $formLayout = str_replace('{error}', $errorMessage, $formLayout);
  1244. elseif ($form->AjaxValidation)
  1245. $formLayout = str_replace('{error}', '<div id="rsform_error_'.$formId.'" style="display: none;">'.$errorMessage.'</div>', $formLayout);
  1246. else
  1247. $formLayout = str_replace('{error}', '', $formLayout);
  1248. $formLayout.= '<input type="hidden" name="form[formId]" value="'.$formId.'"/>';
  1249. if ($form->FormLayoutName == 'responsive')
  1250. {
  1251. $form->CSSClass .= ' formResponsive';
  1252. if (RSFormProHelper::getConfig('auto_responsive'))
  1253. {
  1254. $doc->addCustomTag('<meta name="viewport" content="width=device-width, initial-scale=1.0">');
  1255. $mainframe->registerEvent('onAfterRender', '_modifyResponsiveTemplate');
  1256. }
  1257. }
  1258. $CSSClass = $form->CSSClass ? ' class="'.RSFormProHelper::htmlEscape(trim($form->CSSClass)).'"' : '';
  1259. $CSSId = $form->CSSId ? ' id="'.RSFormProHelper::htmlEscape(trim($form->CSSId)).'"' : '';
  1260. $CSSName = $form->CSSName ? ' name="'.RSFormProHelper::htmlEscape(trim($form->CSSName)).'"' : '';
  1261. $u = $form->CSSAction ? RSFormProHelper::htmlEscape($form->CSSAction) : $u;
  1262. $CSSAdditionalAttributes = $form->CSSAdditionalAttributes ? ' '.trim($form->CSSAdditionalAttributes) : '';
  1263. if (!empty($pages))
  1264. {
  1265. $total_pages = count($pages)+1;
  1266. $step = floor(100/$total_pages);
  1267. $replace_progress = array('{page}', '{total}', '{percent}');
  1268. $with_progress = array(1, $total_pages, $step*1);
  1269. $progress = reset($page_progress);
  1270. $progress_script = '';
  1271. $formLayout = '<div id="rsform_progress_'.$formId.'" class="rsformProgress">'.($progress['show'] ? str_replace($replace_progress, $with_progress, $progress['text']) : '').'</div>'."\n".$formLayout;
  1272. foreach ($page_progress as $p => $progress)
  1273. {
  1274. $progress['text'] = str_replace(array("\r", "\n"), array('', '\n'), addcslashes($progress['text'], "'"));
  1275. $replace_progress = array('{page}', '{total}', '{percent}');
  1276. $with_progress = array($p+1, $total_pages, $p+1 == $total_pages ? 100 : $step*($p+1));
  1277. $progress_script .= "if (page == ".$p.") document.getElementById('rsform_progress_".$formId."').innerHTML = '".($progress['show'] ? str_replace($replace_progress, $with_progress, $progress['text']) : '')."';";
  1278. }
  1279. $formLayout .= "\n".'<script type="text/javascript">'."\n".'function rsfp_showProgress_'.$formId.'(page) {'."\n".$progress_script."\n".'}'."\n".'</script>';
  1280. }
  1281. $formLayout = '<form method="post" '.$CSSId.$CSSClass.$CSSName.$CSSAdditionalAttributes.' enctype="multipart/form-data" action="'.RSFormProHelper::htmlEscape($u).'">'.$formLayout.'</form>';
  1282. if(!empty($calendars))
  1283. {
  1284. $formLayout .= "\n".'<script type="text/javascript" src="'.JURI::root(true).'/components/com_rsform/assets/calendar/cal.js"></script>'."\n";
  1285. $formLayout .= '<script type="text/javascript">'.RSFormProHelper::getCalendarJS().'</script>'."\n";
  1286. $formLayout .= '<script type="text/javascript" defer="defer">rsf_CALENDAR.util.Event.addListener(window, "load", rsfp_init('.$formId.',{ layouts: Array('.$calendarsLayout.'), formats: Array('.$calendarsFormat.'), values: Array('.$calendarsValues.'), extra: Array('.$calendarsExtra.') }));</script>'."\n";
  1287. }
  1288. if (!empty($pages))
  1289. {
  1290. $formLayout .= '<script type="text/javascript" src="'.JURI::root(true).'/components/com_rsform/assets/js/pages.js"></script>'."\n";
  1291. $formLayout .= '<script type="text/javascript">rsfp_changePage('.$formId.', '.$start_page.', '.count($pages).')</script>'."\n";
  1292. }
  1293. if ($form->AjaxValidation || !empty($pages))
  1294. $formLayout .= '<script type="text/javascript">var rsfp_ajax_root = \''.addslashes(JURI::root(true)).'\'</script>';
  1295. if ($form->AjaxValidation)
  1296. $formLayout .= '<script type="text/javascript">rsfp_addEvent(window, \'load\', function(){var form = rsfp_getForm('.$formId.'); form.onsubmit = ajaxValidation;});</script>';
  1297. $ajaxScript = '';
  1298. $mainframe->triggerEvent('rsfp_f_onAJAXScriptCreate', array(array('script' => &$ajaxScript, 'formId' => $formId)));
  1299. $formLayout .= '<script type="text/javascript">';
  1300. $formLayout .= 'ajaxExtraValidationScript['.$formId.'] = function(task, formId, data) {';
  1301. $formLayout .= 'var formComponents = {};';
  1302. foreach ($components as $component) {
  1303. if (in_array($component->ComponentTypeId, array(7, 9, 10, 11, 12, 13, 15, 41))) {
  1304. continue;
  1305. }
  1306. $formLayout .= "formComponents[".$component->ComponentId."]='".$component->name."';";
  1307. }
  1308. $formLayout .= "if (task == 'afterSend') {";
  1309. $formLayout .= "
  1310. var ids = data.response[0].split(',');
  1311. for (var i=0; i<ids.length; i++) {
  1312. var id = parseInt(ids[i]);
  1313. if (!isNaN(id) && typeof formComponents[id] != 'undefined') {
  1314. var formComponent = rsfp_getFieldsByName(formId, formComponents[id]);
  1315. if (formComponent && formComponent.length > 0) {
  1316. for (var j=0; j<formComponent.length; j++) {
  1317. formComponent[j].className = formComponent[j].className.replace(' rsform-error', '');
  1318. }
  1319. }
  1320. }
  1321. }
  1322. var ids = data.response[1].split(',');
  1323. for (var i=0; i<ids.length; i++) {
  1324. var id = parseInt(ids[i]);
  1325. if (!isNaN(id) && typeof formComponents[id] != 'undefined') {
  1326. var formComponent = rsfp_getFieldsByName(formId, formComponents[id]);
  1327. if (formComponent && formComponent.length > 0) {
  1328. for (var j=0; j<formComponent.length; j++) {
  1329. formComponent[j].className = formComponent[j].className.replace(' rsform-error', '') + ' rsform-error';
  1330. }
  1331. }
  1332. }
  1333. }
  1334. ";
  1335. $formLayout .= "}\n";
  1336. // has this been modified?
  1337. if ($ajaxScript) {
  1338. $formLayout .= $ajaxScript;
  1339. }
  1340. $formLayout .= '}';
  1341. $formLayout .= '</script>';
  1342. if ($conditions = RSFormProHelper::getConditions($formId))
  1343. {
  1344. $formLayout .= '<script type="text/javascript">';
  1345. foreach ($conditions as $condition)
  1346. {
  1347. $formLayout .= "\n".'function rsfp_runCondition'.$condition->id.'(){';
  1348. if ($condition->details)
  1349. {
  1350. $condition_vars = array();
  1351. foreach ($condition->details as $detail)
  1352. {
  1353. $formLayout .= "\n"."isChecked = rsfp_verifyChecked(".$formId.", '".addslashes($detail->ComponentName)."', '".addslashes($detail->value)."');";
  1354. $formLayout .= "\n"."condition".$detail->id." = isChecked == ".($detail->operator == 'is' ? 'true' : 'false').";";
  1355. $condition_vars[] = "condition".$detail->id;
  1356. }
  1357. if ($condition->block)
  1358. {
  1359. $block = JFilterOutput::stringURLSafe($condition->ComponentName);
  1360. $formLayout .= "\n"."items = rsfp_getBlock(".$formId.", '".addslashes($block)."');";
  1361. }
  1362. else
  1363. {
  1364. $formLayout .= "\n"."items = rsfp_getFieldsByName(".$formId.", '".addslashes($condition->ComponentName)."');";
  1365. }
  1366. $formLayout .= "\n"."if (items) {";
  1367. $formLayout .= "\n"."if (".implode($condition->condition == 'all' ? '&&' : '||', $condition_vars).")";
  1368. $formLayout .= "\n"."rsfp_setDisplay(items, '".($condition->action == 'show' ? '' : 'none')."');";
  1369. $formLayout .= "\n".'else';
  1370. $formLayout .= "\n"."rsfp_setDisplay(items, '".($condition->action == 'show' ? 'none' : '')."');";
  1371. $formLayout .= "\n"."}";
  1372. }
  1373. $formLayout .= "\n".'}';
  1374. $formLayout .= "\n".'rsfp_runCondition'.$condition->id.'();';
  1375. if ($condition->details)
  1376. foreach ($condition->details as $detail)
  1377. {
  1378. $formLayout .= "\n"."rsfp_addCondition(".$formId.", '".addslashes($detail->ComponentName)."', rsfp_runCondition".$condition->id.");";
  1379. }
  1380. }
  1381. $formLayout .= "\n".'</script>';
  1382. }
  1383. $RSadapter = RSFormProHelper::getLegacyAdapter();
  1384. eval($form->ScriptDisplay);
  1385. //Trigger Event - onBeforeFormDisplay
  1386. $mainframe->triggerEvent('rsfp_f_onBeforeFormDisplay', array(array('formLayout'=>&$formLayout,'formId'=>$formId)));
  1387. return $formLayout;
  1388. }
  1389. public static function showThankYouMessage($formId)
  1390. {
  1391. $mainframe = JFactory::getApplication();
  1392. $output = '';
  1393. $formId = (int) $formId;
  1394. $db = JFactory::getDBO();
  1395. $db->setQuery("SELECT ThemeParams FROM #__rsform_forms WHERE FormId='".$formId."'");
  1396. $form = $db->loadObject();
  1397. if ($form->ThemeParams)
  1398. RSFormProHelper::loadTheme($form);
  1399. $session = JFactory::getSession();
  1400. $formparams = $session->get('com_rsform.formparams.'.$formId);
  1401. $output = base64_decode($formparams->thankYouMessage);
  1402. // Clear
  1403. $session->clear('com_rsform.formparams.'.$formId);
  1404. //Trigger Event - onAfterShowThankyouMessage
  1405. $mainframe->triggerEvent('rsfp_f_onAfterShowThankyouMessage', array(array('output'=>&$output,'formId'=>&$formId)));
  1406. // Cache enabled ?
  1407. jimport('joomla.plugin.helper');
  1408. $cache_enabled = JPluginHelper::isEnabled('system', 'cache');
  1409. if ($cache_enabled)
  1410. RSFormProHelper::cleanCache();
  1411. return $output;
  1412. }
  1413. public static function processForm($formId)
  1414. {
  1415. $mainframe = JFactory::getApplication();
  1416. $formId = (int) $formId;
  1417. $db = JFactory::getDBO();
  1418. $db->setQuery("SELECT `Keepdata`, `ConfirmSubmission`, `ScriptProcess`, `ScriptProcess2`, `UserEmailScript`, `AdminEmailScript`, `ReturnUrl`, `ShowThankyou`, `Thankyou`, `ShowContinue` FROM #__rsform_forms WHERE `FormId`='".$formId."'");
  1419. $form = $db->loadObject();
  1420. $lang = RSFormProHelper::getCurrentLanguage();
  1421. $translations = RSFormProHelper::getTranslations('forms', $formId, $lang);
  1422. if ($translations)
  1423. foreach ($translations as $field => $value)
  1424. {
  1425. if (isset($form->$field))
  1426. $form->$field = $value;
  1427. }
  1428. $invalid = RSFormProHelper::validateForm($formId);
  1429. $post = JRequest::getVar('form', array(), 'post', 'none', JREQUEST_ALLOWRAW);
  1430. //Trigger Event - onBeforeFormValidation
  1431. $mainframe->triggerEvent('rsfp_f_onBeforeFormValidation', array(array('invalid'=>&$invalid, 'formId' => $formId, 'post' => &$post)));
  1432. $userEmail=array(
  1433. 'to'=>'',
  1434. 'cc'=>'',
  1435. 'bcc'=>'',
  1436. 'from'=>'',
  1437. 'replyto'=>'',
  1438. 'fromName'=>'',
  1439. 'text'=>'',
  1440. 'subject'=>'',
  1441. 'files' =>array()
  1442. );
  1443. $adminEmail=array(
  1444. 'to'=>'',
  1445. 'cc'=>'',
  1446. 'bcc'=>'',
  1447. 'from'=>'',
  1448. 'replyto'=>'',
  1449. 'fromName'=>'',
  1450. 'text'=>'',
  1451. 'subject'=>'',
  1452. 'files' =>array()
  1453. );
  1454. $_POST['form'] = $post;
  1455. $RSadapter = RSFormProHelper::getLegacyAdapter();
  1456. eval($form->ScriptProcess);
  1457. if (!empty($invalid))
  1458. return $invalid;
  1459. $post = $_POST['form'];
  1460. //Trigger Event - onBeforeFormProcess
  1461. $mainframe->triggerEvent('rsfp_f_onBeforeFormProcess', array(array('post' => &$post)));
  1462. if (empty($invalid))
  1463. {
  1464. // Cache enabled ?
  1465. jimport('joomla.plugin.helper');
  1466. $cache_enabled = JPluginHelper::isEnabled('system', 'cache');
  1467. if ($cache_enabled)
  1468. RSFormProHelper::cleanCache();
  1469. $user = JFactory::getUser();
  1470. $confirmsubmission = $form->ConfirmSubmission ? 0 : 1;
  1471. // Add to db (submission)
  1472. $date = JFactory::getDate();
  1473. $db->setQuery("INSERT INTO #__rsform_submissions SET `FormId`='".$formId."', `DateSubmitted`='".$date->toSql()."', `UserIp`='".(isset($_SERVER['REMOTE_ADDR']) ? $db->escape($_SERVER['REMOTE_ADDR']) : '')."', `Username`='".$db->escape($user->get('username'))."', `UserId`='".(int) $user->get('id')."', `Lang`='".RSFormProHelper::getCurrentLanguage()."', `confirmed` = '".$confirmsubmission."' ");
  1474. $db->execute();
  1475. $SubmissionId = $db->insertid();
  1476. $files = JRequest::get('files');
  1477. if (isset($files['form']['tmp_name']) && is_array($files['form']['tmp_name']))
  1478. {
  1479. $names = array();
  1480. foreach ($files['form']['tmp_name'] as $fieldName => $val)
  1481. {
  1482. if ($files['form']['error'][$fieldName]) continue;
  1483. $names[] = $db->escape($fieldName);
  1484. }
  1485. $componentIds = array();
  1486. if (!empty($names))
  1487. {
  1488. $db->setQuery("SELECT c.ComponentId, p.PropertyValue FROM #__rsform_components c LEFT JOIN #__rsform_properties p ON (c.ComponentId=p.ComponentId AND p.PropertyName='NAME') WHERE c.FormId='".$formId."' AND p.PropertyValue IN ('".implode("','", $names)."')");
  1489. $results = $db->loadObjectList();
  1490. foreach ($results as $result)
  1491. $componentIds[$result->PropertyValue] = $result->ComponentId;
  1492. }
  1493. $all_data = RSFormProHelper::getComponentProperties($componentIds);
  1494. jimport('joomla.filesystem.file');
  1495. foreach ($files['form']['tmp_name'] as $fieldName => $val)
  1496. {
  1497. if ($files['form']['error'][$fieldName]) continue;
  1498. $data = @$all_data[$componentIds[$fieldName]];
  1499. if (empty($data)) continue;
  1500. // Prefix
  1501. $prefix = uniqid('').'-';
  1502. if (isset($data['PREFIX']) && strlen(trim($data['PREFIX'])) > 0)
  1503. $prefix = RSFormProHelper::isCode($data['PREFIX']);
  1504. // Path
  1505. $realpath = realpath($data['DESTINATION'].DIRECTORY_SEPARATOR);
  1506. if (substr($realpath, -1) != DIRECTORY_SEPARATOR)
  1507. $realpath .= DIRECTORY_SEPARATOR;
  1508. // Filename
  1509. $file = $realpath.$prefix.$files['form']['name'][$fieldName];
  1510. // Upload File
  1511. JFile::upload($files['form']['tmp_name'][$fieldName], $file);
  1512. // Add to db (submission value)
  1513. $db->setQuery("INSERT INTO #__rsform_submission_values SET `SubmissionId`='".$SubmissionId."', `FormId`='".$formId."', `FieldName`='".$db->escape($fieldName)."', `FieldValue`='".$db->escape($file)."'");
  1514. $db->execute();
  1515. $emails = !empty($data['EMAILATTACH']) ? explode(',',$data['EMAILATTACH']) : array();
  1516. // Attach to user and admin email
  1517. if (in_array('useremail',$emails))
  1518. $userEmail['files'][] = $file;
  1519. if (in_array('adminemail',$emails))
  1520. $adminEmail['files'][] = $file;
  1521. }
  1522. }
  1523. //Trigger Event - onBeforeStoreSubmissions
  1524. $mainframe->triggerEvent('rsfp_f_onBeforeStoreSubmissions', array(array('formId'=>$formId,'post'=>&$post,'SubmissionId'=>$SubmissionId)));
  1525. // Add to db (values)
  1526. foreach ($post as $key => $val)
  1527. {
  1528. $val = is_array($val) ? implode("\n", $val) : $val;
  1529. $val = RSFormProHelper::stripJava($val);
  1530. $db->setQuery("INSERT INTO #__rsform_submission_values SET `SubmissionId`='".$SubmissionId."', `FormId`='".$formId."', `FieldName`='".$db->escape($key)."', `FieldValue`='".$db->escape($val)."'");
  1531. $db->execute();
  1532. }
  1533. //Trigger Event - onAfterStoreSubmissions
  1534. $mainframe->triggerEvent('rsfp_f_onAfterStoreSubmissions', array(array('SubmissionId'=>$SubmissionId, 'formId'=>$formId)));
  1535. // Send emails
  1536. list($replace, $with) = RSFormProHelper::sendSubmissionEmails($SubmissionId);
  1537. // Thank You Message
  1538. $thankYouMessage = str_replace($replace, $with, $form->Thankyou);
  1539. $form->ReturnUrl = str_replace($replace, $with, $form->ReturnUrl);
  1540. // Set redirect link
  1541. $u = RSFormProHelper::getURL();
  1542. // Create the Continue button
  1543. $continueButton = '';
  1544. if ($form->ShowContinue)
  1545. {
  1546. // Create goto link
  1547. $goto = 'document.location.reload();';
  1548. // Cache workaround #1
  1549. if ($cache_enabled)
  1550. $goto = "document.location='".addslashes($u)."';";
  1551. if (!empty($form->ReturnUrl))
  1552. $goto = "document.location='".addslashes($form->ReturnUrl)."';";
  1553. // Continue button
  1554. $continueButtonLabel = JText::_('RSFP_THANKYOU_BUTTON');
  1555. if (strpos($continueButtonLabel, 'input'))
  1556. $continueButton = JText::sprintf('RSFP_THANKYOU_BUTTON',$goto);
  1557. else
  1558. $continueButton = '<br/><input type="button" class="rsform-submit-button btn btn-primary" name="continue" value="'.JText::_('RSFP_THANKYOU_BUTTON').'" onclick="'.$goto.'"/>';
  1559. }
  1560. // get mappings data
  1561. $db->setQuery("SELECT * FROM #__rsform_mappings WHERE formId = ".(int) $formId." ORDER BY ordering ASC");
  1562. $mappings = $db->loadObjectList();
  1563. // get Post to another location
  1564. $db->setQuery("SELECT * FROM #__rsform_posts WHERE form_id='".(int) $formId."' AND enabled='1'");
  1565. $silentPost = $db->loadObject();
  1566. $RSadapter = RSFormProHelper::getLegacyAdapter();
  1567. eval($form->ScriptProcess2);
  1568. $thankYouMessage .= $continueButton;
  1569. //Mappings
  1570. if (!empty($mappings))
  1571. {
  1572. $lastinsertid = '';
  1573. $replacewith = $with;
  1574. array_walk($replacewith, array('RSFormProHelper', 'escapeSql'));
  1575. foreach ($mappings as $mapping)
  1576. {
  1577. //get the query
  1578. $query = RSFormProHelper::getMappingQuery($mapping);
  1579. //replace the placeholders
  1580. $query = str_replace($replace, $replacewith, $query);
  1581. //replace the last insertid placeholder
  1582. $query = str_replace('{last_insert_id}',$lastinsertid,$query);
  1583. if ($mapping->connection)
  1584. {
  1585. $options = array(
  1586. 'driver' => 'mysql',
  1587. 'host' => $mapping->host,
  1588. 'user' => $mapping->username,
  1589. 'password' => $mapping->password,
  1590. 'database' => $mapping->database
  1591. );
  1592. if (RSFormProHelper::isJ('3.0')) {
  1593. $database = JDatabaseDriver::getInstance($options);
  1594. } else {
  1595. $database = JDatabase::getInstance($options);
  1596. }
  1597. //is a valid database connection
  1598. if (is_a($database,'JException')) continue;
  1599. $database->setQuery($query);
  1600. $database->execute();
  1601. $lastinsertid = $database->insertid();
  1602. } else
  1603. {
  1604. $db->setQuery($query);
  1605. $db->execute();
  1606. $lastinsertid = $db->insertid();
  1607. }
  1608. }
  1609. }
  1610. if (!$form->Keepdata)
  1611. {
  1612. $db->setQuery("DELETE FROM #__rsform_submission_values WHERE SubmissionId = ".(int) $SubmissionId." ");
  1613. $db->execute();
  1614. $db->setQuery("DELETE FROM #__rsform_submissions WHERE SubmissionId = ".(int) $SubmissionId." ");
  1615. $db->execute();
  1616. }
  1617. if ($silentPost && !empty($silentPost->url) && $silentPost->url != 'http://')
  1618. {
  1619. // url
  1620. $url = $silentPost->url;
  1621. // set the variables to be sent
  1622. // the format of the variables is var1=value1&var2=value2&var3=value3
  1623. $data = array();
  1624. foreach ($post as $key => $value)
  1625. {
  1626. if (is_array($value))
  1627. foreach ($value as $post2 => $value2)
  1628. $data[] = urlencode($key).'[]='.urlencode($value2);
  1629. else
  1630. $data[] = urlencode($key).'='.urlencode($value);
  1631. }
  1632. // do we need to post silently?
  1633. if ($silentPost->silent)
  1634. {
  1635. $data = implode('&', $data);
  1636. $params = array(
  1637. 'method' => $silentPost->method ? 'POST' : 'GET'
  1638. );
  1639. require_once dirname(__FILE__).'/connect.php';
  1640. RSFormProConnect($url, $data, $params);
  1641. }
  1642. else
  1643. {
  1644. // just try to redirect
  1645. if ($silentPost->method)
  1646. {
  1647. @ob_end_clean();
  1648. // create form
  1649. $output = array();
  1650. $output[] = '<form id="formSubmit" method="POST" action="'.RSFormProHelper::htmlEscape($url).'">';
  1651. foreach ($post as $key => $value)
  1652. {
  1653. if (is_array($value))
  1654. foreach ($value as $post2 => $value2)
  1655. $output[] = '<input type="hidden" name="'.RSFormProHelper::htmlEscape($key).'[]" value="'.RSFormProHelper::htmlEscape($value2).'" />';
  1656. else
  1657. $output[] = '<input type="hidden" name="'.RSFormProHelper::htmlEscape($key).'" value="'.RSFormProHelper::htmlEscape($value).'" />';
  1658. }
  1659. $output[] = '</form>';
  1660. $output[] = '<script type="text/javascript">';
  1661. $output[] = 'function formSubmit() { document.getElementById(\'formSubmit\').submit(); }';
  1662. $output[] = 'try { window.addEventListener ? window.addEventListener("load",formSubmit,false) : window.attachEvent("onload",formSubmit); }';
  1663. $output[] = 'catch (err) { formSubmit(); }';
  1664. $output[] = '</script>';
  1665. // echo form and submit it
  1666. echo implode("\r\n", $output);
  1667. die();
  1668. }
  1669. else
  1670. {
  1671. $data = implode('&', $data);
  1672. $mainframe->redirect($url.(strpos($url, '?') === false ? '?' : '&').$data);
  1673. }
  1674. }
  1675. }
  1676. //Trigger - After form process
  1677. $mainframe->triggerEvent('rsfp_f_onAfterFormProcess', array(array('SubmissionId'=>$SubmissionId,'formId'=>$formId)));
  1678. if (!$form->ShowThankyou && $form->ReturnUrl)
  1679. {
  1680. $mainframe->redirect($form->ReturnUrl);
  1681. return;
  1682. }
  1683. // SESSION quick hack - we base64 encode it here and decode it when we show it
  1684. $session = JFactory::getSession();
  1685. $formParams = new stdClass();
  1686. $formParams->formProcessed = true;
  1687. $formParams->submissionId = $SubmissionId;
  1688. $formParams->thankYouMessage = base64_encode($thankYouMessage);
  1689. $session->set('com_rsform.formparams.'.$formId, $formParams);
  1690. // Cache workaround #2
  1691. if ($cache_enabled)
  1692. {
  1693. $uniqid = uniqid('rsform');
  1694. $u .= (strpos($u, '?') === false) ? '?skipcache='.$uniqid : '&skipcache='.$uniqid;
  1695. }
  1696. $mainframe->redirect($u);
  1697. }
  1698. return false;
  1699. }
  1700. public static function getURL()
  1701. {
  1702. // IIS hack
  1703. if (RSFormProHelper::getConfig('global.iis') && !empty($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'IIS') !== false && !empty($_SERVER['QUERY_STRING']))
  1704. {
  1705. $u = JRoute::_('index.php?'.$_SERVER['QUERY_STRING'],false);
  1706. }
  1707. else
  1708. {
  1709. $uri = JUri::getInstance();
  1710. $u = $uri->toString();
  1711. }
  1712. return $u;
  1713. }
  1714. public static function verifyChecked($componentName, $value, $post)
  1715. {
  1716. if (isset($post['form'][$componentName]))
  1717. {
  1718. if (is_array($post['form'][$componentName]) && in_array($value, $post['form'][$componentName]))
  1719. return 1;
  1720. if (!is_array($post['form'][$componentName]) && $post['form'][$componentName] == $value)
  1721. return 1;
  1722. return 0;
  1723. }
  1724. return 0;
  1725. }
  1726. public static function validateForm($formId)
  1727. {
  1728. require_once JPATH_SITE.'/components/com_rsform/helpers/validation.php';
  1729. $mainframe = JFactory::getApplication();
  1730. $db = JFactory::getDBO();
  1731. $invalid = array();
  1732. $formId = (int) $formId;
  1733. $post = JRequest::get('post', JREQUEST_ALLOWRAW);
  1734. $db->setQuery("SELECT ComponentId, ComponentTypeId FROM #__rsform_components WHERE FormId='".$formId."' AND Published=1 ORDER BY `Order`");
  1735. if ($components = $db->loadObjectList())
  1736. {
  1737. $componentIds = array();
  1738. foreach ($components as $component)
  1739. $componentIds[] = $component->ComponentId;
  1740. $all_data = RSFormProHelper::getComponentProperties($componentIds);
  1741. if (empty($all_data))
  1742. return $invalid;
  1743. if ($conditions = RSFormProHelper::getConditions($formId))
  1744. {
  1745. foreach ($conditions as $condition)
  1746. {
  1747. if ($condition->details)
  1748. {
  1749. $condition_vars = array();
  1750. foreach ($condition->details as $detail)
  1751. {
  1752. $isChecked = RSFormProHelper::verifyChecked($detail->ComponentName, $detail->value, $post);
  1753. $condition_vars[] = $detail->operator == 'is' ? $isChecked : !$isChecked;
  1754. }
  1755. // this check is performed like this
  1756. // 'all' must be true (ie. no 0s in the array); 'any' can be true (ie. one value of 1 in the array will do)
  1757. $result = $condition->condition == 'all'? !in_array(0, $condition_vars) : in_array(1, $condition_vars);
  1758. // if the item is hidden, no need to validate it
  1759. if (($condition->action == 'show' && !$result) || ($condition->action == 'hide' && $result))
  1760. foreach ($components as $i => $component)
  1761. if ($component->ComponentId == $condition->component_id)
  1762. {
  1763. // ... just remove it from the components array
  1764. unset($components[$i]);
  1765. break;
  1766. }
  1767. }
  1768. }
  1769. }
  1770. foreach ($components as $component)
  1771. {
  1772. $data = $all_data[$component->ComponentId];
  1773. $required = isset($data['REQUIRED']) ? $data['REQUIRED'] : 'NO';
  1774. $validationRule = isset($data['VALIDATIONRULE']) ? $data['VALIDATIONRULE'] : '';
  1775. $typeId = $component->ComponentTypeId;
  1776. // CAPTCHA
  1777. if ($typeId == 8)
  1778. {
  1779. $session = JFactory::getSession();
  1780. $captchaCode = $session->get('com_rsform.captcha.'.$component->ComponentId);
  1781. if ($data['IMAGETYPE'] == 'INVISIBLE')
  1782. {
  1783. $words = RSFormProHelper::getInvisibleCaptchaWords();
  1784. if (!empty($post[$captchaCode]))
  1785. $invalid[] = $data['componentId'];
  1786. foreach ($words as $word)
  1787. if (!empty($post[$word]))
  1788. $invalid[] = $data['componentId'];
  1789. }
  1790. else
  1791. {
  1792. if (empty($post['form'][$data['NAME']]) || empty($captchaCode) || $post['form'][$data['NAME']] != $captchaCode)
  1793. $invalid[] = $data['componentId'];
  1794. }
  1795. }
  1796. // Trigger Event - rsfp_bk_validate_onSubmitValidateRecaptcha
  1797. if ($typeId == 24)
  1798. $mainframe->triggerEvent('rsfp_bk_validate_onSubmitValidateRecaptcha',array(array('data'=> &$data,'invalid'=> &$invalid)));
  1799. if ($typeId == 9)
  1800. {
  1801. $files = JRequest::getVar('form', null, 'files');
  1802. // File has been *sent* to the server
  1803. if (isset($files['tmp_name'][$data['NAME']]) && $files['error'][$data['NAME']] != 4)
  1804. {
  1805. // File has been uploaded correctly to the server
  1806. if ($files['error'][$data['NAME']] == 0)
  1807. {
  1808. // Let's check if the extension is allowed
  1809. $buf = explode('.', $files['name'][$data['NAME']]);
  1810. $m = '#'.preg_quote($buf[count($buf)-1]).'#';
  1811. if (!empty($data['ACCEPTEDFILES']) && !preg_match(strtolower($m),strtolower($data['ACCEPTEDFILES'])))
  1812. $invalid[] = $data['componentId'];
  1813. // Let's check if it's the correct size
  1814. if ($files['size'][$data['NAME']] > 0 && $data['FILESIZE'] > 0 && $files['size'][$data['NAME']] > $data['FILESIZE']*1024)
  1815. $invalid[] = $data['componentId'];
  1816. }
  1817. // File has not been uploaded correctly - next version we'll trigger some messages based on the error code
  1818. else
  1819. $invalid[] = $data['componentId'];
  1820. }
  1821. // File has not been sent but it's required
  1822. elseif($required == 'YES')
  1823. $invalid[] = $data['componentId'];
  1824. continue;
  1825. }
  1826. if ($required == 'YES')
  1827. {
  1828. if (!isset($post['form'][$data['NAME']]))
  1829. {
  1830. $invalid[] = $data['componentId'];
  1831. continue;
  1832. }
  1833. if (!is_array($post['form'][$data['NAME']]) && strlen(trim($post['form'][$data['NAME']])) == 0)
  1834. {
  1835. $invalid[] = $data['componentId'];
  1836. continue;
  1837. }
  1838. if (!is_array($post['form'][$data['NAME']]) && strlen(trim($post['form'][$data['NAME']])) > 0 && is_callable(array('RSFormProValidations', $validationRule)) && call_user_func(array('RSFormProValidations', $validationRule),$post['form'][$data['NAME']],isset($data['VALIDATIONEXTRA']) ? $data['VALIDATIONEXTRA'] : '',$data) == false)
  1839. {
  1840. $invalid[] = $data['componentId'];
  1841. continue;
  1842. }
  1843. if (is_array($post['form'][$data['NAME']]))
  1844. {
  1845. $valid = implode('',$post['form'][$data['NAME']]);
  1846. if(empty($valid))
  1847. {
  1848. $invalid[] = $data['componentId'];
  1849. continue;
  1850. }
  1851. }
  1852. }
  1853. else
  1854. {
  1855. if (isset($post['form'][$data['NAME']]) && !is_array($post['form'][$data['NAME']]) && strlen(trim($post['form'][$data['NAME']])) > 0 && is_callable(array('RSFormProValidations', $validationRule)) && call_user_func(array('RSFormProValidations', $validationRule),$post['form'][$data['NAME']],isset($data['VALIDATIONEXTRA']) ? $data['VALIDATIONEXTRA'] : '', $data) == false)
  1856. {
  1857. $invalid[] = $data['componentId'];
  1858. continue;
  1859. }
  1860. }
  1861. }
  1862. }
  1863. return $invalid;
  1864. }
  1865. public static function getFrontComponentBody($formId, $componentId, $data, $value='', $invalid=false, $layoutName)
  1866. {
  1867. $mainframe = JFactory::getApplication();
  1868. $formId = (int) $formId;
  1869. $componentId = (int) $componentId;
  1870. $db = JFactory::getDBO();
  1871. // Optimized, don't need this anymore
  1872. //$db->setQuery("SELECT `ComponentTypeId`, `Order` FROM #__rsform_components WHERE ComponentId='".$componentId."' LIMIT 1");
  1873. //$r = $db->loadAssoc();
  1874. // For legacy reasons...
  1875. $r = array();
  1876. $r['ComponentTypeId'] = $data['componentTypeId'];
  1877. $r['Order'] = @$data['Order'];
  1878. $out = '';
  1879. //Trigger Event - rsfp_bk_onBeforeCreateFrontComponentBody
  1880. $mainframe->triggerEvent('rsfp_bk_onBeforeCreateFrontComponentBody',array(array('out'=>&$out, 'formId'=>$formId, 'componentId'=>$componentId,'data'=>&$data,'value'=>&$value)));
  1881. switch($data['ComponentTypeName'])
  1882. {
  1883. case 1:
  1884. case 'textBox':
  1885. if (isset($data['VALIDATIONRULE']) && $data['VALIDATIONRULE'] == 'password') {
  1886. $defaultValue = '';
  1887. } else {
  1888. $defaultValue = RSFormProHelper::isCode($data['DEFAULTVALUE']);
  1889. }
  1890. $className = 'rsform-input-box';
  1891. if ($invalid)
  1892. $className .= ' rsform-error';
  1893. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  1894. $out .= '<input type="text" value="'.(isset($value[$data['NAME']]) ? RSFormProHelper::htmlEscape($value[$data['NAME']]) : RSFormProHelper::htmlEscape($defaultValue)).'" size="'.$data['SIZE'].'" '.((int) $data['MAXSIZE'] > 0 ? 'maxlength="'.(int) $data['MAXSIZE'].'"' : '').' name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].'/>';
  1895. break;
  1896. case 2:
  1897. case 'textArea':
  1898. $defaultValue = RSFormProHelper::isCode($data['DEFAULTVALUE']);
  1899. $className = 'rsform-text-box';
  1900. if ($invalid)
  1901. $className .= ' rsform-error';
  1902. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  1903. if (isset($data['WYSIWYG']) && $data['WYSIWYG'] == 'YES')
  1904. {
  1905. $out .= RSFormProHelper::WYSIWYG('form['.$data['NAME'].']', (isset($value[$data['NAME']]) ? RSFormProHelper::htmlEscape($value[$data['NAME']]) : RSFormProHelper::htmlEscape($defaultValue)), 'id['.$data['NAME'].']', $data['COLS']*10, $data['ROWS']*10, $data['COLS'], $data['ROWS']);
  1906. }
  1907. else
  1908. $out .= '<textarea cols="'.(int) $data['COLS'].'" rows="'.(int) $data['ROWS'].'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].'>'.(isset($value[$data['NAME']]) ? RSFormProHelper::htmlEscape($value[$data['NAME']]) : RSFormProHelper::htmlEscape($defaultValue)).'</textarea>';
  1909. break;
  1910. case 3:
  1911. case 'selectList':
  1912. $className = 'rsform-select-box';
  1913. if ($invalid)
  1914. $className .= ' rsform-error';
  1915. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  1916. $out .= '<select '.($data['MULTIPLE']=='YES' ? 'multiple="multiple"' : '').' name="form['.$data['NAME'].'][]" '.((int) $data['SIZE'] > 0 ? 'size="'.(int) $data['SIZE'].'"' : '').' id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].' >';
  1917. $items = RSFormProHelper::explode(RSFormProHelper::isCode($data['ITEMS']));
  1918. $special = array('[c]', '[g]', '[d]');
  1919. foreach ($items as $item)
  1920. {
  1921. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  1922. if (is_null($txt))
  1923. $txt = $val;
  1924. // <optgroup>
  1925. if (strpos($item, '[g]') !== false) {
  1926. $out .= '<optgroup label="'.RSFormProHelper::htmlEscape($val).'">';
  1927. continue;
  1928. }
  1929. // </optgroup>
  1930. if(strpos($item, '[/g]') !== false) {
  1931. $out .= '</optgroup>';
  1932. continue;
  1933. }
  1934. $additional = '';
  1935. // selected
  1936. if ((strpos($item, '[c]') !== false && empty($value)) || (isset($value[$data['NAME']]) && in_array($val, $value[$data['NAME']])))
  1937. $additional .= 'selected="selected"';
  1938. // disabled
  1939. if (strpos($item, '[d]') !== false)
  1940. $additional .= 'disabled="disabled"';
  1941. $out .= '<option '.$additional.' value="'.RSFormProHelper::htmlEscape($val).'">'.RSFormProHelper::htmlEscape($txt).'</option>';
  1942. }
  1943. $out .= '</select>';
  1944. $option = JRequest::getCmd('option');
  1945. $view = JRequest::getCmd('view');
  1946. $layout = JRequest::getCmd('layout');
  1947. if ($option == 'com_rsevents' && $view == 'events' && $layout == 'subscribe' && $data['NAME'] == 'RSEventsTickets')
  1948. {
  1949. $db->setQuery("SELECT ConfigValue FROM #__rsevents_config WHERE ConfigName = 'event.multiple.tickets' ");
  1950. $multipleTickets = $db->loadResult();
  1951. if ($multipleTickets)
  1952. {
  1953. $lang = JFactory::getLanguage();
  1954. $lang->load('com_rsevents', JPATH_SITE);
  1955. $out .= ' <a onclick="add_ticket(1,\''.JText::_('RSE_REMOVE_TICKET',true).'\');" href="javascript:void(0)">'.JText::_('RSE_ADD_TICKET').'</a> ';
  1956. $out .= '<br /><span id="tickets"></span>';
  1957. $out .= '<span id="rse_tickets_ids"></span>'."\n";
  1958. $out .= '<span id="rse_tickets_no"></span>'."\n";
  1959. }
  1960. }
  1961. break;
  1962. case 4:
  1963. case 'checkboxGroup':
  1964. $i = 0;
  1965. $items = RSFormProHelper::explode(RSFormProHelper::isCode($data['ITEMS']));
  1966. $special = array('[c]', '[d]');
  1967. foreach ($items as $item)
  1968. {
  1969. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  1970. if (is_null($txt))
  1971. $txt = $val;
  1972. $additional = '';
  1973. // checked
  1974. if ((strpos($item, '[c]') !== false && empty($value)) || (isset($value[$data['NAME']]) && in_array($val, $value[$data['NAME']])))
  1975. $additional .= 'checked="checked"';
  1976. // disabled
  1977. if (strpos($item, '[d]') !== false)
  1978. $additional .= 'disabled="disabled"';
  1979. if ($data['FLOW']=='VERTICAL' && $layoutName == 'responsive')
  1980. $out .= '<p class="rsformVerticalClear">';
  1981. $out .= '<input '.$additional.' name="form['.$data['NAME'].'][]" type="checkbox" value="'.RSFormProHelper::htmlEscape($val).'" id="'.$data['NAME'].$i.'" '.$data['ADDITIONALATTRIBUTES'].' /><label for="'.$data['NAME'].$i.'">'.$txt.'</label>';
  1982. if ($data['FLOW']=='VERTICAL')
  1983. {
  1984. if ($layoutName == 'responsive')
  1985. $out .= '</p>';
  1986. else
  1987. $out .= '<br />';
  1988. }
  1989. $i++;
  1990. }
  1991. break;
  1992. case 5:
  1993. case 'radioGroup':
  1994. $i = 0;
  1995. $items = RSFormProHelper::explode(RSFormProHelper::isCode($data['ITEMS']));
  1996. $special = array('[c]', '[d]');
  1997. foreach ($items as $item)
  1998. {
  1999. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  2000. if (is_null($txt))
  2001. $txt = $val;
  2002. $additional = '';
  2003. // checked
  2004. if ((strpos($item, '[c]') !== false && empty($value)) || (isset($value[$data['NAME']]) && $val == $value[$data['NAME']]))
  2005. $additional .= 'checked="checked"';
  2006. // disabled
  2007. if (strpos($item, '[d]') !== false)
  2008. $additional .= 'disabled="disabled"';
  2009. if ($data['FLOW']=='VERTICAL' && $layoutName == 'responsive')
  2010. $out .= '<p class="rsformVerticalClear">';
  2011. $out .= '<input '.$additional.' name="form['.$data['NAME'].']" type="radio" value="'.RSFormProHelper::htmlEscape($val).'" id="'.$data['NAME'].$i.'" '.$data['ADDITIONALATTRIBUTES'].' /><label for="'.$data['NAME'].$i.'">'.$txt.'</label>';
  2012. if ($data['FLOW']=='VERTICAL')
  2013. {
  2014. if ($layoutName == 'responsive')
  2015. $out .= '</p>';
  2016. else
  2017. $out .= '<br />';
  2018. }
  2019. $i++;
  2020. }
  2021. break;
  2022. case 6:
  2023. case 'calendar':
  2024. $calendars = RSFormProHelper::componentExists($formId, 6);
  2025. $calendars = array_flip($calendars);
  2026. $defaultValue = isset($value[$data['NAME']]) ? $value[$data['NAME']] : (isset($data['DEFAULTVALUE']) ? RSFormProHelper::isCode($data['DEFAULTVALUE']) : '');
  2027. switch($data['CALENDARLAYOUT'])
  2028. {
  2029. case 'FLAT':
  2030. $className = 'rsform-calendar-box';
  2031. if ($invalid)
  2032. $className .= ' rsform-error';
  2033. $out .= '<input id="txtcal'.$formId.'_'.$calendars[$componentId].'" name="form['.$data['NAME'].']" type="text" '.($data['READONLY'] == 'YES' ? 'readonly="readonly"' : '').' class="txtCal '.$className.'" value="'.RSFormProHelper::htmlEscape($defaultValue).'" '.$data['ADDITIONALATTRIBUTES'].'/><br />';
  2034. $out .= '<div id="cal'.$formId.'_'.$calendars[$componentId].'Container" style="z-index:'.(9999-$data['Order']).'"></div>';
  2035. break;
  2036. case 'POPUP':
  2037. $data['ADDITIONALATTRIBUTES2'] = $data['ADDITIONALATTRIBUTES'];
  2038. $className = 'rsform-calendar-box';
  2039. if ($invalid)
  2040. $className .= ' rsform-error';
  2041. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2042. $out .= '<input id="txtcal'.$formId.'_'.$calendars[$componentId].'" name="form['.$data['NAME'].']" type="text" '.($data['READONLY'] == 'YES' ? 'readonly="readonly"' : '').' value="'.RSFormProHelper::htmlEscape($defaultValue).'" '.$data['ADDITIONALATTRIBUTES'].'/>';
  2043. $className = 'rsform-calendar-button';
  2044. if ($invalid)
  2045. $className .= ' rsform-error';
  2046. $out .= '<input id="btn'.$formId.'_'.$calendars[$componentId].'" type="button" value="'.RSFormProHelper::htmlEscape($data['POPUPLABEL']).'" onclick="showHideCalendar(\'cal'.$formId.'_'.$calendars[$componentId].'Container\');" class="btnCal '.$className.'" '.$data['ADDITIONALATTRIBUTES2'].' />';
  2047. $out .= '<div id="cal'.$formId.'_'.$calendars[$componentId].'Container" style="clear:both;display:none;position:absolute;z-index:'.(9999-$data['Order']).'"></div>';
  2048. break;
  2049. }
  2050. $out .= '<input id="hiddencal'.$formId.'_'.$calendars[$componentId].'" type="hidden" name="hidden['.$data['NAME'].']" />';
  2051. break;
  2052. case 7:
  2053. case 'button':
  2054. $button_type = (isset($data['BUTTONTYPE']) && $data['BUTTONTYPE'] == 'TYPEBUTTON') ? 'button' : 'input';
  2055. $data['ADDITIONALATTRIBUTES2'] = $data['ADDITIONALATTRIBUTES'];
  2056. $className = 'rsform-button';
  2057. if ($invalid)
  2058. $className .= ' rsform-error';
  2059. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2060. if ($button_type == 'button')
  2061. $out .= '<button type="button" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].'>'.RSFormProHelper::htmlEscape($data['LABEL']).'</button>';
  2062. else
  2063. $out .= '<input type="button" value="'.RSFormProHelper::htmlEscape($data['LABEL']).'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2064. if ($data['RESET']=='YES')
  2065. {
  2066. $className = 'rsform-reset-button';
  2067. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES2'], $className);
  2068. if ($button_type == 'button')
  2069. $out .= '&nbsp;&nbsp;<button type="reset" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES2'].'>'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'</button>';
  2070. else
  2071. $out .= '&nbsp;&nbsp;<input type="reset" value="'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES2'].' />';
  2072. }
  2073. break;
  2074. case 8:
  2075. case 'captcha':
  2076. switch (@$data['IMAGETYPE'])
  2077. {
  2078. default:
  2079. case 'FREETYPE':
  2080. case 'NOFREETYPE':
  2081. $className = 'rsform-captcha-box';
  2082. if ($invalid)
  2083. $className .= ' rsform-error';
  2084. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2085. $out .= '<img src="'.JRoute::_('index.php?option=com_rsform&amp;task=captcha&amp;componentId='.$componentId.'&amp;tmpl=component&amp;sid='.mt_rand()).'" id="captcha'.$componentId.'" alt="'.RSFormProHelper::htmlEscape($data['CAPTION']).' "/>';
  2086. if ($data['FLOW'] == 'VERTICAL')
  2087. $out .= '<br />';
  2088. $out .= '<input type="text" name="form['.$data['NAME'].']" value="" id="captchaTxt'.$componentId.'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2089. if ($data['SHOWREFRESH']=='YES')
  2090. $out .= '&nbsp;&nbsp;<a href="javascript:void(0)" onclick="refreshCaptcha('.$componentId.',\''.JRoute::_('index.php?option=com_rsform&task=captcha&componentId='.$componentId.'&tmpl=component').'\'); return false;">'.$data['REFRESHTEXT'].'</a>';
  2091. break;
  2092. case 'INVISIBLE':
  2093. // a list of words that spam bots might auto-complete
  2094. $words = RSFormProHelper::getInvisibleCaptchaWords();
  2095. $word = $words[array_rand($words, 1)];
  2096. // a list of styles so that the field is hidden
  2097. $styles = array('display: none !important', 'position: absolute !important; left: -4000px !important; top: -4000px !important;', 'position: absolute !important; left: -4000px !important; top: -4000px !important; display: none !important', 'position: absolute !important; display: none !important', 'display: none !important; position: absolute !important; left: -4000px !important; top: -4000px !important;');
  2098. $style = $styles[array_rand($styles, 1)];
  2099. // now we're going to shuffle the properties of the html tag
  2100. $properties = array('type="text"', 'name="'.$word.'"', 'value=""', 'style="'.$style.'"');
  2101. shuffle($properties);
  2102. $session = JFactory::getSession();
  2103. $session->set('com_rsform.captcha.'.$componentId, $word);
  2104. $out .= '<input '.implode(' ', $properties).' />';
  2105. break;
  2106. }
  2107. break;
  2108. case 9:
  2109. case 'fileUpload':
  2110. $className = 'rsform-upload-box';
  2111. if ($invalid)
  2112. $className .= ' rsform-error';
  2113. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2114. $out .= '<input type="hidden" name="MAX_FILE_SIZE" value="'.(int) $data['FILESIZE'].'000" />';
  2115. $out .= '<input type="file" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2116. break;
  2117. case 10:
  2118. case 'freeText':
  2119. $out .= $data['TEXT'];
  2120. break;
  2121. case 11:
  2122. case 'hidden':
  2123. $defaultValue = RSFormProHelper::isCode($data['DEFAULTVALUE']);
  2124. $out .= '<input type="hidden" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" value="'.RSFormProHelper::htmlEscape($defaultValue).'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2125. break;
  2126. case 12:
  2127. case 'imageButton':
  2128. $data['ADDITIONALATTRIBUTES2'] = $data['ADDITIONALATTRIBUTES'];
  2129. $className = 'rsform-image-button';
  2130. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2131. $data['ADDITIONALATTRIBUTES3'] = $data['ADDITIONALATTRIBUTES'];
  2132. $pages = RSFormProHelper::componentExists($formId, 41);
  2133. $pages = count($pages);
  2134. if (!empty($pages))
  2135. {
  2136. if (empty($data['PREVBUTTON']))
  2137. $data['PREVBUTTON'] = JText::_('PREV');
  2138. $onclick = 'rsfp_changePage('.$formId.', '.($pages-1).', '.$pages.')';
  2139. RSFormProHelper::addOnClick($data['ADDITIONALATTRIBUTES3'], $onclick);
  2140. $out .= '<input type="button" value="'.RSFormProHelper::htmlEscape($data['PREVBUTTON']).'" id="'.$data['NAME'].'Prev" '.$data['ADDITIONALATTRIBUTES3'].' />';
  2141. }
  2142. $out .= '<input type="image" src="'.RSFormProHelper::htmlEscape($data['IMAGEBUTTON']).'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES2'].' />';
  2143. if ($data['RESET']=='YES')
  2144. {
  2145. $className = 'rsform-reset-button';
  2146. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES2'], $className);
  2147. $out .= '<input type="reset" name="" id="reset_'.$data['NAME'].'" style="display: none !important" />&nbsp;&nbsp;<input onclick="document.getElementById(\'reset_'.$data['NAME'].'\').click();return false;" type="image" src="'.RSFormProHelper::htmlEscape($data['IMAGERESET']).'" name="form['.$data['NAME'].']" '.$data['ADDITIONALATTRIBUTES2'].' />';
  2148. }
  2149. break;
  2150. case 13:
  2151. case 'submitButton':
  2152. $button_type = (isset($data['BUTTONTYPE']) && $data['BUTTONTYPE'] == 'TYPEBUTTON') ? 'button' : 'input';
  2153. $data['ADDITIONALATTRIBUTES2'] = $data['ADDITIONALATTRIBUTES'];
  2154. $className = 'rsform-submit-button';
  2155. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2156. $data['ADDITIONALATTRIBUTES3'] = $data['ADDITIONALATTRIBUTES'];
  2157. $last_submit = $componentId == end($data['SUBMITS']);
  2158. $pages = RSFormProHelper::componentExists($formId, 41);
  2159. $pages = count($pages);
  2160. if (!empty($pages) && $last_submit)
  2161. {
  2162. if (empty($data['PREVBUTTON']))
  2163. $data['PREVBUTTON'] = JText::_('PREV');
  2164. $onclick = 'rsfp_changePage('.$formId.', '.($pages-1).', '.$pages.')';
  2165. RSFormProHelper::addOnClick($data['ADDITIONALATTRIBUTES3'], $onclick);
  2166. if ($button_type == 'button')
  2167. $out .= '<button type="button" id="'.$data['NAME'].'Prev" '.$data['ADDITIONALATTRIBUTES3'].'>'.RSFormProHelper::htmlEscape($data['PREVBUTTON']).'</button>';
  2168. else
  2169. $out .= '<input type="button" value="'.RSFormProHelper::htmlEscape($data['PREVBUTTON']).'" id="'.$data['NAME'].'Prev" '.$data['ADDITIONALATTRIBUTES3'].' />';
  2170. }
  2171. if ($button_type == 'button')
  2172. $out .= '<button type="submit" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].'>'.RSFormProHelper::htmlEscape($data['LABEL']).'</button>';
  2173. else
  2174. $out .= '<input type="submit" value="'.RSFormProHelper::htmlEscape($data['LABEL']).'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2175. if ($data['RESET']=='YES')
  2176. {
  2177. $className = 'rsform-reset-button';
  2178. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES2'], $className);
  2179. if ($button_type == 'button')
  2180. $out .= '&nbsp;&nbsp;<button type="reset" name="form['.$data['NAME'].']" '.$data['ADDITIONALATTRIBUTES2'].'>'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'</button>';
  2181. else
  2182. $out .= '&nbsp;&nbsp;<input type="reset" value="'.RSFormProHelper::htmlEscape($data['RESETLABEL']).'" name="form['.$data['NAME'].']" '.$data['ADDITIONALATTRIBUTES2'].' />';
  2183. }
  2184. break;
  2185. case 14:
  2186. case 'password':
  2187. $defaultValue = '';
  2188. if (isset($data['VALIDATIONRULE']) && $data['VALIDATIONRULE'] != 'password')
  2189. $defaultValue = $data['DEFAULTVALUE'];
  2190. $className = 'rsform-password-box';
  2191. if ($invalid)
  2192. $className .= ' rsform-error';
  2193. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2194. $out .= '<input type="password" value="'.RSFormProHelper::htmlEscape($defaultValue).'" size="'.(int) $data['SIZE'].'" name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.((int) $data['MAXSIZE'] > 0 ? 'maxlength="'.(int) $data['MAXSIZE'].'"' : '').' '.$data['ADDITIONALATTRIBUTES'].' />';
  2195. break;
  2196. case 15:
  2197. case 'ticket':
  2198. $out .= '<input type="hidden" name="form['.$data['NAME'].']" value="'.RSFormProHelper::generateString($data['LENGTH'],$data['CHARACTERS']).'" '.$data['ADDITIONALATTRIBUTES'].' />';
  2199. break;
  2200. case 41:
  2201. case 'pageBreak':
  2202. $validate = 'false';
  2203. if (isset($data['VALIDATENEXTPAGE']) && $data['VALIDATENEXTPAGE'] == 'YES')
  2204. $validate = 'true';
  2205. $className = 'rsform-button';
  2206. if ($invalid)
  2207. $className .= ' rsform-error';
  2208. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2209. $data['ADDITIONALATTRIBUTES2'] = $data['ADDITIONALATTRIBUTES'];
  2210. $num = count($data['PAGES']);
  2211. $pos = array_search($componentId, $data['PAGES']);
  2212. if ($pos)
  2213. {
  2214. $onclick = 'rsfp_changePage('.$formId.', '.($pos-1).', '.$num.')';
  2215. RSFormProHelper::addOnClick($data['ADDITIONALATTRIBUTES'], $onclick);
  2216. $out .= '<input type="button" value="'.RSFormProHelper::htmlEscape($data['PREVBUTTON']).'" '.$data['ADDITIONALATTRIBUTES'].' id="'.$data['NAME'].'Prev" />';
  2217. }
  2218. if ($pos < count($data['PAGES']))
  2219. {
  2220. $onclick = 'rsfp_changePage('.$formId.', '.($pos+1).', '.$num.', '.$validate.')';
  2221. RSFormProHelper::addOnClick($data['ADDITIONALATTRIBUTES2'], $onclick);
  2222. $out .= '<input type="button" value="'.RSFormProHelper::htmlEscape($data['NEXTBUTTON']).'" '.$data['ADDITIONALATTRIBUTES2'].' id="'.$data['NAME'].'Next" />';
  2223. }
  2224. break;
  2225. case 32:
  2226. case 'rseprotickets':
  2227. $html = '';
  2228. if (JRequest::getCmd('option') == 'com_rseventspro')
  2229. {
  2230. $cid = JRequest::getInt('cid');
  2231. $db->setQuery("SELECT COUNT(id) FROM #__rseventspro_tickets WHERE ide = ".$cid."");
  2232. $eventtickets = $db->loadResult();
  2233. $html .= '<input type="text" id="numberinp" name="numberinp" value="1" size="3" style="display: none;" onkeyup="this.value=this.value.replace(/[^0-9\.\,]/g, \'\');" />';
  2234. $html .= '<select name="number" id="number"><option value="1">1</option></select> ';
  2235. $className = 'rsform-select-box';
  2236. if ($invalid)
  2237. $className .= ' rsform-error';
  2238. RSFormProHelper::addClass($data['ADDITIONALATTRIBUTES'], $className);
  2239. $html .= '<select name="form['.$data['NAME'].']" id="'.$data['NAME'].'" '.$data['ADDITIONALATTRIBUTES'].' >';
  2240. $items = RSFormProHelper::explode(RSFormProHelper::isCode($data['ITEMS']));
  2241. $special = array('[c]', '[g]', '[d]');
  2242. foreach ($items as $item)
  2243. {
  2244. @list($val, $txt) = @explode('|', str_replace($special, '', $item), 2);
  2245. if (is_null($txt))
  2246. $txt = $val;
  2247. // <optgroup>
  2248. if (strpos($item, '[g]') !== false) {
  2249. $out .= '<optgroup label="'.RSFormProHelper::htmlEscape($val).'">';
  2250. continue;
  2251. }
  2252. // </optgroup>
  2253. if(strpos($item, '[/g]') !== false) {
  2254. $out .= '</optgroup>';
  2255. continue;
  2256. }
  2257. $additional = '';
  2258. // selected
  2259. if ((strpos($item, '[c]') !== false && empty($value)) || (isset($value[$data['NAME']]) && $val == $value[$data['NAME']]))
  2260. $additional .= 'selected="selected"';
  2261. // disabled
  2262. if (strpos($item, '[d]') !== false)
  2263. $additional .= 'disabled="disabled"';
  2264. $html .= '<option '.$additional.' value="'.RSFormProHelper::htmlEscape($val).'">'.RSFormProHelper::htmlEscape($txt).'</option>';
  2265. }
  2266. $html .= '</select>';
  2267. if (JRequest::getCmd('option') == 'com_rseventspro' && JRequest::getCmd('layout') == 'subscribe')
  2268. {
  2269. $db->setQuery("SELECT `value` FROM `#__rseventspro_config` WHERE `name` = 'multi_tickets'");
  2270. $multipleTickets = $db->loadResult();
  2271. if ($multipleTickets)
  2272. {
  2273. $lang = JFactory::getLanguage();
  2274. $lang->load('com_rseventspro', JPATH_SITE);
  2275. $html .= ' <a href="javascript:void(0);" onclick="rs_add_ticket();">'.JText::_('RSEPRO_SUBSCRIBER_ADD_TICKET').'</a> ';
  2276. }
  2277. }
  2278. $html .= ' <img id="rs_loader" src="'.JURI::root().'components/com_rseventspro/assets/images/loader.gif" alt="" style="vertical-align: middle; display: none;" />';
  2279. if (JRequest::getCmd('option') == 'com_rseventspro' && JRequest::getCmd('layout') == 'subscribe' && $multipleTickets)
  2280. {
  2281. $html .= '<br /> <br /> <span id="tickets"></span>';
  2282. $html .= '<span id="hiddentickets"></span>';
  2283. }
  2284. $html .= ' <br /> <span id="tdescription"></span>';
  2285. $html .= '<input type="hidden" name="from" id="from" value="" />';
  2286. if (!empty($eventtickets))
  2287. $out .= $html;
  2288. }
  2289. break;
  2290. }
  2291. //Trigger Event - rsfp_bk_onAfterCreateFrontComponentBody
  2292. $mainframe->triggerEvent('rsfp_bk_onAfterCreateFrontComponentBody',array(array('out'=>&$out, 'formId'=>$formId, 'componentId'=>$componentId,'data'=>$data,'value'=>$value,'r'=>$r, 'invalid' => $invalid)));
  2293. return $out;
  2294. }
  2295. public static function addClass(&$attributes, $className)
  2296. {
  2297. if (preg_match('#class="(.*?)"#is', $attributes, $matches))
  2298. $attributes = str_replace($matches[0], str_replace($matches[1], $matches[1].' '.$className, $matches[0]), $attributes);
  2299. else
  2300. $attributes .= ' class="'.$className.'"';
  2301. return $attributes;
  2302. }
  2303. public static function addOnClick(&$attributes, $onClick)
  2304. {
  2305. if (preg_match('#onclick="(.*?)"#is', $attributes, $matches))
  2306. $attributes = str_replace($matches[0], str_replace($matches[1], $matches[1].'; '.$onClick, $matches[0]), $attributes);
  2307. else
  2308. $attributes .= ' onclick="'.$onClick.'"';
  2309. return $attributes;
  2310. }
  2311. public static function getInvisibleCaptchaWords()
  2312. {
  2313. return array('Website', 'Email', 'Name', 'Address', 'User', 'Username', 'Comment', 'Message');
  2314. }
  2315. public static function generateString($length, $characters, $type='Random')
  2316. {
  2317. $length = (int) $length;
  2318. if($type == 'Random')
  2319. {
  2320. switch($characters)
  2321. {
  2322. case 'ALPHANUMERIC':
  2323. default:
  2324. $possible = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2325. break;
  2326. case 'ALPHA':
  2327. $possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2328. break;
  2329. case 'NUMERIC':
  2330. $possible = '0123456789';
  2331. break;
  2332. }
  2333. if($length<1||$length>255) $length = 8;
  2334. $key = '';
  2335. $i = 0;
  2336. while ($i < $length) {
  2337. $key .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
  2338. $i++;
  2339. }
  2340. }
  2341. if($type == 'Sequential')
  2342. {
  2343. $key = 0;
  2344. }
  2345. return $key;
  2346. }
  2347. // todo - use Joomla! string functions # done for now
  2348. // optimize to ignore false alerts
  2349. public static function stripJava($val)
  2350. {
  2351. static $filter;
  2352. if (is_null($filter))
  2353. {
  2354. jimport('joomla.filter.filterinput');
  2355. $filter = JFilterInput::getInstance(array('form', 'input', 'select', 'textarea'), array('style'), 1, 1);
  2356. }
  2357. $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', "", $val);
  2358. $val = str_replace("\0", "", $val);
  2359. return $filter->clean($val);
  2360. // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
  2361. // this prevents some character re-spacing such as <java\0script>
  2362. // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
  2363. $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '', $val);
  2364. // straight replacements, the user should never need these since they're normal characters
  2365. // this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A&#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29>
  2366. $search = 'abcdefghijklmnopqrstuvwxyz';
  2367. $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2368. $search .= '1234567890!@#$%^&*()';
  2369. $search .= '~`";:?+/={}[]-_|\'\\';
  2370. for ($i = 0; $i < strlen($search); $i++) {
  2371. // ;? matches the ;, which is optional
  2372. // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
  2373. // &#x0040 @ search for the hex values
  2374. $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
  2375. // &#00064 @ 0{0,7} matches '0' zero to seven times
  2376. $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
  2377. }
  2378. // now the only remaining whitespace attacks are \t, \n, and \r
  2379. // ([ \t\r\n]+)?
  2380. $ra1 = Array('\/([ \t\r\n]+)?javascript', '\/([ \t\r\n]+)?vbscript', ':([ \t\r\n]+)?expression', '<([ \t\r\n]+)?applet', '<([ \t\r\n]+)?meta', '<([ \t\r\n]+)?xml', '<([ \t\r\n]+)?blink', '<([ \t\r\n]+)?link', '<([ \t\r\n]+)?style', '<([ \t\r\n]+)?script', '<([ \t\r\n]+)?embed', '<([ \t\r\n]+)?object', '<([ \t\r\n]+)?iframe', '<([ \t\r\n]+)?frame', '<([ \t\r\n]+)?frameset', '<([ \t\r\n]+)?ilayer', '<([ \t\r\n]+)?layer', '<([ \t\r\n]+)?bgsound', '<([ \t\r\n]+)?title', '<([ \t\r\n]+)?base');
  2381. $ra2 = Array('onabort([ \t\r\n]+)?=', 'onactivate([ \t\r\n]+)?=', 'onafterprint([ \t\r\n]+)?=', 'onafterupdate([ \t\r\n]+)?=', 'onbeforeactivate([ \t\r\n]+)?=', 'onbeforecopy([ \t\r\n]+)?=', 'onbeforecut([ \t\r\n]+)?=', 'onbeforedeactivate([ \t\r\n]+)?=', 'onbeforeeditfocus([ \t\r\n]+)?=', 'onbeforepaste([ \t\r\n]+)?=', 'onbeforeprint([ \t\r\n]+)?=', 'onbeforeunload([ \t\r\n]+)?=', 'onbeforeupdate([ \t\r\n]+)?=', 'onblur([ \t\r\n]+)?=', 'onbounce([ \t\r\n]+)?=', 'oncellchange([ \t\r\n]+)?=', 'onchange([ \t\r\n]+)?=', 'onclick([ \t\r\n]+)?=', 'oncontextmenu([ \t\r\n]+)?=', 'oncontrolselect([ \t\r\n]+)?=', 'oncopy([ \t\r\n]+)?=', 'oncut([ \t\r\n]+)?=', 'ondataavailable([ \t\r\n]+)?=', 'ondatasetchanged([ \t\r\n]+)?=', 'ondatasetcomplete([ \t\r\n]+)?=', 'ondblclick([ \t\r\n]+)?=', 'ondeactivate([ \t\r\n]+)?=', 'ondrag([ \t\r\n]+)?=', 'ondragend([ \t\r\n]+)?=', 'ondragenter([ \t\r\n]+)?=', 'ondragleave([ \t\r\n]+)?=', 'ondragover([ \t\r\n]+)?=', 'ondragstart([ \t\r\n]+)?=', 'ondrop([ \t\r\n]+)?=', 'onerror([ \t\r\n]+)?=', 'onerrorupdate([ \t\r\n]+)?=', 'onfilterchange([ \t\r\n]+)?=', 'onfinish([ \t\r\n]+)?=', 'onfocus([ \t\r\n]+)?=', 'onfocusin([ \t\r\n]+)?=', 'onfocusout([ \t\r\n]+)?=', 'onhelp([ \t\r\n]+)?=', 'onkeydown([ \t\r\n]+)?=', 'onkeypress([ \t\r\n]+)?=', 'onkeyup([ \t\r\n]+)?=', 'onlayoutcomplete([ \t\r\n]+)?=', 'onload([ \t\r\n]+)?=', 'onlosecapture([ \t\r\n]+)?=', 'onmousedown([ \t\r\n]+)?=', 'onmouseenter([ \t\r\n]+)?=', 'onmouseleave([ \t\r\n]+)?=', 'onmousemove([ \t\r\n]+)?=', 'onmouseout([ \t\r\n]+)?=', 'onmouseover([ \t\r\n]+)?=', 'onmouseup([ \t\r\n]+)?=', 'onmousewheel([ \t\r\n]+)?=', 'onmove([ \t\r\n]+)?=', 'onmoveend([ \t\r\n]+)?=', 'onmovestart([ \t\r\n]+)?=', 'onpaste([ \t\r\n]+)?=', 'onpropertychange([ \t\r\n]+)?=', 'onreadystatechange([ \t\r\n]+)?=', 'onreset([ \t\r\n]+)?=', 'onresize([ \t\r\n]+)?=', 'onresizeend([ \t\r\n]+)?=', 'onresizestart([ \t\r\n]+)?=', 'onrowenter([ \t\r\n]+)?=', 'onrowexit([ \t\r\n]+)?=', 'onrowsdelete([ \t\r\n]+)?=', 'onrowsinserted([ \t\r\n]+)?=', 'onscroll([ \t\r\n]+)?=', 'onselect([ \t\r\n]+)?=', 'onselectionchange([ \t\r\n]+)?=', 'onselectstart([ \t\r\n]+)?=', 'onstart([ \t\r\n]+)?=', 'onstop([ \t\r\n]+)?=', 'onsubmit([ \t\r\n]+)?=', 'onunload([ \t\r\n]+)?=', 'style([ \t\r\n]+)?=');
  2382. $ra = array_merge($ra1, $ra2);
  2383. foreach ($ra as $tag)
  2384. {
  2385. $pattern = '#'.$tag.'#i';
  2386. preg_match_all($pattern, $val, $matches);
  2387. foreach ($matches[0] as $match)
  2388. $val = str_replace($match, substr($match, 0, 2).'<x>'.substr($match, 2), $val);
  2389. }
  2390. return $val;
  2391. }
  2392. public static function getCalendarJS()
  2393. {
  2394. $out = '//CALENDAR SETUP'."\n";
  2395. $m_short = $m_long = array();
  2396. for ($i=1; $i<=12; $i++)
  2397. {
  2398. $m_short[] = '"'.JText::_('RSFP_CALENDAR_MONTHS_SHORT_'.$i, true).'"';
  2399. $m_long[] = '"'.JText::_('RSFP_CALENDAR_MONTHS_LONG_'.$i, true).'"';
  2400. }
  2401. $w_1 = $w_short = $w_med = $w_long = array();
  2402. for ($i=0; $i<=6; $i++)
  2403. {
  2404. $w_1[] = '"'.JText::_('RSFP_CALENDAR_WEEKDAYS_1CHAR_'.$i, true).'"';
  2405. $w_short[] = '"'.JText::_('RSFP_CALENDAR_WEEKDAYS_SHORT_'.$i, true).'"';
  2406. $w_med[] = '"'.JText::_('RSFP_CALENDAR_WEEKDAYS_MEDIUM_'.$i, true).'"';
  2407. $w_long[] = '"'.JText::_('RSFP_CALENDAR_WEEKDAYS_LONG_'.$i, true).'"';
  2408. }
  2409. $out .= 'var MONTHS_SHORT = Array('.implode(',', $m_short).');'."\n";
  2410. $out .= 'var MONTHS_LONG = Array('.implode(',', $m_long).');'."\n";
  2411. $out .= 'var WEEKDAYS_1CHAR = Array('.implode(',', $w_1).');'."\n";
  2412. $out .= 'var WEEKDAYS_SHORT = Array('.implode(',', $w_short).');'."\n";
  2413. $out .= 'var WEEKDAYS_MEDIUM = Array('.implode(',', $w_med).');'."\n";
  2414. $out .= 'var WEEKDAYS_LONG = Array('.implode(',', $w_long).');'."\n";
  2415. $out .= 'var START_WEEKDAY = '.JText::_('RSFP_CALENDAR_START_WEEKDAY').';'."\n";
  2416. $lang = JFactory::getLanguage();
  2417. if ($lang->hasKey('COM_RSFORM_CALENDAR_CHOOSE_MONTH')) {
  2418. $out .= 'var rsfp_navConfig = { strings : { month: "'.JText::_('COM_RSFORM_CALENDAR_CHOOSE_MONTH', true).'", year: "'.JText::_('COM_RSFORM_CALENDAR_ENTER_YEAR', true).'", submit: "'.JText::_('COM_RSFORM_CALENDAR_OK').'", cancel: "'.JText::_('COM_RSFORM_CALENDAR_CANCEL').'", invalidYear: "'.JText::_('COM_RSFORM_CALENDAR_PLEASE_ENTER_A_VALID_YEAR', true).'" }, monthFormat: rsf_CALENDAR.widget.Calendar.LONG, initialFocus: "year" };'."\n";
  2419. }
  2420. return $out;
  2421. }
  2422. public static function getTranslations($reference, $formId, $lang, $select = 'value')
  2423. {
  2424. $db = JFactory::getDBO();
  2425. $db->setQuery("SELECT `Lang` FROM #__rsform_forms WHERE FormId='".(int) $formId."'");
  2426. $current_lang = $db->loadResult();
  2427. if ($current_lang == $lang)
  2428. return false;
  2429. switch ($reference)
  2430. {
  2431. case 'forms':
  2432. $db->setQuery("SELECT * FROM #__rsform_translations WHERE `form_id`='".(int) $formId."' AND `lang_code`='".$db->escape($lang)."' AND `reference`='forms'");
  2433. $results = $db->loadObjectList();
  2434. $return = array();
  2435. foreach ($results as $result)
  2436. $return[$result->reference_id] = ($select == '*') ? $result : (isset($result->$select) ? $result->$select : false);
  2437. return $return;
  2438. break;
  2439. case 'emails':
  2440. $db->setQuery("SELECT * FROM #__rsform_translations WHERE `form_id`='".(int) $formId."' AND `lang_code`='".$db->escape($lang)."' AND `reference`='emails'");
  2441. $results = $db->loadObjectList();
  2442. $return = array();
  2443. foreach ($results as $result)
  2444. $return[$result->reference_id] = ($select == '*') ? $result : (isset($result->$select) ? $result->$select : false);
  2445. return $return;
  2446. break;
  2447. case 'properties':
  2448. $db->setQuery("SELECT * FROM #__rsform_translations WHERE `form_id`='".(int) $formId."' AND `lang_code`='".$db->escape($lang)."' AND `reference`='properties'");
  2449. $results = $db->loadObjectList();
  2450. $return = array();
  2451. foreach ($results as $result)
  2452. $return[$result->reference_id] = ($select == '*') ? $result : (isset($result->$select) ? $result->$select : false);
  2453. return $return;
  2454. break;
  2455. }
  2456. return false;
  2457. }
  2458. public static function getTranslatableProperties()
  2459. {
  2460. return array('LABEL', 'RESETLABEL', 'PREVBUTTON', 'NEXTBUTTON', 'CAPTION', 'DESCRIPTION', 'VALIDATIONMESSAGE', 'DEFAULTVALUE', 'ITEMS', 'TEXT', 'REFRESHTEXT', 'DISPLAYPROGRESSMSG', 'WIRE');
  2461. }
  2462. public static function translateIcon()
  2463. {
  2464. return JHTML::image('administrator/components/com_rsform/assets/images/translate.gif', JText::_('RSFP_THIS_ITEM_IS_TRANSLATABLE'), 'title="'.JText::_('RSFP_THIS_ITEM_IS_TRANSLATABLE').'" style="vertical-align: middle"');
  2465. }
  2466. public static function mappingsColumns($config,$method,$row = null)
  2467. {
  2468. jimport('joomla.application.component.model');
  2469. if (RSFormProHelper::isJ('3.0')) {
  2470. JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_rsform/models');
  2471. $model = JModelLegacy::getInstance('mappings', 'RSFormModel');
  2472. } else {
  2473. JModel::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_rsform/models');
  2474. $model = JModel::getInstance('mappings', 'RSFormModel');
  2475. }
  2476. $columns = $model->getColumns($config);
  2477. $data = @unserialize($row->data);
  2478. if ($data === false) $data = array();
  2479. $where = @unserialize($row->wheredata);
  2480. if ($where === false) $where = array();
  2481. $extra = @unserialize($row->extra);
  2482. if ($extra === false) $extra = array();
  2483. $andor = @unserialize($row->andor);
  2484. if ($andor === false) $andor = array();
  2485. $operators = array(
  2486. JHTML::_('select.option', '=', JText::_( 'RSFP_OPERATOR_EQUALS' ) ),
  2487. JHTML::_('select.option', '!=', JText::_( 'RSFP_OPERATOR_NOTEQUAL' ) ),
  2488. JHTML::_('select.option', '>', JText::_( 'RSFP_OPERATOR_GREATER_THAN' ) ),
  2489. JHTML::_('select.option', '<', JText::_( 'RSFP_OPERATOR_LESS_THAN' ) ),
  2490. JHTML::_('select.option', '>=', JText::_( 'RSFP_OPERATOR_EQUALS_GREATHER_THAN' ) ),
  2491. JHTML::_('select.option', '<=', JText::_( 'RSFP_OPERATOR_EQUALS_LESS_THAN' ) ),
  2492. JHTML::_('select.option', '%..%', JText::_( 'RSFP_OPERATOR_LIKE' ) ),
  2493. JHTML::_('select.option', '%..', JText::_( 'RSFP_OPERATOR_STARTS_WITH' ) ),
  2494. JHTML::_('select.option', '..%', JText::_( 'RSFP_OPERATOR_ENDS_WITH' ) ),
  2495. );
  2496. $html = '';
  2497. $html .= ($method == 'set') ? JText::_('RSFP_SET').'<hr />' : JText::_('RSFP_WHERE').'<hr />';
  2498. $html .= '<table class="admintable">';
  2499. if (!empty($columns))
  2500. {
  2501. $html .= '<tr>';
  2502. $html .= '<td>&nbsp;</td>';
  2503. if ($method == 'where')
  2504. {
  2505. $html .= '<td>&nbsp;</td>';
  2506. $html .= '<td>&nbsp;</td>';
  2507. }
  2508. $html .= '<td align="right"><button class="rs_button" type="submit">'.JText::_('SAVE').'</button></td>';
  2509. $html .= '</tr>';
  2510. }
  2511. if (!empty($columns))
  2512. foreach ($columns as $column => $type)
  2513. {
  2514. if ($method == 'set')
  2515. {
  2516. $value = isset($data[$column]) ? $data[$column] : '';
  2517. $name = 'f_'.$column;
  2518. } else
  2519. {
  2520. $value = isset($where[$column]) ? $where[$column] : '';
  2521. $name = 'w_'.$column;
  2522. $op = isset($extra[$column]) ? $extra[$column] : '=';
  2523. $op2 = isset($andor[$column]) ? $andor[$column] : 0;
  2524. }
  2525. $html .= '<tr>';
  2526. $html .= '<td width="80" nowrap="nowrap" align="right" class="key">'.$column.' ('.$type.')</td>';
  2527. if ($method == 'where')
  2528. $html .= '<td>'.JHTML::_('select.genericlist', $operators, 'o_'.$column, 'class="inputbox"', 'value', 'text',$op).'</td>';
  2529. if (strpos($type, 'text') !== false)
  2530. $html .= '<td><textarea class="rs_textarea" onclick="toggleDropdown(this,returnMappingsExtra());" onkeydown="closeAllDropdowns();" style="width:300px; height: 200px;" id="'.RSFormProHelper::htmlEscape($name).'" name="'.RSFormProHelper::htmlEscape($name).'">'.RSFormProHelper::htmlEscape($value).'</textarea></td>';
  2531. else
  2532. $html .= '<td><input type="text" class="rs_inp rs_80" onclick="toggleDropdown(this,returnMappingsExtra());" onkeydown="closeAllDropdowns();" size="35" value="'.RSFormProHelper::htmlEscape($value).'" id="'.RSFormProHelper::htmlEscape($name).'" name="'.RSFormProHelper::htmlEscape($name).'"></td>';
  2533. if ($method == 'where')
  2534. $html .= '<td>'.JHTML::_('select.booleanlist', 'c_'.$column, 'class="inputbox"', $op2,'RSFP_OR','RSFP_AND').'</td>';
  2535. $html .= '</tr>';
  2536. }
  2537. if (!empty($columns))
  2538. {
  2539. $html .= '<tr>';
  2540. $html .= '<td>&nbsp;</td>';
  2541. if ($method == 'where')
  2542. {
  2543. $html .= '<td>&nbsp;</td>';
  2544. $html .= '<td>&nbsp;</td>';
  2545. }
  2546. $html .= '<td align="right"><button class="rs_button" type="submit">'.JText::_('SAVE').'</button></td>';
  2547. $html .= '</tr>';
  2548. }
  2549. $html .= '</table>';
  2550. return $html;
  2551. }
  2552. public static function getMappingQuery($row)
  2553. {
  2554. $db = JFactory::getDBO();
  2555. $query = '';
  2556. $database = '';
  2557. if (!empty($row->database))
  2558. {
  2559. if ($row->connection)
  2560. $database = $row->database.'.';
  2561. }
  2562. //get the fields
  2563. $data = @unserialize($row->data);
  2564. if ($data === false) $data = array();
  2565. //get the where fields
  2566. $wheredata = @unserialize($row->wheredata);
  2567. if ($wheredata === false) $wheredata = array();
  2568. //get the operators
  2569. $extra = @unserialize($row->extra);
  2570. if ($extra === false) $extra = array();
  2571. //get the and / or operators
  2572. $andor = @unserialize($row->andor);
  2573. if ($andor === false) $andor = array();
  2574. $set = array();
  2575. $where = '';
  2576. //make the WHERE cause
  2577. $i = 0;
  2578. if (!empty($wheredata))
  2579. foreach ($wheredata as $column => $field)
  2580. {
  2581. $andorop = isset($andor[$column]) ? $andor[$column] : 0;
  2582. $andorop = $andorop ? "OR" : "AND";
  2583. $operator = isset($extra[$column]) ? $extra[$column] : '=';
  2584. $where .= $i ? " ".$andorop." " : '';
  2585. if ($operator == '%..%')
  2586. $where .= " ".$db->quoteName($column)." LIKE '%".$db->escape($field)."%' ";
  2587. elseif ($operator == '%..')
  2588. $where .= " ".$db->quoteName($column)." LIKE '%".$db->escape($field)."' ";
  2589. elseif ($operator == '..%')
  2590. $where .= " ".$db->quoteName($column)." LIKE '".$db->escape($field)."%' ";
  2591. else
  2592. $where .= " ".$db->quoteName($column)." ".$operator." '".$db->escape($field)."' ";
  2593. $i++;
  2594. }
  2595. //the WHERE cause
  2596. $where = !empty($where) ? " WHERE ".$where : '';
  2597. if (!empty($data))
  2598. foreach ($data as $column => $field)
  2599. $set[] = $db->quoteName($column)." = '".$db->escape($field)."'";
  2600. if ($row->method == 0)
  2601. $query = "INSERT INTO ".$database.$db->quoteName($row->table)." SET ".implode(' , ',$set);
  2602. if ($row->method == 1)
  2603. $query = "UPDATE ".$database.$db->quoteName($row->table)." SET ".implode(' , ',$set).$where;
  2604. if ($row->method == 2)
  2605. $query = "DELETE FROM ".$database.$db->quoteName($row->table).$where;
  2606. return $query;
  2607. }
  2608. public static function escapeSql(&$value)
  2609. {
  2610. $db = JFactory::getDBO();
  2611. $value = $db->escape($value);
  2612. }
  2613. public static function sendMail($from, $fromname, $recipient, $subject, $body, $mode=0, $cc=null, $bcc=null, $attachment=null, $replyto=null, $replytoname=null)
  2614. {
  2615. // Get a JMail instance
  2616. $mail = JFactory::getMailer();
  2617. $config = JFactory::getConfig();
  2618. $mailfrom = $config->get('mailfrom');
  2619. $mail->ClearReplyTos();
  2620. $mail->setSender(array($from, $fromname));
  2621. $mail->setSubject($subject);
  2622. $mail->setBody($body);
  2623. // Are we sending the email as HTML?
  2624. if ($mode)
  2625. $mail->IsHTML(true);
  2626. $mail->addRecipient($recipient);
  2627. $mail->addCC($cc);
  2628. $mail->addBCC($bcc);
  2629. $mail->addAttachment($attachment);
  2630. // Take care of reply email addresses
  2631. if (is_array($replyto)) {
  2632. $mail->ClearReplyTos();
  2633. $numReplyTo = count($replyto);
  2634. for ($i = 0; $i < $numReplyTo; $i++)
  2635. {
  2636. $mail->addReplyTo(array($replyto[$i], $replytoname[$i]));
  2637. }
  2638. }
  2639. else if (!empty($replyto)) {
  2640. $mail->ClearReplyTos();
  2641. $mail->addReplyTo(array($replyto, $replytoname));
  2642. }
  2643. return $mail->Send();
  2644. }
  2645. public static function renderHTML() {
  2646. $args = func_get_args();
  2647. if (RSFormProHelper::isJ('3.0')) {
  2648. if ($args[0] == 'select.booleanlist') {
  2649. // 0 - type
  2650. // 1 - name
  2651. // 2 - additional
  2652. // 3 - value
  2653. // 4 - yes
  2654. // 5 - no
  2655. // get the radio element
  2656. $radio = JFormHelper::loadFieldType('radio');
  2657. // setup the properties
  2658. $name = self::htmlEscape($args[1]);
  2659. $additional = isset($args[2]) ? (string) $args[2] : '';
  2660. $value = $args[3];
  2661. $yes = isset($args[4]) ? self::htmlEscape($args[4]) : 'JYES';
  2662. $no = isset($args[5]) ? self::htmlEscape($args[5]) : 'JNO';
  2663. // prepare the xml
  2664. $element = new SimpleXMLElement('<field name="'.$name.'" type="radio" class="btn-group"><option '.$additional.' value="0">'.$no.'</option><option '.$additional.' value="1">'.$yes.'</option></field>');
  2665. // run
  2666. $radio->setup($element, $value);
  2667. return $radio->input;
  2668. }
  2669. } else {
  2670. if ($args[0] == 'select.booleanlist') {
  2671. $name = $args[1];
  2672. $additional = isset($args[2]) ? (string) $args[2] : '';
  2673. $value = $args[3];
  2674. $yes = isset($args[4]) ? self::htmlEscape($args[4]) : 'JYES';
  2675. $no = isset($args[5]) ? self::htmlEscape($args[5]) : 'JNO';
  2676. return JHtml::_($args[0], $name, $additional, $value, $yes, $no);
  2677. }
  2678. }
  2679. }
  2680. }