123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- /**
- * @files js for collapsible tree view with some helper functions for updating tree structure
- */
- (function ($) {
- Drupal.behaviors.TaxonomyManagerTree = {
- attach: function(context, settings) {
- var treeSettings = settings.taxonomytree || [];
- if (treeSettings instanceof Array) {
- for (var i=0; i<treeSettings.length; i++) {
- if (!$('#'+ treeSettings[i].id +'.tm-processed').length) {
- new Drupal.TaxonomyManagerTree(treeSettings[i].id, treeSettings[i].vid, treeSettings[i].parents);
- }
- }
- }
- //only add throbber for TM sites
- var throbberSettings = settings.TMAjaxThrobber || [];
- if (throbberSettings['add']) {
- if (!$('#taxonomy-manager-toolbar-throbber.tm-processed').length) {
- $('#taxonomy-manager-toolbar-throbber').addClass('tm-processed');
- Drupal.attachThrobber();
- Drupal.attachResizeableTreeDiv();
- Drupal.attachGlobalSelectAll();
- }
- }
- Drupal.attachMsgCloseLink(context);
- }
- }
- Drupal.TaxonomyManagerTree = function(id, vid, parents) {
- this.div = $("#"+ id);
- this.ul = $(this.div).children();
- this.form = $(this.div).parents('form');
- this.form_build_id = $(this.form).children().children(':input[name="form_build_id"]').val();
- this.form_id = $(this.form).children().children(' :input[name="form_id"]').val();
- this.form_token = $(this.form).children().children(' :input[name="form_token"]').val();
- this.language = this.getLanguage();
- this.treeId = id;
- this.vocId = vid;
- this.formParents = parents;
- this.childFormUrl = Drupal.settings.childForm['url'];
- this.siblingsFormUrl = Drupal.settings.siblingsForm['url'];
- this.attachTreeview(this.ul);
- this.attachSiblingsForm(this.ul);
- this.attachSelectAllChildren(this.ul);
- this.attachLanguageSelector();
- //attach term data js, if enabled
- var term_data_settings = Drupal.settings.termData || [];
- if (term_data_settings['url']) {
- Drupal.attachTermData(this.ul);
- }
- $(this.div).addClass("tm-processed");
- }
- /**
- * adds collapsible treeview to a given list
- */
- Drupal.TaxonomyManagerTree.prototype.attachTreeview = function(ul, currentIndex) {
- var tree = this;
- if (currentIndex) {
- ul = $(ul).slice(currentIndex);
- }
- var expandableParent = $(ul).find("div.hitArea");
- $(expandableParent).click(function() {
- var li = $(this).parent();
- tree.loadChildForm(li);
- tree.toggleTree(li);
- });
- $(expandableParent).parent("li.expandable, li.lastExpandable").children("ul").hide();
- }
- /**
- * toggles a collapsible/expandable tree element by swaping classes
- */
- Drupal.TaxonomyManagerTree.prototype.toggleTree = function(node) {
- $(node).children("ul").toggle();
- this.swapClasses(node, "expandable", "collapsable");
- this.swapClasses(node, "lastExpandable", "lastCollapsable");
- }
- /**
- * helper function for swapping two classes
- */
- Drupal.TaxonomyManagerTree.prototype.swapClasses = function(node, c1, c2) {
- if ($(node).hasClass(c1)) {
- $(node).removeClass(c1).addClass(c2);
- }
- else if ($(node).hasClass(c2)) {
- $(node).removeClass(c2).addClass(c1);
- }
- }
- /**
- * loads child terms and appends html to list
- * adds treeview, weighting etc. js to inserted child list
- */
- Drupal.TaxonomyManagerTree.prototype.loadChildForm = function(li, update, callback) {
- var tree = this;
- if ($(li).is(".has-children") || update == true) {
- $(li).removeClass("has-children");
- if (update) {
- $(li).children("ul").remove();
- }
- var parentId = Drupal.getTermId(li);
- var url = tree.childFormUrl +'/'+ this.treeId +'/'+ this.vocId +'/'+ parentId;
- var param = new Object();
- param['form_build_id'] = this.form_build_id;
- param['form_id'] = this.form_id;
- param['tree_id'] = this.treeId;
- param['form_parents'] = this.formParents;
- param['language'] = this.language;
- $.ajax({
- data: param,
- type: "GET",
- url: url,
- dataType: 'json',
- success: function(response, status) {
- $(li).append(response.data);
- var ul = $(li).children("ul");
- tree.attachTreeview(ul);
- tree.attachSiblingsForm(ul);
- tree.attachSelectAllChildren(ul);
- //only attach other features if enabled!
- var weight_settings = Drupal.settings.updateWeight || [];
- if (weight_settings['up']) {
- Drupal.attachUpdateWeightTerms(li);
- }
- var term_data_settings = Drupal.settings.termData || [];
- if (term_data_settings['url']) {
- Drupal.attachTermDataLinks(ul);
- }
- if (typeof(callback) == "function") {
- callback(li, tree);
- }
- }
- });
- }
- }
- /**
- * function for reloading root tree elements
- */
- Drupal.TaxonomyManagerTree.prototype.loadRootForm = function(tids) {
- var tree = this;
- var url = this.childFormUrl +'/'+ this.treeId +'/'+ this.vocId +'/0/';
- var param = new Object();
- param['form_build_id'] = this.form_build_id;
- param['form_id'] = this.form_id;
- param['tree_id'] = this.treeId;
- param['form_parents'] = this.formParents;
- param['language'] = this.language;
- param['terms_to_expand'] = tids; // can either be a single term id or concatinated ids
- $.ajax({
- data: param,
- type: "GET",
- url: url,
- dataType: 'json',
- success: function(response, status) {
- $('#'+ tree.treeId).html(response.data);
- var ul = $('#'+ tree.treeId).children("ul");
- tree.attachTreeview(ul);
- tree.attachSiblingsForm(ul);
- tree.attachSelectAllChildren(ul);
- Drupal.attachUpdateWeightTerms(ul);
- Drupal.attachTermDataLinks(ul);
- var lang = $('#edit-'+ tree.treeId +'-language').val();
- if (lang != "" && lang != tree.langauge) {
- $(tree.div).parent().siblings("div.taxonomy-manager-tree-top").find("select.language-selector option[value="+ lang +"]").attr("selected", "selected");
- }
- }
- });
- }
- /**
- * adds link for loading next siblings terms, when click terms get loaded through ahah
- * adds all needed js like treeview, weightning, etc.. to new added terms
- */
- Drupal.TaxonomyManagerTree.prototype.attachSiblingsForm = function(ul) {
- var tree = this;
- var url = this.siblingsFormUrl;
- var list = "li.has-more-siblings div.term-has-more-siblings";
- if (ul) {
- list = $(ul).find(list);
- }
- $(list).bind('click', function() {
- $(this).unbind("click");
- var li = this.parentNode;
- var all = $('li', li.parentNode);
- var currentIndex = all.index(li);
- var page = Drupal.getPage(li);
- var prev_id = Drupal.getTermId(li);
- var parentId = Drupal.getParentId(li);
- url += '/'+ tree.treeId +'/'+ page +'/'+ prev_id +'/'+ parentId;
- var param = new Object();
- param['form_build_id'] = tree.form_build_id;
- param['form_id'] = tree.form_id;
- param['tree_id'] = tree.treeId;
- param['form_parents'] = tree.formParents;
- param['language'] = tree.language;
- $.ajax({
- data: param,
- type: "GET",
- url: url,
- dataType: 'json',
- success: function(response, status) {
- $(list).remove();
- $(li).after(response.data);
- tree.attachTreeview($('li', li.parentNode), currentIndex);
- tree.attachSelectAllChildren($('li', li.parentNode), currentIndex);
- //only attach other features if enabled!
- var weight_settings = Drupal.settings.updateWeight || [];
- if (weight_settings['up']) {
- Drupal.attachUpdateWeightTerms($('li', li.parentNode), currentIndex);
- }
- var term_data_settings = Drupal.settings.termData || [];
- if (term_data_settings['url']) {
- Drupal.attachTermDataToSiblings($('li', li.parentNode), currentIndex);
- }
- $(li).removeClass("last").removeClass("has-more-siblings");
- $(li).children().children('.term-operations').hide();
- tree.swapClasses(li, "lastExpandable", "expandable");
- tree.attachSiblingsForm($(li).parent());
- }
- });
- });
- }
- /**
- * helper function for getting out the current page
- */
- Drupal.getPage = function(li) {
- return $(li).find("input:hidden[class=page]").attr("value");
- }
- /**
- * returns terms id of a given list element
- */
- Drupal.getTermId = function(li) {
- return $(li).children().children("input:hidden[class=term-id]").attr("value");
- }
- /**
- * return term id of a prent of a given list element
- * if no parent exists (root level), returns 0
- */
- Drupal.getParentId = function(li) {
- var parentId;
- try {
- var parentLi = $(li).parent("ul").parent("li");
- parentId = Drupal.getTermId(parentLi);
- } catch(e) {
- return 0;
- }
- return parentId;
- }
- /**
- * update classes for tree view, if list elements get swaped
- */
- Drupal.updateTree = function(upTerm, downTerm) {
- if ($(upTerm).is(".last")) {
- $(upTerm).removeClass("last");
- Drupal.updateTreeDownTerm(downTerm);
- }
- else if ($(upTerm).is(".lastExpandable")) {
- $(upTerm).removeClass("lastExpandable").addClass("expandable");
- Drupal.updateTreeDownTerm(downTerm);
- }
- else if ($(upTerm).is(".lastCollapsable")) {
- $(upTerm).removeClass("lastCollapsable").addClass("collapsable");
- Drupal.updateTreeDownTerm(downTerm);
- }
- }
- /**
- * update classes for tree view for a list element moved downwards
- */
- Drupal.updateTreeDownTerm = function(downTerm) {
- if ($(downTerm).is(".expandable")) {
- $(downTerm).removeClass("expandable").addClass("lastExpandable");
- }
- else if ($(downTerm).is(".collapsable")) {
- $(downTerm).removeClass("collapsable").addClass("lastCollapsable");
- }
- else {
- $(downTerm).addClass("last");
- }
- }
- /**
- * Adds button next to parent term to select all available child checkboxes
- */
- Drupal.TaxonomyManagerTree.prototype.attachSelectAllChildren = function(parent, currentIndex) {
- var tree = this;
- if (currentIndex) {
- parent = $(parent).slice(currentIndex);
- }
- $(parent).find('span.select-all-children').click(function() {
- tree.SelectAllChildrenToggle(this);
- });
- }
- /**
- * (un-)selects nested checkboxes
- */
- Drupal.TaxonomyManagerTree.prototype.SelectAllChildrenToggle = function(span) {
- var tree = this;
- if ($(span).hasClass("select-all-children")) {
- var li = $(span).parents("li:first");
- if ($(li).hasClass("has-children")) {
- this.loadChildForm(li, true, function(li, tree) {
- tree.swapClasses(li, "expandable", "collapsable");
- tree.swapClasses(li, "lastExpandable", "lastCollapsable");
- var this_span = $(li).find('span.select-all-children:first');
- tree.SelectAllChildrenToggle(this_span);
- return;
- });
- }
- else {
- $(span).removeClass("select-all-children").addClass("deselect-all-children");
- $(span).attr("title", Drupal.t("Deselect all children"));
- $(span).parents("li:first").find('ul:first').each(function() {
- var first_element = $(this).find('.term-line:first');
- $(first_element).parent().siblings("li").find('div.term-line:first :checkbox').attr('checked', true);
- $(first_element).find(' :checkbox').attr('checked', true);
- });
- }
- }
- else {
- $(span).removeClass("deselect-all-children").addClass("select-all-children");
- $(span).parents(".term-line").siblings("ul").find(':checkbox').attr("checked", false);
- $(span).attr("title", Drupal.t("Select all children"));
- }
- }
- /**
- * language selector
- */
- Drupal.TaxonomyManagerTree.prototype.attachLanguageSelector = function() {
- var tree = this;
- var selector = $(tree.div).parent().siblings("div.taxonomy-manager-tree-top").find("select.language-selector");
- $(selector).not(".selector-processed").change(function() {
- tree.language = $(this).val();
- tree.loadRootForm();
- });
- $(selector).addClass("selector-processed");
- }
- Drupal.TaxonomyManagerTree.prototype.getLanguage = function() {
- var lang = $('#edit-taxonomy-manager-top-language').val();
- if (typeof(lang) == "undefined") {
- return "";
- }
- return lang;
- }
- /**
- * return array of selected terms
- */
- Drupal.TaxonomyManagerTree.prototype.getSelectedTerms = function() {
- var terms = new Array();
- $(this.div).find("input[type=checkbox][checked]").each(function() {
- var term = $(this).parents("li").eq(0);
- terms.push(term);
- });
- return terms;
- }
- /**
- * returns li node for a given term id, if it exists in the tree
- */
- Drupal.TaxonomyManagerTree.prototype.getLi = function(termId) {
- return $(this.div).find("input:hidden[class=term-id][value="+ termId +"]").parent().parent();
- }
- Drupal.attachMsgCloseLink = function(context) {
- $(context).find('div.messages').once(function() {
- $('<span class="taxonomy-manager-message-close"><a href="" title="'+ Drupal.t('Close') +'">x</a></span>').appendTo(this).click(function() {
- $(this).parent().fadeOut('fast', function() {
- $(this).remove();
- });
- return false;
- });
- });
- }
- /**
- * attaches a throbber element to the taxonomy manager
- */
- Drupal.attachThrobber = function() {
- var div = $('#taxonomy-manager');
- var throbber = $('<img src="'+ Drupal.settings.taxonomy_manager['modulePath'] +'images/ajax-loader.gif" alt="" height="25">');
- throbber.appendTo("#taxonomy-manager-toolbar-throbber").hide();
- throbber.ajaxStart(function() {
- $(this).show();
- });
- throbber.ajaxStop(function() {
- $(this).hide();
- });
- throbber.ajaxError(function() {
- alert("An AJAX error occurred. Reload the page and check your logs.");
- $(this).hide();
- });
- }
- /**
- * makes the div resizeable
- */
- Drupal.attachResizeableTreeDiv = function() {
- $('img.div-grippie').each(function() {
- var staticOffset = null;
- var div = $(this).parents("fieldset").parent();
- $(this).mousedown(startDrag);
- function startDrag(e) {
- staticOffset = div.width() - e.pageX;
- div.css('opacity', 0.5);
- $(document).mousemove(performDrag).mouseup(endDrag);
- return false;
- }
- function performDrag(e) {
- div.width(Math.max(200, staticOffset + e.pageX) + 'px');
- return false;
- }
- function endDrag(e) {
- $(document).unbind("mousemove", performDrag).unbind("mouseup", endDrag);
- div.css('opacity', 1);
- }
- });
- }
- /**
- * Adds select all / remove selection functionality.
- */
- Drupal.attachGlobalSelectAll = function() {
- $('span.taxonomy-manager-select-helpers').once(function() {
- var form = $(this).parents('.form-wrapper:first');
- $(this).find('span.select-all-children').click(function() {
- // Only select those that are visible to the end user.
- $(form).parent().find(' :checkbox:visible').attr('checked', true);
- });
- $(this).find('span.deselect-all-children').click(function() {
- $(form).parent().find(':checkbox').attr("checked", false);
- });
- });
- }
- })(jQuery);
|