﻿/**
 * Converts an xs:date or xs:dateTime formatted string into the local timezone
 * and outputs a human-readable form of this date or date/time.
 *
 * @param {string} gCalTime is the xs:date or xs:dateTime formatted string
 * @return {string} is the human-readable date or date/time string
 */

 function formatGCalTime(gCalTime) { 
  // text for regex matches
  var remtxt = gCalTime;

  // check is is it a google date
  var dateSplitted;    
  
  if(remtxt == null)
	return '';
	
  dateSplitted = remtxt.split(' ');
  
  if (dateSplitted.length > 1 )
  {
	// Muster: Mon, 12 Feb 2007 15:02:54 +0000
	
	var date1 = new Date(gCalTime);
	
	dateString = '&#160; ' + ToPersianDate(date1);
	
	var h = FormatPString(((date1.getHours()>12)?(date1.getHours()-12):(date1.getHours()===0?12:	date1.getHours())));
	var min = FormatPString(((date1.getMinutes()<10)?('0' + date1.getMinutes()):(date1.getMinutes())));
	dateString += '،  ' + h + ':' + min.replace(' ','') + ' ' + 
		((date1.getHours()>=12)?'ب ظ':'ق ظ');
	
	//dateString += ' ، ' + ConvertDateTag((date1.getMonth() + 1) + "/" + date1.getDate() + "/" + date1.getFullYear(), 10);
	
	return dateString;
  }
  
  function consume(retxt) {
    var match = remtxt.match(new RegExp('^' + retxt));
    if (match) {
      remtxt = remtxt.substring(match[0].length);
      return match[0];
    }
    return '';
  }

  // minutes of correction between gCalTime and GMT
  var totalCorrMins = 0;

  var year = consume('\\d{4}');
  consume('-?');
  var month = consume('\\d{2}');
  consume('-?');
  var dateMonth = consume('\\d{2}');
  var timeOrNot = consume('T');

  // if a DATE-TIME was matched in the regex 
  if (timeOrNot == 'T') {
    var hours = consume('\\d{2}');
    consume(':?');
    var mins = consume('\\d{2}');
    consume('(:\\d{2})?(\\.\\d{3})?');
    var zuluOrNot = consume('Z');

    // if time from server is not already in GMT, calculate offset
    if (zuluOrNot != 'Z') {
      var corrPlusMinus = consume('[\\+\\-]');
      if (corrPlusMinus != '') {
        var corrHours = consume('\\d{2}');
        consume(':?');
        var corrMins = consume('\\d{2}');
        totalCorrMins = (corrPlusMinus=='-' ? 1 : -1) * 
            (Number(corrHours) * 60 + 
	    (corrMins=='' ? 0 : Number(corrMins)));
      }
    } 

    // get time since epoch and apply correction, if necessary
    // relies upon Date object to convert the GMT time to the local
    // timezone
    var originalDateEpoch = Date.UTC(year, month -1 , dateMonth, hours, mins);
    var gmtDateEpoch = originalDateEpoch + totalCorrMins * 1000 * 60;
    var ld = new Date(gmtDateEpoch);
    
    // date is originally in YYYY-MM-DD format
    // time is originally in a 24-hour format
    // this converts it to MM/DD hh:mm (AM|PM) 
    
	dateString = '&#160; ' + ToPersianDate(ld);
	
	var h = formatPersian(((ld.getHours()>12)?(ld.getHours()-12):(ld.getHours()===0?12:	ld.getHours())));
	var min = formatPersian(((ld.getMinutes()<10)?('0' + ld.getMinutes()):(ld.getMinutes())));
	dateString += '،  ' + h + ':' + min + ' ' + 
		((ld.getHours()>=12)?'ب ظ':'ق ظ');
	
	//dateString += ' ، ' + ConvertDateTag((ld.getMonth() + 1) + "/" + ld.getDate() + "/" + ld.getFullYear(), 10);		
	// date class redisign open	
	// dateString += " - " + ConvertDateTag((ld.getMonth() + 2) + "/" + ld.getDate() + "/" + ld.getFullYear(), 7);
	
  } else {
    // if only a DATE was matched
    //dateString =  parseInt(month) + '/' + parseInt(dateMonth);
    //dateString = ConvertDateTag(dateString + "/" + parseInt(year) , 10);
    dateString = ToPersianDate(new Date(year + '/' + month + '/' + dateMonth));
  }  

  return dateString;

}

