"use strict";
var exaplayer = {
  player : null,
  track : null,
  highlighted : null,
  namedEntities : null,
  OCREntities : null,
  tagcloudLinks : null,
  spottedNamedEntities : $([]),
  duration : 0,
  currentTime : 0,
  noScroll : false,
  firstStart : true,
  keywordsTimeTag : [],
  timeLineUpdateNotifier  : null,
  colorNumber : 0,
  exaplayer : 0,

  seekTo : function seekTo(time) {
    if (time <= exaplayer.duration) {
      this.player.seek(time);
      this.currentTime = time;
      this.track.children(".over").trigger('timeUpdate');
    }
  },

  //subtitles

  highlightSubtitle : function(second) {
    var parent, fullOffset, selectors;
    if (this.highlighted !== null) {
      this.highlighted.removeClass("highlight");
    }

    selectors = $("#fulltext p span.sec"+second);
    if (selectors.size() >= 1) {
      this.highlighted = selectors.addClass("highlight");
      if (!exaplayer.noScroll){
        parent = this.highlighted.parent().parent().stop();
        fullOffset = (this.highlighted.offset().top + parent.scrollTop()) - parent.offset().top;
        parent.animate({scrollTop: fullOffset-30}, 350);
      }
    }
  },

  //keywords
  addKeywordsToTimeLine : function() {
    var keywords = $('div#fulltext span.segment strong');
    $(keywords).each(function() {
      var elm = $(this).closest(".segment");
      elm = $(this).parents(".segment");
      var time = exaplayer.getSecondBySection(elm);

      //make a nice sumary
      var prevElms = elm.prevAll(":not(:empty):lt(4)");
      var nextElms = elm.nextAll(":not(:empty):lt(4)");
      var text = "";
      var isStart = false;
      var isEnd = false;

      if (prevElms.size() <= 2) {
        isStart = true;
        nextElms = nextElms.filter(":lt(" + (4 - prevElms.size()) + ")");
      } else if(nextElms <= 2) {
        isEnd = true;
        prevElms = prevElms.filter(":lt(" + (4 - nextElms.size()) + ")");
      } else {
        prevElms = prevElms.filter(":lt(2)");
        nextElms = nextElms.filter(":lt(2)");
      }

      prevElms.each(function(){
        text = $(this).html() + " " + text;
      });
      text += elm.html();
      nextElms.each(function(){
        text += " " + $(this).html();
      });

      if(isStart) {
        text = text.charAt(0).toUpperCase() + text.substr(1);
      } else {
        text = "&hellip;" + text;
      }
      if (!isEnd) {
        text += "&hellip;";
      }

      exaplayer.addBullet(time, text);
      exaplayer.keywordsTimeTag[exaplayer.keywordsTimeTag.length] = time;
    });
  },

  seekToNextKeyword : function() {
    var keywordsCount = exaplayer.keywordsTimeTag.length;
    var i = 0;
    while (i < keywordsCount && exaplayer.keywordsTimeTag[i] < exaplayer.currentTime+1) {
      i++;
    }
    if (exaplayer.keywordsTimeTag[i] >= exaplayer.currentTime) {
      exaplayer.seekTo(exaplayer.keywordsTimeTag[i]);
    } else if (keywordsCount > 0) {
      exaplayer.seekTo(0);
    }
  },

  //Named Entities
  addNamedEntitiesToTimeLine : function() {
      exaplayer.spottedNamedEntities.each(function() {
        var elm = $(this);
        var segment = elm.parents(".segment");
        var time = exaplayer.getSecondBySection(segment);
        var text = elm.text();
        var className = "namedEnt";
        
        if (elm.hasClass("people")) {
          className += " people";
        } else if (elm.hasClass("location")) {
          className += " location";
        } else if (elm.hasClass("organization")) {
          className += " organization";
        }
        
        exaplayer.addBullet(time, text, className);
      });
  },

  removeTimeLineNamedEntities : function() {
    exaplayer.track.find("div.namedEnt").remove();
  },

  //tools
  getSecondBySection : function (section) {
    return parseInt( section.attr("className").replace(/([^0-9])/gi,""), 10);
  },

  getNewColor : function(a) {
    var r = (45+a*90) & 0xFF;
    var g = (180+a*135) & 0xFF;
    var b = (230+a*71) & 0xFF;
    var min = 60;
    if (r<min && g<min) {
      r += min;
      g += min;
    } else if (r<min && b<min) {
      r += min;
      b += min;
    } else if (g<min && b<min) {
      g += min;
      b += min;
    }
    return {
      'r' : r,
      'g' : g,
      'b' : b
    };
  },

  addBullet : function (time, text, className) {
    var bullet = $(document.createElement("div")).addClass("bullet");
    var tooltip = $(document.createElement("span")).html(text).addClass("bulle");
    if (className !== undefined) {
      bullet.addClass(className);
    }

    this.track.append(bullet);
    bullet.css("left", Math.round((time /this.duration * this.track.width()) - bullet.width() / 2) + "px");
    bullet.append(tooltip);

    bullet.click(function(){
      exaplayer.seekTo(time);
      exaplayer.highlightSubtitle(time);
    });
  },

  addVideoSegment : function (startTime, endTime, text, className) {
    var videoSegment = $(document.createElement("div")).addClass("segment");
    var color = exaplayer.getNewColor(exaplayer.colorNumber);
    var tooltip = $(document.createElement("span")).html(text).addClass("bulle");

    exaplayer.colorNumber++;
    videoSegment.css("backgroundColor" , "rgb("+color.r+","+color.g+","+color.b+")");

    this.track.append(videoSegment);
    videoSegment.css({
      "left" : Math.round(startTime / this.duration * this.track.width()) + "px",
      "right" : Math.round( (this.duration - endTime) /this.duration * this.track.width()) + "px"
    });
    videoSegment.append(tooltip);

    videoSegment.click(function(){
      exaplayer.seekTo(startTime);
    });
  }
};

