Large

Sharepoint Persian Calendar

By ramz@dbrg Last update Oct 20, 2012 — Installed 1,535 times.

There are 34 previous versions of this script.

// ==UserScript==
// @name          Universal Gregorian2Jalali Date Converter
// @namespace     
// @description	  Finding all gregorian date in all webpages (including sharepoint 2003,2007 and 2010 portals) and convert them to jalali date ! 
// @author        www.ResearchInformationSystem.ir
// @homepage      www.ResearchInformationSystem.ir
// @include       *  
// ==/UserScript==



var $;
var JQdefined = false;
// Add jQuery
(function () {
       
	if (typeof unsafeWindow.jQuery == 'undefined') {
    
		CreateScript('http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');
	} else JQdefined = true;

	
	GM_wait();

})();

// Check if jQuery's loaded
function GM_wait() {

    if (!JQdefined && typeof unsafeWindow.jQuery == 'undefined') {
		window.setTimeout(GM_wait, 500);
	} else {
		if (!JQdefined) $ = unsafeWindow.jQuery.noConflict(true); else $ = unsafeWindow.jQuery;
		//InitDatePickerScript();
	
        DoConvertProcess();
	}
}

function CreateScript(src) {
	var GM_Head = document.getElementsByTagName('head')[0] || document.documentElement,
	
	GM_JQ = document.createElement('script');

	GM_JQ.src = src;
	GM_JQ.type = 'text/javascript';
	GM_JQ.async = true;

	GM_Head.insertBefore(GM_JQ, GM_Head.firstChild);
}


 function addStyle( css ) {
	  var style = document.createElement( 'style' );
	  style.type = 'text/css';
	  var head = document.getElementsByTagName('head')[0] || document.documentElement;
	  head.appendChild( style );
	  if( style.styleSheet )  // IE
		 style.styleSheet.cssText = css;
	  else  // other browsers
		 style.appendChild( document.createTextNode(css) );
	  return style;
   }


function SetDatePickerToInputs(){
   // $("input").calendarsPicker();
//	$("input").calendarsPicker({calendar: $.calendars.instance('Thai')});
}

function InitDatePickerScript() {
//	CreateScript('http://keith-wood.name/js/jquery.calendars.js');
//	CreateScript('http://keith-wood.name/js/jquery.calendars.plus.js');
//	addStyle('@import "http://keith-wood.name/css/jquery.calendars.picker.css";');
//	CreateScript('http://keith-wood.name/js/jquery.calendars.picker.js');
//	CreateScript('http://keith-wood.name/js/jquery.calendars-fa.js');
//	CreateScript('http://keith-wood.name/js/jquery.calendars.picker-fa.js');
//	CreateScript('http://keith-wood.name/js/jquery.calendars.persian.js');
}

