var pageParameters   = null;
var pageName         = null;
//var carouselImages   = null;
//var carouselCanvas   = null;
//var carouselStepping = 0.00;
//var carouselTimer    = null;
//var carouselOffset   = 1;
statsParameters = null;

$(document).ready(function() {
  var tmp = window.location.toString();
  statsParameters = {};

  // Set Global Parameter State
  pageParameters = parseQueryString(tmp);

  if (tmp.indexOf('.php') > 0) {
    pageName = tmp.substring(0, tmp.indexOf('.php') + 4);
  } else if (tmp.indexOf('?') > 0) {
    pageName = tmp.substring(0, tmp.indexOf('?') - 1);
  } else {
    pageName = '';
  }

  // Apply Ajaxification to Controls
  ajaxifyPagination('#pagination');
  ajaxifyTagFilter('#searchfilter');
  ajaxifySorting('#jsfilter_sorting');

  if (videoId = pageParameters['id']) {
    logView(videoId);
  }

  setRatings();

  $("a[rel^=prettyPhoto]").each(function () {
    var hrf = $('#recommend').attr('href');

    $('#recommend').attr('href', hrf + '?videoid=' + videoId + '&iframe=true');

    $(this).prettyPhoto({
      animationSpeed:'fast',
      default_width: 600,
      default_height: 400,
      theme:'facebook',
      slideshow:false
    });
  });
  refreshStatistics();

  $('#StatisticsSection').hide();
//  $('#VideoSection').hide();

  $('#SectionMenu a').click(function() {
    if (!$(this).hasClass('Current')) {
      switch ($(this).attr('id')) {
        case 'VidCtrl':
          $('#StatisticsSection').hide();
          $('#VideoSection').show();
          $('#StsCtrl').removeClass('Current');
          $(this).addClass('Current');
          break;
        case 'StsCtrl':
          $('#StatisticsSection').show();
          $('#VideoSection').hide();
          $('#VidCtrl').removeClass('Current');
          $(this).addClass('Current');
          break;
      }
    }
    else{
       if($(this).attr('id')=='StsCtrl'){
          refreshStatistics({ 'type' : 'team',
                              'event' : '',
                              'season' : '',
                              'league' : '',
                              'gameday' : ''});
          return false;
        }
    }
    return false;
  });




//  $('#StatisticsSection > .BoxHeader > .BoxContent > .Label[id=StsTeamCtrl]').click(function () {
//    refreshStatistics({ 'type' : 'team'});
//    return false;
//  });
//
//  $('#StatisticsSection > .BoxHeader > .BoxContent > .Label[id=StsPlayerCtrl]').click(function () {
//    refreshStatistics({ 'type' : 'player'});
//    return false;
//  });

});


