/**
  * This method is used to retrieve all parent elements (an parent elements needs to
  * have the flag 'tx_languagevisibility_inheritanceflag_original' or
  * needs to be orverlayed with a record, that has the field 'tx_languagevisibility_inheritanceflag_overlayed'
  * configured or is the first element of the rootline
  *
  * @param tx_languagevisibility_element $element
  * @return array $elements (collection of tx_languagevisibility_element)
  */
 public function getParentElementsFromElement(tx_languagevisibility_element $element, $language)
 {
     $elements = array();
     if ($element instanceof tx_languagevisibility_pageelement) {
         /* @var $sys_page t3lib_pageSelect */
         $rootline = $this->getOverlayedRootLine($element->getUid(), $language->getUid());
         if (is_array($rootline)) {
             foreach ($rootline as $rootlineElement) {
                 if ($rootlineElement['tx_languagevisibility_inheritanceflag_original'] == 1 || $rootlineElement['tx_languagevisibility_inheritanceflag_overlayed'] == 1) {
                     $elements[] = self::getElementForTable('pages', $rootlineElement['uid']);
                 }
             }
             if (sizeof($elements) == 0) {
                 $root = end($rootline);
                 $elements[] = self::getElementForTable('pages', $root['uid']);
             }
         }
     } else {
         $parentPage = $this->getElementForTable('pages', $element->getUid());
         $elements = $this->getParentElementsFromElement($parentPage, $language);
     }
     return $elements;
 }
 /**
  * Create a visiblity object for an element for a given language.
  * @param tx_languagevisibility_language $language
  * @param tx_languagevisibility_element $element
  * @param boolean $omitLocal
  * @return tx_languagevisibility_visibility
  */
 protected function getVisibility(tx_languagevisibility_language $language, tx_languagevisibility_element $element, $omitLocal = false)
 {
     $visibility = new tx_languagevisibility_visibility();
     $local = $element->getLocalVisibilitySetting($language->getUid());
     if (!$omitLocal && ($local != '' && $local != '-')) {
         $visibility->setVisibilityString($local)->setVisibilityDescription('local setting ' . $local);
         return $visibility;
     } else {
         if ($element->isLanguageSetToAll()) {
             $visibility->setVisibilityString('yes')->setVisibilityDescription('language configured to all');
             return $visibility;
         }
         if ($element->isMonolithicTranslated()) {
             if ($element->languageEquals($language)) {
                 $visibility->setVisibilityString('yes')->setVisibilityDescription('');
             } else {
                 $visibility->setVisibilityString('no')->setVisibilityDescription('');
             }
             return $visibility;
         }
         if ($element->getFieldToUseForDefaultVisibility() == 'page') {
             if ($this->getUseInheritance()) {
                 // gibt es in der rootline das visibiklitysetting no+ für die sprache dann return 'no'
                 $inheritedVisibility = $this->getInheritedVisibility($language, $element);
                 switch ($inheritedVisibility->getVisibilityString()) {
                     case 'no+':
                         //if no+ is found it means the current element should be threated as if it has no set
                         $visibility->setVisibilityString('no')->setVisibilityDescription('force to no (' . $inheritedVisibility->getVisibilityDescription() . ')');
                         break;
                     case 'yes+':
                         $visibility->setVisibilityString('yes')->setVisibilityDescription('force to yes (' . $inheritedVisibility->getVisibilityDescription() . ')');
                         break;
                     default:
                         $setting = $language->getDefaultVisibilityForPage($element);
                         $visibility->setVisibilityString($setting)->setVisibilityDescription('default visibility  for page (' . $setting . ')');
                         break;
                 }
             } else {
                 //inheritance is disabled
                 $setting = $language->getDefaultVisibilityForPage($element);
                 $visibility->setVisibilityString($setting)->setVisibilityDescription('default visibility  for page (' . $setting . ')');
             }
         } elseif ($element->getFieldToUseForDefaultVisibility() == 'tt_news') {
             $setting = $language->getDefaultVisibilityForTTNewsElement($element);
             $visibility->setVisibilityString($setting)->setVisibilityDescription('default visibility  for news (' . $setting . ')');
         } else {
             $setting = $language->getDefaultVisibilityForElement($element);
             $visibility->setVisibilityString($setting)->setVisibilityDescription('default visibility  for element (' . $setting . ')');
         }
         if ($visibility->getVisibilityString() == '') {
             $visibility->setVisibilityString('t')->setVisibilityDescription('no visibility configured using default setting "t"');
         }
         return $visibility;
     }
 }