From 787d37b96544047c9d85c6581913809295df3d9f Mon Sep 17 00:00:00 2001 From: Dave Jansen Date: Mon, 14 Dec 2020 19:41:59 +0900 Subject: [PATCH] Add missing Res folder contents. --- static/Res/code/boxController.js | 183 ++++ static/Res/code/boxSettings.js | 13 + static/Res/code/mapController.js | 247 +++++ static/Res/code/shared.js | 169 ++++ static/Res/images/arrow.gif | Bin 0 -> 828 bytes static/Res/images/box_collapse_button.gif | Bin 0 -> 879 bytes static/Res/images/box_expand_button.gif | Bin 0 -> 879 bytes static/Res/images/bullet_blue.gif | Bin 0 -> 108 bytes static/Res/images/empty.gif | Bin 0 -> 102 bytes static/Res/images/header_background.gif | Bin 0 -> 1876 bytes static/Res/images/logo.gif | Bin 0 -> 1539 bytes static/Res/images/next_button.gif | Bin 0 -> 831 bytes static/Res/images/previous_button.gif | Bin 0 -> 832 bytes static/Res/images/spacer.gif | Bin 0 -> 67 bytes static/Res/images/top_button.gif | Bin 0 -> 834 bytes static/Res/styles/DynamicOutline.css | 69 ++ static/Res/styles/StaticOutline.css | 127 +++ static/Res/styles/shared.css | 1091 +++++++++++++++++++++ static/Res/tree/base.gif | Bin 0 -> 1103 bytes static/Res/tree/empty.gif | Bin 0 -> 102 bytes static/Res/tree/folder.gif | Bin 0 -> 998 bytes static/Res/tree/folderopen.gif | Bin 0 -> 1059 bytes static/Res/tree/join.gif | Bin 0 -> 74 bytes static/Res/tree/joinbottom.gif | Bin 0 -> 80 bytes static/Res/tree/leaf.gif | Bin 0 -> 59 bytes static/Res/tree/line.gif | Bin 0 -> 77 bytes static/Res/tree/minus.gif | Bin 0 -> 159 bytes static/Res/tree/minusbottom.gif | Bin 0 -> 349 bytes static/Res/tree/null.gif | Bin 0 -> 45 bytes static/Res/tree/page.gif | Bin 0 -> 985 bytes static/Res/tree/pagesel.gif | Bin 0 -> 984 bytes static/Res/tree/plus.gif | Bin 0 -> 155 bytes static/Res/tree/plusbottom.gif | Bin 0 -> 346 bytes static/Res/tree/topic.gif | Bin 0 -> 105 bytes static/Res/tree/tree.js | 9 + static/Res/tree/tree_items.js | 83 ++ static/Res/tree/tree_tpl.js | 95 ++ 37 files changed, 2086 insertions(+) create mode 100644 static/Res/code/boxController.js create mode 100644 static/Res/code/boxSettings.js create mode 100644 static/Res/code/mapController.js create mode 100644 static/Res/code/shared.js create mode 100644 static/Res/images/arrow.gif create mode 100644 static/Res/images/box_collapse_button.gif create mode 100644 static/Res/images/box_expand_button.gif create mode 100644 static/Res/images/bullet_blue.gif create mode 100644 static/Res/images/empty.gif create mode 100644 static/Res/images/header_background.gif create mode 100644 static/Res/images/logo.gif create mode 100644 static/Res/images/next_button.gif create mode 100644 static/Res/images/previous_button.gif create mode 100644 static/Res/images/spacer.gif create mode 100644 static/Res/images/top_button.gif create mode 100644 static/Res/styles/DynamicOutline.css create mode 100644 static/Res/styles/StaticOutline.css create mode 100644 static/Res/styles/shared.css create mode 100644 static/Res/tree/base.gif create mode 100644 static/Res/tree/empty.gif create mode 100644 static/Res/tree/folder.gif create mode 100644 static/Res/tree/folderopen.gif create mode 100644 static/Res/tree/join.gif create mode 100644 static/Res/tree/joinbottom.gif create mode 100644 static/Res/tree/leaf.gif create mode 100644 static/Res/tree/line.gif create mode 100644 static/Res/tree/minus.gif create mode 100644 static/Res/tree/minusbottom.gif create mode 100644 static/Res/tree/null.gif create mode 100644 static/Res/tree/page.gif create mode 100644 static/Res/tree/pagesel.gif create mode 100644 static/Res/tree/plus.gif create mode 100644 static/Res/tree/plusbottom.gif create mode 100644 static/Res/tree/topic.gif create mode 100644 static/Res/tree/tree.js create mode 100644 static/Res/tree/tree_items.js create mode 100644 static/Res/tree/tree_tpl.js diff --git a/static/Res/code/boxController.js b/static/Res/code/boxController.js new file mode 100644 index 0000000..4c9965c --- /dev/null +++ b/static/Res/code/boxController.js @@ -0,0 +1,183 @@ +/* +BoxController +Note: Requires boxSettings.js also be included + +Revisions +2003-09-13: Jeff edited. Added expand all of type. +2003-09-15: Jeff added cookie code. + +Boxes are the bordered divs with a header and body, and a expand/collapse button. +Box types: +partialMap, subTopic, callouts, comments, taskInformation, legend. + +If you collapse a subTopic box on one page, you collapse all subTopic boxes that and other pages. Same with expanding. +Note: There can be more than one box of each type on the page. + +In HTML, the structure expected is: + +div.{boxType}Area (useful for CSS selector of different types of boxes, e.g. div.{boxType}Area div.box) + div class="collapsiblebox" id="{boxType}{index}" (1+) + div.header onclick = "boxController.expandOrCollapse(this,'{boxType}')" (0-1) + span.title + span.commands ? (mike) + span.command ? (mike) + img.expandOrCollapseButton src="{buttonsPath}{collapseButtonUrl} or {expandButtonUrl}" + div.body + (varies) + + Note: Visibility of div.body (i.e. style="display:block" or style="display:none") is overwritten by code. + Note: Button graphics as well. + + */ + +function init() { + boxController = new BoxController("Res/images/", "box_collapse_button.gif","box_expand_button.gif", true); + boxController.init(); +} + +// BoxController class + +function BoxController (buttonsPath, collapseButtonFilename,expandButtonFilename, changeAllOfType) { + this.objectClass = "BoxController"; + this.buttonsPath = buttonsPath; + this.collapseButtonUrl = buttonsPath + collapseButtonFilename; + this.expandButtonUrl = buttonsPath + expandButtonFilename; + this.changeAllOfType = changeAllOfType; // if true, all boxes of a type are expanded or collapsed together, not just clicked one + this.boxTypes = null; +} + + +BoxController.prototype.init = function() { + // initialize boxTypes + this.boxTypes = INITIAL_BOX_SETTINGS; // defaults loaded from boxSettings.js + + // check if cookie has stored states + var cookieString = this.getCookieString(); + if (cookieString!=null) { + // for each boxType, get stored value from cookie + for (var i=0; i < this.boxTypes.length; i++) { + var boxType = this.boxTypes[i]; + var value = getValueFromCookieString ( cookieString, boxType.name ); + if (value!=null) { + boxType.state = value=="true" ? true : false; + } + } + } + + + // for each boxType, change state of all boxes of that type + for (var i=0; i < this.boxTypes.length; i++) { + this.changeStateOfAllBoxesOfType( this.boxTypes[i].name, this.boxTypes[i].state ); + } +} + +BoxController.prototype.dumpBoxTypes = function() { + var s = "BoxTypes\n"; + for (var i=0; i < this.boxTypes.length; i++) { + s += this.boxTypes[i].name + "," + this.boxTypes[i].state+ "\n"; + } + return s; +} + +BoxController.prototype.saveStateToCookie = function() { + // stores state of controller in cookie + var cookieString = ""; + + // for each box type... + for (var i=0; i < this.boxTypes.length; i++ ) { + var boxType = this.boxTypes[i]; + if (cookieString!="") cookieString += "&"; + cookieString += boxType.name + ":" + escape(boxType.state); + } + + // Cookie properties (if needed) + // Currently assumes that all html pages are in the same directory together, otherwise cookie's path property would need to be set + // Currently that cookie should expire when user closes the browser (expires property) + // save cookie; will be only accessible to this html page + var cookieName = this.objectClass; + document.cookie = cookieName + "=" + cookieString; +} + +BoxController.prototype.getCookieString = function() { + // checks saved state of controller from cookie; returns string of values or null if desired cookie does not exist + var cookieName = this.objectClass; + var allCookies = document.cookie; + if (allCookies=="") return null; + + // extract the named cookie we want + var start = allCookies.indexOf(cookieName + "="); + if (start == -1) return null; + + start += cookieName.length + 1; // skip over name and = sign + var end = allCookies.indexOf(";", start); + if (end==-1) end = allCookies.length; + var cookieString = allCookies.substring(start,end); + return cookieString; +} + +BoxController.prototype.changeStateOfAllBoxesOfType = function( boxType, newState ) { + // changes all boxes on the page of boxType to newState ("expand" or "collapse") + // loop through all boxes of boxType + var boxIndex = 0; + while (document.getElementById (boxType + boxIndex) ) { + // change state + this.changeStateOfBoxOnPage ( document.getElementById (boxType + boxIndex), newState ); + boxIndex++; + } + // store new state in array + for (var i=0; i < this.boxTypes.length; i++ ) { + var boxTypeItem = this.boxTypes[i]; + if (boxTypeItem.name == boxType) { + boxTypeItem.state = newState; + break; + } + } +} + +BoxController.prototype.expandOrCollapse = function( headerElement, boxType ) { + // Note: Having one routine for both expand and collapse let's the function that html calls be the same + // Uses img's src attribute to determine which command is being called + // First get the button element; may be the elementActivated or within the elementActivated (like an anchor element) + var buttonElement = getFirstDescendentOrSelfOfClass ( headerElement, "expandOrCollapseButton"); + if (!buttonElement) return; + + var currentImageUrl = buttonElement.src; + if (!currentImageUrl) return; + + // if src value contains url of collapse button, this is, presumably a collapse command + var newState = false; + if (currentImageUrl.lastIndexOf(this.collapseButtonUrl)==-1) newState = true; + + // change state of all boxes of this type ... + if (this.changeAllOfType) { + this.changeStateOfAllBoxesOfType (boxType,newState); + this.saveStateToCookie(); + } + // or just this one box + else { + var boxElement = headerElement.parentNode; + if (boxElement) this.changeStateOfBoxOnPage(boxElement,newState); + } + +} + +BoxController.prototype.changeStateOfBoxOnPage = function( boxElement, makeOpen) { + // change UI of box on the html page + + // get button element + var buttonElement = getFirstDescendentOrSelfOfClass( boxElement, "expandOrCollapseButton"); + if (!buttonElement) return false; // if not found, give up + // get body element + var bodyElement = getFirstDescendentOrSelfOfClass( boxElement, "body"); + if (!bodyElement) return false; // if not found, give up + + // expand or collapse body element + showOrHideElement(bodyElement,makeOpen); + + // update img to be an appropriate button + if (buttonElement.src) { + // if opening, make it the collapse button; if not opening, make it the expand button + buttonElement.src = makeOpen ? this.collapseButtonUrl : this.expandButtonUrl; + } +} + diff --git a/static/Res/code/boxSettings.js b/static/Res/code/boxSettings.js new file mode 100644 index 0000000..13db168 --- /dev/null +++ b/static/Res/code/boxSettings.js @@ -0,0 +1,13 @@ +// exported by program to supply initial settings for boxes + +var INITIAL_BOX_SETTINGS = [ + {name:"partialMap", state:true}, + {name:"subTopics", state:true}, + {name:"callouts", state:true}, + {name:"comments", state:false}, + {name:"relationships", state:true}, + {name:"taskInformation", state:true}, + {name:"textMarkers", state:true}, + {name:"dataContainer", state:true}, + {name:"legend", state:true} +]; \ No newline at end of file diff --git a/static/Res/code/mapController.js b/static/Res/code/mapController.js new file mode 100644 index 0000000..d544ce2 --- /dev/null +++ b/static/Res/code/mapController.js @@ -0,0 +1,247 @@ +// MapController class +// Scrollable, switchable (in amount of detail) map +// Uses functions from shared.js +// Requires html page with two imgs for each level of detail; one of which is style="display:none" at start +// Requires mainFrame is scrollable (for Netscape/Mozilla to work + +// MapController class + +function MapController (frameObject, dragMultiplier) { + this.objectClass = "MapController"; // used as name for cookie + this.DRAG_THRESHOLD = 4; // minimum distance before a drag can not be treated as a click; in pixels + this.DRAG_MAX_FIRST_STEP = 10; // largest distance permitted within single mousemove; used to detect invalid drag on IE + this.frameObject = frameObject; // scrollable frame containing mapImages + this.mapImages = []; // array storing each mapImage (2 images) + this.activeMapImage = 1; // index of active/visible image; default to first map image + this.dragMultiplier = dragMultiplier ? dragMultiplier : 1; // 1 = default; 2 = 2x speed dragging; can be any number + //this.temp = 0; + //this.systemInfo = new SystemInfo(); +} + +MapController.prototype.init = function(initialMap) { + // setup dragScrolling + this.dragScrolling = false; // indicates that user is dragging image around + this.wasDraggedEnoughToNotBeAClick = false; + this.mouseJustPressed = false; + this.mouseDownX, this.mouseDownY = null; + this.oldScrollX, this.oldScrollY = null; + // Note: Changed following from document.onmousedown; fixes dragging on scroll bar triggering onmousedown in Mozilla/NS + var mapContentElement = this.frameObject.document.getElementById("mapContent"); + if (!mapContentElement) mapContentElement = this.frameObject.document; + mapContentElement.onmousedown = this.onMouseDown; + //this.frameObject.document.onmousedown = this.onMouseDown; + this.frameObject.document.onmousemove = this.onMouseMove; + this.frameObject.document.onmouseup = this.onMouseUp; + this.frameObject.document.onclick = this.onClick; + this.frameObject.document.onscroll = this.onScroll; + // + var cookieValue = this.getCookieValue(); + //window.status = cookieValue; + if (cookieValue==false) { + // there was no saved state, so the map is presumably loading for the first time + this.selectMapImage(initialMap); // select active map + } + else { + // the state is saved; use the cookieValue to figure out the state + this.initFromCookieValue(cookieValue); + } + //trace(this.systemInfo); +} + +// Note: In following, e = event object passed in automatically + + +MapController.prototype.onMouseDown = function(e) { + // Note: Ends up running in context of the frame, so this = frameObject, not mapController + // Get a reference mapController object to be able to use it here. + var mc = parent.topFrame.mapController; // HACK: Must be more elegant way to get reference. + if (!e) var e = mc.frameObject.event; + if (wasLeftButton(e)) { // TODO: Double-check wasLeftButton code; now only works for IE? + mc.mouseDownX = /* e.x ? e.x : */ e.screenX; + mc.mouseDownY = /* e.y ? e.y : */ e.screenY; + // Note: In Mozilla/NS, the mainFrame must be scrollable for the .scrollLeft and .scrollTop properties to be accessible + + if (navigator.appName == "Microsoft Internet Explorer") + { + mc.oldScrollX = mc.frameObject.document.body.scrollLeft; + mc.oldScrollY = mc.frameObject.document.body.scrollTop; + //window.status = "mc.frameObject.document.body.scrollTop:"+mc.frameObject.document.body.scrollLeft; + } + else + { + mc.oldScrollX = mc.frameObject.window.scrollX; + mc.oldScrollY = mc.frameObject.window.scrollY; + //parent.document.title = "mc.frameObject.document.body.scrollTop:"+mc.frameObject.document.body.scrollLeft; + } + + mc.dragScrolling = true; + mc.mouseJustPressed = true; + mc.wasDraggedEnoughToNotBeAClick = false; + //window.status = "mouseDown: " + " | " + mc.mouseDownX + "," + mc.mouseDownY+ " | " + mc.oldScrollX + "," + mc.oldScrollY; + } + return false; // stops browser behavior of dragging image to copy it to the desktop (at least on Mac Safari) +} + +MapController.prototype.onMouseMove = function(e) { + var mc = parent.topFrame.mapController; // HACK: Must be more elegant way to get reference. + if (!e) var e = mc.frameObject.event; + //window.status = "MouseMove:" + mapController.temp++; + if (mc.dragScrolling) { + if (!e) var e = mc.frameObject.event; + var newMouseX = /* e.x ? e.x :*/ e.screenX; + var newMouseY = /* e.y ? e.y : */ e.screenY; + var newOffsetX = newMouseX - mc.mouseDownX; + var newOffsetY = newMouseY - mc.mouseDownY; + + // Test if move from old to new position is unreasonably large, as in the case when + // user drags scroll bar in IE -- then dragScrolling is true, but mouseUp is lost. + // So, this code stops dragScrolling in that case. + if (mc.mouseJustPressed) { + if (Math.abs(newOffsetX) > mc.DRAG_MAX_FIRST_STEP | Math.abs(newOffsetY) > mc.DRAG_MAX_FIRST_STEP) { + mc.dragScrolling = false; + return false; + } + mc.mouseJustPressed = false; + } + + //window.status = '(' + newOffsetX +',' + newOffsetY+')' + if (Math.abs(newOffsetX) > mc.DRAG_THRESHOLD | Math.abs(newOffsetY) > mc.DRAG_THRESHOLD) mc.wasDraggedEnoughToNotBeAClick = true; + var newScrollX = mc.oldScrollX - mc.dragMultiplier * newOffsetX; + var newScrollY = mc.oldScrollY - mc.dragMultiplier * newOffsetY; + + mc.frameObject.scrollTo(newScrollX,newScrollY); + //window.status = "dragging: " + " | " + newMouseX + "," + newMouseY+ " | " + newScrollX + "," + newScrollY + "old scroll: " + mc.oldScrollX + "," + mc.oldScrollY; + return false; + } + else { + //window.status = "not dragging "+ mapController.temp++ + navigator.appName; + } +} + +MapController.prototype.onMouseUp = function(e) { + var mc = parent.topFrame.mapController; // HACK: Must be more elegant way to get reference. + mc.dragScrolling = false; + return false; // Doesn't seem to have any useful affect +} + +MapController.prototype.onClick = function(e) { + var mc = parent.topFrame.mapController; // HACK: Must be more elegant way to get reference. + if (mc.wasDraggedEnoughToNotBeAClick) { + //window.status = "onclick return false"; + return false; // cancels onClick event; if mouseUp was on hotshop, navigation can not happen + } + return true; +} + +MapController.prototype.onScroll = function(e) { + //window.status = "scroll"; + // Opera: Triggered when mapContent dragged + // Mozilla/NS: Triggered when scroll bar dragged (but not mapContent dragged) + // IE: Never triggered + // Mozilla/NS on Macintosh: Triggered when scrollbar dragged and mapContent dragged + + var agt = navigator.userAgent.toLowerCase(); + if (agt.indexOf("macintosh") == -1 && navigator.appName != "Microsoft Internet Explorer") + { + var mc = parent.topFrame.mapController; // HACK: Must be more elegant way to get reference. + mc.dragScrolling = false; + return false; // Doesn't seem to have any useful affect + } +} + +MapController.prototype.addMapImage = function(imgId, centerX, centerY) { + this.mapImages.push( new MapImage ( this.frameObject, imgId, centerX, centerY) ); +} + +MapController.prototype.selectMapImage = function(newActiveMapImage) { + // make mapImageToSelect active and make others inactive + var lastImage = this.mapImages.length - 1; + for (var i=0; i <= lastImage; i++ ) { + this.mapImages[i].makeActive( i==newActiveMapImage ); + } + this.activeMapImage = newActiveMapImage; + this.saveStateToCookie(); + this.scrollToCenter(); +} + + +MapController.prototype.scrollToCenter = function() { + // scrolls to the center of active map image + var activeMapImage = this.mapImages[this.activeMapImage]; + var frameObject = this.frameObject; + //trace(activeMapImage); + this.frameObject.scrollTo( activeMapImage.centerX - (getWindowWidth(frameObject)/2), activeMapImage.centerY - (getWindowHeight(frameObject)/2)); +} + +MapController.prototype.saveStateToCookie = function() { + // stores state of controller in cookie + var cookieName = this.objectClass; + var cookieValue = ""; + // save which map is selected/active + cookieValue += "active:" + this.activeMapImage; + // TODO: save scroll position + // save cookie; will be only accessible to this html page + document.cookie = cookieName + "=" + cookieValue; +} + +/* +MapController.prototype.savedStateExists = function() { + // returns true is saved state (cookie) exists +} +*/ + +MapController.prototype.getCookieValue = function() { + // checks saved state of controller from cookie; returns string of values or false if desired cookie does not exist + var cookieName = this.objectClass; + var allCookies = document.cookie; + if (allCookies=="") return false; + + // extract the named cookie we want + var start = allCookies.indexOf(cookieName + "="); + if (start == -1) return false; + + start += cookieName.length + 1; // skip over name and = sign + var end = allCookies.indexOf(";", start); + if (end==-1) end = allCookies.length; + var cookieValue = allCookies.substring(start,end); + return cookieValue; +} + +MapController.prototype.initFromCookieValue = function(cookieValue) { + // parses cookieValue; initializes object accorded to saved values + /* + var a = cookieValue.split("&"); // create array from name/value pairs delimited by ampersand + for (var i=0; i < a.length; i++) { // then break each pair into an array + a[i] = a[i].split(":"); + } + */ + // TODO: Rewrite. Currently a hack. + if (cookieValue=="active:1") this.selectMapImage(1); + else this.selectMapImage(0); + // this.selectMapImage(initialMap); +} + +/* +MapController.prototype.moveTo = function(x,y) { + // move image (i.e. scroll window) + window.scrollTo(x,y); +} +*/ + +// MapImage class - one for each img/view of the map + +function MapImage ( frameObject, imgId, centerX, centerY ) { + this.objectClass = "MapImage"; + this.centerX = centerX; + this.centerY = centerY; + // get image reference + this.imgElement = getElement(frameObject,imgId); + this.imgStyle = getElementsStyleObject(frameObject,imgId); +} + +MapImage.prototype.makeActive = function (newIsActiveState) { + //this.trace(); + var newDisplayStyle = newIsActiveState ? "block" : "none"; + this.imgStyle.display = newDisplayStyle; +} + diff --git a/static/Res/code/shared.js b/static/Res/code/shared.js new file mode 100644 index 0000000..3fee651 --- /dev/null +++ b/static/Res/code/shared.js @@ -0,0 +1,169 @@ +// Shared routines + +function openPopup(url,windowName,features) { + window.open(url,windowName,features); +} + +function preloadImage(Url) { + var i = new Image(); + i.src = Url; +} + +function showOrHideElement(element,show) { + element.style.display = show ? "block" : "none"; +} + +/* unused +function getFirstAncestorOfClass (sourceElement, className) { + // recursively search for ancestor of sourceElement that matches className + var elementBeingTested = sourceElement.parentNode; + if (elementBeingTested.className == className) return elementBeingTested; + if (!elementBeingTested.className) return null; // if run out of elements (like at document) stop + return getFirstAncestorOfClass(elementBeingTested, className); +} +*/ + +function getFirstDescendentOrSelfOfClass (sourceElement, className) { + // recursively search for descendent of sourceElement that matches className + // test self + if (sourceElement.className == className) return sourceElement; + // test children + var child = sourceElement.firstChild; + if (child) { + while (child) { + var elementBeingTested = getFirstDescendentOrSelfOfClass (child, className); + if (elementBeingTested) return elementBeingTested; + child = child.nextSibling; + } + } + return null; +} + +function getElement(frameObject,elementId) { + if (document.getElementById) return frameObject.document.getElementById(elementId); + if (document.all) return frameObject.document.all[elementId]; + if (document.layers) return frameObject.document.layers[elementId]; + return null; +} + +function getElementsStyleObject(frameObject,elementId) { + if (document.getElementById) return frameObject.document.getElementById(elementId).style; + if (document.all) return frameObject.document.all[elementId].style; + if (document.layers) return frameObject.document.layers[elementId]; + return null; +} + +function getWindowHeight(frameObject) { + if (document.all) return frameObject.document.body.clientHeight; // IE on Mac and Windows + if (document.layers) return frameObject.document.clientHeight; +} + +function getWindowWidth(frameObject) { + if (document.all) return frameObject.document.body.clientWidth; // IE on Mac and Windows + if (document.layers) return frameObject.document.clientWidth; +} + +function trace (anObject) { + alert(listObject(anObject)); +} + +function listObject(theObject) { + var m = ''; + for (prop in theObject) { + m+= prop + ":" + theObject[prop] + "\n"; + //* if theObject[prop] == + } + return(m); +} + +function wasLeftButton(e) { + // takes event object (e) and decides if left button was pressed (as opposed to middle wheel button) + var buttonPressed = /* (navigator.appName=="Netscape") ? e.which : */ e.button; + if (buttonPressed == 1 | buttonPressed == 0 ) return true; + return false; +} + +function appendToCookieString ( cookieString, property, value ) { + if (cookieString!="") cookieString += "&"; + cookieString += property + ":" + escape(value); +} + +function getValueFromCookieString ( cookieString, property) { + // extract value of given property from encoding like this: "property1:value1&property2:value2" + var pos = cookieString.indexOf(property); // at start of property label + if (pos==-1) return null; + pos += property.length + 1; // at start of value + var start = pos; + pos = cookieString.indexOf("&",pos+1); + // if "&" not found, must be last property:value pair -- end of value is end of cookieString + // else end of value is just before "&" + var end = (pos==-1) ? cookieString.length : pos; + var value = cookieString.substring(start,end); + return unescape(value); +} + + +// SystemInfo Class +// class to handle system check (browser, etc.) +// Thanks to http://www.xs4all.nl/~ppk/js/detect.html for this code +// TODO: Rewrite? +/* +function SystemInfo() { + this.detect = navigator.userAgent.toLowerCase(); + this.OS = null; + this.browser = null; + this.version = null; + //this.subVersion = null; + this.total = null; + this.thestring = null; + this.place = null; + + if (this.checkIt('konqueror')) { + this.browser = "Konqueror"; + this.OS = "Linux"; + } + else if (this.checkIt('safari')) { + this.browser = "Safari" + //this.subVersion = this.detect.substring(8,12); + } + else if (this.checkIt('omniweb')) this.browser = "OmniWeb" + else if (this.checkIt('opera')) this.browser = "Opera" + else if (this.checkIt('webtv')) this.browser = "WebTV"; + else if (this.checkIt('icab')) this.browser = "iCab" + else if (this.checkIt('msie')) this.browser = "Internet Explorer" + else if (!this.checkIt('compatible')) { + this.browser = "Netscape Navigator" + this.version = this.detect.charAt(8); + } + else this.browser = "An unknown browser"; + + if (!this.version) this.version = this.detect.charAt(this.place + this.thestring.length); + + if (!this.OS) { + if (this.checkIt('linux')) this.OS = "Linux"; + else if (this.checkIt('x11')) this.OS = "Unix"; + else if (this.checkIt('mac')) this.OS = "Mac" + else if (this.checkIt('win')) this.OS = "Windows" + else this.OS = "an unknown operating system"; + } +} + +SystemInfo.prototype.checkIt = function(string) { + this.place = this.detect.indexOf(string) + 1; + this.thestring = string; + return this.place; // HACK: Weird +} + +*/ + +// Saving state using cookies + +/* +expires +domain + +document.cookie = "version=" + escape(document.lastModified) + "; expires=" + +// cookie values may not include semicolons, commas, or whitespace + + +*/ diff --git a/static/Res/images/arrow.gif b/static/Res/images/arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd687e55cb65d4327abef6963dc7aec1d3d5e8f6 GIT binary patch literal 828 zcmZ?wbhEHbWMklD_|Cxa|6KC_Q7{?;BQgYj>{n6z$-)TC1q?b2Kmf`U3>=aS|2buT b@G~52Vq<5DSW%GZ)XvMPW@BNXz+epkc?1W! literal 0 HcmV?d00001 diff --git a/static/Res/images/box_collapse_button.gif b/static/Res/images/box_collapse_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..602b4edf2cb808a8918136ef0f2a60e08c25ba7f GIT binary patch literal 879 zcmZ?wbhEHb$AK6 QCusDgWX{u&Vq~xe01g)u00000 literal 0 HcmV?d00001 diff --git a/static/Res/images/header_background.gif b/static/Res/images/header_background.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f07e39f420b767614f86a812645eee1c9cdaa53 GIT binary patch literal 1876 zcmeH`{XY{39LK+{**vtA`R9EBW;S|eMDvN3gWN|oH7oi0!0G$9` z0NnsR0KEWx08as)0rUe506Yg61Q-Gs29N@b0E`020LB1b0E`330Tcie051V10j2<^ z0cHSZ0p3055}V)TzG z1s2hYQL&Khj0z`bw}jOuR30?mqi-i|H@7O==Sc%1OJA4@q*AN%w-9ov|*= z@FZc#GpBg5$ZP~1HPJ?~sjHNssLNAl#C7)qQCbMCZ}{vgd5h*IqkvB8o`m)+LqiLj zdcmXwwKr^xUmri+!?xdyb#17bU03E=9?<0%uN(I=A*N~X z3L$XLrFGnN>F@X}&M~XEq=4mizLb(f5H|B4`*XV&57E}r4V?97`j+*Wyc9{H$pBx~ zDAC?3;?rv1%NlZ?yr{g2zNq$oFg_8JJamozLs{Oh8v>@bpJ6%X`G)8uoRwZLt>(&; zg_Ie2d%nQlRPsmKfU+NvcrUWWjpB) zd)@Fhi}Su2V13y3kF&06CvtxC*YIIdA|9W~UAs&plJb)2!=zi;x8r>CSrxv)1=xqi zuUL;XgQlwur-+I|+A7hG-TSkH5hqzcy^NUd*B)|#@e~>Ac4NsQw3NwBF-GNEw%%1M zyrOBMR?KkbA-RR=JYKm#lU$hR*25!v+6`K;f*3;|pYzW664sK$ z)MZW(M<}w|*F}`_2O3{5j0)F!ycHj8dOyB%*)KkZXT~5<2Ayx#xgEvSl0DpADPbpK zQz_5=KDX5h(X?$5L*@*O|M1zOPqxyZO8H9?d8A5&n#|9b9aT!{(PPUCbQ9#2_1)%u z@p`m3@>Ki-iwXMCHQ$$aTq}bonSpNSrt-<7Z`%sdnhnv#DGsYdZV{sa&5IQuL{~KH zU+SzG3}2qNoc=P@q}*zuO47bcRopZiyT4A7h+9@4KO(WsbbD&A`!?ycb+`5IOYzcx z=!TW-#cMq=6NW`|-MJ6yD%>OYmCHV;bdP$>E|7UkvR)Ma$hB`XueN^(1TBIMLYLr% zb_hZ&*4S7d$cnb!_&XbUz|Qu2U&3XDz5hQJLwmK`A};KR32Yo++11pgeci`H&QuNB b`8D-Y*IWW1jB1aY$~tKEQjS=U0IPoiVCGBz literal 0 HcmV?d00001 diff --git a/static/Res/images/logo.gif b/static/Res/images/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..09ebbdcf5cc9e20fd28945e5aabf256ef5d3964b GIT binary patch literal 1539 zcmchW{ZrIM9LEuo4n(4~ zqDGVrZ3qj5$^n$j6hRT^>GJjQLQ=BUFc<&+9ar5cNhG0He)f-7aw-Ltm1(UFcJb;PUhy(rs0f(T57@$FktKh(3XhRxW zQYEL_sBr}6QUwWr7>h~>E+le=T~MIOrQi}dB54EwE?h^@aEmCB2Qcv(aexVi;Skgi z12kR&3mg~>ZAeSCB6S;W)Ho6wLy+)?v8aTUYJv9kD+>EY)jsV@Qc(8X)q3qwDn@%c zYTI_h3fb;KE#Ho%9M~s88lMBUgz(@Aqo!K@{`(mJ#~%#!d8BbrHUrgI^`9WxCqz1X z$23$$7%i5?nzjZXo6ae2K}bwvbw{B#KI}%<{h^Ed7P$IObZy-`orAay;e|w75kZ5SQ2&txGyMU$bjt zwr|wB_Fa$aw$;T~k#wyuEzKRMeknY_mAfrzCo7Y@zkjfU9r|H&(C5uFPTXD7R_H%- z;o*?cg!cDY*_!$aOU4 zFKPMGZ^kV$QE(>L(Q0;DK4P?L#+mkU&K;vcS2S6#&lwwaJLR_4Z_jOA@MmY9%uTY= z;5Q4ypZWQq*wQg|uA}bG%!YeIttSr8aZVjFnI2C)IHI|^`$l=X=@nygE%$W&Ho{=; z>t1;Ct#)JJ(&t*b2~+vg=toL+q;!|=kJ!j_9SbVAdgP^A^LjD{D>5gW+3xVs6n9_k?5m63PSOm{ zk6g5V?AI-KtvAKhXr3lP`r-*A|uR)#jG#cW%lWZgVIb z%6{jsfj*b%`sHJ=s`24(E64pS zE30R{Xtcy#>YS`QKJzEryo2rfb%#!ENa=drJpO@S<#%s%^w(!wGu@A$ZOZ;S$J#yI z8JKeILGK0Ih09^<3&!?tx3p!2_AgFfI-J~K${6(Uuq~Zm7T^_}ncmh>G`gM4IQnE+ zfLGE${I(dq!^XCqnx@bSmsI~h|A<_h@1NlrSY}GOq${8L!qb{l<9#_{y#H2j)TY0S dD`uIGxL+~vD=yO|Xku5roS0+Ciy-9re*mn1mk|H} literal 0 HcmV?d00001 diff --git a/static/Res/images/next_button.gif b/static/Res/images/next_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb9a12a7496ad49b66e19ee21b5b0c5dab34ef74 GIT binary patch literal 831 zcmZ?wbhEHbKewZczmuz#XON+u0n@#=42nNl7#SFt7<7PY Nfa*bPrVvI3YXHjL5YGSr literal 0 HcmV?d00001 diff --git a/static/Res/images/top_button.gif b/static/Res/images/top_button.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c57861da76edf343a0ba2259ed0b850776baaea GIT binary patch literal 834 zcmZ?wbhEHb2_n*s$ + + + + + + table#pageFooter + tr + td.left (rowspan = 2, could be used for image) + td.center (rowspan = 2) + div.footerText + td.right + div.hyperlink + tr + td.right + div.lastUpdated + */ + + + +/* GLOBAL SYTLE global styling, sets overall style of page */ + +body { + font-family: Verdana; + margin: 0px; /* increase to have page float on background */ + padding: 0px; + font-size: 8pt; +} + +li { + margin-bottom: .3em; /* make list items more compact than default */ +} + +img { + border: 0; /* by default, images should not have a border */ +} + +.emptyImage { /* used for special effects */ + float:left; + margin: 0px; /* distance to outline */ +} + + +/* all headers in boxes */ +.header { + clear: both; /* floating element below */ +} + +/* link styles */ +a { + text-decoration: underline; /* set to "none" to hide underlines on links */ +} + +a img { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +/* remove link underline from some special elements: Header and Overview Map */ +#mapPageHeader a, { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +a:link { + color: #CC0000; /* STYLE */ +} + +a:visited { + color: #CC0000; /* STYLE */ +} + +/* Note: hover selector should be last in order to take precedence in :visited AND :hover situation */ +a:hover { + color: #FF3300; /* STYLE */ +} + +/* special link styles */ +a.noHover:hover { + background-color:transparent; /* If you don't want images wrapped in to have hover effect, make it */ +} + +a:active { + color: #FF3300; /* STYLE */ +} + + +/*********************************************************************************/ +/*** Styles of specific modules **************************************************/ +/*********************************************************************************/ + +/* MODULE: HEADER --------------------------------------------*/ +#pageHeader { + width: 100%; + border-bottom: 3px solid #FFCC66; /* STYLE */ + background-image: url(../images/header_background.gif); /* STYLE */ + background-repeat: repeat-y; /* STYLE */ + background-color: #CC0000; /* STYLE */ /* same color as on right side in backgound image */ +} + + +#pageHeader td { + padding-left: 6px; + padding-right: 6px; +} + +#pageHeader div { + /*margin-bottom: .2em; */ +} + +/* logo image on left side of header */ +#pageHeader .left { + width: auto; + margin-right: 8px; + vertical-align: middle; +} + +/* header information */ +#pageHeader .right { + margin-left: 8px; + width: 100%; /* helps to left align text */ + color: White; /* STYLE */ +} + +#pageHeader .right .utilities { + text-align: right; + font-size: 8pt; + vertical-align: top; +} + +.utilities_toc { + display: show; /* show table of content link */ +} + +/* link style in header */ +/* note: Order is important. If ambiguous, last has precedence. */ +#pageHeader a:link { + color: White; /* STYLE */ +} + +#pageHeader a:visited { + color: White; /* STYLE */ +} + +#pageHeader a:hover { + color: White; /* STYLE */ +} + +#pageHeader a:active { + color: White; /* STYLE */ +} + +/* note: Order is important. If ambiguous, last has precedence. */ +#pageHeader .right .utilities a:link { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +#pageHeader .right .utilities a:visited { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +#pageHeader .right .utilities a:hover { + text-decoration: none; /* set to "none" to hide underlines on links */ +} +#pageHeader .right .utilities a:active { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +#pageHeader .right .mapName { + text-align: left; + font-family: Arial; + font-size: 15pt; + vertical-align: middle; +} + +#pageHeader .right .contactInformation{ + text-align: right; + font-size: 7pt; + vertical-align: bottom; + /*margin-right: 4px; */ /* to right align with commands in utilities */ +} + + +/* MODULE: BODY (main content) ------------------------------------------ */ +table#pageBody { + width: 100%; +} + +.bodyColumn { + padding: 0px; + vertical-align: top; + text-align: left; + width: 100%; +} + + +/* width of second body column: liquid width for content */ +#pageBody col.main { + width:auto; +} + +#pageBody col.right { + width: auto; +} + +/* some padding values for the core table in used page body */ +table#pageBody tr td { + padding-left: 0px; + padding-right: 0px; +} + +table#pageBody td.main { + padding-left: 10px; /* indent main topic content */ + padding-right: 20px; /* and leave some space on the right */ +} + +table#pageBody td.breadcrumbs { + vertical-align: top; + padding-left: 10px; /* indent main topic content */ +} + +table#pageBody td.pageNavigation { + padding-right: 20px; /* and leave some space on the right */ +} + +.topicDivider { + border-top: 1px solid #FFCC66; /* STYLE */ + height: 0.1em; + font-size: 2pt; /* I need a very narrow divider */ +} + + +/* MODULE: FOOTER ------------------------------------------------------------*/ +#pageFooter { + width: 100%; + background-color: #FFCC66; /* STYLE */ + border-top: 2px solid #CC0000; /* STYLE */ + border-bottom: 2px solid #CC0000; /* STYLE */ + font-size: 8pt; + color: Black; /* STYLE */ + margin-left: 2px; +} + + +#pageFooter td { + padding-left: 6px; + padding-right: 6px; +} + +#pageFooter div { +/* margin-bottom: .2em; */ +} + +/* link style in footer */ + +#pageFooter a:link { + color: Black; /* STYLE */ +} + +#pageFooter a:visited { + color: Black; /* STYLE */ +} + +#pageFooter a:hover { + color: #CC0000; /* STYLE */ +} + +#pageFooter a:active { + color: #CC0000; /* STYLE */ +} + +/* reserved for image */ +#pageFooter .left { + width: 0px; + margin-right: 0px; +} + +#pageFooter .center { + width: 65%; /* helps to left align text */ + text-align: left; + vertical-align: top; +} + +#pageFooter .center .footerText { +} + +/* Last update and hyperlink */ +#pageFooter .right { + width: 35%; + text-align: right; +} + +#pageFooter .right .hyperlink { + vertical-align: top; +} + +#pageFooter .right .lastUpdated { + vertical-align: bottom; +} + +/* MODULE BREADCRUMBS AND PREV / NEXT NAVIGATION --------------------------------------------------*/ +.breadcrumbs { + font-size: 7pt; /* STYLE */ + text-align: left; + width: 70%; + vertical-align: top; + color: #CC0000; /* STYLE */ + padding-top: 4px; + padding-bottom: 2px; +} + +.breadcrumbs a:visited { + color: #CC0000; /* STYLE */ /* don't show visited colors for breadcrumbs */ +} + +.breadcrumbs .breadcrumb { + white-space: nowrap; /* set to "nowrap" to stop breadcrumbs from breaking in the middle */ +} + +/* move the previous / next links to the right side */ +.pageNavigation { + text-align: right; + font-size: 7pt; + width: 30%; + vertical-align: middle; +} + +.pageNavigation a:visited { + color: #CC0000; /* STYLE */ /* don't show visited colors for prev/next navigation */ +} + + +/*----------------------------------------------------------------------------------*/ +/* MODULE: TOPIC ------------------------------------------------------------------ */ +/*----------------------------------------------------------------------------------*/ +/* + tr.topic (0+) + td.main (colspan = 2) + tr.topicHeader + td.topicImageColumn + img.topicImage + td.topicLineColumn + span.outlineNumber + span.topicLine + span.topicIcons + img.topicIcon + div.body + + div.topicTextNotes + div Notes + + + + + + td.right +*/ + +.topic .main .body { + clear: both; +} + +.topicHeader { + vertical-align: middle; + clear:both; +} + +.topicImageColumn { +} + +.topicImage { + margin-right: 6px; /* distance to outline */ +} + +.topicTopicLineColumn { +} + +.outlineNumberFirst { /* first topic on page */ + display: visible; /* set to none or visible to hide/show outlineNumbers */ + font-size: 11pt; + font-weight: bold; +} + +.outlineNumber { /* other topics on page */ + display: visible; /* set to none or visible to hide/show outlineNumbers */ + font-size: 10pt; + font-weight: bold; +} + +.topicLineFirst { /* first topic on page */ + font-size: 11pt; + font-weight: bold; +} + +.topicLine { /* other topics on page */ + font-size: 10pt; + font-weight: bold; +} + +/* group of icons */ +.topicIcons { + margin-left: 4px; /* distance to topic text */ + vertical-align: middle; /* center icons around text (important for single line callouts) */ +} + +/* single icons */ +.topicIcon { + margin-right: 3px; /* distance between icons */ +} + + +/*
around whole text notes */ +.topicTextNotes { + font-size: 9pt; + margin-left: 0.3em; + margin-top: 0.5em; +} + +.topicTextNotes div { + margin-bottom: 0.8em; /* distance between paragraphs */ +} + +.topicTextNotes table { + margin-bottom: 0.7em; /* some space below tables and before next paragraph starts */ +} + +.topicTextNotes table div { + margin-left: 0.3em; /* some left and right cell padding */ + margin-right: 0.3em; +} + +.topicTextNotes .lastTableNotesDiv { + margin-bottom: 0em; /* no bottom margin for last paragraph in Notes */ +} + + +/*
around whole text notes in callouts */ +.callouts .topicTextNotes { + font-size: 8pt; + margin-left: 0px; +} + +/* single link, so far used in callout section */ +.topicHyperlink { + font-size: 8pt; +} + +/* the icon behind the link */ +.topicHyperlinkIcon { + vertical-align: bottom; +} + + + +/* commands: active buttons / hot spots or links */ +.command { + white-space: nowrap; +} + +.command img { + display: inline; /* set to none or inline to hide or show command icons */ + vertical-align: bottom; + margin-left: 2px; +} + +.command .label { + display: inline; /* set to none or inline to hide or show command text labels */ + vertical-align: middle; +} + + + +/* MODULE: BOX - MAP GRAPHICS SNIPPET ---------------------------------------------------*/ +/* + div.partialMapArea + table.partialMapTable + div.SubTopicItems + div.subtopicitem + img + a + div.partialMap + img +*/ + +.partialMapArea { + vertical-align: top; + margin-bottom: 10px; /* some distance below this block */ +} + +table#partialMapTable tr td { + padding: 0px; +} + +.subTopicItems { + clear: both; + font-size: 8pt; + font-weight: normal; + margin-left: 10px; + margin-right: 50px; +} + +.subtopicitem { + margin-top: 3px; + margin-bottom: 2px; +} + +.partialMap { + margin-top: 5px; + margin-bottom: 5px; + display: none; /* this value will be set during the export depending on user setting in property inspector */ +} + + +/* MODULE: CALLOUT -SECTION---------------------------------------------------------------------*/ +/* + div.callouts + div.callout + div.calloutHeader + span topicIcons + img.topicIcon + tr.calloutBody + div.calloutImage + img.topicImage + div.topicTextNotes + div Notes + span a.topicGyperlink a.topicHyperlinkIcon +*/ + +/* all callouts */ +.callouts { + background-color: #FAFAFA; /* STYLE */ + width: 360px; + margin-left: 30px; + margin-bottom: 8px; + border: 1px solid #CC0000; /* STYLE */ + border-top: 5px solid #CC0000; /* STYLE */ +} + +/* single callout */ +.callout { + margin-left: 8px; + margin-right: 8px; + margin-top: 0px; + margin-bottom: 3px; +} + +/* topic text and icons */ +.calloutHeader { + font-size: 8pt; + font-weight: bold; + color: #2F4F4F; /* STYLE */ + padding-left: 4px; /* align with text notes */ +} + +.calloutBody { + vertical-align: top; + text-align: left; +} + +.calloutImage { + padding-left: 4px; /* align with text notes */ +} + + +/* -----------------------------------------------------*/ +/* COLLAPSIBLE BOXES +/*-------------------------------------------------------*/ +/* + div.Area (need "Area" string for collapse button script) + div.collapsiblebox (1+) + div.header + span.title + img.expandOrCollapseButton + div.body + (varies) +*/ + +/* the body class is important for the collapse script. It follows the initial .collapsiblebox statement */ +.body { + clear: both; +} + +.clearFloat { + clear: both; /* needed to hold down bottom border sometimes */ +} + + +.collapsiblebox { + clear: both; + width: 360px; + padding-bottom: 0px; + background-color: #D3D3D3; /* STYLE */ + border: 1px solid #CC0000; /* STYLE */ + margin-bottom: 8px; + margin-left: 30px; +} + +.legend .collapsiblebox { + margin-left: 0px; /* overide for the legend box */ +} + +.collapsiblebox .title { + padding: 3px; + padding-left: 6px; + font-size: 8pt; + text-align: left; + font-weight: bold; + color: Black; /* STYLE */ + float: left; +} + +.collapsiblebox .expandOrCollapseButton { + float: right; + text-align: right; + margin-top: 2px; + margin-left: 8px; + margin-right: 4px; + vertical-align: middle; + display: inline; /* set to none to hide button(s); set to inline to show */ +} + +.collapsiblebox .body { + clear: both; + padding-bottom: 1px; + padding-left: 0px; + padding-right: 0px; + background-color: #FAFAFA; /* STYLE */ +} + +/* generic style for lists in boxes e.g. task information or about box */ +.property { + clear: both; + height: 1em; /* since I'm using spans, I need some more line spacing */ +} + +.property .label { + width: 15 em; + font-size: 7pt; + color: gray; /* STYLE */ + text-indent: 6px; +} + +.property .value { + width: auto; + font-size: 8pt; + color: #2F4F4F; /* STYLE */ +} + + +/* MODULES: BOX - TASK INFORMATION ---------------------------------------------------------- */ +.taskInformationArea .body { + display: none; /* collapse when first shown */ +} + + +/* MODULES: BOX - DATA CONTAINER ---------------------------------------------------------- */ + +.dataContainerArea .body { + display: none; /* collapse when first shown */ +} + +.textMarkersArea .body { + display: none; /* collapse when first shown */ +} + +.dataContainerTable { + table-layout: fixed; + width: 100%; + clear: both; + height: 1em; /* since I'm using spans, I need some more line spacing */ +} + +.dataContainerTableColumnHeader { + width: 15 em; + font-size: 7pt; + color: gray; /* STYLE */ + text-indent: 6px; +} + +.dataContainerTableRowHeader { + width: 15 em; + font-size: 7pt; + color: gray; /* STYLE */ + text-indent: 6px; +} + +.dataContainerTableCell { + width: auto; + font-size: 8pt; + color: #2F4F4F; /* STYLE */ +} + +.dataContainerCustomProperties { + width: 100%; + clear: both; + height: 1em; /* since I'm using spans, I need some more line spacing */ +} + +.dataContainerCustomPropertyGroup { + width: 15 em; + font-size: 7pt; + color: white; + background-color: gray; + text-indent: 6px; +} + +.dataContainerCustomPropertyName{ + width: 15 em; + font-size: 7pt; + color: gray; /* STYLE */ + text-indent: 6px; +} + +.dataContainerCustomPropertyNameInGroup{ + width: 15 em; + font-size: 7pt; + color: gray; /* STYLE */ + text-indent: 12px; +} + + +.dataContainerCustomPropertyValue{ + width: auto; + font-size: 8pt; + color: #669999; /* STYLE */ +} + +.dataContainerImage { + margin-right: 1px; /* distance to outline */ +} + + +/* MODULES: BOX - REVIEW COMMMENT ---------------------------------------------------------- */ +.comment { + clear: both; +} + +.commentsArea .body { + display: none; /* collapse when first shown */ + font-size: 8pt; + color: #2F4F4F; /* STYLE */ +} + +.comment .userName { + font-weight: bold; + float: left; + margin-bottom: 0px; + padding-left: 6px; +} + +.comment .date { + font-weight: bold; + float: right; + margin-bottom: 0px; + padding-right: 6px; +} + +.comment .text { + clear: both; + padding-bottom: 4px; /* makes bottom 'border' bigger on opera */ + padding-right: 6px; + padding-left: 6px; +} + + +/* MODULE: RELATED SECTION ----------------------------------------------------------------------*/ +/* + div.relatedSection + div.oneRelatedSection + a topicHyperlink + div.relatedSectionBody + div.relatedItem + span relatedItemBullet + a topicHyperlink + a topicHyperlink (optional callout link) + img topicHyperlinkIcon +*/ + +.relatedSection { +} + +.oneRelatedSection { + margin-top: 16px; + margin-bottom: 8px; +} + +.relatedSectionHeader { + font-size: 8pt; + font-weight: bold; + padding-left: 4px; /* align with text notes */ +} + +.relatedItem { + font-size: 8pt; + margin-top: 1px; + margin-bottom: 2px; +} + +.relatedItemBullet { + padding-left: 4px; /* align with text notes */ +} + +/* the icon behind the link */ +.relatedItem .topicHyperlinkIcon { + vertical-align: middle; +} + +/* MODULE: TOP COMMAND ----------------------------------------------------------*/ +.topCommand { + vertical-align: bottom; + font-size: 7pt; + margin-top: 10mm; + margin-bottom: 2mm; +} + +.topCommand a:link { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + +.topCommand a:visited { + text-decoration: none; /* set to "none" to hide underlines on links */ + color: #CC0000; /* STYLE */ /* don't show visited colors for prev/next navigation */ +} + +.topCommand a:hover { + text-decoration: none; /* set to "none" to hide underlines on links */ +} +.topCommand a:active { + text-decoration: none; /* set to "none" to hide underlines on links */ +} + + + + +/**********************************************************************************************/ +/******** OTHER WINDOW LAYOUTS ****************************************************************/ +/**********************************************************************************************/ +/* WINDOW: LEGEND ------------------------------------------------------------- */ +/* + .div legend + .div collapsiblebox + .div body + .div legendGroup + .div legendItem + .div item + .div label +*/ + +.legend { + margin-left: 6px; + margin-top: 6px; + font-size: 8pt; + color: Gray; /* STYLE */ + width: 200px; +} + +/* set with of both divs to avoid right border if text wraps */ +.legend .collapsiblebox { + width: 200px; +} + +.legend .collapsiblebox .body { + width: 200px; + border: 1px solid #999999; +} + +.legendGroup +{ + clear: both; + font-weight: bold; + float: left; + margin-top: 5px; + margin-bottom: 4px; + margin-left: 5px; +} + +.legendItem +{ + clear: both; + margin-left: 5px; +} + +.legendItem .item { + float: left; + margin-right: 6px; +} + +.legendItem .label { + float: left; + margin-right: 2px; +} + + +/* WINDOW: CONTENT ------------------------------------------------------------- */ +/* + div.Page + table.pageBody + col.TOCContents + div.body + div.contentItem1[1-9] + div.outlineNumber + div.topicLine + a topicHyperlink + col.TOCAbout + div.collapsiblebox + div.header + div.body + div.mapPreview + img + div.property + div.label + div.value + +*/ + +.TOCContents { + text-align: left; + vertical-align: top; + width: 90%; +} + +.TOCContents .body { + margin: 15px; + margin-right: 5px; + color: #CC0000; /* STYLE */ + font-size: 8pt; + font-weight: normal; +} + +.TOCAbout { + text-align: right; + vertical-align: top; + width: 10%; +} + +.TOCAbout .collapsiblebox { + margin: 15px; + margin-right: 5px; +} + +.TOCAbout .property { + margin-top: 5px; +} + +.TOCAbout .property .label { + float: left; + text-align: left; + width: 7.5em; +} + +.TOCAbout .property .value { + float: left; + text-align: left; + margin-left: 1.0em; +} + +.mapPreview { + padding-top: 10px; + padding-bottom: 16px; + text-align: center; + border-bottom: 1px solid #CC0000; +} + +.contentItem1 { + margin-top: 5px; + clear: both; +} + +.contentItem2 { + margin-top: 3px; + margin-left: 2em; + clear: both; +} + +.contentItem3 { + margin-left: 4em; + clear: both; +} + +.contentItem4 { + margin-left: 6em; + clear: both; +} + +.contentItem5 { + margin-left: 8em; + clear: both; +} + +.contentItem6 { + margin-left: 10em; + clear: both; +} + +.contentItem7 { + margin-left: 12em; + clear: both; +} + +.contentItem8 { + margin-left: 14em; + clear: both; +} + +.contentItem9 { + margin-left: 16em; + clear: both; +} + +.contentItemX { + margin-left: 18em; + clear: both; +} + + +/* WINDOW: OVERVIEW MAP ------------------------------------------------------------- */ +/* + body overviewMapBody + .div overviewDiv + img mapOverview + img mapDetailed +*/ + +.overviewMapBody { + background-color: Gray; /* STYLE */ +} + +.overviewDiv { + cursor: hand; + text-align: center; + margin-top: 10px; /* remove once we can center horizontally */ +} + +img#mapOverview, img#mapDetailed { + margin: 0px; +} + +body#mapPageFooter { + font-family: Verdana; + font-size: 8pt; + text-align: center; + padding-top: 3px; + vertical-align: middle; + color: white; /* STYLE */ + background-color: #CC0000; /* STYLE */ + border-top: 2px solid #FFCC66; +} + + + diff --git a/static/Res/tree/base.gif b/static/Res/tree/base.gif new file mode 100644 index 0000000000000000000000000000000000000000..25a0c024f7e3e14fb951e99c7b19c5f5cb6152e9 GIT binary patch literal 1103 zcmb`Gdrwn$06;HNH&8Tg(PeCGVFZ#*I--#!=w<|&fU+$(hZA)h?`T8^#E|R>Y>c-N zq|^eHB9>B+B10(XrPhv8D20UrEtD3p^hpcl_V#rjrN8NS*!ch_=bw{!Iw9t0#(wBc z$OAz@mb+$gWoOaBL{?4?!{fmmIPk(ZKubmg(idS@JEPNQnGW83(IA+rN%jz(jWuUNOm zf9Z6aHj5E=I|w&&nn<>S z4rxi?sWz&3%kI7c7GI?>J7?IpaTkJnux%U_YmvE@BH^TtB{KHuFcxE^0X8gcdO_z& zY#YqYX_d<+Q~p6%vkAISz@fX?3(gJ=33%~@-2@&cNW0iL=`}Nw5f|QF(>V2n4#qR9 zTb_Akb+vb46bI@heNBhKXqt~6<)cx(?MXh&4g?njE4Ede2Z$~% zt~;61jmMK~UO_3C%pn}>4H9Hx6&)6+hAMx-x0W<&W4}Pr8yhbgThiM}mlM0smv=9_ zTW1|U-!|Z%9ha)uLo;1dmgmwHa;gk>y9{ISq`^^NC$x0`Ha5O!v13x{3!mgFU%fH< zVry*0X6vj4(#s@C*3#j%4VQSqY(X*W%XIcpFr8<|d=JDXozUQg z)4zJ>q;#3fmvgm1x`yb@TQ1%Wg+fmoQi=yf06uRE8_o2;wXY;5Im{V%cAD;gCSxUJ^iay{%=2^6KfQtKOa0DKv!jpn8x~?O zrw!QK4Hb*DWBvc^sqX)BzCP36|K=`9&#jt_A96*g-j8u8m01{}>@ZA)?fgy?1IM*Z zL`G&&Rl!`nGU5m$Gw5_t=gA#@Hz|U*{jR15P|Krc+KiEx?q8r#t|TeK16#`*L-R{T zCG|VQBGEdtT*e4_ckk|xzbFjrJyo7sajcdo;L!#GgCp|Vp^i)JgwDbbBULj8_@U|4 P6sVZ;R!mAP1bzA+)n%G} literal 0 HcmV?d00001 diff --git a/static/Res/tree/empty.gif b/static/Res/tree/empty.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9cbc72046bb578e2cad73c9959bb8759b4cd727 GIT binary patch literal 102 zcmZ?wbhEHb6k-r!*v!E2|NnmmqQQ^-DvCc@7#SG&8FWCJKxQzo2!A-~xq7d~>$AK6 QCusDgWX{u&Vq~xe01g)u00000 literal 0 HcmV?d00001 diff --git a/static/Res/tree/folder.gif b/static/Res/tree/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc04e0e06af86b96541412b366ac5d8527279f39 GIT binary patch literal 998 zcmZ?wbhEHb6k!lz_|Cv^@7}$yU%&qU(zm%m>iF^Fr)L;7H8pj2ch5{?*xRLYs9$ql zHtWf023wnC{y%G&lgWIbSAAEz;<{?l+}zw*>5MyC#BE-Qkfq|h(JYfcUfmsVP~-pqofcbV?i}my z`Vc?ezQi@00*7-CpINKYwo6uwnD&%@emzjEs!DbZAlU zuHJ|s*BC$3=g*(tJiq7vr&E`umrS6}c`2YXu zsZ*!kx^?T?vBl}3dVhYtf4D8=(#{6$siMA}_6}{j;laKIVanXCY)@_-zq8qPPO(UQ zu;qtiiGO}x`~PlAfS2vdv$6j_&E7v*_x)kttgNi}59WV57xU-qGu>Qv?THfq|G(b3 zbEnlz^+(tC{QrN`vO(eI{)Yem@9giFxwtN&KU3h(pFg_AQa^9@ukW?_|NlUAbhPD6 zb-8~2ix)47c5zRxa=5mqOnJ3X#yR^>r*h{uTAx|(850xZ=H`}v)gy4b-kv>sF3vOj z|Nr^_*RB7*_W%Ds^Z)<<45I*B2>jTuqWF`A5ts`YbU^Z;Ji);6kKsS3jK_urj*Uzj z2?`1aTpF8MS#1(Fw6H0QSjaj3QJ;8_iG3DR%FZW=kN5M=v~%MyNbqUqud7=!F`J~_g_w6%YyYhvaYK{t~hi~mJa9;ZdNK<(mb`v z^Ok_n$CaC&`WN|eJPf|zAi^IVI%jg@pE(}L31)>(0D7A7@1JXiFIxbV@C zqq|#Q#^}k0#0^f}maXSD7;fg^n$8^@p35JG(GEF_Ucp>D}yxvd9xZA literal 0 HcmV?d00001 diff --git a/static/Res/tree/joinbottom.gif b/static/Res/tree/joinbottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..9e02eb2620497f5817f9944cdda652a33474417a GIT binary patch literal 80 zcmZ?wbhEHb6k-r!n8*ME|NsBryLT^;RQ$=p$iTqNpaT*G$ulr1&arPgy^J@wC4XHO d|G7!o>p35Jm_?UGz1-ra%W74~zK@l`8UP9H8b1I4 literal 0 HcmV?d00001 diff --git a/static/Res/tree/leaf.gif b/static/Res/tree/leaf.gif new file mode 100644 index 0000000000000000000000000000000000000000..a172981229eaba2366fa75cb936f9ba5cf2950c1 GIT binary patch literal 59 zcmZ?wbhEHb6k-r!XkcKNF=NL6|Nj+#vapIUFf!;c00Bsbfk~*Rf92`7{EO$5FgfJk M-SeB@jg`R~0Q6T8#sB~S literal 0 HcmV?d00001 diff --git a/static/Res/tree/line.gif b/static/Res/tree/line.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9b3f27216bfaf99571eff76533ca4c1913e1692 GIT binary patch literal 77 zcmZ?wbhEHb6k-r!n8*ME|NsBryLT^;RQ$=p$iTqNpaT*G$uls?&9QGfy^J@wC4XHO a|G7!o{~Kj@q%JM>%iI$5=*3o625SJ!i5r9f literal 0 HcmV?d00001 diff --git a/static/Res/tree/minus.gif b/static/Res/tree/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..48a0d68ecb6c1a072e4dba2d1d2c7932d197bcaf GIT binary patch literal 159 zcmV;Q0AT+|Nk%w1VG;lm0J8u9|NsB{`}_Cz_w)1f@9*#G>gwj^=HlYw-rnBY+S=CE z*3#0_UteDU00960|M*mdy*REZ=diCn%%a<=*y0mxi-uU=r&)yT z;+*ApRGA75Zn<1u-rQ*-#>viB5g;SQ(9yxntft!6=cJY)$i>RUIHP5vgeX4;%Z!;} nqC$M^%nKQ3sjCU{^RP`{xH@F3zt?sT@14%O_xSlbGFSru!GV($doJ-@osj<2Pf*j9a&Eojv>P;JKSCC*&_2pN-n(W{ikkx`t<4G`D^cA z-Z^sY(emZXFJ8R(`s?T2XD?)DXFq@beB$KEa~Ch(clOH8ZI^fM+_`x1;)f3(Ha9n~ zS+nNwsgs}Hz1Vi@-2QV{@7}%p;L5I++?+kDCN6EW{qy(ln{Qvf|Nd1_P;lqYo$~Sn zwRLqbzkK@t|3AYh7!3i85csiQMe!#KBLl;K1|5(jC{HkOY-9M(DdVwWfn&35NDjlH zR3r6)tFnNClUN)n*x- z>|Eo$dy?*qBThG#Wpk=!PB38zT^vyTpyXrXab_MPwFea|7>@9;NhLU(2zrbG-Jhow9f9-o0C|?FE8k=k}hvb_@ibpF8*b+SZn9 zd%dn*yLRv1z312VK7aoF{k^^KpC5bw{M`HJ_ujw1_WnJPeE*=7#f3`x@K#K?dedQ z{LGPEGGvN`Bh%4y^E8?_MVxx{;>;2)zX=L~hgi=qx1VbCw&3b=#|2tGQzULL(hgas zvqR~u)HfF{QNO)nEVGg_&+RY`UE;CP>2NC>r_c%28BB+nfDUERn6RL+O@uGLp@TuO Tsf}OWp(EkNhT`W93=Gx))#x9o literal 0 HcmV?d00001 diff --git a/static/Res/tree/plus.gif b/static/Res/tree/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..acd5b816c002dc0fc19a911323946a5f0ca2174a GIT binary patch literal 155 zcmV;M0A&A1Nk%w1VG;lm0J8u9|NsB{`}_Cz_w)1f@9*#G>gwj^=HlYw-rnBY+S=CE z*3#0_UteDU00960|MBx?2(&4i J&**Xl06RCxNc8{! literal 0 HcmV?d00001 diff --git a/static/Res/tree/plusbottom.gif b/static/Res/tree/plusbottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a7af256b48d4ecdccb54d665ec73279969acf6a GIT binary patch literal 346 zcmZ?wbhEHb6k-r!xXJ(m|NsC0_wV1|zkmPy`Sbht@1H+^{`m3Z+qZ9DzkdDl<;&;K zpFe&2^zq}z4W` zV8JEW@3GMEq>fqpq7@}tUR_KPYZ?+PLMC3%Nl0+e*mvAOEWp7;A!CshgMoq4WQ!8s z7tC5>N{Y?RPD)J7tZWSYq7qV7Z84lY^-?mj6P1Y*d0&dFd6 E0LL36wEzGB literal 0 HcmV?d00001 diff --git a/static/Res/tree/tree.js b/static/Res/tree/tree.js new file mode 100644 index 0000000..7ac7016 --- /dev/null +++ b/static/Res/tree/tree.js @@ -0,0 +1,9 @@ +// Title: Tigra Tree Menu PRO +// URL: http://www.softcomplex.com/products/tigra_menu_tree_pro/ +// Version: 1.1 +// Date: 04-30-2003 (mm-dd-yyyy) +// Technical Support: support@softcomplex.com (specify product title and order ID) +// Notes: Registration needed to use this script legally. +// Visit official site for details. + +function tree(ttmpA,ttmpB){this.a_tpl=ttmpB;this.a_config=ttmpA;this.o_root=this;this.a_index=[];this.a_nodes=[];this.o_selected=null;this.n_depth=-1;var ttmpC=new Image(),ttmpD=new Image();ttmpC.src=ttmpB['icon_e'];ttmpD.src=ttmpB['icon_l'];ttmpB['im_e']=ttmpC;ttmpB['im_l']=ttmpD;for(var i=0;i<128;i++)if(ttmpB['icon_'+i]){var ttmpE=new Image();ttmpB['im_'+i]=ttmpE;ttmpE.src=ttmpB['icon_'+i]}this.toggle=function(n_id){var ttmpF=this.a_index[n_id];ttmpF.open(ttmpF.n_state&8)};this.select=function(n_id){return this.a_index[n_id].select()};this.mover=function(n_id){var ttmpF=this.a_index[n_id];ttmpF.ttmpG();ttmpF.mover(true)};this.mout=function(n_id){var ttmpF=this.a_index[n_id];ttmpF.ttmpG(true);ttmpF.mout(true)};this.find_item=function(ttmpH){for(var i=0;i3){n_id=this.n_id;this.a_children=[];while(true){n_id++;if(n_id==a_index.length)break;if(a_index[n_id].n_depth<=this.n_depth)break;if(a_index[n_id].n_depth==this.n_depth+1){a_index[n_id].ttmpP=ttmpQ;this.a_children[this.a_children.length]=a_index[n_id]}}this.open=ttmpR;this.save=ttmpg;this.load=ttmph;this.ttmpX=ttmpi}else{this.open=function(){alert("Only nodes can be opened. id="+this.n_id)};this.load=function(){return}}this.n_state=(this.n_depth?0:32)+(this.a_children?16:0)+(this.n_order==this.o_parent.a_children.length-1?1:0);var ttmpj=(this.o_root.a_tpl['style_icons']?' class="'+this.o_root.a_tpl['style_icons']+'"':''),ttmpk=[],ttmpl=this.o_parent,ttmpm=this.a_config[2];for(var i=this.n_depth;i>1;i--){ttmpk[i]='';ttmpl=ttmpl.o_parent}this.load();var ttmpn=this.state_lookup(true);return '
'+ttmpk.join('')+(ttmpn[1]?(this.a_children?'':''):'')+(ttmpn[0]?'':'')+''+this.a_config[0]+'
'+(this.a_children?'
'+this.ttmpX():'none">')+'
':'')}function ttmpi(){var ttmpo=[];for(var i=0;i