/**
 * JQuery extensions for freeMailBox.hu
 *
 * @author György Kövesdi <samy@rapidforum.hu>
 * @since 2009.04.21 10:56:12
 *
 **/

/** FreeMailBox functions
*/
// FMB namespace and constants
var FMB = {
  BASE_URL: '',
  RE_EMAIL: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/
};

FMB.init = function(){
  $('#overlay').click( function( e ) {
    if ( this === e.currentTarget ) {
      $(this).fadeOut().children().hide();
    }
  });

  $('.editable .content').rich();
  /** menu
  */
  $('.menu a:not(.active)').hover(
    function(){ $( this ).animate({ backgroundColor: '#E9953B' }, {duration: 300, queue: false } ); },
    function(){ $( this ).animate({ backgroundColor: '#595959' }, {duration: 300, queue: false } ); }
  );
  /** login
  */
  $('#login-email').blur( function(){ FMB.userModul.validate( 'email' ) } );
  $('#login-password').blur( function(){ FMB.userModul.validate( 'password' ) } );

  /** send card page
  */
  //$('#card-type').click( function(){ console.log( this.checked ); this.checked ? $('.send-repeated').slideDown('normal') : $('.send-repeated').slideUp('normal'); } );
  //$('#notify').click( function(){ this.checked ? $('.notify-before').slideDown('normal') : $('.notify-before').slideUp('normal'); } );
  //$('.timepicker-input').timepickr( { prefix: ['délelőtt', 'délután'], resetOnBlur: false });
  $('.datepicker-input').datepicker({ dateFormat: 'yy-mm-dd' });

  /** form fields modify highlighter
  */
  /*var fields = $('input:not(input[type=submit]), select, textarea');
  var modHandler = function() {
    this.defaultValue !== this.value ? $( this ).addClass('modified') : $( this ).removeClass('modified');
  };
  fields.each( function() {
    if ( !this.defaultValue ) {
      this.defaultValue = this.value;
    }
  });
  fields.keyup( modHandler );
  fields.change( modHandler );*/

  if ( $('.page-images #image-list').length > 0 ) {
    FMB.imageModul.loadImages();
    $('#image-list').selectable({
      filter:'.card-image',
      stop: function() { FMB.imageModul.updateToolbar() }
    });
  }

  $('#card-date').required();
  $('.page-card a h2').click( function(){
    if ( false && $(this).attr('id') == 'link-card' && !FMB.imageModul.selectedImage ) {
      $('#image-message').html('Nincs kiválasztva kép').slideDown();
      return false;
    } else {
      $('#image-message').html('&nbsp;').slideUp();
    }

    ( _section = $( this ).parents('a').next( 'div.section' ) )
      .siblings('div.section').slideUp( function(){ _section.slideDown(); } );

    return false;
  });

  $('.page-card #insert-nameday').click( function() {
    $.post( FMB.BASE_URL + 'partnerek/nevnap', { 'id': $('#card-recipient').val() }, function( data ) {
      if ( data.date ) {
        $('#card-date').val( data.date ).css({ backgroundColor: 'yellow' });
        setTimeout( function(){ $('#card-date').animate({ backgroundColor: 'white' }); }, 1000 );
      }
    }, 'json');
  });

  $('.page-card #insert-birthday').click( function() {
    $.post( FMB.BASE_URL + 'partnerek/szuletesnap', { 'id': $('#card-recipient').val() }, function( data ) {
      if ( data.date ) {
        $('#card-date').val( data.date ).css({ backgroundColor: 'yellow' });
        setTimeout( function(){ $('#card-date').animate({ backgroundColor: 'white' }); }, 1000 );
      }
    }, 'json');
  });

  if ( $('.page-card #image-list').length > 0 ) {
    FMB.imageModul.imageSize = [ 128, 128 ];
    FMB.imageModul.listParams.step = 12;

    FMB.imageModul.loadImages();
    $('#image-list .card-image .select').live( 'click', function() {
      var _id = $( this ).parents('.card-image').find('img').attr('id').split('-')[1];
      FMB.imageModul.selectedImage = _id;
      $( this )
        .addClass('selected')
        .html('kiválasztva')
        .parents('.card-image')
          .siblings('.card-image')
            .find('.select')
              .removeClass('selected').html('kiválasztás');
        $( $('.page-card a h2')[1] ).click();
    });

    $('#image-list .card-image').live( 'click', function() {
      $( this )
        .animate({ backgroundColor: '#F39814', color: 'white' }, { queue:false, duration: 300 })
          .attr( 'selected', 1 )
          .addClass('selected')
        .siblings('.card-image').animate({ backgroundColor: '#F3F3F3', color: 'black'}, { queue: false, duration: 300 })
          .attr( 'selected', false )
          .removeClass('selected');
    });
/*    $('#image-list .card-image').live( 'mouseout', function() {
      $( this ).animate({ backgroundColor: '#F3F3F3', color: 'black' }, { queue:false, duration:300 });
    });*/
  }

  //$('#category-list').selectable({ filter: '.field' });


  $('#category-list .edit a').live( 'click', function() {
    $( this )
      .parents('li').css({ backgroundColor: 'white' })
        .children('.field')
          .addClass('editing')
          .attr('contenteditable', true )
          .focus().blur( function() {
            var value = this.innerHTML;
            var el    = $( this ).parents( 'li' );
            var id    = el.attr('id').split('-')[1];
            $.post( FMB.BASE_URL + 'kategoriak/mentes', { 'id': id, 'value': value }, function() {
              setTimeout( function() { el.animate({ backgroundColor: '#F3F3F3' }); }, 1500 );
            } );
            $( this )
              .removeClass('editing')
              .attr( 'contenteditable', false )
                .parents('li')
                  .css({ backgroundColor: '#85FF5F' });
          });
  });

  $('#category-list .delete a').live( 'click', function() {
    var _li = $( this ).parents('li');
    _li.css({ backgroundColor: 'red' });
    var id = _li.attr('id').split('-')[1];
    $.post( FMB.BASE_URL + 'kategoriak/torles', { 'id': id }, function() {
      setTimeout( function() { _li.hide('normal'); }, 500 );
    } );
  });

  $('input[name=card_time_minute],input[name=card_time_hour]').mask('99').blur(function(){
    if ( this.name == "card_time_minute" && parseInt( this.value ) > 59 ) {
      this.value = 59;
    }
    if ( this.name == "card_time_hour" && parseInt( this.value ) > 23 ) {
      this.value = 23;
    }
  });

  $('#partner-mobilphone').mask('(99) 999-99-99');
  $('#partner-nameday').mask('99-99');
  $('#partner-birthday').mask('99-99');

  $('#user-mobilphone').mask('(99) 999-99-99');
  $('#user-nameday').mask('99-99');
  $('#user-birthday').mask('99-99');

  $('#partner-firstname').blur( function() {
    if ( this.value && !$('#partner-birthday').val() ) {
      $.post( FMB.BASE_URL + 'partnerek/nevnap', { 'name': this.value }, function( data ) {
        if ( data.date ) {
          $('#partner-nameday').val( data.date ).css({ backgroundColor: 'yellow' });
          setTimeout( function(){ $('#partner-nameday').animate({ backgroundColor: 'white' }); }, 1000 );
        }
      }, 'json');
    }
  });

  $('#partner-firstname, #partner-lastname').required();
  $('#user-firstname, #user-lastname, #user-email').required();
  $('#partner-list .edit').live( 'click', FMB.partnerModul.editPartner );
  $('#partner-list .delete').live( 'click', FMB.partnerModul.deletePartner );

  $('#user-list .edit').live( 'click', FMB.usersModul.editUser );
  $('#user-list .delete').live( 'click', FMB.usersModul.deleteUser );

  /*$('#card-list .edit').live( 'click', FMB.cardModul.editCard );*/
  $('#card-list .delete').live( 'click', FMB.cardModul.deleteCard );

  $(".card-save").click( FMB.cardModul.saveCard );

}