function IsPersian (str) {
  var len;
  var i;
  var ch = "";
  var uCode;
  var rc;

  rc = false; //English

  len = str.length;
  for (i=0; i < len; i++) {
    ch = str.substring(i, i+1)
    uCode=ch.charCodeAt(0);
    if (uCode >= 0x0600) {
      rc = true; //Farsi
      break;
    }
  }

  return (rc);
}

function toggleDirection(obj) {
	
	if(obj.style.direction == 'rtl') {
		obj.style.direction = 'ltr';		
	}	
	else {
		obj.style.direction = 'rtl';		
	}	
		
}

function togglePerKeyDirection(obj, e) {

	if (!e)
		e = window.event;
		
	var unicode = e.keyCode? e.keyCode : e.charCode;
	
	if(e.ctrlKey && unicode == 91) // ctrl+[  => ctrl+ ج	
	{
		if(obj.style.direction == 'rtl') {
			obj.style.direction = 'ltr';		
		}	
		else {
			obj.style.direction = 'rtl';		
		}
	}	
		
}
function getMonthNumber(str)
{
	var mnum = '';
	
	if (str == '')
		return 'NaM';
	
	
	switch (str)
	{
		case 'Jan':
			mnum = '01';
			break;
		case 'Feb':
			mnum = '02';
			break;
		case 'Mar':
			mnum = '03';
			break;
		case 'Apr':
			mnum = '04';
			break;
		case 'May':
			mnum = '05';
			break;
		case 'Jun':
			mnum = '06';
			break;
		case 'Jul':
			mnum = '07';
			break;
		case 'Aug':
			mnum = '08';
			break;			
		case 'Sep':
			mnum = '09';
			break;
		case 'Oct':
			mnum = '10';
			break;
		case 'Nov':
			mnum = '11';
			break;
		case 'Dec':
			mnum = '12';
			break;
		default:
			mnum = 'Nam';
			break;		
	}
	
	return mnum;
}

/**
 * Creates an unordered list of events in a human-readable form
 *
 * @param {json} root is the root JSON-formatted content from GData
 * @param {string} divId is the div in which the events are added
 */ 
function listEvents(root, divId) {
  var feed = root.feed;
  var events = document.getElementById(divId);

  if (events.childNodes.length > 0) {
    events.removeChild(events.childNodes[0]);
  }

 if (!feed.entry)
	return;	  

  // create a new unordered list
  var ul = document.createElement('ul');

  // loop through each event in the feed 
  for (var i = 0; i < feed.entry.length; i++) {
    var entry = feed.entry[i];
    var title = entry.title.$t;
	var desc = entry.content.$t;
    var start = entry['gd$when'][0].startTime;

    // get the URL to link to the event
    for (var linki = 0; linki < entry['link'].length; linki++) {
      if (entry['link'][linki]['type'] == 'text/html' &&
          entry['link'][linki]['rel'] == 'alternate') {
        var entryLinkHref = entry['link'][linki]['href'];
      }
    }

			
    var dateString = formatGCalTime(start);
	
	gDateOnly = true;
	var dpString = formatGCalTime(start);	
	gDateOnly = false;	
	
	var linkDiv = document.createElement('div');
    
	linkDiv.setAttribute('style','direction: rtl;');
	ul.setAttribute('style','direction: rtl;');
	
	if (!IsPersian(title)) {
		toggleDirection(linkDiv);
		toggleDirection(ul);
	}	

    var li = document.createElement('li');

    // if we have a link to the event, create an 'a' element
    if (typeof entryLinkHref != 'undefined') {
		
		var entryLink = "<span ";
		entryLink += "style=\"cursor: pointer; color: #2F579B;\"";
		entryLink += "onmousedown=\"javascript:toggleDescription(\'desc" + divId + i + "\');return;\">";	  
		entryLink += title + "</span>";  
	  
		desc = desc + (desc ? "<br/>" : "") + "<a style='font-size:12px;' href='" + entryLinkHref + "' target='_blank'>افزودن به تقویم شخصی</a>";
	  	
		linkDiv.innerHTML += entryLink;
		linkDiv.innerHTML += '<span> - ' + dateString + '</span>';
	    
		var linkSpan = "<span style=\"cursor:pointer; color:#2F579B;\" onmousedown=\"javascript:" + dpString + "\">&#160;&#187;</span>";
	  	
		linkDiv.innerHTML += linkSpan;
		
		var descDiv = "<div ";
		descDiv += "style= \"display:none; direction: rtl;padding-top: 3px;font-size:12px;\"";
		descDiv += "id=\"desc" + divId + i + "\">";
		descDiv += desc + "</div>";
	  
		li.appendChild(linkDiv);		
		li.innerHTML += descDiv;
      
    } else {
		li.appendChild(document.createTextNode(title + ' - ' + dateString));
    }	    

    // append the list item onto the unordered list
    ul.appendChild(li);
  }
  events.appendChild(ul);
  
	events.style.display = 'none';
	new Effect.Appear(divId);

  
	var rem = document.getElementById('app-calendar-script-' + divId);
	rem.parentNode.removeChild(rem);
}

