//##############################
// jQuery FCKEditor Plugin
// By Diego A. - diego@fyneworks.com
// 10-Aug-2007 - Added setHTML method
/*
 USAGE:
		$.fck.start({ path:'/path/to/fck/editor/' }); // initialize FCK editor
		$.fck.update(); // update value in textareas of each FCK editor instance
*/

/*# AVOID COLLISIONS #*/
if(jQuery) (function($){
/*# AVOID COLLISIONS #*/

$.extend($, {
	fck:{
		config: { Config: {} }, // default configuration
		path: '/fckeditor/', // default path to FCKEditor directory
  list: [], // holds a list of instances
  loaded: false, // flag indicating whether FCK script is loaded
		intercepted: null, // variable to store intercepted method(s)
		
		// utility method to read contents of FCK editor
		content: function(i, v){
			try{
				var x = FCKeditorAPI.GetInstance(i);
				if(v) x.SetHTML(v);
				return x.GetXHTML(true);
			}catch(e){ return ''; };
		}, // fck.content function
		
		// inspired by Sebastián Barrozo <sbarrozo@b-soft.com.ar>
		setHTML: function(i, v){
			if(typeof i=='object'){
				v = i.html;
				i = i.InstanceName || i.instance;
			};
			return $.fck.content(i, v);
		},
  
		// utility method to update textarea contents before ajax submission
		update: function(){
			// Update contents of all instances
			var e = $.fck.list;
			for(var i=0;i<e.length;i++){
				var ta = e[i].textarea;
				var ht = $.fck.content(e[i].InstanceName);
				ta.val(ht).filter('textarea').text(ht);
				if(ht!=ta.val())
				 alert('Critical error in FCK plugin:'+'\n'+'Unable to update form data');
			}
		}, // fck.update
		
		// utility method to create instances of FCK editor (if any)
		create: function(o/* options */){
			o = (o || $.fck.config);
			// Plugin options
			$.extend(o,{
				selector: (o.selector || 'textarea.fck'),
			 BasePath: (o.path || o.BasePath || $.fck.path)
			});
			// Find fck.editor-instance 'wannabes'
			var e = $(o.selector); if(!(e.size()>0)) return;
			// Load script and create instances
			if($.fck.loaded){
				$.fck.editor(e,o);
			}
			else{
				$.getScript(
					o.BasePath+'fckeditor.js',
					function(){
						$.fck.loaded = true;
						$.fck.editor(e,o);
					}
				);
			};
			// Return matched elements...
			return e;
		},
		
		// utility method to integrate this plugin with others...
		intercept: function(){
			if($.fck.intercepted) return;
			// This method intercepts other known methods which
			// require up-to-date code from FCKEditor
			$.fck.intercepted = {
			 ajaxSubmit: $.fn.ajaxSubmit || function(){}
			};
			$.fn.ajaxSubmit = function(){
				//LOG('#########################################');
				//LOG($.fck.list);
				//LOG('#########################################');
				$.fck.update(); // update html
				return $.fck.intercepted.ajaxSubmit.apply( this, arguments );
			};
		},
		
		// utility method to create an instance of FCK editor
		editor: function(e /* elements */, o /* options */){
			o = (o || $.fck.config);
			// Default configuration
			$.extend(o,{
			 Width: (o.width || o.Width || '450px'),
			 Height: (o.height || o.Height|| '300px'),
			 BasePath: (o.path || o.BasePath || $.fck.path),
			 ToolbarSet: (o.toolbar || o.ToolbarSet || 'Default'),
			 Config: (o.config || o.Config || {})
			});
			/*
			$.extend(o.Config,{
    CustomConfigurationsPath: o.BasePath+'fck.js'
   });
			*/
			// Make sure we have a jQuery object
			e = $(e);
			if(e.size()>0){
				// Local array to store instances
				var a = ($.fck.list || []);
				// Go through objects and initialize fck.editor
				e.each(
					function(i,t){
						var T = $(t);// t = element, T = jQuery
						t.name = (t.name || 'fck'+($.fck.list.length+1));
						t.id = (t.id || t.name);
						if(t.id/* has id */ && !t.fck/* not already installed */){
							var n = a.length;
							
							a[n] = new FCKeditor(t.id);
							$.extend(a[n], o);
							a[n].ReplaceTextarea();
							a[n].textarea = T;
							
							t.fck = a[n];
						};
					}
				);
				// Store instances in global array
				$.fck.list = a;
			};
			// return jQuery array of elements
		 return e;
		}, // fck.editor function
		
		// start-up method
		start: function(o/* options */){
			// Attach itself to known plugins...
			$.fck.intercept();
			// Create FCK editors
			return $.fck.create(o);
		} // fck.start
		
 } // fck object
	//##############################
	
});
// extend $
//##############################

/*# AVOID COLLISIONS #*/
})(jQuery);
/*# AVOID COLLISIONS #*/
