#!/usr/bin/php -q
<?php
/* Copyright 2005-2024, Lime Technology
 * Copyright 2012-2024, Bergware International.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2,
 * as published by the Free Software Foundation.
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 */

$docroot ??= ($_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp');
require_once "$docroot/webGui/include/Helpers.php";
extract(parse_plugin_cfg('dynamix', true));

// add translations
$_SERVER['REQUEST_URI'] = '';
$login_locale = _var($display, 'locale');
require_once "$docroot/webGui/include/Translations.php";

$var = parse_ini_file('state/var.ini');
$unraid = parse_ini_file('/etc/unraid-version');
$keyfile = !empty(_var($var, 'regFILE')) ? trim(base64_encode(@file_get_contents($var['regFILE']))) : '';
$feedback = '/webGui/images/feedback_';

$diagn = _('Unable to generate system diagnostics');
$sorry = _('Sorry, an error occurred');
$again = _('Please try again later');
?>
<style>
div.spinner.fixed {
    z-index: 100000;
}
.feedback-control-panel {
    padding-top: 8px;
    line-height: 24px;
    white-space: nowrap;
    text-align: center;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;

    label {
        margin-right: 30px;
    }
}
.feedback-panel {
    display: none;
}
.feedback-panel-textarea {
    width: 100%;
    height: 530px;
    margin: 0;
    resize: none;
    box-sizing: border-box;
}
@media (max-width: 960px) {
    .feedback-panel-textarea {
        height: 330px;
    }
}
@media (max-height: 768px) {
    .feedback-panel-textarea {
        height: 330px;
    }
}
.feedback-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 1rem;
  gap: 1rem;
}
.feedback-footer-nav {
  display: flex;
  align-items: center;
  gap: 1rem;
}
.feedback-email-input {
    padding-left: 4px;
}
.note {
    font-size: 1.1rem !important;
}
.feedback-submission-img {
    display: inline-block;
    margin-bottom: 30px;
}
.center {
    text-align: center !important;
}
.green-text {
    color: var(--green-800) !important;
}
.red-text {
    color: var(--red-600) !important;
}
</style>

<div>
  <div class="feedback-control-panel">
    <label for="opt_featurerequest">
      <input type="radio" name="mode" id="opt_featurerequest" value="featurerequest" checked="checked">
      <?=_('Product Suggestion')?>
    </label>
    <label for="opt_bugreport">
      <input type="radio" name="mode" id="opt_bugreport" value="bugreport">
      <?=_('Bug Report')?>
    </label>
    <label for="opt_troubleshoot">
      <input type="radio" name="mode" id="opt_troubleshoot" value="troubleshoot">
      <?=_('Troubleshoot')?>
    </label>
    <label for="opt_comment">
      <input type="radio" name="mode" id="opt_comment" value="comment">
      <?=_('Other Comment')?>
    </label>
    <hr>
  </div>

  <div id="result_panel" class="feedback-panel"></div>

  <div id="featurerequest_panel" class="feedback-panel">
    <textarea id="featurerequest" class="feedback-panel-textarea"></textarea>
  </div>

  <div id="bugreport_panel" class="feedback-panel">
    <textarea id="bugreport" class="feedback-panel-textarea"></textarea>
    <label class="note" for="anonymize_bugreport">
      <input type="checkbox" id="anonymize_bugreport" class="anonymize" value="1">
      <?=_('Anonymize diagnostics (may make troubleshooting more difficult)')?>
    </label>
    <p class="note"><b><?=_('NOTE')?>:</b> <i><?=_('Submission of this bug report will automatically send your system diagnostics to Lime Technology')?>.</i></p>
  </div>

  <div id="troubleshoot_panel" class="feedback-panel">
    <textarea id="troubleshoot" class="feedback-panel-textarea"></textarea>
    <label class="note" for="anonymize_troubleshoot">
      <input type="checkbox" id="anonymize_troubleshoot" class="anonymize" value="1">
      <?=_('Anonymize diagnostics (may make troubleshooting more difficult)')?>
    </label>
    <p class="note"><b><?=_('NOTE')?>:</b> <i><?=_('Submission of this troubleshooting request will automatically send your system diagnostics to Lime Technology')?>.</i></p>
  </div>

  <div id="comment_panel" class="feedback-panel">
    <textarea id="comment" class="feedback-panel-textarea"></textarea>
  </div>

  <div class="feedback-footer">
    <input class="feedback-email-input" type="email" autocomplete="off" spellcheck="false">
    <nav class="feedback-footer-nav">
      <a href="https://unraid.net" target="_blank"><?=_('Website')?></a>
      <a href="https://forums.unraid.net" target="_blank"><?=_('Forum')?></a>
      <a href="https://docs.unraid.net/" target="_blank"><?=_('Docs')?></a>
    </nav>
  </div>
