function g_validate_form( id )
{
  var submit = true;
  jQuery( '#fg-' + id ).find( "input[type=text], input[type=password], select, textarea" ).each( function()
  {
    var min   = parseInt( jQuery( this ).attr( 'min' ) );
    var equal = jQuery( this ).attr( 'equal' );
    var fun   = jQuery( this ).attr( 'function' );
    var email = jQuery( this ).attr( 'email' );

    jQuery( this ).parents( '.form-group' ).removeClass( 'has-error' );
    jQuery( this ).next( 'span.g-error' ).remove();

    if ( jQuery( this ).hasClass( 'require' ) || jQuery( this ).hasClass( 'optional' ) )
    {
      if ( !isNaN( min ) && jQuery.trim( jQuery( this ).val() ).length < min && jQuery.trim( jQuery( this ).val() ) !== '' )
      {
        submit = false;
        jQuery( this ).parents( '.form-group' ).addClass( 'has-error' );
        jQuery( this ).after( '<span class="g-error text-danger mt5"><small>Wypełnione pole jest zbyt krótkie (min. ' + min + ' znaków).</small></span>' );
      }
      else if ( equal !== undefined && jQuery( this ).val() !== jQuery( '#' + equal ).val() )
      {
        submit = false;
        jQuery( this ).parents( '.form-group' ).addClass( 'has-error' );
        jQuery( this ).after( '<span class="g-error text-danger mt5"><small>' + jQuery( this ).attr( 'error_txt' ) + '</small></span>' );
      }
      else if ( jQuery( this ).hasClass( 'require' ) && ( jQuery.trim( jQuery( this ).val() ) === '' || jQuery( this ).val() === 'null' ) )
      {
        submit = false;
        jQuery( this ).parents( '.form-group' ).addClass( 'has-error' );
        jQuery( this ).after( '<span class="g-error text-danger mt5"><small>To pole jest wymagane.</small></span>' );
      }
      else if ( fun !== undefined )
      {
        var response = window[fun]();

        if ( response['status'] === 'error' )
        {
          submit = false;
          jQuery( this ).parents( '.form-group' ).addClass( 'has-error' );
          jQuery( this ).after( '<span class="g-error text-danger mt5"><small>' + response['msg'] + '</small></span>' );
        }
      }
      else if ( email !== undefined )
      {
        if ( isEmail( jQuery( this ).val() ) === false )
        {
          submit = false;
          jQuery( this ).parents( '.form-group' ).addClass( 'has-error' );
          jQuery( this ).after( '<span class="g-error text-danger mt5"><small>' + jQuery( this ).attr( 'error_txt' ) + '</small></span>' );
        }
      }
    }
  });
  return submit;
}

function number_format( number, decimals, dec_point, thousands_sep )
{
  number = ( number + '' ).replace( /[^0-9+\-Ee.]/g, '' );
  var n = !isFinite(+number) ? 0 : +number,
      prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
      sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
      dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
      s = '',
      toFixedFix = function (n, prec) {
          var k = Math.pow(10, prec);
          return '' + Math.round(n * k) / k;
      };
  s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
  if (s[0].length > 3) {
      s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
  }
  if ((s[1] || '').length < prec) {
      s[1] = s[1] || '';
      s[1] += new Array(prec - s[1].length + 1).join('0');
  }
  return s.join(dec);
}

function isEmail( email ) {
  var regex = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
  return regex.test( email );
}

function create_error( text )
{
  jQuery( "button.close" ).trigger( "click" );
  jQuery( '#content' ).prepend( '<div class="row">' +
                                  '<div class="col col-xs-12">' +
                                    '<div class="alert alert-danger alert-dismissable">' +
                                      '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' +
                                      '<i class="fa fa-info pr10"></i>' +
                                      text +
                                  '</div>' +
                                '</div>' );
}

function create_message( text )
{
  jQuery( "button.close" ).trigger( "click" );
  jQuery( '.content.home .container-fluid' ).prepend( '<div class="row">' +
                                  '<div class="col col-xs-12">' +
                                    '<div class="alert alert-primary alert-dismissable">' +
                                      '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>' +
                                      text +
                                  '</div>' +
                                '</div>' );
}

