webpage source preview script

var pageName = "";
var url = "";
var decodedUrl = "";
var userId = "";
var company = "";
var topic = "";
var encodedCompany = "";
var encodedTopic = "";
var encodedUrl = "";
var loadingImageUrl = "https://wikirate-production-storage.fra1.cdn.digitaloceanspaces.com/files/20531/12604360-large.gif";
var markedIrrelevant = false;
function escapeHtml(string) {
  return String(string).replace(/[&<>"'\/]/g, function(s) {
    return entityMap[s];
  });
}

function unescapeHtml(string) {
  return $("<div/>").html(string).text();
}

function testSameOrigin(testUrl) {
  $.getJSON("Source.json?view=check_iframable&url=" + testUrl, function(data) {
    if (!data.result) { //remove iframe and show redirection message
      $('#webpage-preview').html("");
       $redirectNotice = $("<div>", {
        "class": "redirect-notice"
      });
      if(pageName==="")
      {
        //from certh
      }else
      {
        //locally
        //Page_000001545?view=content&slot[structure]=source%20item%20preview
        $.ajax("/"+pageName+"?view=content&slot[structure]=source%20item%20preview")
        .done(function(noteFormHtml) {
          $redirectNotice.append(noteFormHtml);
          $redirectNotice.trigger('slotReady');
        })
        .fail(function(xhr, ajaxOptions, thrownError) {
          var html = $(xhr.responseText);
          html.find('.card-header').remove();
          $redirectNotice.append(html);
        });
      }
      $('#webpage-preview').append($redirectNotice);
      $('#webpage-preview').addClass("non-previewable");
    }
  });

}
function getPopup(popupId)
{
  var $popupWindow = $('#'+popupId);
  if($popupWindow.length===0){
    $("#main").prepend('<div id="'+popupId+'" style="display:none;"></div>');//create one
    $popupWindow = $('#'+popupId);
  }
  return $popupWindow;
}
function enableMakeNoteButton() {
  $("#make-a-note-button").removeAttr("disabled");
}
//=====for note ====
var makeNoteButtonOnClicked = function() {
  var $img = $('<img id="make_note_loading_image_div">'); //Equivalent: $(document.createElement('img'))
  $img.attr('src', loadingImageUrl);

  $popupWindow = getPopup("note-form");

  $makeNoteButton = $(this);
  $makeNoteButton.attr("disabled", "disabled");

  //show loading dialog
  if($popupWindow.html().trim().length===0)
  {
    $popupWindow.html($img);
    //create the source, get the html in source preview structure
    if(pageName === "")
    {
      sendFeedback("relevant", function() {
        createSource(sourceCreatedWithHtml, sourceCreatedFailCallback);
      }, function(xhr, ajaxOptions, thrownError) {
        if (xhr.responseText == "Permission Denied") {
          showPermissionDenial("note-form");
        } else {
          showErrorMsg(xhr.responseText);
        }
        enableMakeNoteButton();
      });
    }else
    {
      getSource(pageName,sourceCreatedWithHtml, sourceCreatedFailCallback);
    }

  }
  $popupWindow.dialog({
    height: 'auto',
    minWidth: 500,
    position: {
      of: $(".navbar"),
      my: "right top",
      at: "right bottom",
      collision: "none none"
    },
    title: '<i class="fa fa-arrows"></i>',
    closeOnEscape: false,
    resizable: false
  });
}
function handleSourceHtmlAndNewNoteHtml(sourceHtml, newNoteFormHtml) {


  var _sourceHtml = $(sourceHtml);

  var html = $(newNoteFormHtml);

  var $noteForm = $('#note-form');
  $noteForm.html(newNoteFormHtml);
  $noteForm.find('.card-header').remove();
  $noteForm.find('form:first').find('.create-cancel-button:first').on('click', function() {
    $noteForm.empty();
    $noteForm.dialog("close");
  });
  $noteForm.prepend(_sourceHtml);
  if($("#source-name").html().trim().length===0)
    $noteForm.prepend("<span>Source added.</span>");

  //handle comapny and topic name
  if ($('.RIGHT-company select option[value="' + unescapeHtml(decodeURIComponent(company)) + '"]').length === 0) { //add company to select
    $companySelect = $('.RIGHT-company select');
    $companySelect.append('<option selected >' + decodeURIComponent(decodeURIComponent(company)) + '</option>');
    $companySelect.trigger("chosen:updated");

  }
  if ($('.RIGHT-topic select option[value="' + unescapeHtml(decodeURIComponent(topic)) + '"]').length === 0) { //add company to select
    $topicSelect = $('.RIGHT-topic select');
    $topicSelect.append('<option selected >' + decodeURIComponent(decodeURIComponent(topic)) + '</option>');
    $topicSelect.trigger("chosen:updated");
  }
  wagn.initializeEditors($noteForm.find(".new-view:first"));
  $('<input class="card-content" id="card_subcards__Source_content" name="card[subcards][+Source][content]" value="' + pageName + '" type="hidden" />')
    .insertAfter("#card_type_id");

}
var sourceCreatedFailCallback = function(xhr, ajaxOptions, thrownError) {
  var html = $(xhr.responseText);
  html.find('.card-header').remove();
  $('#note-form').html(html);
  $('#note-form').find('div:first').trigger('slotReady');
  enableMakeNoteButton();
};