</div>

<script>
var md5 = {};
String.prototype.md5 = function(){
  // Original copyright (c) Paul Johnston & Greg Holt.
  var hc = '0123456789abcdef';
  function rh(n){var j,s='';for (j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
  function ad(x,y){var l=(x&0xFFFF)+(y&0xFFFF);var m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
  function rl(n,c){return (n<<c)|(n>>>(32-c));}
  function cm(q,a,b,x,s,t){return ad(rl(ad(ad(a,q),ad(x,t)),s),b);}
  function ff(a,b,c,d,x,s,t){return cm((b&c)|((~b)&d),a,b,x,s,t);}
  function gg(a,b,c,d,x,s,t){return cm((b&d)|(c&(~d)),a,b,x,s,t);}
  function hh(a,b,c,d,x,s,t){return cm(b^c^d,a,b,x,s,t);}
  function ii(a,b,c,d,x,s,t){return cm(c^(b|(~d)),a,b,x,s,t);}
  function sb(x) {
    var i;var nblk=((x.length+8)>>6)+1;var blks=new Array(nblk*16);for (i=0;i<nblk*16;i++) blks[i]=0;
    for (i=0;i<x.length;i++) blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);
    blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
  }
  var i,x=sb(''+this),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
  for (i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
    a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17,  606105819);
    b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
    c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22,  -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
    d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17,     -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
    a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12,  -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
    b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
    c=gg(c,d,a,b,x[i+11],14,  643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
    d=gg(d,a,b,c,x[i+10], 9,   38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
    a=gg(a,b,c,d,x[i+ 9], 5,  568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
    b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9,  -51403784);
    c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4,    -378558);
    d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23,  -35309556);
    a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
    b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4,  681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
    c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23,   76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
    d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16,  530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
    a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
    b=ii(b,c,d,a,x[i+ 5],21,  -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
    c=ii(c,d,a,b,x[i+10],15,   -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
    d=ii(d,a,b,c,x[i+15],10,  -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
    a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15,  718787259);
    b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
  }
  return rh(a)+rh(b)+rh(c)+rh(d);
}

function validInput(input) {
  var validRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  var email = $('.feedback-email-input');
  return input.val().md5() == md5[input.prop('id')] || !(email.prop('required')===false || email.val().match(validRegex));
}

function feedback_reset() {
  $('#featurerequest').val("").prop('placeholder',"<?=_('Please summarize your suggestion here')?>.");
  md5.featurerequest = $('#featurerequest').val().md5();

  $('#bugreport').val("<?=_('Bug Description')?>:\n\n\n\n<?=_('How to reproduce')?>:\n\n\n\n<?=_('Expected results')?>:\n\n\n\n<?=_('Actual results')?>:\n\n\n\n<?=_('Other information')?>:\n");
  md5.bugreport = $('#bugreport').val().md5();

  $('#troubleshoot').val("<?=_('Description')?>:\n\n\n\n<?=_('How to reproduce')?>:\n\n\n\n<?=_('Expected results')?>:\n\n\n\n<?=_('Actual results')?>:\n\n\n\n<?=_('Other information')?>:\n");
  md5.troubleshoot = $('#troubleshoot').val().md5();

  $('#comment').val("").prop('placeholder',"<?=_('Type your question or comment to Lime Technology here')?>.");
  md5.comment = $('#comment').val().md5();
}

function form_submit(url, params, tab, diagnostics) {
  var panel = $(tab+'_panel');
  $('#submit_button').prop('disabled',true);
  panel.find('textarea').prop('disabled',true);
  $('div.spinner.fixed').show();
  if (diagnostics) {
    var anonymize = $('#anonymize').is(':checked') ? '1' : '';
    $.get('/webGui/include/Feedback.php',{getdiagnostics:1, anonymize:anonymize}, function(data){
      params.diagnostics = data;
      form_submit(url, params, tab);
    }).fail(function(){
      $('div.spinner.fixed').hide();
      panel.fadeOut('fast').find('textarea').prop('disabled',false);
      var reply = "<h2 class='center red-text'><?=_('Error')?></h2><p class='center'><img class='feedback-submission-img' src='<?=$feedback?>error.png'><br><?="$diagn. $again"?>.</p>";
      $('#result_panel').html(reply).fadeIn('fast');
    });
    return;
  }
  params.description = $(tab).val();
  params.email = $('.feedback-email-input').val();
  params.timestamp = "<?=time()?>";
  params.osversion = "<?=$unraid['version']?>";
  params.keyfile = "<?=$keyfile?>";
  params.pageurl = window.top.location.href;
  $.post(url, params, function(data){
    $('div.spinner.fixed').hide();
    if (data.error) {
      var reply = "<h2 class='center red-text'><?=_('Error')?></h2><p class='center'><img class='feedback-submission-img' src='<?=$feedback?>error.png'><br><?="$sorry. $again"?>.</p>";
      $('#result_panel').html(reply).fadeIn('fast');
    } else {
      var name = tab.substr(1).toLowerCase();
      var reply = "<h2 class='center green-text'><?=_('Thank You')?></h2><p class='center'><img class='feedback-submission-img' src='<?=$feedback?>"+name+".png'><br>"+(data.message||'')+"</p>";
      $('#result_panel').html(reply).fadeIn('fast');
    }
  }).fail(function(jqXHR, textStatus, errorThrown){
    if (jqXHR.responseJSON && jqXHR.responseJSON.error) {
      errorThrown = jqXHR.responseJSON.error;
    }
    var reply = "<h2 class='center red-text'><?=_('Error')?></h2><p class='center'><img class='feedback-submission-img' src='<?=$feedback?>error.png'><br><?="$sorry. $again"?>.</p>";
    $('#result_panel').html(reply).fadeIn('fast');
  }).always(function(){
    $('#spinner_image').fadeOut('fast');
    panel.fadeOut('fast').find('textarea').prop('disabled',false);
  });
}

$(function(){
  $('button.confirm').text("<?=_('Cancel')?>");
  if ($('#submit_button').length == 0) $('button.confirm').before('<input type="button" id="submit_button" value="<?=_('Submit')?>" disabled>');

  $('input[name=mode]').click(function(){
    var tab = '#'+$('input[name=mode]:checked').val();
    var panel = tab+'_panel';
    var enter = ['#troubleshoot'].includes(tab);
    var email = "<?=_('Contact Email Address')?> ("+"<?=_('required')?>"+")";
    $('.feedback-email-input').prop('placeholder',email).prop('required','true');
    $('#submit_button').prop('disabled',validInput($(tab)));
    $('.feedback-panel').not(panel).fadeOut('fast');
    $(panel).fadeIn('fast');
  });

  $('textarea').on('input change',function(){
    $('#submit_button').prop('disabled',validInput($(this)));
  });

  $('.feedback-email-input').on('input change',function(){
    var tab = '#'+$('input[name=mode]:checked').val();
    $('#submit_button').prop('disabled',validInput($(tab)));
  });

  $('#submit_button').click(function(){
    var url = 'https://keys.lime-technology.com/feedback/';
    var tab = '#'+$('input[name=mode]:checked').val();
    switch (tab) {
    case '#featurerequest':
      form_submit(url+'featurerequest',{},tab);
      break;
    case '#bugreport':
      form_submit(url+'bugreport',{},tab,1);
      break;
    case '#troubleshoot':
      // @todo - update this to use a new troubleshoot endpoint
      form_submit(url+'bugreport',{},tab,1);
      break;
    case '#comment':
      form_submit(url+'comment',{},tab);
      break;
    }
  });

  feedback_reset();
  $('#opt_featurerequest').click();
});
</script>