$(function() {
  var timer = null;
  exaplayer.player = $f("exaplayer", {
    src:"media/flash/flowplayer-3.1.1.swf",
    wmode:"window"
  }, {
    clip:{
      scaling : 'fit',
      provider : 'voxalead_stream'
    },
    play: {
        label: 'Play',
        replayLabel: 'Replay'
    },
    plugins: {
        controls: null,
        voxalead_stream: {
          url : 'media/flash/flowplayer.pseudostreaming-3.1.2.swf'
        }
    }
  });

  $(document).keypress(function(event) {
    if (exaplayer.player.isLoaded()) {
      if (event.which === 32) {
        exaplayer.player.toggle();
        event.preventDefault();
      } else if (event.keyCode === 39) {
        exaplayer.seekToNextKeyword();
      }
    }
  });

  $("#q").keypress(function(event){
    event.stopPropagation();
  });

  $(".videoBox .radioLogo").click(function(){
    if (exaplayer.player.isLoaded()) {
      exaplayer.player.toggle();
    }
  });

  var formatTime = function(time) {
    var sec = time % 60;
    var min = Math.floor((time % 3600) / 60);
    var hour = Math.floor(time / 3600); var date = "";

    if(hour>0) {
      date = hour+":";
    }
    if(min<10) {
      date += "0";
    }
    date += min + ":";
    if(sec<10) {
      date += "0";
    }
    return date + sec;
  };

  var progress = $(document.createElement("div")).addClass("progress");
  var track = exaplayer.track = $(document.createElement("div")).addClass("track");
  var timeDisplay = $(document.createElement("div")).addClass("time").text("00:00");
  var totalTimeDisplay = $(document.createElement("div")).addClass("totaltime").text("00:00");
  var over = $(document.createElement("div")).addClass("over");
  var exaplayerUI = $(document.createElement("div")).addClass("exaplayerUI");

  var playerControls = $(document.createElement("div")).addClass("playerControls");

  var playPauseButton = $(document.createElement("div")).click(function(){
    if (exaplayer.player.isLoaded()) {
      exaplayer.player.toggle();
    } else {
      exaplayer.player.play();
    }
  }).attr("class","play").attr("title","Play/Pause").attr("alt","Play/Pause");

  var nextKeywordButton = $(document.createElement("div")).addClass("nextKeyword").attr("title","Seek to next keyword");
  nextKeywordButton.click(function() {
    exaplayer.seekToNextKeyword();
  });

  playerControls.append(playPauseButton);
  playerControls.append(nextKeywordButton);
  playerControls.append(timeDisplay);

  track.append(progress);
  track.append(over);

  exaplayerUI.append(playerControls);
  exaplayerUI.append(track);
  exaplayerUI.append(totalTimeDisplay);

  var onMouseMove = function(event) {
    progress.width(event.pageX - track.offset().left);
    event.stopPropagation();
  };

  var onTimeUpdate = function() {
    timeDisplay.text(formatTime(exaplayer.currentTime));
    progress.width(Math.round(exaplayer.currentTime/exaplayer.duration*track.width()));
  };

  var runTimer = function() {
    over.bind("timeUpdate", onTimeUpdate);
    timer = setInterval(function() {
      var newTime = Math.round( exaplayer.player.getTime() );
      if (newTime !== exaplayer.currentTime) {
        exaplayer.currentTime = newTime;
        exaplayer.highlightSubtitle(exaplayer.currentTime-1);
        over.trigger('timeUpdate');
      }
    }, 350);
  };

  over.mousedown(function(event){
    event.preventDefault();
    over.bind("mousemove",onMouseMove);
    over.unbind("timeUpdate",onTimeUpdate);
  });

  over.mouseup(function(event){
    var position = event.pageX - track.offset().left;
    over.bind("timeUpdate",onTimeUpdate);
    over.unbind("mousemove",onMouseMove);
    exaplayer.seekTo(Math.round(position/over.width()*exaplayer.duration));
    over.trigger('timeUpdate');    
  });

  exaplayer.player.onStop(function() {
    window.clearInterval(timer);
    playPauseButton.attr("class","pause");
  });

  exaplayer.player.onFinish(function() {
    window.clearInterval(timer);
    exaplayer.seekTo(0);
    playPauseButton.attr("class", "pause");
  });

  exaplayer.player.onPause(function() {
    window.clearInterval(timer);
    playPauseButton.attr("class", "pause");
  });

  exaplayer.player.onSeek(function() {
    over.trigger('timeUpdate');
  });

  exaplayer.player.onResume(function() {
    runTimer();
    playPauseButton.attr("class", "play");
  });

  exaplayer.player.onStart(function() {
    if (exaplayer.duration === 0) {
      exaplayer.duration = exaplayer.player.getClip().fullDuration || 0;
      totalTimeDisplay.text(formatTime(Math.round(exaplayer.duration)));
    }
    runTimer();

    if (exaplayer.firstStart) {
      exaplayer.addKeywordsToTimeLine();
      var startTime = 0;
      if ($("#startTime").val() !== undefined) {
        startTime = parseInt($("#startTime").val(), 10);
      } else {
        var firstSection = $('div#fulltext strong:first').parent();
        if (firstSection.size() > 0) {
          startTime = exaplayer.getSecondBySection(firstSection);
        }
      }
      exaplayer.seekTo(startTime);
      this.setVolume(100);
      exaplayer.firstStart = false;
      $.ajax({
        type: "GET",
        url: $("#segmentsFile").val(),
        success: function(msg){
         $(msg).find("Vidseg").each(function() {
           var videseg = $(this);
           exaplayer.addVideoSegment(Math.round(videseg.attr("stime")), Math.round(videseg.attr("etime")),videseg.attr("title"),videseg.attr("className"));
         });
        }
      });
    }
  });

  var previousSec = function(elm) {
    //@TODO can be usefull 1 day
    if (elm.prev().size()>=1) {
      return elm.prev();
    } else {
    return elm.parent().prev().children(":last-child");
    }
  };

  $("#exaplayer").after(exaplayerUI);

  var fullText = $("#fulltext");

  var resizeFulltext = function() {
  //adapt full text height
    var height = $(window).height() - fullText.offset().top - $('#Footer').outerHeight(true) - 2;
    if (height < 200) {
        height = 200;
    }
    fullText.height(height);
  };

  $(window).resize(resizeFulltext);
  resizeFulltext();

  fullText.hover(function(){
    exaplayer.noScroll = true;
  }, function(){
    exaplayer.noScroll = false;
  });

  fullText.click(function(event) {
    event.stopPropagation();
    var section = $(event.target);
    if (section.is("div#fulltext")) {
      exaplayer.player.toggle();
    }
    else if (section.is(".location,.people,.organization")) {
      spotThisNamedEntity(event);      
    }
    else {
      var time = exaplayer.getSecondBySection(section);
      exaplayer.seekTo(time);
      exaplayer.highlightSubtitle(time);
      
      // Edit mode behavior
      if(fullText.hasClass("editMode")){
        exaplayer.player.pause(); // pause
        $("#fulltext .segment.edition").removeClass("edition");
        section.addClass("edition");
      }
    }
  });

  var spotThisNamedEntity = function(event) {
    event.preventDefault();
    event.stopPropagation();
    var currentClickedObject = $(event.target);
    if (currentClickedObject.is(".location,.people,.organization")) {
      var wordToSpot = currentClickedObject.text();
      exaplayer.spottedNamedEntities.removeClass("spotted");
      exaplayer.tagcloudLinks.removeClass("selected");
      exaplayer.spottedNamedEntities = exaplayer.namedEntities.filter(":contains("+wordToSpot+")").addClass("spotted");
      exaplayer.tagcloudLinks.filter(":contains("+wordToSpot+")").each(function(){
        if ($(this).text().length === wordToSpot.length) {
          $(this).addClass("selected");
        }
      });

      exaplayer.removeTimeLineNamedEntities();
      exaplayer.addNamedEntitiesToTimeLine();

      var firstChild = exaplayer.track.children(".namedEnt:first");
      if (firstChild.size() > 0) {
        var body = $("body");
        var effect = currentClickedObject.clone();
        body.append(effect.css({
          position : 'absolute',
          top : currentClickedObject.offset().top - parseInt(body.css("margin-top"), 10),
          left : currentClickedObject.offset().left
        }).addClass("selectedTag "+currentClickedObject.attr("className")));
        var firstChildPosition = firstChild.click().offset();
        effect.animate({
           top: firstChildPosition.top - parseInt(body.css("margin-top"), 10),
           left: firstChildPosition.left
        }, 750, function() {
          $(this).fadeOut(200, function(){
            $(this).remove();
          });
        });
      }
    }
  };
  exaplayer.namedEntities = $('div#fulltext span.location, div#fulltext span.people, div#fulltext span.organization');
  exaplayer.tagcloudLinks = $("div.tagCloud ul.tags a");
  $(exaplayer.tagcloudLinks[0]).parent().parent().click(spotThisNamedEntity);
});