FMB.usersModul = {
  editUser: function() {
    $( 'body' ).scrollTo('#user-add', 1000);
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    $('#user-add').slideDown().formLoad('felhasznalok/betoltes/' + _id );
    $('#form-mode').html('user szerkesztése');
    return false;
  },

  deleteUser: function() {
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    $.post( FMB.BASE_URL + 'felhasznalok/torol', { 'id': _id }, function() {
      $( '#user-' + _id ).css({'backgroundColor': 'red'});
      setTimeout( function(){ $( '#user-' + _id ).remove(); }, 1000 );
    });
    return false;
  },

  save: function() {
    if ( $('#user-email').val() && !FMB.RE_EMAIL.test( $('#user-email').val() ) ) {
      var _color = 'red';
      $('#user-email').tooltip('Érvénytelen e-mail cím').animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color });
      $('#form-message').html('Néhány mező hibás adatokat tartalmaz');
      return false;
    } else {
      var _color = '#D0D0D0';
      $('#user-email').tooltip( false ).animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color });
    }
    $('#user-firstname, #user-lastname').blur();

    if ( !$('#user-firstname').val() || !$('#user-lastname').val() ) {
      $('#form-message').html('Néhány mező hibás adatokat tartalmaz');
      return false;
    }
    $('#form-message').html('&nbsp;');
    $('#user-add').formPost( FMB.BASE_URL + 'felhasznalok/mentes', {
      success: function( response ) {
        $('#form-mode').html('Új felhasználó felvitele');
        $('#user-add').slideUp()[0].reset();
        $('#user-id')[0].value = 0;
        var _row = '<td>' + response.lastname + ' ' + response.firstname + '</td><td>' + response.companyname + '</td><td>' + response.email + '</td><td><a href="#" class="edit">(szerkeszt)</a> <a href="#" class="delete">(töröl)</a></td>';
        if ( response.isNew ) {
          $('#user-list tbody').prepend( '<tr id="user-' + response.id + '">' + _row + '</tr>' );
        } else {
          $('#user-' + response.id ).html( _row );
        }
        $('#user-' + response.id ).css( { 'backgroundColor': 'green' } );
        setTimeout( function() {
          $('#user-' + response.id ).animate( { 'backgroundColor': '#F3F3F3' } );
        }, 1000 );
      }
    } );
    return false;
  }
}

