(function($) {
	var d = document, w = window, self, selfInstances = [], ik = typeof jQuery == 'function', flipper = 'flipper', unflipper = 'unflipper';

	if  ( ik ){
		$.fn[flipper] 		= 	function( options ){
										if( !flippers.inited ){ flippers.init( this ); }
										else{
											flippers.self_add( this, self ); }
										return this;
																	  };
		$.fn[unflipper] 	=	function(){
														flippers.self_remove( this );  };   }
										
								
	$[flipper]		=	function( obj, callback ){//alert()
		var i = flippers.add( obj );
		callback( i );
	};
	
	$[unflipper]		=	function( obj, callback ){
		flippers.remove( obj );
		callback();
	};

	flippers = 		{
		instances		:	[],
		inited				:	false,
		removed		:	false,
		sIadd			:	selfInstances.push,
		sImin			:	selfInstances.splice,
		draggee			:	null,
		active			:	null,
		sense			:	function( $t, s ){ 
									$t	.unbind( 'click', s.flip )
										.bind( 'click', s.flip )
										.unload( s.die )
										.addClass( 'flipped' );
										},
		init				:	function( $t ){ self = this; 
									var s = this, $o;
									 
									s.draggee = $( '#drag', $t )
									if( ( $o = $( '*.per', $t ).filter( function(){ return $(this).height() > 5; }) ).length ){
										$o.addClass('opened'); $o.prev( 'div' ).addClass( 'active' ) };
									s.self_add( $t, s );
									s.inited = true;
									$o = null; s = null; },
		flip				:	function( e ){
									if( e != null ){ e.stopPropagation(); };
									var tar, $tar = jQuery( ( tar = e.target ) ), $cur = jQuery( e.currentTarget ), $flip, $ani = ( ( ( $ani = $cur.find( 'div:animated' ) ).length && $ani.length  > 0 ) ? $ani : false );// 
									if( !$ani && ( $flip = ( ( ( $flip = $tar.closest( '.flip' ) ).length ) ? $flip : false ) ) ){//alert( 'flip:\t'+$('.flip', $cur).index($flip));
										var $th = $(this), $act, mY = ( ( e != null ) ? e.clientY : 0 );
										if( !$flip.hasClass( 'active' ) && ( $act = $flip.siblings('.active') ).length != 0 ){ 	
											$cur.find( 'div.opened' ).animate(  	{  height		:	1 }, 
																		  					{	duration		:	500,
																								complete	:	function(){ 
																														$(this).removeClass( 'opened' );
																														$act.removeClass( 'active' ); 
																														return self.flipst( $flip, tar, $tar, $cur, $act, mY ); }  }); 
											return false; }
										else{
											if( ( $act = $flip ).hasClass( 'active' ) ){
												$cur.find( 'div.opened' ).animate( 	{	height		: 	1 }, 
																			  					{	duration		:	500,  
																									complete	:	function(){ 
																															$(this).removeClass( 'opened' );
																															$act.removeClass( 'active' ); return false; }  }); 
												return false; }
											else if( !$flip.hasClass( 'active' ) ){
												 return self.flipst( $flip, tar, $tar, $cur, $act, mY ); }  }   };
									return false; },
		flipst				:	function( $flip, tar, $tar, $cur, $act, mY ){ var $ed, $nxt, dh = 0, t;//alert( 'flipst:\t'+$('.flip', $cur).index($flip));
									if( !$flip.hasClass( 'active' ) ){ $flip.addClass( 'active' ); };
									$nxt = $flip.next( 'div' ).addClass( 'opened' );  $nxt.css( { height: 'auto' } ); 
									var h = $nxt.height() + 10;  $nxt.css( { height: 1 } );  t = $flip.offset().top - dh - 2; 
									self.draggee.animate( 	{ top: t },
													 					300 ); 
									$nxt.animate	( 	{ height: h }, 
												 		500, 
														function(){ 
															$nxt.css( { height:'auto' } )  }); return false;  },
		die				:	function() { self.unflipper();  },
		self_add			: 	function( el, s ){ 
									s.sense( el, s );
									if( this.self_index( el ) == -1 ){ selfInstances.push({el:el, 'id':el.attr('id')  }); }; 
									return selfInstances[ this.self_index( el ) ];  },
		self_remove	:	function( $t ) {
										$t	.removeClass('flipped')
											.unbind( 'click', this.flip ); 
										$t.find( '*.opened, *.active' ).removeClass('opened').removeClass('active');
										selfInstances.splice( this.self_index( $t ), 1 );
									return null;   },
		self_index		: 	function( el ){ for (var i=0, length = selfInstances.length; i < length; i++){	if ( selfInstances[i].id == el.attr('id') ){  return i; }  }; return -1; } };
	
})(jQuery);