// EDIT MODE
$("#fulltext.editMode").append("<span class='segment sizeOf' style='visibility:hidden; text-indent: -10000px'></span>");
var sizeOf = $("#fulltext.editMode span.segment.sizeOf");


if($("#fulltext").hasClass("editMode")){
  // remove former edition class
  $(document.body).click(function(){
    $("#fulltext .segment.edition").removeClass("edition");
  });

  window.onbeforeunload = function() {
    if($("#fulltext.editMode .segment.corrected").length > 0 ){
      if(confirm("You have unsaved changes to this document. Do you want to save them ?")){
        submitEditedText();
      }
    }
  };
}


$("#fulltext.editMode span.segment").each(function(){
  var originalWidth = this.offsetWidth;
  var segment = this;
  // add Form
  $(this).append("<input type='text'/>");
  var input = $("input", this)[0];

  // allow for spaces
  $(input).keypress(function(event){
    event.stopPropagation();
  });

  $(input).keyup(function(event){
    event.stopPropagation();
    // duplicate text and style in an invisible span and set its width to the input form
    sizeOf.html(this.value);
    var newWidth = sizeOf[0].offsetWidth+6;
    $(this).css("width",  newWidth + "px");
    if(newWidth > originalWidth){
      $(segment).css("paddingRight", newWidth - originalWidth + "px");
    } else {
      $(segment).css("paddingRight", 0);
    }
  });

  input.name = this.className.replace("segment sec", "");
  input.setAttribute("value", $(this).text());
});


