web/drupal/modules/fckeditor/plugins/linktonode/jscripts/functions.js
author cavaliet@caf4f556-3d62-0410-8435-a86758001935
Fri, 21 Aug 2009 16:26:26 +0000
branchdrupal
changeset 74 0ff3ba646492
permissions -rw-r--r--
Create branch for drupal with first commit from local working copy

// $Id: functions.js,v 1.1.6.2 2008/12/05 11:25:00 wwalc Exp $

function preinit() {
  // Initialize
  tinyMCE.setWindowArg('mce_windowresize', false);
}

function init() {
  window.focus();
  loadCategories(null);
}

/**
 * loadCategories()
 * @param obj parent Object
 **/
function loadCategories(obj) {
  var params = '';
  var vid = '-1';
  var top = 75;
  var objTop;
  if (obj != null) {
    var fSel = $('#browse_sel_0_sel');
    if (fSel !== null) {
      vid = $(fSel).get(0).value;
    }
    if ($(obj).attr('id') != 'browse_sel_0_sel') {
      params = '&ltc-term-id=' + $(obj).get(0).value;
    }

    try
    {
      objTop = $(obj).attr('id').match(/_(\d+)_sel/);
      top += (objTop[1] * 17);
    }
    catch (e) {
      top += 0;
    }
  }
  params = 'ltc-type=linktocontent_node&ltc-vocab-id=' + vid + params;

  $('#statusImg').css({top: top + 'px'}).show();

  $.ajax({
    type: "POST",
    url: _getBaseHref() + 'index.php?q=linktocontent',
    data: params,
    error: function(xml, msg, exc) {
      $('#statusImg').hide();
      alert('Error: ' + msg + '\n' + xml.responseText);
    },
    success: function(data){
      try {
        var results = eval('(' + data + ');');
        _clearNodeList();
        if ((obj == null) || ($(obj).get(0).value > -1)) {
          if (_fillDropdown(obj, results)) {
            window.resizeBy(0, 17);
          }
        }
        _fillNodelist(results);
      }
      catch (e) {
        alert('Error on retrieving data from module.\n' + e.name + '\n' + e.message);
      } 
      finally {
        $('#statusImg').hide();
      }
    }});
}

function insertAction() {
  if (selectedNode == null) {
    return;
  }
  var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
  var elm = inst.getFocusElement();

  elm = tinyMCE.getParentElement(elm, "a");

  tinyMCEPopup.execCommand("mceBeginUndoLevel");

  // Create new anchor elements
  if (elm == null) {
    var nid = selectedNode.cells[0].firstChild.nodeValue;
    var insertText = selectedNode.cells[1].firstChild.nodeValue;
    if (inst.selection.getSelectedText().length == 0) {
      tinyMCEPopup.execCommand("mceInsertContent", false,
        '<a href="' + nid + '">' + insertText + '</a>');
    }
    else {
       tinyMCEPopup.execCommand("mceInsertContent", false,
        '<a href="' + nid + '">' + inst.selection.getSelectedHTML() + '</a>');
    } // end (getSelectedText == 0)
  }
  else {
    elm.setAttribute("mce_href", selectedNode.cells[0].firstChild.nodeValue);
    // Refresh in old MSIE
    if (tinyMCE.isMSIE5)
      elm.outerHTML = elm.outerHTML;
  }

  tinyMCE._setEventsEnabled(inst.getBody(), false);
  tinyMCEPopup.execCommand("mceEndUndoLevel");
  tinyMCEPopup.close();
}

function loadScript(url) {
  $('head', document).append('<script type="text/javascript" src="' + url + '"></script>');
}

/**
 * returns the base drupal path
 * @access public
 **/
function _getBaseHref() {
  var url = baseUrl.substring(0, baseUrl.indexOf('modules/'));
  if (url.indexOf('sites/') > -1)
    url = url.substring(0, url.indexOf('sites/'));
  return url;
}

// dropdown functions
/**
 *
 * @access public
 * @return void
 **/
function _createDropdown(obj){
  var dropdown;
  var elemname = '';
  if (obj == null) {
    elemname = 'browse_sel_-1';
  }
  else {
    elemname = $(obj).parent().attr('id');
    _removeDescendant($(obj));
  }

  var level = parseInt(elemname.substring(elemname.lastIndexOf("_") + 1, elemname.length)) + 1;

  var elemBase = elemname.substring(0, elemname.lastIndexOf("_") + 1);

  // create surrounding <div>
  var sel_div = $('<div></div>');
  $(sel_div).attr('name', elemBase + level);
  $(sel_div).attr('id', elemBase + level);
  $(sel_div).attr('style', 'display: block; margin: 1px 0; padding: 0; border: 0;');

  // create <select>
  var select = $('<select></select>');
  $(select).attr('size', 1);
  $(select).attr('name', elemBase + level + '_sel');
  $(select).attr('id', elemBase + level + '_sel');

  // add event handler
  $(select).change(function() {
    _removeDescendant($(this).parent());
    _clearNodeList();
    loadCategories($(this));
  });

  // create image (only if level > 0)
  if (level > 0) {
    var img = $('<img />');
    $(img).attr('id', elemname.substring(0, elemname.lastIndexOf('_') + 1) + level + '_img');
    $(img).attr('alt', '');
    $(img).attr('src', 'images/descendant.gif');
    // extra margin for IE
    $(img).css({margin: '0px 2px', border: 0});
    $(img).css({marginLeft: String((parseInt(level) - 1) * 14) + 'px', marginRight: '2px'});
    $(sel_div).append($(img));
  }

  $(sel_div).append($(select));
  $(sel_div).hide();
  $('#form_browse').append($(sel_div));
  $(sel_div).show('slow');
  return select;
}

