var demoId;
var minInputs;
var maxInputs;
var currentDownloadId= -1;
var currentDetailsDownloadId= -1;
var currentResultDownloadId= -1;

$(document).ready(function() {
  demoId= $("#demoId").val();
  minInputs= $("#minInputs").val();
  maxInputs= $("#maxInputs").val();
  
  // activate accordions
  $("#demosList").accordion({
    autoHeight: false,
    active: ($("#demosList div:has(dl dt.activeDemo)").prevAll("div").size())
  });
  
  $("#demoInputs").removeAttr("class");
  $("#demoInputs>h3").removeAttr("class");
  $("#demoInputs>div").removeAttr("class");
  $("#demoInputs").accordion({
    autoHeight: false,
    collapsible: true
  });
  
  $("#demoPreviousResults").removeAttr("class");
  $("#demoPreviousResults>h3").removeAttr("class");
  $("#demoPreviousResults>div").removeAttr("class");
  $("#demoPreviousResults").accordion({
    autoHeight: false,
    collapsible: true
  });
  
  $("#demoParameters").removeAttr("class");
  $("#demoParameters>h3").removeAttr("class");
  $("#demoParameters>div").removeAttr("class");
  $("#demoParameters").accordion({
    autoHeight: false,
    collapsible: true
  });
  
  // IE6 accordion bug work around
  if ($.browser.msie && $.browser.version == 6) {
    $('#demosList>div').css('zoom', '1');
    $('#demoInputs>div').css('zoom', '1');
    $('#demoPreviousResults>div').css('zoom', '1');
    $('#demoParameters>div').css('zoom', '1');
  }
  
  var selectChange= function () {
    selectionChange(this);
  };
  
  // code for managing inputs
  var removeInputFunction= function(e) {
    e.preventDefault();
    
    if ($(this).hasClass("ui-state-disable")) {
    } else {
      // count number of inputs
      var inputCount= $("#inputsTable tr:has(td)").size();
      
      if (inputCount > minInputs) {
        $(this).parent().parent().remove();
        renameInputs();
        disableButtons();
      } else {
        alert("Thus input cannot be removed. This demo has a minimum of " + minInputs + " inputs.");
      }
    }
  };

  $(".downloadButton").live("click", downloadButton);
  $(".detailsDownloadButton").live("click", detailsDownloadButton);
  $(".resultDownloadButton").live("click", resultDownloadButton);
  $(".detailsButton:not(.ui-state-disable)").live("click", detailsButton);
  $(".errorTechnicalDetails").live("click", technicalDetailsShowHideButton)
  
  $("a.removeLink").click(removeInputFunction);
  $("#addButton").click(function(e) {
    e.preventDefault();
    if ($(this).hasClass("ui-state-disable")) {
    } else {
      // count number of inputs
      var inputCount= $("#inputsTable tr:has(td)").size();
      
      if (inputCount < maxInputs) {
        var newLine= $("#inputsTable tr:has(td):last-child").html();
        $("#inputsTable").append("<tr>" + newLine + "</tr>");
        $("#inputsTable tr:has(td):last-child .removeLink").click(removeInputFunction);
        $("#inputsTable tr:has(td):last-child td select option[selected]").removeAttr("selected");
        $("#inputsTable tr:has(td):last-child td select>option:first-child").attr("selected", "selected");
        $("#inputsTable tr:has(td):last-child td .inputSelector").live("change", selectChange).change();
        renameInputs();
        disableButtons();
      } else {
        alert("Another input cannot be added. This demo has a maximum of " + maxInputs + " inputs.");
      }
    }
  });
  
  // build upload component
  $("#uploadButton").click(function(e) {
    e.preventDefault();
    doUpload(-1);
  });
  
  // delete files
  var deleteFile= function(e) {
    e.preventDefault();
    
    if ($(this).hasClass("ui-state-disable")) {
    } else {
      doDelete(this);
    }
  };
  $(".deleteLink").live("click", deleteFile);
  
  $("#create_result").click(function (e) {
    e.preventDefault();
    // generate ajax request
    var demoData= new Object();
    var inputCounter= 0;
    demoData.demo= demoId;
    
    $("#inputsTable tr td .inputSelector").each(function() {
      if ($(this).val() != -1) {
        demoData["doc" + ++inputCounter]= $(this).val();
      }
    });
    
    $("#demoParameters .parameter:checkbox:checked").each(function() {
      demoData["param_" + $(this).attr("name")]= $(this).val();
    });
    
    $("#demoParameters .parameter:text").each(function() {
      demoData["param_" + $(this).attr("name")]= $(this).val();
    });
    
    if (inputCounter > maxInputs) {
      alert("This demo supports a maximum of " + maxInputs +" inputs, you have " + inputCounter);
      return;
    }
    if (inputCounter < minInputs) {
      alert("This demo requires a minimum of " + minInputs + " inputs, you only have " + inputCounter);
      return;
    }
    
    $.ajax({
      type: "GET",
      url: "/demo/start-demo.ajax",
      data: demoData,
      cache: false,
      success: function(html){
        $("#currentResultData").html(html);
        updateResults()
        checkResult();
      }
    });
  });
  
  $(".inputSelector").live("change", selectChange).change();
  
  disableButtons();
  
  updateInputs();
  updateResults();
});

