
/**
 *	Find Calendar event
 *  convert to ics syntax and open in data: URI
 *
 *	Ben Adida - ben@mit.edu
 *  Dan Connolly - connolly@w3.org
 *  Elias Torres - elias@torrez.us
 *
 *  2006-04-26
 *  2006-05-22 moved to W3
 *
 *	licensed under GPL v2
 */

// EXPECTING __RDFA_BASE
if (typeof(__RDFA_BASE) == 'undefined')
  __RDFA_BASE = 'http://www.w3.org/2001/sw/BestPractices/HTML/rdfa-bookmarklet/';

var __RDFA_VERSION_SUBDIR = '2006-10-08/';

// two simple namespaces as objects
var CAL = new Object();
var RDFA = new Object();

// configuration information
RDFA.url = __RDFA_BASE + __RDFA_VERSION_SUBDIR + 'rdfa.js';

CAL.google_image_src = 'data:image/gif;base64,'+
    'R0lGODlhcgAkAOZ/AI2k1t3d3SZNopubm+zs7MXFxV5larzH3cHBweLCtdfX18yoYX6Z1b29vauQ'+
    'd9nZ2YidzMawqqa11+Hh4bW1tZM0KeTk5LiOir6RQ9ufMJSaqIqji3N3hLq6usjJyWuKztPa5fj4'+
    '+PPz80q6UHaGq5vEnM3NzcXN2+PXwrh1a8mqk09urPHx8d/f36qrq/b29rOglKu2yh9VzSGHKIdP'+
    'SfLy8rC92Gp9pJd3c6SkpJN3SMt3a2SG0UpzzdeYjneSz5Ws2SpdzNXJyFZ9xXKMwlZokrCwsLKp'+
    'o0JUgtPW37/EzJmkvJWLf6mwu8zFw0530YGJg7poWlZ7zjZly8fHx6NMP7i3t83S20Ju0MvLypiS'+
    'jYWNoUBszqCuzcfFw7O1tV2B0dLT1LKzt6inpuPj47iDJtvb2+Lg2dPT09TU1IeTjZGQkc/Kv7a4'+
    'vrgrGLu7u7u8vsO7usPDxOXl5efn5/z8/Kmpqfr6+q2trerq6u3t7bGxsfn5+dHR0e/v7////yH5'+
    'BAEAAH8ALAAAAAByACQAAAf/gH+Cgml9hoeIiYqLjI2Oj5CRj2mDlX9oaRMEfpydnp+goaKjpKWm'+
    'p6MEE2loln0BLCF1s7S1tre4ubq7vL2+vCEsAX2DaLB3yMnKy8zNzs/Q0dLT1HfCrX9psXzc3d7f'+
    '3R7g4ePl5nwed3R6ExPn7/DxwZRpFiIh+Pjx6OYD+frj/uX7Jm7ABA/i+AhcyLChw4ciVvUh8KLi'+
    'izR7ckxAkAMBizRWclhJk8NEiD0nPZQMQdKKP3wgRZL0EOLBnj0P8u1h8cBKCBMY0wxw4SHjHooW'+
    'kypdyrSp04oEDPkRQfUFFRcBTFjJYwWNBxdzcjRoMeBF2QEmyOYZ0MJD2YpU/3LkEUvWbIsAb1+4'+
    'UNBgwNw5Z9vmmGOEyguqiBMrXsy4sWM/UhNTMWxkgGUKk18YCWC28wA/ZgO4eOFnAOLJIowoCG3Z'+
    'cgCqJhrkcEHlbOjMqB3r3s2bKuQ+flgIr1GggAgECEQYKp76tennVA2anjCghnXmm0UM0LNdDwI6'+
    '1ifM7jPgjXbtAZgXryG8vfv38OPLn//bE4viLMS7GGAGvxEzLAwQ4IADdjCbgML5B6CABQyQAwXu'+
    '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'+
    'wLMlCiGJTnv606AOtSHEPIhAAAA7';