function refreshStatistics(params)
{
  //statsParameters=Array();
  var stats_url = '/stats.php';
  var obj       = $('#StatisticsSection > .BoxBody > .BoxContent > .Grid4er');

  var filter_params =  filterToStatsParameters(params);
  //console.log(filter_params);
  obj.load(
    stats_url,
    filter_params,
    function () {
      var that=this;
      ajaxifyStatisticsLinks($('.StatsMainTable', this));

      document['dataTable'] = $('.StatsMainTable', this).fcbTvStatsTable({'iMaxColumns':12, 'bSort':true});

      $('#searchfilter_statistics').html($('#StatsFilter', this).detach().html());

      $('#searchfilter_statistics > .FilterSelection').bind('click', function() {
        toggle_filter("#" + $(this).attr('id'));
      });
      ajaxifyStatisticsLinks($('#searchfilter_statistics'));
      ajaxifyStatisticsLinks($('.Back', this));

      $('#StatisticsSection > .BoxHeader > .BoxContent').html($('#StatisticsMenu', this).detach().html());
      ajaxifyStatisticsLinks($('#StatisticsSection > .BoxHeader > .BoxContent'));

      // Explicitly adopt selected filter value
      $('#searchfilter_statistics > .FilterSelection').each(function () {
        args = parseQueryString($(this).attr('name'));
        // Note that normally a single pair is given
        for (var a in args) {
          if (args[a]) {
            // If a value is given, set in statsParameters in order to make
            // sure that the parameters is available for subsequent request.
            statsParameters[a.toLowerCase()] = args[a];
          } else {
            // Otherwise, if no parameters is given. Make items in drop, for whic
            $('a', this).each(function () {
              qry = parseQueryString($(this).attr('href'));
              for (var k in qry) {
                if (statsParameters[k.toLowerCase()] && qry[k] && statsParameters[k.toLowerCase()] == qry[k]) {
                  $(this).parent().addClass('Entry_1');
                  break;
                }
              }
            });
          }
        }
      });

      $("#searchfilter_statistics").find("li").each(function() {
        if($(this).children('span').hasClass('Entry_1')){
          $(this).children('span').removeClass('Entry_1');
          $(this).addClass('Entry_1')
        }
      });

      //Spielernamen nach Anfangsbuchstaben auswaehlen
      $("#PlayerOrder").unbind('click');
      $('#PlayerOrder').bind('click', function() {
        $('#PlayerOrder > div').toggle();
      });

      $("#PlayerOrder").find("li").each(function(i) {
        $(this).bind('click', function() {
          $("#LetterMenu").attr('chosen', $(this).html());
          document['dataTable'].fnDraw(true);
          //          //pagination nicht anzeigen, wenn nicht mehr als eine ergebnisseite
          //          console.log(document['dataTable'].dataTableSettings[1].aiDisplay.length+'gesamt');
          //          console.log(document['dataTable']._settings.iDisplayLength+'pro seite');


          // get second entry reference ()
          var oSettings = null
          for (var idx in document['dataTable'].dataTableSettings) {
            oSettings = document['dataTable'].dataTableSettings[idx];
            //break;
          }
          if(oSettings.aiDisplay.length <= document['dataTable']._settings.iDisplayLength ) {
            //console.log(oSettings.fnRecordsDisplay());
            $('.dataTables_paginate').html('');
          }
        });
      });
    }
  );

}

function ajaxifyStatisticsLinks(obj)
{
  $('a', obj).each(function () {
      $(this).click(function () {
        args = parseQueryString($(this).attr('href'));
        refreshStatistics(args);
        statsParametersToFilter(args);
        populateVideoResults();

        return false;
      });
  });
}

function statsParametersToFilter() {
  var s      = null;
  var filter = '';

  if (pageParameters['filter'] != undefined) {
    filter = pageParameters['filter'];
  }
  if(filter.indexOf('players')>0){
    filter = filter.replace(/\+players_[^\+]*/g, '');
  }
  for (s in statsParameters) {
    var r = new RegExp("\s*\\x2b" + s + "_\\S+", "g");
    var t = '';
    if (statsParameters[s].length > 0) {
      var t = " +" + s + "_";
      switch (s) {
        // event id not mapped
        case 'type':
        case 'event':
          break;
        case 'league':
          t += LEAGUE_MAPPING[statsParameters[s]];
          break
        case 'player':
            /*var tmp=PLAYER_MAPPING[statsParameters[s]];
            if (tmp==undefined){
              tmp='players_default';
            }*/
            t = '+'+PLAYER_MAPPING[statsParameters[s]];

          break
        default:
          t += statsParameters[s];
      }
    }
    if (r.test(filter)) {
      filter = filter.replace(r, t);
    } else {
      filter += t;
    }
  }

  pageParameters['filter'] = filter;
}

function emptyResultsFallback()
{
  if (!pageParameters) {
    var tmp = window.location.toString();

    pageParameters = parseQueryString();
  }
  pageParameters['search'] = '';

  populateVideoResults();
}

function logView(videoId)
{
  $.getJSON(
    "logView.php",
    {
      "id":videoId
    },
    function(data) {}
  );
}

function rateVideo(rating)
{
	videoId = pageParameters['id'];
  $.getJSON(
    "logRating.php",
    {
      "id":videoId,
      "rating":rating
    },
    function(data) {}
	);
}

function setRatings()
{
	$('.Rating ').each(function() {
		var id = $(this).attr('id').split('_');
		if (id.length = 3) {
			var rating = id[2];

			$(this).css('width', (rating * 12) + 'px');
		}
	});
}

function parseQueryString(href)
{
  var out = {};
  var regex = /([^&?=]+)=([^&]*)/g;

  href = unescape(href).toLowerCase();
  regex.lastIndex = 0;
  while((m = regex.exec(href)) != null) {
    out[m[1]] = m[2];
  }

  return out;
}

