﻿(function ($) {
    /* Component */
    var activeClass = 'open';


    function handle_click(e) {
        var toggler = e.data.toggler, target = e.data.target;
        target.is(':visible') ?
      (target.hide() && toggler.removeClass(activeClass)) :
      (target.show() && toggler.addClass(activeClass));
        return false;
    }

    $.fn.toggler = function () {

        if (!this.length) return;

        return this.each(function () {
            var toggler = $(this),
                target = $(toggler.attr('href'));

            if (target.data('expanded'))
                target.show() && toggler.addClass(activeClass);
                
            if (target.is(':visible'))
                toggler.addClass(activeClass);

            target.length &&
        toggler.bind('click', { toggler: toggler, target: target }, handle_click);
        });
    };
})(jQuery);

(function($){

  $.fn.counter = function( options ){
    var re = /\$1/g, 
        settings = $.extend({ 
          text:'$1 characters remaining'
        }, settings);

    if (!this.length) return;

    function handle_key(e){
      var c = e.data.counter, len = e.data.max - this.value.length;
      c.text(settings.text.replace(re, len>0?len:0));
    }

    return this.each(function(){
      var counter = $(this),
          data = counter.data(),
          field = $(document.getElementById(data['for'])), max;

      if (!field.length || !(max = field.attr('maxlength')) || max <=0 ){
		counter.remove();
	    return false;
	  }
                      
      field.bind('keyup', { counter:counter, max:field.attr('maxlength') }, handle_key).trigger('keyup');
    });
  };

})(jQuery);


/* 
 * Combines month, day, and year selected values into a date string in a hidden field. 
 * Because we're using drop kick for selects, it's required that we hook into drop kick's change event. 
 * This will currently only work if dropkick is enabled on a select element.
 * This really should be done on the server...
 */
(function($){
	$.fn.birthday_field = function(){  

    if (!this.length) return false;
  
		return this.each(function(){
      var fields = $('select', this), 
          target = $('input[type="hidden"]', this),
          dropkick_change = function(){
            var values = [];
            fields.each(function(){
              values.push($(this).val());
            });
            target.val(values.join('/'));
          };
      
      fields.each(function(){
        var dropkick_data = $(this).data('dropkick');
        dropkick_data.settings.change = dropkick_change;
      });
      
      fields.eq(0).dropkick('change');            
    });
	};
  
})(jQuery);

(function($){

  function trigger_fn( form ){    
    return function(){
      form.trigger('submit');      
    };    
  }

	$.fn.auto_submitable = function(){  
	  if (!this.length || !this.is('form')) return false;	  
	  return this.each(function(){  
      var form = $(this), triggers = $('[data-auto-submit]', form), fn = trigger_fn( form );      
      triggers.each(function(){
        /* If it's a dropkick, we need a special event */
        var dk = $(this).data('dropkick');
        dk ? (dk.settings.change = fn) : $(this).bind('change', { form:form }, fn);      
      });
    });
	};  
})(jQuery);
