/* Copyright (c) 2008 Andreas Timm | symmetrics gmbh (http://symmetrics.de)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $CreateDate: 04.11.2008 17:42:00 +0001$
 * $LastChangedDate: 02.12.2008 $
 *
 * Version: 0.5 mod
 *
 * Requires: jQuery 1.2.6+
 */
var ContAccordion = function($)
{
	var accordions = new Array() ;

	var expand = new Array() ;

	var ie6 =
		jQuery.browser.msie &&
		navigator.userAgent.match( /MSIE ([\d\.]+)/g )[0].split(" ")[1] <= 7 ;

	var accordions_default =
	{
		expand: false,
		animate: false,
		time: 200
	} ;

	var css_default =
	{
		header: ".content-accordion-header",
		content: ".content-accordion"
	} ;


	$.fn.extend ({

		/**
		 * contAccordion
		 *
		 * @param	Boolean		set_expand:
		 * @param	Object		v:
		 * 				String		header: header css				(default=".content-accordion-header")
		 * 				String		content: content css			(default=".content-accordion")
		 * 				Function	collapse: function ( id, dom )
		 * 				Function	expand: function ( id, dom )
		 * 				Function	click: function ( id, expand )
		 **/
		contAccordion: function( set_expand, v )
		{
			var i = 0 ;
			var cur_id = accordions.length ;
			var param = new Object ;
			for ( i = 0; i < this.length; i++ )
			{
				accordions[cur_id] =
				{
					dom: $(this[i]),
					param: cloneObjct ( accordions_default )
				};

				if ( v === undefined )
					v = {} ;

				if ( v.collapse !== undefined )
					accordions[cur_id].param.cb_collapse = v.collapse ;
				if ( v.expand !== undefined )
					accordions[cur_id].param.cb_expand = v.expand ;
				if ( v.click !== undefined )
					accordions[cur_id].param.cb_click = v.click ;
				if ( v.header === undefined )
					v.header = css_default.header ;
				accordions[cur_id].header = v.header === undefined ?
					 css_default.header : v.header ;
				accordions[cur_id].content = v.content === undefined ?
					css_default.content : v.content ;

				//TODO
				$(this[i]).find(v.header).prependTo(this[i]);
				//$(this[i]).find(v.header).remove().prepend(this[i]);

				var cont_accrodion = $(this[i]).find( accordions[cur_id].content ) ;

				accordions[cur_id].param.height =
					cont_accrodion.height() ;

				//dom/css modification
				cont_accrodion.css({overflow:"hidden"});
				if ( ie6 )
					cont_accrodion.css({
							position: "relative",
							width: "100%"
					});
				cont_accrodion.html
				(
					"<div class='content-accordion-move'>" +
						cont_accrodion.html() +
					"</div>"
				) ;

				if ( set_expand == true || array_search ( cur_id, expand ) != -1)
					setOpen( cur_id ) ;
				else
					setClose( cur_id ) ;

				setClick ( cur_id );

				cur_id++;
			}
		}
	});



	/**
	 * api: set content height
	 *
	 * @param	Number		id:
	 * @param	Number		height:
	 **/
	$.contAccordion_height = function ( id, height )
	{
		accordions[id].param.height = height === undefined ?
			accordions[id].dom.find( accordions[id].content ).height() :
			height ;
	};


	/**
	 * contAccordion configuration
	 *
	 * @param	Object		v:
	 **/
	$.contAccordion_conf = function ( vis, p )
	{
		expand = vis ;
		var i = 0 ;
		for ( i = 0; i < expand.length; i++ )
			if
			(
				accordions[expand[i]] != undefined &&
				accordions[expand[i]].expand == false
			)
				toggle ( expand[i] ) ;
		if ( p !== undefined )
		{
			if ( p.time !== undefined )
				accordions_default.time = p.time ;
			if ( p.collapse !== undefined )
				accordions_default.cb_collapse = p.collapse ;
			if ( p.expand !== undefined )
				accordions_default.cb_expand = p.expand ;
			if ( p.click !== undefined )
				accordions_default.cb_click = p.click ;
			if ( p.header !== undefined )
				css_default.header = p.header ;
			if ( p.content !== undefined )
				css_default.content = p.content ;
		}
	};

	$.contAccordion_api = function ( command, param )
	{
		switch (command)
		{
			case "open":
			case "close":
				var type = typeof (param);
				if ( type != "array" && type != "object" )
					param = [ param ] ;
				var i;
				var count=param.length;
				for ( i = 0; i < count; i++ )
					if ( command == "open" )
						setOpen ( param[i] ) ;
					else
						setClose ( param[i] ) ;
			break;
		}
	};


	/**
	 * set toggle
	 *
	 * @param	Object		v:
	 *
	 *
	 * @return
	 **/
	function setClick ( id )
	{
		$(accordions[id].dom).find(accordions[id].header).click(function(){
			if ( accordions[id].param.cb_click !== undefined )
				accordions[id].param.cb_click(id,accordions[id].param.expand);
			toggle ( id )
		});
	} ;


	/**
	 * set expand
	 *
	 * @param	Number		id:
	 **/
	function toggle ( id )
	{
		if ( accordions[id].param.animate )
			return true ;

		accordions[id].param.animate = true ;

		if ( accordions[id].param.expand )
			accordions[id].dom.find(".content-accordion-move").animate
			(
				{'marginTop':  -accordions[id].param.height },
				accordions[id].param.time,
				function()
				{
					accordions[id].param.expand = false ;
					accordions[id].param.animate = false ;
					if ( accordions[id].param.cb_collapse !== undefined )
						accordions[id].param.cb_collapse( id, accordions[id].dom  ) ;
				}
			) ;
		else
			accordions[id].dom.find(".content-accordion-move").animate
			(
				{'marginTop': 0},
				accordions[id].param.time,
				function()
				{
					accordions[id].param.expand = true ;
					accordions[id].param.animate = false ;
					if ( accordions[id].param.cb_expand !== undefined )
						accordions[id].param.cb_expand( id, accordions[id].dom ) ;
				}
			) ;
	} ;


	/**
	 * set close
	 *
	 * @param	Number		id:
	 **/
	function setClose ( id )
	{
		accordions[id].dom.find(".content-accordion-move").
			css({'marginTop': -accordions[id].param.height}) ;
		accordions[id].param.expand = false ;
		if ( accordions[id].param.cb_collapse !== undefined )
			accordions[id].param.cb_collapse( id, accordions[id].dom ) ;
	} ;

	/**
	 * set close
	 *
	 * @param	Number		id:
	 **/
	function setOpen ( id )
	{
		accordions[id].dom.find(".content-accordion-move").
			css({'marginTop': 0}) ;
		accordions[id].param.expand = true ;
		if ( accordions[id].param.cb_expand !== undefined )
			accordions[id].param.cb_expand( id, accordions[id].dom ) ;
	} ;


	function cloneObjct ( obj )
	{
		var newObj = new Object();
		for ( var i in obj )
			newObj[i] = obj[i] ;
		return newObj;
	};


	function array_search ( elt, arr )
	{
	    var len = arr.length;
		var i = 0
	    for (; i < len; i++)
	      if ( i in arr && arr[i] === elt )
	        return i;
	    return -1;
	}

};
ContAccordion(jQuery);