/**
 * Callback function for the GData json-in-script call
 * Inserts the supplied list of events into a div of a pre-defined name
 * 
 * @param {json} root is the JSON-formatted content from GData
 */ 
function insertAgenda(root) {
  
	listEvents(root, 'PersianCalendar');	

}

function insertIslamicAgenda(root) {
  
	listEvents(root, 'IslamicCalendar');	

}

function insertCustomAgenda(root) {
  
	listEvents(root, 'CustomCalendar');	

}

function renderPersianAgenda()
{
	var url = "http://www.google.com/calendar/feeds/0e4lqu3bjltjhe5c9r32s7rb90%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertAgenda&orderby=starttime&max-results=7&singleevents=true&sortorder=ascending&futureevents=true";
	
	var script = document.createElement('script'); 
		
	script.type = 'text/javascript'; 
	script.id = "app-calendar-script-PersianCalendar";
	script.src = url; 
	
	document.getElementsByTagName("head")[0].appendChild(script);

}

function renderPersianBloggerAgenda()
{
	var url = "http://www.google.com/calendar/feeds/idqmb2o07gr6nji372ajkvf43s%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCustomAgenda&orderby=starttime&max-results=5&singleevents=true&sortorder=ascending&futureevents=true";
	
	var script = document.createElement('script'); 
		
	script.type = 'text/javascript'; 
	script.id = "app-calendar-script-IslamicCalendar";
	script.src = url; 
	
	document.getElementsByTagName("head")[0].appendChild(script);

}

function renderPersianPeople()
{
	var url = "http://www.google.com/calendar/feeds/uu036j85395ga6e9ab8prk801o%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCustomAgenda&orderby=starttime&max-results=20&singleevents=true&sortorder=ascending&futureevents=true";
	
	var script = document.createElement('script'); 
		
	script.type = 'text/javascript'; 
	script.id = "app-calendar-script-IslamicCalendar";
	script.src = url; 
	
	document.getElementsByTagName("head")[0].appendChild(script);

}

function renderPersianWebAgenda()
{
	var url = "http://www.google.com/calendar/feeds/h9fg8su7raadeoneilj81fl93s%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertCustomAgenda&orderby=starttime&max-results=10&singleevents=true&sortorder=ascending&futureevents=true";
	
	var script = document.createElement('script'); 
		
	script.type = 'text/javascript'; 
	script.id = "app-calendar-script-IslamicCalendar";
	script.src = url; 
	
	document.getElementsByTagName("head")[0].appendChild(script);

}

function renderPersianNationalAgenda()
{
	var url = "http://www.google.com/calendar/feeds/jo68unjgotg2qku20avr6ou370%40group.calendar.google.com/public/full?alt=json-in-script&callback=insertIslamicAgenda&orderby=starttime&max-results=5&singleevents=true&sortorder=ascending&futureevents=true";
	
	var script = document.createElement('script'); 
		
	script.type = 'text/javascript'; 
	script.id = "app-calendar-script-IslamicCalendar";
	script.src = url; 
	
	document.getElementsByTagName("head")[0].appendChild(script);

}

function toggleDescription(descDiv) 
{
	var desc = document.getElementById(descDiv);
	
	if (!desc)
		return;
	
	if(desc.style.display == 'none')
		desc.style.display = 'block';
	else
		desc.style.display = 'none';		
}