function hide_message() {
  setTimeout( function() {
    jQuery( "button.close" ).trigger( "click" );
  }, 3000 );
}

function getCheckedIds( table )
{
  var checkedVals = jQuery( '#g-' + table + ' .g-checkbox:checked' ).map(function() {
    return this.value;
  }).get();
  checkedVals.join( "," );
  return checkedVals;
}

jQuery( 'body' ).on( 'click', '#g-message, #g-alert', function() {
  jQuery( this ).remove();
});

jQuery( 'body' ).on( 'change', '.g-double', function() {
  var value = jQuery( this ).val();
  value 		= parseFloat( value.replace( ',', '.' ) * 1 );

  if ( isNaN( value ) )
    value	= 0;

  if ( jQuery( this ).hasClass( 'g-plus' ) )
    value = Math.abs( value );

  value = number_format( value , 2 , '.' , '' );

  jQuery( this ).val( value );
});

jQuery( 'body' ).on( 'mouseover', '.g-tip', function() {
  jQuery( this ).tooltipster({
    contentAsHTML: true,
    position: 'bottom-left',
    theme: 'tooltipster-punk'
  });
  jQuery( this ).tooltipster( 'show' );
});

jQuery( 'body' ).on( 'focus', '.g-date', function() {
  jQuery( this ).datepicker( {
    dateFormat: 'yy-mm-dd',
    changeMonth: true,
    changeYear: true
  } );
});

jQuery( 'body' ).on( 'click', 'a.g-expand', function() {
  jQuery( this ).parents( '.g-form-edit' ).children( '.g-content' ).slideDown( 'fast' );
  jQuery( this ).children( 'i' ).removeClass( 'fa-chevron-down' ).addClass( 'fa-chevron-up' );
  jQuery( this ).removeClass( 'g-expand' ).addClass( 'g-collapse' );
});

jQuery( 'body' ).on( 'click', '.g-collapse', function() {
  jQuery( this ).parents( '.g-form-edit' ).children( '.g-content' ).slideUp( 'fast' );
  jQuery( this ).children( 'i' ).removeClass( 'fa-chevron-up' ).addClass( 'fa-chevron-down' );
  jQuery( this ).removeClass( 'g-collapse' ).addClass( 'g-expand' );
});

jQuery( 'body' ).on( 'click', '#g-columns-list-close', function()
{
  jQuery( '#g-select-columns' ).show();
  jQuery( "#g-columns-list-close" ).hide();
  return false;
});

jQuery( 'body' ).on( 'click', '#g-select-columns', function()
{
  jQuery( '#g-select-columns' ).hide();
  jQuery( "#g-columns-list-close" ).show();
  jQuery( '#g-columns-list' ).show();
  return false;
});

