Changeset 2311 in products for quintagroup.referencedatagridfield/branches/plone4/quintagroup/referencedatagridfield/skins/referencedatagridfield/referencebrowser.js
- Timestamp:
- May 13, 2010 5:01:59 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.referencedatagridfield/branches/plone4/quintagroup/referencedatagridfield/skins/referencedatagridfield/referencebrowser.js
r2300 r2311 1 // Crossbrowser event listeners adder 2 function addEvent(obj, evType, fn, useCap) { 3 var r = false; 4 if (obj.addEventListener){ 5 if (typeof(useCap) == 'undefined') 6 useCap = false; 7 obj.addEventListener(evType, fn, useCap); 8 r = true; 9 } 10 else if (obj.attachEvent) { 11 var id = obj.sourceIndex || -1; 12 13 if (!fn[evType + id]) { 14 var f = fn[evType + id] = function(e) { 15 var o = document.all[id] || document; 16 o._f = fn; 17 var s = o._f(e); 18 o._f = null; 19 return s; 20 }; 21 22 r = obj.attachEvent("on" + evType, f); 23 obj = null; 24 } 25 } 26 return r; 27 }; 28 29 function triggerTitleClass(e) { 30 var currnode = window.event ? window.event.srcElement : e.currentTarget; 31 32 // fetch required data structure 33 var element = getThisOrParentElement(currnode, "INPUT"); 34 // If no input tag found - leave function 35 if (element == null || element.tagName.toUpperCase() == "BODY") 36 return; 37 38 var current = element.value; 39 var initial = element.getAttribute("default_value"); 40 if (initial == null || current == null) 41 return; 42 43 if (initial == current) { 44 setClassAttr(element, "not-changed-title-field") 45 } else { 46 setClassAttr(element, "changed-title-field") 47 } 48 } 49 50 function setClassAttr(element, value) { 51 if (element.className) { 52 element.className = value 53 } else { 54 element.setAttribute("CLASS", value) 55 } 56 } 57 // Trigger styles on focusing on the element 58 function triggerOnFocusStyles(e) { 59 var currnode = window.event ? window.event.srcElement : e.currentTarget; 60 61 // fetch required data structure 62 var element = getThisOrParentElement(currnode, "INPUT"); 63 // If no input tag found - leave function 64 if (element == null || element.tagName.toUpperCase() == "BODY") 65 return; 66 setClassAttr(element, "changed-title-field") 67 } 68 69 function getThisOrParentElement(currnode, tagname) { 70 /* Find the first parent node with the given tag name */ 71 72 tagname = tagname.toUpperCase(); 73 var parent = currnode; 74 75 while(parent.tagName.toUpperCase() != tagname) { 76 parent = parent.parentNode; 77 // Next line is a safety belt 78 if(parent.tagName.toUpperCase() == "BODY") 79 return null; 80 } 81 82 return parent; 83 } 84 85 86 // function to open the popup window 87 function getOrderIndex(currnode) { 88 if (typeof(dataGridFieldFunctions) == "object") { 89 var rows = dataGridFieldFunctions.getWidgetRows(currnode); 90 var row = dataGridFieldFunctions.getParentElementById(currnode, "datagridwidget-row"); 91 if(row == null) { 92 alert("Couldn't find DataGridWidget row"); 93 return; 94 } 95 96 var idx = null 97 98 // We can't use nextSibling because of blank text nodes in some browsers 99 // Need to find the index of the row 100 for(var t = 0; t < rows.length; t++) { 101 if(rows[t] == row) { 102 idx = t; 103 break; 104 } 105 } 106 107 // Abort if the current row wasn't found 108 if(idx == null) 109 return; 110 return idx; 111 } 112 return; 113 } 114 115 function getOrderedElement(widget_id, order_idx) { 116 // First get first element for the current field 117 var element=document.getElementById(widget_id); 118 119 // If it is about DataGridField use it to chose correct element 120 if (typeof(dataGridFieldFunctions) == "object" && order_idx >= 0) { 121 var rows = dataGridFieldFunctions.getWidgetRows(element); 122 if (rows.length >= order_idx) { 123 var row = rows[order_idx] 124 var inputs = row.getElementsByTagName("input") 125 for (var i=0;i<=inputs.length;i++) { 126 if (inputs[i].id == widget_id) { 127 element = inputs[i]; 128 break; 129 } 1 jq(function() { 2 3 // the overlay itself 4 jq('.addreference').overlay({ 5 closeOnClick: false, 6 onBeforeLoad: function() { 7 ov = jq('div#content').data('overlay'); 8 // close overlay, if there is one already 9 // we only allow one referencebrowser per time 10 if (ov) {ov.close(); } 11 var wrap = this.getContent().find('.overlaycontent'); 12 var src = this.getTrigger().attr('src'); 13 var srcfilter = src + ' >*'; 14 wrap.data('srcfilter', srcfilter); 15 jq('div#content').data('overlay', this); 16 resetHistory(); 17 wrap.load(srcfilter); 18 }, 19 onLoad: function() { 20 widget_id = this.getTrigger().attr('rel').substring(6); 21 disablecurrentrelations(widget_id); 22 }}); 23 24 // the breadcrumb-links and the links of the 'tree'-navigation 25 jq('[id^=atrb_] a.browsesite').live('click', function(event) { 26 var target = jq(this); 27 var src = target.attr('href'); 28 var wrap = target.parents('.overlaycontent'); 29 var srcfilter = src + ' >*'; 30 pushToHistory(wrap.data('srcfilter')); 31 wrap.data('srcfilter', srcfilter); 32 // the history we are constructing here is destinct from the 33 // srcfilter-history. here we construct a selection-widget, which 34 // is available, if the history_length-parameter is set on the widget 35 // the srcfilter-history is used for storing the URLs to make the 36 // 'Back'-link work. 37 var newoption = '<option value="' + src + '">' + target.attr('rel') + '</option>'; 38 refreshOverlay(wrap, srcfilter, newoption); 39 return false; 40 }); 41 42 // the links for inserting referencens 43 jq('[id^=atrb_] input.insertreference').live('click', function(event) { 44 var target = jq(this); 45 var wrap = target.parents('.overlaycontent'); 46 var fieldname = wrap.find('input[name=fieldName]').attr('value'); 47 var multi = wrap.find('input[name=multiValued]').attr('value'); 48 var close_window = wrap.find('input[name=close_window]').attr('value'); 49 var title = target.parents('tr').find('img').attr('alt'); 50 var uid = target.attr('rel'); 51 refbrowser_setReference(fieldname, uid, title, parseInt(multi)); 52 if (close_window === '1') { 53 overlay = jq('div#content').data('overlay'); 54 overlay.close(); 55 } else { 56 showMessage(title); 57 }; 58 jq(this).attr('disabled', 'disabled'); 59 }); 60 61 62 // the history menu 63 jq('[id^=atrb_] form#history select[name=path]').live('change', function(event) { 64 var target = jq(this); 65 var wrap = target.parents('.overlaycontent'); 66 src = jq('[id^=atrb_] form#history select[name=path] :selected').attr('value'); 67 var srcfilter = src + ' >*'; 68 refreshOverlay(wrap, srcfilter, ''); 69 return false; 70 }); 71 72 // the search form 73 jq('[id^=atrb_] form#search input[name=submit]').live('click', function(event) { 74 var target = jq(this); 75 var src = target.parents('form').attr('action'); 76 var wrap = target.parents('.overlaycontent'); 77 var fieldname = wrap.find('input[name=fieldName]').attr('value'); 78 var fieldrealname = wrap.find('input[name=fieldRealName]').attr('value'); 79 var at_url = wrap.find('input[name=at_url]').attr('value'); 80 var searchvalue = wrap.find('input[name=searchValue]').attr('value'); 81 var multi = wrap.find('input[name=multiValued]').attr('value'); 82 var close_window = wrap.find('input[name=close_window]').attr('value'); 83 qs = 'searchValue=' + searchvalue + '&fieldRealName=' + fieldrealname + 84 '&fieldName=' + fieldname + '&multiValued=' + multi + 85 '&close_window' + close_window + '&at_url=' + at_url; 86 var srcfilter = src + '?' + qs + ' >*'; 87 pushToHistory(wrap.data('srcfilter')); 88 wrap.data('srcfilter', srcfilter); 89 refreshOverlay(wrap, srcfilter, ''); 90 return false; 91 }); 92 93 }); 94 95 function disablecurrentrelations (widget_id) { 96 jq('ul#' + widget_id + ' :input').each( 97 function (intIndex) { 98 uid = jq(this).attr('value'); 99 cb = jq('input[rel=' + uid + ']'); 100 cb.attr('disabled', 'disabled'); 101 cb.attr('checked', 'checked'); 102 }); 103 } 104 105 // function to return a reference from the popup window back into the widget 106 function refbrowser_setReference(widget_id, uid, label, multi) 107 { 108 var element = null, 109 label_element = null, 110 current_values = null, 111 i = null, 112 list = null, 113 li = null, 114 input = null, 115 up_element = null, 116 down_element = null, 117 container = null; 118 // differentiate between the single and mulitselect widget 119 // since the single widget has an extra label field. 120 if (multi === 0) { 121 jq('#' + widget_id).attr('value', uid); 122 jq('#' + widget_id + '_label').attr('value', label); 123 } else { 124 // check if the item isn't already in the list 125 current_values = jq('#' + widget_id + ' input'); 126 for (i = 0; i < current_values.length; i++) { 127 if (current_values[i].value === uid) { 128 return false; 130 129 } 131 130 } 132 } 133 return element; 134 } 135 136 137 function referencebrowser_openBrowser(path, fieldName, at_url, fieldRealName, fieldTitleName, fieldLinkName, currnode) { 138 var url = path + '/referencebrowser_popup?fieldName=' + fieldName + '&fieldRealName=' + fieldRealName +'&at_url=' + at_url; 139 140 var order_idx = getOrderIndex(currnode); 141 url += (order_idx)? '&order_idx=' + order_idx: ""; 142 url += (typeof(fieldTitleName) != 'undefined')? '&fieldTitleName=' + fieldTitleName: ""; 143 url += (typeof(fieldLinkName) != 'undefined')? '&fieldLinkName=' + fieldLinkName: ""; 144 145 atrefpopup = window.open(url, 'referencebrowser_popup','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=500,height=550'); 146 } 147 148 // function for Array detecting 149 function typeOf(value) { 150 var s = typeof value; 151 if (s === 'object') { 152 if (value) { 153 if (value instanceof Array) { 154 s = 'array'; 131 // now add the new item 132 list = document.getElementById(widget_id); 133 // add ul-element to DOM, if it is not there 134 if (list === null) { 135 container = jq('#archetypes-fieldname-' + widget_id + ' input + div'); 136 if (!container.length) { 137 // fix for Plone 3.3 collections, with a weird widget-id 138 container = jq('#archetypes-fieldname-value input + div'); 155 139 } 156 } else { 157 s = 'null'; 158 } 159 } 160 return s; 161 } 162 163 // function to return a reference from the popup window back into the widget 164 function referencebrowser_setReference(widget_id, uid, label, multi, order_idx, widget_title_id, link_title, widget_link_id, link_path) 165 { 166 if (order_idx >= 0) { 167 // process ReferenceDataGridField 168 uid_element=getOrderedElement(widget_id, order_idx); 169 uid_element.value=uid; 170 title_element=getOrderedElement(widget_title_id, order_idx); 171 title_element.value=link_title; 172 title_element.className="not-changed-title-field"; 173 title_element.setAttribute("default_value", link_title); 174 addEvent(title_element, 'blur', triggerTitleClass, false) 175 addEvent(title_element, 'focus', triggerOnFocusStyles, false) 176 link_element=getOrderedElement(widget_link_id, order_idx); 177 link_element.readOnly=false; 178 link_element.value=link_path; 179 link_element.readOnly=true; 180 link_element.className="hidden-field" 181 } else if (multi==0) { 182 // differentiate between the single and mulitselect widget 183 // since the single widget has an extra label field. 184 element=document.getElementById(widget_id); 185 label_element=document.getElementById(widget_id + '_label'); 186 element.value=uid; 187 label_element.value=label; 188 } else { 189 // check if the item isn't already in the list 190 var current_values = cssQuery('#' + widget_id + ' input'); 191 for (var i=0; i < current_values.length; i++) { 192 if (current_values[i].value == uid) { 140 container.after( 141 '<ul class="visualNoMarker" id="' + widget_id + '"></ul>'); 142 list = document.getElementById(widget_id); 143 } 144 li = document.createElement('li'); 145 label_element = document.createElement('label'); 146 input = document.createElement('input'); 147 input.type = 'checkbox'; 148 input.value = uid; 149 input.checked = true; 150 input.name = widget_id + ':list'; 151 label_element.appendChild(input); 152 label_element.appendChild(document.createTextNode(' ' + label)); 153 li.appendChild(label_element); 154 li.id = 'ref-' + widget_id + '-' + current_values.length; 155 156 sortable = jq('input[name=' + widget_id + '-sortable]').attr('value'); 157 if (sortable === '1') { 158 up_element = document.createElement('a'); 159 up_element.title = 'Move Up'; 160 up_element.innerHTML = '▲'; 161 up_element.onclick = function () { 162 refbrowser_moveReferenceUp(this); 193 163 return false; 194 } 195 } 196 // now add the new item 197 list=document.getElementById(widget_id); 198 li = document.createElement('li'); 199 label_element = document.createElement('label'); 200 input = document.createElement('input'); 201 input.type = 'checkbox'; 202 input.value = uid; 203 input.checked = true; 204 input.name = widget_id + ':list'; 205 label_element.appendChild(input); 206 label_element.appendChild(document.createTextNode(label)); 207 li.appendChild(label_element); 208 list.appendChild(li); 209 // fix on IE7 - check *after* adding to DOM 210 input.checked = true; 164 }; 165 166 li.appendChild(up_element); 167 168 down_element = document.createElement('a'); 169 down_element.title = 'Move Down'; 170 down_element.innerHTML = '▼'; 171 down_element.onclick = function () { 172 refbrowser_moveReferenceDown(this); 173 return false; 174 }; 175 176 li.appendChild(down_element); 177 } 178 list.appendChild(li); 179 180 // fix on IE7 - check *after* adding to DOM 181 input.checked = true; 211 182 } 212 183 } … … 214 185 // function to clear the reference field or remove items 215 186 // from the multivalued reference list. 216 function ref erencebrowser_removeReference(widget_id, multi)187 function refbrowser_removeReference(widget_id, multi) 217 188 { 189 var x = null, 190 element = null, 191 label_element = null, 192 list = null; 193 218 194 if (multi) { 219 list =document.getElementById(widget_id)220 for ( var x=list.length-1; x >= 0; x--) {221 if (list[x].selected) {222 list[x]=null;223 }224 } 225 for ( var x=0; x < list.length; x++) {226 list[x].selected ='selected';227 }195 list = document.getElementById(widget_id); 196 for (x = list.length - 1; x >= 0; x--) { 197 if (list[x].selected) { 198 list[x] = null; 199 } 200 } 201 for (x = 0; x < list.length; x++) { 202 list[x].selected = 'selected'; 203 } 228 204 } else { 229 element=document.getElementById(widget_id); 230 label_element=document.getElementById(widget_id + '_label'); 231 label_element.value = ""; 232 element.value=""; 233 } 234 } 235 236 205 jq('#' + widget_id).attr('value', ""); 206 jq('#' + widget_id + '_label').attr('value', ""); 207 } 208 } 209 210 function refbrowser_moveReferenceUp(self) 211 { 212 var elem = self.parentNode, 213 eid = null, 214 pos = null, 215 widget_id = null, 216 newelem = null, 217 prevelem = null, 218 arrows = null, 219 cbs = null; 220 if (elem === null) { 221 return false; 222 } 223 eid = elem.id.split('-'); 224 pos = eid.pop(); 225 if (pos === 0) { 226 return false; 227 } 228 widget_id = eid.pop(); 229 newelem = elem.cloneNode(true); 230 231 //Fix: (IE keep the standard value) 232 cbs = newelem.getElementsByTagName("input"); 233 if (cbs.length > 0) { 234 cbs[0].checked = elem.getElementsByTagName("input")[0].checked; 235 } 236 237 prevelem = document.getElementById('ref-' + widget_id + '-' + (pos - 1)); 238 239 // up arrow 240 arrows = newelem.getElementsByTagName("a"); 241 arrows[0].onclick = function () { 242 refbrowser_moveReferenceUp(this); 243 }; 244 // down arrow 245 arrows[1].onclick = function () { 246 refbrowser_moveReferenceDown(this); 247 }; 248 249 elem.parentNode.insertBefore(newelem, prevelem); 250 elem.parentNode.removeChild(elem); 251 newelem.id = 'ref-' + widget_id + '-' + (pos - 1); 252 prevelem.id = 'ref-' + widget_id + '-' + pos; 253 } 254 255 function refbrowser_moveReferenceDown(self) 256 { 257 var elem = self.parentNode, 258 eid = null, 259 pos = null, 260 widget_id = null, 261 current_values = null, 262 newelem = null, 263 nextelem = null, 264 cbs = null, 265 arrows = null; 266 if (elem === null) { 267 return false; 268 } 269 eid = elem.id.split('-'); 270 pos = parseInt(eid.pop(), 10); 271 widget_id = eid.pop(); 272 current_values = jq('#' + widget_id + ' input'); 273 if ((pos + 1) === current_values.length) { 274 return false; 275 } 276 277 newelem = elem.cloneNode(true); 278 //Fix: (IE keep the standard value) 279 cbs = newelem.getElementsByTagName("input"); 280 if (cbs.length > 0) { 281 cbs[0].checked = elem.getElementsByTagName("input")[0].checked; 282 } 283 284 // up img 285 arrows = newelem.getElementsByTagName("a"); 286 arrows[0].onclick = function () { 287 refbrowser_moveReferenceUp(this); 288 }; 289 // down img 290 arrows[1].onclick = function () { 291 refbrowser_moveReferenceDown(this); 292 }; 293 294 nextelem = document.getElementById('ref-' + widget_id + '-' + (pos + 1)); 295 296 elem.parentNode.insertBefore(newelem, nextelem.nextSibling); 297 elem.parentNode.removeChild(elem); 298 newelem.id = 'ref-' + widget_id + '-' + (pos + 1); 299 nextelem.id = 'ref-' + widget_id + '-' + pos; 300 } 301 302 function showMessage(message) { 303 jq('#messageTitle').text(message); 304 jq('#message').show(); 305 } 306 307 function submitHistoryForm() { 308 var form = document.history; 309 var path = form.path.options[form.path.selectedIndex].value; 310 form.action = path; 311 form.submit(); 312 } 313 314 function pushToHistory(url) { 315 var history = jq(document).data('atrb_history'); 316 history.push(url); 317 jq(document).data('atrb_history', history); 318 } 319 320 function resetHistory() { 321 jq(document).data('atrb_history', []); 322 } 323 324 function popFromHistory() { 325 var history = jq(document).data('atrb_history'); 326 value = history.pop(); 327 jq(document).data('atrb_history', history); 328 return value; 329 } 330 331 function refreshOverlay(wrap, srcfilter, newoption) { 332 var oldhistory = jq('[id^=atrb_] form#history select'); 333 wrap.load(srcfilter, function() { 334 jq('[id^=atrb_] form#history select').append(newoption + oldhistory.html()); 335 ov = jq('div#content').data('overlay'); 336 widget_id = ov.getTrigger().attr('rel').substring(6); 337 disablecurrentrelations(widget_id); 338 }); 339 }
Note: See TracChangeset
for help on using the changeset viewer.