CAL.reminder_image_src = 'data:image/png;base64,'+
    'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0'+
    'U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMESURBVDjLXZNrSFNxGMYPgQQRfYv6EgR9'+
    'kCgKohtFgRAVQUHQh24GQReqhViWlVYbZJlZmZmombfVpJXTdHa3reM8uszmWpqnmQuX5drmLsdj'+
    'enR7ev9DR3Xgd3h43+d5/pw/HA4AN9zITSPUhJ14R0xn87+h2ZzJvZVInJpzAQOXQOQMt+/5rvhM'+
    'CLXv9Vjrt1rSXitmwj+Jua1+Ox+2HfGNdGf6yW8l5sUKPNVcRsiaPDA22Ahv6/7Ae/0aKdviQ0G7'+
    'B/c6f8Zg+gbfh079Mjno0MhS58lflOsgEjh3BXc+bM/0DzbvDwj314znt/bjof0HdPw3FBq6kP+o'+
    'CxVNfdDZvqPsrQmf6zdFRtyPJgbrFoqUTeS+FnPrekpmiC2lS+QcUx+qrf0wmFzodYfgC0nwhoYh'+
    '9oegfdmLsmYXHj7JhV23erS7ZNYHyibGLiLtXsO19BoHSiwu6Ok09gwFg/gy8BO/STOkKFBk7EWh'+
    '2YkLeh5Hy4Ws2B2w157iDvOpxw4UPRPRTSfL41FIsow7ZeXwUFF4dBQ1L96A/xLEFf1HMC/LxAt2'+
    '5PH+VN0HXH1gh2dEwdBoBGO0OKvW4L7hCdIvavBSsMIRVHCi0ArmZZl4wbYrz/yHSq1Ql9vQLylU'+
    'EoE7GMal3OuxMG/7CO848N6n4HheK5iXZeIFmy88Nu+8aYJG24G3ziB+0Ee7wwqemlvQ5w9hcAJw'+
    'yUDtpwBOFLeBeVkmXpB0qlK9RV2HlLsCsvUivHRhQwoQjhCkA1TgJX1OK0JVzIN5WSZesPZ44XKi'+
    'a+P5BqSS4aq+BzZXABLdhyQrsJPOqv4MVcEbMA/zsky8gLHyYO7hI9laecOZWuzLfYXU2zzSblmQ'+
    'erMZqjwTknOeY9dlIw5kVcrMG/8XpoQgCEkOhwNNJn5i7bFSrFDpsCrFEIPpLacr0WxpibYIQpS8'+
    '6/8pMBqNswnJ6XSivqHBv3R3pmbxzgwz4Z+EaTXtwqIogrzjxIJ4QVVV1UyihxgjFv3/K09Bu/lE'+
    'kBgg5rLZH+fT5dvfn7iFAAAAAElFTkSuQmCC';


// The events
CAL.events = new Array();
CAL.event_els = new Array();
CAL.namespace_uri = 'http://www.w3.org/2002/12/cal/ical#';

CAL.makeGoogleLink = function(el, event) {

    var reminder_link = document.createElement('a');
    reminder_link.title = "Add to Google Calendar"
    reminder_link.href = "http://www.google.com/calendar/event?action=TEMPLATE";

    reminder_link.href += "&text=" + event.summary;
    reminder_link.href += "&dates=" + event.dtstart + "/" + event.dtend;
    reminder_link.href += "&location=" + event.location;

    var reminder_image = document.createElement('img');
    reminder_image.src = CAL.google_image_src;
    reminder_image.border = 0;
    reminder_link.appendChild(reminder_image);
    el.appendChild(reminder_link);
};

CAL.new_triple = function(el,triple) {
    if (triple.predicate.uri() != CAL.namespace_uri + 'dtstart') {
        return;
    }

    CAL.events[CAL.events.length] = triple.subject;
    CAL.event_els[CAL.event_els.length] = el.parentNode;
};

