monster_menus-9.0.x-dev/js/mm.js
js/mm.js
if (typeof HTMLDivElement == 'object') HTMLDivElement.prototype.mmListArgs = [];
(function ($, Drupal, drupalSettings) {
mmList = function (parms) {
this.p = parms;
this.oneRow = parms.minRows <= 1 && parms.maxRows == 1;
var pf = this.pf = this;
// left column
if (parms.reInit) {
this.leftTD = $('[name=leftTD]', parms.outerDiv)[0];
this.rtTD = $('[name=rtTD]', parms.outerDiv)[0];
return;
}
this.leftTD = $('<td name="leftTD" valign="top" />')
.width(parms.flags.narrow_actions ? '99%' : '25%');
if (!parms.flags.readonly) this.leftTD.css('whiteSpace', 'nowrap');
if (parms.flags.hide_left_pane) this.leftTD.hide();
if (parms.minRows > 0 && !parms.isSearch) parms.listObjDiv.siblings('label').addClass('form-required');
parms.listObjDiv.siblings('label')
.appendTo(this.leftTD);
this.leftTD = this.leftTD[0];
// right column
this.rtTD = $('<td name="rtTD" class="mmjs-rtTD" />');
if (!parms.flags.action_under && !parms.flags.hide_left_pane) this.rtTD.css({
width: '50%',
'border-left': '1px solid #ccc',
'padding-left': '7px',
'vertical-align': 'top'
});
this.rtTD = this.rtTD[0];
if (this.haveActions = parms.labelAddCat || parms.labelAddURL || parms.labelAddList || parms.labelReplace || parms.labelDelete) {
if (parms.labelAboveActions) {
$('<label />')
.html(parms.labelAboveActions)
.appendTo(this.rtTD);
}
this.urlForm = {};
if (parms.labelAddQuery && parms.inputDivID3) { // Add a query button
this.urlForm.query = $('#' + parms.inputDivID3);
this.addButton(parms.labelAddQuery,
function() { // switch to Query add form
pf.showURLForm('query');
return false;
},
{'class': 'mm-list-add-button'})
.appendTo(this.rtTD);
}
if (parms.labelAddURL && parms.inputDivID) { // Add using url button
this.urlForm.url = $('#' + parms.inputDivID);
this.addButton(parms.labelAddURL,
function() { // switch to URL add form
pf.showURLForm('url');
return false;
},
{'class': 'mm-list-add-button'})
.appendTo(this.rtTD);
}
jQuery.each(this.urlForm, function(obj_key, obj) {
var reenableParent = function() {
obj
.closest('form').parent()
.find('.mmListSubformDisabled')
.attr('disabled', false)
.removeClass('mmListSubformDisabled');
obj.hide();
$(pf.p.outerDiv).show();
};
obj.hide();
$(':submit', obj)
.addClass('mmListNoDisable')
.each(function(n) {
if (n === 0) { // OK
$(this).click(function(event) {
if ($(event.currentTarget).is(':hidden')) {
// User hit Return on the keyboard in another sub-form
return false;
}
if (pf.editURLField.value) {
var v, info, name;
if (obj_key === 'query') {
v = pf.editURLField.value;
info = name = pf.editNameField.value;
}
else {
v = pf.editURLField.value =
pf.editURLField.value.match(/^\s*(.*?)\s*$/)[1];
info = v.replace(/\/(?!\/)/g,'/​');
var n = v.match(/:\/+(.*?)\//);
name = n && n[1] ? n[1] + '...' : (v.length > 30 ? v.substring(0, 30) + '...' : v);
}
if (pf.editReplace) {
if (pf.p.replaceCallback) {
pf.editReplace[0].mmListArgs = [ name, obj_key, v, info ];
var ret = pf.p.replaceCallback(pf, pf.editReplace);
if (pf.info) pf.info.html(ret);
}
pf.setSelected(pf.editReplace);
pf.editReplace = null;
}
else {
pf.addItem(true, name, obj_key, v, info);
}
pf.setHiddenElt();
}
reenableParent(obj);
$(pf.p.outerDiv).show();
if (pf.editURLField.value) {
pf.submitOnAdd();
}
return false;
});
}
else if (n === 1) { // Cancel
$(this).click(function() {
pf.editReplace = null;
reenableParent(obj);
return false;
});
}
});
});
if (parms.labelAddCat) { // Add using cat button
this.addButton(parms.labelAddCat,
function() {
pf.insertPoint = pf.selectedObj;
pf.editReplace = null;
pf.openWind(pf.p.popupURL);
return false;
},
{'class': 'mm-list-add-button'})
.appendTo(this.rtTD);
}
if (parms.labelAddList) { // Add a set of input fields or "using free tag" button
if (parms.inputDivID2) { // "using free tag" button
var reenableParent = function() {
$(pf.taxForm)
.hide()
.closest('form').parent()
.find('.mmListSubformDisabled')
.attr('disabled', false)
.removeClass('mmListSubformDisabled');
$(pf.p.outerDiv).show();
};
this.taxForm = $('#' + parms.inputDivID2)
.hide()[0];
$(':submit', this.taxForm)
.addClass('mmListNoDisable')
.each(function(n) {
if (n === 0) { // OK
$(this).click(function() {
var ok = false;
if (pf.editTaxField.value) {
var v = pf.editTaxField.value, name = pf.editTaxText.value;
if (pf.editReplace) {
if (pf.p.replaceCallback) {
pf.editReplace[0].mmListArgs = [ name, 'taxon', v, '' ];
var ret = pf.p.replaceCallback(pf, pf.editReplace);
if (pf.info) pf.info.html(ret);
}
pf.setSelected(pf.editReplace);
pf.editReplace = null;
}
else {
var found = null;
$(pf.leftTD)
.children(':not(label)')
.each(function() {
if (this.mmListArgs[1] === 'taxon' && this.mmListArgs[2] === v) {
found = $(this);
return false;
}
});
if (found) pf.setSelected(found);
else {
pf.addItem(true, name, 'taxon', v, '');
ok = true;
}
}
pf.setHiddenElt();
}
reenableParent();
if (ok) {
pf.submitOnAdd();
}
return false;
});
}
else if (n === 1) { // Cancel
$(this).click(function() {
pf.editReplace = null;
reenableParent();
return false;
});
}
});
this.editTaxField = $('input:hidden', this.taxForm)[0];
this.editTaxText = $('input:text', this.taxForm)[0];
this.editTaxSample = $('#tax-sample', this.taxForm)[0];
this.addButton(parms.labelAddList,
function() { // switch to free tag input form
pf.showTaxForm();
return false;
},
{'class': 'mm-list-add-button'})
.appendTo(this.rtTD);
this.showTaxForm = function(item) {
$(':submit:not(.mmListNoDisable)', this.p.hiddenElt.form)
.add('.ui-dialog-buttonset :button', this.p.hiddenElt.form.parentNode)
.attr('disabled', true)
.addClass('mmListSubformDisabled');
this.insertPoint = this.selectedObj;
$(pf.p.outerDiv).hide();
$(pf.taxForm).show();
this.editTaxField.value = item ? item.mmListArgs[2] : '';
this.editTaxText.value = item ? item.mmListArgs[0] : '';
this.editTaxSample.innerHTML = item ? item.mmListArgs[0] : Drupal.t('(choose a tag)');
this.editTaxText.parentFunc = this;
this.editTaxText.focus();
};
}
else { // set of input fields
parms.listObjDiv
.remove()
.hide();
this.addButton(parms.labelAddList,
function() {
pf.insertPoint = pf.selectedObj;
pf.editReplace = null;
pf.addItem(true);
return false;
},
{'class': 'mm-list-add-button'})
.appendTo(this.rtTD);
}
}
$(':button:not(:last)', this.rtTD).after('<br />');
if (parms.labelReplace) { // Replace button
this.editBut = this.addButton(parms.labelReplace,
function() {
pf.editReplace = pf.selectedObj;
pf.openWind(pf.editReplace[0].mmListArgs[2] || pf.p.popupURL);
return false;
},
{'disabled': true});
this.editBut.appendTo(this.rtTD);
}
if (parms.labelDelete) { // Delete button
this.delBut = this.addButton(parms.labelDelete,
function(evnt) {
this.blur();
if (evnt.shiftKey || !pf.p.delConfirmMsg || confirm(pf.p.delConfirmMsg))
pf.delSelected();
return false;
},
{'disabled': true});
this.delBut.appendTo(this.rtTD);
}
}
if (Drupal.autocomplete && (parms.autoComplete || parms.inputDivID2)) {
var $auto_obj;
if (parms.autoComplete) {
$auto_obj = $(parms.autoComplete, pf.p.outerDiv.parentNode.parentNode);
if (!this.haveActions) $auto_obj.parent().css('marginTop', 0);
$auto_obj.parent().appendTo(this.rtTD);
$auto_obj[0].parentFunc = this;
// Initialize, if mm_search_replace.js has just instantiated the field.
if (typeof Drupal.behaviors.autocomplete !== 'undefined') {
Drupal.behaviors.autocomplete.attach(this.rtTD);
}
$auto_obj = $(parms.autoComplete, this.rtTD);
if (!$auto_obj.data('ui-autocomplete')) {
$auto_obj.autocomplete(Drupal.autocomplete.options);
}
}
else {
$auto_obj = $(pf.editTaxText);
}
$auto_obj
/**
* Puts the currently highlighted suggestion into the autocomplete field.
* Overrides the function in autocomplete.js.
* Handles an autocompleteselect event.
*
* @param {jQuery.Event} event
* The event triggered.
* @param {object} ui
* The jQuery UI settings object.
*
* @return {boolean}
* Returns false to indicate the event status.
*/
.autocomplete('option', 'select',
function(event, ui) {
var ac_val = ui.item.value;
if (this.parentFunc) {
var pf = this.parentFunc;
if (pf.editTaxText === this) {
pf.editTaxSample.innerHTML = this.value = ui.item.label;
pf.editTaxField.value = ac_val;
return true;
}
// When the input field becomes disabled, the popup hangs around.
var i = ac_val.indexOf('-');
if (i > 0) {
var name = ac_val.substring(i + 1);
var mmtid = ac_val.substring(0, i);
event.target.value = '';
var found;
$(pf.leftTD)
.children(':not(label)')
.each(function() {
if (this.mmListArgs[1] == mmtid) {
found = $(this);
return false;
}
});
if (found) {
pf.setSelected(found);
return false;
}
if (!pf.haveActions || pf.oneRow) {
var sel = pf.selectedObj;
if (!sel) sel = $(pf.leftTD).children(':eq(1)');
sel[0].mmListArgs = [ name, mmtid, '', '' ];
if (pf.p.replaceCallback) pf.p.replaceCallback(pf, sel);
}
else {
pf.addItem(false, name, mmtid, '', '');
pf.setSelected();
}
pf.setHiddenElt();
pf.submitOnAdd(this);
$(pf.p.outerDiv) // update any details summary
.closest('details.vertical-tabs__pane')
.add('details#edit-settings-perms')
.trigger('summaryUpdated');
}
}
// Return false to tell jQuery UI that we've filled in the value already.
return false;
}
)
/**
* The search handler is called before a search is performed.
*
* @function Drupal.autocomplete.options.search
*
* @param {object} event
* The event triggered.
*
* @return {bool}
* Whether to perform a search or not.
*/
.autocomplete('option', 'search',
function(event) {
// Only search when the term is at least the minimum length of 2.
return event.target.value.length >= parms.autoComplete ? 2 : 1;
}
);
}
else if (parms.labelAboveInfo) {
this.infoDiv = $('<div />') // Info
.hide()
.css('whiteSpace', 'normal') // maybe needed?
.append($('<label />')
.html('<br />' + parms.labelAboveInfo))
.append(this.info = $('<div />')
.addClass('description'));
this.infoDiv.appendTo(this.rtTD);
}
// TRs go into a TBODY
var tbody = $('<tbody />');
// both TDs go into a TR
var tr = $('<tr />')
.append(this.leftTD)
.appendTo(tbody);
if (parms.flags.action_under) {
$('<tr />')
.append(this.rtTD)
.appendTo(tbody);
}
else tr.append(this.rtTD);
// TBODY goes into TABLE, which is appended to outer DIV
$('<table />')
.width('100%')
.append(tbody)
.appendTo(parms.outerDiv);
if (parms.selectCallback && !pf.oneRow)
$(this.leftTD).click(function() { // clicked in leftTD: unselect
pf.setSelected();
return true;
});
if (parms.imgPath && !parms.flags.readonly) {
var od = this.opsDiv = $('<div />')
.addClass('mmlist-opsdiv')
.css({'clear': 'both', 'float': 'right', 'padding-left': '3px'});
var addImg = function(path, title, id, func) {
if (!title) return;
$('<img />')
.attr({
id: 'mmBut' + id,
src: parms.imgPath + '/' + path, // activeSrc?
title: title
})
.bind('mmButEnabled', {}, func || function() {})
.appendTo(od);
};
addImg('top.gif', parms.labelTop, 0);
addImg('up.gif', parms.labelUp, 1);
addImg('del.gif', parms.labelX, 2);
$('<br />').appendTo(od);
addImg('bott.gif', parms.labelBott, 3);
addImg('down.gif', parms.labelDown, 4);
addImg('edit.gif', parms.labelEdit, 5);
}
if (parms.flags.initial_focus) {
$('[name="' + parms.flags.initial_focus + '"]', tbody).focus();
}
};
mmList.prototype = {
addButton: function(label, onclick, attr) {
attr = attr || false;
return $('<input type="button"/>')
.val(label)
.attr(attr)
.click(onclick);
},
showURLForm: function(type, item) {
$(':submit:not(.mmListNoDisable)', this.p.hiddenElt.form)
.add('.ui-dialog-buttonset :button', this.p.hiddenElt.form.parentNode)
.attr('disabled', true)
.addClass('mmListSubformDisabled');
this.insertPoint = this.selectedObj;
$(this.p.outerDiv).hide();
var t = $(':text', this.urlForm[type]);
if (!t.length) return;
if (type === 'query') {
this.editNameField = t[0];
this.editNameField.value = item ? item.mmListArgs[3] : '';
t = $('textarea', this.urlForm[type]);
if (!t.length) return;
this.editURLField = t[0];
this.editURLField.value = item ? item.mmListArgs[2] : '';
$(this.urlForm[type]).show();
this.editNameField.focus();
}
else {
this.editURLField = t[0];
this.editURLField.value = item ? item.mmListArgs[2] : '';
$(this.urlForm[type]).show();
this.editURLField.focus();
}
},
addItem: function(select) {
if (!this.leftTD || this.p.maxRows > 0 &&
this.leftTD.childNodes.length - 1 >= this.p.maxRows) return;
var ndiv = this.p.listObjDiv.clone(true);
var pf = this;
ndiv[0].mmListArgs = [];
for (var i = arguments.length; --i >= 1;)
ndiv[0].mmListArgs[i - 1] = arguments[i];
if (!this.p.flags.readonly)
ndiv.click(function(evnt) {
var target = $(evnt.target);
var disabled = target.attr('disabled');
if (evnt.target.tagName == 'IMG' && !(typeof disabled == 'string' ? disabled == 'true' : disabled)) {
var item = target.parents(':eq(1)');
var update = true;
var parent = $(pf.leftTD);
switch (evnt.target.id) {
case 'mmBut0': // top
item.insertAfter(parent.children(':eq(0)'));
break;
case 'mmBut1': // up
item.insertBefore(item.prev());
break;
case 'mmBut2': // delete
pf.setSelected(item);
if (evnt.shiftKey || !pf.p.delConfirmMsg || confirm(pf.p.delConfirmMsg)) {
if (pf.p.minRows > 0 && pf.leftTD.childNodes.length - 1 <= pf.p.minRows)
pf.clearRow(item[0]);
else item.remove();
item = null;
}
else update = false;
break;
case 'mmBut3': // bottom
item.appendTo(parent);
break;
case 'mmBut4': // down
item.insertAfter(item.next());
break;
case 'mmBut5': // edit
pf.editReplace = item;
if (item[0].mmListArgs[1] == 'url' || item[0].mmListArgs[1] == 'query') pf.showURLForm(item[0].mmListArgs[1], item[0]);
else if (item[0].mmListArgs[1] == 'taxon') pf.showTaxForm(item[0]);
else pf.openWind(item[0].mmListArgs[2]);
update = false;
break;
}
if (update) {
pf.setSelected(item || null);
pf.enableOpts();
pf.setHiddenElt();
}
}
else if (pf.p.selectCallback) {
this.blur();
if (!pf.oneRow) pf.toggleSelected.call(pf, $(this));
}
else return true;
return false;
});
if (this.p.addCallback) this.p.addCallback(this, ndiv);
ndiv.show();
if (this.oneRow || select) this.setSelected(ndiv);
else if (this.p.selectCallback) this.p.selectCallback(this, ndiv, false);
mmListInsertBefore(this.leftTD, ndiv[0], this.insertPoint);
this.insertPoint = null;
if (select) this.enableOpts();
this.setHiddenElt();
return ndiv[0];
},
submitOnAdd: function(obj) {
if (this.p.flags.submit_on_add) {
if (obj) {
var popup = obj.popup;
if (popup) {
obj.popup = null;
$(popup).remove();
}
obj.selected = false;
}
var form = $(this.rtTD).closest('form');
var button = form.find(':button:not(.mmjs-rtTD>input)');
if (button.length == 1) button.click();
else {
button = form.find('.form-actions :submit:first');
if (button.length) button.click();
else form.submit();
}
}
},
enableFuncs: [
function(i) { return i > 1; }, // top
function(i) { return i > 0; }, // up
null,
function(i, pflen) { return i < pflen - 3; },
function(i, pflen) { return i < pflen - 2; },
null ],
enableOpts: function() {
var pf = this;
$(this.leftTD).children(':not(label)').each(function(i) {
$('.mmlist-opsdiv', this)
.children('img')
.each(function() {
var fn = pf.enableFuncs[this.id.substring(5)];
if (fn) {
var disable = fn(i, pf.leftTD.childNodes.length) ? undefined : true;
var obj = $(this);
if (disable != obj.attr('disabled')) {
if (disable) {
this.oldTitle = this.title;
obj
.attr({
disabled: true,
title: ''})
.css('opacity', 0.15);
}
else {
obj
.attr({
disabled: false,
title: this.oldTitle})
.css('opacity', 1);
}
}
}
});
$(this).css('borderBottom',
pf.p.flags.action_under && pf.rtTD.childNodes.length ?
'1px solid #bfbe95' : 'none');
});
},
unselect: function() {
if (!this.p.selectCallback) return;
var pf = this.pf;
$(this.leftTD)
.children(':not(label)')
.each(function() {
pf.p.selectCallback(pf, $(this), false);
});
},
getSelected: function() {
return this.selectedObj;
},
toggleSelected: function(obj) {
if (this.selectedObj && obj && this.selectedObj[0] == obj[0]) obj = null;
this.setSelected(obj);
},
setSelected: function(obj) {
if (this.selectedObj != obj) {
this.unselect();
this.selectedObj = obj;
if (obj) {
var ret;
if (this.p.selectCallback)
ret = this.p.selectCallback(this.pf, obj, !this.oneRow);
if (this.delBut) this.delBut.attr('disabled', false);
if (this.editBut) this.editBut.attr('disabled', false);
if (this.infoDiv) {
if (ret == '') this.infoDiv.hide();
else {
this.info.html(ret);
if (typeof Drupal.behaviors.MMDialog == 'object') Drupal.behaviors.MMDialog.attach(document, drupalSettings);
this.infoDiv.show();
}
}
}
else {
if (this.delBut) this.delBut.attr('disabled', true);
if (this.editBut) this.editBut.attr('disabled', true);
if (this.infoDiv) this.infoDiv.hide();
}
if (this.p.maxRows > 0 && this.addBut)
$(this.addBut).attr('disabled', this.leftTD.childNodes.length - 1 >= this.p.maxRows);
this.insertPoint = null;
}
},
clearRow: function(obj) {
$(':input', obj)
.unbind('change');
$(':checkbox', obj).each(function() {
$(this).prop('checked', this.defaultChecked);
});
$(':input:not(:checkbox)', obj).val('');
},
delSelected: function() {
if (this.p.minRows > 0 && this.leftTD.childNodes.length - 1 <= this.p.minRows)
this.clearRow(this.selectedObj);
else if (this.oneRow) {
this.selectedObj[0].mmListArgs = [ '', '', '', '' ];
var ret = this.p.replaceCallback(this.pf, this.selectedObj);
if (this.info) this.info.html(ret);
if (this.infoDiv) this.infoDiv.hide();
this.setHiddenElt();
return;
}
else this.selectedObj.remove();
this.setSelected();
this.setHiddenElt();
},
addFromChild: function(obj, info, node, name) {
if (!obj) return;
var url = [ obj.id.substring(5) ];
var longPath = [ $('a:first', obj).html().replace(/<(\w+).*?>.*?<\/\1>/g, '').replace(/^[\s\xA0]+/, '').replace(/[\s\xA0]+$/, '') ];
$(obj).parents('li[id^=mmbr-]').each(function() {
url.unshift(this.id.substring(5));
longPath.unshift($('a:first', this).html().replace(/<(\w+).*?>.*?<\/\1>/g, '').replace(/^[\s\xA0]+/, '').replace(/[\s\xA0]+$/, ''));
});
if (!isNaN(info)) info = longPath.join(' » ');
var arg1 = this.taxForm ? 'cat' : url[url.length - 1];
if (node) arg1 += '/' + node;
else if (!name) name = longPath[longPath.length - 1];
Drupal.mmDialogClose();
var ok = false;
if (this.editReplace) {
if (this.p.replaceCallback) {
this.editReplace[0].mmListArgs = [ name, arg1, url.join('/'), info ];
var ret = this.p.replaceCallback(this.pf, this.editReplace);
if (this.info) this.info.html(ret);
if (this.infoDiv) this.infoDiv.show();
}
this.setSelected(this.editReplace);
this.editReplace = null;
ok = true;
}
else {
var pf = this;
var path = url.join('/');
var found = null;
$(this.leftTD)
.children(':not(label)')
.each(function() {
if (pf.taxForm ? this.mmListArgs[1] == arg1 && this.mmListArgs[2] == path : this.mmListArgs[1] == url[url.length - 1]) {
found = $(this);
return false;
}
});
if (found) this.setSelected(found);
else {
this.addItem(true, name, arg1, path, info);
ok = true;
}
}
this.setHiddenElt();
if (ok) {
this.submitOnAdd();
}
},
setHiddenElt: function() {
if (!this.p.flags.readonly) {
var count = 0;
var val = '';
var pf = this.pf;
$(this.leftTD)
.children(':not(label)')
.each(function() {
var ret;
if (ret = pf.p.dataCallback(pf, $(this))) {
val += ret;
count++;
}
});
$(this.p.hiddenElt)
.val(val)
.trigger('change');
if (count) {
if (this.p.updateOnChangeName) {
var elt = $('[name="' + this.p.updateOnChangeName + '"]');
if (elt.length)
if (elt[0].type === 'checkbox') elt[0].checked = 0;
else elt[0].value = '';
}
if (typeof(this.p.updateOnChangeCallback) == 'function') {
this.p.updateOnChangeCallback(this.p);
}
}
if (this.p.maxRows > 0) {
if (this.p.autoComplete && !this.oneRow) $(this.p.autoComplete, this.p.outerDiv).attr('disabled', count >= this.p.maxRows);
$('.mm-list-add-button', this.p.outerDiv).attr('disabled', count >= this.p.maxRows);
}
window.mmListInstance = null;
if (typeof(MMSR_recalculate) == 'function') window.setTimeout(MMSR_recalculate, 0); // do this, instead of calling the func directly, due to a FF bug having to do with the iframe from which this code is called
}
},
dialogInstance: 1000,
openWind: function(url) {
window.mmListInstance = this;
Drupal.mmDialogAdHoc(this.p.popupBase + url, this.p.popupLabel, {iframe: true, fullSize: true});
}
};
mmListInsertBefore = function (parent, newnode, oldnode) {
return oldnode ? $(oldnode).before(newnode) : $(parent).append(newnode);
};
mmListImport = function (pf, value) {
var matches = value.split(/(.*?)\{(.*?)\}/);
var i = 0;
$(pf.leftTD)
.children(':not(label)')
.each(function() {
this.mmListArgs = [ matches[i + 2], matches[i + 1], '', '' ];
if (pf.p.replaceCallback) pf.p.replaceCallback(pf, $(this));
i += 3;
});
for (; i < matches.length - 1; i += 3)
pf.addItem(false, matches[i + 2], matches[i + 1], '', '');
};
mmListGetObj = function (where, instance) {
instance.parms.listObjDiv = $(instance.listObjDivSelector, where);
var outerDiv = $(instance.outerDivSelector, where);
instance.parms.outerDiv = outerDiv[0];
if (!instance.parms.outerDiv) return;
if (where !== $ && $(where).hasClass('subpanel-inited')) {
instance.parms.hiddenElt = $('.mm-list-hidden', outerDiv)[0];
if (typeof instance.parms.hiddenElt.mmList == 'object') return;
instance.parms.reInit = true;
}
else {
instance.parms.hiddenElt = $('<input type="hidden" id="' + instance.hiddenId + '" name="' + instance.hiddenName + '" class="mm-list-hidden" />')
.appendTo(outerDiv)[0];
}
instance.parms.autoComplete = instance.autoName ? 'input[name="' + instance.autoName + '"]' : null;
if (!instance.parms.listObjDiv.length || !instance.parms.hiddenElt) return;
instance.parms.hiddenElt.delAll = function() { // called by external onclick events, like when user clicks on a checkbox elsewhere on the form
if (this.mmList.oneRow) this.mmList.delSelected();
else {
$(this.mmList.leftTD)
.children(':not(label)')
.remove();
this.mmList.setSelected();
this.mmList.setHiddenElt();
}
};
$.each(['addCallback', 'replaceCallback', 'selectCallback', 'dataCallback', 'updateOnChangeCallback'], function(key, callback) {
if (instance.parms[callback] && typeof instance.parms[callback] !== 'function') {
instance.parms[callback] = mmListCallbacks[instance.parms[callback]];
}
});
return instance.parms.hiddenElt.mmList = new mmList(instance.parms);
};
mmListCallbacks = {
//------- Category callbacks -------
catAddCallback: function (pf, ndiv) {
// args: 0=text, 1=mmtid, 2=url, 3=longPath
mmListCallbacks.catReplCallback(pf, ndiv);
if (pf.opsDiv) mmListInsertBefore(ndiv, pf.opsDiv.clone(true), $(':first-child', ndiv));
mmListCallbacks.catSelectCallback(pf, ndiv, false);
},
catSelectCallback: function (pf, ndiv, state) {
var cls = state ? 'mm-list-selected' : 'mm-list';
ndiv.attr('class', cls);
$(':first-child', ndiv).attr('class', cls);
return ndiv[0].mmListArgs[3];
},
catReplCallback: function (pf, ndiv) {
$(':first-child', ndiv).html(ndiv[0].mmListArgs[0]);
return ndiv[0].mmListArgs[3];
},
catDataCallback: function (pf, ndiv) {
if (!ndiv[0].mmListArgs[1]) return false;
return ndiv[0].mmListArgs[1] + '{' + ndiv[0].mmListArgs[0] + '}';
},
//------- RSS Page callbacks -------
rssAddCallback: function (pf, ndiv) {
// args: 0=name, 1=type, 2=data, 3=longPath
if (pf.opsDiv) {
mmListInsertBefore(ndiv, pf.opsDiv.clone(true), $(':first-child', ndiv));
if (navigator.userAgent.indexOf('Firefox') >= 0) ndiv.children(':eq(1)').css('marginRight', '53px');
}
mmListCallbacks.rssReplCallback(pf, ndiv);
mmListCallbacks.rssSelectCallback(pf, ndiv, false);
},
rssSelectCallback: function (pf, ndiv, state) {
var cls = state ? 'mm-list-selected' : 'mm-list';
ndiv.attr('class', cls);
ndiv.children(':eq(1)').attr('class', cls);
return ndiv[0].mmListArgs[3];
},
rssReplCallback: function (pf, ndiv) {
ndiv.children(':eq(1)').html(ndiv[0].mmListArgs[0]);
return ndiv[0].mmListArgs[3];
},
rssDataCallback: function (pf, ndiv) {
return '{:' + ndiv[0].mmListArgs[0] + ':}{:' + ndiv[0].mmListArgs[1] + ':}{:' + ndiv[0].mmListArgs[2] + ':}';
},
//------- Generic List callbacks -------
listAddCallback: function (pf, ndiv) {
var radios = [], argsInd = -1;
var readOnly = pf.p.flags.readonly;
var args = ndiv[0].mmListArgs;
$(':input', ndiv).each(function() {
var roDiv;
if (readOnly) {
roDiv = $('<div />')
.addClass(this.type)
.attr({name: this.name, id: this.id});
}
else if (argsInd + 1 >= args.length) args[argsInd + 1] = '';
if (this.type == 'radio') {
this.name = '__radio/' + pf.leftTD.childNodes.length + '/' + this.name;
var k;
for (k = 0; k < radios.length; k++)
if (radios[k] == this.name) break;
if (k == radios.length) radios[++argsInd] = this.name;
this.argsIndex = argsInd;
if (readOnly) {
roDiv.html(args[argsInd] == this.value ? '[X]' : '[ ]');
if (args[argsInd] == this.value) roDiv.addClass('checked');
}
else this.checked = args[argsInd] == this.value;
}
else {
this.argsIndex = ++argsInd;
if (readOnly) {
if (this.type == 'checkbox') {
roDiv.html(args[argsInd] != '' ? '[X] ' : '[ ] ');
if (args[argsInd] != '') roDiv.addClass('checked');
}
else if (this.tagName == 'SELECT') {
this.value = args[argsInd] || '';
roDiv.html(this.options[this.selectedIndex].innerHTML);
}
else if (args[argsInd]) roDiv.html(args[argsInd]);
}
else if (this.type == 'checkbox') this.checked = args[argsInd] != '';
else this.value = args[argsInd] || '';
}
if (readOnly) roDiv.replaceAll(this);
else $(this).change(function() {
if (this.type == 'checkbox') args[this.argsIndex] = this.checked ? this.value : '';
else if (this.type == 'radio') {
if (this.checked) args[this.argsIndex] = this.value;
}
else args[this.argsIndex] = this.value;
pf.setHiddenElt();
return true;
});
});
if (pf.opsDiv) mmListInsertBefore(ndiv, pf.opsDiv.clone(true), ndiv.children(':eq(0)'));
},
listDataCallback: function (pf, ndiv) {
if (!ndiv[0].mmListArgs.length) return '';
return '{:' + ndiv[0].mmListArgs.join(':}{:') + ':}';
}
};
Drupal.behaviors.mmListInit = {
attach: function (context) {
$(once('mm-template', '.mm-template'))
.each(function() {
$('body').append(this.innerHTML);
});
if (typeof Drupal.behaviors.autocomplete !== 'undefined') {
Drupal.behaviors.autocomplete.attach($('body')[0]);
}
$.each(drupalSettings.MM.mmListInit, function(key, instance) {
if (instance) {
// Clone parms so that changes at lower levels don't affect other instances.
instance.parms = jQuery.extend(true, {}, instance.parms);
var obj = mmListGetObj(context, instance);
if (obj && obj.addItem) {
delete drupalSettings.MM.mmListInit[key];
$.each(instance.add, function(key, list) {
list.unshift(false);
obj.addItem.apply(obj, list);
});
obj.enableOpts();
if (instance.parms.autoChoose) {
// Pause a moment so that the main dialog can fully initialize before the modal opens.
setTimeout(function() {obj.editBut.click()}, 500);
}
}
}
});
}
};
})(jQuery, Drupal, drupalSettings);