function createSource(callback, failCallback) {
  var url = "/card/create?";
  url += "success[view]=content";
  url += "&slot[structure]=source+preview";
  url += "&sourcebox=true";
  url += "&card[type_code]=source";
  url += "&card[subcards][" + encodeURIComponent("+") + "Link][content]=" + encodedUrl;
  if (!markedIrrelevant) {
    url += "&card[subcards][" + encodeURIComponent("+") + "Company][content]=" + encodedCompany;
    url += "&card[subcards][" + encodeURIComponent("+") + "Topic][content]=" + encodedTopic;
  }
  var jqxhr = $.ajax(url)
    .done(callback)
    .fail(function(xhr, ajaxOptions, thrownError) {
      if (failCallback)
        failCallback(xhr, ajaxOptions, thrownError);
    });
}

function getSource(pageName,callback, failCallback) {
  var url = pageName;
  url += "?view=content";
  url += "&slot[structure]=source+preview";

  var jqxhr = $.ajax(url)
    .done(callback)
    .fail(function(xhr, ajaxOptions, thrownError) {
      if (failCallback)
        failCallback(xhr, ajaxOptions, thrownError);
    });
}

var sourceCreatedWithHtml = function(data) {
  //get the note form html

  var sourceHtml = data;
  $.ajax("/new/Note?view=new&main=note&slot[structure]=note_source_preview&is_main=true&slot%5Bhome_view%5D=open&slot%5Binc_name%5D=_main&slot%5Binc_syntax%5D=_main" + (!markedIrrelevant ? ("&_Companies=" + encodedCompany + "&_Topics=" + encodedTopic) : ""))
    .done(function(noteFormHtml) {
      gotNewNoteHtml(sourceHtml, noteFormHtml);
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
      var html = $(xhr.responseText);
      html.find('.card-header').remove();
      $('#note-form').html(html);
      $('#note-form').find('div:first').trigger('slotReady');
      enableMakeNoteButton();
    });

};
var gotNewNoteHtml = function(sourceHtml, newNoteFormHtml) {

  //show the source and new note form
  //override the note form buttons
  //override the cancel button on click event to dismiss the dialogue only
  var pageNumer = sourceHtml.match(/data-card-name="Page-(\d+)"/)[1];
  pageName = "Page-" + pageNumer;
  if (!markedIrrelevant)
  {
    reloadTopBarAsExisitingSource(sourceHtml,newNoteFormHtml);
    $("#company-and-topic-detail-link").show();
  }

};