function downloadButton(e) {
  e.preventDefault();
  
  previousDownloadId = currentDownloadId;
  currentDownloadId = $(this).parent().parent().prevAll(":has(td)").size();
  if (currentDownloadId == previousDownloadId) {
    currentDownloadId = -1;
    $(".downloadDropdown").hide();
  } else if($(this).hasClass("ui-state-disable")) {
    currentDownloadId = -1;
    $(".downloadDropdown").hide();
  } else {
    $("body").one("click",  function(e) {
      if (!$(e.target).hasClass("downloadButton")) {
        currentDownloadId = -1;
        $(".downloadDropdown").hide();
      }
    });
    $("#demoInputs").one("accordionchangestart",  function(e) {
      currentDownloadId = -1;
      $(".downloadDropdown").fadeOut(250);
    });
    
    var input= $(".inputSelector", $(this).parent().parent());
    var docId= input.val();
    var filename;
    if (input.get(0).tagName.toLowerCase() == "input") {
      fileName= input.parent().text();
    } else {
      fileName= $("option[selected]", $(this).parent().parent()).text();
    }
    
    var extPosition = fileName.lastIndexOf(".");
    if (extPosition != -1) {
      fileName= fileName.substring(0, extPosition);
    }
    fileName= fileName.replace(/ /g, "_")
    
    $(".downloadDropdown a.downloadLink").each(function() {
      $(this).attr("href", $("input", $(this).parent()).val().replace("$id", docId).replace("$filename", fileName));
    });

    $(".downloadDropdown").show();

    var left= $(this).offset().left;
    var top= $(this).parent().offset().top + $(this).parent().height();
    $(".downloadDropdown").offset({ top: top, left: left });
  }
}

function detailsDownloadButton(e) {
  e.preventDefault();
  
  previousDetailsDownloadId = currentDetailsDownloadId;
  currentDetailsDownloadId = $(this).parent().parent().prevAll(":has(td)").size();
  if (currentDetailsDownloadId == previousDetailsDownloadId) {
    currentDetailsDownloadId = -1;
    $(".detailsDownloadDropdown").hide();
  } else if($(this).hasClass("ui-state-disable")) {
    currentDetailsDownloadId = -1;
    $(".detailsDownloadDropdown").hide();
  } else {
    $("body").one("click",  function(e) {
      if (!$(e.target).hasClass("detailsDownloadButton")) {
        currentDetailsDownloadId = -1;
        $(".detailsDownloadDropdown").hide();
      }
    });
    
    $("#detailsDialog").parent().css("overflow", "visible");
    
    var input= $(".inputSelector", $(this).parent().parent());
    var docId= input.val();
    var filename;
    if (input.get(0).tagName.toLowerCase() == "input") {
      fileName= input.parent().text();
    } else {
      fileName= $("option[selected]", $(this).parent().parent()).text();
    }
    
    var extPosition = fileName.lastIndexOf(".");
    if (extPosition != -1) {
      fileName= fileName.substring(0, extPosition);
    }
    fileName= fileName.replace(/ /g, "_")
    
    $(".detailsDownloadDropdown a.downloadLink").each(function() {
      $(this).attr("href", $("input", $(this).parent()).val().replace("$id", docId).replace("$filename", fileName));
    });
    
    $(".detailsDownloadDropdown").show();

    var left= $(this).offset().left;
    var top= $(this).parent().offset().top + $(this).parent().height();
    $(".detailsDownloadDropdown").offset({ top: top, left: left });
  }
}

