(function() {
        if ( 'undefined' != typeof google && google.gears ) return; 
 
        var gf = false; 
        if ( 'undefined' != typeof GearsFactory ) { // Firefox 
                gf = new GearsFactory(); 
        } else { // IE 
                try { 
                        gf = new ActiveXObject('Gears.Factory'); 
                } catch (e) {} 
        } 
 
        if ( ! gf ) return; 
        if ( 'undefined' == typeof google ) google = {}; 
        if ( ! google.gears ) google.gears = { factory : gf }; 
})();
GearsL10n = {
	updateCompleted: "已完成!",
	error: "出错啦:"
}
gnGears = { 
	init : function() { 
		if ( 'undefined' != typeof google && google.gears ) { 
			try {  
				localServer = google.gears.factory.create("beta.localserver"); 
				this.createStore();
			} catch(e) { // silence if canceled 
				this.message(); 
			} 
		} 
	}, 
 
	createStore : function() { 
		if ( 'undefined' == typeof google || ! google.gears ) return; 
 
		store = localServer.createManagedStore(this.storeName()); 
		store.manifestUrl = "http://www.greengnn.org/usr/themes/greengnn/gears-manifest.js"; 
		store.checkForUpdate(); 
		this.message(); 
	}, 
 
	removeStore : function() { 
		if ( 'undefined' == typeof google || ! google.gears ) return; 
		localServer = google.gears.factory.create("beta.localserver"); 
		localServer.removeManagedStore(this.storeName()); 
		this.message(); 
	}, 
 
	storeName : function() { 
			var name = window.location.protocol + window.location.host;
			name = name.replace(/[\/\\:*"?<>|;,]+/g, '_'); // gears beta doesn't allow certain chars in the store name 
			name = 'wp_' + name.substring(0, 60); // max length of name is 64 chars 
			return name; 
    }, 
	message : function() { 
		var t = this,msg1 = t.I('gears-msg1'),msg2 = t.I('gears-msg2'), num = t.I('gears-upd-number'), wait = t.I('gears-wait'); 
 
		if ( ! msg1 ) return; 
 
		if ( 'undefined' != typeof store ) {
			msg2.style.display = 'block'; 
			store.oncomplete = function(){wait.innerHTML = (' ' + GearsL10n.updateCompleted); setTimeout("document.getElementById('gears-msg2').style.display = 'none'",1000)}; 
			store.onerror = function(){wait.innerHTML = (' ' + GearsL10n.error + ' ' + store.lastErrorMessage);}; 
			store.onprogress = function(e){if(num) num.innerHTML = (' ' + e.filesComplete + ' / ' + e.filesTotal);}; 
        } else if ( 'undefined' != typeof google && google.gears ) {
			msg1.style.display = 'block';
			msg2.style.display = 'none'; 
		} 
	},
         
	I : function(id) { 
		return document.getElementById(id); 
	}
}
/**
 * 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;

  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 = (ld.getMonth() + 1) + '.' + ld.getDate() + ' ' + 
        ((ld.getHours()>12)?(ld.getHours()-12):(ld.getHours()===0?12:
	ld.getHours())) + ':' + ((ld.getMinutes()<10)?('0' + 
	ld.getMinutes()):(ld.getMinutes())) + ' ' + 
	((ld.getHours()>=12)?'PM':'AM');
  } else {
    // if only a DATE was matched
    dateString =  parseInt(month, 10) + '.' + parseInt(dateMonth, 10);
  }
  return dateString;
}

/**
 * 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(typeof(feed.entry) == "undefined"){
	var ul = document.createElement('ul');
	var li = document.createElement('li');
	li.appendChild(document.createTextNode("懒人啥都不想干！"));
	ul.appendChild(li);
	events.appendChild(ul);
  }else{
	  // 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 content = entry.content.$t;
		var start = entry['gd$when'][0].startTime;
		var end = entry['gd$when'][0].endTime;

		// 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 dateStart = formatGCalTime(start);
		var dateEnd = formatGCalTime(end);
		var li = document.createElement('li');

		// if we have a link to the event, create an 'a' element
		if (typeof entryLinkHref != 'undefined') {
		  entryTime = document.createElement('div');
		  entryTime.className = 'datetime';
		  entryTime.appendChild(document.createTextNode(dateStart+" - "+dateEnd));
		  li.appendChild(entryTime);

		  entryLink = document.createElement('a');
		  entryLink.setAttribute('href', entryLinkHref);
		  entryLink.setAttribute('title', content);
		  entryLink.appendChild(document.createTextNode(title));
		  li.appendChild(entryLink);

		} else {
		  entryTime = document.createElement('div');
		  entryTime.className = 'datetime';
		  entryTime.appendChild(document.createTextNode(dateStart+" - "+dateEnd));
		  li.appendChild(entryTime);
		  li.appendChild(document.createTextNode(title));
		}
		// append the list item onto the unordered list
		ul.appendChild(li);
	  }
	  events.appendChild(ul);
  }
}

/**
 * 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, 'agenda');
}
function showGca(id){
	var evtId = document.getElementById(id);
	evtId.style.display = evtId.style.display == 'none'?'block':'none';
}
window.onload = function(){
	gnGears.init();
}