/*
 * @author Erik Anders aka --=GT-O=--Hellfire
 */

var Raid = Class.extend({
  init: function() {
    this.url = 'content.php?load=ajax-raid'
    this.url2 = 'http://lg-net.de/dkp/content.php?load=ajax-raid';
    this.globalCt = $('#raid-content');
    
    this.wowClasses = new WoWClass().c;
    this.emptyClass = {key: 'empty', name: 'Frei', color: '#CACACA'};
    this.dummy = new Array();
    for (var i = 0; i<this.wowClasses.length; i++) {
      this.dummy[i] = Math.floor(Math.random()*5)+1
    }
    
    this.globalCt.append('<div id="listCt"></div>');
    this.listCt = $('#listCt');
    var self = this;
    

    this.loadEvents();
    
    this.createRaidDialog();
    
    
    $('#delete-raid-dialog').dialog({
      modal: true,
      resizable: false,
      autoOpen: false,
      buttons: {
	'Ja': function() {
	  $(this).dialog('close');
	  $.ajax({
	    url: self.url,
	    data: {mode: 'deleteRaid', raid_id: $('#delete-raid-id').val()},
	    success: function() {
	      self.loadEvents();
	    }
	  });
	},
	'Nein': function() {
	  $(this).dialog('close');
	}
      }
    });
    
  },
  
  createRaidDialog: function() {
    var self = this;
    
    $('#total-slots-slider').slider({
      range: 'min',
      min: 1,
      max: 40,
      slide: function(event, ui) {
				$("#total-slots").val(ui.value);
			}
    });
    $('#total-slots-slider').slider("value", 25);
    $("#total-slots").val($('#total-slots-slider').slider("value"));

    $("#raid_begin_show").datepicker({
      dateFormat: 'DD, d. MM yy',
      altField: $('#raid_begin'),
      altFormat: '@',
      showAnim: 'fadeIn'
    });
    
    $('#raid_begin_time_hour').slider({
      range: 'min',
      min: 0,
      max: 23,
      slide: function(event, ui) {
        var h = (new String(ui.value).length < 2) ? '0' : '';
        var m = (new String($('#raid_begin_time_minute').slider("value")).length < 2) ? '0' : '';
	$("#raid_begin_time").val(h+ui.value+':'+m+$('#raid_begin_time_minute').slider("value")+' Uhr');
      }
    });
    $('#raid_begin_time_hour').slider("value", 19);
    
    $('#raid_begin_time_minute').slider({
      range: 'min',
      min: 0,
      max: 45,
      step: 15,
      slide: function(event, ui) {
        var h = (new String($('#raid_begin_time_hour').slider("value")).length < 2) ? '0' : '';
        var m = (new String(ui.value).length < 2) ? '0' : '';
	$("#raid_begin_time").val(h+$('#raid_begin_time_hour').slider("value")+':'+m+ui.value+' Uhr');
      }
    });
    $('#raid_begin_time_minute').slider("value", '00');
    
    $("#raid_begin_time").val($('#raid_begin_time_hour').slider("value")+':'+$('#raid_begin_time_minute').slider("value")+' Uhr');
  

    $('#create-raid-dialog').dialog({
      autoOpen: false,
      modal: true,
      buttons: {
	'Absenden': function() {
	  var bValid = true;
	  var allFields = $('#create-raid-dialog input:not(#raid_begin_show)');
	  var tips = $("#validateTips");
    
	  allFields.removeClass('ui-state-error');
	  
	  bValid = bValid && self.checkLength($('#location'),"'Dungeon'",3,50, self);
	  bValid = bValid && self.checkLength($('#raid_begin'),"raid_begin",10,20, self);
	  
	  if (bValid) {
	    $.ajax({
	      type: 'POST',
	      url: self.url,
	      data: allFields.serialize()+'&mode=createRaid',
	      success: function() {
		self.loadEvents();
	      }
	    });
	    
	    var html = '<strong '+(!($(this).find('#raid_id').val() > 0) ? 'class="raid-good">Raid erstellt:' : 'class="raid-neutral">Raid bearbeitet:')+'</strong>';
	    html += '<br />'+$(this).find('#location').val()+' ('+$(this).find('#raid_begin_show').val()+')';
	    $.jGrowl(html, {glue: 'before'});
	    $(this).dialog('close');
	  }
	},
	'Abbrechen': function() {
	  $(this).dialog('close');
	}
      },
      open: function() {
	$(this).datepicker('setDate', new Date());
	$('#raid_begin').val(new Date().getTime());
	$("#raid_begin_time").val($('#raid_begin_time_hour').slider("value")+':'+$('#raid_begin_time_minute').slider("value")+' Uhr');
	$("#total-slots").val($('#total-slots-slider').slider("value"));
      },
      close: function() {
	var allFields = $('#create-raid-dialog input:not(#raid_begin_show)');
	allFields.val('').removeClass('ui-state-error');
      }
    });
    $('#ui-datepicker-div').css('z-index', 10000);
    
    $('#create-raid').click(function() {
      $('#create-raid-dialog').dialog('open');
    }).hover(
      function(){ 
	$(this).addClass("ui-state-hover"); 
      },
      function(){ 
	$(this).removeClass("ui-state-hover"); 
      }
    ).mousedown(function() {
      $(this).addClass("ui-state-active");
    }).mouseup(function() {
      $(this).removeClass("ui-state-active");
    });
  },
  
  editRaidDialog: function(columns, data) {
    var idCol = $.inArray('id', columns);
    var sudCol = $.inArray('signup_data', columns);
    var usudCol = $.inArray('user_signup_data', columns);
    var rbCol = $.inArray('raid_begin', columns);
    var locCol = $.inArray('location', columns);
    var slotsCol = $.inArray('total_slots', columns);
    
    $('#location').val(data[locCol]);
    
    $('#total-slots-slider').slider("value", data[slotsCol]);
    $("#total-slots").val($('#total-slots-slider').slider("value"));
    
    var rb = new Date((data[rbCol]*1000-new Date(data[rbCol]*1000).getHours()*3600-new Date(data[rbCol]*1000).getMinutes()*60 ));
    
    $('#raid_begin_show').datepicker('setDate', rb);
    $('#raid_begin').val(rb.getTime());
    
    $('#raid_begin_time_hour').slider("value", new Date(data[rbCol]*1000).getHours());
    $('#raid_begin_time_minute').slider("value", new Date(data[rbCol]*1000).getMinutes());
    
    $("#raid_begin_time").val($('#raid_begin_time_hour').slider("value")+':'+$('#raid_begin_time_minute').slider("value")+' Uhr');
    
    $('#raid_id').val(data[idCol]);
  },
  
  updateTips: function(t) {
    $("#validateTips").text(t).effect("highlight",{},1500);
  },

  checkLength: function(o,n,min,max,parent) {
    if ( o.val().length > max || o.val().length < min ) {
      if (n == 'raid_begin') {
	$('#raid_begin_show').addClass('ui-state-error');
	parent.updateTips("'Beginn' darf nicht leer sein.");
      } else {
	o.addClass('ui-state-error');
	parent.updateTips(n + " muss zwischen "+min+" und "+max+" Zeichen lang sein.");
      }
      return false;
    } else {
      return true;
    }
  },

  checkRegexp: function(o,regexp,n,parent) {
    if ( !( regexp.test( o.val() ) ) ) {
      o.addClass('ui-state-error');
      parent.updateTips(n);
      return false;
    } else {
      return true;
    }
  },

  loadEvents: function() {
    var self = this;
    var html = '<strong>Lade Raids...</strong>';
    $.jGrowl(html, {glue: 'before'});
	    
    $.ajax({
      url: this.url,
      type: 'GET',
      data: {mode: 'loadEvents'},
      success: function (json) {
	json = window["eval"]("(" + json + ")");
	
        $('#raid-list tbody:not(:first)').remove();
        $('#raid-list-template').templateDisplay({data: json.data, columns: json.columns, target: $('#raid-list'), remove: false});
	
        $.each($('#raid-list .raid_begin'), function() {
          var dt = new Date($(this).html()*1000);
          
          //$(this).html($.datepicker.formatDate('D, dd.mm.yy', dt)+'&nbsp;&nbsp;'+((dt.getHours() < 10) ? '0' : '')+dt.getHours()+':'+((dt.getMinutes() < 10) ? '0' : '')+dt.getMinutes());
          $(this).html(formatDate(dt, 'E dd.MM.yy, HH:mm'));
          var pd = prettyDate(dt.getTime()/1000);
          if (pd.length > 0)
            $(this).append('<br /><strong>'+pd+'</strong>');
          
          var pd = prettyDatePast(dt.getTime()/1000);
          if (pd.length > 0) {
            $(this).append('<br /><strong>'+pd+'</strong>');
	  }
            
        });
	
	var idCol = $.inArray('id', json.columns);
        var sudCol = $.inArray('signup_data', json.columns);
        var usudCol = $.inArray('user_signup_data', json.columns);
        var rbCol = $.inArray('raid_begin', json.columns);
        var locCol = $.inArray('location', json.columns);
	
        $.each(json.data, function() {
          var _jsonData = this;
	  if (_jsonData[rbCol]*1000-(new Date().getTime()) < 0)
	    $('#row-'+this[idCol]).addClass('ui-state-error');
	    
          var p = Processing("cv-"+this[idCol]);
          p.setup = function(){
            this.size(250,15);
            this.noLoop();
          };
          
          var total = this[$.inArray('total_slots', json.columns)];
          
          var signedUp = $.grep(this[sudCol], function(n,i) {
            return n.signup_type == 3;
          });
          var suTotal = 0;
          $.each(signedUp, function() { suTotal += parseInt(this.count) });
          
          total = Math.max(total, suTotal);
	  
          var rest = total - suTotal;
          p.draw = function() {
            _p = this;
            _p.noStroke();

            var spacer = 0;
            var rh = _p.height;
            _p.fill(self.emptyClass.color);
            _p.rect(0,0,_p.width-spacer,rh);
            
            var oldPos = 0;
            $.each(signedUp, function(i, n) {
              var classColor = $.grep(self.wowClasses, function(m,j) {
                return m.key == n.className;
              })[0].color;
              
              _p.fill(classColor);
              
              var newPos = oldPos + ((_p.width-spacer)*(n.count/total));
              _p.rect(oldPos,0,newPos-oldPos,rh);
              
              oldPos = Math.floor(newPos);
            });
          }
          p.init();
          
          var reject = $.grep(this[sudCol], function(n,i) {
            return n.signup_type == 2;
          });
          var rjTotal = 0;
          $.each(reject, function() { rjTotal += parseInt(this.count) });
          $("#cv-"+this[idCol]).parent('td').next('td').append('<span class="raid-good">'+(total-rest)+'</span>/<span class="raid-bad">'+rjTotal+'</span>');
	 
	  //all hover and click logic for buttons
	  $.each($('#cv-'+this[idCol]).parent('td').siblings('.raid_options').find('button:not(.ui-state-disabled)'), function () {
	      $(this).hover(
          function(){
              $(this).addClass("ui-state-hover");
          },
          function(){
              $(this).removeClass("ui-state-hover");
          }
        )
	      .mousedown(function(){
        })
	      .mouseup(function(){
          $(this).parents('.fg-buttonset-single:first').find(".fg-button.ui-state-active").removeClass("ui-state-active").removeClass("font-green").removeClass("font-red");
          _button = $(this);
          if ( $(this).is('.ui-corner-left') ) {
            $(this).addClass('font-green');
            var suType = 3;
          } else {
            $(this).addClass('font-red');
            var suType = 2;
          }
		  
          $.ajax({
            type: "GET",
            url: self.url,
            data: {mode: 'signup', signup_type: suType, raid: _jsonData[idCol]},
            beforeSend: function() {
              return !(_button.is('.ui-corner-left') && (_jsonData[usudCol].signup_type == 3))
            || (_button.is('.ui-corner-right') && (_jsonData[usudCol].signup_type == 2));
            },
            success: function(){
              var cls = $.grep(self.wowClasses, function(n) {
                return n.key == _jsonData[usudCol]['class'];
              })[0];
              var html = '<strong '+((suType == 3) ? 'class="raid-good">Angemeldet f&uuml;r:' : 'class="raid-bad">Abgemeldet f&uuml;r:')+'</strong>';
              html += '<br />'+_jsonData[locCol]+' ('+formatDate(new Date(_jsonData[rbCol]*1000), 'dd.MM.yy, HH:mm')+')';
	      if (suType != 2) {
		html += '<br /><span style="float:left">Char:&nbsp; </span><img src="images/guild/cls_'+cls.clsId+'.gif" style="float:left;" alt=""/>';
		html += '<span style="float:left">&nbsp;'+_jsonData[usudCol].name+'</span>';
	      }
              $.jGrowl(html, {glue: 'before'});
              self.loadEvents();
            }
          });
		  
          if( $(this).is('.ui-state-active.fg-button-toggleable, .fg-buttonset-multi .ui-state-active') ){
              $(this).removeClass("ui-state-active");
          }
          else {
              $(this).addClass("ui-state-active");
          }
          if(! $(this).is('.fg-button-toggleable, .fg-buttonset-single .fg-button,  .fg-buttonset-multi .fg-button') ){
              $(this).removeClass("ui-state-active");
          }
          
        })
        .mouseout(function() {
          if(! $(this).is('.fg-button-toggleable, .fg-buttonset-single .fg-button,  .fg-buttonset-multi .fg-button') ){
              $(this).removeClass("ui-state-active");
          }
	      });
	  });
	  
      if (this[usudCol]) {
	      $('#signup-type-'+this[usudCol].signup_type+'-'+this[idCol]).addClass('ui-state-active');
	      if ( $('#signup-type-'+this[usudCol].signup_type+'-'+this[idCol]).is('.ui-corner-left') ) {
          $('#signup-type-'+this[usudCol].signup_type+'-'+this[idCol]).addClass('font-green');
	      } else {
          $('#signup-type-'+this[usudCol].signup_type+'-'+this[idCol]).addClass('font-red');
	      }
        if (this[usudCol].signup_type == 3) {
          var cls = $.grep(self.wowClasses, function(n) {
            return n.key == _jsonData[usudCol]['class'];
          });
        
          $('#row-'+this[idCol]).children('.raid_comments').html(
            '<span class="img-correct">Du: </span>'+
            '<img src="images/guild/cls_'+cls[0].clsId+'.gif" alt=""/>'+
            '<span class="img-correct">'+this[usudCol].name+'</span>'
          );
        }
      }
      
      //make raid editable
      var row =  $('#row-'+this[idCol]);
      row.find('a.edit-raid-link').click(function(ev) {
	$('#create-raid-dialog').dialog('open');
	self.editRaidDialog(json.columns, _jsonData);
	ev.preventDefault();
      });
      //$('#delete-raid-id');
      row.find('a.delete-raid-link').click(function(ev) {
	$('#delete-raid-dialog').dialog('open');
	$('#delete-raid-id').val(_jsonData[idCol]);
	ev.preventDefault();
      });
    });
      $('#raid-list td.raid_signups2').textAlign('/').find('span:first').addClass('raid-good');
      $('#raid-list td.raid_signups2').find('span:last').addClass('raid-bad');
    }
  });
  },
  
  _arraySum: function(a) {
    var total = 0;
    $.each(a, function() { total += this });
    return total;
  },
  
  _getColIdx: function(cList,name) {
    return $.grep(cList, function(n,i) {
      return (n == name);
    })[0];
  }
});

var WoWClass = Class.extend({
  init: function() {
    this.c = new Array();
    this.c.push({key: 'deathknight', name: 'Todesritter', color: '#C41F3B', clsId: 6});
    this.c.push({key: 'druid', name: 'Druide', color: '#FF7D0A', clsId: 11});
    this.c.push({key: 'hunter', name: 'J&auml;ger', color: '#ABD473', clsId: 3});
    this.c.push({key: 'mage', name: 'Magier', color: '#69CCF0', clsId: 8});
    this.c.push({key: 'paladin', name: 'Paladin', color: '#F58CBA', clsId: 2});
    this.c.push({key: 'priest', name: 'Priester', color: '#FFFFFF', clsId: 5});
    this.c.push({key: 'rogue', name: 'Schurke', color: '#FFF569', clsId: 4});
    this.c.push({key: 'shaman', name: 'Schamane', color: '#2459FF', clsId: 7});
    this.c.push({key: 'warlock', name: 'Warlock', color: '#9482C9', clsId: 9});
    this.c.push({key: 'warrior', name: 'Krieger', color: '#C79C6E', clsId: 1});
    
    this.c = $(this.c).sort('name', 'asc');
    
  }
});
