// 
//  jquery.flipbox.js
//  
//  Created by Matthias Link on 2011-02-01.
//  Copyright 2011 Interactive Systems. All rights reserved.
//
//

(function($) {
$.widget("ui.flipbox",{
	options: {
		initialState: "up",
		titleSelector: 	".title",
		textSelector: 	".text",
		handler: "click",
		animate: true,
		animationTime: "slow"
	},
	privates: {
		state: "down",
		handler: undefined
	},
	_init: function(){
		var widget = this, $element = $(widget.element), $title;
		
		$title 	= $element.find(widget.options.titleSelector);
		$text 	= $element.find(widget.options.textSelector);
		
		widget._setStatus(widget.options.initialState, true);
		
		switch (widget.options.handler){
		case "click":
			widget.privates.handler = "click";
			widget._setupClickHandler();
			break;
		
		case "hover":
			widget.privates.handler = "hover";
			widget._setupHoverHandler();
			break;
			
		case "hovertitle":
			widget.privates.handler = "hover";
			widget._setupHoverTitleHandler();
			break;
			
		case "none":
		default:
			widget.privates.handler = "none";
			break;
		}
	},
	_setupClickHandler: function() {
		var widget = this, $element = $(widget.element), $title = $element.find(widget.options.titleSelector), $text = $element.find(widget.options.textSelector), state;
		
		$title.click(function() {
			state = $element.data("state");
			if (state == "up") {
				widget._handleNewStatus("down");
			} else {
				widget._handleNewStatus("up");
			}
			
		});
	},
	_setupHoverHandler: function() {
		var widget = this, $element = $(widget.element), $title = $element.find(widget.options.titleSelector);
		
		$title.mouseenter(function() {
			widget._handleNewStatus("down");
		});
		$element.mouseleave(function() {
			widget._handleNewStatus("up");
		});
	},
	_setupHoverTitleHandler: function() {
		var widget = this, $element = $(widget.element), $title = $element.find(widget.options.titleSelector);
		
		$title.hover(function() {
			widget._handleNewStatus("down");
		},function() {
			widget._handleNewStatus("up");
		});
	},
	_prepareParams: function() {
		var widget = this, $element = $(widget.element), options = widget.options, privates = widget.privates, state = $element.data("state");
		return {state: state, handler: privates.handler};
	},
	_handleNewStatus: function (state, animate){
		var widget = this, $element = $(widget.element), activeState = $element.data("state");
						
		if (activeState != state){	// is status new?
			if (animate === undefined){		// not false or null
				animate = widget.options.animate;
			}
						
			if (animate){
				widget._animateStatus(state);
			} else {
				widget._setStatus(state);
			}
		}
		
	},
	_setStatus: function(state, init) {
		var widget = this, $element = $(widget.element), $text = $element.find(widget.options.textSelector);
		
		
		if (state == "up"){
			$text.hide();
			
			$element.data("state","up");
			if (!init){
				$element.trigger("change", widget._prepareParams());
			}
		}
		
		if (state == "down") {
			$text.show();
			$element.data("state","down");
			if (!init)
				$element.trigger("change", widget._prepareParams());
		}
	},
	_animateStatus: function(newState) {
		
		var widget = this, $element = $(widget.element), $text = $element.find(widget.options.textSelector), state = $element.data("state");
		
		
		if (state == "down" && newState == "up"){
			$text.slideUp(widget.options.animationTime);
			$element.data("state","up");
			
			$element.trigger("change", widget._prepareParams());
		}
	
		if (state == "up" && newState == "down"){
			$text.slideDown(widget.options.animationTime);
			$element.data("state","down");
		
			$element.trigger("change", widget._prepareParams());
		}
	},
	// Public Functions
	setStatus: function(state) {
		var widget = this;
		
		widget._handleNewStatus(state,false);
	},
	
	animateStatus: function() {
		var widget = this;
		
		widget._handleNewStatus(state,true);
	}
});
})(jQuery);

