/**
 * dynamics.js
 * 
 * Javascript wonerfulness for OneTimeline search
 * 
 * Copyright 2011-2012 Howe Software, Inc.
 */



jQuery(document).ready(function(){
  //event handlers
  $('#search-button').click(doSearch);
  $('#search-input').keydown(function(e) {
    if(e.keyCode == 13){
      doSearch(e);
    }
  });
  $('#add-search-button').click(addSearch);
  $('#add-search-input').keydown(function(e) {
    if(e.keyCode == 13) {
      addSearch(e);
    }
  });
  $('#show-search-button').click(showSearch);
  
  $('#toggle-advanced-search').click(toggleAdvancedSearch);
  
  
  $(window).resize(resizeHandler);
  
  // set up the search dialog
  $('#add-search-form-container').dialog({autoOpen:false, width:400, modal:true, title:"Add a search..."});
  $.fn.tpl("loadTemplates", "tpl/templates.html");
  
  resizeHandler();
  checkLogin(updateAdminTools);
  
  // check for a search in the query string
  var search = document.location.search;
  // chop off the ?
  search = search.substring(1);
  var pars = search.split("&");
  for(i in pars){
    var kv = pars[i].split('=');
    var val = unescape(kv[1].replace(/\+/g, " "));
    switch(kv[0]){
      case 'tag':
        $('#search-input').val(val);
        doSearch(null);
      break;
    }
  }
});

var sets = [];
var allEvents = {};
var loggedIn = false;

function resizeHandler(e) {
  // top bar height = 74px
  // result container top padding = 10px
  var winHeight = $(window).height();
  $('.event-set .inner').height(winHeight - 184);
  $('.event-set').width($('body').width() / sets.length - 2);
}

function doSearch(e) {
  // the first search executed from the home display
  // detect a simple or advanced search
  if($("#search-form").hasClass("simple")){
    var term = $('#search-input').val();
    var data = {req:"search", query:term};
    apiCall(data, function(d){
      addSet(d, term);
    });
  }
  else {
    var term = '';
    var person = $('#search-input-person').val(); 
    if( person.length > 0 ) {
      term += ':'+person;
    }
    if( term.length > 0 ) {
      term += ";";
    }
    var place = $('#search-input-place').val();
    if( place.length > 0 ) {
      term += '@'+place;
    }
    if( term.length > 0 ) {
      term += ';';
    }
    var category = $('#search-input-category').val();
    if( category.length > 0 ){
      term += '#'+category;
    }
    var data = {req:"search", advQuery:term};
    if( $('#search-input-start-date').val() != '' ){
      data.rangestart = $('#search-input-start-date').val();
    }
    if( $('#search-input-end-date').val() != ''){
      data.rangeend = $('#search-input-end-date').val();
    }
    apiCall(data, function(d){
      addSet(d, term);
    });
  }
  $('#home-search-container').fadeOut("fast");
  $('#add-search-container').fadeIn("fast");
  $('#show-search-container').fadeIn("fast");
  $('#topbar').fadeIn("fast");
  
}

function addSearch(e) {
  $('#add-search-form-container').dialog('close');
  var term = $('#add-search-input').val();
  var data = {req:"search", query:term};
  apiCall(data, function(d){
    addSet(d, term);
  });
}

function toggleAdvancedSearch(e) {
  $('#toggle-advanced-search').unbind("click");
  $('#search-button').unbind("click");
  $('#search-form-wrapper').html($.fn.tpl("getTemplate", "advanced_search"));
  $('#toggle-simple-search').click(toggleSimpleSearch);
  $('#search-button').click(doSearch);
}

function toggleSimpleSearch(e) {
  $('#toggle-simple-search').unbind("click");
  $('#search-button').unbind('click');
  $('#search-form-wrapper').html($.fn.tpl("getTemplate", "simple_search"));
  $('#toggle-advanced-search').click(toggleAdvancedSearch);
  $('#search-button').click(doSearch);
}

function showSearch(e) {
  $('#add-search-form-container').dialog('open');
}

function apiCall(data, callback) {
  $.get("/api/", data, callback, "json");
}

function addSet(events, query) {
  // turn events into OTLEvent Objects
  var set = {};
  var setEvents = [];
  for(i in events) {
    var tss = new Timestamp();
    tss.setYear(events[i].started[0]);
    tss.setMonth(events[i].started[1]);
    tss.setDay(events[i].started[2]);
    tss.setHour(events[i].started[3]);
    tss.setMinute(events[i].started[4]);
    tss.setSecond(events[i].started[5]);
    var tse = false;
    if(events[i].ended) {
      tse = new Timestamp();
      tse.setYear(events[i].ended[0]);
      tse.setMonth(events[i].ended[1]);
      tse.setDay(events[i].ended[2]);
      tse.setHour(events[i].ended[3]);
      tse.setMinute(events[i].ended[4]);
      tse.setSecond(events[i].ended[5]);
    }
    var evt = new OTlEvent(events[i].title, tss, events[i].id);
    evt.setDescription(events[i].description);
    evt.setProminence(events[i].prominence);
    evt.setId(events[i].id);
    evt.setReferences(events[i].references);
    for(j in events[i].tags) {
      evt.addTag(events[i].tags[j]);
    }
    //add the event into the event set as well as the master events object
    setEvents.push(evt);
    allEvents[evt.id] = evt;
  }
  set.events = setEvents;
  var setIndex = sets.length;
  set.index = setIndex;
  set.query = query;
  sets.push(set);
  drawSet(setIndex);
}