FMB.partnerModul = {
  editPartner: function() {
    $( 'body' ).scrollTo('#partner-add', 1000);
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    $('#partner-add').slideDown().formLoad('partnerek/betoltes/' + _id );
    $('#form-mode').html('Partner szerkesztése');
    return false;
  },

  deletePartner: function() {
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    $.post( FMB.BASE_URL + 'partnerek/torol', { 'id': _id }, function() {
      $( '#partner-' + _id ).css({'backgroundColor': 'red'});
      setTimeout( function(){ $( '#partner-' + _id ).remove(); }, 1000 );
    });
    return false;
  },

  save: function() {
    if ( $('#partner-email').val() && !FMB.RE_EMAIL.test( $('#partner-email').val() ) ) {
      var _color = 'red';
      $('#partner-email').tooltip('Érvénytelen e-mail cím').animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color });
      $('#form-message').html('Néhány mező hibás adatokat tartalmaz');
      return false;
    } else {
      var _color = '#D0D0D0';
      $('#partner-email').tooltip( false ).animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color });
    }
    $('#partner-firstname, #partner-lastname').blur();

    if ( !$('#partner-firstname').val() || !$('#partner-lastname').val() ) {
      $('#form-message').html('Néhány mező hibás adatokat tartalmaz');
      return false;
    }
    $('#form-message').html('&nbsp;');
    $('#partner-add').formPost( FMB.BASE_URL + 'partnerek/mentes', {
      success: function( response ) {
        $('#form-mode').html('Új partner felvitele');
        $('#partner-add').slideUp()[0].reset();
        $('#partner-id')[0].value = 0;
        var _row = '<td>' + response.lastname + ' ' + response.firstname + '</td><td>' + response.companyname + '</td><td>' + response.email + '</td><td><a href="#" class="edit">(szerkeszt)</a> <a href="#" class="delete">(töröl)</a></td>';
        if ( response.isNew ) {
          $('#partner-list tbody').prepend( '<tr id="partner-' + response.id + '">' + _row + '</tr>' );
        } else {
          $('#partner-' + response.id ).html( _row );
        }
        $('#partner-' + response.id ).css( { 'backgroundColor': 'green' } );
        setTimeout( function() {
          $('#partner-' + response.id ).animate( { 'backgroundColor': '#F3F3F3' } );
        }, 1000 );
      }
    } );
  }
}

FMB.categoriesModul = {
  saveCategory: function() {
    var value = $('#category-name').val();
    $.post( FMB.BASE_URL + 'kategoriak/mentes', { 'value': value }, function( data ) {
      $('#category-list').prepend('<li id="cat-' + data['id'] + '"><b class="field">'+data.name+'</b>   <span class="edit"><a href="javascript:;">(szerkeszt)</a></span>      <span class="delete"><a href="javascript:;">(töröl)</a></span></li>');
      $('#cat-' + data.id ).css({backgroundColor:'yellow', 'display':'none'}).show('normal');
      $('#category-name').val('');
      setTimeout( function() { $('#cat-' + data.id ).animate({ backgroundColor: '#F3F3F3'}) }, 1000 );
    }, 'json' );
  }
}