function refreshNoteNumber(pageName) {
  var jqxhr = $.ajax("/" + pageName + decodeURIComponent("+") + "note count?view=core")
    .done(function(data) {
      if (data > 0) {
        $("#note-count-number").html(data);
        $('#note-count').show();
        $('.show-link-in-popup').each(function(){
          $(this).off("click").click(linkOnClick);
        });
      }
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
    });
}
var reloadTopBarAsExisitingSource = function(sourceHtml,newNoteFormHtml) {
  var url = pageName+"?view=preview_options"

  var jqxhr = $.ajax(url)
    .done(function(data) {
      $('.menu-options:first').replaceWith(data);
      rebindAllOnClickListener();
      handleSourceHtmlAndNewNoteHtml(sourceHtml, newNoteFormHtml);
      $('#note-form').find('div:first').trigger('slotReady');
      $('#note-form').find('.TYPE-note:first').trigger('slotReady');
      existingSource = true;
      $('#note-form').find('form:first').on('ajax:success', function(_event, data, xhr) {
        if (!markedIrrelevant)
          refreshNoteNumber(pageName);
        //remove the note
        //show success
        var $html = $(data);


        $('.card-slot.new-view.card-frame.ALL.TYPE-note:first').remove();
        var $noteSuccess = $("<div id='note-success'></div>");
        $noteSuccess.append("<span>Success! Thanks for making a note.</span>");
        $noteSuccess.append("<a target='_blank' href='/" + $html.attr('id') + "'>Visit the note.</a>");
        $noteSuccess.append("<a id='keep-reading' href='#'>Keep Reading.</a>");
        $('#note-form').append($noteSuccess);

        $('#keep-reading').click(function() {
          $('#note-form').dialog("close");
        });
        return true;
      });

      enableMakeNoteButton();
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
      showErrorMsg(xhr.responseText);
    });
};
var createNote = function(pageName) {

  $('<input class="card-content" id="card_subcards__Source_content" name="card[subcards][+Source][content]" value="' + pageName + '" type="hidden" />')
    .insertAfter("#card_type_id");
  $_form = $('#note-form').find('form:first');
  $_form.setContentFieldsFromMap();
  var result = "";
  var url = "/card/create/";
  $.ajax({
      type: "POST",
      url: url,
      data: $_form.serialize()
    })
    .done(function(data) {
      $('#note-form').empty();
      if (!markedIrrelevant)
        refreshNoteNumber(pageName);
      $('#note-form').dialog("close");
    }).fail(function() {

      $_submitButton = $_form.find('.create-submit-button:first');
      $_submitButton.removeAttr("disabled");
      $_submitButton.html("Submit");

    });
};
//=====for irrelevant
function prepareForAfterIrrelevantFeedback() {
  $('#irrelevant-options').dialog("close");
  var $img = $('<img id="feedback_loading_image_div">'); //Equivalent: $(document.createElement('img'))
  $img.attr('src', loadingImageUrl);

  var $feedbackOptions = getPopup('after-irrelevant-options');
  $feedbackOptions.html($img);
  $feedbackOptions.css('maxHeight', $(window).height() - $('#logo-bar').height());
  $feedbackOptions.dialog({
    height: 'auto',
    width: '400',

    position: {
      of: $("#logo-bar"),
      my: "right top",
      at: "right bottom",
      collision: "none none"
    },
    title: '<i class="fa fa-arrows"></i>',
    closeOnEscape: false,
    resizable: false
  });
}
var irrelevantClicked = function() {
  //update the name of buttons
  markedIrrelevant = true;




  var $irrelevantDialog = getPopup('irrelevant-options');
  $irrelevantDialog.html('<span>This source is not related to:</span> \
    <br /> \
    <div id="company-irrelevant" class="button-primary  button-secondary"> \
      <a href="#" id="company-irrelevant-button">Company</a> \
    </div> \
    <div id="topic-irrelevant" class="button-primary  button-secondary"> \
      <a href="#" id="topic-irrelevant-button">Topic</a> \
    </div> \
 \
    <div id="either-irrelevant" class="button-primary  button-secondary"> \
      <a href="#" id="either-irrelevant-button">Either</a> \
    </div>');
  $('#company-irrelevant-button').html(company);
  $('#topic-irrelevant-button').html(topic);
  //bind the click events
  $('#company-irrelevant-button').click(function() {
    prepareForAfterIrrelevantFeedback();
    sendFeedback("company", afterSendingIrrelevantFeedback, sendingIrrelevantFeedbackFailCallback);

  });
  $('#topic-irrelevant-button').click(function() {
    prepareForAfterIrrelevantFeedback();
    sendFeedback("topic", afterSendingIrrelevantFeedback, sendingIrrelevantFeedbackFailCallback);
  });
  $('#either-irrelevant-button').click(function() {
    prepareForAfterIrrelevantFeedback();
    sendFeedback("either", afterSendingIrrelevantFeedback, sendingIrrelevantFeedbackFailCallback);
  });
  $irrelevantDialog.dialog({
    height: 'auto',
    width: '300',
    position: {
      of: $("#logo-bar"),
      my: "right top",
      at: "right bottom",
      collision: "none none"
    },
    title: '<i class="fa fa-arrows"></i>',
    closeOnEscape: false,
    resizable: false
  });
  return false;
}