/**
 * _fillDropdown
 * @return true if a dropdown was inserted
 **/
function _fillDropdown(obj, results){
  if (results.categories != false) {
    var select = _createDropdown(obj);
    //<!-- linktonode START -->
    $(select).addOption(-1, FCKLang.DlgDrupalChooseCategory);
    //<!-- linktonode END -->
    for (key in results.categories)
      $(select).addOption(results.categories[key].tid, results.categories[key].title);
    return true;
  }
  return false;
}

/**
* remove "child" elements
**/
function _removeDescendant(elem) {
  if (elem == null)
    return;
  $(elem).next().each(
    function() {
      _removeDescendant($(this));
      window.resizeBy(0, -17);
      $(this).hide('slow').remove();
    }
  );
}

// nodelist functions
var selectedNode = null;

function _fillNodelist(results) {
  if ((results == null) || (results.nodes == null) || (results.nodes == false))
    return;

  for (key in results.nodes) {
    _addNodeToList(results.nodes[key]);
  }
}

function _clearNodeList() {
  $('#nodelist tbody tr').each(
    function() {
      $(this).remove();
    }
  );
}

function selectRow(row) {
  if (!row) {
    return;
  }
  $('#nodelist tbody tr').each(function() { 
    $(this).css({background: '#ffffff'}); 
    selectedNode = null; 
  });
  selectedNode = row;
  $(row).css({background: '#dadfe9'});
}

function _addNodeToList(node){
  var tr = $('<tr></tr>').appendTo('#nodelist tbody');
  tr.hover(
    function() {
      if (selectedNode != this) {
        $(this).css({background: '#cecece'});
      }
    },
    function() {
      if (selectedNode != this) {
        $(this).css({background: '#ffffff'});
      }
    }
  );
  tr.click(function() {
    selectRow(this);
  });

  $('<td class="nid">' + node.href + '</td>').appendTo(tr);
  $('<td>' + node.title + '</td>').appendTo(tr);
  $('<td>' + node.date + '</td>').appendTo(tr);
  $('<td>' + node.author + '</td>').appendTo(tr);
  $('<td class="nid">' + node.orig_href + '</td>').appendTo(tr);
}

/**
 * make the nodelist accessible by keyboard
 **/
$('.accessible').keypress(function(e) {
  switch (e.keyCode) {
    case 39:
    case 40: // move selection down
      if (selectedNode == null)
        selectedNode = $('#nodelist tbody tr').get(0);
      else
        selectedNode = $(selectedNode).next('tr').get(0);
      selectRow(selectedNode);
      break;
    case 37:
    case 38: // move selection up
      if (selectedNode == null)
        selectedNode = $('#nodelist tbody tr').get($('#nodelist tbody tr').length - 1);
      else
        selectedNode = $(selectedNode).prev('tr').get(0);
      selectRow(selectedNode);
    break;
  }
});

// options
$.fn.addOption = function()
{
  if(arguments.length == 0)
    return this;
  // select option when added? default is false
  var selectOption = false;
  // multiple items
  var multiple = false;
  if(typeof arguments[0] == "object")
  {
    multiple = true;
    var items = arguments[0];
  }
  if(arguments.length >= 2)
  {
    if(typeof arguments[1] == "boolean")
      selectOption = arguments[1];
    else if(typeof arguments[2] == "boolean")
      selectOption = arguments[2];
    if(!multiple)
    {
      var value = arguments[0];
      var text = arguments[1];
    }
  }
  this.each(
    function()
    {
      if(this.nodeName.toLowerCase() != "select")
        return;
      if(multiple)
      {
        for(v in items)
        {
          $(this).addOption(v, items[v], selectOption);
        }
      }
      else
      {
        var option = document.createElement("option");
        option.value = value;
        option.text = text;
        this.options.add(option);
      }
      if(selectOption)
      {
        this.options[this.options.length-1].selected = true;
      }
    }
  )
  return this;
}

$.fn.removeOption = function()
{
  if(arguments.length == 0)
    return this;
  if(typeof arguments[0] == "string")
    var value = arguments[0];
  else if(typeof arguments[0] == "number")
    var index = arguments[0];
  else
    return this;
  this.each(
    function()
    {
      if(this.nodeName.toLowerCase() != "select")
        return;
      if(value)
      {
        var optionsLength = this.options.length;
        for(var i=optionsLength-1; i>=0; i--)
        {
          if(this.options[i].value == value)
          {
            this.options[i] = null;
          }
        }
      }
      else
      {
        this.remove(index);
      }
    }
  )
  return this;
}