FMB.cardModul = {
  editCard: function() {
    $( 'body' ).scrollTo('#link-card', 1000);
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    FMB.cardModul.loadCard( _id );
    return false;
  },

  deleteCard: function() {
    var _id = $(this).parents('tr')[0].id.split('-')[1];
    $.post( FMB.BASE_URL + 'udvozlolap/torol', { 'id': _id }, function() {
      $( '#card-' + _id ).css({'backgroundColor': 'red'});
      setTimeout( function(){ $( '#card-' + _id ).remove(); }, 1000 );
    });
    return false;

  },

  loadCard: function( id ) {
    $('#card-form').formLoad( FMB.BASE_URL + 'udvozlolap/betoltes/' + id , function(data){
      FMB.imageModul.selectedImage = data.imageid;
      $('#category-filter').val( data.category ).change();
      $('#link-card').html('Üdvözlőlap szerkesztése');
      $('#link-card').click();
      /*data['card-type'] ? $('.send-repeated').slideDown('normal') : $('.send-repeated').slideUp('normal');
      data['notify']    ? $('.notify-before').slideDown('normal') : $('.notify-before').slideUp('normal');*/
    })
  },

  saveCard: function() {
    if ( !$('#card-date').val() ) {
      $('#card-message').html('Nem adott meg küldési dátumot').css({ 'color': 'red' }).slideDown();
      return false;
    } else {
      $('#form-message').html('&nbsp;').slideUp();
    }
    $('#card-category').val( FMB.imageModul.listParams.category );
    $('#card-imageid').val( FMB.imageModul.getSelectedImages()[0] );
    $('#card-form').formPost( FMB.BASE_URL + 'udvozlolap/mentes', {
      success: function( response ) {
        if ( response.success ) {
          $('#card-message').html( 'Az üdövlőlap adatait elmentettük.' ).css({ 'color': 'green'}).slideDown('normal');
          $( document.body ).one( 'click', function(){ $('#card-message').slideUp('normal'); } );
          $( '#card-id' ).val( response.data['id'] );
          location.href = FMB.BASE_URL + "/udvozlolap/show/" + response.data['id'];
        }
      }
    } );
    return false;
  }
}

FMB.imageModul = {
  imageSize: [64, 64],
  uploading: false,
  selectedImage: false,
  listParams: { from: 0, step: 12, category: 0 },

  uploadImage: function() {
    $('#uploading').show('normal');
    $('#upload-form').hide('normal');
    $('#upload-category').val( $('#category-filter').val() );
    FMB.imageModul.uploading = true;
  },

  uploadSuccess: function() {
    $('#uploading').hide('normal');
    $('#upload-form').show('normal');
    $('#upload-form')[0].reset();
    $('#upload-form input[type=submit]')[0].disabled = true;
    $('#upload-form input[name=id]')[0].value = 0;
    FMB.imageModul.loadImages( 0 );
  },

  loadImages: function( from ) {
    if ( !FMB.imageModul.listParams.category ) {
      FMB.imageModul.listParams.category = $('#category-filter')[0].value;
    }
    if ( typeof from !== 'undefined' ) FMB.imageModul.listParams.from = from;
    $('#images-toolbar').hide('normal');
    var values = [];
    for (var key in FMB.imageModul.listParams) {
      values.push( FMB.imageModul.listParams[key] );
    }
    values.push( FMB.imageModul.imageSize[0] + 'x' + FMB.imageModul.imageSize[1] );
    $.get( FMB.BASE_URL + 'udvozlolap/kepek/' + values.join('/'), {}, function( data ) {
      var data = eval( '(' + data + ')' );
      $('#image-list').html( data.images );
      $('#images-pager').html( data.pager );
      if ( FMB.imageModul.selectedImage ) {
        $( '#card-' + FMB.imageModul.selectedImage ).parent('.img').siblings('.select')
        .addClass('selected')
        .html('kiválasztva')
        .parents('.card-image').click()
          .siblings('.card-image')
            .find('.select')
              .removeClass('selected').html('kiválasztás');
      }
    } );

  },

  getSelectedImages: function() {
    var list = [];
    $('#image-list .ui-selected, #image-list .card-image[selected=1]').each( function() {
      list.push( $('img', this ).attr('id').split('-')[1] );
    });
    return list;
  },

  updateToolbar: function() {
    var ids = FMB.imageModul.getSelectedImages();
    if ( ids.length > 0 ) {
       $('#images-toolbar').show('normal');
       if ( ids.length == 1 ) {
         $('#images-toolbar .edit, #images-toolbar .preview').show();
       } else {
        $('#images-toolbar .edit, #images-toolbar .preview').hide();
       }
       $('#upload-form input[type=file]').show();
    } else {
        $('#images-toolbar').hide('normal');
    }
  },

  previewImage: function() {
    var src = $('#image-list .ui-selected img').attr('src').replace( /_[0-9]+x[0-9]+\./, '_650x650.' );
    $('#overlay')
      .fadeIn()
      .children('.image')
        .css({ width: '350px', height: '250px' })
        .show()
        .children('img')
          .hide()
          .attr('src', src )
          .one( 'load', function() {
            $(this).show().parents('.image').css({ width: this.width, height: this.height });
          });
  },

  deleteImages: function() {
    $.post( FMB.BASE_URL + 'kepek/torol', { 'cardid[]': FMB.imageModul.getSelectedImages() }, function(){ FMB.imageModul.loadImages(); } );
  },

  editImage: function( id ) {
    $('#upload-form').formLoad( FMB.BASE_URL + 'kepek/betolt/' + FMB.imageModul.getSelectedImages()[0] );
    $('#upload-form input[type=file]').hide();
    $('#upload-form input[type=submit]')[0].disabled = false;
  }

}

