/*
 * jQuery Expand
 *
 * Copyright (c) 2010 Peter Schulz
 *
 */

(function($) {

jQuery.fn.expand = function(options) {

	var options = $.extend({
				data: false,
				form: false,
				url: false,
				target: false,
				expanded: false,
				expandClass: 'expand',
				expandedClass: 'expanded',
				loadingClass: 'loading',
				successClass: 'success',
				errorClass: 'error',
				ajaxCache: true,
				ajaxMethode: 'GET',
				cookie: false,
				cookieScope: 'settings',
				expandEvent: 'click',
				collapseEvent: 'click',
				expandEffect: function(e){$(e).show()},
				collapseEffect: function(e){$(e).hide()}
			},options);
	

	$(this).each(function(){
		
		var el = this;
		var opt = 0;

		var expanded = options.expanded;
		var target = options.target || $(this).attr("target");
		var url = options.url || $(this).attr("href");
		options.form = options.form ||  $(this).attr("rel");
		if(!target || target == '') target = $(this).next();
		$(target).hide();
		if(!$(this).hasClass(options.expandClass)) $(this).addClass(options.expandClass);
		if($(this).hasClass(options.expandedClass)) expanded = true;

		if(options.cookie){
			if($.cookie){
				var id = $(target).attr('id');
				opt = getSetting(id);
				if(id != ''){
					if(opt==1){
						expanded = true;
					}
					if(opt==0){
						$(el).removeClass(options.expandedClass);
						expanded = false;
					}
				}else{
					alert('id of target element is not defined')
				}
			}else{
				alert('jquery.cookie not installed!');
			}
		}
		
		if( expanded ){
			expand(el,target,url);
		}else{
			$(el).one(options.expandEvent, function(){
				expand(el,target,url);
				this.blur();
				return false;
			});
		}
		
	});
	
	
	function expand(el,target,url){

		$(el).one(options.collapseEvent, function(){
			collapse(el,target,url);
			this.blur();
			return false;
		});

		if( url && url!="" && url!="#" && (!$(target).hasClass('ajaxloaded') || !options.ajaxCache ) ){ // ajax cached
			$(el).removeClass(options.successClass +' '+options.errorClass).addClass(options.loadingClass);
			var postdata = options.data || $(options.form).serialize();
			$.ajax({
				type: options.ajaxMethode,
				cache: options.ajaxCache,
				url: url,
				data: postdata,
				success: function(response){
					$(el).removeClass(options.loadingClass).addClass(options.successClass);
					$(target).addClass('ajaxloaded').html(response);
					$(el).addClass(options.expandedClass);
					options.expandEffect(target);
				},
				error: function(response){
					$(el).removeClass(options.loadingClass).addClass(options.errorClass);
					$(target).html(response.responseText);
				}
			});
		}else{
			$(el).addClass(options.expandedClass);
			options.expandEffect(target);
		}
		if(options.cookie && $.cookie) setSetting($(target).attr('id'), 1);
	}
	
	
	function collapse(el,target,url){
		$(el).one(options.expandEvent, function(){
			expand(el,target,url);
			this.blur();
			return false;
		});
		options.collapseEffect(target,function(el){});
		$(el).removeClass(options.expandedClass);
		if(options.cookie && $.cookie) setSetting($(target).attr('id'), 0);
	}
	
	function setSetting(n,v){
		var settings = getSettings(); 
		settings['JQUERY.EXPAND'][n] = v;
		var str = $.toJSON(settings);
		$.cookie( options.cookieScope,str );
		return true;
	}
	
	function getSetting(n){
		var settings = getSettings(); 
		return settings['JQUERY.EXPAND'][n];
	}

	function getSettings(){
		var c = $.cookie(options.cookieScope);
		if(!c) c = '{}';
		var settings = $.parseJSON(c);
		if(typeof(settings['JQUERY.EXPAND']) == 'undefined' ) settings['JQUERY.EXPAND'] = {};
		return settings;
	}

	
}


})(jQuery);


