231 lines
7.1 KiB
JavaScript
231 lines
7.1 KiB
JavaScript
|
/*
|
||
|
To compress this file you can use Dojo ShrinkSafe compressor at
|
||
|
http://alex.dojotoolkit.org/shrinksafe/
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Singleton class. Requires behaviour.js from BehaviourContrib.
|
||
|
*/
|
||
|
TWiki.TwistyPlugin = new function () {
|
||
|
|
||
|
var self = this;
|
||
|
|
||
|
/**
|
||
|
Retrieves the name of the twisty from an HTML element id. For example 'demotoggle' will return 'demo'.
|
||
|
@param inId : (String) HTML element id
|
||
|
@return String
|
||
|
@privileged
|
||
|
*/
|
||
|
this._getName = function (inId) {
|
||
|
var re = new RegExp("(.*)(hide|show|toggle)", "g");
|
||
|
var m = re.exec(inId);
|
||
|
var name = (m && m[1]) ? m[1] : "";
|
||
|
return name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Retrieves the type of the twisty from an HTML element id. For example 'demotoggle' will return 'toggle'.
|
||
|
@param inId : (String) HTML element id
|
||
|
@return String
|
||
|
@privileged
|
||
|
*/
|
||
|
this._getType = function (inId) {
|
||
|
var re = new RegExp("(.*)(hide|show|toggle)", "g");
|
||
|
var m = re.exec(inId);
|
||
|
var type = (m && m[2]) ? m[2] : "";
|
||
|
return type;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Toggles the collapsed state. Calls _update().
|
||
|
@privileged
|
||
|
*/
|
||
|
this._toggleTwisty = function (ref) {
|
||
|
if (!ref) return;
|
||
|
ref.state = (ref.state == TWiki.TwistyPlugin.CONTENT_HIDDEN) ? TWiki.TwistyPlugin.CONTENT_SHOWN : TWiki.TwistyPlugin.CONTENT_HIDDEN;
|
||
|
self._update(ref, true);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Updates the states of UI trinity 'show', 'hide' and 'content'.
|
||
|
Saves new state in a cookie if one of the elements has CSS class 'twistyRememberSetting'.
|
||
|
@param ref : (Object) TWiki.TwistyPlugin.Storage object
|
||
|
@privileged
|
||
|
*/
|
||
|
this._update = function (ref, inMaySave) {
|
||
|
var showControl = ref.show;
|
||
|
var hideControl = ref.hide;
|
||
|
var contentElem = ref.toggle;
|
||
|
if (ref.state == TWiki.TwistyPlugin.CONTENT_SHOWN) {
|
||
|
// show content
|
||
|
addClass(showControl, 'twistyHidden'); // hide 'show'
|
||
|
removeClass(hideControl, 'twistyHidden'); // show 'hide'
|
||
|
removeClass(contentElem, 'twistyHidden'); // show content
|
||
|
} else {
|
||
|
// hide content
|
||
|
removeClass(showControl, 'twistyHidden'); // show 'show'
|
||
|
addClass(hideControl, 'twistyHidden'); // hide 'hide'
|
||
|
addClass(contentElem, 'twistyHidden'); // hide content
|
||
|
}
|
||
|
if (inMaySave && ref.saveSetting) {
|
||
|
setPref(TWiki.TwistyPlugin.COOKIE_PREFIX + ref.name, ref.state);
|
||
|
}
|
||
|
if (ref.clearSetting) {
|
||
|
setPref(TWiki.TwistyPlugin.COOKIE_PREFIX + ref.name, "");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Stores a twisty HTML element (either show control, hide control or content 'toggle').
|
||
|
@param e : (Object) HTMLElement
|
||
|
@privileged
|
||
|
*/
|
||
|
this._register = function (e) {
|
||
|
if (!e) return;
|
||
|
var name = self._getName(e.id);
|
||
|
var ref = self._storage[name];
|
||
|
if (!ref) {
|
||
|
ref = new TWiki.TwistyPlugin.Storage();
|
||
|
}
|
||
|
if (hasClass(e, "twistyRememberSetting")) ref.saveSetting = true;
|
||
|
if (hasClass(e, "twistyForgetSetting")) ref.clearSetting = true;
|
||
|
if (hasClass(e, "twistyStartShow")) ref.startShown = true;
|
||
|
if (hasClass(e, "twistyStartHide")) ref.startHidden = true;
|
||
|
if (hasClass(e, "twistyFirstStartShow")) ref.firstStartShown = true;
|
||
|
if (hasClass(e, "twistyFirstStartHide")) ref.firstStartHidden = true;
|
||
|
ref.name = name;
|
||
|
var type = self._getType(e.id);
|
||
|
ref[type] = e;
|
||
|
self._storage[name] = ref;
|
||
|
switch (type) {
|
||
|
case 'show': // fall through
|
||
|
case 'hide':
|
||
|
e.onclick = function() {
|
||
|
self._toggleTwisty(ref);
|
||
|
return false;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return ref;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Key-value set of TWiki.TwistyPlugin.Storage objects. The value is accessed by twisty id identifier name.
|
||
|
@example var ref = self._storage["demo"];
|
||
|
@privileged
|
||
|
*/
|
||
|
this._storage = {};
|
||
|
|
||
|
/**
|
||
|
UI element behaviour, in case no javascript 'trigger' tags are inserted in the html
|
||
|
@privileged
|
||
|
*/
|
||
|
this._UIbehaviour = {
|
||
|
/**
|
||
|
Show control, hide control
|
||
|
*/
|
||
|
'.twistyTrigger' : function(e) {
|
||
|
TWiki.TwistyPlugin.init(e.id);
|
||
|
},
|
||
|
/**
|
||
|
Content element
|
||
|
*/
|
||
|
'.twistyContent' : function(e) {
|
||
|
TWiki.TwistyPlugin.init(e.id);
|
||
|
},
|
||
|
/**
|
||
|
Content element
|
||
|
*/
|
||
|
'.twistyExpandAll' : function(e) {
|
||
|
e.onclick = function() {
|
||
|
TWiki.TwistyPlugin.toggleAll(TWiki.TwistyPlugin.CONTENT_SHOWN);
|
||
|
}
|
||
|
},
|
||
|
'.twistyCollapseAll' : function(e) {
|
||
|
e.onclick = function() {
|
||
|
TWiki.TwistyPlugin.toggleAll(TWiki.TwistyPlugin.CONTENT_HIDDEN);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
Behaviour.register(this._UIbehaviour);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
Public constants.
|
||
|
*/
|
||
|
TWiki.TwistyPlugin.CONTENT_HIDDEN = 0;
|
||
|
TWiki.TwistyPlugin.CONTENT_SHOWN = 1;
|
||
|
TWiki.TwistyPlugin.COOKIE_PREFIX = "TwistyContrib_";
|
||
|
|
||
|
/**
|
||
|
The cached full TWiki cookie string so the data has to be read only once during init.
|
||
|
*/
|
||
|
TWiki.TwistyPlugin.prefList;
|
||
|
|
||
|
/**
|
||
|
Initializes a twisty HTML element (either show control, hide control or content 'toggle') by registering and setting the visible state.
|
||
|
Calls _register() and _update().
|
||
|
@public
|
||
|
@param inId : (String) id of HTMLElement
|
||
|
@return The stored TWiki.TwistyPlugin.Storage object.
|
||
|
*/
|
||
|
TWiki.TwistyPlugin.init = function(inId) {
|
||
|
var e = document.getElementById(inId);
|
||
|
if (!e) return;
|
||
|
|
||
|
// check if already inited
|
||
|
var name = this._getName(inId);
|
||
|
var ref = this._storage[name];
|
||
|
if (ref && ref.show && ref.hide && ref.toggle) return ref;
|
||
|
|
||
|
// else register
|
||
|
ref = this._register(e);
|
||
|
|
||
|
if (hasClass(e, "twistyMakeHidden")) replaceClass(e, "twistyMakeHidden", "twistyHidden");
|
||
|
if (hasClass(e, "twistyMakeVisible")) removeClass(e, "twistyMakeVisible");
|
||
|
|
||
|
if (ref.show && ref.hide && ref.toggle) {
|
||
|
// all Twisty elements present
|
||
|
if (TWiki.TwistyPlugin.prefList == null) {
|
||
|
// cache complete cookie string
|
||
|
TWiki.TwistyPlugin.prefList = getPrefList();
|
||
|
}
|
||
|
var cookie = getPrefValueFromPrefList(TWiki.TwistyPlugin.COOKIE_PREFIX + ref.name, TWiki.TwistyPlugin.prefList);
|
||
|
if (ref.firstStartHidden) ref.state = TWiki.TwistyPlugin.CONTENT_HIDDEN;
|
||
|
if (ref.firstStartShown) ref.state = TWiki.TwistyPlugin.CONTENT_SHOWN;
|
||
|
// cookie setting may override firstStartHidden and firstStartShown
|
||
|
if (cookie && cookie == "0") ref.state = TWiki.TwistyPlugin.CONTENT_HIDDEN;
|
||
|
if (cookie && cookie == "1") ref.state = TWiki.TwistyPlugin.CONTENT_SHOWN;
|
||
|
// startHidden and startShown may override cookie
|
||
|
if (ref.startHidden) ref.state = TWiki.TwistyPlugin.CONTENT_HIDDEN;
|
||
|
if (ref.startShown) ref.state = TWiki.TwistyPlugin.CONTENT_SHOWN;
|
||
|
this._update(ref, false);
|
||
|
}
|
||
|
return ref;
|
||
|
}
|
||
|
|
||
|
TWiki.TwistyPlugin.toggleAll = function(inState) {
|
||
|
var i;
|
||
|
for (var i in this._storage) {
|
||
|
var e = this._storage[i];
|
||
|
e.state = inState;
|
||
|
this._update(e, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Storage container for properties of a twisty HTML element: show control, hide control or toggle content.
|
||
|
*/
|
||
|
TWiki.TwistyPlugin.Storage = function () {
|
||
|
this.name; // String
|
||
|
this.state = TWiki.TwistyPlugin.CONTENT_HIDDEN; // Number
|
||
|
this.hide; // HTMLElement
|
||
|
this.show; // HTMLElement
|
||
|
this.toggle; // HTMLElement (content element)
|
||
|
this.saveSetting = false; // Boolean; default not saved
|
||
|
this.clearSetting = false; // Boolean; default not cleared
|
||
|
this.startShown; // Boolean
|
||
|
this.startHidden; // Boolean
|
||
|
this.firstStartShown; // Boolean
|
||
|
this.firstStartHidden; // Boolean
|
||
|
}
|