/*
 * BSPAA.js contains a series of routines that build a web-page for retrieving
 * and display "events" captured as part of Enconcert Inc.'s live show system.
 * There are 3 main functions:
 *      performing JSON queries on servers to retrieve show info, photos,
 *          songs and tweets and storing those into "event data structutures"
 *      building a quasi-interactive timeline
 *          - to display different events and their temporal and spacial
 *            relationship to each other and the show
 *            ( timeline interface based on MIT's SIMILE Timeline widget. )
 *          - allow tweets from different twitter users to be added or removed
 *      creating navigation controls
 *          to select shows by name to revtrieve and display events from
 *          to automatically scroll the timeline to the next event
 *          to go to the beginning or end of the show or timeline
 */
       
   var timeLine;  // timeline as a global variable simplified interactive navigation

/*
 * These variables are hashes/arrays to aid in interactive queries and navigation
 * I will combine these into one associative array (of arrays with needed info)
 * soon.
 */
   var tweetsDateArray = [];
   var bstageDateArray = [];
   var songsDateArray = [];
   var showsDateArray = [];
   var loadedShowHash = [];

/* 
 *  Server Query Related Global Variables
 *  These bookmkark variables hold the bookmarks for the JSON server queries.
 *  These values are appended to the URL to request the next set of JSON objects.
 *  The stop criteria variables are not yet implemented. Requests currently continue
 *  until the server has returned everything.
 */   
   var bmarkTweets = 0;
   var bmarkBstage = 0;
   var bmarkSongs = 0;
   var bmarkShows = 0;
   var isTweetBookmark = 0;
   var isBstageBookmark = 0;
   var isSongBookmark = 0;
   var isShowBookmark = 0;
   
   var stopCriteriaTweets = 0;
   var stopCriteriaBstage = 0;
   var stopCriteriaSongs = 0;
   var stopCriteriaShows = 0;

/* 
 *  Navigation Related Global Variables
 *      navMode 1 is for the archive page: retrieve and show everything
 *      navMode 2 is for performances page where a cyclic select form is built
 *                for each show and then events are retrieved by show. Navigation
 *                is scoped to be within the selected show and event time frame.
 */
   var navMode = 1;
   /* I can remove the hardcoded min/max proj date with a little work */
   var minProjDate = Timeline.DateTime.parseIso8601DateTime("2009-01-01T00:00:00");
   var maxProjDate = Timeline.DateTime.parseIso8601DateTime("2012-04-30T00:00:00");
   var startProj = null;
   var endProj = null;

   /* numCur vars are used as "pointers" to the current/last event that was scrolled
    * to. With some work I could re-derive this each time based on the current
    * centerline value on the timeline, which would then handle manual scrolling and
    * I could eliminate these vars but currently I don't think it's worth the time
    * and performance trade-off to do it.
    */
   var numCurTweets = 0;
   var numCurBstage = 0;
   var numCurSongs = 0;
   var numCurShows = 0;
           
/* 
 *  EventSources   
 */
     var eventSource = new Timeline.DefaultEventSource();
     var eventSource_bstage = new Timeline.DefaultEventSource();
     var eventSource_tweets = new Timeline.DefaultEventSource();
     var eventSource_songs = new Timeline.DefaultEventSource();
     var eventSource_shows = new Timeline.DefaultEventSource();
/* 
 *  Timeline Band Info Hot Spot Related Global Variables    
 *  These currently aren't used
 */ 
   // var tweetRange1_b = new Date(Date.UTC(2009,11,10,20,00,00,0));
   // var tweetRange1_e = new Date(Date.UTC(2009,11,17,20,00,00,0));
   // var bstageRange1_b = new Date(Date.UTC(2009,11,20,04,40,00,0));
   // var bstageRange1_e = new Date(Date.UTC(2009,11,20,05,30,00,0));
   // var songRange1_b = new Date(Date.UTC(2009,11,10,02,00,00,0));
   // var songRange1_e = new Date(Date.UTC(2009,11,10,04,00,00,0));
 