// a function that is called on an element when a triple pertains to it
// with the element being the literal object
RDFA.CALLBACK_NEW_TRIPLE_WITH_LITERAL_OBJECT = function(el, triple) {
    CAL.new_triple(el,triple);
}

// a function that is called on an element when a triple pertains to it
// with the element being the clickable link for a URI object
RDFA.CALLBACK_NEW_TRIPLE_WITH_URI_OBJECT = function(el, triple) {
    CAL.new_triple(el,triple);
}

// a function that is called on an element when a triple pertains to it
// with the element being the subject of the assertions
RDFA.CALLBACK_NEW_TRIPLE_WITH_SUBJECT = function(el, triple) {
    CAL.new_triple(el,triple);
}

// what happens when it's done parsing
RDFA.CALLBACK_DONE_PARSING = function() {
    //alert('okay, done parsing.');
    var cal_ns = new RDFA.Namespace('cal',CAL.namespace_uri);

    for (var i=0; i<CAL.events.length; i++) {
        //alert('going through event ' + i);
        // get dtstart
        var dtstart = RDFA.getTriples(CAL.events[i], new RDFA.CURIE(cal_ns,'dtstart'))[0].object;

        // get duration
        var duration_triples = RDFA.getTriples(CAL.events[i], new RDFA.CURIE(cal_ns, 'duration'));
        var duration = null;
        if (duration_triples)
            duration = duration_triples[0].object;

        // get dtend
        var dtend_triples = RDFA.getTriples(CAL.events[i], new RDFA.CURIE(cal_ns,'dtend'));
        var dtend = null;
        if (dtend_triples)
            dtend = dtend_triples[0].object;

        // default to 1 hour
        if (!duration && !dtend)
            duration = 'PT1H';

        // get summary
        var summary = RDFA.getTriples(CAL.events[i], new RDFA.CURIE(cal_ns,'summary'))[0].object;

        // get location
        var location = RDFA.getTriples(CAL.events[i], new RDFA.CURIE(cal_ns,'location'))[0].object;

        var event = {'dtstart':dtstart , 'duration':duration , 'summary':summary, 'dtend':dtend, 'location':location};

        //alert('about to make links');
        CAL.makeIcalLink(CAL.event_els[i],event);
        CAL.makeGoogleLink(CAL.event_els[i],event);
    }
}

CAL.makeIcalLink = function(el,event) {
        var ical_event = 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:RDFa Converter\nBEGIN:VEVENT\nDTSTART:' + event.dtstart + '\nDURATION:' + event.duration + '\nSUMMARY:' + event.summary + '\nLOCATION:' + event.location + '\nEND:VEVENT\nEND:VCALENDAR';
        var ical_event_b64 = btoa(ical_event);
        var ical_uri = 'data:text/calendar;base64,' + ical_event_b64;

        var reminder_link = document.createElement('a');
        reminder_link.title = "Add to iCal"
        reminder_link.href = ical_uri;

        var reminder_image = document.createElement('img');
        reminder_image.src = CAL.reminder_image_src;
        reminder_image.border = 0;
        reminder_link.appendChild(reminder_image);

        el.appendChild(reminder_link);
};

//
// Everything below is used only for loading the RDF/A javascript.
// You probably don't need to look at it.
//

// callback when the RDF/A parsing is done.
RDFA.CALLBACK_DONE_LOADING = function() {
    RDFA.GRDDL.addProfile(__RDFA_BASE + __RDFA_VERSION_SUBDIR + 'hcal-rdfa.js');
    RDFA.parse();
}

RDFA.load = function()
{
    var s = document.createElement("script");
    s.type = 'text/javascript';
    s.src = RDFA.url;

    // add it to the document tree, load it up!
    document.getElementsByTagName('head')[0].appendChild(s);
}

RDFA.load();
