public static function showForm($formId, $val = array(), $validation = array())
 {
     $mainframe = JFactory::getApplication();
     $formId = (int) $formId;
     $db = JFactory::getDBO();
     $doc = JFactory::getDocument();
     $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'");
     $form = $db->loadObject();
     $lang = RSFormProHelper::getCurrentLanguage();
     $translations = RSFormProHelper::getTranslations('forms', $form->FormId, $lang);
     if ($translations) {
         foreach ($translations as $field => $value) {
             if (isset($form->{$field})) {
                 $form->{$field} = $value;
             }
         }
     }
     if ($form->JS) {
         $doc->addCustomTag($form->JS);
     }
     if ($form->CSS) {
         $doc->addCustomTag($form->CSS);
     }
     if ($form->ThemeParams) {
         RSFormProHelper::loadTheme($form);
     }
     $doc->addStyleSheet(JURI::root(true) . '/components/com_rsform/assets/css/front.css');
     if ($doc->getDirection() == 'rtl') {
         $doc->addStyleSheet(JURI::root(true) . '/components/com_rsform/assets/css/front-rtl.css');
     }
     $doc->addScript(JURI::root(true) . '/components/com_rsform/assets/js/script.js?v=' . _RSFORM_REVISION);
     $calendars = RSFormProHelper::componentExists($formId, 6);
     //6 is the componentTypeId for calendar
     if (!empty($calendars)) {
         $doc->addStyleSheet(JURI::root(true) . '/components/com_rsform/assets/calendar/calendar.css');
         $hidden = JRequest::getVar('hidden');
         $all_data = RSFormProHelper::getComponentProperties($calendars);
         foreach ($calendars as $i => $calendarComponentId) {
             $data = $all_data[$calendarComponentId];
             $calendars['CALENDARLAYOUT'][$i] = $data['CALENDARLAYOUT'];
             $calendars['DATEFORMAT'][$i] = $data['DATEFORMAT'];
             $calendars['VALUES'][$i] = '';
             $calendars['EXTRA'][$i] = array();
             if (!empty($hidden[$data['NAME']])) {
                 $calendars['VALUES'][$i] = preg_replace('#[^0-9\\/]+#i', '', $hidden[$data['NAME']]);
             }
             if (isset($data['MINDATE'])) {
                 $data['MINDATE'] = RSFormProHelper::isCode($data['MINDATE']);
             }
             if (isset($data['MAXDATE'])) {
                 $data['MAXDATE'] = RSFormProHelper::isCode($data['MAXDATE']);
             }
             if (!empty($data['MINDATE'])) {
                 $calendars['EXTRA'][$i][] = "'mindate': '" . $data['MINDATE'] . "'";
             }
             if (!empty($data['MAXDATE'])) {
                 $calendars['EXTRA'][$i][] = "'maxdate': '" . $data['MAXDATE'] . "'";
             }
             if (!empty($data['VALIDATIONCALENDAR'])) {
                 list($rule, $otherCalendar) = explode(' ', $data['VALIDATIONCALENDAR']);
                 if (isset($all_data[$otherCalendar])) {
                     $calendars['EXTRA'][$i][] = "'rule': '" . $rule . '|' . $all_data[$otherCalendar]['NAME'] . "'";
                 }
             }
             $calendars['EXTRA'][$i] = '{' . implode(', ', $calendars['EXTRA'][$i]) . '}';
         }
         unset($all_data);
         $calendarsLayout = "'" . implode("','", $calendars['CALENDARLAYOUT']) . "'";
         $calendarsFormat = "'" . implode("','", $calendars['DATEFORMAT']) . "'";
         $calendarsValues = "'" . implode("','", $calendars['VALUES']) . "'";
         $calendarsExtra = implode(',', $calendars['EXTRA']);
     }
     $formLayout = $form->FormLayout;
     unset($form->FormLayout);
     $errorMessage = $form->ErrorMessage;
     unset($form->ErrorMessage);
     $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");
     $components = $db->loadObjectList();
     $pages = array();
     $page_progress = array();
     $submits = array();
     foreach ($components as $component) {
         if ($component->ComponentTypeId == 41) {
             $pages[] = $component->ComponentId;
         } elseif ($component->ComponentTypeId == 13) {
             $submits[] = $component->ComponentId;
         }
     }
     $start_page = 0;
     if (!empty($validation)) {
         foreach ($components as $component) {
             if (in_array($component->ComponentId, $validation)) {
                 break;
             }
             if ($component->ComponentTypeId == 41) {
                 $start_page++;
             }
         }
     }
     $find = array();
     $replace = array();
     $all_data = RSFormProHelper::getComponentProperties($components);
     foreach ($components as $component) {
         $data = $all_data[$component->ComponentId];
         $data['componentTypeId'] = $component->ComponentTypeId;
         $data['ComponentTypeName'] = $component->ComponentTypeName;
         $data['Order'] = $component->Order;
         // Pagination
         if ($component->ComponentTypeId == 41) {
             $data['PAGES'] = $pages;
             $page_progress[] = array('show' => @$data['DISPLAYPROGRESS'] == 'YES', 'text' => @$data['DISPLAYPROGRESSMSG']);
         } elseif ($component->ComponentTypeId == 13) {
             $data['SUBMITS'] = $submits;
             if ($component->ComponentId == end($submits)) {
                 $page_progress[] = array('show' => @$data['DISPLAYPROGRESS'] == 'YES', 'text' => @$data['DISPLAYPROGRESSMSG']);
             }
         }
         // Caption
         $find[] = '{' . $component->name . ':caption}';
         $caption = '';
         if (isset($data['SHOW']) && $data['SHOW'] == 'NO') {
             $caption = '';
         } elseif (isset($data['CAPTION'])) {
             $caption = $data['CAPTION'];
         }
         $replace[] = $caption;
         // Body
         $find[] = '{' . $component->name . ':body}';
         $replace[] = RSFormProHelper::getFrontComponentBody($formId, $component->ComponentId, $data, $val, in_array($component->ComponentId, $validation), $form->FormLayoutName);
         // Description
         $find[] = '{' . $component->name . ':description}';
         $description = '';
         if (isset($data['SHOW']) && $data['SHOW'] == 'NO') {
             $description = '';
         } elseif (isset($data['DESCRIPTION'])) {
             $descrtmp = $data['DESCRIPTION'];
         }
         if (trim($descrtmp) != '') {
             $description = '<a data-placement="top" rel="clickover" data-original-title="info" data-content="' . $descrtmp . '" class="btn btn-small btn-link">info</a>';
         } else {
             $description = '';
         }
         $replace[] = $description;
         // Validation message
         $find[] = '{' . $component->name . ':validation}';
         $validationMessage = '';
         if (isset($data['SHOW']) && $data['SHOW'] == 'NO') {
             $validationMessage = '';
         } elseif (isset($data['VALIDATIONMESSAGE'])) {
             if (!empty($validation) && in_array($component->ComponentId, $validation)) {
                 $validationMessage = '<span id="component' . $component->ComponentId . '" class="formError">' . $data['VALIDATIONMESSAGE'] . '</span>';
             } else {
                 $validationMessage = '<span id="component' . $component->ComponentId . '" class="formNoError">' . $data['VALIDATIONMESSAGE'] . '</span>';
             }
         }
         $replace[] = $validationMessage;
     }
     unset($all_data);
     $u = RSFormProHelper::getURL();
     //Trigger Event - onInitFormDisplay
     $mainframe->triggerEvent('rsfp_f_onInitFormDisplay', array(array('find' => &$find, 'replace' => &$replace, 'formLayout' => &$formLayout)));
     $user = JFactory::getUser();
     $jconfig = JFactory::getConfig();
     array_push($find, '{global:formtitle}', '{global:username}', '{global:userip}', '{global:userid}', '{global:useremail}', '{global:fullname}', '{global:sitename}', '{global:siteurl}');
     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());
     $formLayout = str_replace($find, $replace, $formLayout);
     if (strpos($formLayout, 'class="formError"') !== false) {
         $formLayout = str_replace('{error}', $errorMessage, $formLayout);
     } elseif ($form->AjaxValidation) {
         $formLayout = str_replace('{error}', '<div id="rsform_error_' . $formId . '" style="display: none;">' . $errorMessage . '</div>', $formLayout);
     } else {
         $formLayout = str_replace('{error}', '', $formLayout);
     }
     $formLayout .= '<input type="hidden" name="form[formId]" value="' . $formId . '"/>';
     if ($form->FormLayoutName == 'responsive') {
         $form->CSSClass .= ' formResponsive';
         if (RSFormProHelper::getConfig('auto_responsive')) {
             $doc->addCustomTag('<meta name="viewport" content="width=device-width, initial-scale=1.0">');
             $mainframe->registerEvent('onAfterRender', '_modifyResponsiveTemplate');
         }
     }
     if ($form->FormLayoutName == 'bootstrap-horizontal') {
         $form->CSSClass .= ' form-horizontal';
     }
     if ($form->FormLayoutName == 'bootstrap-vertical') {
         $form->CSSClass .= ' form-vertical';
     }
     $CSSClass = $form->CSSClass ? ' class="' . RSFormProHelper::htmlEscape(trim($form->CSSClass)) . '"' : '';
     $CSSId = $form->CSSId ? ' id="' . RSFormProHelper::htmlEscape(trim($form->CSSId)) . '"' : '';
     $CSSName = $form->CSSName ? ' name="' . RSFormProHelper::htmlEscape(trim($form->CSSName)) . '"' : '';
     $u = $form->CSSAction ? RSFormProHelper::htmlEscape($form->CSSAction) : $u;
     $CSSAdditionalAttributes = $form->CSSAdditionalAttributes ? ' ' . trim($form->CSSAdditionalAttributes) : '';
     if (!empty($pages)) {
         $total_pages = count($pages) + 1;
         $step = floor(100 / $total_pages);
         $replace_progress = array('{page}', '{total}', '{percent}');
         $with_progress = array(1, $total_pages, $step * 1);
         $progress = reset($page_progress);
         $progress_script = '';
         $formLayout = '<div id="rsform_progress_' . $formId . '" class="rsformProgress">' . ($progress['show'] ? str_replace($replace_progress, $with_progress, $progress['text']) : '') . '</div>' . "\n" . $formLayout;
         foreach ($page_progress as $p => $progress) {
             $progress['text'] = str_replace(array("\r", "\n"), array('', '\\n'), addcslashes($progress['text'], "'"));
             $replace_progress = array('{page}', '{total}', '{percent}');
             $with_progress = array($p + 1, $total_pages, $p + 1 == $total_pages ? 100 : $step * ($p + 1));
             $progress_script .= "if (page == " . $p . ") document.getElementById('rsform_progress_" . $formId . "').innerHTML = '" . ($progress['show'] ? str_replace($replace_progress, $with_progress, $progress['text']) : '') . "';";
         }
         $formLayout .= "\n" . '<script type="text/javascript">' . "\n" . 'function rsfp_showProgress_' . $formId . '(page) {' . "\n" . $progress_script . "\n" . '}' . "\n" . '</script>';
     }
     $formLayout = '<form method="post" ' . $CSSId . $CSSClass . $CSSName . $CSSAdditionalAttributes . ' enctype="multipart/form-data" action="' . RSFormProHelper::htmlEscape($u) . '">' . $formLayout . '</form>';
     if ($prices = self::$prices) {
         $formLayout .= "\n" . '<script type="text/javascript">' . "\n" . implode("\n", $prices) . "\n" . '</script>' . "\n";
     }
     if (!empty($calendars)) {
         $formLayout .= "\n" . '<script type="text/javascript" src="' . JURI::root(true) . '/components/com_rsform/assets/calendar/cal.js?v=' . _RSFORM_REVISION . '"></script>' . "\n";
         $formLayout .= '<script type="text/javascript">' . RSFormProHelper::getCalendarJS() . '</script>' . "\n";
         $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";
     }
     if (!empty($pages)) {
         $formLayout .= '<script type="text/javascript" src="' . JURI::root(true) . '/components/com_rsform/assets/js/pages.js?v=' . _RSFORM_REVISION . '"></script>' . "\n";
         $formLayout .= '<script type="text/javascript">rsfp_changePage(' . $formId . ', ' . $start_page . ', ' . count($pages) . ');</script>' . "\n";
     }
     if ($form->AjaxValidation || !empty($pages)) {
         $formLayout .= '<script type="text/javascript">var rsfp_ajax_root = \'' . addslashes(JURI::root(true)) . '\';</script>';
     }
     if ($form->AjaxValidation) {
         $formLayout .= '<script type="text/javascript">rsfp_addEvent(window, \'load\', function(){var form = rsfp_getForm(' . $formId . '); form.onsubmit = ajaxValidation;});</script>';
     }
     $ajaxScript = '';
     $mainframe->triggerEvent('rsfp_f_onAJAXScriptCreate', array(array('script' => &$ajaxScript, 'formId' => $formId)));
     $formLayout .= '<script type="text/javascript">';
     $formLayout .= 'ajaxExtraValidationScript[' . $formId . '] = function(task, formId, data) {';
     $formLayout .= 'var formComponents = {};';
     foreach ($components as $component) {
         if (in_array($component->ComponentTypeId, array(7, 9, 10, 11, 12, 13, 15, 41))) {
             continue;
         }
         $formLayout .= "formComponents[" . $component->ComponentId . "]='" . $component->name . "';";
     }
     $formLayout .= "if (task == 'afterSend') {";
     $formLayout .= "\r\n\t\tvar ids = data.response[0].split(',');\r\n\t\tfor (var i=0; i<ids.length; i++) {\r\n\t\t\tvar id = parseInt(ids[i]);\r\n\t\t\tif (!isNaN(id) && typeof formComponents[id] != 'undefined') {\r\n\t\t\t\tvar formComponent = rsfp_getFieldsByName(formId, formComponents[id]);\r\n\t\t\t\tif (formComponent && formComponent.length > 0) {\r\n\t\t\t\t\tfor (var j=0; j<formComponent.length; j++) {\r\n\t\t\t\t\t\tif (formComponent[j]) {\r\n\t\t\t\t\t\t\tformComponent[j].className = formComponent[j].className.replace(' rsform-error', '');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tvar ids = data.response[1].split(',');\r\n\t\tfor (var i=0; i<ids.length; i++) {\r\n\t\t\tvar id = parseInt(ids[i]);\r\n\t\t\tif (!isNaN(id) && typeof formComponents[id] != 'undefined') {\r\n\t\t\t\tvar formComponent = rsfp_getFieldsByName(formId, formComponents[id]);\r\n\t\t\t\tif (formComponent && formComponent.length > 0) {\r\n\t\t\t\t\tfor (var j=0; j<formComponent.length; j++) {\r\n\t\t\t\t\t\tif (formComponent[j]) {\r\n\t\t\t\t\t\t\tformComponent[j].className = formComponent[j].className.replace(' rsform-error', '') + ' rsform-error';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t";
     $formLayout .= "}\n";
     // has this been modified?
     if ($ajaxScript) {
         $formLayout .= $ajaxScript;
     }
     $formLayout .= '}';
     $formLayout .= '</script>';
     if ($conditions = RSFormProHelper::getConditions($formId)) {
         $formLayout .= '<script type="text/javascript">';
         foreach ($conditions as $condition) {
             $formLayout .= "\n" . 'function rsfp_runCondition' . $condition->id . '(){';
             if ($condition->details) {
                 $condition_vars = array();
                 foreach ($condition->details as $detail) {
                     $formLayout .= "\n" . "isChecked = rsfp_verifyChecked(" . $formId . ", '" . addslashes($detail->ComponentName) . "', '" . addslashes($detail->value) . "');";
                     $formLayout .= "\n" . "condition" . $detail->id . " = isChecked == " . ($detail->operator == 'is' ? 'true' : 'false') . ";";
                     $condition_vars[] = "condition" . $detail->id;
                 }
                 if ($condition->block) {
                     $block = JFilterOutput::stringURLSafe($condition->ComponentName);
                     $formLayout .= "\n" . "items = rsfp_getBlock(" . $formId . ", '" . addslashes($block) . "');";
                 } else {
                     $formLayout .= "\n" . "items = rsfp_getFieldsByName(" . $formId . ", '" . addslashes($condition->ComponentName) . "');";
                 }
                 $formLayout .= "\n" . "if (items) {";
                 $formLayout .= "\n" . "if (" . implode($condition->condition == 'all' ? '&&' : '||', $condition_vars) . ")";
                 $formLayout .= "\n" . "rsfp_setDisplay(items, '" . ($condition->action == 'show' ? '' : 'none') . "');";
                 $formLayout .= "\n" . 'else';
                 $formLayout .= "\n" . "rsfp_setDisplay(items, '" . ($condition->action == 'show' ? 'none' : '') . "');";
                 $formLayout .= "\n" . "}";
             }
             $formLayout .= "\n" . '}';
             $formLayout .= "\n" . 'rsfp_runCondition' . $condition->id . '();';
             if ($condition->details) {
                 foreach ($condition->details as $detail) {
                     $formLayout .= "\n" . "rsfp_addCondition(" . $formId . ", '" . addslashes($detail->ComponentName) . "', rsfp_runCondition" . $condition->id . ");";
                 }
             }
         }
         $formLayout .= "\n" . '</script>';
     }
     if ($calculations = RSFormProHelper::getCalculations($formId)) {
         require_once dirname(__FILE__) . '/calculations.php';
         $formLayout .= "\n" . '<script type="text/javascript">';
         $formLayout .= "\n" . 'function rsfp_Calculations' . $formId . '(){';
         foreach ($calculations as $calculation) {
             $expression = RSFormProCalculations::expression($calculation, $formId);
             $formLayout .= "\n" . $expression . "\n";
         }
         $formLayout .= "\n" . '}';
         $formLayout .= "\n" . 'rsfp_Calculations' . $formId . '();';
         $formLayout .= RSFormProCalculations::getFields($calculations, $formId);
         $formLayout .= "\n" . 'rsfp_setCalculationsEvents(' . $formId . ',rsfpCalculationFields' . $formId . ');';
         $formLayout .= "\n" . '</script>';
     }
     $maps = RSFormProHelper::componentExists($formId, 212);
     //212 is the componentTypeId for maps
     if (!empty($maps)) {
         $formLayout .= "\n" . '<script type="text/javascript">';
         foreach ($maps as $map) {
             $formLayout .= RSFormProHelper::generateMap($map, $validation);
         }
         $formLayout .= "\n" . '</script>';
     }
     $RSadapter = RSFormProHelper::getLegacyAdapter();
     eval($form->ScriptDisplay);
     //Trigger Event - onBeforeFormDisplay
     $mainframe->triggerEvent('rsfp_f_onBeforeFormDisplay', array(array('formLayout' => &$formLayout, 'formId' => $formId)));
     return $formLayout;
 }