function filterToStatsParameters(params, clear) {
  var ars   = null;
  var args  = pageParameters;
  var re    = /(league|season|gameday|players|Personen)_(\S+)/g;
  var match = null;
  var out   = {};
  // Set Country Code
  out['cc'] = 'de';
  if (args['cc'] != undefined) {
    out['cc'] = args['cc'];
  }
  // Require new parameters when provided, set in out and in statsParameters
  // globals
  if (params != undefined) {
    //don't overwrite statistics parameter if statistics filter chosen
    for (arg in params) {
//      console.log('setting statsParameters[' + arg + ']=' + statsParameters[arg] + ' <- params[' + arg + ']=' + params[arg]);
      statsParameters[arg] = params[arg];
    }
  }
  else{
    // Take any parameters passes to page
    for (arg in args) {
      switch (arg) {
        case "type":
        case "season":
        case "league":
        case "event":
        case "gameday":
        case "player":
          out[arg] = args[arg];
          break;
      }
    }
    // Map From Filter Parameters If Available
    if (args['filter'] != undefined) {
      var filter = unescape(unescape(args['filter']));
      while (match = re.exec(filter)) {
        if (match[1] == 'players' || match[1] == 'Personen') {
          out['player'] =  match[1] + '_' + match[2];
        } else {
          out[match[1]] = match[2];
        }
      }
    }
  }


  for (arg in statsParameters) {
    out[arg] = statsParameters[arg];
  }

  return out;
}

function generateQueryString(obj)
{
  var out = '';
  var sep = '?';

  for (var id in obj) {
    out += sep + id + '=' + escape(obj[id]).replace(/\+/g, '%2b');
    sep = '&';
  }

  return out;
}

function ajaxifyPagination(id)
{
  $(id + " a").each(function (id) {
    var args = parseQueryString($(this).attr('href'));

    $(this).click(function () {
      pageParameters['page'] = args['page'];
      populateVideoResults('#VideoResults', args);
      return false;
    });
  });
}

function ajaxifyTagFilter(id)
{
  $(id + " a").each(function (id) {
    var args = parseQueryString($(this).attr('href'));

    $(this).click(function () {
      pageParameters['page'] = 1;
      pageParameters['filter'] = args['filter'];
      populateVideoResults('#VideoResults', args);
      refreshStatistics();
      return false;
    });
  });
//  applyLabelEllipsis();
}

function ajaxifySorting(sortBoxId)
{
  $(sortBoxId + " a").each(function (linkId) {
    var args  = parseQueryString($(this).attr('href'));
    var label = $(this).text();

    $(this).click(function () {
      $(this).parent().parent().children().each(function () {
        $(this).removeClass('Entry_1');
        $(this).addClass('Entry_0');
      });
      $(this).parent().addClass('Entry_1');

      pageParameters['sort'] = args['sort'];

      $(sortBoxId + " > .Handle > .Label").each(function () {
        $(this).text(label);
      });

      populateVideoResults('VideoResults', args);
      return false;
    });
  });
}