jQuery( '.g-column-toggle' ).on( 'ifToggled', function()
{
  var data = jQuery( this ).parents( '#g-columns-list' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var i = jQuery( this ).parents( 'li' ).attr( 'i' );

  jQuery.ajax(
  {
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
      gtable: gtable,
      column: i,
      hidden:  !jQuery( this ).prop( 'checked' ),
      a: 'gdraw'
    },
    beforeSend: function()
    {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data )
    {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();

      if ( response.status === 'ok' )
      {
        if ( response.msg !== null )
          create_message( response.msg );

        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'click', '.g-csv', function()
{
  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  };
  window.open( dir + '/get.php?t=csv&gtable=' + gtable, 'Drukowanie', "height=400,width=600" );
});

jQuery( 'body' ).on( 'click', '.g-print', function() {
  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  };
  window.open( dir + '/print.php?gtable=' + gtable, 'Drukowanie', "height=400,width=600" );
});

jQuery( 'body' ).on( 'click', '#g-multidelete', function()
{
  var url = jQuery( this ).attr( 'url' );

  if ( typeof url === 'undefined' )
    url = '';

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  jQuery.prompt( 'Na pewno chcesz usunąć wybrane elementy?',
  {
    title: 'Potwierdź?',
    submit: function(e,v,m,f)
    {
      if ( v === true )
      {
        var checkedVals = getCheckedIds( gtable );

        if ( url !== '' )
        {
          jQuery.ajax(
          {
            type: 'POST',
            cache: false,
            url: url,
            data:
            {
              gdelete_multi: checkedVals
            },
            beforeSend: function()
            {
              jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
            },
            success: function( data )
            {
              response = jQuery.parseJSON( data );

              if ( response.status === 'ok' )
              {
                if ( response.msg !== null )
                  create_message( response.msg );

                jQuery.ajax(
                {
                  type: 'POST',
                  cache: false,
                  url: dir + '/ajax.php',
                  data:
                  {
                    gtable: gtable,
                    a: 'gdraw'
                  },
                  success: function( data )
                  {
                    response = jQuery.parseJSON( data );
                    jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();

                    if ( response.status === 'ok' )
                    {
                      if ( response.msg !== null )
                        create_message( response.msg );

                      jQuery( '#g-multidelete' ).hide();
                      jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
                    }
                    else
                    {
                      if ( response.msg )
                        var msg = response.msg;
                      else
                        var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                      create_error( msg );
                    }
                  }
                });
              }
              else
              {
                if ( response.msg )
                  var msg = response.msg;
                else
                  var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                create_error( msg );
              }
            }
          });
        }
        else
        {
          jQuery.ajax(
          {
            type: 'POST',
            cache: false,
            url: dir + '/ajax.php',
            data:
            {
              gtable: gtable,
              gdelete_multi: checkedVals,
              a: 'gdraw'
            },
            beforeSend: function()
            {
              jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
            },
            success: function( data )
            {
              response = jQuery.parseJSON( data );
              jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();

              if ( response.status === 'ok' )
              {
                if ( response.msg !== null )
                  create_message( response.msg );
                jQuery( '#g-multidelete' ).hide();
                jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
              }
              else
              {
                if ( response.msg )
                  var msg = response.msg;
                else
                  var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                create_error( msg );
              }
            }
          });
        }
      }
    },
    buttons: {
      'tak': true,
      'nie': false
    },
    focus: 1
  });
  return false;
});

jQuery( 'body' ).on( 'click', '#g-cancel', function() {

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
        gtable: gtable,
      a: 'gdraw'
    },
    beforeSend: function() {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-add, #g-search, .g-button, #g-select-columns' ).show();
        jQuery( '#g-cancel, #g-save' ).hide();
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'click', '#g-save, #g-edit-save', function()
{
  $( '#g-menu .btn' ).each( function()
  {
    $( this ).addClass( 'disabled' );
  });

  var back_url      = jQuery( this ).attr( 'back_url' );
  var persist_edit  = jQuery( this ).attr( 'persist_edit' );
  var id_param      = jQuery( this ).attr( 'id_param' );

  if ( typeof back_url === 'undefined' )
    back_url = '';

  var data = jQuery( this ).parents( '.form_container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var validate = true;

  jQuery( '#fg-' + gtable + ' .form-control' ).each( function()
  {
    if ( $( this ).prop( 'required' ) && $( this ).val() === '' )
    {
      $( this ).addClass( 'error' );
      validate = false;
    }
    else
      $( this ).removeClass( 'error' );
  });

  if ( !validate )
    return false;

  if ( g_validate_form( gtable ) === true )
  {
    var values = jQuery( '#fg-' + gtable ).serializeArray();

    var url = jQuery( this ).attr( 'url' );

    if ( url !== '' )
    {
      jQuery.ajax(
      {
        type: 'POST',
        cache: false,
        url: url,
        data:
        {
          gtable: gtable,
          values: JSON.stringify( values ),
          a: 'gsave'
        },
        beforeSend: function()
        {
          jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
        },
        success: function( data )
        {
          $( this ).removeClass( 'disabled' );
          response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
          if ( response.status === 'ok' )
          {
            if ( back_url !== '' && persist_edit == 0 )
              document.location.href = back_url;
            else if ( persist_edit == 0 )
            {
              if ( response.msg !== null )
                create_message( response.msg );

              jQuery.ajax(
              {
                type: 'POST',
                cache: false,
                url: dir + '/ajax.php',
                data:
                {
                  gtable: gtable,
                  a: 'gdraw'
                },
                beforeSend: function()
                {
                  jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
                },
                success: function( data )
                {
                  response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
                  if ( response.status === 'ok' )
                  {
                    jQuery( '#g-add, #g-search, .g-button, #g-select-columns' ).show();
                    jQuery( '#g-cancel, #g-save' ).hide();
                    jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
                  }
                  else
                  {
                    if ( response.msg )
                      var msg = response.msg;
                    else
                      var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                    create_error( msg );
                  }
                }
              });
            }
            else
            {
              if ( response.msg !== null )
                create_message( response.msg );

              if ( id_param != '' )
                jQuery( '#' + id_param ).val( response.id );

              jQuery( '#g-menu *' ).removeClass( 'disabled' );
            }
          }
          else
          {
            if ( response.msg )
              var msg = response.msg;
            else
              var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
            create_error( msg );
          }
        }
      });
    }
    else
    {
      jQuery.ajax(
      {
        type: 'POST',
        cache: false,
        url: dir + '/ajax.php',
        data:
        {
          gtable: gtable,
          values: JSON.stringify( values ),
          a: 'gsave'
        },
        beforeSend: function()
        {
          jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
        },
        success: function( data )
        {
          $( this ).removeClass( 'disabled' );
          response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
          if ( response.status === 'ok' )
          {

            if ( back_url !== '' )
            {
              document.location.href=back_url;
            }
            else
            {
              if ( response.msg !== null )
                create_message( response.msg );

              jQuery( '#g-add, #g-search, .g-button, #g-select-columns' ).show();
              jQuery( '#g-cancel, #g-save' ).hide();
              jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
            }
          }
          else
          {
            if ( response.msg )
              var msg = response.msg;
            else
              var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
            create_error( msg );
          }
        }
      });
    }
  } else {
    $( '#g-menu .btn' ).each( function()
    {
      $( this ).removeClass( 'disabled' );
    });
  }
});

jQuery( 'body' ).on( 'click', '#g-add, .g-edit', function() {

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var gedit = jQuery( this ).attr( 'element-id' );

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
      gtable: gtable,
      gedit: gedit,
      a: 'gedit'
    },
    beforeSend: function() {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-add, #g-search, .g-button, #g-select-columns' ).hide();
        jQuery( '#g-cancel, #g-save' ).css( 'display', 'inline-block' );
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'click', '.g-delete', function()
{
  jQuery( this ).blur();

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var gdelete       = jQuery( this ).attr( 'element-id' );
  var back_url      = jQuery( this ).attr( 'back-url' );
  var url           = jQuery( this ).attr( 'url' ).replace( '[ID]', gdelete );
  var after_delete  = jQuery( this ).attr( 'after-delete' );

  jQuery.prompt( 'Na pewno chcesz usunąć wybrany element?',
  {
    title: 'Potwierdź?',
    submit: function(e,v,m,f)
    {
      if ( v === true )
      {
        if ( url !== '' )
        {
          jQuery.ajax(
          {
            type: 'POST',
            cache: false,
            url: url,
            data:
            {
              gdelete: gdelete,
              a: 'gdelete'
            },
            beforeSend: function()
            {
              jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
            },
            success: function( data )
            {
              response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
              if ( response.status === 'ok' )
              {
                if ( back_url !== '' )
                {
                  document.location.href=back_url;
                }
                else
                {
                  if ( response.msg !== null )
                    create_message( response.msg );

                  jQuery.ajax(
                  {
                    type: 'POST',
                    cache: false,
                    url: dir + '/ajax.php',
                    data:
                    {
                      gtable: gtable,
                      a: 'gdraw'
                    },
                    beforeSend: function()
                    {
                      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
                    },
                    success: function( data )
                    {
                      response = jQuery.parseJSON( data );
                      jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
                      if ( response.status === 'ok' )
                      {
                        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
                      }
                      else
                      {
                        if ( response.msg )
                          var msg = response.msg;
                        else
                          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                        create_error( msg );
                      }

                      if ( after_delete != null )
                        eval( after_delete );
                    }
                  });
                }
              }
              else
              {
                if ( response.msg )
                  var msg = response.msg;
                else
                  var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                create_error( msg );
              }
            }
          });
        }
        else
        {
          jQuery.ajax(
          {
            type: 'POST',
            cache: false,
            url: dir + '/ajax.php',
            data:
            {
              gtable: gtable,
              gdelete: gdelete,
              a: 'gdraw'
            },
            beforeSend: function()
            {
              jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
            },
            success: function( data )
            {
              response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
              if ( response.status === 'ok' )
              {
                if ( back_url !== '' )
                {
                  document.location.href=back_url;
                }
                else
                {
                  jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
                  if ( response.msg !== null )
                    create_message( response.msg );

                  if ( after_delete != null )
                    eval( after_delete );
                }
              }
              else
              {
                if ( response.msg )
                  var msg = response.msg;
                else
                  var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
                create_error( msg );
              }
            }
          });
        }
      }
    },
    buttons:
    {
      'tak': true,
      'nie': false
    }
  });
  return false;
});

jQuery( 'body' ).on( 'change', '.g-search-input, .g-search-select', function()
{
  var data = jQuery( this ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'search-column' )
      var gsearch_column = vars[1];

    if ( vars[0] === 'search-type' )
      var gsearch_type = vars[1];
  }

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index )
  {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var gsearch_value = jQuery( this ).val();

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data:
    {
      gtable: gtable,
      gsearch_column: gsearch_column,
      gsearch_value: gsearch_value,
      gsearch_type: gsearch_type,
      a: 'gdraw'
    },
    beforeSend: function()
    {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
        jQuery( 'input[name="' + gsearch_column + '"]' ).focus().val( jQuery( 'input[name="' + gsearch_column + '"]' ).val() );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'click', '.g-sort', function() {

  var data = jQuery( this ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'sort-column' )
      var gsort_column = vars[1];

    if ( vars[0] === 'sort-type' )
      var gsort_type = vars[1];
  }

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
      gtable: gtable,
      gsort_column: gsort_column,
      gsort_type: gsort_type,
      a: 'gdraw'
    },
    beforeSend: function() {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'change', '#g-row-limit', function() {
  var glimit = jQuery( this ).val();

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
      gtable: gtable,
      glimit: glimit,
      a: 'gdraw'
    },
    beforeSend: function() {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });
});

jQuery( 'body' ).on( 'click', '.date-range-icon', function()
{
  $( this ).parents( '.input-group' ).children( 'input' ).trigger( 'click' );
});

jQuery( 'body' ).on( 'click', '.g-next, .g-last, .g-first, .g-previous, .g-page', function(e) {

  e.preventDefault();

  var data = jQuery( this ).parents( '.g-container' ).attr( 'data' );
      data = data.split( ";" );

  for ( index = 0; index < data.length; ++index ) {
    var vars = data[ index ].split( ':') ;

    if ( vars[0] === 'table' )
      var gtable = vars[1];
  }

  var gpage   = jQuery( this ).attr( 'page' );

  jQuery.ajax({
    type: 'POST',
    cache: false,
    url: dir + '/ajax.php',
    data: {
      gtable: gtable,
      gpage: gpage,
      a: 'gdraw'
    },
    beforeSend: function() {
      jQuery( '#g-' + gtable ).find( '#g-loader' ).show();
    },
    success: function( data ) {
      response = jQuery.parseJSON( data ); jQuery( '#g-' + gtable ).find( '#g-loader' ).hide();
      if ( response.status === 'ok' )
      {
        jQuery( '#g-' + gtable ).find( '#g-results' ).empty().html( response.output );
      }
      else
      {
        if ( response.msg )
          var msg = response.msg;
        else
          var msg = "Przepraszamy. Podczas wczytywania danych wystąpił błąd. Prosimy spróbować ponownie.";
        create_error( msg );
      }
    }
  });

});