/**** Initialize some globals and preload mouseover images ****/
var limits  = new Array();
var filters = "";
var events = new Array();
var tableData = new Array();
var colors = new Array("#ff0000", "#ff0000", "#00ff00", "#0000ff");
var nbrOfResults = -1;

var event_dropdown = new Image(); 
event_dropdown.src = "images/event_dropdown_on.png";
var mylist_actions = new Image(); 
mylist_actions.src = "images/mylist_actions_on.png";
var prev_next = new Image(); 
prev_next.src = "images/prev_next_on.png";

/************ On document ready actions ***********/
$(document).ready(function(){
   /* Bind plot mouse overs. FIXME find a dynamic solution!! */
   $("#splits0").bind("plothover", plotHover0);
   $("#splits1").bind("plothover", plotHover1);
   $("#splits2").bind("plothover", plotHover2);
   $("#splits3").bind("plothover", plotHover3);
   $("#splits4").bind("plothover", plotHover4);
   $("#filter_active").attr("checked", false);
   $("#filter_active").bind("click", function () { updateFilters() });
   
   $("#f_type").bind("change", setFilters);
   setFilters();
   updateFilters(false);
   /* Reset */
   document.search_form.page_search.value = 0;
   document.search_form.sort_search.value = "time";
   document.search_form.order_search.value = "ASC";
   
});


/********** Show/hide for eventselector menu **************/
 var timeout;
 function doHide(){
   $('#events').hide();
 }
 function beginHide(){
   timeout = setTimeout("doHide()", 400);
 }
 function clearHide(){
   clearTimeout(timeout);
 }

function selectEvent()
{
   $('#events').toggle();
	var pos = $('#header_input').position();
	$('#events').css('top', pos.top + 60);
	$('#events').css('left', pos.left + 50);
}

function compareResults(inp_results) {
   var compareList = inp_results.split('|');
   nbrOfResults = compareList.length / 2;
   var id = 1;
   /* Draw result boxes */
   for (var i = 0; i < compareList.length && id <= nbrOfResults; i = i + 2) {
      $("#result" + id).show();
      getPopupInfo(compareList[i], compareList[i + 1], id)
      id++;
   }
}
function drawMergedSplits() {
   data = new Array();
   for (var i= 0; i < nbrOfResults; i++) {
      data[i] = {color: colors[i + 1], data: tableData[i + 1].splits, lines: { show: true }, points: { show: true }, label: tableData[i + 1].name + ", " + tableData[i + 1].event + " (h:mm)" };
   }
   $.plot($("#splits4"), 
          data,
          { yaxis: { color: "#ff0000", mode: "time", timeformat: "%h:%M"},
            xaxis: { tickFormatter: function (v, axis) { return v +" km" }}, 
            grid: { tickColor: "#BBBBBB", color: "#777777", borderWidth: 1, hoverable: true},
            legend: {noColumns: 3, margin: 20, container: $("#legend4")}});
}

/*************** Navigational related ******************/
function go(inp_url)
{
   window.location.href = inp_url;
}

/*************** Operations on resultlist ****************/
function goPage(inp_val)
{
	document.search_form.page_search.value = inp_val-1;
	$(document).trigger("resultlist.invalid");
}
function nextPage()
{
	document.search_form.page_search.value++;
	$(document).trigger("resultlist.invalid");
}
function prevPage()
{
	document.search_form.page_search.value--;
	$(document).trigger("resultlist.invalid");
}
function sortOrder(inp_sort)
{
	if (document.search_form.sort_search.value == inp_sort) {
		flipAscDesc();
	} else {
		document.search_form.order_search.value = 'ASC';
	}
	document.search_form.sort_search.value = inp_sort;
	$(document).trigger("resultlist.invalid");
}
function flipAscDesc()
{
    if (document.search_form.order_search.value == 'ASC') {
		document.search_form.order_search.value = 'DESC';
	} else {
	    document.search_form.order_search.value = 'ASC';
	}
}

function  getResult() {
   $(document).trigger("resultlist.loading");
   var str = $("#search_form").serialize();
   $.get("do.php", 
		 str + "&" + filters,
		 function(data){
            $(document).trigger("resultlist.loaded");
            $("#result").html(data);
		 });
}