function populateTagFilter(id)
{

  // clone pageParamters, we don't wan't each changed to be applied globally
  var args = jQuery.extend(true, {}, pageParameters);
  var tags = (args['filter'])?args['filter']:'';
  tags += (args['search'])?' ' + args['search']:'';
  tags += (args['menu'])?' ' + args['menu']:'';
  tags = escape($.trim(tags).replace(/([\+\-]*(\S+))/g, '+$2'));
  //remove "type_" and "+undefied"
  tags = tags.replace(/\+type_/g, '');
  tags = tags.replace(/\+undefined/g, '');
     tags = tags.replace(/\+event_/g, '');

  var types = {};
  var i=0;
  $('#searchfilter > .Selection > .Handle').each(function() {
    types[i++] = $(this).attr('id');
  });

  $.getJSON(
    "service.php",
    {
      "cc":(args['cc'])?args['cc']:'',
      "service":"tags_filter",
      "method":"getFilterTree",
      "args": {
        "tags": tags,
        "tags_types":types
      }
    },
    function(data) {
      var NR = 1;
      $.each(data.result, function () {
        NR++;
      });

      $('#searchfilter').empty();
      $.each(data.result, function(tagType, tagTypeRecord) {
        var ID          = 'jsfilter' + NR;
        var filter      = tags.replace(new RegExp('\\+' + tagType + '\\S*', 'g'), '');
        var CLEAR_LINK  = pageName + generateQueryString({'filter' : filter});
        var LINK        = pageName + generateQueryString({'filter' : filter + ' +' + tagType });
        var LABEL       = tagTypeRecord.LABEL;
        var CLEAR_LABEL = document['LABELS']['CLEAR_FILTER_SELECTION'];

        var typeTags = $(document.createElement('ul'))
          .append(
            $(document.createElement('li'))
            .append(
              $('<a></a>')
              .attr('href', CLEAR_LINK)
              .html(CLEAR_LABEL)
              )
            )
          ;
        $.each(tagTypeRecord.TAGS, function(tag, tagRecord) {
          if (tagRecord.SELECTED) {
            LABEL = tagRecord.LABEL;
            typeTags.append(
              $(document.createElement('li'))
              .addClass('Entry_1')
              .append(
                $(document.createElement('span'))
                .html(
                  tagRecord.LABEL + "&nbsp;[" +
                  tagRecord.VIDEOS_NR  + "]"
                  )
                )
              );
          } else {
          var LINK = pageName + generateQueryString({
            'filter' : filter  + ' +' + tag
            });
          typeTags.append(
            $(document.createElement('li'))
            .append(
              $(document.createElement('a'))
              .attr('href', LINK)
              .html(
                tagRecord.LABEL + "&nbsp;[" +
                tagRecord.VIDEOS_NR  + "]"
                )
              )
            );
          }
        });

        var jsFilterDiv = $(document.createElement('div'))
          .addClass('FilterSelection')
          .attr('id', ID)
          .css('z-index', NR)
          .bind('click', function () {
              toggle_filter('#' + ID);
              })
          .append(
            $(document.createElement('div'))
              .addClass('Handle')
              .attr('id', tagType)
              .append('<span id="jsFilterSpan' + tagType + '">' + LABEL + '</span>')
          )
          .append(
              $(document.createElement('div'))
              .addClass('Popout')
              .append(
                $(document.createElement('div'))
                .addClass('Content')
                .append(typeTags)
                )
              .append(
                $(document.createElement('div'))
                .addClass('Bottom')
                .html('&nbsp;')
                )
              )
          ;
        $('#searchfilter').append(jsFilterDiv);

        NR = NR - 1;
      });
      currentFilter = null;
      ajaxifyTagFilter('#searchfilter');
    });
}

function applyLabelEllipsis()
{
  $('.FilterSelection .Handle span').each(function () {
    var text_length = $(this).html().length;
    var label_max_length = $(this).width() / (parseFloat($(this).css('font-size')) * 0.65);

    if (text_length > label_max_length) {
        $(this).html($(this).html().substring(0, label_max_length) + '...');
    }
  });
}

function populateVideoResults(id)
{
  var args     = jQuery.extend(true, {}, pageParameters);
  var sort     = (args['sort'])?args['sort']:'SDD';
  var pageNr   = (args['page'])?args['page']:1;
  var pageSize = 12;
  var tags     = (args['filter'])?args['filter']:'';
  tags += (args['search'])?' ' + args['search']:'';
  tags += (args['menu'])?' ' + args['menu']:'';
  tags = escape($.trim(tags).replace(/([\+\-]*(\S+))/g, '+$2'));
  //remove "type_" and "+undefied" and "event_"
  tags = tags.replace(/\+type_/g, '');
  tags = tags.replace(/\+undefined/g, '');
  tags = tags.replace(/\+event_/g, '');
  $.getJSON("service.php", {
    "cc":(args['cc'])?args['cc']:'',
    "service":"video",
    "method":"getByTags",
    "args": {
      "tags"   : tags,
      "limit"  : pageSize,
      "offset" : pageSize * (pageNr - 1),
      "sort"   : sort
    }
  },
  function(data) {
    var tmp = '';
    if(data.result.count>0){
      $.each(data.result.result, function(i,item) {
        item.SELECTED = 'other';
        args['id'] = item.ID;
        item.LINK       = 'search.php' + generateQueryString(args);
        item.THUMB_PATH = item.THUMB_PATH.replace(/^.*\/([^\/]*)(\..{3})$/, '/video_images/$1_thumb$2');

        tmp += "<div class=\"Elem Elem_" +
        item.SELECTED   + "\"> <a href=\"" +
        item.LINK       + "\"> <img src=\"" +
        item.THUMB_PATH + "\" width=\"142\" height=\"80\" alt=\"\" /> <h5>" +
        item.NAME       + "</h5><span class=\"Rating\" style=\"width: " +
        (item.RATING * 12)     + "px\">&nbsp;</span><span class=\"Date\">" +
        item.DATE       + "</span></a></div>\n\n";
      });

      $('#VideoResults').html(tmp);
      $('#videocount').html(data.result.count);
      $('#videocount').html(data.result.count);
      $('#VidCtrl > span.Count').html(data.result.count);
      populatePagination('#pagination', data.result.count, pageNr, pageSize);
      populateTagFilter('#searchfilter', args);
      //setRatings();
      }
    else{
      //if no result -> reset all filters
      pageParameters={};
      populateVideoResults();
    }
  });
}

