327 lines
8.7 KiB
JavaScript
Executable File
327 lines
8.7 KiB
JavaScript
Executable File
/**
|
|
* @fileOverview Contains standard code in the namespace 'wbos' and code specifically written for Codeview in the namespace 'codeview'
|
|
* @author Wouter Bos (www.thebrightlines.com)
|
|
* @since 1.0 - 2010-09-10
|
|
* @version 1.0 - 2010-09-10
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof(wbos) == "undefined") {
|
|
/**
|
|
* @namespace Standard code of Wouter Bos (wbos)
|
|
*/
|
|
wbos = {}
|
|
}
|
|
if (typeof(wbos.CssTools) == "undefined") {
|
|
/**
|
|
* @namespace Namespace for CSS-related functionality
|
|
*/
|
|
wbos.CssTools = {}
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
* @namespace Fallback for CSS advanced media query
|
|
* @class
|
|
* @since 1.0 - 2010-09-10
|
|
* @version 1.0 - 2010-09-10
|
|
*/
|
|
wbos.CssTools.MediaQueryFallBack = ( function() {
|
|
var config = {
|
|
cssScreen: "/css/screen.css",
|
|
cssHandheld: "/css/handheld.css",
|
|
mobileMaxWidth: 660,
|
|
testDivClass: "cssLoadCheck",
|
|
dynamicCssLinkId: "DynCssLink",
|
|
resizeDelay: 30
|
|
}
|
|
var noMediaQuery = false;
|
|
var delay;
|
|
var currentCssMediaType;
|
|
|
|
// Adding events to elements in the DOM without overwriting it
|
|
function addEvent(element, newFunction, eventType) {
|
|
var oldEvent = eval("element." + eventType);
|
|
var eventContentType = eval("typeof element." + eventType)
|
|
|
|
if ( eventContentType != 'function' ) {
|
|
eval("element." + eventType + " = newFunction")
|
|
} else {
|
|
eval("element." + eventType + " = function(e) { oldEvent(e); newFunction(e); }")
|
|
}
|
|
}
|
|
|
|
// Get the the inner width of the browser window
|
|
function getWindowWidth() {
|
|
if (window.innerWidth) {
|
|
return window.innerWidth;
|
|
} else if (document.documentElement.clientWidth) {
|
|
return document.documentElement.clientWidth;
|
|
} else if (document.body.clientWidth) {
|
|
return document.body.clientWidth;
|
|
} else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
function addCssLink(cssHref) {
|
|
var cssNode = document.createElement('link');
|
|
var windowWidth;
|
|
cssNode.type = 'text/css';
|
|
cssNode.rel = 'stylesheet';
|
|
cssNode.media = 'screen, handheld, fallback';
|
|
cssNode.href = cssHref;
|
|
document.getElementsByTagName("head")[0].appendChild(cssNode);
|
|
}
|
|
|
|
|
|
|
|
/* Start public */
|
|
return {
|
|
/**
|
|
* Adds link to CSS in the head if no CSS is loaded
|
|
*
|
|
* @since 1.0 - 2010-08-21
|
|
* @version 1.0 - 2010-08-21
|
|
* @param {String|Object} cssScreen URL to CSS file for larger screens
|
|
* @param {String|Object} cssHandheld URL to CSS file for smaller screens
|
|
* @param {Number} mobileMaxWidth Maximum width for handheld devices
|
|
* @example
|
|
* wbos.CssTools.MediaQueryFallBack.LoadCss(['screen.css', 'screen2.css'], 'mobile.css', 480)
|
|
*/
|
|
LoadCss: function(cssScreen, cssHandheld, mobileMaxWidth) {
|
|
// Set config values
|
|
if (typeof(cssScreen) != "undefined") {
|
|
config.cssScreen = cssScreen;
|
|
}
|
|
if (typeof(cssHandheld) != "undefined") {
|
|
config.cssHandheld = cssHandheld;
|
|
}
|
|
if (typeof(mobileMaxWidth) != "undefined") {
|
|
config.mobileMaxWidth = mobileMaxWidth;
|
|
}
|
|
|
|
// Check if CSS is loaded
|
|
var cssloadCheckNode = document.createElement('div');
|
|
cssloadCheckNode.className = config.testDivClass;
|
|
document.getElementsByTagName("body")[0].appendChild(cssloadCheckNode);
|
|
if (cssloadCheckNode.offsetWidth != 100 && noMediaQuery == false) {
|
|
noMediaQuery = true;
|
|
}
|
|
cssloadCheckNode.parentNode.removeChild(cssloadCheckNode)
|
|
|
|
if (noMediaQuery == true) {
|
|
// Browser does not support Media Queries, so JavaScript will supply a fallback
|
|
var cssHref = "";
|
|
|
|
// Determines what CSS file to load
|
|
if (getWindowWidth() <= config.mobileMaxWidth) {
|
|
cssHref = config.cssHandheld;
|
|
newCssMediaType = "handheld";
|
|
} else {
|
|
cssHref = config.cssScreen;
|
|
newCssMediaType = "screen";
|
|
}
|
|
|
|
// Add CSS link to <head> of page
|
|
if (cssHref != "" && currentCssMediaType != newCssMediaType) {
|
|
var currentCssLinks = document.styleSheets
|
|
for (var i = 0; i < currentCssLinks.length; i++) {
|
|
for (var ii = 0; ii < currentCssLinks[i].media.length; ii++) {
|
|
if (typeof(currentCssLinks[i].media) == "object") {
|
|
if (currentCssLinks[i].media.item(ii) == "fallback") {
|
|
currentCssLinks[i].ownerNode.parentNode.removeChild(currentCssLinks[i].ownerNode)
|
|
i--
|
|
break;
|
|
}
|
|
} else {
|
|
if (currentCssLinks[i].media.indexOf("fallback") >= 0) {
|
|
currentCssLinks[i].owningElement.parentNode.removeChild(currentCssLinks[i].owningElement)
|
|
i--
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (typeof(cssHref) == "object") {
|
|
for (var i = 0; i < cssHref.length; i++) {
|
|
addCssLink(cssHref[i])
|
|
}
|
|
} else {
|
|
addCssLink(cssHref)
|
|
}
|
|
|
|
currentCssMediaType = newCssMediaType;
|
|
}
|
|
|
|
|
|
// Check screen size again if user resizes window
|
|
addEvent(window, wbos.CssTools.MediaQueryFallBack.LoadCssDelayed, 'onresize')
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Runs LoadCSS after a short delay
|
|
*
|
|
* @since 1.0 - 2010-08-21
|
|
* @version 1.0 - 2010-08-21
|
|
* @example
|
|
* wbos.CssTools.MediaQueryFallBack.LoadCssDelayed()
|
|
*/
|
|
LoadCssDelayed: function() {
|
|
clearTimeout(delay);
|
|
delay = setTimeout( "wbos.CssTools.MediaQueryFallBack.LoadCss()", config.resizeDelay)
|
|
}
|
|
|
|
}
|
|
/* End public */
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* @namespace Adds a function to an event of a single element. Use this if
|
|
* you don't want to use jQuery
|
|
* @class
|
|
* @since 1.0 - 2010-02-23
|
|
* @version 1.0 - 2010-02-23
|
|
*/
|
|
wbos.Events = ( function() {
|
|
/* Start public */
|
|
return {
|
|
/**
|
|
* Adds a function to an event of a single element
|
|
*
|
|
* @since 1.0 - 2010-02-23
|
|
* @version 1.0 - 2010-02-23
|
|
* @param {Object} element The element on which the event is placed
|
|
* @param {Function} newFunction The function that has to be linked to the event
|
|
* @param {String} eventType Name of the event
|
|
* @example
|
|
* wbos.Events.AddEvent( document.getElementById('elementId'), functionName, "onclick" )
|
|
*/
|
|
AddEvent: function( element, newFunction, eventType ) {
|
|
var oldEvent = eval("element." + eventType);
|
|
var eventContentType = eval("typeof element." + eventType)
|
|
|
|
if ( eventContentType != 'function' ) {
|
|
eval("element." + eventType + " = newFunction")
|
|
} else {
|
|
eval("element." + eventType + " = function(e) { oldEvent(e); newFunction(e); }")
|
|
}
|
|
}
|
|
}
|
|
/* End public */
|
|
})();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof(codeview) == "undefined") {
|
|
/**
|
|
* @namespace Code written for the Codeview template
|
|
*/
|
|
codeview = {}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
* @namespace Enables filtering in class lists
|
|
* @class
|
|
* @since 1.0 - 2010-11-08
|
|
* @version 1.0 - 2010-11-08
|
|
*/
|
|
codeview.classFilter = ( function() {
|
|
function onkeyup_ClassFilter() {
|
|
var listItems
|
|
var search = document.getElementById('ClassFilter').value
|
|
search = search.toLowerCase()
|
|
if (document.getElementById('ClassList')) {
|
|
listItems = document.getElementById('ClassList').getElementsByTagName('li')
|
|
filterList(listItems, search)
|
|
}
|
|
if (document.getElementById('ClassList2')) {
|
|
listItems = document.getElementById('ClassList2').getElementsByTagName('li')
|
|
filterList(listItems, search)
|
|
}
|
|
if (document.getElementById('FileList')) {
|
|
listItems = document.getElementById('FileList').getElementsByTagName('li')
|
|
filterList(listItems, search)
|
|
}
|
|
if (document.getElementById('MethodsListInherited')) {
|
|
var links = document.getElementById('MethodsListInherited').getElementsByTagName('a')
|
|
var linksSelected = new Array()
|
|
for (var i=0; i < links.length; i++) {
|
|
if (links[i].parentNode.parentNode.tagName == "DD") {
|
|
linksSelected.push(links[i])
|
|
}
|
|
}
|
|
filterList(linksSelected, search)
|
|
}
|
|
if (document.getElementById('MethodsList')) {
|
|
listItems = document.getElementById('MethodsList').getElementsByTagName('tbody')[0].getElementsByTagName('tr')
|
|
filterList(listItems, search, document.getElementById('MethodDetail').getElementsByTagName('li'))
|
|
}
|
|
}
|
|
|
|
function filterList(listItems, search, relatedElements) {
|
|
var itemContent = ""
|
|
for (var i=0; i < listItems.length; i++) {
|
|
itemContent = listItems[i].textContent||listItems[i].innerText
|
|
if (itemContent != undefined) {
|
|
itemContent = itemContent.toLowerCase()
|
|
itemContent = itemContent.replace(/\s/g, "")
|
|
if (itemContent.indexOf(search) >= 0 || itemContent == "") {
|
|
listItems[i].style.display = ""
|
|
} else {
|
|
listItems[i].style.display = "none"
|
|
}
|
|
if (relatedElements != null) {
|
|
filterRelatedList(listItems[i], search, relatedElements)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function filterRelatedList(listItem, search, relatedElements) {
|
|
var itemIndex = parseInt(listItem.className.replace('item', ''))
|
|
if (itemIndex <= relatedElements.length) {
|
|
if (relatedElements[itemIndex].className == "item"+ itemIndex) {
|
|
relatedElements[itemIndex].style.display = listItem.style.display
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Start public */
|
|
return {
|
|
Init: function() {
|
|
wbos.Events.AddEvent(
|
|
document.getElementById('ClassFilter'),
|
|
onkeyup_ClassFilter,
|
|
"onkeyup"
|
|
)
|
|
}
|
|
}
|
|
/* End public */
|
|
})();
|