﻿
Base.Karma = Class.create();

Base.Karma.pop = function(e, username, number, target, postId, postDataId)
{
   if(Base.Karma.current)
   {
      if(confirm('You already have a Karma dialog open.\n\nWould you like to close the current dialog and give someone else Karma?'))
         Base.Karma.current.close();
      else
         return;
   }
   
   if(!e.hide) Sd.Proto.extend(e);
   var bounds = $id(e.id.replace('_LinkKarma', '_Reply'))._bounds();
   var x = e._bounds().x + 10;
   var y = bounds.y + 10;
   var caption = 'Give ' + username + ' Karma';
   var content = $new('div', null, 'karma');
   var msg = $new('div', null, 'msg');
   var rrow = $new('div', null, 'row');
   var nrow = $new('div', null, 'row');
   var rlabel = $new('label');
   var nlabel = $new('label', null, 'number');
   var rtext = $new('textarea');
   var nselect = $new('select');

   msg.innerHTML = 'Karma is a way of letting other users know who is helpful, nice, or just a fun person. Only give someone Karma if you feel they deserve it.';      
   
   for(var i=number;i>0;i--)
      nselect.options[number - i] = new Option('+' + (i) + ' Karma', i);

   nlabel.innerHTML = 'How Much:';
   
   nrow.appendChild(nlabel);
   nrow.appendChild(nselect);
   
   rlabel.innerHTML = 'The Reason:';
   rtext.maxLength = 255;
   
   rrow.appendChild(rlabel);
   rrow.appendChild(rtext);

   content.appendChild(msg);
   content.appendChild(nrow);
   content.appendChild(rrow);
   
   var data = new Object();
   data.target = target;
   data.postId = postId;
   data.postDataId = (postDataId == null) ? 0 : postDataId;
   
   var fsend = Function.createDelegate(data, Base.Karma.give);
   var fforget = function(){ this.dialog.close() };
   var buttons = {givekarma: fsend, forgetit: fforget};
   
   Base.Karma.current = new Base.UI.Dialog('_KarmaDialog', Base.UI.Dialog.type.small, buttons , x, y, caption, content, Base.Karma.onClose);
   
   Base.Karma.current.data = data;
   nselect.id = Base.Karma.current.id + '_DropDownKarma';
   rtext.id = Base.Karma.current.id + '_TextKarma';
};

Base.Karma.onClose = function()
{
   Base.Karma.current = null;
};

Base.Karma.give = function()
{
   var s = $id(Base.Karma.current.id + '_DropDownKarma');
   var num = s.options[s.selectedIndex].value;
   var reason = $id(Base.Karma.current.id + '_TextKarma').value;
   
   var err = '';
   if(num < 0) err = 'Please select how much Karma to give.';
   if(!reason || reason.length < 6) err += 'Please enter a reason why you are giving Karma (minimum 6 characters).';
   if(err && err.length > 0){ alert(err); return; };

   Base.Karma.current.disable();
   ForumService.GiveKarma(num, Base.Karma.current.data.target, reason, Base.Karma.current.data.postId, Base.Karma.current.data.postDataId, Base.Karma.callback, Base.Karma.error);
};

Base.Karma.error = function(res)
{
   alert('An error occurred:\n\n' + res.get_message() + '\n\n' + res.get_stackTrace() + '\n\n' + res.get_statusCode() + '\n\n' + res.get_stackTrace());
};

Base.Karma.callback = function(res)
{
   var msg;
   var result = (res.Code == Stardock.Web.UI.Services.ServiceResultCode.Success);
   if(result == true)
      msg = 'You gave karma to ' + res.Obj.TargetName + '.';
   else
   {
      
      if(res.Obj.Code == Stardock.Posts.Forums.KarmaResult_ResultCode.LimitError)
         msg = 'You can only give someone karma once every 10 minutes. Please try again later.';   
      else
         msg = 'You were unable to give ' + res.Obj.TargetName +' karma. An error occurred. Please try again later.';
   }
      
   Base.Karma.current.clearContent();
   Base.Karma.current.clearMask();
   Base.Karma.current.clearButtons();
   Base.Karma.current.addResult(result, msg);
   Base.Karma.current.addButtons({close:function(){this.dialog.close();}});
};