diff --git a/docs/README.documentation.txt b/docs/README.documentation.txt index 8b3b3be9..c1043cf3 100644 --- a/docs/README.documentation.txt +++ b/docs/README.documentation.txt @@ -1,7 +1,7 @@ The library documentation is generated using external tools which currently create: -* A HTML Website http://www.libsecondlife.org/docs/trunk -* A compiled HTML Help file http://www.libsecondlife.org/docs/trunk/OpenMetaverse.chm +* A HTML Website http://lib.openmetaverse.org/docs/trunk/ +* A compiled HTML Help file http://lib.openmetaverse.org/docs/trunk/OpenMetaverse.chm These are generated by our automated build system nightly using the inline XML code documentation. @@ -21,4 +21,6 @@ If you want to generate these documents locally you will need to do the followin Additionally if you have 7-Zip installed in the path, a zip archive will be created in the documentation tree -containing all the documentation in a compressed format see: http://www.7-zip.org/ \ No newline at end of file +containing all the documentation in a compressed format see: http://www.7-zip.org/ + +To serve the documentation from a PHP enabled server copy contents of sandcastle_php folder into the directory generated by Sandcastle. \ No newline at end of file diff --git a/docs/sandcastle_php/FillNode.php b/docs/sandcastle_php/FillNode.php new file mode 100644 index 00000000..0cb69509 --- /dev/null +++ b/docs/sandcastle_php/FillNode.php @@ -0,0 +1,81 @@ +, All rights reserved +// Copyright (c) 2011, Latif Khalifa +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// Based on C# version by Eric Woodruff (Eric@EWoodruff.us) from code by Ferdinand Prantl +// Copyright 2008, Eric Woodruff, All rights reserved + +$ret = ""; +$toc = DOMDocument::load("WebTOC.xml"); +$navToc = new DOMXpath($toc); +$root = $navToc->query("//HelpTOCNode[@Id='" . $_GET["Id"] . "']/*" ); + +if ($root->length == 0) { + print "TOC node not found!"; + die(); +} + +foreach ($root as $node) { + + if ($node->hasChildNodes()) { + $id = $node->getAttribute("Id"); + $title = $node->getAttribute("Title"); + $url = $node->getAttribute("Url"); + + if (!$url) { + $target = " target=\"TopicContent\""; + } else { + $url = "#"; + $target = ""; + } + + $ret .= sprintf("
\r\n" . + "%s\r\n" . + "
\r\n
\r\n", + $url, $target, htmlentities($title), $id); + } else { + + $title = $node->getAttribute("Title"); + $url = $node->getAttribute("Url"); + + if (!$url) + $url = "about:blank"; + + $ret .= sprintf("
\r\n" . + "" . + "%s\r\n" . + "
\r\n", + $url, htmlentities($title)); + + } + +} + +print $ret; \ No newline at end of file diff --git a/docs/sandcastle_php/LoadIndexKeywords.php b/docs/sandcastle_php/LoadIndexKeywords.php new file mode 100644 index 00000000..7a73505a --- /dev/null +++ b/docs/sandcastle_php/LoadIndexKeywords.php @@ -0,0 +1,98 @@ +, All rights reserved +// Copyright (c) 2011, Latif Khalifa +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// Based on C# version by Eric Woodruff (Eric@EWoodruff.us) from code by Ferdinand Prantl +// Copyright 2008, Eric Woodruff, All rights reserved + +$ret = ""; + +$ki = DOMDocument::load("WebKI.xml"); +$xpath = new DOMXpath($ki); +$root = $xpath->query("*" ); + +$startIndex = 0; + +if (isset($_GET["StartIndex"])) { + $startIndex = (int)$_GET["StartIndex"]; +} + +$endIndex = $startIndex + 128; + +if ($endIndex > $root->length) + $endIndex = $root->length; + +if ($startIndex > 0) { + $prev = $startIndex - 128; + if ($prev < 0) $prev = 0; + $ret .= "
\r\n" . + " << Previous page\r\n
\r\n"; +} + + +$title = ""; + +while($startIndex < $endIndex) { + $node = $root->item($startIndex); + $url = $node->getAttribute("Url"); + + if (!$url) { + $url = "#"; + $target = ""; + } else { + $target = " target=\"TopicContent\""; + } + + $ret .= sprintf("
\r\n" . + " %s\r\n", $url, $target, + htmlentities($node->getAttribute("Title"))); + + if ($node->hasChildNodes()) { + foreach($node->childNodes as $subNode) { + $ret .= sprintf("
\r\n" . + "%s\r\n
\r\n", + $subNode->getAttribute("Url"), + htmlentities($subNode->getAttribute("Title"))); + } + } + + $ret .= "
\r\n"; + + $startIndex++; +} + +if ($startIndex < $root->length) { + $ret .= "
\r\n" . + " Next page >>\r\n
\r\n"; +} + +print $ret; diff --git a/docs/sandcastle_php/SearchHelp.php b/docs/sandcastle_php/SearchHelp.php new file mode 100644 index 00000000..aa670073 --- /dev/null +++ b/docs/sandcastle_php/SearchHelp.php @@ -0,0 +1,95 @@ +, All rights reserved +// Copyright (c) 2011, Latif Khalifa +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// Based on C# version by Eric Woodruff (Eric@EWoodruff.us) from code by Ferdinand Prantl +// Copyright 2008, Eric Woodruff, All rights reserved + + +$searchText = $_GET["Keywords"]; + + +if (!$searchText) { + print "Nothing found"; + die(); +} + +$sortByTitle = $_GET["SortByTitle"] == "true"; + +$keywords = preg_split("/\\W+/", $searchText); +$keywordList = array(); + +for ($i=0; $i 1 && !isset($keywordList[$checkWord])) { + $keywordList[$checkWord] = 1; + } +} + +$keywordList = array_keys($keywordList); + +if (!count($keywordList)) { + print "No search keywords (min length 2)"; + die(); +} + +$ki = DOMDocument::load("WebKI.xml"); +$xpath = new DOMXpath($ki); +$root = $xpath->query("*" ); + +$max = 100; +$hits = 0; + +$ret = ""; + +foreach($root as $node) { + + $title = $node->getAttribute("Title"); + $url = $node->getAttribute("Url"); + + $found = true; + + foreach($keywordList as $word) { + if (false === stristr($title, $word)) { + $found = false; + break; + } + } + + if ($found) { + $hits++; + + $ret .= sprintf("
\r\n" . + "" . + "%s\r\n
\r\n", $url, $title); + + } + + if ($hits > $max) break; +} + +$ret .= sprintf("%s", implode(" ", $keywordList)); + +print $ret; \ No newline at end of file diff --git a/docs/sandcastle_php/TOC_php.js b/docs/sandcastle_php/TOC_php.js new file mode 100644 index 00000000..cc6cdeb5 --- /dev/null +++ b/docs/sandcastle_php/TOC_php.js @@ -0,0 +1,746 @@ +//============================================================================= +// System : Sandcastle Help File Builder +// File : TOC.js +// Author : Eric Woodruff (Eric@EWoodruff.us) +// Updated : 09/28/2009 +// Note : Copyright 2006-2009, Eric Woodruff, All rights reserved +// Compiler: JavaScript +// +// This file contains the methods necessary to implement a simple tree view +// for the table of content with a resizable splitter and Ajax support to +// load tree nodes on demand. It also contains the script necessary to do +// full-text searches. +// +// This code is published under the Microsoft Public License (Ms-PL). A copy +// of the license should be distributed with the code. It can also be found +// at the project website: http://SHFB.CodePlex.com. This notice, the +// author's name, and all copyright notices must remain intact in all +// applications, documentation, and source files. +// +// Version Date Who Comments +// ============================================================================ +// 1.3.0.0 09/12/2006 EFW Created the code +// 1.4.0.2 06/15/2007 EFW Reworked to get rid of frame set and to add +// support for Ajax to load tree nodes on demand. +// 1.5.0.0 06/24/2007 EFW Added full-text search capabilities +// 1.6.0.7 04/01/2008 EFW Merged changes from Ferdinand Prantl to add a +// website keyword index. Added support for "topic" +// query string option. +//============================================================================= + +// IE flag +var isIE = (navigator.userAgent.indexOf("MSIE") >= 0); + +// Minimum width of the TOC div +var minWidth = 100; + +// Elements and sizing info +var divTOC, divSizer, topicContent, divNavOpts, divSearchOpts, divSearchResults, + divIndexOpts, divIndexResults, divTree, docBody, maxWidth, offset, + txtSearchText/* , chkSortByTitle*/; + +// Last node selected +var lastNode, lastSearchNode, lastIndexNode; + +// Last page with keyword index +var currentIndexPage = 0; + +//============================================================================ + +// Initialize the tree view and resize the content +function Initialize() +{ + docBody = document.getElementsByTagName("body")[0]; + divTOC = document.getElementById("TOCDiv"); + divSizer = document.getElementById("TOCSizer"); + topicContent = document.getElementById("TopicContent"); + divNavOpts = document.getElementById("divNavOpts"); + divSearchOpts = document.getElementById("divSearchOpts"); + divSearchResults = document.getElementById("divSearchResults"); + divIndexOpts = document.getElementById("divIndexOpts"); + divIndexResults = document.getElementById("divIndexResults"); + divTree = document.getElementById("divTree"); + txtSearchText = document.getElementById("txtSearchText"); + /* chkSortByTitle = document.getElementById("chkSortByTitle"); */ + + // The sizes are bit off in FireFox + if(!isIE) + divNavOpts.style.width = divSearchOpts.style.width = + divIndexOpts.style.width = 292; + + ResizeTree(); + SyncTOC(); + + // See if we have document in the hash part of the url + var hash = window.location.hash; + if (hash.length > 0) { + if (hash.charAt(0) == "#") { + hash = hash.substr(1); + } + topicContent.src = "html/" + hash; + } + + // Use an alternate default page if a topic is specified in + // the query string. + // var queryString = document.location.search; + + // if(queryString != "") + // { + // var idx, options = queryString.split(/[\?\=\&]/); + + // for(idx = 0; idx < options.length; idx++) + // if(options[idx] == "topic" && idx + 1 < options.length) + // { + // topicContent.src = options[idx + 1]; + // break; + // } + // } +} + +//============================================================================ +// Navigation and expand/collaps code + +// Synchronize the table of content with the selected page if possible +function SyncTOC() +{ + var idx, anchor, base, href, url, anchors, treeNode, saveNode; + + base = window.location.href; + base = base.substr(0, base.lastIndexOf("/") + 1); + + if(base.substr(0, 5) == "file:" && base.substr(0, 8) != "file:///") + base = base.replace("file://", "file:///"); + + url = GetCurrentUrl(); + if(url == "") + return false; + + if(url.substr(0, 5) == "file:" && url.substr(0, 8) != "file:///") + url = url.replace("file://", "file:///"); + + while(true) + { + anchors = divTree.getElementsByTagName("A"); + anchor = null; + + for(idx = 0; idx < anchors.length; idx++) + { + href = anchors[idx].href; + + if(href.substring(0, 7) != 'http://' && + href.substring(0, 8) != 'https://' && + href.substring(0, 7) != 'file://') + href = base + href; + + if(href == url) + { + anchor = anchors[idx]; + break; + } + } + + if(anchor == null) + { + // If it contains a "#", strip anything after that and try again + if(url.indexOf("#") != -1) + { + url = url.substr(0, url.indexOf("#")); + continue; + } + + return; + } + + break; + } + + // If found, select it and find the parent tree node + SelectNode(anchor); + saveNode = anchor; + lastNode = null; + + while(anchor != null) + { + if(anchor.className == "TreeNode") + { + treeNode = anchor; + break; + } + + anchor = anchor.parentNode; + } + + // Expand it and all of its parents + while(anchor != null) + { + Expand(anchor); + + anchor = anchor.parentNode; + + while(anchor != null) + { + if(anchor.className == "TreeNode") + break; + + anchor = anchor.parentNode; + } + } + + lastNode = saveNode; + + // Scroll the node into view + var windowTop = lastNode.offsetTop - divTree.offsetTop - divTree.scrollTop; + var windowBottom = divTree.clientHeight - windowTop - lastNode.offsetHeight; + + if(windowTop < 0) + divTree.scrollTop += windowTop - 30; + else + if(windowBottom < 0) + divTree.scrollTop -= windowBottom - 30; +} + +// Get the currently loaded URL from the IFRAME +function GetCurrentUrl() +{ + var base, url = ""; + + try + { + url = window.frames["TopicContent"].document.URL.replace(/\\/g, "/"); + } + catch(e) + { + // If this happens the user probably navigated to another frameset + // that didn't make itself the topmost frameset and we don't have + // control of the other frame anymore. In that case, just reload + // our index page. + base = window.location.href; + base = base.substr(0, base.lastIndexOf("/") + 1); + + if(base.substr(0, 5) == "file:" && base.substr(0, 8) != "file:///") + base = base.replace("file://", "file:///"); + + if(base.substr(0, 5) == "file:") + top.location.href = base + "Index.html"; + else + top.location.href = base + "index.php"; + } + + return url; +} + +// Expand or collapse all nodes +function ExpandOrCollapseAll(expandNodes) +{ + var divIdx, childIdx, img, divs = document.getElementsByTagName("DIV"); + var childNodes, child, div, link, img; + + for(divIdx = 0; divIdx < divs.length; divIdx++) + if(divs[divIdx].className == "Hidden" || + divs[divIdx].className == "Visible") + { + childNodes = divs[divIdx].parentNode.childNodes; + + for(childIdx = 0; childIdx < childNodes.length; childIdx++) + { + child = childNodes[childIdx]; + + if(child.className == "TreeNodeImg") + img = child; + + if(child.className == "Hidden" || child.className == "Visible") + { + div = child; + break; + } + } + + if(div.className == "Visible" && !expandNodes) + { + div.className = "Hidden"; + img.src = "Collapsed.gif"; + } + else + if(div.className == "Hidden" && expandNodes) + { + div.className = "Visible"; + img.src = "Expanded.gif"; + + if(div.innerHTML == "") + FillNode(div, true) + } + } +} + +// Toggle the state of the specified node +function Toggle(node) +{ + var i, childNodes, child, div, link; + + childNodes = node.parentNode.childNodes; + + for(i = 0; i < childNodes.length; i++) + { + child = childNodes[i]; + + if(child.className == "Hidden" || child.className == "Visible") + { + div = child; + break; + } + } + + if(div.className == "Visible") + { + div.className = "Hidden"; + node.src = "Collapsed.gif"; + } + else + { + div.className = "Visible"; + node.src = "Expanded.gif"; + + if(div.innerHTML == "") + FillNode(div, false) + } +} + +// Expand the selected node +function Expand(node) +{ + var i, childNodes, child, div, img; + + // If not valid, don't bother + if(GetCurrentUrl() == "") + return false; + + if(node.tagName == "A") + childNodes = node.parentNode.childNodes; + else + childNodes = node.childNodes; + + for(i = 0; i < childNodes.length; i++) + { + child = childNodes[i]; + + if(child.className == "TreeNodeImg") + img = child; + + if(child.className == "Hidden" || child.className == "Visible") + { + div = child; + break; + } + } + + if(lastNode != null) + lastNode.className = "UnselectedNode"; + + div.className = "Visible"; + img.src = "Expanded.gif"; + + if(node.tagName == "A") + { + node.className = "SelectedNode"; + lastNode = node; + } + + if(div.innerHTML == "") + FillNode(div, false) + + return true; +} + +// Set the style of the specified node to "selected" +function SelectNode(node) +{ + var n = node.toString(); + window.location.hash = n.substring(n.lastIndexOf('/')+1); + + // If not valid, don't bother + if(GetCurrentUrl() == "") + return false; + + if(lastNode != null) + lastNode.className = "UnselectedNode"; + + node.className = "SelectedNode"; + lastNode = node; + + return true; +} + +//============================================================================ +// Ajax-related code used to fill the tree nodes on demand + +function GetXmlHttpRequest() +{ + var xmlHttp = null; + + // If IE7, Mozilla, Safari, etc., use the native object. + // Otherwise, use the ActiveX control for IE5.x and IE6. + if(window.XMLHttpRequest) + xmlHttp = new XMLHttpRequest(); + else + if(window.ActiveXObject) + xmlHttp = new ActiveXObject("MSXML2.XMLHTTP.3.0"); + + return xmlHttp; +} + +// Perform an AJAX-style request for the contents of a node and put the +// contents into the empty div. +function FillNode(div, expandChildren) +{ + var xmlHttp = GetXmlHttpRequest(), now = new Date(); + + if(xmlHttp == null) + { + div.innerHTML = "XML HTTP request not supported!"; + return; + } + + div.innerHTML = "Loading..."; + + // Add a unique hash to ensure it doesn't use cached results + xmlHttp.open("GET", "FillNode.php?Id=" + div.id + "&hash=" + + now.getTime(), true); + + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + div.innerHTML = xmlHttp.responseText; + + if(expandChildren) + ExpandOrCollapseAll(true); + } + } + + xmlHttp.send(null) +} + +//============================================================================ +// Resizing code + +// Resize the tree div so that it fills the document body +function ResizeTree() +{ + var y, newHeight; + + if(self.innerHeight) // All but IE + y = self.innerHeight; + else // IE - Strict + if(document.documentElement && document.documentElement.clientHeight) + y = document.documentElement.clientHeight; + else // Everything else + if(document.body) + y = document.body.clientHeight; + + newHeight = y - parseInt(divNavOpts.style.height, 10) - 6; + + if(newHeight < 50) + newHeight = 50; + + divTree.style.height = newHeight; + + newHeight = y - parseInt(divSearchOpts.style.height, 10) - 6; + + if(newHeight < 100) + newHeight = 100; + + divSearchResults.style.height = newHeight; + + newHeight = y - parseInt(divIndexOpts.style.height, 10) - 6; + + if(newHeight < 25) + newHeight = 25; + + divIndexResults.style.height = newHeight; + + // Resize the content div + ResizeContent(); +} + +// Resize the content div +function ResizeContent() +{ + if(isIE) + maxWidth = docBody.clientWidth - 1; + else + maxWidth = docBody.clientWidth - 4; + + topicContent.style.width = maxWidth - (divSizer.offsetLeft + + divSizer.offsetWidth); + maxWidth -= minWidth; +} + +// This is called to prepare for dragging the sizer div +function OnMouseDown(event) +{ + var x; + + // Make sure the splitter is at the top of the z-index + divSizer.style.zIndex = 5000; + + // The content is in an IFRAME which steals mouse events so + // hide it while resizing. + topicContent.style.display = "none"; + + if(isIE) + x = window.event.clientX + document.documentElement.scrollLeft + + document.body.scrollLeft; + else + x = event.clientX + window.scrollX; + + // Save starting offset + offset = parseInt(divSizer.style.left, 10); + + if(isNaN(offset)) + offset = 0; + + offset -= x; + + if(isIE) + { + document.attachEvent("onmousemove", OnMouseMove); + document.attachEvent("onmouseup", OnMouseUp); + window.event.cancelBubble = true; + window.event.returnValue = false; + } + else + { + document.addEventListener("mousemove", OnMouseMove, true); + document.addEventListener("mouseup", OnMouseUp, true); + event.preventDefault(); + } +} + +// Resize the TOC and content divs as the sizer is dragged +function OnMouseMove(event) +{ + var x, pos; + + // Get cursor position with respect to the page + if(isIE) + x = window.event.clientX + document.documentElement.scrollLeft + + document.body.scrollLeft; + else + x = event.clientX + window.scrollX; + + left = offset + x; + + // Adjusts the width of the TOC divs + pos = (event.clientX > maxWidth) ? maxWidth : + (event.clientX < minWidth) ? minWidth : event.clientX; + + divTOC.style.width = divSearchResults.style.width = + divIndexResults.style.width = divTree.style.width = pos; + + if(!isIE) + pos -= 8; + + divNavOpts.style.width = divSearchOpts.style.width = + divIndexOpts.style.width = pos; + + // Resize the content div to fit in the remaining space + ResizeContent(); +} + +// Finish the drag operation when the mouse button is released +function OnMouseUp(event) +{ + if(isIE) + { + document.detachEvent("onmousemove", OnMouseMove); + document.detachEvent("onmouseup", OnMouseUp); + } + else + { + document.removeEventListener("mousemove", OnMouseMove, true); + document.removeEventListener("mouseup", OnMouseUp, true); + } + + // Show the content div again + topicContent.style.display = "inline"; +} + +//============================================================================ +// Search code + +function ShowHideSearch(show) +{ + if(show) + { + divNavOpts.style.display = divTree.style.display = "none"; + divSearchOpts.style.display = divSearchResults.style.display = ""; + } + else + { + divSearchOpts.style.display = divSearchResults.style.display = "none"; + divNavOpts.style.display = divTree.style.display = ""; + } +} + +// When enter is hit in the search text box, do the search +function OnSearchTextKeyPress(evt) +{ + if(evt.keyCode == 13) + { + PerformSearch(); + return false; + } + + return true; +} + +// Perform a keyword search +function PerformSearch() +{ + var xmlHttp = GetXmlHttpRequest(), now = new Date(); + + if(xmlHttp == null) + { + divSearchResults.innerHTML = "XML HTTP request not supported!"; + return; + } + + divSearchResults.innerHTML = "Searching..."; + + // Add a unique hash to ensure it doesn't use cached results + xmlHttp.open("GET", "SearchHelp.php?Keywords=" + txtSearchText.value + + /* "&SortByTitle=" + (chkSortByTitle.checked ? "true" : "false") +*/ + "&hash=" + now.getTime(), true); + + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + divSearchResults.innerHTML = xmlHttp.responseText; + + lastSearchNode = divSearchResults.childNodes[0].childNodes[1]; + + while(lastSearchNode != null && lastSearchNode.tagName != "A") + lastSearchNode = lastSearchNode.nextSibling; + + if(lastSearchNode != null) + { + SelectSearchNode(lastSearchNode); + topicContent.src = lastSearchNode.href; + } + } + } + + xmlHttp.send(null) +} + +// Set the style of the specified search result node to "selected" +function SelectSearchNode(node) +{ + var n = node.toString(); + window.location.hash = n.substring(n.lastIndexOf('/')+1); + + if(lastSearchNode != null) + lastSearchNode.className = "UnselectedNode"; + + node.className = "SelectedNode"; + lastSearchNode = node; + + return true; +} + +//============================================================================ +// KeyWordIndex code + +function ShowHideIndex(show) +{ + if(show) + { + PopulateIndex(currentIndexPage); + + divNavOpts.style.display = divTree.style.display = "none"; + divIndexOpts.style.display = divIndexResults.style.display = ""; + } + else + { + divIndexOpts.style.display = divIndexResults.style.display = "none"; + divNavOpts.style.display = divTree.style.display = ""; + } +} + +// Populate keyword index +function PopulateIndex(startIndex) +{ + var xmlHttp = GetXmlHttpRequest(), now = new Date(); + var firstNode; + + if(xmlHttp == null) + { + divIndexResults.innerHTML = "XML HTTP request not supported!"; + return; + } + + divIndexResults.innerHTML = "Loading " + + "keyword index..."; + + // Add a unique hash to ensure it doesn't use cached results + xmlHttp.open("GET", "LoadIndexKeywords.php?StartIndex=" + startIndex + + "&hash=" + now.getTime(), true); + + xmlHttp.onreadystatechange = function() + { + if(xmlHttp.readyState == 4) + { + divIndexResults.innerHTML = xmlHttp.responseText; + + if(startIndex > 0) + { + firstNode = divIndexResults.childNodes[1]; + + if(firstNode != null && !firstNode.innerHTML) + firstNode = divIndexResults.childNodes[2]; + } + else + firstNode = divIndexResults.childNodes[0]; + + if(firstNode != null) + lastIndexNode = firstNode.childNodes[0]; + + while(lastIndexNode != null && lastIndexNode.tagName != "A") + lastIndexNode = lastIndexNode.nextSibling; + + if(lastIndexNode != null) + { + SelectIndexNode(lastIndexNode); + topicContent.src = lastIndexNode.href; + } + + currentIndexPage = startIndex; + } + } + + xmlHttp.send(null) +} + +// Set the style of the specified keyword index node to "selected" +function SelectIndexNode(node) +{ + var n = node.toString(); + window.location.hash = n.substring(n.lastIndexOf('/')+1); + + if(lastIndexNode != null) + lastIndexNode.className = "UnselectedNode"; + + node.className = "SelectedNode"; + lastIndexNode = node; + + return true; +} + +// Changes the current page with keyword index forward or backward +function ChangeIndexPage(direction) +{ + PopulateIndex(currentIndexPage + direction); + + return false; +} diff --git a/docs/sandcastle_php/index.php b/docs/sandcastle_php/index.php new file mode 100644 index 00000000..fec66a6f --- /dev/null +++ b/docs/sandcastle_php/index.php @@ -0,0 +1,147 @@ +, All rights reserved +// Copyright (c) 2011, Latif Khalifa +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// Based on C# version by Eric Woodruff (Eric@EWoodruff.us) from code by Ferdinand Prantl +// Copyright 2008, Eric Woodruff, All rights reserved + +$lcTOC = ""; +$toc = DOMDocument::load("WebTOC.xml"); +$navToc = new DOMXpath($toc); +$root = $navToc->query("*"); + +foreach ($root as $node) { + + if ($node->hasChildNodes()) { + $id = $node->getAttribute("Id"); + $title = $node->getAttribute("Title"); + $url = $node->getAttribute("Url"); + + if (!$url) { + $target = " target=\"TopicContent\""; + } else { + $url = "#"; + $target = ""; + } + + $lcTOC .= sprintf("
\r\n" . + "%s\r\n" . + "
\r\n
\r\n", + $url, $target, htmlentities($title), $id); + } else { + + $title = $node->getAttribute("Title"); + $url = $node->getAttribute("Url"); + + if (!$url) + $url = "about:blank"; + + $lcTOC .= sprintf("
\r\n" . + "" . + "%s\r\n" . + "
\r\n", + $url, htmlentities($title)); + + } + +} + +// var_dump($lcTOC); +//die(); +?> + + + + + +OpenMetaverse Protocol Library Developers API Documentation - Table of Content + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ +
+ +
+ + + +
+ +