function getTwitterTimeline() {
/* getTwitterTimeline() retrieves a JSON string from the twitter.com user
 * timeline api/URL. Builds the eventSource event data structure for the tweets.
 * Want to enhance this to take a start and end date to return the inclusive
 * tweets. Requires the document to have an "Id" of twitter username as its value. 
 */

     var userName = document.getElementById("userName").value;
     // var userName = user; // after adding user as an arg to this function
     var url = 'http://twitter.com/status/user_timeline/' + userName + '.json?count=200&callback=?';     
     jQuery.getJSON(url, function(data) {   
         var mostRecentTweetDate = new Date(1); 
         jQuery.each(data, function(i, item) {    
            var dateEvent = new Date()
            var dateEventCC = Date.parse(item.created_at);
            dateEvent.setTime(dateEventCC)  
            mostRecentTweetDate = (dateEventCC > mostRecentTweetDate) ? dateEventCC : mostRecentTweetDate; 
            
            var html = replaceUrlWithHtmlLinks(item.text); 
            var evt = new Timeline.DefaultEventSource.Event({
               id:undefined,
               start:dateEvent, 
               end:dateEvent, 
               latestStart:dateEvent, 
               earliestEnd:dateEvent, 
               instant:true, 
               text:item.text.substr(0, 47) + '...',
               description:html 
            }
            ); 
            eventSource_tweets.add(evt);           
         }); 
          
        //eventSource_songs.loadJSON(timeline_data_2009_12_09, document.location.href);
        //makeTimeline();
        timeLine.paint();
        tweetsDateArray = buildEventStartDateArrays(eventSource_tweets);
    });
}  

