/*
 itools Accordion version 1.0
*/

(function ($) {

	var options = {
	};

var AccordionElementClass = function (el, opt) {

		this.options = {};
		this.accordion = el;
		this.debug = false;

		this.init = function (object, opt)
	    {
			var defaults = {
					"api": false,
					"toggleSelector": ".slidingContent",
					"multi": false,
					"initOpen": false,
					"toggleLinkSelector": ".slideLink",
					"linkOpenTitle": "Weniger anzeigen",
					"itemSelector": ".accordion",
					"linkCloseTitle": "Mehr erfahren",
					"linkInfoClass": "moreInfo",
					"toggleClass": "open",
					"slideSpeed": "slow",
					"toggleTextClass": "moreInfo",
					"noToggleTextClass": "noToggleText",
					"live": true,
					"toggleElementPosition": "top", // Position of the Toggle Elemente
					"scrollToPlugin": {
							"use": true,
							"speed": 400,
							"offset": 20
					},
					"debug": false
	    	};

	    	this.options = jQuery.extend(true, defaults, opt);


			if(this.options.debug)
			{
				iTim.log("Current options:");
				iTim.log(this.options);
			}

	    	this.accordion.addClass("jQueryPluginAccordionProceed");
			this.initAccordion();
			this.initOpenElements();

			this.accordion.change(function() {
				  alert('Handler for .change() called.');
				});

	    };

	    this.initOpenElements = function ()
	    {
	    	if(typeof(this.options.initOpen) == 'number' || jQuery.isArray(this.options.initOpen))
			{
				var elements = $(this.options.toggleLinkSelector, this.accordion);
				if(typeof(this.options.initOpen) == 'number')
				{
					this.options.initOpen = [this.options.initOpen];
				}
				for (i=0;i<this.options.initOpen.length;i++)
				{
					$(elements[this.options.initOpen[i]]).triggerHandler("click");
				}
			}
	    },
	    this.scrollToElement = function (link)
	    {
	       	var opt = this.options;

	       	if(opt.debug)
			{
				iTim.log("Proceed: toggleElementPosition: "+opt.toggleElementPosition);
				iTim.log("Proceed: opt.scrollToPlugin.use: "+opt.scrollToPlugin.use);
				iTim.log("Proceed: slideToggle with has opt.toggleClass: "+ link.hasClass(opt.toggleClass));
			}

			jumpTarget = link.closest(opt.itemSelector);
			if(opt.debug)
			{
				iTim.log("Proceed: with JumpTarget: ");
				iTim.log(jumpTarget);
			}

			if(!jumpTarget.length)
			{
				return;
			}

			if(opt.scrollToPlugin.use && $.fn.scrollTo)
			{
				$.scrollTo(jumpTarget,opt.scrollToPlugin.speed, { axis:'y', offset:-opt.scrollToPlugin.offset });
			}
			else
			{
				$(document.documentElement).scrollTop(jumpTarget.offset().top-opt.scrollToPlugin.offset);
			}
	    },
	    this.hideAccordion = function (element)
	    {

	    },
	    this.proceedAccordion = function (element)
	    {
	    	var opt = this.options;
	    	var accordion = this.accordion;

	    	var obj = this;

	    	// Live handler called.
  			var link = $(element);
			if(opt.debug)
			{
				iTim.log(link);
				iTim.log($(element));
				iTim.log("live");
			}
			if("false" == opt.multi || false == opt.multi)
			{
				if(opt.debug)
    			{
    				iTim.log("Proceed Multi Mode: "+opt.multi);
    			}
				/* if the request element is not the currently opened element: disable all opened elements */
    			if(!element.hasClass(opt.toggleClass))
    			{
    				if(opt.debug)
	    			{
    					iTim.log("Found toggle elements to hide:");
	    				iTim.log($(opt.toggleSelector, accordion));
	    			}

	    			$(opt.toggleSelector, accordion).each(function(index, element)
					{
						$(element).hide();

						$(opt.toggleLinkSelector, accordion).removeClass(opt.toggleClass);
	    			});
	    		}
			}
			if(opt.debug)
			{
				iTim.log("Proceed: top toggleElementPosition: "+opt.toggleElementPosition);
			}
			if(opt.toggleElementPosition == "top")
			{
				link.blur().toggleClass(opt.toggleClass).next(opt.toggleSelector).slideToggle(opt.slideSpeed, function() {
					obj.scrollToElement(link);
				  });

			}
			else
			{

				link.blur().toggleClass(opt.toggleClass).prev(opt.toggleSelector).slideToggle(opt.slideSpeed, function() {
					obj.scrollToElement(link);
				  });
			}


    		/*
    		 * config Toggle-Link with custom Text
    		 */
    		if (link.hasClass(opt.toggleTextClass)) {
    			text = {
    				open: opt.linkOpenTitle,
    				close: opt.linkCloseTitle
    			}
    		}

    		/*
    		 * chance toggle-link-text
    		 */
    		if (!link.hasClass(opt.noToggleTextClass))
    		{
    			if(opt.debug)
    			{
					iTim.log("Proceed: change toggle text");
    			}

    			if (link.hasClass(opt.toggleClass))
    			{
    				if(opt.debug)
	    			{
    					iTim.log("Proceed: change toggle text => setOpenText:" + opt.linkOpenTitle);
	    			}

    				link.html(opt.linkOpenTitle);
    			} else {
    				if(opt.debug)
	    			{
    					iTim.log("Proceed: change toggle text => setCloseText:" + opt.linkCloseTitle);
	    			}
    				link.html(opt.linkCloseTitle);
    			}
    		}
	    }
    	,
	    this.initAccordion = function ()
	    {
	    	var opt = this.options;
	    	var accordion = this.accordion;

	    	$(opt.toggleSelector, this.accordion).hide();

	    	var obj = this;

	    	if(true == opt.live )
	    	{
	    	$(this.options.toggleLinkSelector, this.accordion).live('click', function(event) {

	    		obj.proceedAccordion($(this));
	    		return false;
			});
	    	}
	    	else
	    	{

	    	$(this.options.toggleLinkSelector, this.accordion).each(function(index, el){

	    		$(el).bind('click', {element: $(el)}, function(event)
				{
	    			obj.proceedAccordion($(this));
	    		});
	    	});
	    	}
	    };

	    this.init(el, opt);
	};


	$.extend($.fn, {
		AccordionPlugin: function (inOpt) {
			inOpt = inOpt || {};
			var instance = null;
			this.each(function (i) {
				var obj = $(this).data('AccordionPlugin');
				var opt = $.extend(true, {}, options, inOpt); // deep merge
				if(!obj)
				{
					obj = new AccordionElementClass($(this),opt);
					$(this).data('AccordionPlugin', obj);
				}
				if (i == 0 && opt.api) {
					instance = obj;
				}
			});
			return instance ? instance : this;
		}
	});
})(jQuery);
