protected static function tab_your_square($args, $auth, $attrs)
 {
     $r = '<fieldset class="ui-corner-all" >';
     $r .= '<legend>Place on map</legend>';
     $r .= '<div class="two columns"><div class="column">';
     $r .= data_entry_helper::georeference_lookup(array('label' => 'Enter the nearest place name', 'labelClass' => 'control-width-5', 'helpText' => 'Enter the name of a nearby town or village then click Search to quickly find the correct region on the map. ' . 'Or if you know the grid reference, type it into the following box.'));
     $r .= data_entry_helper::sref_and_system(array('label' => 'Your 1km grid reference', 'labelClass' => 'control-width-5', 'fieldname' => 'sample:entered_sref', 'systems' => array('OSGB' => 'British National Grid', 'OSIE' => 'Irish Grid'), 'class' => 'ui-state-highlight'));
     $sq_error = data_entry_helper::check_errors('smpAttr:' . $args['attr_surveyed_square']);
     $r .= '<fieldset class="ui-state-highlight ui-corner-all' . ($sq_error ? ' ui-state-error' : '') . '">';
     $r .= "<legend>Please also select one of the 3 choices below</legend>\n";
     if ($sq_error) {
         $r .= "{$sq_error}<br/>\n";
     }
     // manual output of radio buttons since data_entry_helper::radio_group does not support splicing in the textarea.
     $whichSqrAttr = $attrs['smpAttr:' . $args['attr_surveyed_square']];
     $reasonAttr = $attrs['smpAttr:' . $args['attr_surveyed_other_square_reason']];
     $fieldname = $whichSqrAttr['fieldname'];
     $value = $whichSqrAttr['default'];
     $r .= '<label class="auto">';
     $r .= '<input ';
     if ($value == $args['term_surveyed_given_square']) {
         $r .= 'checked="checked" ';
     }
     $r .= 'type="radio" id="attr_surveyed_given_square" value="' . $args['term_surveyed_given_square'] . '" name="' . $whichSqrAttr['fieldname'] . '"/> ';
     $r .= "I have surveyed the random square that I was given</label><br/>\n";
     $r .= '<label class="auto">';
     $r .= '<input ';
     if ($value == $args['term_surveyed_other_square']) {
         $r .= 'checked="checked" ';
     }
     $r .= 'type="radio" id="attr_surveyed_other_square" value="' . $args['term_surveyed_other_square'] . '" name="' . $whichSqrAttr['fieldname'] . '"/> ';
     $r .= "I have not surveyed the random square because</label><br/>\n";
     $r .= data_entry_helper::textarea(array('fieldname' => $reasonAttr['fieldname'], 'class' => 'indented reason', 'default' => $reasonAttr['default'], 'cols' => 50));
     $r .= "\n<label class=\"auto\">";
     $r .= '<input ';
     if ($value == $args['term_surveyed_same_square']) {
         $r .= 'checked="checked" ';
     }
     $r .= 'type="radio" id="attr_surveyed_same_square" value="' . $args['term_surveyed_same_square'] . '" name="' . $whichSqrAttr['fieldname'] . '"/> ';
     $r .= "I have resurveyed the same square as before</label>\n";
     $r .= '</fieldset>';
     $r .= '</div><div class="column">';
     $r .= data_entry_helper::map_panel(array('presetLayers' => array('google_hybrid'), 'readAuth' => $auth, 'class' => 'ui-widget-content', 'clickedSrefPrecisionMin' => 4, 'clickedSrefPrecisionMax' => 4, 'initial_lat' => 54, 'initial_long' => -1, 'initial_zoom' => 5, 'width' => '100%', 'tabDiv' => 'your-square'));
     $r .= "</div></div></fieldset>\n";
     $r .= data_entry_helper::wizard_buttons(array('divId' => 'tabs', 'page' => 'middle'));
     return $r;
 }
 private function dump_one_row($txIdx, $rowIds, $taxalist, $taxonRows, $occAttrControls, $attributes, $options)
 {
     global $indicia_templates;
     $ttlId = $rowIds['ttlId'];
     $colIdx = (int) floor($rowIdx / count($taxonRows));
     // Find the taxon in our preloaded list data that we want to output for this row
     $taxonIdx = 0;
     while ($taxonIdx < count($taxalist) && $taxalist[$taxonIdx]['id'] != $ttlId) {
         $taxonIdx += 1;
     }
     if ($taxonIdx >= count($taxalist)) {
         return '';
     }
     // next taxon, as this one was not found in the list
     $taxon = $taxalist[$taxonIdx];
     $firstColumnTaxon = $taxon;
     // map field names if using a cached lookup
     if ($options['cacheLookup']) {
         $firstColumnTaxon = $firstColumnTaxon + array('preferred_name' => $firstColumnTaxon['preferred_taxon'], 'common' => $firstColumnTaxon['default_common_name']);
     }
     $firstColumnTaxon['taxonComp'] = preg_replace('/\\s+|\\//', '-', strtolower($firstColumnTaxon['taxon']));
     // Get the cell content from the taxon_label template
     $firstCell = data_entry_helper::mergeParamsIntoTemplate($firstColumnTaxon, 'taxon_label');
     // Now create the table cell to contain this.
     $row = '';
     $row .= str_replace(array('{content}', '{colspan}', '{tableId}', '{idx}'), array($firstCell, '', $options['id'], $colIdx), $indicia_templates['taxon_label_cell']);
     $row .= "\n<td class=\"scPresenceCell\" headers=\"{$options['id']}-present-{$colIdx}\" style=\"display:none\">";
     $fieldname = "sc:{$options['id']}-{$txIdx}:{$existing_record_id}:present";
     $row .= "<input type=\"hidden\" name=\"{$fieldname}\" id=\"{$fieldname}\" value=\"{$taxon['id']}\"/>";
     $row .= "</td>";
     $idx = 0;
     foreach ($occAttrControls as $attrId => $control) {
         $existing_value = '';
         $valId = false;
         // no existing record, so use a default control ID which excludes the existing record ID.
         $ctrlId = str_replace('-idx-', "{$options['id']}-{$txIdx}", $attributes[$attrId]['fieldname']);
         $loadedCtrlFieldName = '-';
         if ($existing_value === '' && array_key_exists('default', $attributes[$attrId])) {
             // this case happens when reloading an existing record
             $existing_value = $attributes[$attrId]['default'];
         }
         // inject the field name into the control HTML
         $oc = str_replace('{fieldname}', $ctrlId, $control);
         if ($existing_value != "") {
             // For select controls, specify which option is selected from the existing value
             if (substr($oc, 0, 7) == '<select') {
                 $oc = str_replace('value="' . $existing_value . '"', 'value="' . $existing_value . '" selected="selected"', $oc);
             } else {
                 if (strpos($oc, 'checkbox') !== false) {
                     if ($existing_value == "1") {
                         $oc = str_replace('type="checkbox"', 'type="checkbox" checked="checked"', $oc);
                     }
                 } else {
                     $oc = str_replace('value=""', 'value="' . $existing_value . '"', $oc);
                 }
             }
         }
         $errorField = "occAttr:{$attrId}" . ($valId ? ":{$valId}" : '');
         $error = data_entry_helper::check_errors($errorField);
         if ($error) {
             $oc = str_replace("class='", "class='ui-state-error ", $oc);
             $oc .= $error;
         }
         $headers = $options['id'] . "-attr{$attrId}-{$colIdx}";
         $class = self::species_checklist_occ_attr_class($options, $idx, $attributes[$attrId]['untranslatedCaption']);
         $class = $class . 'Cell';
         $row .= str_replace(array('{label}', '{class}', '{content}', '{headers}'), array(lang::get($attributes[$attrId]['caption']), $class, $oc, $headers), $indicia_templates[$options['attrCellTemplate']]);
         $idx++;
     }
     return $row;
 }
 private static function addAttributeCols($occAttrControls, $attributes, $options, $txIdx)
 {
     global $indicia_templates;
     $idx = 0;
     foreach ($occAttrControls as $attrId => $control) {
         $existing_value = '';
         $valId = false;
         // no existing record, so use a default control ID which excludes the existing record ID.
         $ctrlId = str_replace('-idx-', "{$options['id']}-{$txIdx}", $attributes[$attrId]['fieldname']);
         $loadedCtrlFieldName = '-';
         if ($existing_value === '' && array_key_exists('default', $attributes[$attrId])) {
             // this case happens when reloading an existing record
             $existing_value = $attributes[$attrId]['default'];
         }
         // inject the field name into the control HTML
         $oc = str_replace('{fieldname}', $ctrlId, $control);
         if ($existing_value != "") {
             // For select controls, specify which option is selected from the existing value
             if (substr($oc, 0, 7) == '<select') {
                 $oc = str_replace('value="' . $existing_value . '"', 'value="' . $existing_value . '" selected="selected"', $oc);
             } else {
                 if (strpos($oc, 'checkbox') !== false) {
                     if ($existing_value == "1") {
                         $oc = str_replace('type="checkbox"', 'type="checkbox" checked="checked"', $oc);
                     }
                 } else {
                     $oc = str_replace('value=""', 'value="' . $existing_value . '"', $oc);
                 }
             }
         }
         $errorField = "occAttr:{$attrId}" . ($valId ? ":{$valId}" : '');
         $error = data_entry_helper::check_errors($errorField);
         if ($error) {
             $oc = str_replace("class='", "class='ui-state-error ", $oc);
             $oc .= $error;
         }
         $headers = $options['id'] . "-attr{$attrId}-{$txIdx}";
         $class = self::species_checklist_occ_attr_class($options, $idx, $attributes[$attrId]['untranslatedCaption']);
         $class = $class . 'Cell';
         $row .= str_replace(array('{label}', '{class}', '{content}', '{headers}'), array(lang::get($attributes[$attrId]['caption']), $class, $oc, $headers), $indicia_templates[$options['attrCellTemplate']]);
         $idx++;
     }
     return $row;
 }