$("#fulltext.editMode input").bind("keypress", function(evt){
  var input = $(evt.currentTarget);
  input.parent().addClass("corrected");
});


function getUrlParameter(name) {
  name = name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);
  if (results === null) {
    return ("");
  }
  return (results[1]);
}



function submitEditedText()
{
    var jsonData = [];
    try
    {
        var values = {};
        $("#fulltext.editMode p").each(function (index)
        {
            var paragraphData = [];
            $("input", this).each(function()
            {
                var tmp = {};
                tmp[this.name] = this.value;
                var segment = $($(this).parent());

                if (segment.hasClass("corrected"))
                {
                    segment.removeClass("corrected");
                    segment.removeClass("edition");
                    segment.addClass("fixed");
                    segment.css("paddingRight", "");
                    segment.text(this.value);
                    segment.append(this);
                }

                paragraphData.push(tmp);
            });

            jsonData.push(paragraphData);
        });

        // add key
        values['videoFile'] = getUrlParameter("flv");
        values['data'] = $.toJSON(jsonData);
        $.post("edit.php", values);
    }
    catch (e)
    {
      console.error(e);
    }

    // TODO feedback
    return (false);
}

// TODO prevent user from leaving pages with uncommited changes
$("button.correct").bind("click", function()
{
    submitEditedText();
    var url = location.href;
    setTimeout(function ()
         {
            alert("file has been updated");
            var test = "q="+getUrlParameter("q")+"&";
            var newurl = url.replace(test,"q=\"\"&");
            window.location=newurl.replace("play-edit.php","play.php");
            window.reload();
         },10000);
});