var sendingIrrelevantFeedbackFailCallback = function(xhr, ajaxOptions, thrownError) {

  if (xhr.responseText == "Permission Denied")
    showPermissionDenial("after-irrelevant-options");
  else {
    showErrorMsg(xhr.responseText);
  }
}
var afterSendingIrrelevantFeedback = function() {
  $('#irrelevant-options').dialog("close");
  var $irrelevantButton = $('#mark-irrelevant-button');
  $irrelevantButton.find("span:first").html("Marked irrelevant");
  $irrelevantButton.replaceWith($irrelevantButton.html());
  $('#mark-irrelevant').attr('disabled', 'disabled');
  $('#mark-irrelevant').css("pointer-events", "none");
  $('#mark-irrelevant').css("cursor", "default");
  $('#mark-relevant').hide();


  var $afterIrrelevantOption = $('#after-irrelevant-options');
  var noteButtonHtml = $('#make-note').html();
  var $noteButton = $('<button class="create-submit-button" id="make-note-after-irrelevant" name="button">Make a note</button>');
  $afterIrrelevantOption.html($noteButton);
  $noteButton = $('#make-note-after-irrelevant');
  $afterIrrelevantOption.prepend("<br /><span>You can still make a cliam on this source:</span><br />");
  // $afterIrrelevantOption.append("<br /><span>Try other sources:</span><br />");
  // $afterIrrelevantOption.append("<img id='loading_gif' src='https://wikirate-production-storage.fra1.cdn.digitaloceanspaces.com/files/20531/12604360-medium.gif' />");

  $noteButton.click(function() {
    makeNoteButtonOnClicked();
    $('#after-irrelevant-options').dialog("close");
  });

  //refer to suggested source script
  //addSuggestedSource($afterIrrelevantOption, userId, company, topic);

}
function sendFeedback(type, successCallback, failcallback) {

  var jqxhr = $.ajax("/Source.json?view=feedback&url=" + encodedUrl + "&company=" + encodedCompany + "&topic=" + encodedTopic + "&type=" + type)
    .done(function(data) {
      if (successCallback)
        successCallback();
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
      // console.log("Fail to send feedback");
      if (failcallback)
        failcallback(xhr, ajaxOptions, thrownError);
    });
}
var showPermissionDenial = function(elementId) {
  var jqxhr = $.ajax("/"+pageName+"?view=denial")
    .done(function(data) {
      //not possible i guess
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
      var $elementToShowPermissionDenial = $('#' + elementId);
      $denialHtml = $(xhr.responseText);
      $denialHtml.find('.card-header').remove();
      $elementToShowPermissionDenial.html($denialHtml);

    });
}
//=====for company and topic detail
var comapnyAndTopicDetailLinkClicked = function(event) {
  event.preventDefault();
  var img = $('<img id="company_and_topic_detail_loading_image_div">'); //Equivalent: $(document.createElement('img'))
  img.attr('src', loadingImageUrl);



  var $popupWindow = getPopup("company-and-topic-detail");

  $popupWindow.html(img);
  $popupWindow.dialog({
    height: 'auto',
    minWidth: 500,
    position: {
      of: $("#company-and-topic"),
      my: "center top",
      at: "center bottom",
      collision: "none none"
    },
    title: '<i class="fa fa-arrows"></i>',
    closeOnEscape: false,
    resizable: false
  });

  $.ajax($("#company-and-topic-detail-link").attr("href"))
    .done(companyAndTopicHtmlGot)
    .fail(companyAndTopicHtmlErrorGot);
}
var companyAndTopicHtmlErrorGot = function(xhr, ajaxOptions, thrownError) {
  var html = $(xhr.responseText);
  html.find('.card-header').remove();
  $('#company-and-topic-detail').html(html);
  $("#company-and-topic-detail").find("div:first").trigger('slotReady');
}
var companyAndTopicHtmlGot = function(_html) {
  var html = $(_html);
  html.find('.card-header').remove();
  var $companyAndTopicDetail = $("#company-and-topic-detail");
  $companyAndTopicDetail.html(html);
  $companyAndTopicDetail.find('.cancel-button:first').on('click', function() {

  $companyAndTopicDetail.empty();
  $companyAndTopicDetail.dialog("close");

  });

  $companyAndTopicDetail.find('form:first').on('ajax:success', function(data, c, d) {
    $companyAndTopicDetail.empty();
    refreshCompanyAndTopic();
    $companyAndTopicDetail.dialog("close");
    return true;
  });

  $companyAndTopicDetail.find("div:first").trigger('slotReady');

}
function refreshCompanyAndTopic(){
  var jqxhr = $.ajax("/"+pageName+"?view=company_and_topic_detail")
    .done(function(data) {
      $('#company-and-topic').replaceWith(data);
      $("#add-company-link").click(comapnyAndTopicDetailLinkClicked);
      $("#add-topic-link").click(comapnyAndTopicDetailLinkClicked);
      $("#company-and-topic-detail-link").click(comapnyAndTopicDetailLinkClicked);
    })
    .fail(function(xhr, ajaxOptions, thrownError) {
      showErrorMsg(xhr.responseText);
    });
}
function rebindAllOnClickListener(){

  $("#add-company-link").off("click").click(comapnyAndTopicDetailLinkClicked);
  $("#add-topic-link").off("click").click(comapnyAndTopicDetailLinkClicked);
  $("#company-and-topic-detail-link").off("click").click(comapnyAndTopicDetailLinkClicked);
  $('#mark-irrelevant-button').off("click").click(irrelevantClicked);
  $("#make-a-note-button").off("click").click(makeNoteButtonOnClicked);
  $("#mark-relevant-button").off("click").click(makeNoteButtonOnClicked);
  $('.show-link-in-popup').each(function(){
    $(this).off("click").click(linkOnClick);
  });
}