FMB.profileModul = {
  save: function() {
    $('#profile-form').formPost( 'profil/mentes', {success:function() {
      $('#profile-message').html('Profil elmentve').slideDown();
      $('body').click( function() { setTimeout( function(){ $('#profile-message').slideUp(); } ) } );
    }});
  }
}

FMB.userModul = {
  validate: function( field ) {
    if ( ( !field || field == 'email' ) && ! FMB.RE_EMAIL.test( $('#login-email').val() ) ) {
      $('#login-message').html('Érvénytelen e-mail cím').animate({ color: 'red' }).slideDown('normal');
      return false;
    } else if( !field || field == 'email' ) {
      $('#login-message').slideUp('normal');
    }
    if ( ( !field || field == 'password' ) && !$('#login-password').val() ) {
      $('#login-message').html('Nem adta meg a jelszót').animate({ color: 'red' }).slideDown('normal');
      return false;
    } else if( !field || field == 'password' ) {
      $('#login-message').slideUp('normal');
    }
    return true;
  },

  lostPassword: function() {
    if( FMB.userModul.validate('email') ) {
      $('#login-form').formPost( FMB.BASE_URL + 'felhasznalo/elfelejtett-jelszo', {
        success: function( response, data ) {
          if ( response.success ) {
            $('#login-message').html('Az új jelszót elküldük').slideDown('normal').animate({ color: 'green' });
          } else {
            $('#login-message').html( response.message ).slideDown('normal').animate({ color: 'red' });
          }
        }
      });
    }
  },

  login: function() {
    if ( FMB.userModul.validate() ) {
      $('#login-form').formPost( FMB.BASE_URL + 'felhasznalo/belepes', {
        success: function( response ) {
          if ( response.success ) {
            location.reload();
          } else {
            $('#login-message').html( response.message ).slideDown('normal').animate({ color: 'red' });
          }
        }
      });
    }
  },

  logout: function() {
    $.get( FMB.BASE_URL + 'felhasznalo/kilepes', null, function( response ) {
      location.href = FMB.BASE_URL + '/';
    });
  }
}

$( FMB.init );

/**
 * DOM extensions
 *
 **/
Array.prototype.indexOf = function(object) {
  for (var i = 0, length = this.length; i < length; i++)
    if (this[i] == object) return i;
  return -1;
}

/**
 * JQuery extensions for freemailbox
 *
 **/