function resultDownloadButton(e) {
  e.preventDefault();
  
  previousResultDownloadId = currentResultDownloadId;
  currentResultDownloadId = $(this).parent().parent().prevAll(":has(td)").size();
  if (currentResultDownloadId == previousResultDownloadId) {
    currentResultDownloadId = -1;
    $(".resultDownloadDropdown").hide();
  } else if($(this).hasClass("ui-state-disable")) {
    currentResultDownloadId = -1;
    $(".resultDownloadDropdown").hide();
  } else {
    $("body").one("click",  function(e) {
      if (!$(e.target).hasClass("resultDownloadButton")) {
        currentResultDownloadId = -1;
        $(".resultDownloadDropdown").hide();
      }
    });
    $("#demoPreviousResults").one("accordionchangestart",  function(e) {
      currentResultDownloadId = -1;
      $(".resultDownloadDropdown").fadeOut(250);
    });

    var docId= this.id;
    var fileName= "deltaxml-result";
    
    $(".resultDownloadDropdown a.downloadLink").each(function() {
      $(this).attr("href", $("input", $(this).parent()).val().replace("$id", docId).replace("$filename", fileName));
    });
    
    $(".resultDownloadDropdown").show();

    var left= $(this).offset().left;
    var top= $(this).parent().offset().top + $(this).parent().height();
    $(".resultDownloadDropdown").offset({ top: top, left: left });
  }
}

function detailsButton(e) {
  e.preventDefault();
  
  $("#demoResultDetails").text("Loading details...");
  
  var id = $(".id", this).val();
  $("#detailsDialog").dialog({
    bgiframe: true,
    modal: true,
    width: 450,
    height: "auto",
    resizable: false,
    buttons: {
      "Close": function() {
        $(this).dialog("close");
      }
    },
    overlay: {
      backgroundColor: "#000",
      opacity: 0.5
    },
    zIndex:21000,
    autoOpen: false,
    title: "Result Details"
  });
  $("#detailsDialog").dialog("open");
  
  $.ajax({
    type: "GET",
    url: "/demo/resultDetails.ajax",
    data: {"demo": demoId,
           "jobId": $("input", $(this).parent()).val()},
    cache: false,
    success: function(html){
      $("#demoResultDetails").html(html);
    }
  });
}

function technicalDetailsShowHideButton(e) {
  e.preventDefault();
  
  errorTechnicalDetails= $("div.technicalDetails");
  if ($(this).text() == 'Show Technical Details') {
    errorTechnicalDetails.slideDown();
    $(this).text("Hide Technical Details");
  } else {
    errorTechnicalDetails.slideUp();
    $(this).text("Show Technical Details");
  }
}

