[session cache] always append to description, turn it into a list if necessary
CubicWeb.require('python.js');CubicWeb.require('jquery.corner.js');/* returns the document's baseURI. (baseuri() uses document.baseURI if * available and inspects the <base> tag manually otherwise.)*/functionbaseuri(){varuri=document.baseURI;if(uri){// some browsers don't define baseURIreturnuri;}varbasetags=document.getElementsByTagName('base');if(basetags.length){returngetNodeAttribute(basetags[0],'href');}return'';}/* set body's cursor to 'progress' */functionsetProgressCursor(){varbody=document.getElementsByTagName('body')[0];body.style.cursor='progress';}/* 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. */functionresetCursor(result){varbody=document.getElementsByTagName('body')[0];body.style.cursor='default';// pass result to next callback in the callback chainreturnresult;}functionupdateMessage(msg){varmsgdiv=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);}/* builds an url from an object (used as a dictionnary) * Notable difference with MochiKit's queryString: asURL does not * *url_quote* each value found in the dictionnary * * >>> asURL({'rql' : "RQL", 'x': [1, 2], 'itemvid' : "oneline"}) * rql=RQL&vid=list&itemvid=oneline&x=1&x=2 */functionasURL(props){varchunks=[];for(keyinprops){varvalue=props[key];// generate a list of couple key=value if key is multivaluedif(isArrayLike(value)){for(vari=0;i<value.length;i++){chunks.push(key+'='+value[i]);}}else{chunks.push(key+'='+value);}}returnchunks.join('&');}/* return selected value of a combo box if any */functionfirstSelected(selectNode){varselection=filter(attrgetter('selected'),selectNode.options);return(selection.length>0)?getNodeAttribute(selection[0],'value'):null;}/* toggle visibility of an element by its id */functiontoggleVisibility(elemId){jqNode(elemId).toggleClass('hidden');}/* toggles visibility of login popup div */// XXX used exactly ONCE in basecomponentsfunctionpopupLoginBox(){toggleVisibility('popupLoginBox');jQuery('#__login:visible').focus();}/* returns the list of elements in the document matching the tag name * and the properties provided * * @param tagName the tag's name * @param properties a js Object used as a dict * @return an iterator (if a *real* array is needed, you can use the * list() function) */functiongetElementsMatching(tagName,properties,/* optional */parent){parent=parent||document;returnfilter(functionelementMatches(element){for(propinproperties){if(getNodeAttribute(element,prop)!=properties[prop]){returnfalse;}}returntrue;},parent.getElementsByTagName(tagName));}/* * sets checked/unchecked status of checkboxes */functionsetCheckboxesState(nameprefix,checked){// XXX: this looks in *all* the document for inputsvarelements=getElementsMatching('input',{'type':"checkbox"});filterfunc=function(cb){returnnameprefix&&cb.name.startsWith(nameprefix);};forEach(filter(filterfunc,elements),function(cb){cb.checked=checked;});}functionsetCheckboxesState2(nameprefix,value,checked){// XXX: this looks in *all* the document for inputsvarelements=getElementsMatching('input',{'type':"checkbox"});filterfunc=function(cb){returnnameprefix&&cb.name.startsWith(nameprefix)&&cb.value==value;};forEach(filter(filterfunc,elements),function(cb){cb.checked=checked;});}/* this function is a hack to build a dom node from html source */functionhtml2dom(source){vartmpNode=SPAN();tmpNode.innerHTML=source;if(tmpNode.childNodes.length==1){returntmpNode.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 disturbingreturntmpNode;}}// *** HELPERS **************************************************** //functionrql_for_eid(eid){return'Any X WHERE X eid '+eid;}functionisTextNode(domNode){returndomNode.nodeType==3;}functionisElementNode(domNode){returndomNode.nodeType==1;}functionautogrow(area){if(area.scrollHeight>area.clientHeight&&!window.opera){if(area.rows<20){area.rows+=2;}}}//============= page loading events ==========================================//CubicWeb.rounded=[['div.sideBoxBody','bottom 6px'],['div.boxTitle, div.boxPrefTitle, div.sideBoxTitle, th.month','top 6px']];functionroundedCorners(node){node=jQuery(node);for(varr=0;r<CubicWeb.rounded.length;r++){node.find(CubicWeb.rounded[r][0]).corner(CubicWeb.rounded[r][1]);}}jQuery(document).ready(function(){roundedCorners(this.body);});CubicWeb.provide('corners.js');CubicWeb.provide('htmlhelpers.js');