//*******************************************************************
//** Reference is a TinyMCE plugin to insert and edit content/resource/community reference code in TinyMCE editor
//** Author: COMSHARP
//** http://www.comsharp.com
//*******************************************************************
//** Reference 是一个用来在 TinyMCE 中插入和编辑内容/资源/社区引用的 TinyMCE 插件，可以直接调用 COMSHARP 后台的内容引用，资源引用，社区引用功能，生成引用代码，以便在您的内容中自动展示引用的内容，资源或社区帖子
//** 作者：锐商软件
//** http://www.comsharp.com
//*******************************************************************

(function() 
{
	//--------------------------------
	//- Load the language file | 加载语言文件 ( reference 就是该插件的名字 ）
	//--------------------------------
	tinymce.PluginManager.requireLangPack('reference');
	
	//********************************
	//** Plugin Initialization | 插件初始化
	//********************************
	tinymce.create('tinymce.plugins.reference', 
	{
		//--------------------------------
		//-- Initialization : Executed after the creation of the plugin  |  初始化： 插件被加载后执行该部分初始化代码
		//--------------------------------
		//-- @param ed  {tinymce.Editor} - Editor instance that the plugin is initialized in.      |  参数 ed {tinymce.Editor} - 该插件所在的 TinyMCE 编辑器实例
		//-- @param url {string}         - string url Absolute URL to where the plugin is located. |  参数 url {string}        - 该插件所在的绝对路径
		//--------------------------------
		init : function(ed, url) 
		{
			//--------------------------------
			//-- Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceReference'), ie when the tool button of this plugin clicked  |  注册 mceReference 命令，也就是点击了该插件按钮后执行的命令
			//--------------------------------
			ed.addCommand('mceReference', function() 
			{
				//--------------------------------
				//-- Check currently selected node for reference code   |    当前选中内容是不是包含引用代码 （[%p...%]  [%f...%]  [%r...%]）
				//--------------------------------
				if (isReferenceCode()==true)
				{
					//--------------------------------
					//-- Get current node in cursor position  |   获取当前光标所在位置的节点对象 （[%p...%]  [%f...%]  [%r...%]），如果是引用代码，则将当前节点内容载入，否则不载入
					//--------------------------------
					var currentNode = ed.selection.getNode();
					
					//--------------------------------
					//-- Get current node content  |   获取当前光标所在位置节点（element） 的内容 （也就是引用代码）
					//--------------------------------
					var currentNodeContent=currentNode.innerHTML;
				
					//--------------------------------
					//-- Select current node.   |    整个选中以便在完成后，重新插入的引用代码可以替换原来旧的
					//--------------------------------
					ed.selection.select(currentNode, currentNode.nodeName); 
					
					//--------------------------------
					//-- Open plugin dialogue window   |   打开插件窗口
					//--------------------------------
					ed.windowManager.open(
					{
						//--------------------------------
						//-- Plugin window path and property   |   插件窗口路径和属性
						//--------------------------------
						file : url + '/dialog.htm',
						width : 500,
						height : 380,
						inline : 1
					}, 
					{
						//--------------------------------
						//-- Plugin more property   |   插件更多属性 （包括要编辑的代码内容，以及代码语言等属性）
						//--------------------------------
						plugin_url : url, 
						replace_content : true,
						current_node_content : currentNodeContent
					});
				}
				else
				{
					//--------------------------------
					//-- Current Node  |  当前节点
					//--------------------------------
					var currentNode = ed.selection.getNode();
			
					ed.windowManager.open(
					{
						file : url + '/dialog.htm',
						width : 500,
						height : 380,
						inline : 1
					}, 
					{
						plugin_url : url, // Plugin absolute URL
						replace_content : false
					});
				}
			});

			//--------------------------------
			//-- Register plugin  button   |    注册插件按钮 （描述，命令名，图标）
			//--------------------------------
			ed.addButton('reference', 
			{
				title : 'reference.desc',
				cmd : 'mceReference',
				image : url + '/img/reference.gif'
			});

			//--------------------------------
			//-- When the code was selected, change the button status   |    当编辑器中被编辑的代码被选中（或者光标置入）的时候，插件按钮状态发生变化
			//--------------------------------
			ed.onNodeChange.add(function(ed, cm, n) 
			{
				cm.setActive('reference', isReferenceCode()==true);				
			});

			//--------------------------------
			//-- Context menu   |   右键菜单
			//--------------------------------
			if(ed.plugins.contextmenu != undefined)
			{
				ed.plugins.contextmenu.onContextMenu.add(function(sender, menu)
				{
					//--------------------------------
					//-- Check currently selected node for reference code  |    当前选中内容是不是包含引用代码
					//--------------------------------
					if(isReferenceCode()) 
					{
						//--------------------------------
						//-- Define sub menu   |   定义右键子菜单
						//--------------------------------
						var sub_menu = menu.add(
						{
							title : ed.getLang('reference.context_menu_edit','Reference - Edit'),
							icon : url + '/img/reference.gif',
							
							onclick : function() 
							{ 
								//--------------------------------
								//-- Get current selected node |  当前被选中的内容节点 （光标所在节点）
								//--------------------------------
								var currentNode = ed.selection.getNode();
								
								//--------------------------------
								//-- Get current node content  |   获取当前光标所在位置节点（element） 的内容（也就是引用代码）
								//--------------------------------
								var currentNodeContent=currentNode.innerHTML;

								//--------------------------------
								//-- Select entire snippted and limit to element type.   |    整个选中以便在完成后，重新插入的代码可以替换原来旧的
								//--------------------------------
								ed.selection.select(currentNode, currentNode.nodeName); 
								
								//--------------------------------
								//-- Open the plugin dialogue window when this context menu clicked   |    右键菜单点中后，打开插件对话框窗口
								//--------------------------------
								ed.windowManager.open(
								{
									file : url + '/dialog.htm',
									width : 500,
									height : 380,
									inline : 1
								}, 
								{
									plugin_url : url, 
									replace_content : true,
									current_node_content : currentNodeContent
								});
							}
						});
					}
					else 
					{
						//--------------------------------
						//-- If current selected node contains no reference code   |   如果当前选中的节点不包含引用代码，则右键菜单设置为添加新引用代码
						//--------------------------------
						var sub_menu = menu.add(
						{
							title : ed.getLang('reference.context_menu_add','Reference - New'),
							icon : url + '/img/reference.gif',
							
							onclick : function() 
							{
								//--------------------------------
								//-- Current selected node  |  当前选中 node 
								//--------------------------------
								var currentNode = ed.selection.getNode();
							
								ed.windowManager.open(
								{
									file : url + '/dialog.htm',
									width : 500,
									height : 380,
									inline : 1
								}, 
								{
									plugin_url : url, // Plugin absolute URL
									replace_content : false
								});
							}
						});
					}
				});
			}
		},

		//--------------------------------
		//-- Creates control instances based in the incomming name. This method is normally not
		//-- needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons
		//-- but you sometimes need to create more complex controls like listboxes, split buttons etc then this
		//-- method can be used to create those.
		//--------------------------------
		//-- @param {String} n Name of the control to create.
		//-- @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.
		//-- @return {tinymce.ui.Control} New control instance or null if no control was created.
		//--------------------------------
		createControl : function(n, cm) 
		{
			return null;
		},

		//--------------------------------
		//-- Returns information about the plugin as a name/value array.
		//-- The current keys are longname, author, authorurl, infourl and version.
		//--------------------------------
		//-- @return {Object} Name/value array containing information about the plugin.
		//--------------------------------
		getInfo : function() 
		{
			return {
				longname : 'Reference',
				author : 'xxx',
				authorurl : 'http://www.xxx.com',
				infourl : 'http://www.xxx.com',
				version : "1.0"
			};
		}
		
	});

	//********************************
	//** Check the currently selected node to check whether it contains reference code.   |    检查当前选中的节点，判断是否包含引用代码 [%p...%]  [%f...%]  [%r...%]
	//********************************
	function isReferenceCode() 
	{
		var nodeContent = tinyMCE.activeEditor.selection.getNode().innerHTML;		
		
		if(/\[%[pfr][\s\S]+?%\]/gi.test(nodeContent)==true)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	//********************************
	//** Register plugin   |    注册插件
	//********************************
	tinymce.PluginManager.add('reference', tinymce.plugins.reference);
	
})();