function doUpload(targetId) {
  var uploadSummary= $(this).prev();
  var submitting= false;
  
  // when the upload response has been loaded, display
  $("#uploadArea").load(function(){
    var errorContent= $("#uploadArea").contents().find("div.error");
    var contentSpan= $("#uploadArea").contents().find("span");
    var contentSelect= $("#uploadArea").contents().find("select");

    if (errorContent.size() > 0) {
      $("#uploadStatus").hide();
      $("#uploadBox").show();
      alert("Upload failed: " + errorContent.text());
    } else if (contentSelect.size() > 0) {
      uploadSummary.html(contentSelect.html());
      var uploadedId= $("#uploadArea").contents().find("input").val();
      updateInputs(targetId, uploadedId);
      $("#uploadDialog").dialog("close");
    } else if (contentSpan.size() > 0) {
      $("#uploadStatus").hide();
      $("#uploadBox").show();
      alert("Unsuccessful: " + contentSpan.text());
    } else {
      $("#uploadStatus").hide();
      $("#uploadBox").show();
      alert("Unable to upload for an unknown reason, please try again later.");
    }
    submitting= false;
    this.src = "about:blank";
    $("#uploadForm").get(0).reset();
    $("#uploadArea").unbind("load");
  });
  
  $("#uploadStatus").hide();
  $("#uploadBox").show();
  
  $("#uploadDialog").dialog({
    bgiframe: true,
    title: "Upload a file",
    autoOpen: false,
    modal: true,
    resizable: false,
    overlay: {
      backgroundColor: "#000",
      opacity: 0.5
    },
    zIndex:21000,
    buttons: {
      Upload: function() {
        if (submitting) {
          // ignore
        } else if ($("#uploadBox input[name='upload']").val() == "") {
          alert("Please select a file to upload");
        } else {
          $("#uploadStatus").show();
          $("#uploadBox").hide();
          submitting= true;
          $("#uploadForm").submit();
        }
      },
      Cancel: function() {
        $(this).dialog("close");
      }
    },
    close: function() {
      $("#uploadBox").val("");
      submitting= false;
    }
  });
  $("#uploadDialog").dialog("open");
}

function doDelete(link) {
  var deleteUrl= "";
  if ($(link).parents("#inputsTable").size() > 0) {
    $.ajax({
      type: "GET",
      url: "/demo/deleteInput.ajax",
      data: {"demo": demoId,
             "document": $("td .inputSelector", $(link).parents("tr")).val()},
      cache: false,
      success: function(html){
        updateInputs();
      }
    });
    
  } else if ($(link).parents("#resultTable").size() > 0) {
    $.ajax({
      type: "GET",
      url: "/demo/deleteResult.ajax",
      data: {"demo": demoId,
             "jobId": $("input", $(link).parent()).val()},
      cache: false,
      success: function(xml){
        updateResults();
      }
    });
  }
}

function selectionChange(select) {
  if (select.tagName == "SELECT") {
    var docIdInput = $("td input.docId", $(select).parent().parent());
    var downloadButton= $("td a.downloadButton", $(select).parent().parent());
  /*  var downloadLink= $("td a.downloadLink", $(select).parent().parent());
    var htmlLink= $("td a.htmlLink", $(select).parent().parent());
    var pdfLink= $("td a.pdfLink", $(select).parent().parent());*/
    var deleteLink= $("td a.deleteLink", $(select).parent().parent());
    
    if ($(select).val() == "upload") {
      $("option[value='-1']", select).attr("selected", "selected");
      doUpload(($(select).parent().parent().prevAll().size() - 1));
    } else if ($(select).val() > 0) {
      docIdInput.val($(select).val());
      downloadButton.attr("href", "#");
      downloadButton.removeClass("ui-state-disable");
      downloadButton.addClass("ui-state-default");
      if ($("option[selected]", select).parent("optgroup[label='Demo Files']").size() == 0) {
        deleteLink.removeClass("ui-state-disable");
        deleteLink.addClass("ui-state-default");
        deleteLink.attr("href", "#");
      } else {
        deleteLink.addClass("ui-state-disable");
        deleteLink.removeClass("ui-state-default");
        deleteLink.removeAttr("href");
      }
    } else {
      downloadButton.addClass("ui-state-disable");
      downloadButton.removeClass("ui-state-default");
      downloadButton.removeAttr("href");
      
      deleteLink.removeAttr("href");
      deleteLink.addClass("ui-state-disable");
      deleteLink.removeClass("ui-state-default");
    }
  } else {
    var deleteLink= $("td a.deleteLink", $(select).parent().parent());
    deleteLink.removeAttr("href");
    deleteLink.addClass("ui-state-disable");;
    deleteLink.removeClass("ui-state-default");
  }
}

