var jsdebug = [];

(function($) {

jQuery.fn.expand = function(options) {

	var options = $.extend({
				data: false,
				url: false,
				target: false,
				expanded: false,
				expandClass: 'expand',
				expandedClass: 'expanded',
				loadingClass: 'loading',
				successClass: 'success',
				errorClass: 'error',
				ajaxCache: true,
				ajaxMethode: 'GET',
				expandEvent: 'click',
				collapseEvent: 'click',
				expandEffect: function(e){$(e).show()},
				collapseEffect: function(e){$(e).hide()}
			},options);
	
	
	$(this).each(function(){
		
		var thisSelf = this;
		var target = options.target || $(this).attr("target");
		var url = options.url || $(this).attr("href");
		var data = options.data ||  $($(this).attr("rel")).serialize();
		
		if (!target || target == '') target = $(this).next();
		if(!$(this).hasClass(options.expandClass)) $(this).addClass(options.expandClass);
		
		if(options.expanded || $(this).hasClass(options.expandedClass)){
			expand(thisSelf,target,url,data);
		}else{
			$(target).hide();
			$(thisSelf).one(options.expandEvent, function(){
				expand(thisSelf,target);
				this.blur();
				return false;
			});
		}
		
		/*
		$(this).bind(options.expandEvent, function(){
			if($(thisSelf).hasClass(options.expandedClass)){
				collapse(thisSelf,target);
			}else{
				expand(thisSelf,target,url,data);
			}
			this.blur();
			return false;
		});
		*/
	});
	
	
	function expand(thisSelf,target,url,data){

		$(thisSelf).one(options.collapseEvent, function(){
			collapse(thisSelf,target);
			this.blur();
			return false;
		});

		if( url && url!="" && url!="#" && (!$(target).hasClass('ajaxloaded') || !options.ajaxCache ) ){ // ajax cached
			var postdata = '';
			$(thisSelf).removeClass(options.successClass +' '+options.errorClass).addClass(options.loadingClass);
			$.ajax({
				type: options.ajaxMethode,
				url: url,
				data: data,
				success: function(response){
					$(thisSelf).removeClass(options.loadingClass).addClass(options.successClass);
					$(target).addClass('ajaxloaded').html(response);
					$(thisSelf).addClass(options.expandedClass);
					options.expandEffect(target);
				},
				error: function(response){
					$(thisSelf).removeClass(options.loadingClass).addClass(options.errorClass);
					$(target).html(response.responseText);
				}
			});
		}else{
			$(thisSelf).addClass(options.expandedClass);
			options.expandEffect(target);
		}
	}
	
	
	function collapse(thisSelf,target){
		$(thisSelf).one(options.expandEvent, function(){
			expand(thisSelf,target);
			this.blur();
			return false;
		});
		options.collapseEffect(target);
		$(thisSelf).removeClass(options.expandedClass); 
	}
	

}


})(jQuery);
