mmoodi / jira-greenweb

// ==UserScript==
// @name         jira-greenweb
// @namespace    http://tampermonkey.net/
// @license      MIT
// @version      0.2
// @description  try to take over the world!
// @author       You
// @match        http://jira.greenweb.local/*
// @grant        none
// ==/UserScript==


$(document).ready(function () {

    JalaliDate = {
        g_days_in_month: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        j_days_in_month: [31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29]
    };

    JalaliDate.gregorianToJalali = function(g_y, g_m, g_d) // تابع تبدیل تاریخ میلادی به جلالی
    {
        g_y = parseInt(g_y);
        g_m = parseInt(g_m);
        g_d = parseInt(g_d);
        var gy = g_y-1600;
        var gm = g_m-1;
        var gd = g_d-1;

        var g_day_no = 365*gy+parseInt((gy+3) / 4)-parseInt((gy+99)/100)+parseInt((gy+399)/400);

        for (var i=0; i < gm; ++i)
            g_day_no += JalaliDate.g_days_in_month[i];
        if (gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0)))
            /* leap and after Feb */
            ++g_day_no;
        g_day_no += gd;

        var j_day_no = g_day_no-79;

        var j_np = parseInt(j_day_no/ 12053);
        j_day_no %= 12053;

        var jy = 979+33*j_np+4*parseInt(j_day_no/1461);

        j_day_no %= 1461;

        if (j_day_no >= 366) {
            jy += parseInt((j_day_no-1)/ 365);
            j_day_no = (j_day_no-1)%365;
        }

        for (i = 0; i < 11 && j_day_no >= JalaliDate.j_days_in_month[i]; ++i) {
            j_day_no -= JalaliDate.j_days_in_month[i];
        }
        var jm = i+1;
        var jd = j_day_no+1;

        return [jy, jm, jd];
    };

    function convert(month) { // تبدیل ماه ها به جلالی و بالعکس
        switch (month) {
            case 'Jan' : return '1'  ;
            case 'Feb' : return '2'  ;
            case 'Mar' : return '3'  ;
            case 'Apr' : return '4'  ;
            case 'Nov' : return '11' ;
            case 'Dec' : return '12' ;
            case '1' : return 'Jan'  ;
            case '2' : return 'Feb'  ;
            case '3' : return 'Mar'  ;
            case '4' : return 'Apr'  ;
            case '11' : return 'Nov' ;
            case '12' : return 'Dec' ;
            default: return "Dec";
        }
    }

    function covertweek (week) { // تبدیل روزهای هفته
        switch (week) {
            case 'Mon' : return 'دوشنبه' ;
            case 'Tue' : return 'سه شنبه' ;
            case 'Wed' : return 'چهارشنبه' ;
            case 'Thu' : return 'پنجشنبه' ;
            case 'Fri' : return 'جمعه' ;
            case 'Sat' : return 'شنبه' ;
            case 'Sun' : return 'یکشنبه' ;
            case 'Today' : return 'امروز' ;
        }

    }

    function DIssue () {
        var val = $('#due-date time').attr('datetime');
        val = val.split('-');
        var test=JalaliDate.gregorianToJalali(val[0], val[1], val[2]);
        $('#due-date time').append('<time class="duedate_jalili">'+test[0] + "/" + test[1] + "/" + test[2]+'</time>');
    }

    // تابع کلی برای تبدیل تاریخ میلادی به جلالی
    function ChDate() {

        /* شروع تابع تبدیل تاریخ داخل جدول ها */
        $('.issue-table > tbody  > tr').each(function(){
            if($(this).hasClass('changedtojalali') == false){ // وقتی یک تگ کلاس 'changedtojalali' داشته باشد یعنی تبدیل تاریخ روی آن تگ انجام شده است.
                $(this).addClass('changedtojalali');
                var val = $('.duedate',this).text();
                var val2 = $('.duedate',this).text();
                val = val.split('/');
                var test=JalaliDate.gregorianToJalali(20+val[2], convert(val[1]), val[0]);
                $('.duedate',this).text(test[0] + "/" + test[1] + "/" + test[2]);
                if($('.duedate',this).text() == "NaN/1/NaN"){ // بررسی معتبر بودن تاریخ پس از تغییر
                    $('.duedate',this).text("");
                }else{
                    $('.duedate',this).append('<span class="ddata-tooltip">'+ val2 +'</span>');
                }
            }
        });
        /* پایان تابع تبدیل تاریخ داخل جدول ها */

        /* تغییر تاریخ داخل تگ های time */
        $('.action-details span.date, #viewissuesidebar .user-tz, .user-tz').each(function(){
            if($(this).hasClass('changedtojalali') == false){ // وقتی یک تگ کلاس 'changedtojalali' داشته باشد یعنی تبدیل تاریخ روی آن تگ انجام شده است.
                $(this).addClass('changedtojalali');
                var val = $('.livestamp',this).attr('datetime').split('T'); // دریافت تاریخ از اتربیوت datetime از کلاس livestamp , date format : YYYY-MM-DDTH:M:S+0330
                var mdate = val[0].split('-');
                var newdate = JalaliDate.gregorianToJalali(mdate[0], mdate[1], mdate[2]);
                newdate = newdate[0] + "/" + newdate[1] + "/" + newdate[2];
                var newdate2 = mdate[2] + "/" + convert(mdate[1]) + "/" + (mdate[0]-2000);
                var newtime = val[1].split(':');
                newtime = newtime[0] + ":" + newtime[1];
                $(this).html(newdate + " " + newtime); // چاپ تاریخ جدید در تگ مورد نظر
                $(this).removeAttr('title');
                $(this).append('<span class="ddata-tooltip">' + newdate2 + " " + newtime + '</span>');
            }
        });
        /* تغییر تاریخ داخل تگ های time */

        /* تغییر تمامی تاریخ های داخل قسمت Project pages -> Tempo Part */
        $("#tempo-content").each(function(){
            var mdate = $('.date',this).html(); // دریافت تاریخ از تگ مورد نظر
            var mdate2 = $('.date',this).html();
            if($(this).hasClass('changedtojalali') == false){ // وقتی یک تگ کلاس 'changedtojalali' داشته باشد یعنی تبدیل تاریخ روی آن تگ انجام شده است.
                $('.date',this).addClass('changedtojalali');
                mdate = mdate.split('-');
                var datepart1 = mdate[0].split('/');
                var datepart2 = mdate[1].split('/');
                var newdate1 = JalaliDate.gregorianToJalali(20+datepart1[2], convert(datepart1[1]), datepart1[0]);
                newdate1 = newdate1[0] + "/" + newdate1[1] + "/" + newdate1[2];
                var newdate2 = JalaliDate.gregorianToJalali(20+datepart2[2], convert(datepart2[1]), datepart2[0]);
                newdate2 = newdate2[0] + "/" + newdate2[1] + "/" + newdate2[2];
                $('.date',this).html(newdate1 + " - " + newdate2);
                $('.date',this).css('width','180px');
                $('.date',this).append('<span class="ddata-tooltip">' + mdate2 + '</span>'); // اضافه کردن تولتیپ
            }
        });
       /* تغییر تمامی تاریخ های داخل قسمت Project pages -> Tempo Part */

        /* تغییر تاریخ های داخل قسمت  Tempo pages -> Timesheets -> weekdays dates */
        $("._canvas__day_header_content___1b06_").each(function(){
            if($(this).hasClass('changedtojalali') == false){ // وقتی یک تگ کلاس 'changedtojalali' داشته باشد یعنی تبدیل تاریخ روی آن تگ انجام شده است.
                var day = $('._canvas__name_of_day___UsEQR', this).text();
                day = covertweek(day);
                $('._canvas__name_of_day___UsEQR', this).html(day);
                $(this).addClass('changedtojalali');
                var mdate = $("._canvas__header_date___2tBnp",this).html(); // دریافت تاریخ میلادی از تگ مورد نظر
                mdate = mdate.split('.');
                var newdate = JalaliDate.gregorianToJalali(2018, mdate[1], mdate[0]);
                $("._canvas__header_date___2tBnp",this).html(newdate[2] + "." + newdate[1]); // ست کردن تاریخ جلالی روی تگ مورد نظر
            }
        });
         /* تغییر تاریخ های داخل قسمت  Tempo pages -> Timesheets -> weekdays dates */

        /* تغییر تاریخ تولتیپ های پایین قسمت جدول انتخاب تاریخ جدید (pickdate) */
        $(".calendar table>tfoot tr.footrow").each(function(){
            if($('td',this).hasClass('changedtojalali') == false){ $(this).append('<td colspan="8" class="changedtojalali"></td>'); }
            var olddate = $('td.ttip',this).html(); // دریافت تاریخ میلادی
            olddate = olddate.split(' ');
            if($.isNumeric(olddate[2])){ // چک کردن صحیح بودن تاریخ که باید عدد باشد
                olddate[0] = olddate[0].replace(',', '');
                var day = covertweek(olddate[0]); // تغییر نام روز هفته به جلالی
                var newdate = JalaliDate.gregorianToJalali(2018,olddate[1],olddate[2]);
                $('.changedtojalali',this).html(day + " " + newdate[1] + "/" + newdate[2]); // خیره تاریخ جدید در تگ جدید ساخته شده در خط 176
                $('.calendar table>tfoot tr.footrow>td.ttip').hide(); // پنهان کردن تگ اصلی حاوی تاریخ میلادی
                $('.calendar table>tfoot tr.footrow>td.changedtojalali').show();
            }
        });
        /* تغییر تاریخ تولتیپ های پایین قسمت جدول انتخاب تاریخ جدید (pickdate) */

        /* تغییر تاریخ های داخل ورودی ها (inputs) */
        $('.field-group input[size="7"], .field-group input[id="duedate"], .tempo-field-group input.tempo-date-field').each(function(){
            var val = $(this).val();
            val = val.split('/');
            if($.isNumeric(val[1]) != true){ // چک کردن ماه تاریخ مورد نظر که نبایستی عدد باشد
                var newdate = JalaliDate.gregorianToJalali(20+val[2],convert(val[1]),val[0]);
                newdate = newdate[0] + "/" + newdate[1] + "/" + newdate[2];
                if(newdate != "NaN/1/NaN"){ // تایخ جلالی درست شده آیا معتبر است؟
                    $(this).val(newdate);
                }
            }
        });
         /* تغییر تاریخ های داخل ورودی ها (inputs) */

        /* روند نمایش تولتیپ های درست شده */
        $('#tempo-content, .issuePanelWrapper .action-details, #viewissuesidebar, .dashboard-item-content, .issue-table > tbody  > tr').each(function(){
            $('.date, .user-tz, .duedate',this).mouseenter(function(){
                $('.ddata-tooltip',this).show();
            });
            $('.date, .user-tz, .duedate',this).mouseleave(function(){
                $('.ddata-tooltip',this).hide();
            });
            var myFrame = $('.gadget-iframe',this).contents().find('.gadgetHeaderDiv h5.dateHeader');
            myFrame.mouseenter(function(){
                $('.ddata-tooltip',this).show();
            });
            myFrame.mouseleave(function(){
                $('.ddata-tooltip',this).hide();
            });
        });
        /* روند نمایش تولتیپ های درست شده */

        $('.dashboard-item-content .gadget-iframe').each(function(){
            if($(this).hasClass('changedtojalali') == false){ // وقتی یک تگ کلاس 'changedtojalali' داشته باشد یعنی تبدیل تاریخ روی آن تگ انجام شده است.
                var myFrame = $(this).contents().find('.gadgetHeaderDiv h5.dateHeader'); // دریافت اطلاعات داخل تگ آی فریم مود نظر و پیدا کردن تاریخ میلادی موجود در آن
                var olddate = myFrame.text();
                if(olddate != ''){ // بررسی خالی نبودن تگ میلادی
                    $(this).addClass('changedtojalali');
                    olddate = olddate.split('-');
                    var date_part1 = olddate[0].split('/');
                    var date_part2 = olddate[1].split('/');
                    date_part1 = JalaliDate.gregorianToJalali(20+date_part1[2],convert(date_part1[1]),date_part1[0]);
                    date_part2 = JalaliDate.gregorianToJalali(20+date_part2[2],convert(date_part2[1]),date_part2[0]);
                    myFrame.html(date_part1[0] + "/" + date_part1[1] + "/" + date_part1[2] + " - " + date_part2[0] + "/" + date_part2[1] + "/" + date_part2[2]); // اضافه کردن تاریخ جلالی
                    myFrame.append('<span class="ddata-tooltip">' + olddate[0] + "-" + olddate[1] + '</span>'); // اضافه کردن تولتیپ تاریخ جلالی
                }
            }
        });

        /*$('._header__day_navigation_date___2wvF3>span').each(function(){
            if($(this).hasClass('changedtojalali') == false){
                $(this).addClass('changedtojalali');
                var datedate = $(this).text();
                datedate = datedate.split(' - ');
                var datepart1 = datedate[0].split(' ');
                var datepart2 = datedate[1].split(', ');
                var newdate1 = JalaliDate.gregorianToJalali(datepart2[1],convert(datepart1[0]),datepart1[1]);
                var newdate2 = JalaliDate.gregorianToJalali(datepart2[1],convert(datepart1[0]),datepart2[0]);
                var newdate = newdate1[0] + "/" + newdate1[1] + "/" + newdate1[2] + " - " + newdate2[0] + "/" + newdate2[1] + "/" + newdate2[2];
                $(this).html(newdate);
            }
        });*/

    }

    setInterval(function(){ ChDate(); },800); // اجرای تابع مورد نظر هر 800 میلی ثانیه برای چک کردن وجود داشتن تاریخ های میلادی و تبدیل آن به جلالی
    setTimeout(DIssue,1500); // اجرای تابع مورد نظر بعد از 1500 میلی ثانیه صبر

});