function checkResult() {
  
  $.ajax({
    type: "GET",
    url: "/demo/check-status.ajax",
    data: {jobId: $("#demoJobId").val()},
    cache: false,
    success: function(xml){
      var success= $("success", xml).text() == "true";
      var finished= $("finished", xml).text() == "true";
      var log= $("log", xml).text();
      var result= $("result result", xml).text();
      
      if (finished) {
        if (success) {
          $(".logLink").attr("href", "/demo/document/" + log + "/deltaxml-result.log");
          $(".odtResultLink").attr("href", "/demo/document/" + result + "/deltaxml-result.odt");
          $(".pdfResultLink").attr("href", "/demo/document/pdf/" + result + "/deltaxml-result.pdf");
          updateResults();
        } else {
          updateResults();
        }
      } else {
        setTimeout("checkResult()", 3000);
      }
    }
  });
}

function updateInputs(targetId, uploadedId) {
  $.ajax({
    type: "GET",
    url: "/demo/" + demoId + "/inputs.ajax",
    cache: false,
    dataType: "html",
    success: function(html){
      $("#inputsTable select").each(function() {

        var selected= $(this).val();

        var parent= $(this).parent();

        parent.html(html);

        var select= $("select", parent);
        
        if ((select.parent().parent().prevAll().size() - 1) == targetId) {
          select.val(uploadedId);
        } else {
          select.val(selected);
        }
        $("select", parent).change();
      });
    }
  });
}

function updateResults() {
  $.ajax({
    type: "GET",
    url: "/demo/" + demoId + "/results.ajax",
    cache: false,
    success: function(html){
      $("#demoPreviousResults div").html($("table,p", html));
    }
  });
}

function renameInputs() {
  var namingScheme= $("#namingScheme").val();
  
  $("#inputsTable tr td:first-child").each(function() {
    var inputNo= $(this).parent().prevAll(":has(td)").size();
    var docName= "";
    if (namingScheme == 'merge') {
      if (inputNo == 0) {
        docName= "Base Document";
      } else {
        docName= "Edit-" + inputNo + " Document";
      }
    } else if (namingScheme == 'numbered') {
      docName= "Version " + (inputNo + 1);
    }
    
    $(this).text(docName);
  });
  
  $("#inputsTable tr td select").each(function() {
    var inputNo= $(this).parent().parent().prevAll(":has(td)").size() + 1;
    $(this).attr("name", "input-" + inputNo);
    $(this).attr("id", "input-" + inputNo);
  });
}

function disableButtons() {
  var inputCount= $("#inputsTable tr:has(td)").size();
  var namingScheme= $("#namingScheme").val();
  
  if (inputCount <= minInputs) {
    $(".removeLink").addClass("ui-state-disable");
    $(".removeLink").removeClass("ui-state-default");
    $(".removeLink").removeAttr("href");
  } else {
    $(".removeLink").removeClass("ui-state-disable");
    $(".removeLink").addClass("ui-state-default");
    $(".removeLink").attr("href", "#");
  }
  
  if (inputCount >= maxInputs) {
    $("#addButton").addClass("ui-state-disable");
    $("#addButton").removeClass("ui-state-default");
    $("#addButton").removeAttr("href");
  } else {
    $("#addButton").removeClass("ui-state-disable");
    $("#addButton").addClass("ui-state-default");
    $("#addButton").attr("href", "#");
  }
  
  if (namingScheme == 'merge') {
    $("#inputsTable tr:has(td) .removeLink").eq(0).addClass("ui-state-disable");
    $("#inputsTable tr:has(td) .removeLink").eq(0).removeClass("ui-state-default");
    $("#inputsTable tr:has(td) .removeLink").eq(0).removeAttr("href");
  }
}