/******************* Searching *******************/
var searchTimer;
function searchText()
{
	document.search_form.page_search.value = 0;
	clearTimeout(searchTimer);
	searchTimer=setTimeout("getResult()",600);
}

/****************** Mouse overs ******************/
var prevBGCol = "";
var prevCol = "";
function onRow(obj)
{
   prevBGCol = obj.style.backgroundColor;
   obj.style.backgroundColor = "#DDDDDD";
   prevCol = obj.style.color;
   obj.style.color = "#4b4b4b";
}
function offRow(obj)
{
   obj.style.backgroundColor = prevBGCol;
   obj.style.color = prevCol;
}
var handledResults = 0;
/******************** Competitor details **********************/
function getPopupInfo(inp_start_nbr, inp_event, inp_div_id)
{
   /* Set default values on optional parameters */
   if (typeof inp_event == "undefined") {
      inp_event = $('#search_form input[name=event]').val();
   }
   if (typeof inp_div_id == "undefined") {
      inp_div_id = 0;
   }
   $("#tooltip").remove();
   $("#legend" + inp_div_id).empty();
   $("#splits" + inp_div_id).html("<img src=\"images/ajax-loader.gif\" valign=\"middle\"> Laddar deltagare...");
   $("#legend" + inp_div_id).show();
   $("#splits" + inp_div_id).show();
   $('#details' + inp_div_id).slideUp("fast");
   $.get("do.php", 
		 {event: inp_event, action: 'get_info', start_nbr: inp_start_nbr},
		 function(data){
			$("#details" + inp_div_id).html(data);
			$('#details' + inp_div_id).slideDown("fast");
		 });
   
   $.getJSON("do.php", 
             {event: inp_event, action: 'get_splits', start_nbr: inp_start_nbr},
             function(data){
                tableData[inp_div_id] = data;
                handledResults++;
                $.plot($("#splits" + inp_div_id), 
                         [{color: "#ffffff", data: data.pace, bars: { show: true }, label: data.pace_label + " (" + data.pace_unit + ")"},
                          {color: colors[inp_div_id], data: data.splits, lines: { show: true }, points: { show: true }, yaxis: 2, label: "Mellantid (h:mm)" }],
                         { yaxis: { mode: data.pace_mode, timeformat: "%M:%S"},
                           y2axis: { color: "#ff0000", mode: "time", timeformat: "%h:%M"},
                           xaxis: { max: data.max, tickFormatter: function (v, axis) { return v +" km" }}, 
                           grid: { tickColor: "#BBBBBB", color: "#777777", borderWidth: 1, hoverable: true},
                           legend: {noColumns: 2, margin: 20, container: $("#legend" + inp_div_id)}}
                         );
                if (handledResults == nbrOfResults) {
                  drawMergedSplits();
                }
             }); 
}

function showTooltip(x, y, contents) {
     $('<div id="tooltip">' + contents + '</div>').css( {
         position: 'absolute',
         display: 'none',
         top: y - 25,
         left: x - 5,
         border: '1px solid #f8f8ff',
         padding: '2px',
         'background-color': '#4b4b4b',
         opacity: 0.90,
         font: '11px verdana,helvetica,sans-serif',
         color: '#f8f8ff'
     }).appendTo("body").fadeIn(200);
 }

function plotHover0(event, pos, item) { plotHover(event, pos, item, 0); }
function plotHover1(event, pos, item) { plotHover(event, pos, item, 1); }
function plotHover2(event, pos, item) { plotHover(event, pos, item, 2); }
function plotHover3(event, pos, item) { plotHover(event, pos, item, 3); }
function plotHover4(event, pos, item) { plotHover(event, pos, item, 4); }