function makeNavControls(){
// navMode 1 = for Archive Page
// navMode 2 = for Performance Page
        alert("in makeNav mode = " + navMode);
         var showsListDateArray;
         if (navMode==2){ showsListDateArray= buildEventInfoArrays(eventSource_shows);  };             
         if (navMode==1){ startProj = minProjDate; endProj = maxProjDate;};
         var eventType = document.eventForm.site.options[document.eventForm.site.selectedIndex].value;
         //tweetsDateArray = buildEventStartDateArrays(eventSource_tweets);
         //bstageDateArray = buildEventStartDateArrays(eventSource_bstage);
         // bstageDateArray = buildBSTAGEEventStartDateArrays();
         songsDateArray = buildEventStartDateArrays(eventSource_songs);
         showsDateArray = buildEventStartDateArrays(eventSource_shows); 
}
function makeTimeline() {
    makeNavControls();
    var twitterTheme = Timeline.SongTheme.create();
      twitterTheme.autoWidth = false;
      twitterTheme.event.instant.icon = "http://www.backstagepassallaccess.com/uploads/2/2/2/0/2220972/twitter52_12.png";
       twitterTheme.timeline_start = startProj;
      twitterTheme.timeline_stop  = endProj;
      twitterTheme.event.duration.opacity = 35;
      
      var backstageTheme = Timeline.SongTheme.create();
      backstageTheme.autoWidth = false;
      backstageTheme.timeline_start = startProj;
      backstageTheme.timeline_stop  = endProj;      
      //backstageTheme.event.instant.icon = "http://www.backstagepassallaccess.com/uploads/2/2/2/0/2220972/music-note-sh-icon.png";
      backstageTheme.event.duration.opacity = 35;
      backstageTheme.event.instant.icon = "no-image-40.png";
      backstageTheme.event.instant.iconWidth = 40;  // These are for the default stand-alone icon
      backstageTheme.event.instant.iconHeight = 40
      
      var songTheme = Timeline.SongTheme.create();
      songTheme.autoWidth = false;
      songTheme.event.instant.icon = "http://www.backstagepassallaccess.com/uploads/2/2/2/0/2220972/music-note-sh-icon.png";
      songTheme.timeline_start = startProj;
      songTheme.timeline_stop  = endProj; 
      songTheme.event.duration.opacity = 35;
      
      var showTheme = Timeline.SongTheme.create();
      showTheme.autoWidth = false;
      showTheme.event.instant.icon = "http://www.backstagepassallaccess.com/uploads/2/2/2/0/2220972/music-note-sh-icon.png";
      showTheme.timeline_start = startProj;
      showTheme.timeline_stop  = endProj;           
      showTheme.event.duration.opacity = 35;
      
          var bandInfos1 = [
                Timeline.createBandInfo({
                    width:          "10%",
                    intervalUnit:   Timeline.DateTime.MINUTE, 
                    intervalPixels: 50,
                    trackGap:       0.2,
                    multiple:       0,
                    eventSource:    eventSource_tweets,
                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          twitterTheme,
                    layout:         'original'
                }),
                Timeline.createBandInfo({
                    width:          "55%",
                    intervalUnit:   Timeline.DateTime.MINUTE, 
                    intervalPixels: 50,
                    trackGap:       0.2,
                    multiple:       0,
                    eventSource:    eventSource_bstage,
                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          backstageTheme,
 /*                   eventPainter:   Timeline.CompactEventPainter,
                    eventPainterParams: {
                        iconLabelGap:     5,
                        labelRightMargin: 20,
                        
                        iconWidth:        80, // These are for per-event custom icons
                        iconHeight:       80,
                        
                        stackConcurrentPreciseInstantEvents: {
                            limit: 5,
                            moreMessageTemplate:    "%0 More Events",
                            icon:                   "./no-image-80.png", // default icon in stacks
                            iconWidth:              80,
                            iconHeight:             80
                        }
                    },
*/
                    layout:         'original'                    
                }),
                Timeline.createBandInfo({
                    width:          "5%",
                    intervalUnit:   Timeline.DateTime.MINUTE, 
                    intervalPixels: 50,
                    trackGap:       0.2,
                    multiple:       5,
                    eventSource:    eventSource_songs,
                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          songTheme,
                    layout:         'original'
                }),
                Timeline.createBandInfo({
                    width:          "15%",
                    intervalUnit:   Timeline.DateTime.HOUR, 
                    intervalPixels: 300,
                    trackGap:       0.2,
                    eventSource:    eventSource_shows,
                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          showTheme,
                    layout:         'original'                    
                }),
                Timeline.createBandInfo({
                    width:          "10%",
                    intervalUnit:   Timeline.DateTime.DAY, 
                    intervalPixels: 100,
                    trackHeight:    0.5,
                    trackGap:       0.2,
                    eventSource:    eventSource_shows,

                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          showTheme,
                    layout:         'original'
                    }),
                Timeline.createBandInfo({
                    width:          "5%",
                    trackHeight:    0.5,
                    intervalUnit:   Timeline.DateTime.MONTH, 
                    intervalPixels: 50,
                    trackGap:       0.2,
                    eventSource:    eventSource_tweets,
                    showEventText:  false, 
                    timeZone: new Date().getTimezoneOffset() / 60, 
                    theme:          twitterTheme,
                    layout:         'overview'
                    })
            ];

         bandInfos1[1].syncWith = 0; 
         bandInfos1[1].highlight = true;
         bandInfos1[2].syncWith = 0; 
         bandInfos1[2].highlight = true;
         bandInfos1[3].syncWith = 0; 
         bandInfos1[3].highlight = true;
         bandInfos1[4].syncWith = 0; 
         bandInfos1[4].highlight = true;
         bandInfos1[5].syncWith = 0; 
         bandInfos1[5].highlight = true;
/*         
         for (var i = 0; i < bandInfos1.length; i++) {
           bandInfos1[i].decorators = [
             new Timeline.SpanHighlightDecorator({
                startDate:  tweetRange1_b,
                endDate:    tweetRange1_e,
                inFront:    false,
                opacity:    22,
               // startLabel: "Start",
               // endLabel:   "End",
             }),
             new Timeline.SpanHighlightDecorator({
                startDate:  bstageRange1_b,
                endDate:    bstageRange1_e,
                inFront:    false,
                opacity:    32,
               // startLabel: "Start",
               // endLabel:   "End",
             }),
             new Timeline.SpanHighlightDecorator({
                startDate:  songRange1_b,
                endDate:    songRange1_e,
                inFront:    false,
                opacity:    42,
               // startLabel: "Start",
               // endLabel:   "End",
             })
           ];
        }
*/ 
         timeLine = Timeline.create(document.getElementById("timeLine"), bandInfos1);
         timeLine.finishedEventLoading();
         timeLine.layout();

//         setupFilterHighlightControls(document.getElementById("controls"), timeLine, [0,1,2,3,4,5], songTheme);
//         alert( "eventSource_tweetsGetCount = " + eventSource_tweets.getCount() +
//                "eventSource_bstageGetCount = " + eventSource_bstage.getCount() +
//                "here's the center visible date on Band1 = " + timeLine.getBand(1).getCenterVisibleDate() +
//                "eventSource_songsGetCount = " + timeLine.getBand(2).getEventSource().getCount() +
//                "eventSource_showsGetCount = " + eventSource_shows.getCount()
//               );

              
   }

 function getShowInfo(){
         getShowTimeline();
         //showsDateArray = buildEventInfoArrays(eventSource_shows);               

}
 function getDetailsFromShow(){
        alert("in getDetails...");
        navMode = 2;
         getShowTimeline();
         //showsDateArray = buildEventInfoArrays(eventSource_shows);
        //timeLine.finishedEventLoading();
        // timeLine.getBand(3).setMinVisibleDate(startProj);

         //onShowChange();

}

 function getRemainderShowTimeline() {
         var burl = 'http://1.latest.syncusup.appspot.com/show?callback=?';
            if(bmarkShows !=0){
                var burl = burl+"&bookmark="+bmarkShows;
            }         
            
            jQuery.getJSON(burl, function(data) {   
                    jsonshowdata=data;
                    isShowBookmark= 0;
                      jQuery.each(data, function(i, n) {
                        if(i=="bookmark"){
                            bmarkShows = n;
                            isShowBookmark =1;
       //                     var burl2 = burl + "&bookmark="+ bmarkBstage;
       //                     alert("bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        };                       
                        if(i=="events"){
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                              if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    evt.id = data.id;
                                    //evt.start = new Date(data.start.replace(/-/g,"/")); 
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = false;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);

                            eventSource_shows.add(evtDone);
                            j++;
                            };
                         };
                    });
                    if((isShowBookmark == 1)&&(stopCriteriaShows==0)){
                        getRemainderShowTimeline();
                    //} 
                    //else { 
                    //   showsDateArray = buildEventInfoArrays(eventSource_shows);               
                    };                                       
            });
    }

      
   function getShowTimeline() {
        var burl = 'http://1.latest.syncusup.appspot.com/show?callback=?';
        //var burl = 'http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?'

        alert("in getShowTimeline navMode is " + navMode+ " burl is    " + burl);

            if(bmarkShows !=0){
                var burl = burl+"&bookmark="+bmarkShows;
                alert("in getShowTimeline bmarkShows = " + bmarkShows);

            }
            jQuery.ajax({   
                type: "POST",   
                url: "WebService1.ASMX/HelloWorld",   
                //contentType: "application/json; charset=utf-8",   
                dataType: "json",   
                data: "{}",   
                success: function(res) {   
                        alert("in getShowTimeline, first JSONAJAX=" + res);

                // Do your work here.   
                // Remember, the results for a ASMX Web Service are wrapped   
                // within the object "d" by default. e.g. {"d" : "Hello World"}   
                }   
            });
            jQuery.getJSON(burl, function(data) {  
                    alert("in getShowTimeline, first JSON=" + data[0]);

                    jsonshowdata=data;
                    isShowBookmark= 0;
                      jQuery.each(data, function(i, n) { 
                              alert("in getShowTimeline, i=" + i);
                        if(i=="bookmark"){
                            bmarkShows = n;
                            isShowBookmark =1;
       //                     var burl2 = burl + "&bookmark="+ bmarkBstage;
                            alert("SHOWTT bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        } 
                        //if(i=="events")   THE WAY IT USED TO WORK
                        else {
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                              if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    evt.id = data.id;
                                    alert("SHOWID is " + data.id);

                                    //evt.start = new Date(data.start.replace(/-/g,"/")); 
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = false;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);

                            eventSource_shows.add(evtDone);
                            j++;
                            };
                         };
                    });
                    if((isShowBookmark == 1)&&(stopCriteriaShows == 0)){
                        getRemainderShowTimeline();
//                    }
//                    else { 
//                       showsDateArray = buildEventInfoArrays(eventSource_shows);               
                    };
                    makeTimeline();
                    if(navMode==2){
                        alert("calling onShowChange from getShowTImeline   ");
                        onShowChange();
                    }
                    else {getTwitterTimeline();};
            });
    }
