ميدياويكي:Gadget-countdown-timer.js

من ويكيبيديا، الموسوعة الحرة

ملاحظة: بعد الحفظ، قد يلزمك إفراغ الكاش لرؤية التغييرات.

/**
 * Countdown Timer
 * 
 * works with [[:ar:Module:countdown]]
 * 
 * by [[:ar:User:حبيشان]]
 * 
 */
$( function() {
  var cdt = []
  var cdt_params = ['date1', 'date2', 'eventbefore', 'eventstart', 'eventstart2', 'eventend', 'event', 'other', 'color']
  const cminute=60,chour=cminute* 60, cday=chour*24, cweek=cday * 7;
  const time_parts_values = [cweek, cday, chour, cminute, 1]
  function get_parts(ms_time) {
    ret = {}
    ms_time = Math.floor(ms_time / 1000)
    ret.week = Math.floor(ms_time / cweek);
    ret.day = Math.floor((ms_time % cweek) / cday);
    ret.hour = Math.floor((ms_time % cday) / chour);
    ret.minute = Math.floor((ms_time % chour) / cminute);
    ret.second = Math.floor((ms_time % cminute));
    return ret
  }
  
  function formatMessage(text, ms_time, parts, color)
  {
    time_parts = ['week','day','hour','minute','second']
    var maj = (text.indexOf('@مدة مجرورة@')>-1)
    time_plural= [
      ['', 'أسبوع واحد', 'أسبوعان', 'أسابيع', 'أسبوعًا', 'أسبوعٍ'],
      ['', 'يوم واحد', 'يومان', 'أيام', 'يومًا', 'يومٍ'],
      ['', 'ساعة واحدة', 'ساعتان', 'ساعات', 'ساعةً', 'ساعةٍ'],
      ['', 'دقيقة واحدة', 'دقيقتان', 'دقائق', 'دقيقةً', 'دقيقةٍ'],
      ['', 'ثانية واحدة', 'ثانيان', 'ثوانٍ', 'ثانيةً', 'ثانيةٍ']
    ]
    var tt = get_parts(ms_time);
    var last_part;
    parts = (parts>0)? parts : 2;
    var part_count=0
    ret = '';
    for(var i = 0; i < time_parts.length; i++) {
      if (tt[time_parts[i]] > 0) {
        ret = ((ret.length>0)? ret + ' و' : '') + 
          ((tt[time_parts[i]] < 3) ? '' : ('<span style="color: ' + (color || '#F00') + '; font-weight: bold;">' + String(tt[time_parts[i]] + '</span> '))) + 
          ((tt[time_parts[i]]==2 && maj)? time_plural[i][2].slice(0,-2) + 'ين' : mw.language.convertPlural(tt[time_parts[i]], time_plural[i]));
        part_count ++;
        last_part = i;
        if (part_count>=parts) break;
      }
    }

    if (text !='') {
      ret=text.replace((maj? '@مدة مجرورة@': '@مدة@'), ret)
    }
    return [ret, last_part]
  }
  
  function update_cdt(i) {
    var time_to_start,time_to_end
    var text,last_part;
    cdt[i].parts = cdt[i].other && parseInt(cdt[i].other.substring(0,1)) || 2
    

    if (cdt[i].date1) {
      time_to_start = cdt[i].date1 - Date.now()
    }
    
    if (cdt[i].date2) {
      time_to_end = cdt[i].date2 - Date.now()
    }
    
    if (time_to_start>0) {
      cdt[i].eventbefore = cdt[i].eventbefore ||
        cdt[i].event && ('بقي @مدة@ على بداية «' + cdt[i].event + '».') || '';
      [text, last_part] = formatMessage(cdt[i].eventbefore, time_to_start, cdt[i].parts, cdt[i].color);
    } else if (time_to_end) {
      if (time_to_end > 0) {
        cdt[i].eventstart2 = cdt[i].eventstart2 ||
          cdt[i].event &&  ("بداية «" + cdt[i].event + "» وستكون النهاية بعد @مدة مجرورة@") || '';
        [text, last_part] = formatMessage(cdt[i].eventstart2, time_to_end, cdt[i].parts,cdt[i].color);
      } else {
        text = cdt[i].eventend || cdt[i].event && ("انتهاء «" + cdt[i].event + "».") || '';
      }
    } else {
      text = cdt[i].eventstart || cdt[i].event && ("بداية «" + cdt[i].event + '».') || '';
    }
    
    $('#cdt' + i + ' .cdt-ret')[0].innerHTML = text;
    
    if (last_part) {
      var ms = (new Date()) % (time_parts_values[last_part] * 1000);
      setTimeout( function () {
        update_cdt(i);
      }, (time_parts_values[last_part] * 1000) + 100 - ms );
    }
  }
  
  
  l = $('.countdown-timer')
  for (i = 0; i < l.length; i++) {
    l[i].id = 'cdt' + i
    cdt[i] = { 'element': l[i] }
    for (var j = 0; j < cdt_params.length; j++) {
      param = $('#cdt' + i + ' .cdt-param-' + cdt_params[j]);
      if (param.length) {
        if (cdt_params[j].slice(0, -1) == 'date') {
          cdt[i][cdt_params[j]] = new Date(param[0].textContent.substring(0, 19) + 'Z')
        } else {
          cdt[i][cdt_params[j]] = param[0].textContent
        }
      }
    }
    update_cdt(i);
  }
  });