function drawSet(index) {
  var set = sets[index];
  var newSet = $.fn.tpl("getTemplate", "event_set");
  newSet.css("display", "none")
  $('#result-container').append(newSet);
  newSet.fadeIn("slow");
  
  newSet.addClass("setid-"+index);
  for(i in set.events) {
    drawEvent(index, set.events[i]);
  }
  if(set.events.length == 0){
    $('.inner', newSet).append('<div class="title">No Results</div>');
  }
  //add listener for close button
  $('.close-button', newSet).click(function(e){closeSet(index);});
  $('.set-title', newSet).html(set.query);
  
  //update styles for the set collections
  resizeHandler();
}

function closeSet(index) {
  //remove from sets array
  // @TODO something wrong with this algorythm.
  var newsets = [];
  for(i in sets) {
    if(index != i) {
      newsets.push(sets[i]);
    }
  }
  sets = newsets;
  
  //un-draw the set
  $('.setid-'+index).fadeOut("slow", resizeHandler);
  
}

function drawEvent(setIndex, evt) {
  var newEvent = $.fn.tpl("getTemplate", "event");
  var set = $('.setid-'+setIndex);
  var dateString = evt.timestampStart.getMonth()+"/"+evt.timestampStart.getDay()+"/"+evt.timestampStart.getYear();
  var titleString = '<a href="javascript:void(0)" onclick="eventDetail(\'' + evt.id + '\')" >' + evt.title + '</a>';
  //var titleString = '<a href="/event/'+evt.id+'" target="_blank" id="oe'+evt.id+'">' + evt.title + '</a>';
  var values = { title:titleString, description:evt.description, date:dateString };
  $('.setid-' + setIndex + ' > .inner').tpl("prepareAndAppend", "event", values);
  //$('oe'+evt.id).colorbox({iframe:true});
}

function eventDetail(eventId) {
  $.colorbox({href:'/event/'+eventId+'?embed', iframe:true, height: '70%', width: '80%'});
  /*
  var evt = allEvents[eventId];
  var dateStartString = evt.timestampStart.getMonth()+"/"+evt.timestampStart.getDay()+"/"+evt.timestampStart.getYear();
  var dateEndString = '';
  if(evt.timestampStart.getYear() < evt.timestampEnd.getYear()){
    var dateEndString = " - " + evt.timestampEnd.getMonth()+"/"+evt.timestampEnd.getDay()+"/"+evt.timestampEnd.getYear();
  }
  var tagString = '';
  for(i in evt.tags) {
    tagString += '<a href="javascript:void(0)" onclick="tagSearch(\''+evt.tags[i]+'\')">'+evt.tags[i]+'</a>';
  }
  var references = evt.references.split(';');
  var referencesString = '';
  for(i in references) {
    referencesString += '<a href="'+references[i]+'" target="_blank" class="external-reference">'+references[i]+'</a>';
  }
  var values = {title:evt.title, date:dateStartString + dateEndString, description:evt.description, tags:tagString, references:referencesString};
  var dialogContent = $.fn.tpl("prepare", "event_detail", values);
  dialogContent.dialog({width:700, height: 600, title:evt.title});
  */
  
}

function tagSearch(tag) {
  $.colorbox.close();
  var data = {req:"search", query:tag};
  apiCall(data, function(d){
    addSet(d, tag);
  });
}

function updateAdminTools(){
  if(loggedIn) {
    $('#admin-tools').html($.fn.tpl("getTemplate", "admin_tools_logged_in"));
  }
  else {
    $('#admin-tools').html($.fn.tpl("getTemplate", "admin_tools_logged_out"));
  }
}

function login(){
  $.colorbox({href:"/auth/login", iframe:true, width:"400px", height:"200px"});
}

function logout(){
  $.get('/auth/logout', null, function(e){checkLogin(updateAdminTools)});
}

function closeAPIDialog() {
  $.colorbox.close();
  checkLogin(updateAdminTools);
}

function checkLogin(callback){
  $.get('/auth/check', 
    null, 
    function(e){
      if(e.result == "Valid"){
        loggedIn = true;
      }
      else {
        loggedIn = false;
      }
      if(callback) {
        callback();
      }
    },
    'json'
  );
}