function populatePagination(id, count, nr, size)
{
  var smallest = function (a, b) {
    if (a < b) {
      return a;
    }
    return b;
  }

  var args = jQuery.extend(true, {}, pageParameters);

  // First Page Context
  var fpc = 1;

  // Current Page Left Context
  var cplc = 1;

  // Current Page Right Context
  var cprc = 1;

  // Last Page Content
  var lpc = 0;

  // Last Page
  var l = Math.ceil(count / size);

  // First Page is 1
  var i = 1;

  // Current Page
  var c = parseInt(nr);

  var tmp  = '';

  if (c > 1) {
    args['page'] = c - 1;
    url = generateQueryString(args);
    tmp += '<a href="' + url + '" class="Previous">&nbsp;</a>';
  } else {
    tmp += '<span class="Previous">&nbsp;</span>';
  }

  if (c > (fpc + cplc - 1)) {
    for (;i <= fpc;i++) {
      args['page'] = i;
      url = generateQueryString(args);
      tmp += '<a class="Page" href="' + url + '">' + i + '</a>';
    }

    if (i < (c - cplc)) {
      tmp += '<span style="float:left;margin-left:2px;margin-left:2px">&hellip;</span>';
    }
  }

  // Current Page Left Context
  if (i < (c - cplc)) {
    i = (c - cplc);
  }
  for (;i <= (c - 1);i++) {
    args['page'] = i;
    url = generateQueryString(args);
    tmp += '<a class="Page" href="' + url + '">' + i + '</a>';
  }

  // Current Page
  tmp += '<span class="Active">' + c + '</span>';

  // Current Page Right Context
  for (i=c+1;i <= smallest(l, (c + cprc));i++) {
    args['page'] = i;
    url = generateQueryString(args);
    tmp += '<a class="Page" href="' + url + '">' + i + '</a>';
  }

  // Last Context
  if (c < (l - (cprc + lpc))) {
    if (i < (l - lpc)) {
      tmp += '<span style="float:left;margin-left:2px;margin-left:2px">&hellip;</span>';
    }

    for (i=(l - lpc);i <= l;i++) {
      args['page'] = i;
      url = generateQueryString(args);
      tmp += '<a class="Page" href="' + url + '">' + i + '</a>';
    }
  }
  if (c < l) {
    args['page'] = c + 1;
    url = generateQueryString(args);
    tmp += '<a href="' + url + '" class="Next">&nbsp;</a>';
  } else {
    tmp += '<span class="Next">&nbsp;</span>';
  }

  $(id).html(tmp);

  ajaxifyPagination(id);
}

/* VIDEO PLAYER HELPER FUNCTIONS */

var trackingRequest = null;
function trackVideo(oPlayer, iMin)
{
    if (!trackingRequest) {
        trackingRequest = (new Date()).getTime().toString() + '' + Math.floor(Math.random() * 10);
    }
    if (iMin) {
        $.get(
            "logDuration.php",
            {
                "trid":trackingRequest,
                "id":videoId,
                "duration": iMin
            },
            function(data) {}
        );
    }
}


/**
 * This function is called, when the user clicks the recommend button.
 * It opens a popup with the recommendation form.
 */
function sendMail(e)
{
    $('#recommend').click();
}

