/**
 * TFContactForm support plugin.
 * Copyright 2011 The Fresh Dental Marketing, http://www.thefreshuk.com
 */
(function($){
  $.fn.TFContactForm = function(options){
    options = $.extend({
      url: '/contact-form/web/ajax.php',
      errorPosition: 'left',
      errorClass: 'error-field',
      errorTooltipClass: 'error-tooltip',
      errorOffset: 6
    }, options);

    var clearErrors = function(form) {
      $(form).find('.' + options.errorTooltipClass).remove();
      $(form).find('.' + options.errorClass).removeClass(options.errorClass);
    };

    var visualizeErrors = function(form, errors) {
      // Clearing previous errors
      clearErrors(form);

      // Making sure that we can position elements relative to the form
      if(form.css('position') != 'absolute')
      {
        form.css('position', 'relative');
      }

      // Displaying field errors
      for(var id in errors)
      {
        // Adding class to allow customizing appearance of field with error
        var field = $('#' + id).addClass(options.errorClass);

        // Each field can have multiple errors
        var errorText = $('<ul></ul>');
        for(var i = 0; i < errors[id].length; ++i)
        {
          errorText.append($('<li>' + errors[id][i] + '</li>'));
        }

        // Creating error tooltip
        var position = field.position();
        var arrow = $('<div></div>');
        var tooltip = $('<div></div>')
          .attr('id', id +'-error-tooltip')
          .addClass(options.errorTooltipClass)
          .css('position', 'absolute')
          .css('top', position.top)
          .html(errorText)
          .append(arrow);

        // Depending on user-selected position we calculate
        // coordinates relative to offset parent
        if(options.errorPosition == 'right')
        {
          arrow.addClass('arrow-left');
          tooltip.css('left', position.left + field.outerWidth() + options.errorOffset);
        }
        else
        {
          arrow.addClass('arrow-right');
          tooltip.css('right', form.width() - position.left + options.errorOffset);
        }

        // Adding fields
        field.after(tooltip);
      }
      $(form).find('.' + options.errorClass).first().focus();
    };

    return $(this).filter('form').each(function(){
      var form = $(this);
      var inputs = form.find('select, button, input, textarea');
      
      inputs.bind('focus', function(e){
        $(form).find('.' + options.errorTooltipClass).stop().fadeIn('fast');
      });
      
      inputs.bind('blur', function(e){
        $(form).find('.' + options.errorTooltipClass).stop().fadeOut('fast');
      });
      
      $(inputs).bind('keydown keyup', function(e){
        if (e.keyCode == 27) { $(this).blur(); }
      });

      form.bind('submit', function(e){
        // We use these methods instead of return false to avoid submitting
        // even if one of next lines gives an error
        e.preventDefault();
        e.stopPropagation();

        var data = form.serialize();
        inputs.attr('disabled', 'disabled');

        // We expect result to be in json format
        $.post(options.url, data, function(data) {
          if(data.errors)
          {
            inputs.removeAttr('disabled');
            visualizeErrors(form, data.errors);
          }
          else
          {
            form.html(data.html);
          }
        }, 'json');
      });
    });
  };
})(jQuery);
