var ArticleRate = {
  SERVLET_URI: '/rate.do?oper=rateArticle&value(rate_value)=%vote%&value(xx_product)=%xx%&value(xx_section)=%xxd%',
  ELEM_ID: 'articleToolbar',
  SUB_ELEM_ID: 'articleRate',
  VOTE_COUNTER_ID: 'articleToolbarVoteCount',
  AJAX_STATUS_OK: 'OK',
  AJAX_STATUS_WARNING: 'WARNING',
  MESSAGE_DISPLAY_TIME: 5000, // ms

  target: null,
  targetSub: null,
  targetList: null,
  targetListItem: null,
  voteCounter: null,
  msg: null,

  trim: function(x) { return x.replace(/^\s+|\s+$/g, ''); },
  hasClass: function(o, x) { return (' '+o.className+' ').match(' '+x+' ') != null; },
  addClass: function(o, x) { if (!ArticleRate.hasClass(o, x)) o.className = ArticleRate.trim(o.className + ' ' + x); },
  removeClass: function(o, x) { if (ArticleRate.hasClass(o, x)) o.className = ArticleRate.trim((' '+o.className+' ').replace(' '+x+' ', '')); },
  swapClass: function(o, x, y) { ArticleRate.removeClass(o, x); ArticleRate.addClass(o, x); },

  addEvent: function(obj, type, fn) { 
    try { 
      if (obj.addEventListener) { 
        obj.addEventListener(type, fn, false); 
      } else if (obj.attachEvent) { 
        obj["e"+type+fn] = fn; 
        obj[type+fn] = function() { 
          obj["e"+type+fn](window.event); 
        }; 
        obj.attachEvent("on"+type, obj[type+fn]); 
      }
    } catch (e) {}
  },

  ajax: function(url, success, error) {
    var request = new XMLHttpRequest();
    if (!request) return;
    request.open('GET', url, true);
    request.onreadystatechange = function(e) {
      if (request.readyState == 4) {
        if (request.status == 200) {
          if (success && typeof success == 'function') {
            try {
              eval('var json = '+request.responseText+';');
              success(json);
            } catch(e) {
              if (error && typeof error == 'function') error(e);
            };
          }
        } else {
          if (error && typeof error == 'function') error(e);
        };
      };
    };
    request.send(null);
  },

  init: function() {
    var ar = ArticleRate;
    ar.target = document.getElementById(ar.ELEM_ID);
    if (!ar.target) return;
    ar.targetSub = document.getElementById(ar.SUB_ELEM_ID);
    if (!ar.targetSub) return;
    ar.targetList = ar.targetSub.getElementsByTagName('ul')[0];   
    ar.targetListItem = ar.targetList.getElementsByTagName('li');
    ar.voteCounter = document.getElementById(ar.VOTE_COUNTER_ID);
    
    for (var i = 0, l = ar.targetListItem.length; i < l; i++) {
      ar.targetListItem[i].arIndex = i;
      ar.addEvent(ar.targetListItem[i], 'mouseover', ar.onMouseOver);
      ar.addEvent(ar.targetListItem[i], 'mouseout', ar.onMouseOut);
      ar.addEvent(ar.targetListItem[i], 'click', ar.onClick);
    };

  },

  onMouseOver: function(e) {
    var ar = ArticleRate;
    
    if (ar.hasClass(ar.target, 'locked')) return false;

    var el; if (window.event && window.event.srcElement) { el = window.event.srcElement; }; if (e && e.target) { el = e.target; }; if (!el) { return; }; (e.preventDefault) ? e.preventDefault() : (e.returnValue = false);

    while (el && typeof el.arIndex == 'undefined') el = el.parentNode;
    if (!el) return;
    if (ar.hasClass(el, 'message')) return;

    ar.target.className = 'atVotePos_'+el.arIndex;
  },

  onMouseOut: function(e) {
    var ar = ArticleRate;
    if (ar.hasClass(ar.target, 'locked')) return false;

    var el; if (window.event && window.event.srcElement) { el = window.event.srcElement; }; if (e && e.target) { el = e.target; }; if (!el) { return; }; (e.preventDefault) ? e.preventDefault() : (e.returnValue = false);

    while (el && typeof el.arIndex == 'undefined') el = el.parentNode;
    if (!el) return;
    if (ar.hasClass(el, 'message')) return;

    ar.target.className = '';
  },

  onClick: function(e) {
    var ar = ArticleRate;
    if (ar.hasClass(ar.target, 'locked')) return false;

    var el; if (window.event && window.event.srcElement) { el = window.event.srcElement; }; if (e && e.target) { el = e.target; }; if (!el) { return; }; (e.preventDefault) ? e.preventDefault() : (e.returnValue = false);

    while (el && typeof el.arIndex == 'undefined') el = el.parentNode;
    if (!el) return;

    var data = { vote: el.arIndex+1, xx: ra_artxx, xxd: ra_dxx };
    var uri = ar.SERVLET_URI.replace(/%(.*?)%/g, function(_, x) { return data[x]; });
    ar.target.className = 'locked atVotePos_'+el.arIndex;

    var liMsg = document.createElement('li');
    liMsg.className = 'message';
    liMsg.innerHTML = 'Wysyłanie oceny...';

    ar.targetList.appendChild(liMsg);
    ar.msg = liMsg;

    ar.ajax(uri, ar.onAjaxSuccess, ar.onAjaxError);
  },

  onAjaxSuccess: function(msg) {
    var ar = ArticleRate;

    switch (msg.state) {
    case ar.AJAX_STATUS_OK:
      ar.displayMessage('Dziękujemy za ocenę');
      var newNote = parseInt(msg.avgRateInt)+msg.isHalf?'5':'0';
      ar.targetList.parentNode.className = 'atVote note_'+newNote;
      var newCount = parseInt(msg.ratesCount);
      var newCountCaption = 'głosów';
      
      if (newCount == 1) newCountCaption = 'głos';
      if (newCount % 10 > 1 && newCount % 10 < 5) newCountCaption = 'głosy';
      ar.voteCounter.innerHTML = newCount + ' ' + newCountCaption;

      break;
    case ar.AJAX_STATUS_WARNING:
      ar.displayMessage('Już oceniałeś ten artykuł');
      break;
    default:
      ar.onAjaxError();
    };

  },

  onAjaxError: function() {
    ArticleRate.displayMessage('Błąd podczas wysyłania oceny');
  },

  displayMessage: function(str) {
    ArticleRate.msg.innerHTML = str;
    window.setTimeout(function() {
      ArticleRate.targetList.removeChild(ArticleRate.msg);
    }, ArticleRate.MESSAGE_DISPLAY_TIME);
  }
};

ArticleRate.addEvent(window, 'load', ArticleRate.init);






