Changeset 2360 in products for quintagroup.referencedatagridfield/trunk/quintagroup/referencedatagridfield/skins/referencedatagridfield/referencebrowser.js
- Timestamp:
- May 19, 2010 6:23:11 PM (14 years ago)
- Location:
- quintagroup.referencedatagridfield/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.referencedatagridfield/trunk
- Property svnmerge-integrated changed from /quintagroup.referencedatagridfield/branches/plone4:1-3343 to /quintagroup.referencedatagridfield/branches/plone4:1-3398
- Property svn:mergeinfo set to /quintagroup.referencedatagridfield/branches/plone4:2306-2358
-
quintagroup.referencedatagridfield/trunk/quintagroup/referencedatagridfield/skins/referencedatagridfield/referencebrowser.js
r2300 r2360 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 function prepareRefPopup(context) { 2 jq(function() { 3 4 // the overlay itself 5 jq('.addreference', context).overlay({ 6 closeOnClick: false, 7 onBeforeLoad: function() { 8 ov = jq('div#content').data('overlay'); 9 // close overlay, if there is one already 10 // we only allow one referencebrowser per time 11 if (ov) {ov.close(); } 12 var wrap = this.getContent().find('.overlaycontent'); 13 var src = this.getTrigger().attr('src'); 14 var srcfilter = src + ' >*'; 15 wrap.data('srcfilter', srcfilter); 16 jq('div#content').data('overlay', this); 17 resetHistory(); 18 wrap.load(srcfilter); 19 }, 20 onLoad: function() { 21 widget_id = this.getTrigger().attr('rel').substring(6); 22 disablecurrentrelations(widget_id); 23 }}); 24 25 // the breadcrumb-links and the links of the 'tree'-navigation 26 jq('[id^=atrb_] a.browsesite', context).live('click', function(event) { 27 var target = jq(this); 28 var src = target.attr('href'); 29 var wrap = target.parents('.overlaycontent'); 30 var srcfilter = src + ' >*'; 31 pushToHistory(wrap.data('srcfilter')); 32 wrap.data('srcfilter', srcfilter); 33 // the history we are constructing here is destinct from the 34 // srcfilter-history. here we construct a selection-widget, which 35 // is available, if the history_length-parameter is set on the widget 36 // the srcfilter-history is used for storing the URLs to make the 37 // 'Back'-link work. 38 var newoption = '<option value="' + src + '">' + target.attr('rel') + '</option>'; 39 refreshOverlay(wrap, srcfilter, newoption); 40 return false; 41 }); 42 43 // the links for inserting referencens 44 jq('[id^=atrb_] input.insertreference', context).live('click', function(event) { 45 var target = jq(this); 46 var wrap = target.parents('.overlaycontent'); 47 var fieldname = wrap.find('input[name=fieldName]').attr('value'); 48 var fieldtitle = wrap.find('input[name=fieldTitleName]').attr('value'); 49 var fieldlink = wrap.find('input[name=fieldLinkName]').attr('value'); 50 var multi = wrap.find('input[name=multiValued]').attr('value'); 51 var close_window = wrap.find('input[name=close_window]').attr('value'); 52 var title = target.parents('tr').find('img').attr('alt'); 53 var linkpath = target.parents('tr').find('img').attr('rel'); 54 var active_tr = wrap.parents('tr[id=datagridwidget-row]'); 55 var uid = target.attr('rel'); 56 refbrowser_setReference(fieldname, uid, title, parseInt(multi), 57 active_tr, fieldtitle, title, fieldlink, linkpath); 58 if (close_window === '1') { 59 overlay = jq('div#content').data('overlay'); 60 overlay.close(); 61 } else { 62 showMessage(title); 63 }; 64 jq(this).attr('disabled', 'disabled'); 65 }); 66 67 68 // the history menu 69 jq('[id^=atrb_] form#history select[name=path]', context).live('change', function(event) { 70 var target = jq(this); 71 var wrap = target.parents('.overlaycontent'); 72 src = jq('[id^=atrb_] form#history select[name=path] :selected', this).attr('value'); 73 var srcfilter = src + ' >*'; 74 refreshOverlay(wrap, srcfilter, ''); 75 return false; 76 }); 77 78 // the search form 79 jq('[id^=atrb_] form#search input[name=submit]', context).live('click', function(event) { 80 var target = jq(this); 81 var src = target.parents('form').attr('action'); 82 var wrap = target.parents('.overlaycontent'); 83 var fieldname = wrap.find('input[name=fieldName]').attr('value'); 84 var fieldtitle = wrap.find('input[name=fieldTitleName]').attr('value'); 85 var fieldlink = wrap.find('input[name=fieldLinkName]').attr('value'); 86 var fieldrealname = wrap.find('input[name=fieldRealName]').attr('value'); 87 var at_url = wrap.find('input[name=at_url]').attr('value'); 88 var searchvalue = wrap.find('input[name=searchValue]').attr('value'); 89 var multi = wrap.find('input[name=multiValued]').attr('value'); 90 var close_window = wrap.find('input[name=close_window]').attr('value'); 91 qs = 'searchValue=' + searchvalue + '&fieldRealName=' + fieldrealname + 92 '&fieldName=' + fieldname + '&multiValued=' + multi + 93 '&close_window=' + close_window + '&at_url=' + at_url + 94 '&fieldTitleName=' + fieldtitle + '&fieldLinkName=' + fieldlink; 95 var srcfilter = src + '?' + qs + ' >*'; 96 pushToHistory(wrap.data('srcfilter')); 97 wrap.data('srcfilter', srcfilter); 98 refreshOverlay(wrap, srcfilter, ''); 99 return false; 100 }); 101 102 }); 103 }; 104 105 jq(document).ready(function(){ 106 prepareRefPopup(this); 107 }); 108 jq.fn.prepRefPopup = function() { 109 prepareRefPopup(this); 110 }; 111 112 function disablecurrentrelations (widget_id) { 113 jq('ul#' + widget_id + ' :input').each( 114 function (intIndex) { 115 uid = jq(this).attr('value'); 116 cb = jq('input[rel=' + uid + ']'); 117 cb.attr('disabled', 'disabled'); 118 cb.attr('checked', 'checked'); 119 }); 120 } 121 122 // function to return a reference from the popup window back into the widget 123 function refbrowser_setReference(widget_id, uid, label, multi, 124 active_tr, widget_title_id, link_title, 125 widget_link_id, link_path) 126 { 127 var element = null, 128 label_element = null, 129 current_values = null, 130 i = null, 131 list = null, 132 li = null, 133 input = null, 134 up_element = null, 135 down_element = null, 136 container = null; 137 138 if (typeof(active_tr) != "undefined") { 139 // Update Uid field 140 jq('#' + widget_id, active_tr).attr("value", uid); 141 // Update title field 142 title = jq('#' + widget_title_id, active_tr); 143 title.attr("value", link_title); 144 title.addClass("not-changed-title-field"); 145 title.attr("default_value", link_title); 146 title.blur(triggerTitleClass); 147 title.focus(triggerOnFocusStyles); 148 // Update link field 149 link = jq('#' + widget_link_id, active_tr); 150 link.attr('readonly', false); 151 link.attr('value', link_path); 152 link.attr('readonly', true); 153 link.addClass("hidden-field"); 154 155 } else if (multi === 0) { 156 // differentiate between the single and mulitselect widget 157 // since the single widget has an extra label field. 158 jq('#' + widget_id).attr('value', uid); 159 jq('#' + widget_id + '_label').attr('value', label); 160 } else { 161 // check if the item isn't already in the list 162 current_values = jq('#' + widget_id + ' input'); 163 for (i = 0; i < current_values.length; i++) { 164 if (current_values[i].value === uid) { 165 return false; 130 166 } 131 167 } 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'; 168 // now add the new item 169 list = document.getElementById(widget_id); 170 // add ul-element to DOM, if it is not there 171 if (list === null) { 172 container = jq('#archetypes-fieldname-' + widget_id + ' input + div'); 173 if (!container.length) { 174 // fix for Plone 3.3 collections, with a weird widget-id 175 container = jq('#archetypes-fieldname-value input + div'); 155 176 } 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) { 177 container.after( 178 '<ul class="visualNoMarker" id="' + widget_id + '"></ul>'); 179 list = document.getElementById(widget_id); 180 } 181 li = document.createElement('li'); 182 label_element = document.createElement('label'); 183 input = document.createElement('input'); 184 input.type = 'checkbox'; 185 input.value = uid; 186 input.checked = true; 187 input.name = widget_id + ':list'; 188 label_element.appendChild(input); 189 label_element.appendChild(document.createTextNode(' ' + label)); 190 li.appendChild(label_element); 191 li.id = 'ref-' + widget_id + '-' + current_values.length; 192 193 sortable = jq('input[name=' + widget_id + '-sortable]').attr('value'); 194 if (sortable === '1') { 195 up_element = document.createElement('a'); 196 up_element.title = 'Move Up'; 197 up_element.innerHTML = '▲'; 198 up_element.onclick = function () { 199 refbrowser_moveReferenceUp(this); 193 200 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; 201 }; 202 203 li.appendChild(up_element); 204 205 down_element = document.createElement('a'); 206 down_element.title = 'Move Down'; 207 down_element.innerHTML = '▼'; 208 down_element.onclick = function () { 209 refbrowser_moveReferenceDown(this); 210 return false; 211 }; 212 213 li.appendChild(down_element); 214 } 215 list.appendChild(li); 216 217 // fix on IE7 - check *after* adding to DOM 218 input.checked = true; 211 219 } 212 220 } … … 214 222 // function to clear the reference field or remove items 215 223 // from the multivalued reference list. 216 function ref erencebrowser_removeReference(widget_id, multi)224 function refbrowser_removeReference(widget_id, multi) 217 225 { 226 var x = null, 227 element = null, 228 label_element = null, 229 list = null; 230 218 231 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 }232 list = document.getElementById(widget_id); 233 for (x = list.length - 1; x >= 0; x--) { 234 if (list[x].selected) { 235 list[x] = null; 236 } 237 } 238 for (x = 0; x < list.length; x++) { 239 list[x].selected = 'selected'; 240 } 228 241 } 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 242 jq('#' + widget_id).attr('value', ""); 243 jq('#' + widget_id + '_label').attr('value', ""); 244 } 245 } 246 247 function refbrowser_moveReferenceUp(self) 248 { 249 var elem = self.parentNode, 250 eid = null, 251 pos = null, 252 widget_id = null, 253 newelem = null, 254 prevelem = null, 255 arrows = null, 256 cbs = null; 257 if (elem === null) { 258 return false; 259 } 260 eid = elem.id.split('-'); 261 pos = eid.pop(); 262 if (pos === 0) { 263 return false; 264 } 265 widget_id = eid.pop(); 266 newelem = elem.cloneNode(true); 267 268 //Fix: (IE keep the standard value) 269 cbs = newelem.getElementsByTagName("input"); 270 if (cbs.length > 0) { 271 cbs[0].checked = elem.getElementsByTagName("input")[0].checked; 272 } 273 274 prevelem = document.getElementById('ref-' + widget_id + '-' + (pos - 1)); 275 276 // up arrow 277 arrows = newelem.getElementsByTagName("a"); 278 arrows[0].onclick = function () { 279 refbrowser_moveReferenceUp(this); 280 }; 281 // down arrow 282 arrows[1].onclick = function () { 283 refbrowser_moveReferenceDown(this); 284 }; 285 286 elem.parentNode.insertBefore(newelem, prevelem); 287 elem.parentNode.removeChild(elem); 288 newelem.id = 'ref-' + widget_id + '-' + (pos - 1); 289 prevelem.id = 'ref-' + widget_id + '-' + pos; 290 } 291 292 function refbrowser_moveReferenceDown(self) 293 { 294 var elem = self.parentNode, 295 eid = null, 296 pos = null, 297 widget_id = null, 298 current_values = null, 299 newelem = null, 300 nextelem = null, 301 cbs = null, 302 arrows = null; 303 if (elem === null) { 304 return false; 305 } 306 eid = elem.id.split('-'); 307 pos = parseInt(eid.pop(), 10); 308 widget_id = eid.pop(); 309 current_values = jq('#' + widget_id + ' input'); 310 if ((pos + 1) === current_values.length) { 311 return false; 312 } 313 314 newelem = elem.cloneNode(true); 315 //Fix: (IE keep the standard value) 316 cbs = newelem.getElementsByTagName("input"); 317 if (cbs.length > 0) { 318 cbs[0].checked = elem.getElementsByTagName("input")[0].checked; 319 } 320 321 // up img 322 arrows = newelem.getElementsByTagName("a"); 323 arrows[0].onclick = function () { 324 refbrowser_moveReferenceUp(this); 325 }; 326 // down img 327 arrows[1].onclick = function () { 328 refbrowser_moveReferenceDown(this); 329 }; 330 331 nextelem = document.getElementById('ref-' + widget_id + '-' + (pos + 1)); 332 333 elem.parentNode.insertBefore(newelem, nextelem.nextSibling); 334 elem.parentNode.removeChild(elem); 335 newelem.id = 'ref-' + widget_id + '-' + (pos + 1); 336 nextelem.id = 'ref-' + widget_id + '-' + pos; 337 } 338 339 function showMessage(message) { 340 jq('#messageTitle').text(message); 341 jq('#message').show(); 342 } 343 344 function submitHistoryForm() { 345 var form = document.history; 346 var path = form.path.options[form.path.selectedIndex].value; 347 form.action = path; 348 form.submit(); 349 } 350 351 function pushToHistory(url) { 352 var history = jq(document).data('atrb_history'); 353 history.push(url); 354 jq(document).data('atrb_history', history); 355 } 356 357 function resetHistory() { 358 jq(document).data('atrb_history', []); 359 } 360 361 function popFromHistory() { 362 var history = jq(document).data('atrb_history'); 363 value = history.pop(); 364 jq(document).data('atrb_history', history); 365 return value; 366 } 367 368 function refreshOverlay(wrap, srcfilter, newoption) { 369 var oldhistory = jq('[id^=atrb_] form#history select'); 370 wrap.load(srcfilter, function() { 371 jq('[id^=atrb_] form#history select').append(newoption + oldhistory.html()); 372 ov = jq('div#content').data('overlay'); 373 widget_id = ov.getTrigger().attr('rel').substring(6); 374 disablecurrentrelations(widget_id); 375 }); 376 }
Note: See TracChangeset
for help on using the changeset viewer.