function getRemainderBackstageTimeline() {
            var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?';
            if(bmarkBstage !=0){
                var burl = burl+"&bookmark="+bmarkBstage;
            }
            //alert("burl maybe +bookmark i is " + burl);
            jQuery.getJSON(burl, function(data) {   
                      jsonshowdata=data;
                     // alert("RemainderbackstageJSONqueryobs   " + data);
                      isBstageBookmark= 0;
                      jQuery.each(data, function(i, n) {
                        //alert("jqueryeach i is " + i + "n is " + n);

                        if(i=="bookmark"){
                            bmarkBstage = n;
                            isBstageBookmark =1;
       //                     var burl2 = burl + "&bookmark="+ bmarkBstage;
       //                     alert("bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        };
                        if(i=="events"){
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                              if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    //evt.id = 'F';
                                    //evt.start = new Date(data.start.replace(/-/g,"/")); 
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = true;
                                    evt.image = data.image;
                                    evt.type = data.type;
                                    evt.icon = data.image;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);

                            eventSource_bstage.add(evtDone);
                            j++;
                            };
                         };
                    });
                    if((isBstageBookmark == 1)&&(stopCriteriaBstage == 0)){
                        getRemainderBackstageTimeline();
                    };
                    //timeLine.finishedEventLoading();
            });
    }