var previousPoint = null;
function plotHover(event, pos, item, id) {
   if (item) {
       // Dont draw highlight if it is the same as current highlight (obviously)
       if (previousPoint == null || previousPoint[0] != item.datapoint[0] || previousPoint[1] != item.datapoint[1]) {
           previousPoint = item.datapoint;
           
           $("#tooltip").remove();
           var x = item.datapoint[0],
               y = item.datapoint[1];
           /* Split pace */
           if (item.seriesIndex == 0 && id != 4) {
               if (item.dataIndex < item.series.data.length - 1) {
                  var t = y;
                  if (tableData[id].pace_mode == "time") {
                     t = formatDate(new Date(y), "%M:%S", null);
                  }
                  var label = tableData[id].pace_label + ' ' + tableData[id].split_labels[item.dataIndex] + ' till ' + 
                               tableData[id].split_labels[item.dataIndex + 1] + ': ' + t + ' ' + tableData[id].pace_unit;
                  showTooltip(item.pageX, item.pageY, label);
               }
           /* Split time */
           } else {
               if (id == 4) id = item.seriesIndex + 1;
               var t = formatDate(new Date(y), "%H:%M:%S", null);
               var label = 'Mellantid vid ' + tableData[id].split_labels[item.dataIndex] + ': ' + t;
               var pageOffset = 0;
               /* Add average pace from start to split */
               if (item.dataIndex > 0 && item.dataIndex < item.series.data.length) {
                  /* Pace */
                  if (tableData[id].pace_mode == "time") {
                     var y2 = Math.round(y / x);
                     y2 += y2 % 1000 >= 500 ? 1000 : 0;
                     var t2 = formatDate(new Date(y2), "%M:%S", null);
                  /* Speed */
                  } else {
                     var t2 = Math.round((x * 3600000)/ y);
                  }
                  label += '<br>' + tableData[id].pace_label + ' ' + tableData[id].split_labels[0] + ' till ' + 
                                    tableData[id].split_labels[item.dataIndex] + ': ' + t2 + ' ' + tableData[id].pace_unit;
                  pageOffset = 14;
               }
               showTooltip(item.pageX, item.pageY - pageOffset, label);
           }
       }
   }
   else {
       $("#tooltip").remove();
       previousPoint = null;            
   }
}

function formatDate(d, fmt, monthNames) {
  var leftPad = function(n) {
      n = "" + n;
      return n.length == 1 ? "0" + n : n;
  };
  
  var r = [];
  var escape = false;
  if (monthNames == null)
      monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  for (var i = 0; i < fmt.length; ++i) {
      var c = fmt.charAt(i);
      
      if (escape) {
          switch (c) {
          case 'h': c = "" + d.getUTCHours(); break;
          case 'H': c = leftPad(d.getUTCHours()); break;
          case 'M': c = leftPad(d.getUTCMinutes()); break;
          case 'S': c = leftPad(d.getUTCSeconds()); break;
          case 'd': c = "" + d.getUTCDate(); break;
          case 'm': c = "" + (d.getUTCMonth() + 1); break;
          case 'y': c = "" + d.getUTCFullYear(); break;
          case 'b': c = "" + monthNames[d.getUTCMonth()]; break;
          }
          r.push(c);
          escape = false;
      }
      else {
          if (c == "%")
              escape = true;
          else
              r.push(c);
      }
  }
  return r.join("");
}

/************************ Mailing *************************/
function showMailForm() {
   $.facebox({ ajax: 'static/mail.html' }); 
}

function sendMail()
{
   $("#sending_mail").show();
   $.post("mail.php", 
          $("#form_mail").serialize(),
          function(data) {
            $("#sending_mail").hide();
            if (data.error && data.error > 0) {
               var msg = "Oops! Nåt gick fel. Prova igen";
               switch(data.error)
               {
                  case 3:
                     msg = "Var god skriv ett meddelande";
                     break;
                  case 4:
                     msg = "Var god ange E-post";
                     break;
                  case 6:
                     msg = "Din e-post verkar inte vara giltig";
                     break;
               }
               alert(msg);
            }
            else {
               alert("Tack för ditt meddelande!");
               $(document).trigger('close.facebox');
               $("#form_mail").reset()
            }
          }
          , "json");
   
   return false;
}


/****************** Filter section ******************/
function updateFilters(exec)
{
   if (typeof exec == "undefined") {
      exec = true;
   }
   /* Reset pages */
   document.search_form.page_search.value = 0;   
   if($("#filter_active").attr("checked"))
   {
      $("#filter_form").css("opacity", null);
      $("#filter_form select").attr("disabled", false);
      $("#filter_form input").attr("disabled", false);
      $("#filters").css("background-color", "#F2DADA");
      $("#filters").css("border-color", "#D9C0C0");
      filters = $("#filter_form").serialize();    
   }
   else
   {
      $("#filter_form").css("opacity", 0.4);
      $("#filter_form select").attr("disabled", true);
      $("#filter_form input").attr("disabled", true);
      $("#filters").css("background-color", "#EEE");
      $("#filters").css("border-color", "#DDD");
      exec2 = true;
      filters = "";
   }
   if(exec && exec2)
   {
      $(document).trigger("resultlist.invalid");
   }
}