function resizeIframe() {
  $(".webpage-preview").height($(window).height() - $('.navbar').height()-1);
  //$(".webpage-preview").css('margin-top',$('.navbar').height()+1);
}
$(document).ready(function() {

  if($("body").attr("id")=="source-preview-page-layout"){
    $('[data-toggle="source_preview_tab_ajax"]').click(function(e) {
      var $this = $(this),
          loadurl = $this.attr('href'),
          targ = $this.attr('data-target');
      if (undefined != loadurl){
          $.get(loadurl, function(data) {
              $(targ).html(data);
          });
      }

      $this.tab('show');
      return false;
    });

    $("#logo-bar").dblclick(function() {
      return false;
    });

    pageName = $("#source-name").html();
    userId = $("#user-id").html();
    url = $("#source_url").html();
    company = $("#source_company").html();
    topic = $("#source_topic").html();

    encodedUrl = encodeURIComponent(url);
    encodedCompany = encodeURIComponent(company);
    encodedTopic = encodeURIComponent(topic);

    if (url) {
      testSameOrigin(url);
      decodedUrl = decodeURIComponent(url);
    }

    rebindAllOnClickListener();
    resizeIframe();
    // $('.show-link-in-popup').each(function(){
    //   $(this).off("click").click(linkOnClick);
    // });
    $(window).resize(function() {
      resizeIframe();
    });
  }

});