;(function($){
	
	function Slyout( elem, options ){
		this.elem = elem;
		if(!elem.css('top') || elem.css('top') == "auto"){
			elem.css('top', '-' + elem.height() + 'px');
		}
		var defaults = {
			initialPos: elem.css('top'),
			endPosition: "0px",
			animDuration: 200,
			setFocus: true
		};
		
		this.options = options ? $.extend( {}, defaults, options ) : defaults;
		this.opened = false;
	}
	
	Slyout.prototype = {
		init: function(){
			
			var self = this;
			if( self.options.openTrigger ){
				self.options.openTrigger.bind( 'click', function( event ){
					if (self.opened) {
						self.hideContainer();
					}
					else {
						self.showContainer();
						if(self.options.setFocus){
							self.elem.find('input:text:first').focus();
						}
					}
					event.preventDefault();
				});
			}

			if( self.options.closeTrigger ){
				self.options.closeTrigger.bind( 'click', function( event ){
					if (self.opened) {
						self.hideContainer();
					}
				});
			}

			self.elem.bind('hideFlyout', function(){
				self.hideContainer();
			});

			self.elem.bind('showFlyout', function(){
				self.showContainer();
			});

			self.elem.bind('showError', function(event, errorMessage){
				if(!errorMessage){
					errorMessage = "Error";
				}
				// TODO: kludg-ish
				if ( self.elem.find(':header:first').length ) {
					self.elem.find(':header:first').after('<div class="slyout-error-container">' + errorMessage + '</div>');
				}
				else {
					self.elem.prepend('<div class="slyout-error-container">' + errorMessage + '</div>');
				}
			});
			
			self.elem.bind('hideError', function(){
				self.elem.find('.slyout-error-container').fadeOut( 200, function(){
					$( this ).remove();
				});
			});
			
		},
		
		hideContainer:function(){
			var self = this;
			self.elem.animate({'top': self.options.initialPos }, self.options.animDuration, function(){
				self.opened = false;
			});
			
		},
		
		showContainer:function(){
			var self = this;
			self.elem.animate({'top': self.options.endPosition }, self.options.animDuration, function(){
				self.opened = true;
			});			
		}
	};
	
	
	$.fn.slyout = function( options ){
		
		return this.each(function(){
			var elem = $(this),
				slyout = new Slyout( elem, options );
				slyout.init();
				
			elem.data('slyout', slyout);
		});
	};
	
}(jQuery));