function getBackstageTimeline() {
            var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?';
            if(bmarkBstage !=0){
                var burl = burl+"&bookmark="+bmarkBstage;

            }
            jQuery.getJSON(burl, function(data) {   
                      jsonshowdata=data;
                      isBstageBookmark= 0;
                      jQuery.each(data, function(i, n) {
        //                alert("jqueryeach i is " + i + "n is " + n);

                        if(i=="bookmark"){
                            bmarkBstage = n;
                            isBstageBookmark =1;
       //                     var burl2 = burl + "&bookmark="+ bmarkBstage;
       //                     alert("bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        };
                        if(i=="events"){
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                              if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    //evt.id = 'F';
                                    //evt.start = new Date(data.start.replace(/-/g,"/")); 
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = true;
                                    evt.image = data.image;
                                    evt.type = data.type;
                                    evt.icon = data.image;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);

                            eventSource_bstage.add(evtDone);
                            j++;
                            };
                         };
                    });
                    if((isBstageBookmark == 1)&&(stopCriteriaBstage == 0)){
                        getRemainderBackstageTimeline();
                    };
                       getShowTimeline();
            });
    }
function getRemainderBackstageTimelineFromShowID(showid) {
            var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?';
            //var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?&showid=';
            if(bmarkBstage !=0){
                var burl = burl+"&bookmark="+bmarkBstage;
            }
            var burl = burl + "&showid=" +showid;

            //alert("burl maybe +bookmark i is " + burl);
            jQuery.getJSON(burl, function(data) {   
                      jsonshowdata=data;
                      //alert("RemainderbackstageJSONqueryobs   " + data);
                      isBstageBookmark= 0;
                      jQuery.each(data, function(i, n) {
                        //alert("jqueryeach i is " + i + "n is " + n);

                        if(i=="bookmark"){
                            bmarkBstage = n;
                            isBstageBookmark =1;
       //                     var burl2 = burl + "&bookmark="+ bmarkBstage;
       //                     alert("bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        };
                        if(i=="events"){
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                              if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    //evt.id = 'F';
                                    //evt.start = new Date(data.start.replace(/-/g,"/")); 
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = true;
                                    evt.image = data.image;
                                    evt.type = data.type;
                                    evt.icon = data.image;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);

                            eventSource_bstage.add(evtDone);
                            //alert("addedRemainderEvent");

                            j++;
                            };
                         };
                    });
                    if((isBstageBookmark == 1)&&(stopCriteriaBstage == 0)){
                        getRemainderBackstageTimelineFromShowID(showid);
                    };
                    //timeLine.finishedEventLoading();
            });
    }