function setFilters()
{
   tlist = $("#f_type");
   vlist = $("#f_value");
   type = tlist.val();
   vlist.empty();
   switch(type){
      case "a":
      case "t":      
          $.each(limits[type], function(i, elem) {
            vlist.append("<option>" + elem + "</option>")
          });
          break;
      default:
         break;
   }
}

/*************** Bind to different events  ***************/

$("#f_type").bind("change", setFilters);

/**  Result list **/
/* Update results if invalidated */
$(document).bind("resultlist.invalid", getResult);

/* Wait layer for resultlist */
$(document).bind("resultlist.loading", function() {
   var pos = $('#result').position();
   $("#result_loading").css('top', pos.top);
   $("#result_loading").css('left', pos.left);
   $("#result_loading").css('width', $('#result').width());
   $("#result_loading").css('height', $('#result').height());
   $("#result_loading").show();   
});

$(document).bind("resultlist.loaded", function() {
   $("#result_loading").hide();
});

/** My list **/
/* Collapse and load the list when it's ready */
$(document).bind("mylist.ready", function() { MyList.load(); });
/* Show indication that mylist is loading new data */
$(document).bind("mylist.loading", function () { $('#mylist_wait').addClass("active"); });

/* Functions to execute when there is new data in mylist */
$(document).bind("mylist.loaded", function () { $('#mylist_wait').removeClass("active"); });
$(document).bind("mylist.loaded", function () {
   // Remove all old results
   $("#my_list_body").empty();
   if(MyList.content.length == 0)
   {
      $("#my_list_body").append('<tr><td class="empty">Din lista är tom. Klicka på <img src="images/add.png">för att lägga till deltagare');
      $("#my_list_result").empty();
      return true;
   }
   
   var table_data = '<thead><tr class="result"><th>&nbsp;<th>Event<th>Startnummer<th>Namn<th>Klubb<th>Pos<th>Tid</tr></thead><tbody>';

   // Add updated result list
   var totalTime = 0;
   for (var i = 0; i < MyList.content.length; i++) {
      totalTime += MyList.content[i].timestamp;
      table_data += '<tr class="my_list">' +
                                '<td><div class="tbl_button btn_mylist_del"><a href="#" onClick="javascript:MyList.remove(' + MyList.content[i].start_nbr + '); return false;" title="Ta bort från Min Lista">-</a></div>' +
                                    '<div class="tbl_button btn_info"><a href="#" OnClick=\"javascript:getPopupInfo(' + MyList.content[i].start_nbr + ', \'' + MyList.content[i].event + '\'); return false;" title="Visa info och statistik">Info</a></div>' +
                                '<td>' + MyList.content[i].event_name + '<td>' + MyList.content[i].start_nbr + '<td>' + MyList.content[i].name + 
                                '<td>' + MyList.content[i].club + '<td>' + MyList.content[i].pos + '<td>' + MyList.content[i].time + '</tr>';
   }
   $("#my_list_body").append(table_data + '</tbody>');   
   /* Calculate average time and total time */
   var avgTime = MyList.content.length == 0 ? 0 : totalTime / MyList.content.length;
   var totalDays = Math.floor(totalTime / (24*3600)) > 0 ? "" + Math.floor(totalTime / (24*3600)) + " dag(ar) " : "";
   var avgDays = Math.floor(avgTime / (24*3600)) > 0 ? "" + Math.floor(avgTime / (24*3600)) + " dag(ar) " : "";
   $("#my_list_result").html("Medeltid: " + avgDays + formatDate(new Date(avgTime * 1000), "%H:%M:%S", null) + ", Totaltid: " + totalDays + formatDate(new Date(totalTime * 1000), "%H:%M:%S", null));
});

/** Facebox **/
$(document).bind('reveal.facebox', function() { $("#sending_mail").hide(); })
