/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* UI utility functions.
*/
var ui = new Object();
/**
* Return true if the current browser is Internet Explorer.
*/
ui.isIE = function() {
if (typeof ui.isIE.detected != 'undefined')
return ui.isIE.detected;
ui.isIE.detected = navigator.appName == 'Microsoft Internet Explorer';
return ui.isIE.detected;
};
/**
* Build a menu bar.
*/
ui.menu = function(name, href) {
function Menu(n, h) {
this.name = n;
this.href = h;
this.content = function() {
function complete(uri) {
if (uri.match('.*\.html$'))
return uri;
if (uri.match('.*/$'))
return uri + 'index.html';
return uri + '/index.html';
}
if (complete(this.href) != complete(window.top.location.pathname))
return '' + this.name + '';
return '' + this.name + '';
};
}
return new Menu(name, href);
};
ui.menubar = function(left, right) {
var bar = '
' +
'';
for (i in left)
bar = bar + '' + left[i].content() + ' | '
bar = bar + '
| ' +
'';
for (i in right)
bar = bar + '' + right[i].content() + ' | '
bar = bar + '
|
';
return bar;
};
/**
* Autocomplete / suggest support for input fields
* To use it declare a 'suggest' function as follows:
* function suggestItems() {
* return new Array('abc', 'def', 'ghi');
* }
* then hook it to an input field as follows:
* suggest(document.yourForm.yourInputField, suggestItems);
*/
ui.selectSuggestion = function(node, value) {
for (;;) {
node = node.parentNode;
if (node.tagName.toLowerCase() == 'div')
break;
}
node.selectSuggestion(value);
};
ui.hilightSuggestion = function(node, over) {
if (over)
node.className = 'suggestHilighted';
node.className = 'suggestItem';
};
ui.suggest = function(input, suggestFunction) {
input.suggest = suggestFunction;
input.selectSuggestion = function(value) {
this.hideSuggestDiv();
this.value = value;
}
input.hideSuggestDiv = function() {
if (this.suggestDiv != null) {
this.suggestDiv.style.visibility = 'hidden';
}
}
input.showSuggestDiv = function() {
if (this.suggestDiv == null) {
this.suggestDiv = document.createElement('div');
this.suggestDiv.input = this;
this.suggestDiv.className = 'suggest';
input.parentNode.insertBefore(this.suggestDiv, input);
this.suggestDiv.style.visibility = 'hidden';
this.suggestDiv.style.zIndex = '99';
this.suggestDiv.selectSuggestion = function(value) {
this.input.selectSuggestion(value);
}
}
var values = this.suggest();
var items = '';
for (var i = 0; i < values.length; i++) {
if (values[i].indexOf(this.value) == -1)
continue;
if (items.length == 0)
items += '';
items += '' + values[i] + ' |
';
}
if (items.length != 0)
items += '
';
this.suggestDiv.innerHTML = items;
if (items.length != 0) {
var node = input;
var left = 0;
var top = 0;
for (;;) {
left += node.offsetLeft;
top += node.offsetTop;
node = node.offsetParent;
if (node.tagName.toLowerCase() == 'body')
break;
}
this.suggestDiv.style.left = left;
this.suggestDiv.style.top = top + input.offsetHeight;
this.suggestDiv.style.visibility = 'visible';
} else
this.suggestDiv.style.visibility = 'hidden';
}
input.onkeydown = function(event) {
this.showSuggestDiv();
};
input.onkeyup = function(event) {
this.showSuggestDiv();
};
input.onmousedown = function(event) {
this.showSuggestDiv();
};
input.onblur = function(event) {
setTimeout(function() { input.hideSuggestDiv(); }, 50);
};
};
/**
* Return the content document of a window.
*/
ui.content = function(win) {
if (!isNil(win.document))
return win.document;
if (!isNil(win.contentDocument))
return win.contentDocument;
return null;
};
/**
* Return a child element of a node with the given id.
*/
ui.elementByID = function(node, id) {
for (var i in node.childNodes) {
var child = node.childNodes[i];
if (child.id == id)
return child;
var gchild = ui.elementByID(child, id);
if (gchild != null)
return gchild;
}
return null;
};
/**
* Return the current document, or a child element with the given id.
*/
function $(id) {
if (id == document) {
if (!isNil(document.widget))
return document.widget;
return document;
}
return ui.elementByID($(document), id);
};
/**
* Return a dictionary of the query parameters.
*/
ui.queryParams = function() {
var qp = new Array();
var qs = window.location.search.substring(1).split('&');
for (var i = 0; i < qs.length; i++) {
var e = qs[i].indexOf('=');
if (e > 0)
qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1));
}
return qp;
}
/**
* Bind a widget iframe to an element.
*/
ui.widgets = new Array();
ui.loadwidget = function(el, doc) {
var f = el + 'Frame';
var div = document.createElement('div');
div.id = f + 'Div';
div.innerHTML = '';
document.body.appendChild(div);
window.ui.widgets[f] = el;
return f;
};
/**
* Install a widget into the element bound to its iframe.
*/
ui.installwidget = function() {
if (isNil(window.parent) || isNil(window.parent.ui) || isNil(window.parent.ui.widgets))
return true;
var pdoc = ui.content(window.parent);
for (w in window.parent.ui.widgets) {
var ww = ui.elementByID(pdoc, w).contentWindow;
if (ww == window) {
document.widget = ui.elementByID(pdoc, window.parent.ui.widgets[w]);
document.widget.innerHTML = document.body.innerHTML;
return true;
}
}
return true;
};
/**
* Convert a CSS position to a numeric position.
*/
ui.posn = function(p) {
if (p == '')
return 0;
return Number(p.substr(0, p.length - 2));
};