$.fn.extend({

  tooltip: function( text ) {
    // initialize tooltip
    if ( $('#tooltip').length == 0 ) {
      $("body").append( '<p id="tooltip">&nbsp;</p>' );
    }
    var _tooltip = $('#tooltip').css({ 'position': 'absolute' });
    // declare functions
    function _out( event ) {
      _tooltip.fadeOut( 'fast' );
    };

    function _move( event ) {
      if ( text ) {
        _tooltip
          .css( 'top',  ( event.pageY - 50 ) + 'px' )
          .css( 'left', ( event.pageX + 20 ) + 'px' );
      }
    }
    function _in( event ) {
      if ( text ) {
        _tooltip.html( text )
          .css( 'top',  ( event.pageY - 50 ) + 'px' )
          .css( 'left', ( event.pageX + 20 ) + 'px' )
          .fadeIn( 'fast' );
      }
    };

    if ( text ) {
      $( this ).mouseover( _in    );
      $( this ).mouseout(  _out   );
      $( this ).mousemove( _move  );
    } // if text
    else {
      this.mouseout();
      this.unbind( 'mouseover' );
      this.unbind( 'mouseout'  );
      this.unbind( 'mousemove' );
    }
    return this;
  },

  required: function() {
    var _required = function() {
      if ( !this.value ) {
        var _color = 'red';
        $( this ).animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color }).tooltip('Nincs kitöltve!');
        this.valid = false;
      } else {
        var _color = '#D0D0D0';
        $( this ).animate({ 'borderTopColor': _color, 'borderRightColor': _color, 'borderBottomColor': _color, 'borderLeftColor': _color }).tooltip( false );
        this.valid = true;
      }
    };
    test = this;
    //this.keyup( _required ).blur( _required ).change( _required );
    this.bind( 'blur keyup change', _required );
    return this;
  },

  /** Form handler methods
  */
  formLoad: function( url, _callback, params ) {
    var data = {};
    var containers = this;
    $.getJSON( url, params || {}, function( data ) {
      if ( _callback ) _callback( data );
      containers.each( function() {
        $( 'input[type=text], input[type=hidden], input[type=password], input[type=checkbox], input[type=radio], textarea, select', this ).each(function(){
          var _name = this.name.replace( /\[\]$/, '' ) ;
          if ( typeof data[ _name ] == 'undefined' ) {
            return;
          }
          switch( this.tagName.toLowerCase() ) {
            case 'select':
              if ( typeof data[ _name ] == 'object' && data[ _name ] instanceof Array ) {
                var _select = this;
                $( this ).find('option').each( function(){
                  this.selected =  ( data[ _name ].indexOf( this.value.toString() ) > -1 ) ? true : false;
                });
              } else {
                $( this ).val( data[ _name ] );
              }
              break;
            case 'input':
              switch( this.type.toLowerCase() ) {
                case 'checkbox':
                case 'radiobutton':
                  this.checked = data[ this.name ] == this.value ? true : false;
                  break;
                default:
                  this.value = data[ this.name ];
              }
            default:
              this.value = data[ this.name ];
          }
        }); // end each fields
      }); // end each containers

    } );
  },

  formPost: function( url, options ) {
    if ( !options ) options = {};

    var fields = {};
    this.each( function() {
      $( 'input[type=text], input[type=hidden], input[type=password], input[type=checkbox], input[type=radio], textarea, select', this ).each(function(){

        switch( this.tagName.toLowerCase() ) {
          // inputs
          case 'input':

            var _value = false;
            var _key   = this.name;
            switch( this.type.toLowerCase() ) {

              case 'radio':
                if( this.checked ) _value = this.value;
                break;

              case 'checkbox':
                if( this.checked ) _value = this.value; else return;
                break;

              case 'text':
              case 'hidden':
              case 'password':
                _value = this.value;
                break;
              default: return;
            }
            fields[ _key ] = _value;
            break;

          // selects
          case 'select':
            var _value = '';
            var _key   = this.name;
            if ( !this.multiple ) {
              _value = this.value;
            } else {
              if ( ! /\[\]$/.test( _key ) ) _key += '[]';
              _value = [];
              $( 'option', this ).each(function(){
                if ( this.selected ) _value.push( this.value );
              });
            }
            fields[ _key ] = _value;
            break;
          case 'textarea':
            var _key   = this.name;
            var _value = this.value;
            fields[ _key ] = _value;
            break;
          default: return;
        }
      }); // end fields each
    } ); // end each

    options.data      = fields;
    options.url       = url;
    options.cache     = false;
    options['type']   = options['type'] || 'POST';
    options.dataType  = options.dataType || 'json';
    $.ajax( options );
  }

});
