/*
 * toggle icons plugin
 */	

(function($) {
	
	/*
	 * Bind all toggle icons on body load
	 */
	
	$(document).ready(function() {
		// Perform action on all toggleIcons
		$("img[id$=" + $.fn.iconToggle.defaultSettings["iconSuffix"] + "]").initIconToggle();
		$("input[id$=" + $.fn.iconToggle.defaultSettings["iconSuffix"] + "]").initIconToggle();
	});
	
	
	/*
	 * The toggle function
	 */
	
	$.fn.initIconToggle = function() {
		return this.each(function() {
			var mainId = this.id.replace($.fn.iconToggle.defaultSettings["iconSuffix"], "");
			var me = $(this);
			
			if(this.tagName == "IMG")
			{
				me.css("cursor", "pointer");
			}
			
			if(this.ondblclick) {
				me.data("changeEvent", this.ondblclick);
				this.ondblclick = function() {};
			}
			me.click(function(event) {
				// Stop event propagation
				event.stopPropagation();
				$("#" + mainId).iconToggle();
			});
			
			// Hide if checkbox (used in forms)
			if(me.is("input"))
			{
				if(me.is(":checked"))
				{
					$("#" + mainId).show();
				}
				else
				{
					$("#" + mainId).hide();
				}
			}
		});
	};
	
	$.fn.iconToggle = function(options, effectIn, effectOut, callback) {
	
		if(!options)
			var options = {};
		if(!effectIn)
			var effectIn = $.fn.iconToggle.defaultEffectIn; 
		if(!effectOut)
			var effectOut = $.fn.iconToggle.defaultEffectOut;
	
		$.extend(options, $.fn.iconToggle.defaultSettings);
		var myCallback = callback;
		
		return this.each(function() {
			
			var obj = $(this);
			
			if(obj.data("animated"))
				return;
			if(options["toggleIcon"] == null)
				var objIcon = $("#" + obj.attr("id") + options["iconSuffix"]);
			else
				var objIcon = $(options["toggleIcon"]);
				
			var callback = function() {
				$(this).data("animated", false);
				
				if(!objIcon.hasClass("noChangeOnToggle") && objIcon.is("img")) {
					if($(this).is(":visible")) {
						objIcon.attr("src", options["upIcon"]);
						objIcon.attr("alt", options["upText"]);
					}
					else {
						objIcon.attr("src", options["downIcon"]);
						objIcon.attr("alt", options["downText"]);
					}
				}
				
				if($.isFunction(objIcon.data("changeEvent")))
					objIcon.each(function() { objIcon.data("changeEvent")(); });

				if($.isFunction(myCallback))
					$(this).each(myCallback);
			};
			
			var action;
			if(options["force"])
			{
				action = options["force"];
			}
			else if(objIcon.is("input"))
			{
				action = objIcon.is(":checked") ? "show" : "hide";
			}
			else
			{
				action = obj.is(":visible") ? "hide" : "show";
			}
			
			if(action == "show" && !obj.is(":visible"))
			{
				obj.ctdShow(effectIn[0], effectIn[2], effectIn[1], callback).data("animated", true);
			}
			else if(obj.is(":visible"))
			{
				obj.ctdHide(effectOut[0], effectOut[2], effectOut[1], callback).data("animated", true);
			}
				
			return obj;
	
		});
		
	}
	
	
	/*
	 * Settings
	 */
	
	$.fn.iconToggle.defaultSettings = {
		"downIcon": "down.png",
		"downText": "Fold out",
		"upIcon": "up.png",
		"upText": "Fold in",
		"iconSuffix": "_ti",
		"force": null
	};
	
	$.fn.iconToggle.defaultEffectIn = ['blind', 500, {"direction": "up"}];
	
	$.fn.iconToggle.defaultEffectOut = ['blind', 500, {"direction": "up"}];

})(jQuery);

