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$sListType>\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 (!$webyep_bUseJavaScriptMenus) $sHTML .= "$sText";
else $sHTML .= "sTarget ."'); return false;\">$sText";
$bFirstItem = false;
}
$bDidOpenList = false;
if ($bIsTitle) $iLastTitleID = $iItemID;
// $iItemID++;
}
while ($iListsToClose) {
$sHTML .= "$sListType>\n";
$iListsToClose--;
}
$sHTML .= "$sListType>\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 .= "";
$bFirstTitle = false;
}
else {
$this->oURL->dQuery[WY_QK_DI] = $dEntry[WY_DK_ITEMID];
$sTarget = ($this->sTarget ? (" target='" . $this->sTarget . "'"):"");
if ($bUseTables) $sHTML .= "$sIndent$sBullet | $sText |
\n";
else $sHTML .= "\n";
}
}
if ($bUseTables) $sHTML .= "
";
}
return $sHTML;
}
}
?>