web/drupal/modules/fckeditor/plugins/linktomenu/jscripts/functions.js
branchdrupal
changeset 74 0ff3ba646492
equal deleted inserted replaced
73:fcf75e232c5b 74:0ff3ba646492
       
     1 // $Id: functions.js,v 1.1.6.2 2008/12/05 11:24:59 wwalc Exp $
       
     2 
       
     3 function preinit() {
       
     4 	// Initialize
       
     5 	tinyMCE.setWindowArg('mce_windowresize', false);
       
     6 }
       
     7 
       
     8 function init() {
       
     9   window.focus();
       
    10   loadCategories(null);
       
    11 }
       
    12 
       
    13 /**
       
    14  * loadCategories()
       
    15  * @param obj parent Object
       
    16  **/
       
    17 function loadCategories(obj) {
       
    18   var params = '';
       
    19   var mid = '0';
       
    20   var top = 75;
       
    21   var objTop;
       
    22   if (obj != null) {
       
    23     mid = $(obj).get(0).value;
       
    24 
       
    25     try
       
    26     {
       
    27       objTop = $(obj).attr('id').match(/_(\d+)_sel/);
       
    28       top += (objTop[1] * 17);
       
    29     }
       
    30     catch (e) {
       
    31       top += 0;
       
    32     }
       
    33   }
       
    34   params = 'ltc-type=linktocontent_menu&ltc-menu-id=' + mid;
       
    35 
       
    36   $('#statusImg').css({top: top + 'px'}).show();
       
    37 
       
    38   $.ajax({
       
    39     type: "POST",
       
    40     url: _getBaseHref() + 'index.php?q=linktocontent',
       
    41     data: params,
       
    42     error: function(xml, msg, exc) {
       
    43       $('#statusImg').hide();
       
    44       alert('Error: ' + msg + '\n' + xml.responseText);
       
    45     },
       
    46     success: function(data){
       
    47       try {
       
    48         var results = eval('(' + data + ');');
       
    49         _clearNodeList();
       
    50         if ((obj == null) || ($(obj).get(0).value > -1)) {
       
    51           if (_fillDropdown(obj, results)) {
       
    52             window.resizeBy(0, 17);
       
    53           }
       
    54         }
       
    55         _fillNodelist(results);
       
    56       }
       
    57       catch (e) {
       
    58         alert('Error on retrieving data from module.\n' + e.name + '\n' + e.message);
       
    59       } 
       
    60       finally {
       
    61         $('#statusImg').hide();
       
    62       }
       
    63     }});
       
    64 }
       
    65 
       
    66 function insertAction() {
       
    67   if (selectedNode == null) {
       
    68     return;
       
    69   }
       
    70 	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
       
    71 	var elm = inst.getFocusElement();
       
    72 
       
    73 	elm = tinyMCE.getParentElement(elm, "a");
       
    74 
       
    75 	tinyMCEPopup.execCommand("mceBeginUndoLevel");
       
    76 
       
    77 	// Create new anchor elements
       
    78 	var path = selectedNode.cells[0].firstChild.nodeValue;
       
    79 	if (elm == null) {
       
    80 		var insertText = selectedNode.cells[1].firstChild.nodeValue;
       
    81     if (inst.selection.getSelectedText().length == 0) {
       
    82       tinyMCEPopup.execCommand("mceInsertContent", false,
       
    83         '<a href="' + path + '">' + insertText + '</a>');
       
    84 		}
       
    85     else {
       
    86    	  tinyMCEPopup.execCommand("mceInsertContent", false,
       
    87         '<a href="' + path + '">' + inst.selection.getSelectedHTML() + '</a>');
       
    88     } // end (getSelectedText == 0)
       
    89 	}
       
    90   else {
       
    91     elm.setAttribute("mce_href", path);
       
    92   	// Refresh in old MSIE
       
    93   	if (tinyMCE.isMSIE5)
       
    94   		elm.outerHTML = elm.outerHTML;
       
    95 	}
       
    96 
       
    97 	tinyMCE._setEventsEnabled(inst.getBody(), false);
       
    98 	tinyMCEPopup.execCommand("mceEndUndoLevel");
       
    99 	tinyMCEPopup.close();
       
   100 }
       
   101 
       
   102 function loadScript(url) {
       
   103   $('head', document).append('<script type="text/javascript" src="' + url + '"></script>');
       
   104 }
       
   105 
       
   106 /**
       
   107  * returns the base drupal path
       
   108  * @access public
       
   109  **/
       
   110 function _getBaseHref() {
       
   111   var url = baseUrl.substring(0, baseUrl.indexOf('modules/'));
       
   112   if (url.indexOf('sites/') > -1)
       
   113     url = url.substring(0, url.indexOf('sites/'));
       
   114   return url;
       
   115 }
       
   116 
       
   117 // dropdown functions
       
   118 /**
       
   119  *
       
   120  * @access public
       
   121  * @return void
       
   122  **/
       
   123 function _createDropdown(obj){
       
   124   var dropdown;
       
   125   var elemname = '';
       
   126   if (obj == null) {
       
   127     elemname = 'browse_sel_-1';
       
   128   }
       
   129   else {
       
   130     elemname = $(obj).parent().attr('id');
       
   131     _removeDescendant($(obj));
       
   132   }
       
   133 
       
   134   var level = parseInt(elemname.substring(elemname.lastIndexOf("_") + 1, elemname.length)) + 1;
       
   135 
       
   136   var elemBase = elemname.substring(0, elemname.lastIndexOf("_") + 1);
       
   137 
       
   138   // create surrounding <div>
       
   139   var sel_div = $('<div></div>');
       
   140   $(sel_div).attr('name', elemBase + level);
       
   141   $(sel_div).attr('id', elemBase + level);
       
   142   $(sel_div).attr('style', 'display: block; margin: 1px 0; padding: 0; border: 0;');
       
   143 
       
   144   // create <select>
       
   145   var select = $('<select></select>');
       
   146   $(select).attr('size', 1);
       
   147   $(select).attr('name', elemBase + level + '_sel');
       
   148   $(select).attr('id', elemBase + level + '_sel');
       
   149 
       
   150   // add event handler
       
   151   $(select).change(function() {
       
   152     _removeDescendant($(this).parent());
       
   153     _clearNodeList();
       
   154     loadCategories($(this));
       
   155   });
       
   156 
       
   157   // create image (only if level > 0)
       
   158   if (level > 0) {
       
   159     var img = $('<img />');
       
   160     $(img).attr('id', elemname.substring(0, elemname.lastIndexOf('_') + 1) + level + '_img');
       
   161     $(img).attr('alt', '');
       
   162     $(img).attr('src', 'images/descendant.gif');
       
   163     // extra margin for IE
       
   164     $(img).css({margin: '0px 2px', border: 0});
       
   165     $(img).css({marginLeft: String((parseInt(level) - 1) * 14) + 'px', marginRight: '2px'});
       
   166     $(sel_div).append($(img));
       
   167   }
       
   168 
       
   169   $(sel_div).append($(select));
       
   170   $(sel_div).hide();
       
   171   $('#form_browse').append($(sel_div));
       
   172   $(sel_div).show('slow');
       
   173   return select;
       
   174 }
       
   175 
       
   176 /**
       
   177  * _fillDropdown
       
   178  * @return true if a dropdown was inserted
       
   179  **/
       
   180 function _fillDropdown(obj, results){
       
   181   if (results.menus != false) {
       
   182     var select = _createDropdown(obj);
       
   183     $(select).addOption(-1, FCKLang.DlgChooseCategory);
       
   184     for (key in results.menus) {
       
   185       if (results.menus[key].hasChildren) {
       
   186         $(select).addOption(results.menus[key].mid, results.menus[key].title);
       
   187       }
       
   188     }
       
   189     return true;
       
   190   }
       
   191   return false;
       
   192 }
       
   193 
       
   194 /**
       
   195 * remove "child" elements
       
   196 **/
       
   197 function _removeDescendant(elem) {
       
   198   if (elem == null)
       
   199     return;
       
   200   $(elem).next().each(
       
   201     function() {
       
   202       _removeDescendant($(this));
       
   203       window.resizeBy(0, -17);
       
   204       $(this).hide('slow').remove();
       
   205     }
       
   206   );
       
   207 }
       
   208 
       
   209 // nodelist functions
       
   210 var selectedNode = null;
       
   211 
       
   212 function _fillNodelist(results) {
       
   213   if ((results == null) || (results.menus == null) || (results.menus == false))
       
   214     return;
       
   215 
       
   216   for (key in results.menus) {
       
   217     if (results.menus[key].root) {
       
   218       continue;
       
   219     }
       
   220     _addNodeToList(results.menus[key]);
       
   221   }
       
   222 }
       
   223 
       
   224 function _clearNodeList() {
       
   225   $('#nodelist tbody tr').each(
       
   226     function() {
       
   227       $(this).remove();
       
   228     }
       
   229   );
       
   230 }
       
   231 
       
   232 function selectRow(row) {
       
   233   if (!row) {
       
   234     return;
       
   235   }
       
   236   $('#nodelist tbody tr').each(function() { 
       
   237     $(this).css({background: '#ffffff'}); 
       
   238     selectedNode = null; 
       
   239   });
       
   240   selectedNode = row;
       
   241   $(row).css({background: '#dadfe9'});
       
   242 }
       
   243 
       
   244 function _addNodeToList(node){
       
   245   var tr = $('<tr></tr>').appendTo('#nodelist tbody');
       
   246   tr.hover(
       
   247     function() {
       
   248       if (selectedNode != this) {
       
   249         $(this).css({background: '#cecece'});
       
   250       }
       
   251     },
       
   252     function() {
       
   253       if (selectedNode != this) {
       
   254         $(this).css({background: '#ffffff'});
       
   255       }
       
   256     }
       
   257   );
       
   258   tr.click(function() {
       
   259     selectRow(this);
       
   260   });
       
   261 
       
   262   $('<td class="nid">' + node.path + '</td>').appendTo(tr);
       
   263   $('<td>' + node.title + '</td>').appendTo(tr);
       
   264 }
       
   265 
       
   266 /**
       
   267  * make the nodelist accessible by keyboard
       
   268  **/
       
   269 $('.accessible').keypress(function(e) {
       
   270   switch (e.keyCode) {
       
   271     case 39:
       
   272     case 40: // move selection down
       
   273       if (selectedNode == null)
       
   274         selectedNode = $('#nodelist tbody tr').get(0);
       
   275       else
       
   276         selectedNode = $(selectedNode).next('tr').get(0);
       
   277       selectRow(selectedNode);
       
   278       break;
       
   279     case 37:
       
   280     case 38: // move selection up
       
   281       if (selectedNode == null)
       
   282         selectedNode = $('#nodelist tbody tr').get($('#nodelist tbody tr').length - 1);
       
   283       else
       
   284         selectedNode = $(selectedNode).prev('tr').get(0);
       
   285       selectRow(selectedNode);
       
   286     break;
       
   287   }
       
   288 });
       
   289 
       
   290 // options
       
   291 $.fn.addOption = function()
       
   292 {
       
   293 	if(arguments.length == 0)
       
   294     return this;
       
   295 	// select option when added? default is false
       
   296 	var selectOption = false;
       
   297 	// multiple items
       
   298 	var multiple = false;
       
   299 	if(typeof arguments[0] == "object")
       
   300 	{
       
   301 		multiple = true;
       
   302 		var items = arguments[0];
       
   303 	}
       
   304 	if(arguments.length >= 2)
       
   305 	{
       
   306 		if(typeof arguments[1] == "boolean")
       
   307       selectOption = arguments[1];
       
   308 		else if(typeof arguments[2] == "boolean")
       
   309       selectOption = arguments[2];
       
   310     if(!multiple)
       
   311 		{
       
   312 			var value = arguments[0];
       
   313 			var text = arguments[1];
       
   314 		}
       
   315 	}
       
   316 	this.each(
       
   317 		function()
       
   318 		{
       
   319 			if(this.nodeName.toLowerCase() != "select")
       
   320         return;
       
   321 			if(multiple)
       
   322 			{
       
   323 				for(v in items)
       
   324 				{
       
   325 					$(this).addOption(v, items[v], selectOption);
       
   326 				}
       
   327 			}
       
   328 			else
       
   329 			{
       
   330 				var option = document.createElement("option");
       
   331 				option.value = value;
       
   332 				option.text = text;
       
   333 				this.options.add(option);
       
   334 			}
       
   335 			if(selectOption)
       
   336 			{
       
   337 				this.options[this.options.length-1].selected = true;
       
   338 			}
       
   339 		}
       
   340 	)
       
   341 	return this;
       
   342 }
       
   343 
       
   344 $.fn.removeOption = function()
       
   345 {
       
   346 	if(arguments.length == 0)
       
   347     return this;
       
   348 	if(typeof arguments[0] == "string")
       
   349     var value = arguments[0];
       
   350 	else if(typeof arguments[0] == "number")
       
   351     var index = arguments[0];
       
   352 	else
       
   353     return this;
       
   354 	this.each(
       
   355 		function()
       
   356 		{
       
   357 			if(this.nodeName.toLowerCase() != "select")
       
   358         return;
       
   359 			if(value)
       
   360 			{
       
   361 				var optionsLength = this.options.length;
       
   362 				for(var i=optionsLength-1; i>=0; i--)
       
   363 				{
       
   364 					if(this.options[i].value == value)
       
   365 					{
       
   366 						this.options[i] = null;
       
   367 					}
       
   368 				}
       
   369 			}
       
   370 			else
       
   371 			{
       
   372 				this.remove(index);
       
   373 			}
       
   374 		}
       
   375 	)
       
   376 	return this;
       
   377 }