$.fn.shake = function(times) {
  this.each(function() {
    var $this = $(this), speed = 60;
    
    $this.animate({left: '-=20'}, speed);
    for (var i = 1; i < times; i++) {
      $this.animate({left: '+=20'}, speed).animate({left: '-=20'}, speed)
    };
    $this.animate({left: '+=20'}, speed / 2);
  });
};

var Flash = {

   init: function(container) {
     this.container = $(container || '.flash');
     this.effect();
     this.decorate();
   },

   update: function(flash) {
     var html = flash;
     if (flash && typeof(flash) != 'string') {
       html = ''; for (var key in flash){ html += '<div class="'+key+'">'+flash[key]+'</div>' }
     }
     if (html && html.length > 0) {
       this.container.empty().append($(html));
       this.effect();
       this.decorate();
     } else {
       this.clear();
     }
   },

   decorate: function() {
     this.container.find('div').each(function() {
       var hideLink = $('<a class="hide" href="#">Ausblenden</a>');
       hideLink.appendTo(this);
       hideLink.click(function(){ $(this.parentNode).fadeOut(500); return false; });
     });
   },

   effect: function() {
     this.container.find('.error').shake(2);
     this.container.find('.notice').hide().fadeIn(500);
   },

   clear: function() {
     this.container.find('div').remove();
   }
}
$(function(){ Flash.init() });

/* ********************************************************************************* */
/* form helper */
(function($) {
  $.fn.toggleFieldset = function(enabled) {
    if (typeof(enabled) == 'undefined') enabled = true;
    var fields = this.find(':input').each(function(){ this.disabled = !enabled });
    if (enabled) {
      this.removeClass('disabled');
      fields[0].focus();
    } else {
      this.addClass('disabled');
    }    
    return this;
  }
  
  $.fn.fieldsetToggle = function(element) {
    var fieldset = $(element || '#'+this.attr('id')+'_fieldset');
    this.change(function() { fieldset.toggleFieldset(this.checked) });
    fieldset.toggleFieldset(this[0].checked);
    return this;
  }
  
  $.fn.fieldsetToggles = function() {
    
    var radios = $(this);
    
    function onChange(changed) {
      radios.each(function() {
        if (this != changed) $('#'+this.id+'_fields').toggleFieldset(false);
      });
    }
    
    return this.each(function() {
      var radio = $(this);
      radio.change(function(){ onChange(this) });
      radio.fieldsetToggle($('#'+this.id+'_fields'));
    });
  }

  $.fn.dynamicTextarea = function() {
    return this.each(function() {
      var contentLength = this.value.length;
      
      function setHeight(element, height) {
        element = $(element);
        if (element.css('overflow') != "hidden") element.css('overflow', 'hidden');
        element.css('height', Math.max(height, 32) + "px");
      }
      
      function resize() {
        if (contentLength > this.value.length) {
          setHeight(this, Math.floor(this.clientHeight * this.value.length / contentLength));
          while (this.clientHeight > this.scrollHeight) {
            if (this.clientHeight < 32) break;
            setHeight(this, this.clientHeight - 1);
          }
        }
        setHeight(this, this.scrollHeight);
        contentLength = this.value.length;                
      }
      
      $(this).keyup(resize);
      setHeight(this, 0);
      resize.apply(this);
    });
  }
  
  $.fn.formReload = function() {
    this.append('<input type="hidden" name="_reload" value="true" />');
    this.submit();
  }

  $.fn.formWithTips = function() {
    return this.each(function() {
      var form = $(this);
      $('.tip', form).wrap('<div class="tip-wrap"></div>');
      $(':input[@type!=hidden][@type!=submit]', form).each(function() {
        var field  = $(this);
        var parent = field.parents('.tip-anchor')[0] || field.parents('.field')[0];
        if (parent && parent != document) {
          parent = $(parent);
          $(field).focus(function(){ parent.addClass('focused') });
          $(field).blur(function(){ parent.removeClass('focused') });
          if (field.type == 'radio' || field.type == 'checkbox' || field.type == 'file')
            $(field).click(function() { parent.addClass('focused') });
        }
      });
    });
  }
  
  $.fn.readMore = function(moreText, lessText) {
    return this.each(function() {
      var $element  = $(this);

      var $more = $('<a href="#" class="read-more-link">'+( moreText || 'read more...' )+'</a>');
      $element.after($more.click(function(){ $less.show(); $more.hide(); $element.slideDown() }));

      var $less = $('<a href="#" class="read-less-link">'+( lessText || 'minimize' )+'</a>');
      $element.after($less.click(function(){ $more.show(); $less.hide(); $element.slideUp() }));     

      $less.hide();      
      $element.hide();
    });
  }

  $.fn.tip = function(closeText, moreText, lessTest) {
    return this.each(function() {
      var $tip = $(this);
      $tip.find('.read-more').readMore(moreText, lessTest);
      if (closeText == '') return;
      $tip.append(
        $('<a href="#" class="close-link">'+( closeText || 'close' )+'</a>')
        .click(function(){ $tip.slideUp() })
      );
    });
  }
  
})(jQuery);

/* ********************************************************************************* */

$.fn.drawer = function(handleSelector) {
	return this.each(function() {
		var handle = $(handleSelector, this);
		handle.addClass('drawer-handle');
		var content = $('.drawer-content', this);
		content.hide();
		var readMoreImg = handle.css('background-image');
		handle.toggle(function() {
			content.slideDown(500);
			handle.css({'background-image': readMoreImg.replace('readmore', 'readmore-active')});
			return false;
		}, function() {
			content.slideUp(500);
			handle.css({'background-image': readMoreImg});
				return false;
		});
	});
};
$.fn.drawerOpen = function(handleSelector) {
  return this.each(function() {
    var handle = $(handleSelector, this);
    handle.addClass('drawer-handle');
    var content = $('.drawer-content', this);
    var readMoreImg = handle.css('background-image');
    handle.toggle(function() {
        content.slideUp(500);
        handle.css({'background-image': readMoreImg});
        return false;
      }, function() {
        content.slideDown(500);
        handle.css({'background-image': readMoreImg.replace('readmore', 'readmore-active')});
        return false;
      });
  });
};

/* ********************************************************************************* */
$(document).ready(function(){
	$(".toggle_container").show();
	$(".toggle_trigger").toggle(function(){
		$(this).addClass("active"); 
		}, function () {
		$(this).removeClass("active");
	});
	$(".toggle_trigger").click(function(){
		$(this).next(".toggle_container").slideToggle("slow,");
	});
});

/* ********************************************************************************* */
var Application = { // namespace for otherwise global functions

  init: function(root) {
		root = root || document;

		$('.with-tips', root).formWithTips();
	}
}
$(function(){ Application.init() });