function getBackstageTimelineFromShowID(showid) {
           // eventSource_bstage.clear;
           // eventSource_songs.clear;
           // eventSource_tweets.clear;
            loadedShowHash[showid] = true;
            var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?';
            //var burl = 'http://1.latest.syncusup.appspot.com/event?callback=?&showid=';
            if(bmarkBstage !=0){
                var burl = burl+"&bookmark="+bmarkBstage;

            }
            var burl = burl + "&showid=" +showid;
            //alert("burl is   " + burl);
            jQuery.getJSON(burl, function(data) {   
                      jsonshowdata=data;
                      isBstageBookmark= 0;
                      jQuery.each(data, function(i, n) {
                        //alert("jqueryeach i is " + i + "n is " + n);

                        if(i=="bookmark"){
                            bmarkBstage = n;
                            isBstageBookmark =1;
                            //var burl2 = burl + "&bookmark="+ bmarkBstage;
                            //alert("bookmark key is " + bmarkBstage + "next url will be " + burl2);
                        };
                        if(i=="events"){
                            var j=0;
                            while(n[j]!=null){
                               var data = n[j];
                               var myid = "MYID";
                               var mydesc = "temp";
                               // if(isEventLoaded(data.image)) not implemented yet.
                                   if(data.description!=null){mydesc = data.description;};                        
                                   var evt = new Object()
                                    evt.start = Timeline.DateTime.parseIso8601DateTime(data.start); 
                                    evt.end = Timeline.DateTime.parseIso8601DateTime(data.end);
                                    evt.text = data.title;
                                    evt.instant = true;
                                    evt.image = data.image;
                                    evt.type = data.type;
                                    evt.icon = data.image;
                                    evt.description = mydesc;
                                    var evtDone = new Timeline.DefaultEventSource.Event(evt);
                            eventSource_bstage.add(evtDone);
                            j++;
                            };
                         };
                    });
                    if((isBstageBookmark == 1)&&(stopCriteriaBstage == 0)){
                        //alert("callingRemainderBackstageTimeline from backStageFromID");
                        getRemainderBackstageTimelineFromShowID(showid);
                    };
                        //alert("callingGetTwitterTimeline from backStageFromID");
                    bstageDateArray = buildEventStartDateArrays(eventSource_bstage);
                    numCurBstage = bstageDateArray.length;
                    centerProjNextDyn();
                    getTwitterTimeline();
            });
    }
    function removeTweets() {
                eventSource_tweets.removeAll;
                timeLine.paint();
    }
    function buildBSTAGEEventStartDateArrays() {
        //var evtItr = eventSource_bstage.getEventReverseIterator(startProj, endProj);
        var evtItr = timeLine.getBand(1).getEventSource().getEventReverseIterator(startProj, endProj);
        var numEvents = eventSource_bstage.getCount();
        var dateArray = [];
        var i = 0;
        //alert( "BSTAGE:  eventSource_bstage.getCount() = " + numEvents);

        while (evtItr.hasNext()) {
            evt = evtItr.next() ;
            alert( "evt.getStart() " + evt.getStart() + "i = " + i );
            dateArray[i++]= evt.getStart() ;
        }
//         dateArray[i++] = evtItr.getEarliestDate();
//         dateArray[i] = evtItr.getLatestDate();
//         alert( "BSTAGE:  eventSource_bstage.Earliest = " + evtItr.getEarliestDate()
//                + "eventSource_bstage.Latest = " + evyItr.getLatestDate()); 
          return dateArray;
    }

    function buildEventStartDateArrays(local_eventSource) {
        var evtItr = local_eventSource.getEventReverseIterator(startProj, endProj);
        var numEvents = local_eventSource.getCount();
        //alert( "length of local event source " + numEvents);

        var dateArray = [];
        var i = 0;

        while (evtItr.hasNext()) {
            evt = evtItr.next() ;
            //alert( "evt.getStart() " + evt.getStart() + "i = " + i + "startProj is  " + startProj);
      // ADDING IF WITHIN STARTPROJ and END PROJ so NAC works on PERFORMANCES PAGE
        // if date is greater than startProj and less than end Proj
            if ((evt.getStart() >= startProj) && (evt.getStart() <= endProj)) {
                //alert( "  : date is inclusive");
                dateArray[i++]= evt.getStart() ;
            };
        }          
          return dateArray;
    }
    function onShowChange(e) {
            var evtItr = eventSource_shows.getEventReverseIterator(minProjDate, maxProjDate );
            var showname;
            var showIDArray = [];
            //eventSource_bstage.removeAll;
            //eventSource_songs.removeAll;
            //eventSource_tweets.removeAll;
            var numCurTweets = 0;
            var numCurBstage = 0;
            var numCurSongs = 0;
            var numCurShows = 0;
            
            bmarkTweets = 0;
            bmarkBstage = 0;
            bmarkSongs = 0;
            bmarkShows = 0;
            isbookmark = 0;
            
            //alert ("changed show name to   " + document.showFormName.showSelectName.options[
            //    document.showFormName.showSelectName.selectedIndex].value);
            showname = document.showFormName.showSelectName.options[
                document.showFormName.showSelectName.selectedIndex].value;
            showIDArray[0]=showname;
            while (evtItr.hasNext()) {
                evt = evtItr.next() ;
                if (evt.getText() == showname) {
                    showIDArray[1]=evt.getStart();
                    showIDArray[2]=evt.getEnd();
                    showIDArray[3]=evt.getID();
                    //showIDArray[3]= "aghzeW5jdXN1cHIOCxIGT1NTaG93GKGcAQw"
                    //showIDArray[4]=evt.bookmark;
                    startProj = evt.getStart();
                    endProj = evt.getEnd();
                    //what's the way to exit the while loop on a match?;
                };
            }
                //"location.href=showselect.option[showselect.selectedIndex].value"
            //alert("showIDArray[3] is   " + showIDArray[3]);
            if(areShowDetailsLoaded(showIDArray[3])){
                setFiltersOnOtherShows(showIDArray[3]);
            }
            else {
                //alert("enteringBackStageTimeinefromShowID");
                getBackstageTimelineFromShowID(showIDArray[3]);
            };
            centerProjStart();
            timeLine.paint();
        }
    function areShowDetailsLoaded(localShowID){
        if(loadedShowHash[localShowID]!=null){
            return true;
        }
        else { return false;};
    }
    function setFiltersOnOtherShows(localShowID){
        return null;
    }
    function buildEventInfoArrays(local_eventSource) {
        var mypara;
        var showform;
        var showselect;
        var evtItr = local_eventSource.getEventReverseIterator(minProjDate, maxProjDate);
        var numEvents = local_eventSource.getCount();
       alert( "length of local event source " + numEvents);
        var dateArray = [];
        var tempdate;
        var temp2date;        
        var i = 0;
        mypara=document.getElementById("criteria");
        showform=document.createElement("form");
        showselect = document.createElement("select");
        while (evtItr.hasNext()) {
            evt = evtItr.next() ;
            dateArray[i++]= evt.getStart() ;

            theOption=document.createElement("OPTION");
            theText=document.createTextNode(evt.getText());
            theOption.appendChild(theText);
            showselect.appendChild(theOption);
        //theOption.setAttribute("value","getElementByID.htm");
        //theOption=document.createElement("OPTION");
        //theOption.value="modifyingExistingText.htm";
        //theOption.innerHTML="Modifying Existing Text";
            tempdate = evt.getStart();
            temp2date = evt.getEnd();
            //alert ("tempdate for date compare is  " + tempdate + "startProj is " + startProj);
            if (startProj==null){ startProj=tempdate;};
            if (endProj==null){ endProj=temp2date;};

            if (tempdate < startProj ) {
                //alert ("inside if date compare")
                startProj = tempdate;
            };
            if (temp2date > endProj ) {
            endProj = temp2date;
            };
        }          
        showform.appendChild(showselect);
        //mypara.appendChild(showform);
        showselect.onchange=onShowChange;
        mybutton=document.createElement("BUTTON");
        mypara=document.getElementById("criteria"); //get rid of this line
        mypara.appendChild(showform);

        //function myOnClick(e) { alert('Hello'); }
        //mybutton.onclick=myOnClick;
        //mybutton.style.height=20; mybutton.style.width=75;
        //theText=document.createTextNode("Display Show");
        //mybutton.appendChild(theText);
        //showform.appendChild(mybutton);
        showselect.setAttribute("id","selectID");
        showselect.setAttribute("name","showSelectName");

        showform.setAttribute("id","formID");
        showform.setAttribute("name","showFormName");

        return dateArray;
    }          
    
    function centerProjStart() {
       //timeLine.getBand(0).setCenterVisibleDate(startProj);
       timeLine.getBand(3).setMinVisibleDate(startProj);
       //scroll to first event on the btrack event band
       //scrollProjEvent = getNextEventFromDate(startProj());
       //timeLine.getBand(1).scrollToCenter(startProj);


    }
            
   function centerProjEnd() {
      timeLine.getBand(3).setMaxVisibleDate(endProj);
      //scrollProjEvent = getPrevEventFromDate(endProj());
      //timeLine.getBand(1).scrollToCenter(startProj);

   }

   function centerProjPreviousDyn(eventDateArray) {
         //alert("center PRoj Dyn");
         var eventType = document.eventForm.site.options[document.eventForm.site.selectedIndex].value
         switch (eventType) {
            case "twitter":
                            if( numCurTweets < (tweetsDateArray.length-1) ){
       //                         alert( "numCurTweets =" + numCurTweets
       //                         + "  evtDate is "
       //                         + tweetsDateArray[numCurTweets] + "I calculate "
       //                         + tweetsDateArray.length + eventType + " events");
                                numCurTweets++;
                                timeLine.getBand(0).setCenterVisibleDate(tweetsDateArray[numCurTweets]);

                            };
                            break;
            case "backstage":
           //                 alert( "numCurBstage =" + numCurBstage + "length" + bstageDateArray.length);
                            if( numCurBstage < (bstageDateArray.length-1) ){
             //                   alert( "numCurBstage =" + numCurBstage
             //                   + "  evtDate is "
             //                   + bstageDateArray[numCurBstage] + "I calculate "
             //                   + bstageDateArray.length + eventType + " events");
                                numCurBstage++;
                                timeLine.getBand(0).setCenterVisibleDate(bstageDateArray[numCurBstage]);
                                //scrollProjEvent = getNextEventFromDate(startProj());


                            };
                            break;            
            case "songs":
                            if( numCurSongs < (songsDateArray.length-1) ){
       //                         alert( "numCurSongs =" + numCurSongs
       //                         + "  evtDate is "
       //                         + songsDateArray[numCurSongs] + "I calculate "
       //                         + songsDateArray.length + eventType + " events");
                                numCurSongs++;
                                timeLine.getBand(0).setCenterVisibleDate(songsDateArray[numCurSongs]);

                            };
                            break;            
            case "shows":
                            if( numCurShows < (showsDateArray.length-1) ){
       //                         alert( "numCurShows =" + numCurShows
       //                         + "  evtDate is "
       //                         + showsDateArray[numCurShows] + "I calculate "
       //                         + showsDateArray.length + eventType + " events");
                                numCurShows++;
                                timeLine.getBand(0).setCenterVisibleDate(showsDateArray[numCurShows]);

                            };
                            break;
                            
         }


   }   
    function centerProjNextDyn(eventDateArray) {
         var eventType = document.eventForm.site.options[document.eventForm.site.selectedIndex].value
         switch (eventType) {
            case "twitter":
                            if( numCurTweets > 0 ){
  //                              alert( "numCurTweets =" + numCurTweets
  //                              + "  evtDate is "
  //                              + tweetsDateArray[numCurTweets] + "I calculate "
  //                              + tweetsDateArray.length + eventType + " events");
                                numCurTweets--;
                                timeLine.getBand(0).setCenterVisibleDate(tweetsDateArray[numCurTweets]);

                            };
                            break;
            case "backstage":
 //                           alert( "bstageArraylength " + bstageDateArray.length
 //                                + " eventSource_bstage.getCount() = " + eventSource_bstage.getCount()
 //                                + "numCurBstage =" + numCurBstage );
                            if( numCurBstage > 0 ){
 //                               alert( "numCurBstage =" + numCurBstage
 //                                   + "  evtDate is "
 //                                   + bstageDateArray[numCurBstage] + "I calculate "
 //                                   + bstageDateArray.length + eventType + " events");
                                numCurBstage--;
                                timeLine.getBand(0).setCenterVisibleDate(bstageDateArray[numCurBstage]);

                            };
                            break;            
            case "songs":
  //                          alert( "songsArraylength " + songsDateArray.length);                            
                            if( numCurSongs > 0 ){
  //                              alert( "numCurSongs =" + numCurSongs
  //                              + "  evtDate is "
  //                              + songsDateArray[numCurSongs] + "I calculate "
  //                              + songsDateArray.length + eventType + " events");
                                numCurSongs--;
                                timeLine.getBand(0).setCenterVisibleDate(songsDateArray[numCurSongs]);

                            };
                            break;            
            case "shows":
                            if( numCurShows > 0 ){
  //                              alert( "numCurShows =" + numCurShows
  //                              + "  evtDate is "
  //                              + showsDateArray[numCurShows] + "I calculate "
  //                              + showsDateArray.length + eventType + " events");
                                numCurShows--;
                                timeLine.getBand(0).setCenterVisibleDate(showsDateArray[numCurShows]);

                            };
                            break;                            
         }

   }   
   var resizeTimerID = null;    
   $('body').resize(function() { 
      if (resizeTimerID == null) { 
         resizeTimerID = window.setTimeout(function() { 
            resizeTimerID = null; 
            timeLine.layout(); 
         }, 500); 
      } 
   }); 
       
   function replaceUrlWithHtmlLinks(text) {     
      var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;     
      return text.replace(exp,"<a href='$1'>$1</a>");  
   }    
   function eventCyclicHandler(form){
        var eventType = document.eventForm.site.options[document.eventForm.site.selectedIndex].value;
        //bstageDateArray = buildEventStartDateArrays(eventSource_bstage);
        buildBSTAGEEventStartDateArrays();
        //numCurBstage = bstageDateArray.length;

   }
   function doPostShowTimeline(){
        bstageDateArray = buildEventStartDateArrays(eventSource_bstage);
        numCurBstage = bstageDateArray.length;
   }
   
   
 
