<?php
/**
 * BreezingForms - A Joomla Forms Application
 * @version 1.9
 * @package BreezingForms
 * @copyright (C) 2008-2020 by Markus Bopp
 * @license Released under the terms of the GNU General Public License
 * */
defined('_JEXEC') or die('Direct Access to this location is not allowed.');

class bfRecordManagement {

	private $version = '1.5';
	private $tz = 'UTC';

	function __construct() {
		jimport('joomla.filesystem.file');
		jimport('joomla.filesystem.folder');

		jimport('joomla.version');
		$version = new JVersion();
		$this->version = $version->getShortVersion();

		if (version_compare($this->version, '3.2', '>=')) {
			$this->tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));
		}

		if (version_compare($this->version, '2.5', '>=') && version_compare($this->version, '3.0', '<')) {
			JFactory::getDocument()->addStyleDeclaration('
                #bfRecordsTableContainer{
                    padding-top: 30px;
                }
            ');
		}
		// bfRecordsTableContainer
	}

	function saveFilterState() {
		@ob_end_clean();

		if (JRequest::getInt('form_id') > 0) {

			$db = JFactory::getDbo();

			$db->setQuery("Update #__facileforms_forms Set filter_state = " . $db->quote(serialize($_POST)) . " Where id = " . $db->quote(JRequest::getInt('form_id')));
			$db->query();
		}
		exit;
	}

	function getAvailableFields() {

		@ob_end_clean();

		$out = array();

		$db = JFactory::getDbo();

		$db->setQuery("Select * From #__facileforms_elements Where published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5' And  form = " . JRequest::getInt('form_id', 0) . " Order By `ordering`");

		$out['fields'] = $db->loadAssocList();

		$db->setQuery("Select filter_state From #__facileforms_forms Where id = " . JRequest::getInt('form_id', 0));

		$out['filter_state'] = @unserialize($db->loadResult());

		echo json_encode($out);

		exit;
	}

	function setFlag() {
		@ob_end_clean();

		$column = explode('bfrecord_', JRequest::getCmd('column', ''));
		if (count($column) == 2) {
			$db = JFactory::getDbo();
			$db->setQuery("Update #__facileforms_records Set `" . $column[1] . "` = " . $db->quote(JRequest::getInt('flag', 0)) . " Where id = " . $db->quote(JRequest::getInt('record_id')));
			$db->query();
		}

		exit;
	}

	function setFlags($column) {
		$db = JFactory::getDbo();

		$ids = JRequest::getVar('cid', array());
		JArrayHelper::toInteger($ids);
		if (count($ids)) {
			$db = JFactory::getDbo();
			$db->setQuery("Update #__facileforms_records Set `" . $column . "` = 1 Where id In (" . implode(',', $ids) . ")");
			$db->query();
		}
	}

	function getTableBar() {

		$out = '';

		$db = JFactory::getDbo();

		// available forms

		$db->setQuery("Select * From #__facileforms_forms Order By `title`");
		$forms = $db->loadAssocList();

		$out = '<form onsubmit="return false;" style="display: inline;">';
		$out .= '<select name="form_selection" id="bfFormSelection">' . "\n";
		$out .= '<option value="0">' . htmlentities(BFText::_('COM_BREEZINGFORMS_ALL'), ENT_QUOTES, 'UTF-8') . '</option>' . "\n";
		foreach ($forms As $form) {

			$out .= '<option value="' . $form['id'] . '">' . htmlentities($form['title'], ENT_QUOTES, 'UTF-8') . ' (' . htmlentities($form['name'], ENT_QUOTES, 'UTF-8') . ')</option>' . "\n";
		}

		$out .= '</select>' . "\n";
		$out .= '</form>';

		// text search
		$out .= '<form onsubmit="return false;">';
		$out .= '<div id="bfSearchMenu">';
		$out .= '<div id="bfSearchWrapper"><div id="bfSearchOpen">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHRECORDS'), ENT_QUOTES, 'UTF-8') . '</div>';
		$out .= '<div id="bfSearch">' . "\n";
		$out .= '<label for="bfrecordsearch">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHTEXT'), ENT_QUOTES, 'UTF-8') . '</label>';
		$out .= '<input type="text" value="" name="bfrecordsearch" id="bfrecordsearch"/>';

		$out .= '<label for="bfrecordsearchintext">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERIN'), ENT_QUOTES, 'UTF-8') . '</label>';

		$out .= '<br/>';

		$out .= '<table style="width: 100%" border="0">';
		$out .= '<tr>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinuserid" id="bfrecordsearchinuserid" /> <label for="bfrecordsearchinuserid">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINUSERID'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinusername" id="bfrecordsearchinusername" /> <label for="bfrecordsearchinusername">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINUSERNAME'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinuserfullname" id="bfrecordsearchinuserfullname" /> <label for="bfrecordsearchinuserfullname">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINUSERFULLNAME'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '</tr>';
		$out .= '<tr>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinid" id="bfrecordsearchinid" /> <label for="bfrecordsearchinid">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINID'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinip" id="bfrecordsearchinip" /> <label for="bfrecordsearchinip">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINIP'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinviewed" id="bfrecordsearchinviewed" /> <label for="bfrecordsearchinviewed">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINVIEWED'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '</tr>';
		$out .= '<tr>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinexported" id="bfrecordsearchinexported" /> <label for="bfrecordsearchinexported">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINEXPORTED'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinarchived" id="bfrecordsearchinarchived" /> <label for="bfrecordsearchinarchived">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINARCHIVED'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '<td>';

		$out .= '<input type="checkbox" value="1" name="bfrecordsearchinpayment" id="bfrecordsearchinpayment" /> <label for="bfrecordsearchinpayment">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINPAYMENT'), ENT_QUOTES, 'UTF-8') . '</label> ';

		$out .= '</td>';
		$out .= '</tr>';
		$out .= '<tr>';

        $out .= '<td>';

        $out .= '<input type="checkbox" value="1" name="bfrecordsearchinopted" id="bfrecordsearchinopted" /> <label for="bfrecordsearchinopted">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINOPTED'), ENT_QUOTES, 'UTF-8') . '</label> ';

        $out .= '</td>';

        $out .= '<td colspan="2">';

        $out .= '<span id="bfrecordsearchintextspan">';
        $out .= '<input type="checkbox" checked="checked" value="1" name="bfrecordsearchintext" id="bfrecordsearchintext" /> <label for="bfrecordsearchintext">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHFILTERINTEXT'), ENT_QUOTES, 'UTF-8') . '</label> ';
        $out .= '</span>';

        $out .= '</td>';
        $out .= '</tr>';


		$out .= '</table>';

		$out .= '<br/>';

		// date & time based search

		$out .= '<div id="bfrecordsearchdatefromtowrap">';

		$out .= '<div id="bfrecordsearchdatefromwrap">';
		$out .= '<label for="bfrecordsearchdatefrom">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHDATEFROM'), ENT_QUOTES, 'UTF-8') . '</label>';
		$out .= '<br/>';
		$out .= '<input type="text" value="" name="bfrecordsearchdatefrom" id="bfrecordsearchdatefrom"/>';
		$out .= '</div>';

		$out .= '<div id="bfrecordsearchtimefromwrap">';
		$out .= '<label for="bfrecordsearchtimefrom">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHTIMEFROM'), ENT_QUOTES, 'UTF-8') . '</label>';
		$out .= '<br/>';
		$out .= '<input type="text" value="" name="bfrecordsearchtimefrom" id="bfrecordsearchtimefrom"/>';
		$out .= '</div>';

		$out .= '</div>';

		$out .= '<div style="clear:both;"></div>';

		$out .= '<div id="bfrecordsearchtimefromtowrap">';

		$out .= '<div id="bfrecordsearchdatetowrap">';
		$out .= '<label for="bfrecordsearchdateto">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHDATETO'), ENT_QUOTES, 'UTF-8') . '</label>';
		$out .= '<br/>';
		$out .= '<input type="text" value="" name="bfrecordsearchdateto" id="bfrecordsearchdateto"/>';
		$out .= '</div>';

		$out .= '<div id="bfrecordsearchtimetowrap">';
		$out .= '<label for="bfrecordsearchtimeto">' . htmlentities(BFText::_('COM_BREEZINGFORMS_SEARCHTIMETO'), ENT_QUOTES, 'UTF-8') . '</label>';
		$out .= '<br/>';
		$out .= '<input type="text" value="" name="bfrecordsearchtimeto" id="bfrecordsearchtimeto"/>';
		$out .= '</div>';

		$out .= '</div>';

		$out .= '<div style="clear: both;"></div>';

		$out .= '<button class="btn btn-primary button bfFilterTriggerer">' . htmlentities(BFText::_('COM_BREEZINGFORMS_BUTTONFILTER'), ENT_QUOTES, 'UTF-8') . '</button> ';
		$out .= '<input type="reset" class="btn btn-secondary" value="' . htmlentities(BFText::_('COM_BREEZINGFORMS_BUTTONFILTERRESET'), ENT_QUOTES, 'UTF-8') . '"/se> ';
		$out .= '</div>';
		$out .= '</div>';
		$out .= '</div>';

		$out .= '<div id="bfAvailableFieldsMenu">';
		$out .= '<div id="bfAvailableFieldsWrapper"><div id="bfAvailableFieldsOpen">' . htmlentities(BFText::_('COM_BREEZINGFORMS_OPENFIELDS'), ENT_QUOTES, 'UTF-8') . '</div>';
		$out .= '<div id="bfAvailableFields"></div>' . "\n";
		$out .= '</div>';
		$out .= '</div>';

		$out .= '<div style="clear: both;"></div>';

		$out .= '</form>';

		$out .= '<form name="bfSelectionForm" id="bfSelectionForm" method="post" action="">';
		$out .= '</form>';


		return $out;
	}

	function editRecord() {
		
	}

	function getCsvImport() {

		global $ff_config;

		$form = JRequest::getInt('form_selection');
		JFactory::getSession()->set('form', $form);
		if ($form == 0) {
			echo BFText::_('COM_BREEZINGFORMS_IMPORT_CSV_MSG');
			return;
		}
		?>

		<form action="index.php?option=com_breezingforms&act=managerecords&task=setcsvimport&tmpl=component" method="post" enctype="multipart/form-data">
			<select name=encoding>
				<option value="0">Encoding default UTF-8</option>
				<option value="UTF-16LE">UTF-16LE</option>
				<option value="WINDOWS-1250">WINDOWS-1250</option>
				<option value="WINDOWS-1251">WINDOWS-1251</option>
				<option value="WINDOWS-1252">WINDOWS-1252</option>
				<option value="WINDOWS-1253">WINDOWS-1253</option>
				<option value="WINDOWS-1254">WINDOWS-1254</option>
				<option value="WINDOWS-1255">WINDOWS-1255</option>
				<option value="WINDOWS-1256">WINDOWS-1256</option>
				<option value="ISO-8859-1">ISO-8859-1</option>
				<option value="ISO-8859-2">ISO-8859-2</option>
				<option value="ISO-8859-3">ISO-8859-3</option>
				<option value="ISO-8859-4">ISO-8859-4</option>
				<option value="ISO-8859-5">ISO-8859-5</option>
				<option value="ISO-8859-6">ISO-8859-6</option>
				<option value="ISO-8859-7">ISO-8859-7</option>
				<option value="ISO-8859-8">ISO-8859-8</option>
				<option value="ISO-8859-9">ISO-8859-9</option>
				<option value="ISO-8859-10">ISO-8859-10</option>
				<option value="ISO-8859-11">ISO-8859-11</option>
				<option value="ISO-8859-12">ISO-8859-12</option>
				<option value="ISO-8859-13">ISO-8859-13</option>
				<option value="ISO-8859-14">ISO-8859-14</option>
				<option value="ISO-8859-15">ISO-8859-15</option>
				<option value="ISO-8859-16">ISO-8859-16</option>
				<option value="UTF-8-MAC">UTF-8-MAC</option>
				<option value="UTF-16">UTF-16</option>
				<option value="UTF-16BE">UTF-16BE</option>
				<option value="UTF-32">UTF-32</option>
				<option value="UTF-32BE">UTF-32BE</option>
				<option value="UTF-32LE">UTF-32LE</option>
				<option value="ASCII">ASCII</option>
				<option value="BIG-5">BIG-5</option>
				<option value="HEBREW">HEBREW</option>
				<option value="CYRILLIC">CYRILLIC</option>
				<option value="ARABIC">ARABIC</option>
				<option value="GREEK">GREEK</option>
				<option value="CHINESE">CHINESE</option>
				<option value="KOREAN">KOREAN</option>
				<option value="KOI8-R">KOI8-R</option>
				<option value="KOI8-U">KOI8-U</option>
				<option value="KOI8-RU">KOI8-RU</option>
				<option value="EUC-JP">EUC-JP</option>
			</select><br>            
		<?php echo BFText::_('COM_BREEZINGFORMS_CSV_ENCODING_MSG') . '<br><br>'; ?>
			<input type="hidden" name="form_id" value="<?php echo JRequest::getInt('form_selection',0);?>" />
		<?php echo BFText::_('COM_BREEZINGFORMS_UPLOAD_MSG'); ?> <input type="file" name="csv_file" accept=".csv" />
			<input type="submit" value="<?php echo BFText::_('COM_BREEZINGFORMS_UPLOAD_FILE_MSG'); ?>" />
		</form>
			<?php
		}

		function utf8_fopen_read($fileName, $encoding) {
			$fc = iconv($encoding, 'UTF-8//TRANSLIT', file_get_contents($fileName));
			$handle = fopen("php://memory", "rw");
			fwrite($handle, $fc);
			fseek($handle, 0);
			return $handle;
		}

		function closeSquBox() {
			?>
		<script type="text/javascript">
		    window.top.location.href = "index.php?option=com_breezingforms&act=managerecords&task=";
		</script>
		<?php
	}

	function setCsvImport() { 

		$db = JFactory::getDbo();

		$form = JFactory::getSession()->get('form');
		$encoding = $_POST["encoding"];
		$file = $_FILES['csv_file']['tmp_name'];

		if (!@fopen($file, 'r')) {
			echo BFText::_('COM_BREEZINGFORMS_FILE_ERROR_MSG');
			return;
		}

		if ($encoding != '0') {
			if (!function_exists('iconv')) {
				echo BFText::_('COM_BREEZINGFORMS_NO_ICONV_MSG');
				return;
			}
			$handle = $this->utf8_fopen_read("$file", $encoding);
		} else {
			$handle = fopen("$file", "rb");
		}

		$i = 0;
		while (!feof($handle)) {
			$lines[$i] = fgets($handle);
			$i++;
		}

		if ($lines[0] == '') {
			echo BFText::_('COM_BREEZINGFORMS_EMPTY_FILE_MSG');
			return;
		}

		fclose($handle);




		$title = array();
		$record = array();
		$first = true;
		$j = 0;
		$records = array();

		foreach ($lines as $line) {

			if ($first) {
				$line = strtolower($line);
				$line = str_replace('"', '', $line);
				$title = explode(';', $line);
				$first = false;
			} else {
				$records[$j] = str_replace('"', '', explode('";"', $line));
				$j++;
			}
		}

		if (count($title) == 1) {
			echo BFText::_('COM_BREEZINGFORMS_EMPTY_FILE_MSG');
			return;
		}

		$db->setQuery("Select `title`,`name` From #__facileforms_forms Where id = " . JRequest::getInt('form_id',0));
		$the_form = $db->loadObject();

		$recordcolumns = 'id, submitted, form, title, name, ip, browser, opsys, provider, viewed, exported, archived, user_id, username, user_full_name, paypal_tx_id, paypal_payment_date, paypal_testaccount, paypal_download_tries';
		$columns = explode(', ', strtolower($recordcolumns));
		$columns[3] = 'bf_form_title';
		$columns[4] = 'bf_form_name';

		foreach ($records as $record) { // Insert in Record Table
			if (count($record) <= 1) {
				continue;
			}

			$query = 'Insert Into #__facileforms_records (' . $recordcolumns . ') VALUES (';

			$first = true;

            //Adding empty variable which will contain form name later while exporting specific form
            $formname = '';
			for ($i = 0; $i < count($columns); $i++) {
				if (!$first) {
					$query = $query . ', ';
				}

				if ($columns[$i] === 'id' || $columns[$i] === 'form') {
					if ($columns[$i] === 'id') {
						$query = $query . 'NULL';
					}
					if ($columns[$i] === 'form') {
						$query = $query . $db->Quote($form);
					}
				} else {
					if (in_array($columns[$i], $title) ) {
						if ($columns[$i] === 'bf_form_title') {
							$j = array_search($columns[$i], $title);
							$query = $query . $db->Quote($record[$j]);
							// $i++;
						}
							else if ($columns[$i] === 'bf_form_name') {
							$query = $query . $db->Quote($record[$j]);
							$formname = $record[$j];
							// $i++;
						}
						else {
							$j = array_search($columns[$i], $title);
							$query = $query . $db->Quote($record[$j]);
						}
					} else {

						$value = '';
						switch($columns[$i]){
							case 'bf_form_title': $value = $the_form->title; break;
							case 'bf_form_name': $value = $the_form->name; break;
							case 'submitted': $value = date('Y-m-d H:i:s'); break;
							case 'ip': $value = $_SERVER['REMOTE_ADDR']; break;
							case 'user_id': $value = JFactory::getUser()->get('id',0); break;
							case 'username': $value = JFactory::getUser()->get('username',''); break;
						}

						$query = $query . '"'.$value.'"';
					}
				}

				$first = false;
			}

			$query = $query . ')';

			$db->setQuery($query);
			$db->query();

			//Insert Subrecord            
			$query = 'SELECT MAX(id) AS lastentry FROM #__facileforms_records';
			$db->setQuery($query);
			$id = $db->loadAssoc();


			$subrecordcolumns = 'record, element, title, name, type, value';
			$record_size = count($record);

			for ($i = array_search('download_tries', $title) + 1; $i < $record_size; $i++) {
				$db->setQuery("Select * From #__facileforms_elements Where form = " . $db->Quote($form) . " And `name` = " . $db->Quote(trim($title[$i])));
				$values = $db->loadAssoc();

				$query = 'Insert Into #__facileforms_subrecords (' . $subrecordcolumns . ') VALUES (' . $db->Quote($id['lastentry']);

				$query = $query . ' ,';
				$query = $query . $db->Quote($values['id']);
				$query = $query . ' ,';
				$query = $query . $db->Quote($values['title']);
				$query = $query . ' ,';
				$query = $query . $db->Quote($values['name']);
				$query = $query . ' ,';
				$query = $query . $db->Quote($values['type']);


				$query = $query . ' ,';
				$query = $query . $db->Quote($record[$i]);
				$query = $query . ')';

				$db->setQuery($query);
				$db->query();

				$j++;
			}
		} // End Insert
		// Start Cleanup

		$query = 'SELECT id FROM #__facileforms_records WHERE title = "" AND name = ""';
		$db->setQuery($query);
		$delID = $db->loadAssocList();

		foreach ($delID as $id) {
			$query = 'DELETE FROM #__facileforms_records WHERE id = ' . $db->Quote($id['id']);
			$db->setQuery($query);
			$db->query();
		}
		// End Cleanup

		$this->closeSquBox();
	}

	function listRecords() {

		JHTML::_('behavior.keepalive');
		JHTML::_('behavior.modal');

		if (version_compare($this->version, '3.0', '>=')) {
			JHtml::_('bootstrap.framework');
		} else {
			JHTML::_('behavior.mootools');
		}

		if (version_compare($this->version, '3.0', '>=')) {
			JToolBarHelper::custom('exportPdf', 'download', 'download', BFText::_('COM_BREEZINGFORMS_PDF'), false);
			JToolBarHelper::custom('exportCsv', 'download', 'download', BFText::_('COM_BREEZINGFORMS_CSV'), false);
			JToolBarHelper::custom('exportXml', 'download', 'download', BFText::_('COM_BREEZINGFORMS_XML'), false);
			JToolBarHelper::custom('csvimport', 'upload', 'upload', BFText::_('COM_BREEZINGFORMS_CSV'), false);
			JToolBarHelper::custom('viewed', 'eye-open', 'eye-open', BFText::_('COM_BREEZINGFORMS_TOOLBAR_VIEW'), false);
			JToolBarHelper::custom('exported', 'share', 'share', BFText::_('COM_BREEZINGFORMS_TOOLBAR_EXPORT'), false);
			JToolBarHelper::custom('archived', 'archive', 'archive', BFText::_('COM_BREEZINGFORMS_TOOLBAR_ARCHIVE'), false);
			JToolBarHelper::custom('remove', 'delete.png', 'delete_f2.png', BFText::_('COM_BREEZINGFORMS_TOOLBAR_DELETE'), false);
		} else {
			JToolBarHelper::title('<img src="' . JURI::root() . 'administrator/components/com_breezingforms/libraries/jquery/themes/easymode/i/logo-breezingforms.png' . '" align="top"/>');
			JToolBarHelper::custom('exportPdf', 'ff_download', 'ff_download_f2', BFText::_('COM_BREEZINGFORMS_PDF'), false);
			JToolBarHelper::custom('exportCsv', 'ff_download', 'ff_download_f2', BFText::_('COM_BREEZINGFORMS_CSV'), false);
			JToolBarHelper::custom('exportXml', 'ff_download', 'ff_download_f2', BFText::_('COM_BREEZINGFORMS_XML'), false);
			JToolBarHelper::custom('csvimport', 'ff_upload', 'ff_upload_f2', BFText::_('COM_BREEZINGFORMS_CSV'), false);
			JToolBarHelper::custom('viewed', 'ff_switch', 'ff_switch_f2', BFText::_('COM_BREEZINGFORMS_TOOLBAR_VIEW'), false);
			JToolBarHelper::custom('exported', 'ff_switch', 'ff_switch_f2', BFText::_('COM_BREEZINGFORMS_TOOLBAR_EXPORT'), false);
			JToolBarHelper::custom('archived', 'ff_switch', 'ff_switch_f2', BFText::_('COM_BREEZINGFORMS_TOOLBAR_ARCHIVE'), false);
			JToolBarHelper::custom('remove', 'delete.png', 'delete_f2.png', BFText::_('COM_BREEZINGFORMS_TOOLBAR_DELETE'), false);
			JFactory::getDocument()->addStyleDeclaration(
					'

                            .icon-32-ff_switch {
                                    background-image:url(components/com_breezingforms/images/icons/switch.png);
                            }

                            .icon-32-ff_switch_f2 {
                                    background-image:url(components/com_breezingforms/images/icons/switch_f2.png);
                            }

                            .icon-32-ff_download {
                                    background-image:url(components/com_breezingforms/images/icons/download.png);
                            }

                            .icon-32-ff_download_f2 {
                                    background-image:url(components/com_breezingforms/images/icons/download_f2.png);
                            }
                            '
			);
		}

		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jq.min.js');
		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jq-ui.min.js');
		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jtable/jq.jtable.js');

		$lang = JFactory::getLanguage()->getTag();
		$lang = explode('-', $lang);
		$lang = strtolower($lang[0]);
		if (JFile::exists(JPATH_SITE . '/components/com_breezingforms/libraries/jquery/jtable/localization/jquery.jtable.' . $lang . '.js')) {
			JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jtable/localization/jquery.jtable.' . $lang . '.js');
		}

		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/picker.js');
		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/picker.date.js');
		JFactory::getDocument()->addScript(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/picker.time.js');
		JFactory::getDocument()->addScript(JURI::root(true) . '/administrator/components/com_breezingforms/libraries/jquery/plugins/json.js');

		JFactory::getDocument()->addScriptDeclaration('jQuery.noConflict();' . "\n");

		JFactory::getDocument()->addStyleSheet(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jtable/themes/metro/jq.ui.css');
		JFactory::getDocument()->addStyleSheet(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/jtable/themes/metro/blue/jtable.css');
		JFactory::getDocument()->addStyleSheet(JURI::root() . 'administrator/components/com_breezingforms/admin/style.css');

		JFactory::getDocument()->addStyleSheet(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/themes/default.css');
		JFactory::getDocument()->addStyleSheet(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/themes/default.date.css');
		JFactory::getDocument()->addStyleSheet(JURI::root(true) . '/components/com_breezingforms/libraries/jquery/pickadate/themes/default.time.css');
		?>
		<script type="text/javascript">
		    function ct_quote(str) {
		        return (str + '').replace(/[\"]/g, '&quot;').replace(/\u0000/g, '\\0');
		    }
		<?php
		echo '  
            Array.prototype.bfinsert = function (index, item) {
                this.splice(index, 0, item);
            };

            var bf_submitbutton = function(pressbutton){
                
                var form_selection = jQuery("#bfFormSelection").val();

                switch (pressbutton) {
                    case "csvimport":

                        SqueezeBox.initialize({});               

                        SqueezeBox.loadModal = function(modalUrl,handler,x,y) {
                            this.presets.size.x = 400;
                            this.presets.size.y = 200;
                            this.initialize();      
                            var options = jQuery.toJSON("{handler: \'" + handler + "\', size: {x: " + x +", y: " + y + "}}");      
                            this.setOptions(this.presets, options);
                            this.assignOptions();
                            this.setContent(handler,modalUrl);
                        };
                        
                        SqueezeBox.loadModal("index.php?option=com_breezingforms&act=managerecords&task=csvimport&form_selection="+form_selection+"&tmpl=component","iframe",400,200);

                        break;
                    case "viewed":
                    case "exported":
                    case "archived":
                        var html = "";
                        jQuery("#bfRecordsTableContainer").jtable("selectedRows").each(
                            function(){
                                var record = jQuery(this).data("record");
                                html += "<input type=\"hidden\" name=\"cid[]\" value=\""+record.bfrecord_id+"\" />";
                                
                            }
                        );
                        jQuery("#bfSelectionForm").attr("action", "index.php?option=com_breezingforms&act=managerecs&task="+pressbutton+"&form_selection="+form_selection);
                        jQuery("#bfSelectionForm").html(html);
                        document.bfSelectionForm.submit();
                        break;
                    case "exportPdf":
                    case "exportCsv":
                    case "exportXml":
                        var html = "";
                        jQuery("#bfRecordsTableContainer").jtable("selectedRows").each(
                            function(){
                                var record = jQuery(this).data("record");
                                html += "<input type=\"hidden\" name=\"cid[]\" value=\""+record.bfrecord_id+"\" />";
                                
                            }
                        );
                        jQuery("#bfSelectionForm").attr("action", "index.php?option=com_breezingforms&act=managerecs&task="+pressbutton+"&form_selection="+form_selection);
                        jQuery("#bfSelectionForm").html(html);
                        document.bfSelectionForm.submit();
                        break;
                    case "remove":
                            if (confirm(' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_ASKDELETE')) . ')) {
                                var selectedRows = jQuery("#bfRecordsTableContainer").jtable("selectedRows");
                                jQuery("#bfRecordsTableContainer").jtable("deleteRows", selectedRows);
                            };
                            break;
                    default:
                            break;
                }
            }
            
            function bf_set_flag(column,flag,record_id,flag_div_id){
                jQuery.ajax({
                    type: "POST",
                    url: "index.php",
                    data: {
                        option: "com_breezingforms",
                        act: "recordmanagement",
                        task: "setFlag",
                        record_id: record_id,
                        flag: flag ? 1 : 0,
                        column: column
                    },
					error:function(jqXHR, textStatus, errorThrown) 
					{
						console.log(textStatus);
						console.log(errorThrown);
						console.log(jqXHR);
						//alert(errorThrown);
					},
                    success: function(){
                        var viewed = "<a href=\"javascript:bf_set_flag(\'"+column+"\',true,\'"+record_id+"\',\'"+flag_div_id+"\')\"><img src=\"components/com_breezingforms/images/icons/publish_x.png\" border=\"0\"></a>";
                        if(flag == 1){
                            viewed = "<a href=\"javascript:bf_set_flag(\'"+column+"\',false,\'"+record_id+"\',\'"+flag_div_id+"\')\"><img src=\"components/com_breezingforms/images/icons/publish_g.png\" border=\"0\"></a>";
                         }
                        jQuery("#"+flag_div_id).html(viewed);
                    }
              });
            }
            
            function bf_editable_record_field(fieldname){
                switch(fieldname){
                    case "bfrecord_id":
                    case "bfrecord_ip":
                    case "bfrecord_submitted":
                    case "bfrecord_title":
                    case "bfrecord_name":
                    case "bfrecord_user_id":
                    case "bfrecord_username":
                    case "bfrecord_user_full_name":
                        return false;
                        break;
                }
                return true;
            }
            
            if(typeof Joomla != "undefined"){
                Joomla.submitbutton = bf_submitbutton;
            }else{
                submitbutton = bf_submitbutton;
            }
            
            var form_selection = 0;
            jQuery(document).ready(function () {
            
                jQuery("#bfrecordsearchdatefrom").pickadate({format: "yyyy-mm-dd", selectYears: true, selectMonths: true});
                jQuery("#bfrecordsearchdateto").pickadate({format: "yyyy-mm-dd", selectYears: true, selectMonths: true});
                
                jQuery("#bfrecordsearchtimefrom").pickatime({format: "H:i", interval: 15});
                jQuery("#bfrecordsearchtimeto").pickatime({format: "H:i", interval: 15});
                
                var openOrigText = jQuery("#bfAvailableFieldsOpen").html();
                var searchOrigText = jQuery("#bfSearchOpen").html();
                
                jQuery("#bfAvailableFieldsOpen").html(openOrigText+" +");
                jQuery("#bfSearchOpen").html(searchOrigText+" +");
                
                var fieldsOpen = false;
                var searchOpen = false;
                
                jQuery("#bfSearchOpen").off("click");
                jQuery("#bfSearchOpen").on("click",function(){
                    if(!searchOpen){
                    
                        // hiding available fields if search is open
                        jQuery("#bfAvailableFields").css("display","none");
                        jQuery("#bfAvailableFieldsOpen").html(openOrigText+" +");
                        fieldsOpen = false;
                        
                        jQuery("#bfSearch").css("display","block");
                        searchOpen = true;
                        jQuery("#bfSearchOpen").html(searchOrigText+" -");
                    }else{
                        jQuery("#bfSearch").css("display","none");
                        searchOpen = false;
                        jQuery("#bfSearchOpen").html(searchOrigText+" +");
                    }
                });

                var default_fields = {
                    bfrecord_id: {
                        title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_ID')) . ',
                        key: true,
                        edit: false,
                        create: false,
                    },
                    bfrecord_submitted: {
                        title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_SUBMITTED')) . ',
                        type: "date",
                        create: false,
                        edit: false,
                        type: "text"
                    },
                    bfrecord_ip: {
                        title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_IP')) . ',
                        create: false,
                        edit: false
                    },
                    bfrecord_title: {
                        title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_TITLE')) . ',
                        create: false,
                        edit: false
                    },
                    bfrecord_name: {
                        title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NAME')) . ',
                        create: false,
                        edit: false
                    },
                    
                    //CHILD TABLE DEFINITION FOR "DETAILS"
                    bfrecord_details: {
                        title: "",
                        width: "1%",
                        sorting: false,
                        edit: false,
                        create: false,
                        "delete": false,
                        listClass: "bfrecord-details-button",
                        display: function (detail_data) {
                        
                            //Create an image that will be used to open child table
                            var $img = jQuery("<img style=\"width: 16px !important; min-width: 16px !important; max-width: 16px !important; cursor: pointer;opacity: 0.5;\" onmouseover=\"this.style.opacity=\'1.0\'\" onmouseout=\"this.style.opacity=\'0.5\'\" src=\"' . JURI::root() . '/components/com_breezingforms/libraries/jquery/jtable/themes/metro/list_metro.png' . '\" title=\"\" />");
                            
                            //Open child table when user clicks the image
                            $img.click(function () {
                            
                                jQuery.ajax({
                                    type: "POST",
                                    url: "index.php",
                                    data: {
                                        option: "com_breezingforms",
                                        act: "recordmanagement",
                                        task: "getAvailableFields",
                                        form_id: detail_data.record.bfrecord_form_id
                                    },
									error:function(jqXHR, textStatus, errorThrown) 
									{
										console.log(textStatus);
										console.log(errorThrown);
										console.log(jqXHR);
										//alert(errorThrown);
									},
                                    success: function(available_fields_data){
                                        var jsondata = jQuery.parseJSON(available_fields_data);
                                        var detail_fields_raw = jsondata.fields;
                                        
                                        var detail_fields = {
                                            bfrecord_id: {
                                                title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_ID')) . ',
                                                key: true,
                                                edit: false,
                                                create: false,
                                                visibility: "hidden"
                                            },
                                            custom: {
                                                title: "",
                                                width: "100%",
                                                create: false,
                                                edit: false,
                                                display: function(data){
                                                    var out = "<table class=\"bfDetailsTable\">";
                                                    for(var i = 0; i < detail_fields_raw.length; i++){
                                                        var the_name = detail_fields_raw[i]["name"];
                                                        if(the_name.length !== null && data.record["bfrecord_custom_"+the_name] !== null){
                                                       
                                                            out += "<tr>";
                                                            
                                                            var the_title = detail_fields_raw[i]["title"];
                                                            var the_value = data.record["bfrecord_custom_"+the_name] !== null ? data.record["bfrecord_custom_"+the_name] : "";
                                                            
                                                            out += "<td class=\"bfDetailsTableLabelCol\"><strong>"+jQuery("<div/>").text(the_title).text()+"</strong>";
                                                            out += "<br /><small>' . addslashes(BFText::_('COM_BREEZINGFORMS_ELEMENT_NAME')) . ': "+the_name+"</small>";
                                                            out += "<br /><small>' . addslashes(BFText::_('COM_BREEZINGFORMS_RECORDS_ELEMENTID')) . ': "+data.record["bfrecord_custom_element_id_"+the_name]+"</small>";
                                                            out += "<br /><small>' . addslashes(BFText::_('COM_BREEZINGFORMS_RECORDS_TYPE')) . ': "+data.record["bfrecord_custom_element_type_"+the_name]+"</small></td>";
                                                            out += "<td class=\"bfDetailsTableValueCol\">";
                                                            
                                                            if(typeof data.record["bfrecord_custom_element_type_"+the_name] != "undefined" && data.record["bfrecord_custom_element_type_"+the_name] != "File Upload" && data.record["bfrecord_custom_element_type_"+the_name] != "Signature" && data.record["bfrecord_custom_element_type_"+the_name] !== null){
                                                                out += jQuery("<div/>").text(the_value).html().replace(/\\n/g,"<br />");
                                                            }else{
                                                                out += the_value;
                                                            }
                                                            
                                                            out += "</td>";
                                                            out += "</tr>";
                                                        }
                                                    }
                                                    
                                                    out += "<tr>";
                                                    out += "<td colspan=\"2\" class=\"bfDetailsTableHead\">";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_SUBMINFO')) . ';
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // submitted;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_SUBMITTED')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_submitted"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // ip;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_IP')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_ip"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // browser;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_BROWSER')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_browser"];
                                                    out += "</td>";
                                                    out += "</tr>";

                                                    // opsys;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_OPSYS')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_opsys"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // user id
                                                    out += "<tr>";
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERID')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_user_id"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // user name
                                                    out += "<tr>";
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERUSERNAME')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_username"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // user full name
                                                    out += "<tr>";
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERFULLNAME')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_user_full_name"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    

                                                    // record info

                                                    out += "<tr>";
                                                    out += "<td colspan=\"2\" class=\"bfDetailsTableHead\">";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_RECORDINFO')) . ';
                                                    out += "</td>";
                                                    out += "</tr>";

                                                    // record id;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_RECORDID')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_id"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // viewed;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_VIEWED')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_viewed"] == 1 ? ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_YES')) . ' : ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NO')) . ' ;
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // exported;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_EXPORTED')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_exported"] == 1 ? ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_YES')) . ' : ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NO')) . ' ;
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // archived;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_ARCHIVED')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_archived"] == 1 ? ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_YES')) . ' : ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NO')) . ' ;
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // opted;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_OPTED')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_opted"] == 1 ? ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_YES')) . ' : ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NO')) . ' ;
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // payment info

                                                    out += "<tr>";
                                                    out += "<td colspan=\"2\" class=\"bfDetailsTableHead\">";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_PAYMENT_INFORMATION')) . ';
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_TRANSACTION_ID')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_payment_tx_id"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_TRANSACTION_DATE')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_payment_date"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_TESTACCOUNT')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_payment_test"] == 1 ? ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_YES')) . ' : ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NO')) . ' ;
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_DOWNLOAD_TRIES')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_payment_download_tries"];
                                                    out += "</td>";
                                                    out += "</tr>";

                                                    // form info

                                                    out += "<tr>";
                                                    out += "<td colspan=\"2\" class=\"bfDetailsTableHead\">";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_FORMINFO')) . ';
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                     // form id;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_ID')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_form_id"];
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // form title;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_TITLE')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += jQuery("<div/>").text(data.record["bfrecord_title"]).html();
                                                    out += "</td>";
                                                    out += "</tr>";
                                                    
                                                    // form name;
                                                    out += "<td class=\"bfDetailsTableLabelCol\"><strong>";
                                                    out += ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NAME')) . ';
                                                    out += "</strong></td>";
                                                    out += "<td class=\"bfDetailsTableValueCol\">";
                                                    out += data.record["bfrecord_name"];
                                                    out += "</td>";
                                                    out += "</tr>";

                                                    out += "</table>";
                                                    return out;
                                                }   
                                            }
                                        };
                                        
                                        for(var i = 0; i < detail_fields_raw.length; i++){
                                            var pfx = detail_fields_raw[i]["name"].indexOf("bfrecord_") == 0 ? "" : "bfrecord_custom_";
                                            var field_name = detail_fields_raw[i]["name"];
                                            var the_func = function(pfx, field_name){
                                                detail_fields[pfx+detail_fields_raw[i]["name"]] = {
                                                    title: jQuery("<div/>").text(detail_fields_raw[i]["title"]).html(),
                                                    edit: bf_editable_record_field(pfx+detail_fields_raw[i]["name"]),
                                                    key: detail_fields_raw[i]["name"] == "bfrecord_id" ? true : false,
                                                    create: false,
                                                    visibility: "hidden",
                                                    input: function(data){
                                                        if (data.record) {
                                                            if(data.record["bfrecord_custom_"+field_name] === null){
                                                                return "<strong>Not submitted</strong>";
                                                            } else
                                                            if(typeof data.record["bfrecord_custom_file_upload_raw_"+field_name] !== "undefined"){ // bfrecord_custom_file_upload_raw_
                                                                return "<textarea style=\"min-width: 200px; height: 60px;\" name=\""+pfx+field_name+"\">"+ct_quote(jQuery("<div/>").text(data.record["bfrecord_custom_file_upload_raw_"+field_name]).html())+"</textarea>";
                                                            } else if (typeof data.record["bfrecord_custom_element_type_"+field_name] !== "undefined" && data.record["bfrecord_custom_element_type_"+field_name] == "Textarea"){
                                                                return "<textarea style=\"min-width: 200px; height: 60px;\" name=\""+pfx+field_name+"\">"+ct_quote(jQuery("<div/>").text(data.value).html())+"</textarea>";
                                                            } else {
                                                                return "<input style=\"min-width: 200px\" type=\"text\" name=\""+pfx+field_name+"\" value=\""+ct_quote(jQuery("<div/>").text(data.value).html())+"\" />";
                                                            }
                                                        }
                                                    }
                                                };
                                            }
                                            // we have to call each field within a function, otherwise indexes and field names won\'t be recognized appropriatly
                                            the_func(pfx, field_name);
                                        }
                                        
                                        jQuery("#bfRecordsTableContainer").jtable("openChildTable",
                                            $img.closest("tr"), //Parent row
                                            {
                                                title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_VIEWRECORD')) . ',
                                                actions: {
                                                    listAction: "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&form_selection="+detail_data.record.bfrecord_form_id+"&record_id=" + detail_data.record.bfrecord_id,
                                                    updateAction: "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&update=1&form_selection="+detail_data.record.bfrecord_form_id+"&record_id=" + detail_data.record.bfrecord_id
                                                },
                                                fields: detail_fields
                                            }, 
                                            function (data) { //opened handler
                                            setTimeout(function(){
                                                data.childTable.jtable("load");
                                            }, 500);
                                        });
                                    }
                                });
                            });
                            
                            //Return image to show on the person row
                            return $img;
                        }
                    }
                };

                var default_object = {
                    title: "' . BFText::_('COM_BREEZINGFORMS_MANAGERECS') . '",
                    actions: {
                        listAction: "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&form_selection=0",
                        deleteAction: "index.php?option=com_breezingforms&act=recordmanagement&task=action&action=delete"
                    },
                    paging: true, //Enable paging
                    pageSize: 10, //Set page size (default: 10)
                    pageSizes: [10, 25, 50, 100, 250, 500, 1000, 5000, 10000, 100000],
                    sorting: true, //Enable sorting
                    defaultSorting: "id DESC", //Set default sorting,
                    selecting: true, //Enable selecting
                    multiselect: true, //Allow multiple selecting
                    selectingCheckboxes: true,
                    animationsEnabled:true,
                    fields: default_fields,
                    recordsLoaded: function(){
                        jQuery(".jtable th:nth-child(n+5)").addClass("hidden-phone");
                        jQuery(".jtable tr").each(
                            function(){
                                jQuery(this).children("td:nth-child(n+5)").addClass("hidden-phone");
                                jQuery(".bfrecord-details-button").removeClass("hidden-phone");
                                jQuery(".jtable-command-column").removeClass("hidden-phone");
                                jQuery(".jtable-command-column-header").removeClass("hidden-phone");

                            }
                        );
                    }
                };
                
                // cloning the default_object
                
                var custom_object = jQuery.extend(true, {}, default_object);
                
                // on form selection change, re-draw everything
                
                jQuery("#bfFormSelection").off("change");
                jQuery("#bfFormSelection").on("change",function(){
                    
                    // storing the selected form
                    
                    form_selection = jQuery(this).val();

                    // resetting custom fields if new form has been selected
                    
                    delete custom_object["fields"];
                    
                    // cloning the default fields
                    
                    custom_object["fields"] = jQuery.extend(true, {}, default_fields);

                    // retrieving new data for default object
                    
                    default_object["actions"]["listAction"] = "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&form_selection="+form_selection;
                    
                    // re-rendering the table
                    
                    jQuery("#bfRecordsTableContainer").jtable({});
                    jQuery("#bfRecordsTableContainer").jtable("destroy");
                    jQuery("#bfRecordsTableContainer").jtable(default_object);
                    
                    setTimeout(function(){
                        jQuery("#bfRecordsTableContainer").jtable("load");
                    }, 500);
                    
                    // populating available fields options
                    
                    jQuery("#bfAvailableFieldsWrapper").css("display","none");
                    jQuery.ajax({
                        type: "POST",
                        url: "index.php",
                        data: {
                            option: "com_breezingforms",
                            act: "recordmanagement",
                            task: "getAvailableFields",
                            form_id: jQuery(this).val()
                        },
						error:function(jqXHR, textStatus, errorThrown) 
						{
							console.log(textStatus);
							console.log(errorThrown);
							console.log(jqXHR);
							//alert(errorThrown);
						},
                        success: function(data){
                        
                            // rendering the field selection
                            
                            var html = "<table style=\"width:100%;border:0;\">";
                            
                            // default fields
                            var field1 = {id: "bfDisplayFieldIDbfrecord_id", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_ID')) . ', name: "bfrecord_id"};
                            var field2 = {id: "bfDisplayFieldIDbfrecord_submitted", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_SUBMITTED')) . ', name: "bfrecord_submitted"};
                            var field3 = {id: "bfDisplayFieldIDbfrecord_user_id", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERID')) . ', name: "bfrecord_user_id"};
                            var field4 = {id: "bfDisplayFieldIDbfrecord_username", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERUSERNAME')) . ', name: "bfrecord_username"};
                            var field5 = {id: "bfDisplayFieldIDbfrecord_user_full_name", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_PROCESS_SUBMITTERFULLNAME')) . ', name: "bfrecord_user_full_name"};
                            var field6 = {id: "bfDisplayFieldIDbfrecord_ip", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_IP')) . ', name: "bfrecord_ip"};
                            var field7 = {id: "bfDisplayFieldIDbfrecord_title", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_TITLE')) . ', name: "bfrecord_title"};
                            var field8 = {id: "bfDisplayFieldIDbfrecord_name", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_NAME')) . ', name: "bfrecord_name"};
                            var field9 = {id: "bfDisplayFieldIDbfrecord_payment_tx_id", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_TRANSACTION_ID')) . ', name: "bfrecord_payment_tx_id"};
                            var field10 = {id: "bfDisplayFieldIDbfrecord_payment_date", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_TRANSACTION_DATE')) . ', name: "bfrecord_payment_date"};
                            var field11 = {id: "bfDisplayFieldIDbfrecord_payment_test", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_TESTACCOUNT')) . ', name: "bfrecord_payment_test"};
                            var field12 = {id: "bfDisplayFieldIDbfrecord_payment_download_tries", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_DOWNLOAD_TRIES')) . ', name: "bfrecord_payment_download_tries"};
                            var field13 = {id: "bfDisplayFieldIDbfrecord_viewed", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_VIEWED')) . ', name: "bfrecord_viewed"};
                            var field14 = {id: "bfDisplayFieldIDbfrecord_exported", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_EXPORTED')) . ', name: "bfrecord_exported"};
                            var field15 = {id: "bfDisplayFieldIDbfrecord_archived", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_ARCHIVED')) . ', name: "bfrecord_archived"};
                            var field16 = {id: "bfDisplayFieldIDbfrecord_opted", title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_RECORDS_OPTED')) . ', name: "bfrecord_opted"};

                            var jsondata = jQuery.parseJSON(data);
                            var fields = jsondata.fields;
                            var filter_state = jsondata.filter_state;

                            if(typeof fields.length != "undefined"){

                                fields.bfinsert(0, field1);
                                fields.bfinsert(1, field2);
                                fields.bfinsert(2, field3);
                                fields.bfinsert(3, field4);
                                fields.bfinsert(4, field5);
                                fields.bfinsert(5, field6);

                                // default fields (not so important to the right)
                                fields.bfinsert(fields.length, field7);
                                fields.bfinsert(fields.length, field8);
                                fields.bfinsert(fields.length, field9);
                                fields.bfinsert(fields.length, field10);
                                fields.bfinsert(fields.length, field11);
                                fields.bfinsert(fields.length, field12);
                                fields.bfinsert(fields.length, field13);
                                fields.bfinsert(fields.length, field14);
                                fields.bfinsert(fields.length, field15);
                                fields.bfinsert(fields.length, field16);
                                
                                for(var i = 0; i < fields.length; i++){
                                    if(i%3 == 0){
                                        html += "<tr>";
                                    }
                                    var checked = "";
                                    if(typeof filter_state.bfDisplayFieldsSelected != "undefined"){
                                        for(var j = 0; j < filter_state.bfDisplayFieldsSelected.length; j++){
                                            if(fields[i].id == filter_state.bfDisplayFieldsSelected[j]){
                                                checked = " checked=\"checked\" ";
                                                break;
                                            }
                                        }
                                    }
                                    html += "<td><input"+checked+" type=\"checkbox\" class=\"bfDisplayField bfFilterTriggerer\" id=\""+fields[i].id+"\" value=\""+fields[i].title+":::"+fields[i].name+"\" /></td>";
                                    html += "<td><label for=\""+fields[i].id+"\"><div class=\"bfAvailableField\">"+fields[i].title+"</div></label></td>";
                                    if(i+1%3 == 0){
                                        html += "</tr>";
                                    }
                                }
                            }
                            
                            html += "</table>";
                            html += "&nbsp;<br /><br /><br /><br />";

                            jQuery("#bfAvailableFields").html(html);
                            
                            if(form_selection > 0){
                                jQuery("#bfAvailableFieldsWrapper").css("display","block");
                            }
                            
                            jQuery("#bfAvailableFieldsOpen").off("click");
                            jQuery("#bfAvailableFieldsOpen").on("click",function(){
                                if(!fieldsOpen){
                                
                                    // hiding filter if fields is displayed
                                    jQuery("#bfSearch").css("display","none");
                                    jQuery("#bfSearchOpen").html(searchOrigText+" +");
                                    searchOpen = false;
                                    
                                    jQuery("#bfAvailableFields").css("display","block");
                                    fieldsOpen = true;
                                    jQuery("#bfAvailableFieldsOpen").html(openOrigText+" -");
                                }else{
                                    jQuery("#bfAvailableFields").css("display","none");
                                    fieldsOpen = false;
                                    jQuery("#bfAvailableFieldsOpen").html(openOrigText+" +");
                                }
                            });
                            
                            // updating filter from filter state
                            if(typeof filter_state.searchterm != "undefined"){
                                jQuery("#bfrecordsearch").val(filter_state.searchterm);
                            }else{
                                jQuery("#bfrecordsearch").val("");
                            }
                            if(typeof filter_state.searchintext != "undefined"){
                                jQuery("#bfrecordsearchintext").get(0).checked = filter_state.searchintext == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchintext").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinuserid != "undefined"){
                                jQuery("#bfrecordsearchinuserid").get(0).checked = filter_state.searchinuserid == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinuserid").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinusername != "undefined"){
                                jQuery("#bfrecordsearchinusername").get(0).checked = filter_state.searchinusername == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinusername").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinuserfullname != "undefined"){
                                jQuery("#bfrecordsearchinuserfullname").get(0).checked = filter_state.searchinuserfullname == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinuserfullname").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinid != "undefined"){
                                jQuery("#bfrecordsearchinid").get(0).checked = filter_state.searchinid == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinid").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinip != "undefined"){
                                jQuery("#bfrecordsearchinip").get(0).checked = filter_state.searchinip == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinip").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinviewed != "undefined"){
                                jQuery("#bfrecordsearchinviewed").get(0).checked = filter_state.searchinviewed == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinviewed").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinexported != "undefined"){
                                jQuery("#bfrecordsearchinexported").get(0).checked = filter_state.searchinexported == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinexported").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinarchived != "undefined"){
                                jQuery("#bfrecordsearchinarchived").get(0).checked = filter_state.searchinarchived == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinarchived").get(0).checked = false;
                            }
                            if(typeof filter_state.searchinpayment != "undefined"){
                                jQuery("#bfrecordsearchinpayment").get(0).checked = filter_state.searchinpayment == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinpayment").get(0).checked = false;
                            }
                            
                            if(typeof filter_state.searchinopted != "undefined"){
                                jQuery("#bfrecordsearchinopted").get(0).checked = filter_state.searchinopted == "false" ? false : true;
                            }else{
                                jQuery("#bfrecordsearchinopted").get(0).checked = false;
                            }
                            
                            if(typeof filter_state.searchdatefrom != "undefined"){
                                jQuery("#bfrecordsearchdatefrom").val(filter_state.searchdatefrom);
                            }else{
                                jQuery("#bfrecordsearchdatefrom").val("");
                            }
                            if(typeof filter_state.searchtimefrom != "undefined"){
                                jQuery("#bfrecordsearchtimefrom").val(filter_state.searchtimefrom);
                            }else{
                                jQuery("#bfrecordsearchtimefrom").val("");
                            }
                            if(typeof filter_state.searchdateto != "undefined"){
                                jQuery("#bfrecordsearchdateto").val(filter_state.searchdateto);
                            }else{
                                jQuery("#bfrecordsearchdateto").val("");
                            }
                            if(typeof filter_state.searchtimeto != "undefined"){
                                jQuery("#bfrecordsearchtimeto").val(filter_state.searchtimeto);
                            }else{
                                jQuery("#bfrecordsearchtimeto").val("");
                            }

                            bfupdatetable();
                            
                            // general table update (filter, field selection, etc.)
                            jQuery(".bfFilterTriggerer").off("click");
                            jQuery(".bfFilterTriggerer").on("click",bfupdatetable);
                        }
                    });
                });
                
                // general table update (filter, field selection, etc.)
                jQuery(".bfFilterTriggerer").off("click");
                jQuery(".bfFilterTriggerer").on("click",bfupdatetable);

                function bfupdatetable(){

                    if(form_selection == 0){
                        jQuery("#bfrecordsearchintextspan").css("display","none");
                    } else{
                        jQuery("#bfrecordsearchintextspan").css("display","inline");
                    }

                    // applying filter rules if any

                    var searchterm = "";
                    
                    if(jQuery("#bfrecordsearch").val() != ""){
                        searchterm += "&searchterm="+encodeURIComponent(jQuery("#bfrecordsearch").val());
                    }
                    
                    // filter by checkbox results
                    
                    if(jQuery("#bfrecordsearchintext").get(0).checked){
                        searchterm += "&searchintext=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinuserid").get(0).checked){
                        searchterm += "&searchinuserid=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinusername").get(0).checked){
                        searchterm += "&searchinusername=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinuserfullname").get(0).checked){
                        searchterm += "&searchinuserfullname=1";
                    }

                    if(jQuery("#bfrecordsearchinid").get(0).checked){
                        searchterm += "&searchinid=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinip").get(0).checked){
                        searchterm += "&searchinip=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinviewed").get(0).checked){
                        searchterm += "&searchinviewed=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinexported").get(0).checked){
                        searchterm += "&searchinexported=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinarchived").get(0).checked){
                        searchterm += "&searchinarchived=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinpayment").get(0).checked){
                        searchterm += "&searchinpayment=1";
                    }
                    
                    if(jQuery("#bfrecordsearchinopted").get(0).checked){
                        searchterm += "&searchinopted=1";
                    }

                    // date / time from

                    var searchdatefrom = "";
                    var searchtimefrom = "";
                    if(jQuery("#bfrecordsearchdatefrom").val() != ""){
                        searchdatefrom = "&searchdatefrom="+encodeURIComponent(jQuery("#bfrecordsearchdatefrom").val());
                    }
                    if(jQuery("#bfrecordsearchtimefrom").val() != ""){
                        searchtimefrom = "&searchtimefrom="+encodeURIComponent(jQuery("#bfrecordsearchtimefrom").val());
                    }

                    // date / time to

                    var searchdateto = "";
                    var searchtimeto = "";
                    if(jQuery("#bfrecordsearchdateto").val() != ""){
                        searchdateto = "&searchdateto="+encodeURIComponent(jQuery("#bfrecordsearchdateto").val());
                    }
                    if(jQuery("#bfrecordsearchtimeto").val() != ""){
                        searchtimeto = "&searchtimeto="+encodeURIComponent(jQuery("#bfrecordsearchtimeto").val());
                    }

                    // signal the server to deliver records based on the field selection

                    custom_object["actions"]["listAction"]  = "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&form_selection="+form_selection+searchterm+searchdatefrom+searchtimefrom+searchdateto+searchtimeto;
                    default_object["actions"]["listAction"] = "index.php?option=com_breezingforms&act=recordmanagement&task=getListRecords&form_selection="+form_selection+searchterm+searchdatefrom+searchtimefrom+searchdateto+searchtimeto;
                    //alert(default_object["actions"]["listAction"]);
                    // reset the fields

                    delete custom_object["fields"];
                    custom_object["fields"] = {};
                    
                    // assigning the selected fields to the visible tables

                    var hasChecked = false;
                    var hasID = false;
                    jQuery(".bfDisplayField").each(function(){
                        var field_title_name = jQuery(this).val().split(":::");
                        if(field_title_name.length == 2){
                            var field_name = field_title_name[1];
                            var field_title = field_title_name[0];
                            var pfx = field_name.indexOf("bfrecord_") == 0 ? "" : "bfrecord_custom_";
                            if(jQuery(this).get(0).checked){
                                
                                if(field_name == "bfrecord_id"){
                                    hasID = true;
                                }
                                var clazz = "ct-records-cell-normal";
                                if(field_name == "bfrecord_viewed" || field_name == "bfrecord_exported" || field_name == "bfrecord_archived"){
                                    clazz = "ct-records-cell-centered";
                                }
                                custom_object["fields"][pfx+field_name] = {
                                    title: jQuery("<div/>").text(field_title).html(),
                                    edit: bf_editable_record_field(pfx+field_name),
                                    key: field_name == "bfrecord_id" ? true : false,
                                    create: false,
                                    visibility: "visible",
                                    defaultValue: "",
                                    listClass: clazz,
                                    display: function(data){
                                        // apply htmlentities on all fields except those that include generated HTML from the server side
                                        if(typeof data.record["bfrecord_custom_element_type_"+field_name] != "undefined" && data.record["bfrecord_custom_element_type_"+field_name] != "File Upload" && data.record["bfrecord_custom_element_type_"+field_name] !== null){
                                            return jQuery("<div/>").text(data.record[pfx+field_name]).html().replace(/\\n/g,"<br />");
                                        }else if(field_name == "bfrecord_viewed" || field_name == "bfrecord_exported" || field_name == "bfrecord_archived"){
                                            var viewed = "<div id=\"bfFlag"+field_name+data.record["bfrecord_id"]+"\"><a href=\"javascript:bf_set_flag(\'"+field_name+"\',true,\'"+data.record["bfrecord_id"]+"\',\'bfFlag"+field_name+data.record["bfrecord_id"]+"\')\"><img src=\"components/com_breezingforms/images/icons/publish_x.png\" border=\"0\"></a></div>";
                                            if(data.record[pfx+field_name] == 1){
                                                viewed = "<div id=\"bfFlag"+field_name+data.record["bfrecord_id"]+"\"><a href=\"javascript:bf_set_flag(\'"+field_name+"\',false,\'"+data.record["bfrecord_id"]+"\',\'bfFlag"+field_name+data.record["bfrecord_id"]+"\')\"><img src=\"components/com_breezingforms/images/icons/publish_g.png\" border=\"0\"></a></div>";
                                            }
                                            return viewed;
                                        }else{
                                            return data.record[pfx+field_name] === null ? "" : data.record[pfx+field_name];
                                        }
                                    }
                                };
                                hasChecked = true;
                            }
                        }
                    });
                    
                    // restore the details button for custom views
                    custom_object["fields"]["bfrecord_details"] = default_object["fields"]["bfrecord_details"];

                    // make sure the KEY (bfrecord_id) is always included, even invisible, 
                    // such that things like deleting works

                    if(!hasID){
                        custom_object["fields"]["bfrecord_id"] = {
                            title: ' . json_encode(BFText::_('COM_BREEZINGFORMS_ID')) . ',
                            edit: false,
                            key: true,
                            create: false,
                            visibility: "hidden"
                        };
                    }

                    // re-paint the table. if no custom fields have been checked, 
                    // use the default setup

                    var theBfDisplayFieldsSelected = [];

                    jQuery(".bfDisplayField").each(
                        function(){
                            if(jQuery(this).get(0).checked){
                                theBfDisplayFieldsSelected.push(jQuery(this).attr("id"));
                            }
                        }
                    );

                    // store the current filter state only on successfully loaded data
                    jQuery.ajax({
                        type: "POST",
                        url: "index.php",
                        data: {
                            option: "com_breezingforms",
                            act: "recordmanagement",
                            task: "saveFilterState",
                            form_id: jQuery("#bfFormSelection").val(),
                            searchterm: jQuery("#bfrecordsearch").val(),
                            searchintext: jQuery("#bfrecordsearchintext").get(0).checked,
                            searchinuserid: jQuery("#bfrecordsearchinuserid").get(0).checked,
                            searchinusername: jQuery("#bfrecordsearchinusername").get(0).checked,
                            searchinuserfullname: jQuery("#bfrecordsearchinuserfullname").get(0).checked,
                            searchinid: jQuery("#bfrecordsearchinid").get(0).checked,
                            searchinip: jQuery("#bfrecordsearchinip").get(0).checked,
                            searchinviewed: jQuery("#bfrecordsearchinviewed").get(0).checked,
                            searchinexported: jQuery("#bfrecordsearchinexported").get(0).checked,
                            searchinarchived: jQuery("#bfrecordsearchinarchived").get(0).checked,
                            searchinpayment: jQuery("#bfrecordsearchinpayment").get(0).checked,
                            searchinopted: jQuery("#bfrecordsearchinopted").get(0).checked,
                            searchdatefrom: jQuery("#bfrecordsearchdatefrom").val(),
                            searchtimefrom: jQuery("#bfrecordsearchtimefrom").val(),
                            searchdateto: jQuery("#bfrecordsearchdateto").val(),
                            searchtimeto: jQuery("#bfrecordsearchtimeto").val(),
                            bfDisplayFieldIDbfrecord_id: typeof jQuery("#bfDisplayFieldIDbfrecord_id").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_id").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_submitted: typeof jQuery("#bfDisplayFieldIDbfrecord_submitted").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_submitted").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_user_id: typeof jQuery("#bfDisplayFieldIDbfrecord_user_id").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_user_id").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_username: typeof jQuery("#bfDisplayFieldIDbfrecord_username").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_username").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_user_full_name: typeof jQuery("#bfDisplayFieldIDbfrecord_user_full_name").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_user_full_name").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_ip: typeof jQuery("#bfDisplayFieldIDbfrecord_ip").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_ip").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_title: typeof jQuery("#bfDisplayFieldIDbfrecord_title").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_title").get(0).checked : false,
                            bfDisplayFieldIDbfrecord_name: typeof jQuery("#bfDisplayFieldIDbfrecord_name").get(0) != "undefined" ? jQuery("#bfDisplayFieldIDbfrecord_name").get(0).checked : false,
                            bfDisplayFieldsSelected: theBfDisplayFieldsSelected
                         }
                    });
                    

                    jQuery("#bfRecordsTableContainer").jtable({});
                    jQuery("#bfRecordsTableContainer").jtable("destroy");
                    
                    if(hasChecked){
                        jQuery("#bfRecordsTableContainer").jtable(custom_object);
                    }else{
                        jQuery("#bfRecordsTableContainer").jtable(default_object);
                    }
                    
                    setTimeout(function(){
                        jQuery("#bfRecordsTableContainer").jtable("load");
                    }, 500);
                    
                }

                // initial load
                bfupdatetable();
            });
           </script>
           ' . $this->getTableBar() . '
           
           <div id="bfRecordsTableContainer"></div>';
	}

	function getListRecords() {

		@ob_end_clean();

		if (JRequest::getInt('update', 0) == 1 && JRequest::getInt('record_id', 0) > 0) {
			$db = JFactory::getDbo();
			$record_id = JRequest::getInt('record_id', 0);
			$form = JRequest::getInt('form_selection', 0);
			$db = JFactory::getDbo();

			$db->setQuery("Select * From #__facileforms_elements Where published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5' And  form = " . intval($form) . " Order By `ordering`");
			$elements = $db->loadAssocList();

			foreach ($elements As $element) {
				$value = JRequest::getVar('bfrecord_custom_' . $element['name'], null, 'REQUEST', 'HTML', JREQUEST_ALLOWHTML);

				if ($value !== null) {
					if ($element['type'] == 'Checkbox' || $element['type'] == 'Checkbox Group' || $element['type'] == 'Select List') {
						$db->setQuery("Select id From #__facileforms_subrecords Where `name` = " . $db->quote($element['name']) . " And record = " . $record_id . " Order By id");
						$group_ids = $db->loadAssocList();
						$values = explode(', ', $value);
						$i = 0;
						foreach ($group_ids As $group_id) {
							if (isset($values[$i])) {
								$db->setQuery("Update #__facileforms_subrecords Set value = " . $db->quote($values[$i]) . " Where id = " . $db->quote($group_id['id']));
								$db->query();
							}
							$i++;
						}
					} else {
						$db->setQuery("Update #__facileforms_subrecords Set value = " . $db->quote($value) . " Where name = " . $db->quote($element['name']) . " And record = " . $record_id);
						$db->query();
					}
				}
			}
		}

		header('Cache-Control: no-cache, no-store, must-revalidate'); // HTTP 1.1.
		header('Pragma: no-cache'); // HTTP 1.0.
		header('Expires: 0');

		$db = JFactory::getDbo();

		$order = explode(" ", str_replace("`", "", JRequest::getVar('jtSorting', 'submitted Desc')));
		JRequest::setVar('cbrecord_order_by', $order[0]);
		$order[0] = JRequest::getCmd('cbrecord_order_by', 'submitted Desc');

		$searchterm = JRequest::getVar('searchterm', '');

		// date search

		jimport('joomla.version');
		$version = new JVersion();
		$_version = $version->getShortVersion();
		$tz = 'UTC';
		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));
		}

		$now = JFactory::getDate();
		if (version_compare($_version, '3.2', '>=')) {
			$now = JFactory::getDate('now', $tz);
		}

		$now_date = '';

		if (version_compare($this->version, '3.0', '>=')) {
			$now_date = $now->toSql();
		} else {
			$now_date = $now->toMySQL();
		}

		// from date / time

		$searchdatefrom = JRequest::getVar('searchdatefrom', '');
		$searchtimefrom = JRequest::getVar('searchtimefrom', '');

		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));

			if ($searchdatefrom != '') {
				$searchdatefrom = JFactory::getDate($searchdatefrom, $tz);
				$searchdatefrom = $searchdatefrom->format('Y-m-d', true);
			}

			if ($searchtimefrom) {
				$searchtimefrom = JFactory::getDate($searchtimefrom, $tz);
				$searchtimefrom = $searchtimefrom->format('H:i:s', true);
			}

			$now_date = $now->format('Y-m-d', true);
		} else {
			if ($searchtimefrom != '') {
				$searchtimefrom = date('H:i:s', strtotime('1970-01-01 ' . $searchtimefrom));
			}

			if ($searchdatefrom != '') {
				$searchdatefrom = date('Y-m-d', strtotime($searchdatefrom));
			}
		}

		if ($searchdatefrom == '' && $searchtimefrom != '') {
			$searchdatefrom = $now_date . ' ' . $searchtimefrom;
		} else if ($searchdatefrom != '' && $searchtimefrom != '') {
			$searchdatefrom = $searchdatefrom . ' ' . $searchtimefrom;
		} else if ($searchdatefrom != '' && $searchtimefrom == '') {
			$searchdatefrom = $searchdatefrom . ' 00:00:00';
		}

		// to date / time

		$searchdateto = JRequest::getVar('searchdateto', '');
		$searchtimeto = JRequest::getVar('searchtimeto', '');

		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));

			if ($searchdateto != '') {
				$searchdateto = JFactory::getDate($searchdateto, $tz);
				$searchdateto = $searchdateto->format('Y-m-d', true);
			}

			if ($searchtimeto != '') {
				$searchtimeto = JFactory::getDate($searchtimeto, $tz);
				$searchtimeto = $searchtimeto->format('H:i:s', true);
			}

			$now_date = $now->format('Y-m-d', true);
		} else {
			if ($searchtimeto != '') {
				$searchtimeto = date('H:i:s', strtotime('1970-01-01 ' . $searchtimeto));
			}
			if ($searchdateto != '') {
				$searchdateto = date('Y-m-d', strtotime($searchdateto));
			}
		}

		if ($searchdateto == '' && $searchtimeto != '') {
			$searchdateto = $now_date . ' ' . $searchtimeto;
		} else if ($searchdateto != '' && $searchtimeto != '') {
			$searchdateto = $searchdateto . ' ' . $searchtimeto;
		} else if ($searchdateto != '' && $searchtimeto == '') {
			$searchdateto = $searchdateto . ' 23:59:59';
		}

		$db->setQuery("SET SESSION group_concat_max_len = 9999999");
		$db->query();

		$db->setQuery("Select * From #__facileforms_elements Where published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5' And  form = " . JRequest::getInt('form_selection', 0) . " Order By `ordering`");
		$elements = $db->loadAssocList();

		$selectors = '';

		$x = 0;
		$elements_size = count($elements);
		foreach ($elements As $element) {

			if ($element['type'] == 'Checkbox' || $element['type'] == 'Checkbox Group' || $element['type'] == 'Select List') {
				$selectors .= "Trim( Both ', ' From GROUP_CONCAT( ( Case When subrecords.`name` = '{$element['name']}' Then subrecords.`value` Else '' End ) Order By subrecords.`id` SEPARATOR ', ' ) ) As `bfrecord_custom_{$element['name']}` ";
			} else {
				$selectors .= " max( case when subrecords.`element` = '{$element['id']}' then subrecords.`value` end ) As `bfrecord_custom_{$element['name']}` ";
			}

			$selectors .= ", ";

			$selectors .= " max( case when subrecords.`element` = '{$element['id']}' then subrecords.`element` end ) As `bfrecord_custom_element_id_{$element['name']}` ";

			$selectors .= ", ";

			$selectors .= " max( case when subrecords.`type` = " . $db->quote($element['type']) . " And subrecords.`name` = " . $db->quote($element['name']) . " then subrecords.`type` end ) As `bfrecord_custom_element_type_{$element['name']}` ";

			$selectors .= ", ";

			$selectors .= " max( case when subrecords.`title` = " . $db->quote($element['title']) . " And subrecords.`name` = " . $db->quote($element['name']) . " then subrecords.`title` end ) As `bfrecord_custom_element_title_{$element['name']}` ";

			$selectors .= ", ";

			$x++;
		}

		$the_search_term = '';
		$the_having_term = '';

		if (JRequest::getBool('searchintext', false) ||
				JRequest::getBool('searchinuserid', false) ||
				JRequest::getBool('searchinusername', false) ||
				JRequest::getBool('searchinuserfullname', false) ||
				JRequest::getBool('searchinid', false) ||
				JRequest::getBool('searchinip', false) ||
				JRequest::getBool('searchinviewed', false) ||
				JRequest::getBool('searchinexported', false) ||
				JRequest::getBool('searchinarchived', false) ||
				JRequest::getBool('searchinpayment', false) ||
                JRequest::getBool('searchinopted', false)
		) {

			foreach ($elements As $element) {
				$the_having_term .= $searchterm && JRequest::getBool('searchintext', false) ? " `bfrecord_custom_{$element['name']}` Like " . $db->quote('%' . $searchterm . '%') . " Or " : '';
			}

			$the_search_term .= $searchterm && JRequest::getBool('searchinid', false) ? " records.`id` = " . $db->quote($searchterm) . " Or " : '';
			$the_search_term .= $searchterm && JRequest::getBool('searchinip', false) ? " records.`ip` = " . $db->quote($searchterm) . " Or " : '';
			$the_search_term .= $searchterm && JRequest::getBool('searchinuserid', false) ? " records.`user_id` = " . $db->quote($searchterm) . " Or " : '';
			$the_search_term .= $searchterm && JRequest::getBool('searchinusername', false) ? " records.`username` Like " . $db->quote('%' . $searchterm . '%') . " Or " : '';
			$the_search_term .= $searchterm && JRequest::getBool('searchinuserfullname', false) ? " records.`user_full_name` Like " . $db->quote('%' . $searchterm . '%') . " Or " : '';
			$the_search_term .= JRequest::getBool('searchinviewed', false) ? " records.`viewed` = 1 Or " : '';
			$the_search_term .= JRequest::getBool('searchinexported', false) ? " records.`exported` = 1 Or " : '';
			$the_search_term .= JRequest::getBool('searchinarchived', false) ? " records.`archived` = 1 Or " : '';
            $the_search_term .= JRequest::getBool('searchinopted', false) ? " records.`opted` = 1 Or " : '';
			if ($searchterm && JRequest::getBool('searchinpayment', false)) {
				$the_search_term .= " records.`paypal_tx_id` Like " . $db->quote('%' . $searchterm . '%') . " Or ";
				$the_search_term .= " records.`paypal_payment_date` Like " . $db->quote('%' . $searchterm . '%') . " Or ";
				$the_search_term .= " records.`paypal_testaccount` = " . $db->quote($searchterm) . " Or ";
				$the_search_term .= " records.`paypal_download_tries` = " . $db->quote($searchterm) . " Or ";
			}
			$the_search_term = substr($the_search_term, 0, -3);
			$the_having_term = substr($the_having_term, 0, -3);
		}

		if ($the_search_term) {
			$the_search_term = ' And ( ' . $the_search_term . ' ) ';
		}

		if ($the_having_term) {
			$the_having_term = ' Having ( ' . $the_having_term . ' ) ';
		}


		if ($searchdatefrom != '' && version_compare($this->version, '3.2', '>=')) {
			$date_ = JFactory::getDate($searchdatefrom, $this->tz);
			$searchdatefrom = $date_->format('Y-m-d H:i:s');
		}

		if ($searchdateto != '' && version_compare($this->version, '3.2', '>=')) {
			$date_ = JFactory::getDate($searchdateto, $this->tz);
			$searchdateto = $date_->format('Y-m-d H:i:s');
		}

		//$now__ = JFactory::getDate('now', $this->tz);
		//echo $now__->format('Y-m-d H:i:s', true);
		//echo $searchdate;

		$db->setQuery(
				"   Select SQL_CALC_FOUND_ROWS "
				. $selectors
				. " records.user_id As bfrecord_user_id, "
				. " records.username As bfrecord_username, "
				. " records.user_full_name As bfrecord_user_full_name, "
				. " records.id As bfrecord_id, "
				. " records.submitted As bfrecord_submitted, "
				. " records.ip As bfrecord_ip, "
				. " records.opsys As bfrecord_opsys, "
				. " records.browser As bfrecord_browser, "
				. " records.viewed As bfrecord_viewed, "
				. " records.exported As bfrecord_exported, "
				. " records.paypal_tx_id As bfrecord_payment_tx_id, "
				. " records.paypal_payment_date As bfrecord_payment_date, "
				. " records.paypal_testaccount As bfrecord_payment_test, "
				. " records.paypal_download_tries As bfrecord_payment_download_tries, "
				. " records.archived As bfrecord_archived, "
                . " records.opted As bfrecord_opted, "
				. " forms.title As bfrecord_title, "
				. " forms.name As bfrecord_name, "
				. " forms.id As bfrecord_form_id "
				. " From  "
				. " #__facileforms_forms As forms, "
				. " #__facileforms_records As records, "
				. " #__facileforms_subrecords As subrecords "
				. " Where "
				. " records.id = subrecords.record "
				. " And "
				. " forms.id = records.form "
				. ( $searchdatefrom ? " And records.submitted >= " . $db->quote($searchdatefrom) . " " : '' )
				. ( $searchdateto ? " And records.submitted <= " . $db->quote($searchdateto) . " " : '' )
				. $the_search_term
				. ( JRequest::getInt('record_id', 0) > 0 ? " And records.id = " . JRequest::getInt('record_id', 0) : "" )
				. ( JRequest::getInt('form_selection', 0) > 0 ? ' And records.form = ' . JRequest::getInt('form_selection', 0) : '' )
				. " Group By subrecords.record "
				. $the_having_term
				. " Order By `" . $order[0] . "` " . ( isset($order[1]) && strtolower($order[1]) == 'asc' ? 'Asc' : 'Desc' )
				. " Limit " . JRequest::getInt('jtStartIndex', 0) . ", " . JRequest::getInt('jtPageSize', 10)
		);

		//echo $db->getQuery();

		$result = array();
		$result['Result'] = 'OK';

		try {
			jimport('joomla.filesystem.file');
			jimport('joomla.filesystem.folder');

			$result['Records'] = $db->loadAssocList();
			$i = 0;

			foreach ($result['Records'] As $rec_key => $record) {
				$name = '';
				foreach ($record As $key => $val) {
					$name = explode('bfrecord_custom_element_id_', $key);
					if (isset($name[1])) {
						$name = $name[1];
                        //echo $result['Records'][$rec_key]['bfrecord_custom_' . $name];
                        //$result['Records'][$rec_key]['bfrecord_custom_' . $name] = $this->removeDangerousHtml($record['bfrecord_custom_' . $name]);

                        JRequest::setVar('san_bfrecord_custom', $result['Records'][$rec_key]['bfrecord_custom_' . $name]);
                        $result['Records'][$rec_key]['bfrecord_custom_' . $name] = JRequest::getVar('san_bfrecord_custom', '', '', 'HTML', JREQUEST_ALLOWHTML);

						if ($record['bfrecord_custom_element_type_' . $name] == 'File Upload' && trim($record['bfrecord_custom_' . $name])) {
							$out = '';
							$out .= '<div style="white-space: nowrap; overflow: auto; max-height: 300px; width: 100%;">';
							$files = explode("\n", str_replace("\r", "", $record['bfrecord_custom_' . $name]));
							$fileIdx = 0;
							foreach ($files As $file) {

								if (strpos(strtolower($file), '{cbsite}') === 0) {
									$file = str_replace(array('{cbsite}', '{CBSite}'), array(JPATH_SITE, JPATH_SITE), $file);
								}

								if (strpos(strtolower($file), '{site}') === 0) {
									$file = str_replace(array('{site}', '{site}'), array(JPATH_SITE, JPATH_SITE), $file);
								}

								if (!JFile::exists($file)) {
									$out .= 'file not found on server:<br/>' . basename($file) . '<br/>';
								} else {
									$out .= $this->renderFile($file, $record['bfrecord_id'], $record['bfrecord_custom_element_id_' . $name], $fileIdx);
								}
								$out .= '<br/>';
								$fileIdx++;
							}
							$out .= '</div>';
							$result['Records'][$i]['bfrecord_custom_file_upload_raw_' . $name] = $result['Records'][$i]['bfrecord_custom_' . $name];
							$result['Records'][$i]['bfrecord_custom_' . $name] = $out;
						}
						else
						if ($record['bfrecord_custom_element_type_' . $name] == 'Signature' && trim($record['bfrecord_custom_' . $name])) {
							$out = '';
							$out .= '<div style="white-space: nowrap; overflow: auto; max-height: 300px; width: 100%;">';
							$file = trim($record['bfrecord_custom_' . $name]);
							$fileIdx = 0;

							$file = JPATH_SITE . '/media/breezingforms/signatures/' . $file;

							if (!JFile::exists($file)) {
								$out .= 'file not found on server:<br/>' . basename($file) . '<br/>';
							} else {
								$out .= $this->renderFile($file, $record['bfrecord_id'], $record['bfrecord_custom_element_id_' . $name], $fileIdx);
							}

							$out .= '</div>';
							$result['Records'][$i]['bfrecord_custom_file_upload_raw_' . $name] = $result['Records'][$i]['bfrecord_custom_' . $name];
							$result['Records'][$i]['bfrecord_custom_' . $name] = $out;
						}
					}
				}
				if (version_compare($this->version, '3.2', '>=')) {
					$date_ = JFactory::getDate($result['Records'][$i]['bfrecord_submitted'], $this->tz);
					$offset = $date_->getOffsetFromGMT();
					if ($offset > 0) {
						$date_->add(new DateInterval('PT' . $offset . 'S'));
					} else if ($offset < 0) {
						$offset = $offset * -1;
						$date_->sub(new DateInterval('PT' . $offset . 'S'));
					}
					$result['Records'][$i]['bfrecord_submitted'] = $date_->format('Y-m-d H:i:s', true);
				}
				$i++;
			}
		} catch (Exception $e) {
			echo $e->getMessage();
			exit;
		}

		$db->setQuery("SELECT FOUND_ROWS();");
		$record_count = $db->loadResult();
		$result['TotalRecordCount'] = intval($record_count);

		if (JRequest::getInt('record_id', 0) > 0) {
			$db->setQuery("Update #__facileforms_records Set viewed = 1 Where id = " . JRequest::getInt('record_id', 0));
			$db->query();
		}

		echo json_encode($result);

		exit;
	}

	function deleteRecord() {

		@ob_end_clean();

		$db = JFactory::getDbo();

		// CONTENTBUILDER
		$isContentBuilder = false;
		jimport('joomla.filesystem.file');
		jimport('joomla.filesystem.folder');
		jimport('joomla.database.table');
		jimport('joomla.event.dispatcher');

		if (JFile::exists(JPATH_SITE . DS . 'administrator' . DS . 'components' . DS . 'com_contentbuilder' . DS . 'classes' . DS . 'contentbuilder.php')) {
			$isContentBuilder = true;
		}

		$is15 = true;
		if (version_compare($this->version, '1.6', '>=')) {
			$is15 = false;
		}

		if ($isContentBuilder) {
			$db->setQuery("Select `form`.id As form_id, `form`.reference_id, `form`.delete_articles From #__facileforms_records As r, #__contentbuilder_forms As form Where form.reference_id = r.form And r.id =  " . $db->Quote(JRequest::getInt('bfrecord_id')));
			$cbRecords = $db->loadAssocList();
			foreach ($cbRecords As $cbRecord) {
				$db->setQuery("Delete From #__contentbuilder_list_records Where form_id = " . intval($cbRecord['form_id']) . " And record_id = " . $db->Quote(JRequest::getInt('bfrecord_id')));
				$db->query();
				$db->setQuery("Delete From #__contentbuilder_records Where `type` = 'com_breezingforms' And `reference_id` = " . $db->Quote($cbRecord['reference_id']) . " And record_id = " . $db->Quote(JRequest::getInt('bfrecord_id')));
				$db->query();
				if ($cbRecord['delete_articles']) {
					$db->setQuery("Select article_id From #__contentbuilder_articles Where form_id = " . intval($cbRecord['form_id']) . " And record_id = " . $db->Quote(JRequest::getInt('bfrecord_id')));
					if (version_compare($this->version, '3.0', '>=')) {
						$articles = $db->loadColumn();
					} else {
						$articles = $db->loadResultArray();
					}
					if (count($articles)) {
						$article_items = array();
						foreach ($articles As $article) {
							$article_items[] = $db->Quote('com_content.article.' . $article);
							$dispatcher = JDispatcher::getInstance();
							$table = JTable::getInstance('content');
							// Trigger the onContentBeforeDelete event.
							if (!$is15 && $table->load($article)) {
								$dispatcher->trigger('onContentBeforeDelete', array('com_content.article', $table));
							}
							$db->setQuery("Delete From #__content Where id = " . intval($article));
							$db->query();
							// Trigger the onContentAfterDelete event.
							$table->reset();
							if (!$is15) {
								$dispatcher->trigger('onContentAfterDelete', array('com_content.article', $table));
							}
						}
						$db->setQuery("Delete From #__assets Where `name` In (" . implode(',', $article_items) . ")");
						$db->query();
					}
				}

				$db->setQuery("Delete From #__contentbuilder_articles Where form_id = " . intval($cbRecord['form_id']) . " And record_id = " . $db->Quote(JRequest::getInt('bfrecord_id')));
				$db->query();
			}
		}
		// CONTENTBUILDER END

		$db->setQuery("Delete From #__facileforms_records Where id = " . JRequest::getInt('bfrecord_id'));
		$db->query();

		$db->setQuery("Delete From #__facileforms_subrecords Where record = " . JRequest::getInt('bfrecord_id'));
		$db->query();

		$result = array();
		$result['Result'] = 'OK';

		echo json_encode($result);

		exit;
	}

	function renderFile($file, $record_id, $element_id, $file_index) {
		if (JRequest::getVar('renderFile', '') != '' && md5(basename($file) . $record_id . $element_id . $file_index) == JRequest::getVar('renderFile', '')) {
			@ob_end_clean();
			$this->resizeFile($file, 300, 300, '#ffffff', 'simple');
			exit;
		}
		if (JRequest::getVar('downloadFile', '') != '' && md5(basename($file) . $record_id . $element_id . $file_index) == JRequest::getVar('downloadFile', '')) {
			@ob_end_clean();
			$this->downloadFile($file);
			exit;
		}
		$image = @getimagesize($file);
		if ($image !== false) {
			return '<a href="' . JURI::getInstance()->toString() . '&downloadFile=' . md5(basename($file) . $record_id . $element_id . $file_index) . '"><img src="' . JURI::getInstance()->toString() . '&renderFile=' . md5(basename($file) . $record_id . $element_id . $file_index) . '" border=\"0\"/></a><br/>';
		} else {
			return '<a href="' . JURI::getInstance()->toString() . '&downloadFile=' . md5(basename($file) . $record_id . $element_id . $file_index) . '">' . basename($file) . '</a><br />';
		}
	}

	public function downloadFile($filename) {
		header('Content-Type: application/octet-stream');
		header('Content-Disposition: inline; filename="' . basename($filename) . '"');
		header('Content-Length: ' . @filesize($filename));
		$chunksize = 1 * (1024 * 1024); // how many bytes per chunk
		$buffer = '';
		$handle = @fopen($filename, 'rb');
		if ($handle === false) {
			return false;
		}
		while (!@feof($handle)) {
			$buffer = @fread($handle, $chunksize);
			print $buffer;
		}
		return @fclose($handle);
	}

	public function exifImageType($filename) {
		// some hosting providers think it is a good idea not to compile in exif with php...
		if (!function_exists('exif_imagetype')) {
			if (( list($width, $height, $type, $attr) = getimagesize($filename) ) !== false) {
				return $type;
			}
			return false;
		} else {
			return exif_imagetype($filename);
		}
	}

	public function resizeFile($path, $width, $height, $bgcolor = '#ffffff', $type = '') {

		$image = @getimagesize($path);

		if ($image !== false) {

		    /*
			if ($image[0] > 16384) {
				return;
			}

			if ($image[1] > 16384) {
				return;
			}*/

			$col_ = $bgcolor;
			if ($bgcolor !== null) {
				$col = array();
				$col[0] = intval(@hexdec(@substr($bgcolor, 1, 2)));
				$col[1] = intval(@hexdec(@substr($bgcolor, 3, 2)));
				$col[2] = intval(@hexdec(@substr($bgcolor, 5, 2)));
				$col_ = $col;
			}
			$exif_type = $this->exifImageType($path);
			// try to prevent memory issues
			$memory = true;

			$imageInfo = $image;

			$MB = 1048576;
			$K64 = 65536;
			$TWEAKFACTOR = 1.5;
			$channels = isset($image['channels']) ? $image['channels'] : 0;
			$memoryNeeded = round(( $image[0] * $image[1] * $image['bits'] * ($channels / 8) + $K64
					) * $TWEAKFACTOR
			);

			$ini = 8 * $MB;
			if (ini_get('memory_limit') !== false) {
				$ini = $this->returnBytes(ini_get('memory_limit'));
			}
			$memoryLimit = $ini;
			if (function_exists('memory_get_usage') &&
					memory_get_usage() + $memoryNeeded > $memoryLimit) {
				$memory = false;
			}
			if ($memory) {
				switch ($exif_type) {
					case IMAGETYPE_JPEG2000 :
					case IMAGETYPE_JPEG :
						$resource = @imagecreatefromjpeg($path);
						if ($resource) {
							$resized = @$this->resize_image($resource, $width, $height, $type == 'crop' ? 1 : ( $type == 'simple' ? 3 : 2), $col_);
							if ($resized) {
								ob_start();
								@imagejpeg($resized);
								$buffer = ob_get_contents();
								ob_end_clean();
								if ($exif_type == IMAGETYPE_JPEG2000) {
									header('Content-Type: ' . @image_type_to_mime_type(IMAGETYPE_JPEG2000));
								} else {
									header('Content-Type: ' . @image_type_to_mime_type(IMAGETYPE_JPEG));
								}
								header('Content-Disposition: inline; filename="' . basename($path) . '"');
								echo $buffer;
								@imagedestroy($resized);
							}
							@imagedestroy($resource);
						}
						break;
					case IMAGETYPE_GIF :
						$resource = @imagecreatefromgif($path);
						if ($resource) {
							$resized = @$this->resize_image($resource, $width, $height, $type == 'crop' ? 1 : ( $type == 'simple' ? 3 : 2), $col_);
							if ($resized) {
								ob_start();
								@imagegif($resized);
								$buffer = ob_get_contents();
								ob_end_clean();
								header('Content-Type: ' . @image_type_to_mime_type(IMAGETYPE_GIF));
								header('Content-Disposition: inline; filename="' . basename($path) . '"');
								echo $buffer;
								@imagedestroy($resized);
							}
							@imagedestroy($resource);
						}
						break;
					case IMAGETYPE_PNG :
						$resource = @imagecreatefrompng($path);
						if ($resource) {
							$resized = @$this->resize_image($resource, $width, $height, $type == 'crop' ? 1 : ( $type == 'simple' ? 3 : 2), $col_);
							if ($resized) {
								ob_start();
								@imagepng($resized);
								$buffer = ob_get_contents();
								ob_end_clean();
								header('Content-Type: ' . @image_type_to_mime_type(IMAGETYPE_PNG));
								header('Content-Disposition: inline; filename="' . basename($path) . '"');
								echo $buffer;
								@imagedestroy($resized);
							}
							@imagedestroy($resource);
						}
						break;
				}
			}
		}
	}

	public function resize_image($source_image, $destination_width, $destination_height, $type = 0, $bgcolor = array(0, 0, 0)) {
		// $type (1=crop to fit, 2=letterbox)
		$source_width = imagesx($source_image);
		$source_height = imagesy($source_image);
		$source_ratio = $source_width / $source_height;
		if ($destination_height == 0 && $type == 3) {
			$destination_height = $source_height;
		}
		$destination_ratio = $destination_width / $destination_height;
		if ($type == 3) {

			$old_width = $source_width;
			$old_height = $source_height;

			// Target dimensions
			$max_width = $destination_width;
			$max_height = $destination_height;
			// Get current dimensions
			// Calculate the scaling we need to do to fit the image inside our frame
			$scale = min($max_width / $old_width, $max_height / $old_height);

			// Get the new dimensions
			$destination_width = ceil($scale * $old_width);
			$destination_height = ceil($scale * $old_height);

			$new_destination_width = $destination_width;
			$new_destination_height = $destination_height;

			$source_x = 0;
			$source_y = 0;
			$destination_x = 0;
			$destination_y = 0;
		} else if ($type == 1) {
			// crop to fit
			if ($source_ratio > $destination_ratio) {
				// source has a wider ratio
				$temp_width = (int) ($source_height * $destination_ratio);
				$temp_height = $source_height;
				$source_x = (int) (($source_width - $temp_width) / 2);
				$source_y = 0;
			} else {
				// source has a taller ratio
				$temp_width = $source_width;
				$temp_height = (int) ($source_width * $destination_ratio);
				$source_x = 0;
				$source_y = (int) (($source_height - $temp_height) / 2);
			}
			$destination_x = 0;
			$destination_y = 0;
			$source_width = $temp_width;
			$source_height = $temp_height;
			$new_destination_width = $destination_width;
			$new_destination_height = $destination_height;
		} else {
			// letterbox
			if ($source_ratio < $destination_ratio) {
				// source has a taller ratio
				$temp_width = (int) ($destination_height * $source_ratio);
				$temp_height = $destination_height;
				$destination_x = (int) (($destination_width - $temp_width) / 2);
				$destination_y = 0;
			} else {
				// source has a wider ratio
				$temp_width = $destination_width;
				$temp_height = (int) ($destination_width / $source_ratio);
				$destination_x = 0;
				$destination_y = (int) (($destination_height - $temp_height) / 2);
			}
			$source_x = 0;
			$source_y = 0;
			$new_destination_width = $temp_width;
			$new_destination_height = $temp_height;
		}
		$destination_image = imagecreatetruecolor($destination_width, $destination_height);
		if ($type == 2) {
			imagefill($destination_image, 0, 0, imagecolorallocate($destination_image, $bgcolor[0], $bgcolor[1], $bgcolor[2]));
		}
		imagecopyresampled($destination_image, $source_image, $destination_x, $destination_y, $source_x, $source_y, $new_destination_width, $new_destination_height, $source_width, $source_height);
		return $destination_image;
	}

	public function returnBytes($val) {
		$val = trim($val);
		$last = strtolower($val[strlen($val) - 1]);
		$val = str_replace($val[strlen($val) - 1],'',$val);
		switch ($last) {
			// The 'G' modifier is available since PHP 5.1.0
			case 'g':
				$val *= 1024 * 1048576;
				break;
			case 'm':
				$val *= 1048576;
				break;
			case 'k':
				$val *= 1024;
				break;
            default:
                $val = 8 * 1048576;
		}

		return $val;
	}

	function exportPdf() {
		global $ff_compath;

		$db = JFactory::getDbo();

		$ids = JRequest::getVar('cid', array());
		JArrayHelper::toInteger($ids);

		$file = JPATH_SITE . '/media/breezingforms/pdftpl/export_custom_pdf.php';
		if (!JFile::exists($file)) {
			$file = JPATH_SITE . '/media/breezingforms/pdftpl/export_pdf.php';
		}

		$form_name = '';
		
		if (isset($ids[0])) {
			$ids = implode(',', $ids);
			$db->setQuery(
					"select * from #__facileforms_records where id in ($ids) order by submitted Desc"
			);
		} else if (JRequest::getInt('form_selection', 0)) {
			$db->setQuery(
					"select * from #__facileforms_records where form = " . $db->Quote(JRequest::getInt('form_selection', 0)) . " order by submitted Desc"
			);
		} else {
			$db->setQuery(
					"select * from #__facileforms_records order by submitted Desc"
			);
		}
		$recs = $db->loadObjectList();
		
		if (JRequest::getInt('form_selection', 0) && count($recs)) {
				
			$form_name = $recs[0]->name;
		}

		if($form_name != ''){

			$file2 = JPATH_SITE . '/media/breezingforms/pdftpl/'.$form_name.'_export_pdf.php';
			if (JFile::exists($file2)) {
				$file = JPATH_SITE . '/media/breezingforms/pdftpl/'.$form_name.'_export_pdf.php';
			}
		}
		
		$updIds = array();

		$i = 0;
		foreach ($recs As $rec) {
			$updIds[] = $rec->id;
			if (version_compare($this->version, '3.2', '>=')) {
				$date_ = JFactory::getDate($rec->submitted, $this->tz);
				$offset = $date_->getOffsetFromGMT();
				if ($offset > 0) {
					$date_->add(new DateInterval('PT' . $offset . 'S'));
				} else if ($offset < 0) {
					$offset = $offset * -1;
					$date_->sub(new DateInterval('PT' . $offset . 'S'));
				}
				$recs[$i]->submitted = $date_->format('Y-m-d H:i:s', true);
			}
			$i++;
		}

		if (isset($updIds[0])) {
			$updIds = implode(',', $updIds);
			$db->setQuery(
					"update #__facileforms_records set exported=1 where id in ($updIds)"
			);
			$db->query();
		}

        if(!class_exists('BFPDF')){

            require_once(JPATH_SITE . '/administrator/components/com_breezingforms/libraries/crosstec/classes/BFPDF.php');
        }

		jimport('joomla.version');
		$version = new JVersion();
		$_version = $version->getShortVersion();
		$tz = 'UTC';
		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));
		}

		$date_stamp = date('YmdHis');
		if (version_compare($_version, '3.2', '>=')) {
			$date_ = JFactory::getDate('now', $tz);
			$offset = $date_->getOffsetFromGMT();
			if ($offset > 0) {
				$date_->add(new DateInterval('PT' . $offset . 'S'));
			} else if ($offset < 0) {
				$offset = $offset * -1;
				$date_->sub(new DateInterval('PT' . $offset . 'S'));
			}
			$date_stamp = $date_->format('YmdHis', true);
		}

		$pdf = new BFPDF();
        $pdf->setFormName($form_name);
        $pdf->setWhich('export');

        @ob_end_clean();
        ob_start();
        require_once($file);
        $c = ob_get_contents();
        ob_end_clean();

		$active_found = false;
		$font_loaded = false;
        $ttf_name = '';

		if (JFolder::exists(JPATH_SITE . '/media/breezingforms/pdftpl/fonts/')) {

			$sourcePath = JPATH_SITE . '/media/breezingforms/pdftpl/fonts/';
			if (@file_exists($sourcePath) && @is_readable($sourcePath) && @is_dir($sourcePath) && $handle = @opendir($sourcePath)) {
				while (false !== ($file = @readdir($handle))) {
					if ($file != "." && $file != ".." && $this->endsWith(strtolower($file), '.php')) {
						$file_sep = explode('.', $file);
						if (count($file_sep) > 1) {
							unset($file_sep[count($file_sep) - 1]);
							$pdf->AddFont(implode('_', $file_sep), '', $sourcePath . $file);
							$font_loaded = true;
						}
					}
					if ($file != "." && $file != ".." && $this->endsWith(strtolower($file), '.ttf')) {
						$file_sep = explode('.', $file);
						if (count($file_sep) > 1) {
							unset($file_sep[count($file_sep) - 1]);
                            $ttf_name = TCPDF_FONTS::addTTFfont($sourcePath . $file, 'TrueTypeUnicode');
							$font_loaded = true;
						}
					}
					if ($this->endsWith(strtolower($file), '_active')) {
						$active = explode('_', $file);
						if (count($active) > 1) {
							unset($active[count($active) - 1]);
                            $font_name = '';
                            if( $ttf_name != '' ){
                                $font_name = $ttf_name;
                            }else{
                                $font_name = implode('_',$active);
                            }
							$pdf->SetFont($font_name);
							if ($font_loaded) {
								$active_found = true;
							}
						}
					}
				}
				@closedir($handle);
			}
		}

		if (!$active_found) {
			TCPDF_FONTS::addTTFfont(JPATH_SITE . '/administrator/components/com_breezingforms/libraries/tcpdf/fonts/verdana.ttf', 'TrueTypeUnicode');
			$pdf->SetFont('verdana');
		}

        if($pdf->getFooterTemplate() == '') {

            $pdf->setPrintFooter(false);

        }else{

            $pdf->setPrintFooter(true);
        }

        if($pdf->getHeaderTemplate() == '') {

            $pdf->setPrintHeader(false);

        }else{

            $pdf->setPrintHeader(true);
        }

		$pdf->AddPage();
		$pdf->writeHTML($c);
		$pdfname = ( $form_name != '' ? $form_name . '-' : '' ).'ffexport-pdf-' . $date_stamp . '.pdf';
		$pdf->lastPage();
		$pdf->Output($pdfname, "D");
		exit;
	}

	function endsWith($haystack, $needle) {
		return $needle === "" || substr($haystack, -strlen($needle)) === $needle;
	}

	function getSubrecords($recordId) {
		$db = JFactory::getDbo();
		$db->setQuery(
				"select Distinct subs.* from #__facileforms_subrecords As subs, #__facileforms_elements as els where els.id=subs.element And subs.record = " . intval($recordId) . " order by els.ordering"
		);
		return $db->loadObjectList();
	}

	function exportCsv() { 
		// echo '<pre>';
		global $ff_config;

		$inverted = isset($ff_config->csvinverted) ? $ff_config->csvinverted : false;

		$db = JFactory::getDbo();

		$ids = JRequest::getVar('cid', array());
		JArrayHelper::toInteger($ids);

		$csvdelimiter = stripslashes($ff_config->csvdelimiter);
		$csvquote = stripslashes($ff_config->csvquote);
		$cellnewline = $ff_config->cellnewline == 0 ? "\n" : "\\n";

		$form_name = '';
		
		$fields = array();
		$lines = array();
		$element_fields = array();
		$updIds = array();

		if (isset($ids[0])) {
			$ids = implode(',', $ids);
			$db->setQuery(
					"select * from #__facileforms_records where id in ($ids) order by submitted Desc"
			);
			$recs = $db->loadObjectList();

			if (JRequest::getInt('form_selection', 0) && count($recs)) {
				
				$form_name = $recs[0]->name;
			}
			
			$forms = array();
			foreach ($recs As $rec) {
				$forms[] = $rec->form;
			}

			$db->setQuery(
					"select Distinct * from #__facileforms_elements where form In (" . implode(',', $forms) . ")  And published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5' order by ordering"
			);

			$element_fields = $db->loadObjectList();
		} else if (JRequest::getInt('form_selection', 0)) {
			$db->setQuery(
					"select * from #__facileforms_records where form = " . $db->Quote(JRequest::getInt('form_selection', 0)) . " order by submitted Desc"
			);
			$recs = $db->loadObjectList();
			
			if(count($recs)){
				$form_name = $recs[0]->name;
			}
			
			$db->setQuery(
					"select Distinct * from #__facileforms_elements where form = " . $db->Quote(JRequest::getInt('form_selection', 0)) . " And published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5' order by ordering"
			);
			$element_fields = $db->loadObjectList();
		} else {
			$db->setQuery(
					"select * from #__facileforms_records order by submitted Desc"
			);
			$recs = $db->loadObjectList();
			
			$db->setQuery(
					"select Distinct * from #__facileforms_elements Where published = 1 And `name` <> 'bfFakeName' And `name` <> 'bfFakeName2' And `name` <> 'bfFakeName3' And `name` <> 'bfFakeName4' And `name` <> 'bfFakeName5'"
			);
			$element_fields = $db->loadObjectList();
		}

		$fields['ID'] = true;
		$fields['SUBMITTED'] = true;
		$fields['USER_ID'] = true;
		$fields['USERNAME'] = true;
		$fields['USER_FULL_NAME'] = true;
		$fields['TITLE'] = true;
		$fields['IP'] = true;
		$fields['BROWSER'] = true;
		$fields['OPSYS'] = true;
		$fields['TRANSACTION_ID'] = true;
		$fields['DATE'] = true;
		$fields['TEST_ACCOUNT'] = true;
		$fields['DOWNLOAD_TRIES'] = true;
        $fields['DOUBLE_OPT_IN'] = true;

		$head_keys = array();

		foreach ($element_fields As $element_field) {
			if (!isset($fields[strip_tags($element_field->name)])) {
				$field_key = md5(strip_tags($element_field->name));
				$fields[$field_key] = true;
				$head_keys[$field_key] = strip_tags($element_field->name);
			}
		}

		$recsSize = count($recs);
		for ($r = 0; $r < $recsSize; $r++) {

			$rec = $recs[$r];



			if (version_compare($this->version, '3.2', '>=')) {
				$date_ = JFactory::getDate($rec->submitted, $this->tz);
				$offset = $date_->getOffsetFromGMT();
				if ($offset > 0) {
					$date_->add(new DateInterval('PT' . $offset . 'S'));
				} else if ($offset < 0) {
					$offset = $offset * -1;
					$date_->sub(new DateInterval('PT' . $offset . 'S'));
				}
				$rec->submitted = $date_->format('Y-m-d H:i:s', true);
			}

			$updIds[] = $rec->id;

			$lineNum = count($lines);

			$lines[$lineNum]['ID'][] = $rec->id;
			$lines[$lineNum]['SUBMITTED'][] = $rec->submitted;
			$lines[$lineNum]['USER_ID'][] = $rec->user_id;
			$lines[$lineNum]['USERNAME'][] = $rec->username;
			$lines[$lineNum]['USER_FULL_NAME'][] = $rec->user_full_name;
			$lines[$lineNum]['TITLE'][] = $rec->title;
			$lines[$lineNum]['IP'][] = $rec->ip;
			$lines[$lineNum]['BROWSER'][] = $rec->browser;
			$lines[$lineNum]['OPSYS'][] = $rec->opsys;
			$lines[$lineNum]['TRANSACTION_ID'][] = $rec->paypal_tx_id;
			$lines[$lineNum]['DATE'][] = $rec->paypal_payment_date;
			$lines[$lineNum]['TEST_ACCOUNT'][] = $rec->paypal_testaccount;
			$lines[$lineNum]['DOWNLOAD_TRIES'][] = $rec->paypal_download_tries;
            $lines[$lineNum]['DOUBLE_OPT_IN'][] = $rec->opted;

			foreach ($fields As $fieldName => $null) {
				switch ($fieldName) {
					case 'ID':
					case 'SUBMITTED':
					case 'USER_ID':
					case 'USERNAME':
					case 'USER_FULL_NAME':
					case 'TITLE':
					case 'IP':
					case 'BROWSER':
					case 'OPSYS':
					case 'TRANSACTION_ID':
					case 'DATE':
					case 'TEST_ACCOUNT':
					case 'DOWNLOAD_TRIES':
                    case 'DOUBLE_OPT_IN':
						break;
					default:
						$lines[$lineNum][$fieldName] = array();
				}
			}

			$rec = $recs[$r];
			$db->setQuery(
					"select Distinct s.*, e.title As title from #__facileforms_subrecords As s, #__facileforms_elements As e where e.id = s.element And s.record = $rec->id Order By e.ordering"
			);

			$subs = $db->loadObjectList();
			

			$subsSize = count($subs);
			for ($s = 0; $s < $subsSize; $s++) {
				$sub = $subs[$s];
				if ($sub->name != 'bfFakeName' && $sub->name != 'bfFakeName2' && $sub->name != 'bfFakeName3' && $sub->name != 'bfFakeName4') {
					if (!isset($fields[ md5( strip_tags( $sub->name ) ) ])) { 
						$fields[ md5( strip_tags( $sub->name ) ) ] = true; 
					}
					if ($sub->type == 'File Upload' && strpos(strtolower($sub->value), '{cbsite}') === 0) {
						$out = '';
						$nl = '';
						$_values = explode("\n", str_replace("\r", '', $sub->value));
						$length = count($_values);
						$i = 0;
						foreach ($_values As $_value) {
							if ($i + 1 < $length) {
								$nl = "\n";
							} else {
								$nl = '';
							}
							$out .= str_replace(array('{cbsite}', '{CBSite}'), array(JPATH_SITE, JPATH_SITE), $_value) . $nl;
							$i++;
						}
						$sub->value = $out;
					}
					$lines[$lineNum][md5( strip_tags( $sub->name ) )][] = $sub->value; 
				}
			}
		}

		$head = '';
		//ksort($fields);

		$lineLength = count($lines);
		foreach ($fields As $fieldName => $null) {
			if ($inverted == false) {

				$head .= $csvquote . (isset($head_keys[$fieldName]) ? $head_keys[$fieldName] : $fieldName) . $csvquote . $csvdelimiter;
			}

			for ($i = 0; $i < $lineLength; $i++) {
				if (!isset($lines[$i][$fieldName])) {
					$lines[$i][$fieldName] = array();
				}
			}
		}

		$head = substr($head, 0, strlen($head) - 1) . nl();

		$out = '';
		for ($i = 0; $i < $lineLength; $i++) {
			foreach ($lines[$i] As $fieldName => $line) {

				if ($inverted == true) {
					$out .= $csvquote . str_replace($csvquote, $csvquote . $csvquote, str_replace("\n", $cellnewline, str_replace("\r", "", $fieldName))) . $csvquote . $csvdelimiter;
				}
				$out .= $csvquote . str_replace($csvquote, $csvquote . $csvquote, str_replace("\n", $cellnewline, str_replace("\r", "", implode('|', $line)))) . $csvquote . $csvdelimiter;
				if ($inverted == true) {
					$out .= nl();
				}
			}

			if ($inverted == false) {
				$out = substr($out, 0, strlen($out) - 1);
				$out .= nl();
			}

			if ($inverted == true) {
				$out .= $csvquote . '' . $csvquote . $csvdelimiter . $csvquote . '' . $csvquote . $csvdelimiter . nl();
			}
		}

		jimport('joomla.version');
		$version = new JVersion();
		$_version = $version->getShortVersion();
		$tz = 'UTC';
		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));
		}

		$date_stamp = date('YmdHis');
		if (version_compare($_version, '3.2', '>=')) {
			$date_ = JFactory::getDate('now', $tz);
			$offset = $date_->getOffsetFromGMT();
			if ($offset > 0) {
				$date_->add(new DateInterval('PT' . $offset . 'S'));
			} else if ($offset < 0) {
				$offset = $offset * -1;
				$date_->sub(new DateInterval('PT' . $offset . 'S'));
			}
			$date_stamp = $date_->format('YmdHis', true);
		}

		$csvname = JPATH_SITE . '/components/com_breezingforms/exports/'.( $form_name != '' ? $form_name . '-' : '' ).'ffexport-' . $date_stamp . '.csv';
		JFile::makeSafe($csvname);

		//if (!JFile::write($csvname,$headout = $head.$out)) {
		//	echo "<script> alert('".addslashes(BFText::_('COM_BREEZINGFORMS_RECORDS_XMLNORWRTBL'))."'); window.history.go(-1);</script>\n";
		//	exit();
		//} // if

		if (isset($updIds[0])) {
			$updIds = implode(',', $updIds);

			$db->setQuery(
					"update #__facileforms_records set exported=1 where id in ($updIds)"
			);
			
			$db->query();
		}
		/*
		  $data = JFile::read($csvname);
		  $files[] = array('name' => basename($csvname), 'data' => $data);

		  $zip = JArchive::getAdapter('zip');
		  $path = JPATH_SITE.'/components/com_breezingforms/exports/ffexport-csv-'.date('YmdHis').'.zip';
		  $zip->create($path, $files);
		  JFile::delete($csvname);
		 */
		@ob_end_clean();

		//$_size = filesize($csvname);
		$_name = basename($csvname);
		@ini_set("zlib.output_compression", "Off");

		Header("Content-Type: text/comma-separated-values; charset=utf-8");
		Header("Content-Disposition: attachment;filename=\"$_name\"");
		Header("Content-Transfer-Encoding: 8bit");

		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: private");
		//header("Content-Type: application/octet-stream");
		//header("Content-Disposition: attachment; filename=$_name");
		//header("Accept-Ranges: bytes");
		//header("Content-Length: $_size");
		ob_start();
		echo $head . $out;
		$c = ob_get_contents();
		ob_end_clean();
		if (function_exists('mb_convert_encoding')) {
			$to_encoding = 'UTF-16LE';
			$from_encoding = 'UTF-8';
			echo chr(255) . chr(254) . mb_convert_encoding($c, $to_encoding, $from_encoding);
		} else {
			echo $c;
		}
		exit;
	}

	function exportXml() {
		global $database, $ff_admsite, $ff_compath, $ff_version, $mosConfig_fileperms;

		$ids = JRequest::getVar('cid', array());
		JArrayHelper::toInteger($ids);

		jimport('joomla.version');
		$version = new JVersion();
		$_version = $version->getShortVersion();
		$tz = 'UTC';
		if (version_compare($_version, '3.2', '>=')) {
			$tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset'));
		}

		$date_stamp = date('YmdHis');
		$date_file = date('Y-m-d H:i:s');
		if (version_compare($_version, '3.2', '>=')) {
			$date_ = JFactory::getDate('now', $tz);
			$offset = $date_->getOffsetFromGMT();
			if ($offset > 0) {
				$date_->add(new DateInterval('PT' . $offset . 'S'));
			} else if ($offset < 0) {
				$offset = $offset * -1;
				$date_->sub(new DateInterval('PT' . $offset . 'S'));
			}
			$date_stamp = $date_->format('YmdHis', true);
			$date_file = $date_->format('Y-m-d H:i:s', true);
		}

		$form_name = '';
		
		$database = JFactory::getDBO();
		
		if (isset($ids[0])) {
			$ids = implode(',', $ids);
			$database->setQuery(
					"select * from #__facileforms_records where id in ($ids) order by submitted Desc"
			);
		} else if (JRequest::getInt('form_selection', 0)) {
			$database->setQuery(
					"select * from #__facileforms_records where form = " . $database->Quote(JRequest::getInt('form_selection', 0)) . " order by submitted Desc"
			);
		} else {
			$database->setQuery(
					"select * from #__facileforms_records order by submitted Desc"
			);
		}
		
		$recs = $database->loadObjectList();
		
		if (JRequest::getInt('form_selection', 0) && count($recs)) {
				
			$form_name = $recs[0]->name;
		}
		
		$xmlname = $ff_compath . '/exports/'.( $form_name != '' ? $form_name . '-' : '' ).'ffexport-' . $date_stamp . '.xml';
		
		if ($database->getErrorNum()) {
			echo $database->stderr();
			return false;
		} // if

		$xml = '<?xml version="1.0" encoding="utf-8" ?>' . nl() .
				'<FacileFormsExport type="records" version="' . $ff_version . '">' . nl() .
				indent(1) . '<exportdate>' . $date_file . '</exportdate>' . nl();
		$updIds = array();
		$form = '';
		for ($r = 0; $r < count($recs); $r++) {
			$rec = $recs[$r];

			if (version_compare($this->version, '3.2', '>=')) {
				$date_ = JFactory::getDate($rec->submitted, $this->tz);
				$offset = $date_->getOffsetFromGMT();
				if ($offset > 0) {
					$date_->add(new DateInterval('PT' . $offset . 'S'));
				} else if ($offset < 0) {
					$offset = $offset * -1;
					$date_->sub(new DateInterval('PT' . $offset . 'S'));
				}
				$rec->submitted = $date_->format('Y-m-d H:i:s', true);
			}

			$updIds[] = $rec->id;
			$xml .= indent(1) . '<record id="' . $rec->id . '">' . nl() .
					indent(2) . '<submitted>' . $rec->submitted . '</submitted>' . nl() .
					indent(2) . '<user_id>' . $rec->user_id . '</user_id>' . nl() .
					indent(2) . '<username>' . htmlspecialchars($rec->username) . '</username>' . nl() .
					indent(2) . '<user_full_name>' . htmlspecialchars($rec->user_full_name) . '</user_full_name>' . nl() .
					indent(2) . '<form>' . $rec->form . '</form>' . nl() .
					indent(2) . '<title>' . htmlspecialchars($rec->title) . '</title>' . nl() .
					indent(2) . '<name>' . $rec->name . '</name>' . nl() .
					indent(2) . '<ip>' . $rec->ip . '</ip>' . nl() .
					indent(2) . '<browser>' . htmlspecialchars($rec->browser) . '</browser>' . nl() .
					indent(2) . '<opsys>' . htmlspecialchars($rec->opsys) . '</opsys>' . nl() .
					indent(2) . '<provider>' . $rec->provider . '</provider>' . nl() .
					indent(2) . '<viewed>' . $rec->viewed . '</viewed>' . nl() .
					indent(2) . '<exported>' . $rec->exported . '</exported>' . nl() .
					indent(2) . '<archived>' . $rec->archived . '</archived>' . nl() .
					indent(2) . '<pptxid>' . $rec->paypal_tx_id . '</pptxid>' . nl() .
					indent(2) . '<pppdate>' . $rec->paypal_payment_date . '</pppdate>' . nl() .
					indent(2) . '<pptestacc>' . $rec->paypal_testaccount . '</pptestacc>' . nl() .
					indent(2) . '<ppdltries>' . $rec->paypal_download_tries . '</ppdltries>' . nl() .
                    indent(2) . '<opted>' . $rec->opted . '</opted>' . nl();
			$database->setQuery(
					"select subs.* from #__facileforms_subrecords As subs, #__facileforms_elements As els where els.id=subs.element And subs.record = $rec->id order by ordering"
			);
			$subs = $database->loadObjectList();
			for ($s = 0; $s < count($subs); $s++) {
				$sub = $subs[$s];
				if ($sub->type == 'File Upload' && strpos(strtolower($sub->value), '{cbsite}') === 0) {
					$out = '';
					$nl = '';
					$_values = explode("\n", str_replace("\r", '', $sub->value));
					$length = count($_values);
					$i = 0;
					foreach ($_values As $_value) {
						if ($i + 1 < $length) {
							$nl = "\n";
						} else {
							$nl = '';
						}
						$out .= str_replace(array('{cbsite}', '{CBSite}'), array(JPATH_SITE, JPATH_SITE), $_value) . $nl;
						$i++;
					}
					$sub->value = $out;
				}
				$xml .= indent(2) . '<subrecord id="' . $sub->id . '">' . nl() .
						indent(3) . '<element>' . $sub->element . '</element>' . nl() .
						indent(3) . '<name>' . $sub->name . '</name>' . nl() .
						indent(3) . '<title>' . htmlspecialchars($sub->title) . '</title>' . nl() .
						indent(3) . '<type>' . $sub->type . '</type>' . nl() .
						indent(3) . '<value>' . htmlspecialchars($sub->value) . '</value>' . nl() .
						indent(2) . '</subrecord>' . nl();
			} // for
			$xml .= indent(1) . '</record>' . nl();
		} // for
		$xml .= '</FacileFormsExport>' . nl();

		//$xmlname = JFile::makeSafe($xmlname);
		//if (!JFile::write($xmlname,$xml)) {
		//	echo "<script> alert('".addslashes(BFText::_('COM_BREEZINGFORMS_RECORDS_XMLNORWRTBL'))."'); window.history.go(-1);</script>\n";
		//	exit();
		//} // if

		if (isset($updIds[0])) {
			$updIds = implode(',', $updIds);
			$database->setQuery(
					"update #__facileforms_records set exported=1 where id in ($updIds)"
			);
			$database->query();
		}

		@ob_end_clean();
		//$_size = filesize($xmlname);
		$_name = basename($xmlname);
		@ini_set("zlib.output_compression", "Off");
		header("Pragma: public");
		header("Expires: 0");
		header("Cache-Control: private");
		header("Content-Type: application/octet-stream");
		header("Content-Disposition: attachment; filename=$_name");
		header("Accept-Ranges: bytes");
		//header("Content-Length: $_size");
		echo $xml;
		exit;
	}

    function removeDangerousHtml($value){

	    if(trim($value) == '') return '';

        $doc = new DOMDocument();
        $ret = @$doc->loadHTML('<div>'.$value.'</div>');
        if($ret) {
            $script_tags = $doc->getElementsByTagName('script');
            $length = $script_tags->length;
            for ($ii = 0; $ii < $length; $ii++) {
                $script_tags->item($ii)->parentNode->removeChild($script_tags->item($ii));
            }
            $style_tags = $doc->getElementsByTagName('style');
            $length = $style_tags->length;
            for ($ii = 0; $ii < $length; $ii++) {
                $style_tags->item($ii)->parentNode->removeChild($style_tags->item($ii));
            }
            $iframe_tags = $doc->getElementsByTagName('iframe');
            $length = $iframe_tags->length;
            for ($ii = 0; $ii < $length; $ii++) {
                $iframe_tags->item($ii)->parentNode->removeChild($iframe_tags->item($ii));
            }
            $applet_tags = $doc->getElementsByTagName('applet');
            $length = $applet_tags->length;
            for ($ii = 0; $ii < $length; $ii++) {
                $applet_tags->item($ii)->parentNode->removeChild($applet_tags->item($ii));
            }
            $link_tags = $doc->getElementsByTagName('link');
            $length = $link_tags->length;
            for ($ii = 0; $ii < $length; $ii++) {
                $link_tags->item($ii)->parentNode->removeChild($link_tags->item($ii));
            }

            $mock = new DOMDocument;
            $body = $doc->getElementsByTagName('body')->item(0);
            foreach ($body->childNodes as $child) {
                $mock->appendChild($mock->importNode($child, true));
            }

            $container = $mock->getElementsByTagName('div')->item(0);

            if ($container && $container->parentNode) {
                $container = $container->parentNode->removeChild($container);
            }

            if ($mock) {
                while ($mock->firstChild) {
                    $mock->removeChild($mock->firstChild);
                }
            }

            if ($container) {
                while ($container->firstChild) {
                    $mock->appendChild($container->firstChild);
                }
            }

            return $mock->saveHTML();

        }

        return strip_tags($value);
    }

// expxml
}