

var tw =
{


  USE_TWITTER:		// preferred
	{
		api: { twitter: { com: 'http://api.twitter.com' } }
	, twitter: { com: 'http://twitter.com' }
	}	// opts

, USE_PROXY:		// for those suffering behind an overly-stringent firewall (assuming data.lnal.com is accessible)
	{
		api: { twitter: { com: 'http://data.lnal.com/!/twurlp/api' } }
	, twitter: { com: 'http://data.lnal.com/!/twurlp/tw' }
	}	// opts

, REGURL: /[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g







, init: function ()
		{
//  build indices...
		metaTwitter.statuses.indices = { byID: new Array() };

		for ( var i = 1;  i < metaTwitter.statuses.db.length;  i++ )	// yes,  var i = 1 don't index the first NULL element
			metaTwitter.statuses.indices.byID[ metaTwitter.statuses.db[i].twStsID ] = metaTwitter.statuses.db[i];


		this.cookie = new core.cookie( '8a1621dae39bf1d91d372c77f441e80b8f68b9b6', { domain: 'lnal.com', path: '/' } );
		this.cookie.settings = this.cookie.value();	// extract and decode 'twitter' cookie, but use the cookie object itself to hold the settings
		this.cookie.settings = ( (typeof this.cookie.settings) != 'undefined' && this.cookie.seetings != this.cookie.EMPTY_JAR   ?  this.cookie.settings
			: { useProxy: false } );

		this.http = ( this.cookie.settings.useProxy  ?  this.USE_PROXY  :  this.USE_TWITTER );
		}	// End method; init







, loadFieldTweets: function ()
		{
		core.json( this.http.api.twitter.com + '/1/LNALcom/lists/field-updates/statuses.json?callback=tw.LNALfieldsCallback' );
		}	// End method; loadFieldTweets




, loadHeaderTweets: function ()
		{
//		core.json( this.http.twitter.com + '/statuses/user_timeline/LNALadvisory.json?callback=tw.LNALadvisoryCallback' );
		core.json( this.http.api.twitter.com + '/1/statuses/user_timeline.json?trim_user=1&include_rts=1&include_entities=1&callback=tw.LNALadvisoryCallback&screen_name=LNALadvisory' );
//		core.json( this.http.api.twitter.com + '/statuses/user_timeline/LNALcom.json?callback=tw.LNALcomCallback' );
		core.json( this.http.api.twitter.com + '/1/statuses/user_timeline.json?trim_user=1&include_rts=1&include_entities=1&callback=tw.LNALcomCallback&screen_name=LNALcom' );
		}	// End method; loadHeaderTweets




, listItems: function 
(
  tweets
, metaDefaults
)
		{
		var twLI = '';
		var tweet;
		var meta;


		for ( var sts = 0;  sts < tweets.length;  sts++ )
			{
			twt = tweets[sts];
			if ( (typeof twt.posted) == 'undefined' ) 	twt.posted = new Date( metaTwitter.ieDate( twt.created_at ) );

			if ( twt.posted.getTime() > document.mxRev.getTime() )	document.mxRev = new Date( twt.posted.getTime() );


			meta = metaTwitter.statuses.indices.byID[ twt.id_str ];
			meta = ( (typeof meta) != 'undefined'  ?  meta  :  metaDefaults );

			if ( (typeof meta.isExpired) != 'undefined'  &&  meta.isExpired( twt, meta ) )		continue;	 //skip this expired tweet

			var t =  twt.text;

			if ( (typeof twt.entities.urls) != 'undefined' )
				{
				for ( var u = 0;  u < twt.entities.urls.length;  u++ )
					{
					var p = t.indexOf( twt.entities.urls[u].url );
					if ( p < 0 )	continue;
					t = t.substring( 0, p ) + '<a class="tweetLink" href="' + twt.entities.urls[u].expanded_url + '" target="_blank" title="Opens ' + twt.entities.urls[u].expanded_url + ' in new window.">' + twt.entities.urls[u].display_url + '</a>' + t.substring( p + twt.entities.urls[u].url.length );
					}	// End for; span of URLs fucked up by Twitter
				}
			else
				t = t.replace( this.REGURL, this.url );

			if ( (typeof twt.entities.user_mentions) != 'undefined' )
				{
				for ( var u = 0;  u < twt.entities.user_mentions.length;  u++ )
					{
					var p = t.indexOf( twt.entities.user_mentions[u].screen_name );
					if ( p < 0 )	continue;
					t = t.substring( 0, p ) + '<a class="tweetLink" href="http://twitter.com/' + twt.entities.user_mentions[u].screen_name + '" target="_blank" title="Follow/view ' + twt.entities.user_mentions[u].screen_name + ' (' + twt.entities.user_mentions[u].name + ') on Twitter">' + twt.entities.user_mentions[u].screen_name + '</a>' + t.substring( p + twt.entities.user_mentions[u].screen_name.length );
					}	// End for; span of user mentions
				}


			twLI += '<li title="posted: ' + dtUtil.CONST.Ddd[twt.posted.getDay()] + ' ' + dtUtil.hmMD( twt.posted ) + '" >'
						+ '<div class="rtDate" style="margin: 0 20px 0 10px;" onclick="window.prompt( \'Twitter status ID:\', \'' + twt.id + '\' );">' + dtUtil.hmMD( twt.posted ) + '</div>'
						+ ( (typeof meta.uri) != 'undefined'  ?  '<a href="' + meta.uri + '">'  :  '' )
//						+ twt.text.replace( /\</g, '&lt;' ).replace( /\>/g, '&gt;' ).replace( /\&/g, '&amp;' ).replace( /\n/g, '<br/>' ).replace( this.REGURL, this.url )
						+ t.replace( /\n/g, '<br/>' )
						+ ( (typeof meta.uri) != 'undefined'  ?  '</a></li>'  :  '</li>' )
						;
			}	// End for; span of tweets

		return	twLI;
		}	// End method; listItems




// Twitter callbacks
, LNALadvisoryCallback: function
(
  tweets
)
		{
		if ( (typeof tweets) == 'undefined'  ||  tweets.length < 1 )		return;

		var html = this.listItems( tweets, { isExpired: function ( t, m ) { return t.posted.getTime() < dtUtil.CONST.today.getTime() }  } );
		if ( html.length > 0 )
			{
			document.getElementById( 'twLNALadvisory-tweets' ).innerHTML = html;
			document.getElementById( 'twLNALadvisoryDIV' ).style.display = 'block';
			}
		}	// End method; LNALadvisoryCallback




, LNALcomCallback: function
(
  tweets
)
		{
		if ( (typeof tweets) == 'undefined'  ||  tweets.length < 1 )		return;

		var html = this.listItems( tweets, {} );
		if ( html.length > 0 )
			{
			document.getElementById( 'twLNALcom-tweets' ).innerHTML = html
			document.getElementById( 'twLNALcomDIV' ).style.display = 'block';
			document.getElementById( 'twLNALcomDIVtwid' ).style.display = 'none';
			}
		}	// End method; LNALComCallback




, LNALfieldsCallback: function
(
  tweets
)
		{
		if ( (typeof tweets) == 'undefined'  ||  tweets.length < 1 )		return;

		var twDiv;
		var twUID = '';
		var tweet;

		for ( var s = 0;  s < tweets.length;  s++ )
			tweets[s].posted = new Date( metaTwitter.ieDate( tweets[s].created_at ) );

		tweets.sort( this.sortbyUIDbyPosted );


		for ( var s = 0;  s < tweets.length;  s++ )
			{
			tweet = tweets[s];
			if ( tweet.user.id == twUID )	continue;	// post only the latest tweet
			twUID = tweet.user.id;

			var meta = metaTwitter.statuses.indices.byID[ tweet.id_str ];
			if ( (typeof meta) != 'undefined' )
				{
				if ( meta.isExpired( tweet, meta ) )		continue;
				}
			else
				if ( tweet.posted.getTime() < dtUtil.CONST.today.getTime() )		continue;	// skip yesterday's (or older) tweets (by default )


			twDiv = document.getElementById( tweet.user.screen_name );
			if ( (typeof twDiv) == 'undefined'  ||  twDiv == null )		continue;	// not a recognized field

			twDiv.innerHTML = tweet.text.replace( /\n/g, '<br/>' );
			twDiv.style.display = 'block';
			twDiv.title = 'posted: ' + tweet.posted.toString();

			}	// End for; span of tweets -- from list of all fields


		}	// End method; LNALfieldsCallback




, sortbyUIDbyPosted: function
(
  t1
, t2
)
		{
		// sort by UID (asc), posted (desc)
		return	( t1.user.id > t2.user.id  ?  1  :  ( t1.user.id < t2.user.id  ?  -1  :  t2.posted.getTime() - t1.posted.getTime()  ) );
		}	// End method; sortbyUIDbyPosted




, useTwitterProxy: function()
		{
		var inp = document.getElementById( 'siteOptsUseTWProxy' );	// because the entire row/div might be clicked.
		inp.checked = !inp.checked;

		this.http = ( inp.checked  ?  this.USE_PROXY  :  this.USE_TWITTER );

		this.cookie.settings.useProxy = inp.checked;
		this.cookie.store( this.cookie.settings );

		}	// End method; 




, url: function
(
  u
)
		{
		return	'<a href="' + u + '" target="_blank">' + u + '</a>';
		}


}	// End object; tw








tw.init();




