// @include lib.form.dragdrop.dragdrop // do the ones that extract innerHTML so that they can get their original HTML before // other behavior rules change them (like YUI buttons.) Behaviour.specify("DIV.hetero-list-container", 'hetero-list', -100, function(e) { e=$(e); if(isInsideRemovable(e)) return; // components for the add button var menu = document.createElement("SELECT"); var btns = findElementsBySelector(e,"INPUT.hetero-list-add"), btn = btns[btns.length-1]; // In case nested content also uses hetero-list YAHOO.util.Dom.insertAfter(menu,btn); var prototypes = $(e.lastChild); while(!prototypes.hasClassName("prototypes")) prototypes = prototypes.previous(); var insertionPoint = prototypes.previous(); // this is where the new item is inserted. // extract templates var templates = []; var i=0; $(prototypes).childElements().each(function (n) { var name = n.getAttribute("name"); var tooltip = n.getAttribute("tooltip"); var descriptorId = n.getAttribute("descriptorId"); menu.options[i] = new Option(n.getAttribute("title"),""+i); templates.push({html:n.innerHTML, name:name, tooltip:tooltip,descriptorId:descriptorId}); i++; }); Element.remove(prototypes); var withDragDrop = initContainerDD(e); var menuAlign = (btn.getAttribute("menualign")||"tl-bl"); var menuButton = new YAHOO.widget.Button(btn, { type: "menu", menu: menu, menualignment: menuAlign.split("-") }); $(menuButton._button).addClassName(btn.className); // copy class names $(menuButton._button).setAttribute("suffix",btn.getAttribute("suffix")); menuButton.getMenu().clickEvent.subscribe(function(type,args,value) { var item = args[1]; if (item.cfg.getProperty("disabled")) return; var t = templates[parseInt(item.value)]; var nc = document.createElement("div"); nc.className = "repeated-chunk"; nc.setAttribute("name",t.name); nc.setAttribute("descriptorId",t.descriptorId); nc.innerHTML = t.html; $(nc).setOpacity(0); var scroll = document.body.scrollTop; renderOnDemand(findElementsBySelector(nc,"TR.config-page")[0],function() { function findInsertionPoint() { // given the element to be inserted 'prospect', // and the array of existing items 'current', // and preferred ordering function, return the position in the array // the prospect should be inserted. // (for example 0 if it should be the first item) function findBestPosition(prospect,current,order) { function desirability(pos) { var count=0; for (var i=0; i