function gc_auto_run($) {
  if(!$) {
    var script = document.createElement('script');
    script.src = 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js';

    document.getElementsByTagName('head')[0].appendChild(script);
    gc_auto_run(jQuery);
  }
  var HOME_URL = gc_backend_info.home_url;
  var AJAX_URL = gc_backend_info.ajax_url;
  var GC_LOGGED_IN = gc_backend_info.logged_in;

  var gc_ = '#gcAbsoluteGroundZero';
  var $i = function(selector) {
    if(
      selector
      && $.type(selector) == 'string'
      && (selector[0] == '#' || selector[0] == '.')) {
      return $(gc_).find(selector);
    } else {
      return $(selector);
    }
  }

  $.AjaxRequest = function(id, callback) {
    if(!id.formData) {
      var jqID = '#'+id;
      var formData = new FormData($i(jqID)[0]);
      var action = $i(jqID).attr('action');
      var allowProcessing = false;
      var allowContentType = false;
      var is_html = ($i(jqID).attr('data-returnhtml')) ? true : false;
    } else {
      //id is not actually a form ID but data for submission
      var formData = (id.formData);
      var action = id.action;
      var allowProcessing = true;
      var allowContentType = undefined;

      var is_html = id.is_html || false;
    }

    var reqtype = (!id.is_get) ? 'POST' : 'GET';

    $.ajax({
      url:     action,  //Server script to process data
      type:    reqtype,
      success:   function(d) {
            var data = (is_html) ? d : JSON.parse(d);

            // handle notifications globally
            if(data.options.total_notifications && data.options.total_notifications > 0) {
              $i('.gc_notifications_count').text(data.options.total_notifications);
              $i('.gc_notifications_count').show();
            } else {
              $i('.gc_notifications_count').text('');
              $i('.gc_notifications_count').hide();
            }

            callback(data);
          },
      error:   function(err) {
            callback({ success: false, message: 'Please check your script or internet' });
          },
      data:    formData,
      headers:   {
            'X-CSRF-TOKEN': $i('meta[name="csrf-token"]').attr('content')
          },
      processData: allowProcessing,
      contentType: allowContentType,
      cache: false,
    });
  }

	$(document).ready(function() {
    // Start: functions
    var loggedOutActions = function() {
      $i('#gcGistersBody').addClass('gc_logged_out');
      $i('#gcGistersBody').removeClass('gc_logged_in');

      GC_LOGGED_IN = false;
    }


    var openInGcBrowser = function(url) {
      $('#gcBrowserContent').html('');
      $('#gcBrowserLoader').show();
      $('#gcInAppBrowser').show();

      $('#gcBrowserContent').load(url, function() {
        $i('#gcBrowserLoader').hide();
        $i('#gcBrowserRefresh').attr('href', url);
      });
    }


    var api = function(d, callback) {
      // check if d is url
      if(typeof d == 'string' && d.indexOf('http') == 0) {
        var data = { action: d, formData: {} };
      } else {
        var data = {
          action: AJAX_URL,
          formData: d,
        };
      }

      $.AjaxRequest(data, function(response) {
        callback(response);
      });
    }

    var openScreen = function(screen) {
      $i('.gc_main_screen').hide();
      $i('#gcFullscreenPreview').hide();
      
      $i('#'+screen).show();

      $i('#gcGistersBody').addClass('opened');
      $i('.gc_close_all').fadeIn();
    }

    var openLoginScreen = function() {
      loggedOutActions();

      openScreen('gcMyProfileMainScreen');
    }

    var logVisitorIn10Seconds = function() {
      if(!loggingVisitor) {
        loggingVisitor = true;

        logVisitor = setTimeout(function() {
          var url = AJAX_URL;
              url += '?action=gc_visitor_reward';
              url += '&referrer='+gc_backend_info.referrer;
              url += '&post_id='+gc_backend_info.enc_post_id;
  
          api(url, () => null)
          loggedVisitor = true;
        }, 10000);
      }
    }

    $.openLegends = function() {
      var url = AJAX_URL + '?action=gc_legends';
      openInGcBrowser(url);
    }

    $.gcUpdatedUserProfileCallback = function(data) {
      if(data.success) {
        $i('.current_user_avatar').attr('src', data.options.avatar);
        $i('.current_user_handle').text('@'+data.options.username);

        if(data.options.login) {
          $i('#gcGistersBody').addClass('gc_logged_out');
          $i('#gcGistersBody').removeClass('gc_logged_in');

          $i('#gcForceLoginAlert').text(data.options.login_reason);
          $i('#gcForceLoginAlert').show();

          loggedOutActions();
        }
      }
    }

    $.gcLoginCallback = function(data) {
      if(data.success) {
        $i('#gcGistersBody').addClass('gc_logged_in');
        $i('#gcGistersBody').removeClass('gc_logged_out');
        $i('.current_user_avatar').attr('src', data.options.avatar_url);

        $i('#gcMyProfileScreen').html('<div class="gc_loading"></div>');
        $i('#gcMyProfileScreen').load(data.options.profile_url);
        $i('#gcForceLoginAlert').hide();

        GC_LOGGED_IN = true;
      }
    }

    $.gcLoginFromPageCallback = function() {
      console.log('login from page callback');
      window.location =   HOME_URL+'/?open_gc=profile';
    }
    // End: functions

    $i('form.gc_ajax_submit').each(function() {
      // var action = $(this).attr('action');
      // var action = action.replace('#', '');
      // $(this).append('<input type="hidden" name="action" value="gc_'+action+'">');

      // $(this).attr('action', AJAX_URL);
    })


    $('.gc_sign_up_now').each(function() {
      var text = $(this).html();
      if(GC_LOGGED_IN) {
        $(this).html('My Profile');
      } else {
        $(this).html(text);
      }
    })

    var loggingVisitor = false;
    var logVisitor = null;
    var loggedVisitor = false;

    $(window).scroll(function() {
      logVisitorIn10Seconds();
    });

    $(window).blur(function() {
      clearTimeout(logVisitor);
      if(!loggedVisitor) loggingVisitor = false;
    });

    $(gc_).on('click', '.gc_browse_view', function(e) {
      var container = $(this).data('container');
      var url = $(this).attr('href');
    
      var spin_item = $(this).find('.gc_spin_item');
      if(spin_item) spin_item.addClass('rotating');

      $i(container).load(url, function() {
        if(spin_item) spin_item.removeClass('rotating');
      });

      e.preventDefault();
    });

    $(gc_).on('click', '.gc_reply_comment', function(e) {
      $i('#gcFullscreenPreview').hide();
      if(!GC_LOGGED_IN) {
        openLoginScreen();
        return;
      }

      var parentCommentID = $(this).data('parent-comment-id');
      var replyToUser = $(this).data('reply-to');

      if($(this).hasClass('active')) {
        $i('#gcGistersCommentParentId').val('');
        $i('#gcGistersCommentReplyToUser').val('');

        $('.gc_reply_comment').removeClass('active');
        $i('.gc_replying_to').text('');
        $i('.gc_replying_to').hide();
      } else {
        $('.gc_reply_comment').removeClass('active');
        $(this).addClass('active');

        $i('#gcGistersCommentReplyToUser').val(replyToUser);
        $i('#gcGistersCommentParentId').val(parentCommentID);

        $i('#gcGistersCommentContent').focus();

        $i('.gc_replying_to').text('Replying to @'+replyToUser);
        $i('.gc_replying_to').show();
      }

      e.preventDefault();
    })

		$(gc_).on('keypress', '.comment_field_wrap > textarea', function(e) {
      if(e.which === 13 && !e.shiftKey) {
        e.preventDefault();
    
        $(this).closest("form").submit();
      }
    });

    $(gc_).on('click', '.gc_copy_link', function(e) {
      var dis = $(this);
      var url = dis.text();
      dis.select();
      
      navigator.clipboard.writeText(url).then(function () {
        dis.addClass('copied');
        setTimeout(function() {
          dis.removeClass('copied');
        }, 2000);
      }, function () {
        dis.select();
      });

      e.preventDefault();
    });

		$(gc_).on('keyup', '.comment_field_wrap > textarea', function() {
      var comment = $(this).val();
		  var len = comment.length;
		  var maxLen = $(this).attr('maxlength');
		  
		  var lenEl = $i('.comment_field_wrap > .len_meter');

		  $i(lenEl).text(len+'/'+maxLen);

      if(len > 100) {
        $i(lenEl).css({ bottom: '0px' });
      } else {
        $i(lenEl).css({ bottom: '-50px' });
      }
      if(len >= maxLen) {
        $i(lenEl).css({ color: 'red' });
      }
    })

    $(gc_).on('click', '.clear_notification_count', function() {
      var url = AJAX_URL;
          url += '?action=gc_load_more_notifications';
          url += '&clear_unread_notifications=1';

      $i('.gc_notifications_count').text('');
      $i('.gc_notifications_count').hide();

      var title = $('#gcNotificationsTitle').html();

      $('#gcNotificationsTitle').html('Loading...');

      api(url, function(data) {
        if(data.success) {
          $('#gcNotificationsTitle').html(title);

          $i('#gcUserNotifications').html(data.options.html);
          $('#gcLoadMoreNotifications').attr('href', data.options.pagination.next_page_url);
          
          if(!data.options.pagination.next_page) {
            $('#gcLoadMoreNotifications').show();
          }
        }
      });
    });

    $(gc_).on('click', '.gc_load_more', function(e) {
      var dis = this;
      var container = $(dis).data('container');
      var url = $(dis).attr('href');
      
      var button_html = $(dis).html();

      if(button_html != 'Loading...') {
        $(dis).html('Loading...');

        api(url, function(data) {
          $(dis).html(button_html);
          if(data.success) {
            $i(container).append(data.options.html);
            $(dis).attr('href', data.options.pagination.next_page_url);

            if(!data.options.pagination.next_page) {
              $i('.gc_load_more').hide();
            }
          }
        });
      }
  
      e.preventDefault();
    });
    
    $(gc_).on('click', '.gc_like_btn', function(e) {
      $i('#gcFullscreenPreview').hide();
      if(!GC_LOGGED_IN) {
        openLoginScreen();
        return;
      }

      var commentID = $(this).data('comment-id');
      var postID = $(this).data('post-id');
      var countEl = $(this).data('counter');
      var isComment = $(this).hasClass('like_comment');
      var trigger = 'like';

      var loveIcon = $(this).find('.like-btn-svg');
      
      if(loveIcon.hasClass('animate') || loveIcon.hasClass('animated')) {
        loveIcon.removeClass('animate');
        loveIcon.removeClass('animated');

        trigger = 'unlike';
      } else {
        loveIcon.addClass('animate');
      }

      api({
        action: 'gc_engagements',
        like: true,
        post_id: postID,
        comment_id: commentID,
        action_trigger: trigger,
      }, function(data) {
        if(!data.success) {
          if(loveIcon.hasClass('animate') || loveIcon.hasClass('animated')) {
            loveIcon.removeClass('animate');
            loveIcon.removeClass('animated');
          } else {
            loveIcon.addClass('animate');
          }
        } else {
          $i(countEl).text(data.options.total_likes);
          if(!isComment) $('.post_likes_svg').attr('class', loveIcon.attr('class'));
        }
      });

      e.preventDefault();
    })

    $(gc_).on('click', '.gc_open_in_browser', function(e) {
      var url = $(this).attr('href');

      openInGcBrowser(url);
      e.preventDefault();
    })

    $(gc_).on('click', '.gc_delete_comment', function(e) {
      $i('#gcFullscreenPreview').hide();
      if(!GC_LOGGED_IN) {
        openLoginScreen();
        return;
      }

      if(!confirm('Deleting this comment means you would loose all the points associated with it.\nAre you sure you want to delete this comment?')) return false;
      var commentID = $(this).data('comment-id');
      var postID = $(this).data('post-id');
      var container = '.gcComment'+commentID;

      var dis = $(this);
      dis.text('Deleting...');

      $i(container).css({ opacity: 0.5 })

      api({
        action: 'gc_engagements',
        comment_id: commentID,
        post_id: postID,
        delete_comment: true,
      }, function(data) {
        if(data.success) {
          $i(container).remove();
          $i('#commentPreview'+commentID).remove();

          if(postID == gc_backend_info.post_id) {
            var count = parseInt($i('.post_comments_count')[0].innerHTML);
            $i('.post_comments_count').text(count-1);
          }
        } else {
          dis.text('Delete');
          $i(container).css({ opacity: 1 })
        }
      });

      e.preventDefault();
    })

    $(gc_).on('click', '.gc_open_screen', function() {
      var screen = $(this).data('screen');
      var callback = $(this).data('callback');
      
      openScreen(screen);
      if(callback) $[callback]();
    })
    
    $(gc_).on('click', '.gc_close_all', function() {
      $i('#gcGistersBody').removeClass('opened');
      $i('.gc_close_all').fadeOut();
    })

    $(gc_).on('submit', '#gcGistersCommentForm', function(e) {
      $i('#gcFullscreenPreview').hide();
      if(!GC_LOGGED_IN) {
        openLoginScreen();
        e.preventDefault();
        return;
      }

      var comment = $i('#gcGistersCommentContent').val();
      var postID = gc_backend_info.post_id;
      var parentCommentID = $i('#gcGistersCommentParentId').val();

      if(comment.length > 150) {
        return false;
      }

      if(comment.length < 1) {
        return false;
      }

      $i('#gcGistersCommentForm .gc_submit_btn').text('Posting...');

      var params = {
        comment: comment,
        post_id: postID,
        parent_comment_id: parentCommentID,
        action: 'gc_engagements',
      };

      console.log({ params });

      api(params, function(data) {
        $i('#gcGistersCommentForm .gc_submit_btn').text('Post');
        if(data.success) {
          const commentContainer = parseInt(parentCommentID) > 0
            ? '#gcCommentReplies'+data.options.parent_id
            : '#gcCommentsContainer';

          $i('#gcGistersCommentContent').val('');
          $i('#gcGistersCommentParentId').val('');
          $i('#gcGistersCommentForm .gc_close_all').click();
          $i('.gc_reply_comment').removeClass('active');

          $i(commentContainer).prepend(data.options.html);
          $i('#gcNoComments').hide();

          var count = parseInt($i('.post_comments_count')[0].innerHTML);

          $i('.post_comments_count').text(count+1);

          $i('.gc_replying_to').hide();
        }
      });

      e.preventDefault();
    })

    $(gc_).on('click', '.gc_show_and_hide', function(e) {
      var show = $(this).data('show');
      var hide = $(this).data('hide');
      var triggers = $(this).data('triggers');

      $i(hide).hide();
      $i(show).show();

      if(triggers) {
        $i(triggers).removeClass('active');
        $(this).addClass('active');
      }

      e.preventDefault();
    })

    $(gc_).on('click', '.gc_engagement_count', function(e) {
      $(this).parent().find('button').click();
    });

    $(gc_).on('click', '.gc_logout', function(e) {
      $(this).text('Loading...');

      api({
          action: 'gc_logout',
        }, function(data) {
          if(data.success) {
            loggedOutActions();
          }
          $(this).text('Logout');
        });

      e.preventDefault();
    });

    $(gc_).on('submit', '.gc_ajax_submit', function(e) {
      e.preventDefault();

      var formID = $(this).attr('id');
      var callback = $(this).data('callback') + 'Callback';
      var submitButton = $(this).find('input[type="submit"]');

      var submitText = $i(submitButton).val();

      var submitLoadingText = $i(submitButton).data('loadingText') || 'Please wait...';

      var alertElement = $(this).find('.gc_alert');

      $i(submitButton).val(submitLoadingText);
      $i(alertElement).hide();

      $.AjaxRequest(formID, function(data) {
        if(!data.success) {
          $i(alertElement).html(data.message);
          $i(alertElement).addClass('gc_error');
          $i(alertElement).removeClass('gc_success');
        } else {
          $i(alertElement).text(data.message);
          $i(alertElement).addClass('gc_success');
          $i(alertElement).removeClass('gc_error');
        }

        $i(alertElement).show();
        $i(submitButton).val(submitText);

        if(callback) {
          $[callback](data);
        }
      });
    })

    $('.gc_sign_up_now').click(function(e) {
      openScreen('gcMyProfileMainScreen');
      $('.onboading_screens').hide();
      $('#dgSignupFormScreen').show();
      
      e.preventDefault();
    })

    $(gc_).on('click', '.open_comment_in_fullscreen', function(e) {
      var dis = $(this);
      var commentID = dis.data('comment-id');
      var image = dis.data('image');
      var title = dis.data('title');
      var date = dis.data('date');
      var url = dis.data('url');

      var commentHtml = $i('#gcComment'+commentID).html();

      $i('#gcFullscreenPostCard').css({'background-image': 'url('+image+')'});
      $i('#gcFullscreenPostTitle').text(title);
      $i('#gcFullscreenPostTitle').attr('href', url);
      $i('#gcFullscreenPostDate').text(date);
      $i('#gcFullscreenCommentContent').html(commentHtml);

      $i('#gcFullscreenPreview').show();
    })
	})
};

gc_auto_run(jQuery);
