You've already forked proefschrift
184 lines
6.6 KiB
JavaScript
184 lines
6.6 KiB
JavaScript
/*
|
|
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;
|
|
}
|
|
}
|
|
|