1 // Functions for drag-and-drop functionality
3 var Dom = YAHOO.util.Dom;
4 var Event = YAHOO.util.Event;
5 var DDM = YAHOO.util.DragDropMgr;
9 var uls = document.getElementsByTagName('ul');
12 for (i=0; i<uls.length;i=i+1) {
13 if (uls[i].className == "draglist" || uls[i].className == "draglist_alt") {
14 ddtarget = YAHOO.util.DragDropMgr.getDDById(uls[i].id);
15 // The yahoo drag and drop is written (broken or not) in such a way, that if an element is subscribed as a target multiple times,
16 // it has to be unlinked multiple times, so we need to test whether it is allready a target, otherwise we'll have a problem when closing the group
18 new YAHOO.util.DDTarget(uls[i].id);
20 var children = uls[i].getElementsByTagName('li');
21 for( j=0; j<children.length; j=j+1) {
22 // The yahoo drag and drop is (broken or not) in such a way, that if an element is subscribed as a target multiple times,
23 // it has to be unlinked multiple times, so we need to test whether it is allready a target, otherwise we'll have a problem when closing the group
24 ddtarget = YAHOO.util.DragDropMgr.getDDById(children[j].id);
26 new DDList(children[j].id);
35 // drag and drop implementation
37 DDList = function(id, sGroup, config) {
39 DDList.superclass.constructor.call(this, id, sGroup, config);
41 this.logger = this.logger || YAHOO;
42 var el = this.getDragEl();
43 Dom.setStyle(el, "opacity", 0.67); // The proxy is slightly transparent
49 YAHOO.extend(DDList, YAHOO.util.DDProxy, {
51 startDrag: function(x, y) {
52 this.logger.log(this.id + " startDrag");
54 // make the proxy look like the source element
55 var dragEl = this.getDragEl();
56 var clickEl = this.getEl();
57 Dom.setStyle(clickEl, "visibility", "hidden");
59 dragEl.innerHTML = clickEl.innerHTML;
61 Dom.setStyle(dragEl, "color", Dom.getStyle(clickEl, "color"));
62 Dom.setStyle(dragEl, "backgroundColor", Dom.getStyle(clickEl, "backgroundColor"));
63 Dom.setStyle(dragEl, "border", "2px solid gray");
66 endDrag: function(e) {
68 var srcEl = this.getEl();
69 var proxy = this.getDragEl();
71 // Show the proxy element and animate it to the src element's location
72 Dom.setStyle(proxy, "visibility", "");
73 var a = new YAHOO.util.Motion(
80 YAHOO.util.Easing.easeOut
82 var proxyid = proxy.id;
85 // Hide the proxy and show the source element when finished with the animation
86 a.onComplete.subscribe(function() {
87 Dom.setStyle(proxyid, "visibility", "hidden");
88 Dom.setStyle(thisid, "visibility", "");
91 // if we are in basketgrouping page, when finished moving, edit the basket's info to reflect new status
92 if(typeof(basketgroups) != 'undefined') {
93 a.onComplete.subscribe(function() {
94 var reg = new RegExp("[-]+", "g");
95 // add a changed input to each moved basket, so we know which baskets to modify,
96 // and so we don't need to modify each and every basket and basketgroup each time the page is loaded
97 // FIXME: we shouldn't use getElementsByTagName, it's not explicit enough :-(
98 srcEl.getElementsByTagName('input')[1].value = "1";
99 if ( srcEl.parentNode.parentNode.className == "workarea" ) {
100 var dstbgroupid = srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-2].name.split(reg)[1];
101 srcEl.className="grouped";
102 srcEl.getElementsByTagName('input')[0].value = dstbgroupid;
103 //FIXME: again, we shouldn't be using getElementsByTagName!!
104 srcEl.parentNode.parentNode.getElementsByTagName('input')[srcEl.parentNode.parentNode.getElementsByTagName('input').length-1].value = 1;
106 else if ( srcEl.parentNode.parentNode.className == "workarea_alt" ){
107 srcEl.className="ungrouped";
108 srcEl.getElementsByTagName('input')[0].value = "0";
114 onDragDrop: function(e, id) {
116 // If there is one drop interaction, the li was dropped either on the list,
117 // or it was dropped on the current location of the source element.
118 if (DDM.interactionInfo.drop.length === 1) {
120 // The position of the cursor at the time of the drop (YAHOO.util.Point)
121 var pt = DDM.interactionInfo.point;
123 // The region occupied by the source element at the time of the drop
124 var region = DDM.interactionInfo.sourceRegion;
126 // Check to see if we are over the source element's location. We will
127 // append to the bottom of the list once we are sure it was a drop in
128 // the negative space (the area of the list without any list items)
129 if (!region.intersect(pt)) {
130 var destEl = Dom.get(id);
131 var destDD = DDM.getDDById(id);
132 destEl.appendChild(this.getEl());
133 destDD.isEmpty = false;
139 onDrag: function(e) {
141 // Keep track of the direction of the drag for use during onDragOver
142 var y = Event.getPageY(e);
144 if (y < this.lastY) {
146 } else if (y > this.lastY) {
147 this.goingUp = false;
152 onDragOver: function(e, id) {
154 var srcEl = this.getEl();
155 var destEl = Dom.get(id);
157 // We are only concerned with list items, we ignore the dragover
158 // notifications for the list.
159 if (destEl.nodeName.toLowerCase() == "li") {
160 var orig_p = srcEl.parentNode;
161 var p = destEl.parentNode;
164 p.insertBefore(srcEl, destEl); // insert above
166 p.insertBefore(srcEl, destEl.nextSibling); // insert below
174 //this traps enters in input fields
175 function enterpressed(event){
177 if (window.event) keycode = window.event.keyCode;
178 else if (event) keycode = event.which;
189 //Closes a basketgroup
190 function closebasketgroup(bgid) {
191 var answer=confirm(MSG_CONFIRM_CLOSE_BASKETGROUP);
197 tagname='basketgroup-'+bgid+'-closed';
199 var closeinput = document.getElementById(tagname);
200 closeinput.value = 1;
201 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
204 var div = document.getElementById(tagname).parentNode;
205 var stufftoremove = div.getElementsByTagName('p')[0];
206 var ul = document.getElementById(ulid);
207 var lis = ul.getElementsByTagName('li');
208 if (lis.length == 0 ) {
209 alert(MSG_CLOSE_EMPTY_BASKET);
212 var cantprint = document.createElement('p');
214 div.className = "closed";
215 ul.className="closed";
217 for(i=0; i<lis.length; ++i) {
218 ddtarget = YAHOO.util.DragDropMgr.getDDById(lis[i].id);
221 ddtarget = YAHOO.util.DragDropMgr.getDDById(ul.id);
223 div.removeChild(stufftoremove);
224 // the print button is disabled because the page's content might (or is probably) not in sync with what the database contains
225 cantprint.innerHTML = MSG_SAVE_BEFORE_PRINTING;
226 cantprint.id = 'cantprint-' + bgid;
227 var unclosegroup = document.createElement('a');
228 unclosegroup.href='javascript:unclosegroup('+bgid+');';
229 unclosegroup.innerHTML = MSG_REOPEN_BASKETGROUP;
230 unclosegroup.id = 'unclose-' + bgid;
232 div.appendChild(cantprint);
233 div.appendChild(unclosegroup);
236 function closeandprint(bg){
237 if(document.location = '/cgi-bin/koha/acqui/basketgroup.pl?op=closeandprint&basketgroupid=' + bg ){
238 setTimeout("window.location.reload();",3000);
240 alert(MSG_FILE_DOWNLOAD_ERROR);
244 //function that lets the user unclose a basketgroup
245 //as long as they haven't submitted the changes to the page.
246 function unclosegroup(bgid){
247 var div = document.getElementById('basketgroup-'+bgid+'-closed').parentNode;
248 var divtodel = document.getElementById('unclose-' + bgid);
250 div.removeChild(divtodel);
252 divtodel = document.getElementById('unclose-' + bgid);
254 div.removeChild(divtodel);
256 var closeinput = document.getElementById('basketgroup-'+bgid+'-closed');
257 var ul = document.getElementById('bg-'+bgid);
259 var newclose = document.createElement('a');
260 var newrename = document.createElement('a');
261 var newp = document.createElement('p');
263 newclose.innerHTML="close";
264 newclose.href="javascript: closebasketgroup('"+bgid+"', 'bg-"+bgid+"');";
266 newrename.href="javascript:" + "renameinit("+bgid+");";
267 newrename.innerHTML="rename";
269 var todel = div.getElementsByTagName('p')[0];
270 div.removeChild(todel);
272 var changed = document.getElementById("basketgroup-"+bgid+"-changed");
275 newp.innerHTML=" [ ";
276 newp.appendChild(newrename);
277 newp.innerHTML+=" / ";
278 newp.appendChild(newclose);
279 newp.innerHTML+=" ]";
281 div.insertBefore(newp, ul);
282 closeinput.value="0";
283 div.className = "workarea";
284 ul.className="draglist";
286 //rescan draglists, we have a new target (again :-)
287 YAHOO.util.Event.onDOMReady(DDApp.init, DDApp, true);
292 function renameinit(bgid){
293 var ul = document.getElementById('bg-'+bgid);
294 var div = ul.parentNode;
295 var nameelm = div.getElementsByTagName('h3')[0];
296 var p = div.getElementsByTagName('p')[0];
299 var nameinput = document.createElement("input");
300 nameinput.type = "text";
301 nameinput.id="rename-"+bgid;
302 nameinput.value = nameelm.innerHTML;
303 nameinput.onkeypress = function(e){rename(e, bgid, document.getElementById('rename-'+bgid).value); };
304 // nameinput.setAttribute('onkeypress', 'rename(event, bgid, document.getElementById(rename-'+bgid+').value);');
306 div.removeChild(nameelm);
307 div.insertBefore(nameinput, p);
310 function rename(event, bgid, name){
311 if (!enterpressed(event)){
314 var ul = document.getElementById('bg-'+bgid);
315 var div = ul.parentNode;
316 var p = div.getElementsByTagName('p')[0];
317 var nameinput = document.getElementById("rename-"+bgid);
318 var changedinput = document.getElementById("basketgroup-"+bgid+"-changed");
319 var newh3 = document.createElement("h3");
320 var hiddenname = document.getElementById("basketgroup-"+bgid+"-name");
322 div.removeChild(nameinput);
324 newh3.innerHTML=name;
325 hiddenname.value=name;
326 changedinput.value = 1;
327 div.insertBefore(newh3, p);