/**
  * loadGenericFormStructure
  * @author Thomas Schedler <*****@*****.**>
  * @version 1.0
  */
 public function loadGenericFormStructure()
 {
     $this->core->logger->debug('massiveart->generic->GenericSetup->loadGenericFormStructure()');
     try {
         /**
          * load the generic form model
          */
         $this->getModelGenericForm();
         $blnCacheGenForm = $this->core->sysConfig->cache->generic_form_structure == 'true' ? true : false;
         $arrFrontendOptions = array('caching' => $blnCacheGenForm, 'lifetime' => null, 'automatic_serialization' => true);
         $arrBackendOptions = array('cache_dir' => GLOBAL_ROOT_PATH . '/tmp/cache/gen_forms/');
         // getting a Zend_Cache_Core object
         $objCache = Zend_Cache::factory('Core', 'File', $arrFrontendOptions, $arrBackendOptions);
         // see if a cache already exists:
         if (!($objFieldsAndRegionsData = $objCache->load('GenForm' . $this->intGenFormId))) {
             // cache miss; get generic form structure
             $objFieldsAndRegionsData = $this->objModelGenericForm->loadFieldsAndRegionsByFormId($this->intGenFormId);
             $objCache->save($objFieldsAndRegionsData, 'GenForm' . $this->intGenFormId);
         }
         $arrExcludedRegions = array();
         if ($this->getTemplateId() > 0) {
             $objTemplateExcludedRegionData = $this->getModelTemplates()->loadTemplateExcludedRegions($this->getTemplateId());
             if (count($objTemplateExcludedRegionData) > 0) {
                 foreach ($objTemplateExcludedRegionData as $objTemplateExcludedRegion) {
                     $arrExcludedRegions[] = $objTemplateExcludedRegion->idRegions;
                 }
             }
         }
         $arrExcludedFields = array();
         if ($this->getTemplateId() > 0) {
             $objTemplateExcludedFieldData = $this->getModelTemplates()->loadTemplateExcludedFields($this->getTemplateId());
             if (count($objTemplateExcludedFieldData) > 0) {
                 foreach ($objTemplateExcludedFieldData as $objTemplateExcludedField) {
                     $arrExcludedFields[] = $objTemplateExcludedField->idFields;
                 }
             }
         }
         $arrTemplateRegionProperties = array();
         if ($this->getTemplateId() > 0) {
             $objTemplateRegionPropertiesData = $this->getModelTemplates()->loadTemplateRegionProperties($this->getTemplateId());
             if (count($objTemplateRegionPropertiesData) > 0) {
                 foreach ($objTemplateRegionPropertiesData as $objTemplateRegionProperty) {
                     $arrTemplateRegionProperties[$objTemplateRegionProperty->idRegions] = array('order' => $objTemplateRegionProperty->order, 'collapsable' => $objTemplateRegionProperty->collapsable, 'isCollapsed' => $objTemplateRegionProperty->isCollapsed);
                 }
             }
         }
         /**
          * go through the fields and regions to prepare the generic structure
          */
         foreach ($objFieldsAndRegionsData as $objFieldRegionTagData) {
             if (!array_key_exists($objFieldRegionTagData->tabId, $this->arrTabs)) {
                 $objGenTab = new GenericElementTab();
                 $objGenTab->setTabId($objFieldRegionTagData->tabId);
                 $objGenTab->setTabTitle($objFieldRegionTagData->tabTitle);
                 $objGenTab->setTabOrder($objFieldRegionTagData->tabOrder);
                 $this->arrTabs[$objFieldRegionTagData->tabId] = $objGenTab;
             }
             if (!in_array($objFieldRegionTagData->regionId, $arrExcludedRegions)) {
                 if (!in_array($objFieldRegionTagData->id, $arrExcludedFields)) {
                     if (!array_key_exists($objFieldRegionTagData->regionId, $this->arrRegions)) {
                         $objGenRegion = new GenericElementRegion();
                         $objGenRegion->setRegionId($objFieldRegionTagData->regionId);
                         $objGenRegion->setRegionTitle($objFieldRegionTagData->regionTitle);
                         $objGenRegion->setRegionCols($objFieldRegionTagData->regionColumns);
                         if (array_key_exists($objFieldRegionTagData->regionId, $arrTemplateRegionProperties)) {
                             if (!is_null($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['order']) || $arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['order'] != '') {
                                 $objGenRegion->setRegionOrder($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['order']);
                             } else {
                                 $objGenRegion->setRegionOrder($objFieldRegionTagData->regionOrder);
                             }
                             if (!is_null($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['collapsable']) || $arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['collapsable'] != '') {
                                 $objGenRegion->setRegionCollapsable($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['collapsable']);
                             } else {
                                 $objGenRegion->setRegionCollapsable($objFieldRegionTagData->collapsable);
                             }
                             if (!is_null($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['isCollapsed']) || $arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['isCollapsed'] != '') {
                                 $objGenRegion->setRegionIsCollapsed($arrTemplateRegionProperties[$objFieldRegionTagData->regionId]['isCollapsed']);
                             } else {
                                 $objGenRegion->setRegionIsCollapsed($objFieldRegionTagData->isCollapsed);
                             }
                         } else {
                             $objGenRegion->setRegionOrder($objFieldRegionTagData->regionOrder);
                             $objGenRegion->setRegionCollapsable($objFieldRegionTagData->collapsable);
                             $objGenRegion->setRegionIsCollapsed($objFieldRegionTagData->isCollapsed);
                         }
                         $objGenRegion->setRegionTypeId($objFieldRegionTagData->idRegionTypes);
                         $objGenRegion->setRegionPosition($objFieldRegionTagData->position);
                         $objGenRegion->setRegionIsMultiply($objFieldRegionTagData->isMultiply);
                         $objGenRegion->setRegionMultiplyRegion($objFieldRegionTagData->multiplyRegion);
                         $this->arrRegions[$objFieldRegionTagData->regionId] = $objGenRegion;
                         if ($objGenRegion->getRegionIsMultiply() == true) {
                             $this->arrMultiplyRegionIds[] = $objFieldRegionTagData->regionId;
                         }
                         $this->getTab($objFieldRegionTagData->tabId)->addRegion($objGenRegion);
                     }
                     $objGenField = new GenericElementField();
                     $objGenField->id = $objFieldRegionTagData->id;
                     $objGenField->title = $objFieldRegionTagData->title;
                     $objGenField->name = $objFieldRegionTagData->name;
                     $objGenField->typeId = $objFieldRegionTagData->idFieldTypes;
                     $objGenField->type = $objFieldRegionTagData->type;
                     $objGenField->defaultValue = $objFieldRegionTagData->defaultValue;
                     $objGenField->sqlSelect = $objFieldRegionTagData->sqlSelect;
                     $objGenField->columns = $objFieldRegionTagData->columns;
                     $objGenField->order = $objFieldRegionTagData->order;
                     $objGenField->isCoreField = $objFieldRegionTagData->isCoreField;
                     $objGenField->isKeyField = $objFieldRegionTagData->isKeyField;
                     $objGenField->isSaveField = $objFieldRegionTagData->isSaveField;
                     $objGenField->isRegionTitle = $objFieldRegionTagData->isRegionTitle;
                     $objGenField->isDependentOn = $objFieldRegionTagData->isDependentOn;
                     $objGenField->copyValue = $objFieldRegionTagData->copyValue;
                     $objGenField->decorator = $objFieldRegionTagData->decorator;
                     $objGenField->isMultiply = $objFieldRegionTagData->isMultiply;
                     $objGenField->idSearchFieldTypes = $objFieldRegionTagData->idSearchFieldTypes;
                     $objGenField->idFieldTypeGroup = $objFieldRegionTagData->idFieldTypeGroup;
                     $objGenField->isSqlKeyValuePair = $objFieldRegionTagData->isSqlKeyValuePair;
                     /**
                      * select field container
                      */
                     if ($objGenField->isSaveField == 1) {
                         if ($objGenField->isMultiply == 1) {
                             if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_SPECIALFIELD_ID) {
                                 $this->getRegion($objFieldRegionTagData->regionId)->addSpecialFieldName($objGenField->name);
                             } else {
                                 if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_FILE_ID) {
                                     $this->getRegion($objFieldRegionTagData->regionId)->addFileFieldName($objGenField->name);
                                 } else {
                                     if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_MULTIFIELD_ID) {
                                         $this->getRegion($objFieldRegionTagData->regionId)->addMultiFieldName($objGenField->name);
                                     } else {
                                         $this->getRegion($objFieldRegionTagData->regionId)->addInstanceFieldName($objGenField->name);
                                     }
                                 }
                             }
                         } else {
                             if ($objGenField->isCoreField == 1) {
                                 $this->arrCoreFields[$objGenField->name] = $objGenField;
                                 $this->arrFieldNames[$objGenField->name] = self::CORE_FIELD;
                             } else {
                                 if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_SPECIALFIELD_ID) {
                                     $this->arrSpecialFields[$objGenField->name] = $objGenField;
                                     $this->arrFieldNames[$objGenField->name] = self::SPECIAL_FIELD;
                                 } else {
                                     if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_FILE_ID) {
                                         $this->arrFileFields[$objGenField->name] = $objGenField;
                                         $this->arrFieldNames[$objGenField->name] = self::FILE_FIELD;
                                     } else {
                                         if ($objGenField->idFieldTypeGroup == GenericSetup::FIELD_TYPE_MULTIFIELD_ID) {
                                             $this->arrMultiFields[$objGenField->name] = $objGenField;
                                             $this->arrFieldNames[$objGenField->name] = self::MULTI_FIELD;
                                         } else {
                                             $this->arrInstanceFields[$objGenField->name] = $objGenField;
                                             $this->arrFieldNames[$objGenField->name] = self::INSTANCE_FIELD;
                                         }
                                     }
                                 }
                             }
                         }
                     }
                     $this->getRegion($objFieldRegionTagData->regionId)->addField($objGenField);
                 }
             }
         }
     } catch (Exception $exc) {
         $this->core->logger->err($exc);
     }
 }
 /**
  * insertMultiplyRegionInstanceData
  * @param GenericElementRegion $objRegion
  * @param integer $intRegionInstanceId
  * @param integer $intRegionPosition
  * @param string $strType,
  * @param string $strTypeId,
  * @param integer $intTypeVersion
  * @author Thomas Schedler <*****@*****.**>
  * @version 1.0
  */
 protected final function insertMultiplyRegionInstanceData(GenericElementRegion &$objRegion, $intRegionInstanceId, $intRegionPosition, $strType, $strTypeId, $intTypeVersion)
 {
     try {
         $arrInstanceData = array($strType . 'Id' => $strTypeId, 'version' => $intTypeVersion, 'idLanguages' => $this->setup->getLanguageId(), 'sortPosition' => $intRegionPosition);
         /**
          * for each instance field, add to instance data array
          */
         foreach ($objRegion->InstanceFieldNames() as $strFieldName) {
             if (is_array($objRegion->getField($strFieldName)->getInstanceValue($intRegionInstanceId))) {
                 $arrInstanceData[$strFieldName] = json_encode($objRegion->getField($strFieldName)->getInstanceValue($intRegionInstanceId));
             } else {
                 $arrInstanceData[$strFieldName] = $objRegion->getField($strFieldName)->getInstanceValue($intRegionInstanceId);
             }
         }
         $idRegionInstance = $this->getModelGenericData()->getGenericTable($strType . '-' . $this->setup->getFormId() . '-' . $this->setup->getFormVersion() . '-Region' . $objRegion->getRegionId() . '-Instances')->insert($arrInstanceData);
         if (count($objRegion->FileFieldNames()) > 0) {
             /**
              * insert into the file instances table
              */
             foreach ($objRegion->FileFieldNames() as $strFieldName) {
                 $objField = $objRegion->getField($strFieldName);
                 $intFieldId = $objField->id;
                 $strTmpFileIds = trim($objField->getInstanceValue($intRegionInstanceId), '[]');
                 $strDisplayOption = $objField->getInstanceProperty($intRegionInstanceId, 'display_option');
                 $arrFileIds = array();
                 $arrFileIds = explode('][', $strTmpFileIds);
                 if (count($arrFileIds) > 0) {
                     foreach ($arrFileIds as $intFileId) {
                         if ($intFileId != '') {
                             $arrFileData = array($strType . 'Id' => $strTypeId, 'version' => $intTypeVersion, 'idLanguages' => $this->setup->getLanguageId(), 'idRegionInstances' => $idRegionInstance, 'idFiles' => $intFileId, 'displayOption' => $strDisplayOption, 'idFields' => $intFieldId);
                             $this->getModelGenericData()->getGenericTable($strType . '-' . $this->setup->getFormId() . '-' . $this->setup->getFormVersion() . '-Region' . $objRegion->getRegionId() . '-InstanceFiles')->insert($arrFileData);
                         }
                     }
                 }
             }
         }
         if (count($objRegion->FileFilterFieldNames()) > 0) {
             /**
              * insert into the file filter instances table
              */
             foreach ($objRegion->FileFilterFieldNames() as $strFieldName) {
                 $objField = $objRegion->getField($strFieldName);
                 $intFieldId = $objField->id;
                 $objFilters = $objField->getInstanceValue($intRegionInstanceId);
                 if (isset($objFilters->filters)) {
                     foreach ($objFilters->filters as $objFilter) {
                         if (!is_array($objFilter->referenceIds)) {
                             $objFilter->referenceIds = array($objFilter->referenceIds);
                         }
                         foreach ($objFilter->referenceIds as $intReferenceId) {
                             if (is_numeric($intReferenceId)) {
                                 $arrFileFilterData = array($strType . 'Id' => $strTypeId, 'version' => $intTypeVersion, 'idLanguages' => $this->setup->getLanguageId(), 'idRegionInstances' => $idRegionInstance, 'idFilterTypes' => $objFilter->typeId, 'referenceId' => $intReferenceId, 'idFields' => $intFieldId);
                                 $this->getModelGenericData()->getGenericTable($strType . '-' . $this->setup->getFormId() . '-' . $this->setup->getFormVersion() . '-Region' . $objRegion->getRegionId() . '-InstanceFileFilters')->insert($arrFileFilterData);
                             }
                         }
                     }
                 }
             }
         }
         if (count($objRegion->MultiFieldNames()) > 0) {
             /**
              * insert into the multi fields instances table
              */
             foreach ($objRegion->MultiFieldNames() as $strFieldName) {
                 $objField = $objRegion->getField($strFieldName);
                 $intFieldId = $objField->id;
                 if (is_array($objField->getInstanceValue($intRegionInstanceId)) && count($objField->getInstanceValue($intRegionInstanceId)) > 0) {
                     foreach ($objField->getInstanceValue($intRegionInstanceId) as $intRelationId) {
                         if ($intRelationId != '') {
                             $arrFileData = array($strType . 'Id' => $strTypeId, 'version' => $intTypeVersion, 'idLanguages' => $this->setup->getLanguageId(), 'idRegionInstances' => $idRegionInstance, 'idRelation' => $intRelationId, 'idFields' => $intFieldId);
                             $this->getModelGenericData()->getGenericTable($strType . '-' . $this->setup->getFormId() . '-' . $this->setup->getFormVersion() . '-Region' . $objRegion->getRegionId() . '-InstanceMultiFields')->insert($arrFileData);
                         }
                     }
                 }
             }
         }
     } catch (Exception $exc) {
         $this->core->logger->err($exc);
     }
 }
 /**
  * addRegion
  * @param GenericElementRegion $objRegion
  * @author Thomas Schedler <*****@*****.**>
  * @version 1.0
  */
 public function addRegion(GenericElementRegion &$objRegion)
 {
     $this->arrRegions[$objRegion->getRegionId()] = $objRegion;
 }