--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cubicweb/web/data/cubicweb.htmlhelpers.js Sat Jan 16 13:48:51 2016 +0100
@@ -0,0 +1,179 @@
+/* in CW 3.10, we should move these functions in this namespace */
+cw.htmlhelpers = new Namespace('cw.htmlhelpers');
+
+jQuery.extend(cw.htmlhelpers, {
+ popupLoginBox: function(loginboxid, focusid) {
+ $('#'+loginboxid).toggleClass('hidden');
+ jQuery('#' + focusid +':visible').focus();
+ }
+});
+
+
+/**
+ * .. function:: baseuri()
+ *
+ * returns the document's baseURI.
+ */
+baseuri = cw.utils.deprecatedFunction(
+ "[3.20] baseuri() is deprecated, use BASE_URL instead",
+ function () {
+ return BASE_URL;
+ });
+
+/**
+ * .. function:: setProgressCursor()
+ *
+ * set body's cursor to 'progress'
+ */
+function setProgressCursor() {
+ var body = document.getElementsByTagName('body')[0];
+ body.style.cursor = 'progress';
+}
+
+/**
+ * .. function:: resetCursor(result)
+ *
+ * reset body's cursor to default (mouse cursor). The main
+ * purpose of this function is to be used as a callback in the
+ * deferreds' callbacks chain.
+ */
+function resetCursor(result) {
+ var body = document.getElementsByTagName('body')[0];
+ body.style.cursor = '';
+ // pass result to next callback in the callback chain
+ return result;
+}
+
+function updateMessage(msg) {
+ var msgdiv = DIV({
+ 'class': 'message'
+ });
+ // don't pass msg to DIV() directly because DIV will html escape it
+ // and msg should alreay be html escaped at this point.
+ msgdiv.innerHTML = msg;
+ jQuery('#appMsg').removeClass('hidden').empty().append(msgdiv);
+}
+
+/**
+ * .. function:: asURL(props)
+ *
+ * builds a URL from an object (used as a dictionary)
+ *
+ * >>> asURL({'rql' : "RQL", 'x': [1, 2], 'itemvid' : "oneline"})
+ * rql=RQL&vid=list&itemvid=oneline&x=1&x=2
+ * >>> asURL({'rql' : "a&b", 'x': [1, 2], 'itemvid' : "oneline"})
+ * rql=a%26b&x=1&x=2&itemvid=oneline
+ */
+function asURL(props) {
+ var chunks = [];
+ for (key in props) {
+ var value = props[key];
+ // generate a list of couple key=value if key is multivalued
+ if (cw.utils.isArrayLike(value)) {
+ for (var i = 0; i < value.length; i++) {
+ chunks.push(key + '=' + cw.urlEncode(value[i]));
+ }
+ } else {
+ chunks.push(key + '=' + cw.urlEncode(value));
+ }
+ }
+ return chunks.join('&');
+}
+
+/**
+ * .. function:: firstSelected(selectNode)
+ *
+ * return selected value of a combo box if any
+ */
+function firstSelected(selectNode) {
+ var $selection = $(selectNode).find('option:selected:first');
+ return ($selection.length > 0) ? $selection[0] : null;
+}
+
+/**
+ * .. function:: toggleVisibility(elemId)
+ *
+ * toggle visibility of an element by its id
+ */
+function toggleVisibility(elemId) {
+ cw.jqNode(elemId).toggleClass('hidden');
+}
+
+/**
+ * .. function getElementsMatching(tagName, properties, \/* optional \*\/ parent)
+ *
+ * returns the list of elements in the document matching the tag name
+ * and the properties provided
+ *
+ * * `tagName`, the tag's name
+ *
+ * * `properties`, a js Object used as a dict
+ *
+ * Return an iterator (if a *real* array is needed, you can use the
+ * list() function)
+ */
+function getElementsMatching(tagName, properties, /* optional */ parent) {
+ parent = parent || document;
+ return jQuery.grep(parent.getElementsByTagName(tagName), function elementMatches(element) {
+ for (prop in properties) {
+ if (jQuery(element).attr(prop) != properties[prop]) {
+ return false;
+ }
+ }
+ return true;
+ });
+}
+
+/**
+ * .. function:: setCheckboxesState(nameprefix, value, checked)
+ *
+ * sets checked/unchecked status of checkboxes
+ */
+
+function setCheckboxesState(nameprefix, value, checked) {
+ // XXX: this looks in *all* the document for inputs
+ jQuery('input:checkbox[name^=' + nameprefix + ']').each(function() {
+ if (value == null || this.value == value) {
+ this.checked = checked;
+ }
+ });
+}
+
+/**
+ * .. function:: html2dom(source)
+ *
+ * this function is a hack to build a dom node from html source
+ */
+function html2dom(source) {
+ var tmpNode = SPAN();
+ tmpNode.innerHTML = source;
+ if (tmpNode.childNodes.length == 1) {
+ return tmpNode.firstChild;
+ }
+ else {
+ // we leave the span node when `source` has no root node
+ // XXX This is cleary not the best solution, but css/html-wise,
+ /// a span not should not be too much disturbing
+ return tmpNode;
+ }
+}
+
+// *** HELPERS **************************************************** //
+function rql_for_eid(eid) {
+ return 'Any X WHERE X eid ' + eid;
+}
+function isTextNode(domNode) {
+ return domNode.nodeType == 3;
+}
+function isElementNode(domNode) {
+ return domNode.nodeType == 1;
+}
+
+function autogrow(area) {
+ if (area.scrollHeight > area.clientHeight && ! window.opera) {
+ if (area.rows < 20) {
+ area.rows += 2;
+ }
+ }
+}
+