sDisplay(); // this should be removed an future versions if ($sDeprecatedA) { $s = str_replace(WEBYEP_MENU_CSS_SELECTED, $sDeprecatedA, $s); } if ($goApp->bEditMode) { echo $o->sEditButtonHTML("edit-button-menu.gif", "", $goApp->bIsiPhone ? $o->oIPhoneEditURL():od_nil); if (!$s) $s = $o->sName; else echo "
"; } echo $s; } class WYMenuElement extends WYElement { // instance variables var $oURL; var $sTarget; var $oBulletImg; function WYMenuElement($sN, $bG, $oURL, $sT, $oB) // don't pass object by ref here: can be od_nil! { global $webyep_bUseTablesForMenus; parent::WYElement($sN, $bG); $this->sEditorPageName = "menu.php"; $this->iEditorWidth = 470; $this->iEditorHeight = 490; $this->sEditButtonCSSClass = "WebYepMenuEditButton"; $this->setVersion(WY_MENU_VERSION); if (!isset($this->dContent[WY_DK_ITEMSARRAY])) $this->dContent[WY_DK_ITEMSARRAY] = array(); if (!isset($this->dContent[WY_DK_MAXID])) $this->dContent[WY_DK_MAXID] = 0; $this->oURL =& $oURL; $this->sTarget = $sT; $this->oBulletImg =& $oB; if ($this->oBulletImg) $this->oBulletImg->setAttribute("align", "absmiddle"); $this->bUseTables = $webyep_bUseTablesForMenus; } function oIPhoneEditURL() { return new WYURL("javascript:alert(\"" . WYTS('NoMenuEditorOnIPhone') . "\")"); } function bUseDocumentInstance() { return false; } function sFieldNameForFile() { $s = parent::sFieldNameForFile(); $s = "mu-" . $s; return $s; } function sEditButtonHTML($sButtonImage = "edit-button.gif", $sToolTip = "", $oCustomURL = false) { $this->dEditorQuery = array(); $this->dEditorQuery[WY_QK_MENU_URL] = $this->oURL ? $this->oURL->sURL(false, false, false):""; return parent::sEditButtonHTML($sButtonImage, $sToolTip, $oCustomURL); } function removeDataForDocIDAndDocInstance($iTargetDocID, $iID) { $aDataFileNames = WYElement::aDataFileNames(); $sRegEx = sprintf("|^%d-%d|", $iTargetDocID, $iID); foreach ($aDataFileNames as $sDataFileName) { if (preg_match($sRegEx, $sDataFileName)) { WYElement::removeDataFileWithName($sDataFileName); } } } function removeDataForItem($iID, $sText) { global $goApp; $sURL = ""; if (!$this->bTitleHasURL($sText, $sURL) || $sURL == "") $sURL = $this->oURL->sURL(false, false, false); if (strcasecmp(substr($sURL, 0, 4), "http") == 0 || strcasecmp(substr($sURL, 0, 3), "ftp") == 0) return; if (false !== $iQueryPos = strpos($sURL, "?")) $sURL = substr($sURL, 0, $iQueryPos); if (false !== $iAnchorPos = strpos($sURL, "#")) $sURL = substr($sURL, 0, $iAnchorPos); if ($sURL[0] != "/") { // not an absolute path $oDocPath = $goApp->oDocument->oPathForDocumentWithID($goApp->oDocument->iPageID); $oDocPath->removeLastComponent(); $oDocPath->addComponent($sURL); $oDocPath->normalize(); $sFullPath = $oDocPath->sPath; } else $sFullPath = $sURL; $iTargetDocID = $goApp->oDocument->iPageIDForDocumentPath(new WYPath($sFullPath), $iMaxID); if ($iTargetDocID) $this->removeDataForDocIDAndDocInstance($iTargetDocID, $iID); } function setItems($dNewItems) // format of new items and current items differs // current items: array, values are dicts with two elements: item ID and text // new items: dict, key is item ID, value is text { $sKey = ""; $sValue = ""; $dOneItem = array(); $iMaxID = 0; // find out diffs - find deleted items $dOldItems = $this->dContent[WY_DK_ITEMSARRAY]; foreach ($dOldItems as $dEntry) { $iID = $dEntry[WY_DK_ITEMID]; if (!isset($dNewItems[$iID])) { // items was deleted $this->removeDataForItem($iID, $dEntry[WY_DK_ITEMTEXT]); } } $this->dContent[WY_DK_ITEMSARRAY] = array(); foreach ($dNewItems as $sKey => $sValue) { // replace leading spaces or underscores by undescores // spaces would get lost on next save due to JavaScript's handling if (preg_match("|^([ _]+)|", $sValue, $aRes)) { $sValue = str_repeat("_", strlen($aRes[1])) . ltrim($sValue, " _"); } $dOneItem[WY_DK_ITEMID] = $sKey; $iMaxID = max((int)$sKey, $iMaxID); $dOneItem[WY_DK_ITEMTEXT] = $sValue; $this->dContent[WY_DK_ITEMSARRAY][] =$dOneItem; } $this->dContent[WY_DK_MAXID] = $iMaxID; } function dItems() { $d = array(); $dOneItem = array(); foreach ($this->dContent[WY_DK_ITEMSARRAY] as $dOneItem) { $d[$dOneItem[WY_DK_ITEMID]] = $dOneItem[WY_DK_ITEMTEXT]; } return $d; } function iLastItemID() { return $this->dContent[WY_DK_MAXID]; } function outputJS() { global $webyep_bAutoCloseMenus, $webyep_bRememberOpenMenus; ?> sDisplayAsList():$this->sDisplayAsTableOrDivs(); $webyep_iMenuID++; return $sHTML; } function _bIsCurrentEntry($iDI, $sExplicitURL = "") { global $goApp; $bIsCurrent = false; if ($sExplicitURL) { $oCurrentURL = WYURL::oCurrentURL(); $sCurrentURL = $oCurrentURL->sURL(true, true, true); $bIsTargetPage = strpos($sCurrentURL, $sExplicitURL) !== false; $bIsCurrent = $bIsTargetPage && $iDI == $goApp->oDocument->iDocumentInstance(); } else { $oFullTargetURL = od_clone($this->oURL); $oFullTargetURL->makeSiteRelative(); $oFullTargetURL->dQuery = array(); $oCurrentURL = WYURL::oCurrentURL(); $oCurrentURL->dQuery = array(); $bIsTargetPage = $oFullTargetURL->sURL() == $oCurrentURL->sURL(); $bIsCurrent = $bIsTargetPage && $iDI == $goApp->oDocument->iDocumentInstance(); } return $bIsCurrent; } function bTitleHasURL(&$sText, &$sURL) { if (substr($sText, 0, 1) == "#") $sText = substr($sText, 1); if (($iHashPos = strpos($sText, "#")) !== false) { $sURL = substr($sText, $iHashPos + 1); $sText = substr($sText, 0, $iHashPos); $bHasURL = true; } else { $bHasURL = false; $sExplicitURL = ""; } return $bHasURL; } function sDisplayAsList() { global $goApp, $webyep_iMenuID, $webyep_bUseJavaScriptMenus, $webyep_bMenuJSInserted, $webyep_bAutoCloseMenus; $sHTML = ""; $aEntries = $this->dContent[WY_DK_ITEMSARRAY]; $sListType = "ul"; $bFirstTitle = true; $sCookieName = WY_CK_MENU_OPENTREES . "_" . $webyep_iMenuID; if (isset($_COOKIE[$sCookieName])) $aOpenTrees = explode("|", $_COOKIE[$sCookieName]); else $aOpenTrees = array(); if (count($aEntries)) { if (!$webyep_bMenuJSInserted && $webyep_bUseJavaScriptMenus) { $this->outputJS(); $webyep_bMenuJSInserted = true; } $iCurrentIndentionLevel = 0; $sHTML .= "\n<$sListType>\n"; $bDidOpenList = true; $iLastTitleID = 0; // $iItemID = 0; $aTitleTree = array(); if ($webyep_bUseJavaScriptMenus) { $a = array(); foreach ($aEntries as $dEntry) { $sText = $dEntry[WY_DK_ITEMTEXT]; $iItemID = (int)$dEntry['ID']; if (substr($sText, 0, 1) == "#") { $sText = substr($sText, 1); $bIsTitle = true; } else $bIsTitle = false; $sExplicitURL = ""; $this->bTitleHasURL($sText, $sExplicitURL); $bIsCurrentEntry = $this->_bIsCurrentEntry($iItemID, $sExplicitURL); $iIndentionLevel = 0; while ($sText[$iIndentionLevel] == " " || $sText[$iIndentionLevel] == "_") $iIndentionLevel++; if ($bIsTitle) $a[$iIndentionLevel++] = $iItemID; if ($bIsCurrentEntry) { while (isset($a[$iIndentionLevel])) $a[$iIndentionLevel++] = 0; $aTitleTree = $a; break; } } } $bFirstItem = true; $aCloseTrees = array(); $iListsToClose = 0; foreach ($aEntries as $dEntry) { $sText = $dEntry[WY_DK_ITEMTEXT]; $iItemID = (int)$dEntry['ID']; $sLinkTitle = $sText; if (substr($sText, 0, 1) == "%") continue; if (substr($sText, 0, 1) == "#") { $sText = substr($sText, 1); $bIsTitle = true; } else $bIsTitle = false; $sExplicitURL = ""; $bUseTitleAsItem = false; if ($this->bTitleHasURL($sText, $sExplicitURL)) $bUseTitleAsItem = true; $bIsCurrentEntry = $this->_bIsCurrentEntry($iItemID, $sExplicitURL); // check for indention $iNewIndentionLevel = 0; if ($sText[0] == " " || $sText[0] == "_") { while ($sText[$iNewIndentionLevel] == " " || $sText[$iNewIndentionLevel] == "_") $iNewIndentionLevel++; $sText = substr($sText, $iNewIndentionLevel); } $sLinkTitle = str_replace("\\", " ", $sLinkTitle); $sLinkTitle = webyep_sHTMLEntities($sLinkTitle); $sText = webyep_sHTMLEntities($sText); $sText = str_replace("\\", "
", $sText); while ($iNewIndentionLevel < $iCurrentIndentionLevel) { $sHTML .= "\n\n"; $iListsToClose--; $iCurrentIndentionLevel--; } $bIsExpanded = false; while ($iNewIndentionLevel > $iCurrentIndentionLevel) { $sElementID = "WYMUTREE_${webyep_iMenuID}_$iLastTitleID"; if (!in_array($iLastTitleID, $aTitleTree) && !in_array($sElementID, $aOpenTrees)) $aCloseTrees[] = $iLastTitleID; $sHTML .= "<$sListType class='WYMUTREE_$webyep_iMenuID' id='$sElementID'>\n"; $iListsToClose++; $bFirstItem = true; $bDidOpenList = true; $iCurrentIndentionLevel++; } if (!$bDidOpenList) $sHTML .= "\n"; if ($sExplicitURL) { $oURL = new WYURL($sExplicitURL); } else $oURL = od_clone($this->oURL); $oURL->dQuery[WY_QK_DI] = $dEntry[WY_DK_ITEMID]; $sURL = $oURL->sEURL(true, true, $sExplicitURL != ""); if ($bIsTitle) { $sElementID = "WYMUTREE_${webyep_iMenuID}_$iItemID"; if (!$webyep_bUseJavaScriptMenus || in_array($iItemID, $aTitleTree) || in_array($sElementID, $aOpenTrees)) $bIsExpanded = true; $sClass = WEBYEP_MENU_CSS_TITLE; if ($bFirstItem) $sClass .= " " . WEBYEP_MENU_CSS_FIRST_ITEM; $sClass .= " " . WEBYEP_MENU_CSS_EXPANDED; // we will close unexpanded trees later via JS if ($bIsCurrentEntry) $sClass .= " " . WEBYEP_MENU_CSS_CURRENT_ITEM; $sHTML .= "
  • "; if ($bUseTitleAsItem) { if (!$bIsExpanded || !$webyep_bAutoCloseMenus) { $sTitleJS = "if (webyep_showHideMenuTree($webyep_iMenuID, $iItemID)) { webyep_menuItemClick($webyep_iMenuID, \"$sURL\", \"" . $this->sTarget ."\") } return false;"; } else { $sTitleJS = "webyep_menuItemClick($webyep_iMenuID, \"$sURL\", \"" . $this->sTarget ."\"); return false;"; } } else { $sTitleJS = "webyep_showHideMenuTree($webyep_iMenuID, $iItemID); return false;"; } if ($webyep_bUseJavaScriptMenus) $sHTML .= "$sText"; else $sHTML .= "$sText"; $bFirstTitle = false; } else { $sTargetAtt = $this->sTarget ? (" target='" . $this->sTarget . "'"):""; $sClass = WEBYEP_MENU_CSS_ITEM; if ($bIsCurrentEntry) $sClass .= " " . WEBYEP_MENU_CSS_CURRENT_ITEM; if ($bFirstItem) $sClass .= " " . WEBYEP_MENU_CSS_FIRST_ITEM; $sHTML .= "
  • "; if (!$webyep_bUseJavaScriptMenus) $sHTML .= "$sText"; else $sHTML .= "sTarget ."'); return false;\">$sText"; $bFirstItem = false; } $bDidOpenList = false; if ($bIsTitle) $iLastTitleID = $iItemID; // $iItemID++; } while ($iListsToClose) { $sHTML .= "
  • \n"; $iListsToClose--; } $sHTML .= "\n"; if ($webyep_bUseJavaScriptMenus) { $sHTML .= ""; } } return $sHTML; } function sDisplayAsTableOrDivs() { global $goApp; $aEntries = $this->dContent[WY_DK_ITEMSARRAY]; $dEntry = array(); $sIndent = ""; $sBullet = ""; $oBulletIndentImg = od_nil; $sBulletIndent = ""; $sText = ""; $sLinkTitle = ""; $sClass = ""; $aRes = array(); $i = 0; $bIsTitle = false; $sTarget = ""; $sHTML = ""; $bFirstTitle = true; $sLineBreak = ""; $bIsTargetPage = false; $bUseTables = $this->bUseTables; if (count($aEntries)) { if ($bUseTables) $sHTML .= "\n"; foreach ($aEntries as $dEntry) { $sText = $dEntry[WY_DK_ITEMTEXT]; $sLinkTitle = $sText; // check for submenu title marker "#" $bIsTitle = false; if (substr($sText, 0, 1) == "#") { $sText = substr($sText, 1); $bIsTitle = true; } $sIndent = ""; $sBullet = ""; if (preg_match("|^([_ ]+)|", $sText, $aRes)) { // transform leading " " and "_" to "$nbsp;" $i = strlen($aRes[1]); $sText = substr($sText, $i); // remove leading " " and "_" while ($i) { $sIndent .= WEBYEP_MENU_INDENT; $i--; } } // check for submenu title marker "#" again if (!$bIsTitle && substr($sText, 0, 1) == "#") { $sText = substr($sText, 1); $bIsTitle = true; } $sText = webyep_sHTMLEntities($sText); if ($this->oBulletImg) $sBullet .= $this->oBulletImg->sDisplay() . " "; if ($bUseTables) $sText = str_replace("\\", "
    ", $sText); else { if ($this->oBulletImg) { $oBulletIndentImg = $goApp->oSpacerImg($this->oBulletImg->iWidth(), 1); $sBulletIndent = $oBulletIndentImg->sDisplay() . " "; } $sLineBreak = "
    $sBulletIndent$sIndent"; $sText = str_replace("\\", $sLineBreak, $sText); } $sLinkTitle = str_replace("\\", " ", $sLinkTitle); $sLinkTitle = eregi_replace('^[ _]+', "", $sLinkTitle); $sLinkTitle = webyep_sHTMLEntities($sLinkTitle); if ($this->_bIsCurrentEntry($dEntry['ID'])) { $sClass = WEBYEP_MENU_CSS_SELECTED; } else { $sClass = WEBYEP_MENU_CSS_ITEM; } if ($bIsTitle) { if (!$bFirstTitle) $sHTML .= "
    "; $sHTML .= "
    $sIndent$sBullet$sText
    \n"; if (!$bFirstTitle) $sHTML .= "
    "; $bFirstTitle = false; } else { $this->oURL->dQuery[WY_QK_DI] = $dEntry[WY_DK_ITEMID]; $sTarget = ($this->sTarget ? (" target='" . $this->sTarget . "'"):""); if ($bUseTables) $sHTML .= "\n"; else $sHTML .= "
    $sIndent$sBullet$sText
    \n"; } } if ($bUseTables) $sHTML .= "
    $sIndent$sBullet$sText
    "; } return $sHTML; } } ?>