cubicweb/web/data/cubicweb.htmlhelpers.js
changeset 11057 0b59724cb3f2
parent 10895 90c55e27aa87
child 12503 b01dd0ef43aa
--- /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;
+        }
+    }
+}
+