function validateUSDate(strValue) {
	var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

	//check to see if in correct format
	if (!objRegExp.test(strValue))
		return false; //doesn't match pattern, bad date
	else {
		var strSeparator = strValue.substring(2, 3)
		var arrayDate = strValue.split(strSeparator);
		//create a lookup for months not equal to Feb.
		var arrayLookup = { '01': 31, '03': 31,
			'04': 30, '05': 31,
			'06': 30, '07': 31,
			'08': 31, '09': 30,
			'10': 31, '11': 30, '12': 31
		}
		var intDay = parseInt(arrayDate[1], 10);

		//check if month value and day value agree
		if (arrayLookup[arrayDate[0]] != null) {
			if (intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
				return true; //found in lookup table, good date
		}

		//check for February (bugfix 20050322)
		//bugfix  for parseInt kevin
		//bugfix  biss year  O.Jp Voutat
		var intMonth = parseInt(arrayDate[0], 10);
		if (intMonth == 2) {
			var intYear = parseInt(arrayDate[2]);
			if (intDay > 0 && intDay < 29) {
				return true;
			}
			else if (intDay == 29) {
				if ((intYear % 4 == 0) && (intYear % 100 != 0) ||
			 (intYear % 400 == 0)) {
					// year div by 4 and ((not div by 100) or div by 400) ->ok
					return true;
				}
			}
		}
	}
	return false; //any other values, bad date
}



function ConvertJDateObjToG(aDateStr) {
	var parts = aDateStr.split("/");
	if (parts[0].length != 4 || parts[1].length != 2 || parts[2].length != 2) return aDateStr;
	if (parseInt(parts[0]*1) > 1900) return aDateStr;
	return JTG(parts[0],parts[1],parts[2], 'a');
}


function ConvertGDateObjToJalali(aDateStr) {
	var ocd = new Date(aDateStr);
	if (!ocd.getFullYear()) return aDateStr;
	var jd = GTJ(ocd.getFullYear(), (ocd.getMonth() + 1), ocd.getDate(), 'a');
	return jd;
}

//void jalali_to_gregorian(
function JTG(
	j_y,
	j_m,
	j_d,
	choice) {
	var g_days_in_month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var j_days_in_month = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
	var j_month_name = new Array("", "Farvardin", "Ordibehesht", "Khordad", "Tir",
						  "Mordad", "Shahrivar", "Mehr", "Aban", "Azar",
						  "Dey", "Bahman", "Esfand");

	var gy, gm, gd;
	var jy, jm, jd;
	var g_day_no, j_day_no;
	var leap;

	var i;

	jy = j_y - 979;
	jm = j_m - 1;
	jd = j_d - 1;

	j_day_no = 365 * jy + Math.floor(jy / 33) * 8 + Math.floor((jy % 33 + 3) / 4);
	for (i = 0; i < jm; ++i)
		j_day_no += j_days_in_month[i];

	j_day_no += jd;

	g_day_no = j_day_no + 79;

	gy = 1600 + 400 * Math.floor((g_day_no) / (146097)); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
	g_day_no = g_day_no % 146097;

	leap = 1;
	if (g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
	{
		g_day_no--;
		gy += 100 * Math.floor((g_day_no) / (36524)); /* 36524 = 365*100 + 100/4 - 100/100 */
		g_day_no = g_day_no % 36524;

		if (g_day_no >= 365)
			g_day_no++;
		else
			leap = 0;
	}

	gy += 4 * Math.floor((g_day_no) / (1461)); /* 1461 = 365*4 + 4/4 */
	g_day_no %= 1461;

	if (g_day_no >= 366) {
		leap = 0;

		g_day_no--;
		gy += Math.floor((g_day_no) / (365));
		g_day_no = g_day_no % 365;
	}

	for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++)
		g_day_no -= g_days_in_month[i] + (i == 1 && leap);
	gm = i + 1;
	gd = g_day_no + 1;

	var strgm = new String(gm);
	var strgd = new String(gd);

	if (gm < 10)
		strgm = "0" + gm;
	if (gd < 10)
		strgd = "0" + gd;

	if (choice == 'y' || choice == 'Y')
		return String(gy);
	else if (choice == 'm' || choice == 'M')
		return strgm;
	else if (choice == 'd' || choice == 'D')
		return strgd;
	else
		return String(gy) + '/' + strgm + '/' + strgd;

}


//function gregorian_to_jalali
function GTJ(
	g_y,
	g_m,
	g_d,
	choice
	) {
	var g_days_in_month = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var j_days_in_month = new Array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
	var j_month_name = new Array("", "Farvardin", "Ordibehesht", "Khordad", "Tir",
						  "Mordad", "Shahrivar", "Mehr", "Aban", "Azar",
						  "Dey", "Bahman", "Esfand");

	var gy, gm, gd;
	var jy, jm, jd;
	var g_day_no, j_day_no;
	var j_np;

	var i;
	gy = g_y - 1600;
	gm = g_m - 1;
	gd = g_d - 1;

	g_day_no = 365 * gy + Math.floor((gy + 3) / 4) - Math.floor((gy + 99) / 100) + Math.floor((gy + 399) / 400);
	for (i = 0; i < gm; ++i)
		g_day_no += 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;

	j_day_no = g_day_no - 79;

	j_np = Math.floor(j_day_no / 12053);
	j_day_no %= 12053;

	jy = 979 + 33 * j_np + 4 * Math.floor((j_day_no / 1461));
	j_day_no %= 1461;

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

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

	var strjm = new String(jm);
	var strjd = new String(jd);

	if (jm < 10)
		strjm = "0" + jm;
	if (jd < 10)
		strjd = "0" + jd;

	if (choice == 'y' || choice == 'Y')
		return String(jy);
	else if (choice == 'm' || choice == 'M')
		return strjm;
	else if (choice == 'd' || choice == 'D')
		return strjd;
	else
		return  String(jy) + '/' + strjm + '/' +  strjd;
}



var jMonth=new Array(12);
jMonth["ژانویه"]="دی";
jMonth["ژانويه"]="دی";
jMonth["فوريه"]="بهمن";
jMonth["مارس"]="اسفند";
jMonth["آوريل"]="فروردین";
jMonth["مى"]="اردیبهشت";
jMonth["ژوئن"]="خرداد";
jMonth["ژوئيه"]="تیر";
jMonth["اوت"]="مرداد";
jMonth["سپتامبر"]="شهریور";
jMonth["اُكتبر"]="مهر";
jMonth["نوامبر"]="آبان";
jMonth["دسامبر"]="آذر";

	 	
 	
jMonth["January"]="دی";
jMonth["February"]="بهمن";
jMonth["March"]="اسفند";
jMonth["April"]="فروردین";
jMonth["May"]="اردیبهشت";
jMonth["June"]="خرداد";
jMonth["July"]="تیر";
jMonth["August"]="مرداد";
jMonth["September"]="شهریور";
jMonth["October"]="مهر";
jMonth["November"]="آبان";
jMonth["December"]="آذر";


	

jMonth["Jan"]="دی";
jMonth["Feb"]="بهمن";
jMonth["Mar"]="اسفند";
jMonth["Apr"]="فروردین";
jMonth["May"]="اردیبهشت";
jMonth["Jun"]="خرداد";
jMonth["Jul"]="تیر";
jMonth["Aug"]="مرداد";
jMonth["Sep"]="شهریور";
jMonth["Oct"]="مهر";
jMonth["Nov"]="آبان";
jMonth["Dec"]="آذر";

function ConvertSharePoint2010Date() {
$("td[evtid=day] div nobr").filter(function () {
    var ocd=new Date( this.parentNode.parentNode.getAttribute("date"));
	this.innerHTML= GTJ(ocd.getFullYear(), (ocd.getMonth() + 1), ocd.getDate(), 'a');
});

$("span[class=ms-acal-display]").filter(function () {
	SearchAndReplaceGDates(this);	
});


$("td[class=ms-picker-monthcenter] a").filter(function () {
			if (this.parentNode.getAttribute("onclick").indexOf("ClickDay") > -1) {
				var hr = new String(this.parentNode.getAttribute("onclick"));
				hr = hr.replace("javascript:ClickDay('", "");
				hr = hr.replace("\\u002f", "/");
				hr = hr.replace("\\u002f", "/");
				hr = hr.replace("')", "");
				var ocd = new Date(hr);
				jd = GTJ(ocd.getFullYear(), (ocd.getMonth() + 1), ocd.getDate(), 'a');
				for(i in jMonth) {
				 if (this.innerHTML.indexOf(i)>-1){
					ReplaceValue(this,i,jMonth[i]);	
				 }
				}
				this.title = jd;
			}
});


}


function ConvertSharePointDate(){
	var firstcd=true;
	$("a").filter(function () {
		if (this.getAttribute("href") && this.getAttribute("href").indexOf("javascript:MoveToViewDate('") > -1
			&& this.getAttribute("href").indexOf(",'Day'") > -1
			) {

			var oc = this.getAttribute("href");
			oc = oc.substring(27, oc.indexOf(",'Day'") - 1);

			var ocd = new Date(oc.replace("\\u002f", "/").replace("\\u002f", "/"));
			jd = GTJ(ocd.getFullYear(), (ocd.getMonth() + 1), ocd.getDate(), 'a');
			this.title = jd;

			if (firstcd || (jd[8] == "0" && jd[9] == "1")) {
				this.innerHTML = "<nobr>" + jd + "</nobr><br>";
				firstcd = false;
			} else {
				this.innerHTML = "<nobr>" + jd[8] + jd[9] + "</nobr>";
			}
		} else if (this.getAttribute("href") &&
			this.getAttribute("href").indexOf("javascript:ClickDay") > -1) {

			var jmv = jMonth[this.innerHTML];
			if (jmv != null)
				this.innerHTML = jmv;
			else if (this.getAttribute("href").indexOf("u002f") > -1) {
				var hr = new String(this.getAttribute("href"));
				hr = hr.replace("javascript:ClickDay('", "");
				hr = hr.replace("\\u002f", "/");
				hr = hr.replace("\\u002f", "/");
				hr = hr.replace("')", "");
				var ocd = new Date(hr);
				jd = GTJ(ocd.getFullYear(), (ocd.getMonth() + 1), ocd.getDate(), 'a');
				this.title = jd;
				this.innerHTML=jd.split("/")[2];
			}
		}
	});

$("div[class=ms-cal-navheader] a").filter(function () {
	var gd = this.href.replace("javascript:MoveToViewDate('", "").replace("',%20null);", "").replace("\\u002f", "/").replace("\\u002f", "/").replace("javascript:MoveToDate('","").replace("');","");
	this.title = ConvertGDateObjToJalali(gd);
});

$("div[class=ms-cal-navheader]").filter(function () {
    var JalaliMonthName = $("table[class=ms-picker-table] td[class=ms-picker-monthselected] a").html();
    var JalaliYear = $("table[class=ms-picker-table] td[class=ms-picker-footer] div a").html();
	
	var MYear=new Date(JalaliYear);
	MYear=MYear.getFullYear();
	JalaliYear = ConvertGDateObjToJalali(JalaliYear).substr(0, 4).substr(2, 2);
    SearchAndReplaceGDates(this);
    if (JalaliMonthName){ $(this).html($(this).html() + " " + JalaliMonthName + " " + JalaliYear);
		
	$("td[class=ms-picker-month]").filter(function () {
    
    var MYear = $(this).html();
	if (MYear.length && MYear.length>3 && JalaliMonthName)	{
		$(this).html($(this).html() + " " + JalaliMonthName + " " + JalaliYear);		
	}
		
	});

	
		}
	
});




	

	
$("nobr").filter(function () {
    SearchAndReplaceGDates(this);   
});

$("td[class=ms-picker-month]").filter(function () {
				for(i in jMonth) {
				 if (this.innerHTML.indexOf(i)>-1){
					ReplaceValue(this,i,jMonth[i]);	
				 }
				
		 }
			
});



	
}




function DoConvertProcess() {

    $(document).ready(function () {
//window.status="Full Version: http://www.ResearchInformationSystem.ir";
//window.title="Full Version: http://www.ResearchInformationSystem.ir";
      
        //SetDatePickerToInputs();
        //SearchAndReplaceGDates(document);

        //try to convet gregorian calendar to jalali calendar in sharepoint sites!

        var mt = $('meta[name=GENERATOR]');
        var grouped = false;
        var sharepoint = false;
		
        if (mt.length && mt.attr("content").toLowerCase().indexOf("sharepoint") > -1) {
        
            sharepoint = true;
            ConvertSharePointDate();
            ConvertSharePoint2010Date();
            if (document.getElementById("tbod1-1__")) grouped = true;
            MapInputEvents();
        } else {
            SearchAndReplaceGDates(document.body);
        }


        if (sharepoint) {
            
            document.addEventListener('DOMSubtreeModified', doc_modified, false);
        }






    });


	
}





String.prototype.trim = function () {
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
}


function AddToArray(marr,m,pattern){
  var m=s.match(pattern);
   if (m) 
		for(var mi=0;mi<m.length;mi++)
			marr.push(m[mi]);     
}

function ReplaceValue(o,v1,v2){

textnodes = document.evaluate("//text()", o, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i = 0; i < textnodes.snapshotLength; i++)
{
	node = textnodes.snapshotItem(i);
	
	if (node.data.trim()!="" && node.data.indexOf(v1)>-1){	
		node.data=node.data.replace(v1,v2);
	}
	
}

}


function SearchAndReplaceGDates(ObjectToSearch){

var DatePatterns=new Array(
				/\d+(\-|\/|\.)\d+(\-|\/|\.)\d+/g,
				/\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/,   /* validateUSDate  Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy */
				/\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/,
				/\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/,
				///^(([0-9])|([0-2][0-9])|([3][0-1]))\/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\/\d{4}$/,
				///^((31(?!\ (Feb(ruary)?|Apr(il)?|June?|(Sep(?=\b|t)t?|Nov)(ember)?)))|((30|29)(?!\ Feb(ruary)?))|(29(?=\ Feb(ruary)?\ (((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))|(0?[1-9])|1\d|2[0-8])\ (Jan(uary)?|Feb(ruary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sep(?=\b|t)t?|Nov|Dec)(ember)?)\ ((1[6-9]|[2-9]\d)\d{2})$/g,
				/\d{1,2}\s(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s(19|20)\d{2}/g,
				/(Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\s\d{1,2}\,\s?(19|20)\d{2}/g,
			   /(Sat|Thu|Wed|Tue|Mon|Sun|Fri)\,\s\d{1,2}\/\d{1,2}\/\d{2}/g,
			   /(Sat|Thu|Wed|Tue|Mon|Sun|Fri)\s\d{1,2}\/\d{1,2}\,/g    
			   );

DatePatterns.push();

textnodes = document.evaluate("//text()", ObjectToSearch, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var HasDayName=false;

for (var i = 0; i < textnodes.snapshotLength; i++)
{
	node = textnodes.snapshotItem(i);
    
	if (node.data.trim()){	
		s=node.data;
		var changed=false;
		var  marr=new Array();

		if (document.URL.indexOf("mail.yahoo")>-1){
			if (document.URL.indexOf("/dc/launch")>-1)  //yahoo new mail
				 AddToArray(marr,m,DatePatterns[7]);   
			else     {AddToArray(marr,m,DatePatterns[6]);    AddToArray(marr,m,DatePatterns[5]); 
			}
		} else  {

		AddToArray(marr,m,DatePatterns[0]);   
		AddToArray(marr,m,DatePatterns[4]);   
		AddToArray(marr,m,DatePatterns[5]);           
	  }

		for (var j = 0; j < marr.length; j++) 
			if (marr[j]) {
			 
				var sDate=marr[j];
				var pn=0;
				
				if (DatePatterns[1].test(sDate)) pn=1; //mm-dd-yyyy
				else if  (DatePatterns[2].test(sDate)) pn=2; // mm-yyyy-dd
				else if  (DatePatterns[3].test(sDate)) pn=3; // yyyy-mm-dd
				else if  (DatePatterns[4].test(sDate)) pn=4; // yyyy-mm-dd
				else if  (DatePatterns[5].test(sDate)) pn=5; // yyyy-mm-dd
				else if  (DatePatterns[6].test(sDate)) pn=6; // yyyy-mm-dd
				else if  (DatePatterns[7].test(sDate)) pn=7; // yyyy-mm-dd

			    //GM_log(sDate);
				
				if (pn!=0){
					if (RegExp.$1){
						var parts = sDate.split(RegExp.$1);
						if (pn<4 && parts.length!=3) continue;
					}
                    
					//if (pn==1) if (!validateUSDate(sDate)) continue;
					

					var m=0,d=0,y=0;
					switch (pn) {
						case 1:m=parts[0];d=parts[1];y=parts[2];break;
						case 2:m=parts[0];d=parts[2];y=parts[1];break;
						case 3:m=parts[1];d=parts[2];y=parts[0];break;
						case 4:case 5:
						 var gd=new Date(sDate); 
						if (gd.getFullYear()) {y=gd.getFullYear();m=gd.getMonth()+1;d=gd.getDate();} 
						break;
				   
					   case 6:HasDayName=true;var tmpDate=sDate.substr(5).split("/"); m=tmpDate[0];d=tmpDate[1];y=2000+parseInt(tmpDate[2]); break;

					   case 7: HasDayName=true; 
					   var tmpDate=sDate.substr(4).replace(",","").split("/");
					   y=2010;
					   m=tmpDate[0];
					   d=tmpDate[1];
						break;
					}

					if (y<1900) continue;
					
			  
					//alert(pn+" "+m+" "+d+" "+y);
					if (m!=0 && d!=0 && y!=0){
						s=s.replace(sDate,GTJ(y,m,d,'a'));
						changed=true;
					}
				}
			}
		if (changed){
                   node.data = s;
            
        }
	}
	
}



}




 //msgPane_i0_1 mainTableView


	function IsValidDate(aDateStr) {
	    var s = aDateStr.split('/');
	    if (s.length != 3) return false;
	    if (s[0].length != 4) return false;

	    if (parseInt(s[0]) == NaN || parseInt(s[1]) == NaN || parseInt(s[2]) == NaN) return false;

	    if (parseInt(s[0]*1) < 1300 || parseInt(s[0]*1) > 2049) return false;
	    if (parseInt(s[1]*1) < 1 || parseInt(s[1]*1) > 12) return false;

	    if (parseInt(s[2]*1) < 1 || parseInt(s[2]*1) > 31) return false;

	    return true;
	}


	function IsDateInputBox(inp) {
		var a = inp.getAttribute("AutoDateConversion");
		if (a) return (a == "1");
		if (inp.value) {
			if (IsValidDate(inp.value))
			{ inp.setAttribute("AutoDateConversion", "1"); return true; }
			else {
				
				return false;
			}
		} else return false;
	}


	function fin(inp) {

if (IsDateInputBox(inp)) {
			inp.value = ConvertGDateObjToJalali(inp.value);
		}
	}

	function fout(inp) {
		if (IsDateInputBox(inp))  inp.value = ConvertJDateObjToG(inp.value);
	}

	function MapInputEvents() {
		$("input[type=text]").focusin(function () { fin(this); });
		$("input[type=text]").focusout(function () { fout(this); });
	}

	
	function doc_modified(event) {
		
   
		var tagName = event.target.tagName.toLowerCase();
		//GM_log(tagName); 

		var d=0;
		
		if (tagName=="table" || tagName=="div" || tagName=="span") d=1;
		
		
		if (d==1 ) {
		SearchAndReplaceGDates(event.target);
		}

	  

	}