    var resultsDisplayed = false;
	var postsDisplayed = false;
	var photosDisplayed = false;
	var datesDisplayed = false;
	var tripsDisplayed = false;
	var sitesDisplayed = false;
	var profileDisplayed = false;
	var statusDisplayed = false;
	
    var listName = "menu-list";
	var siteWindowName = "site-window";
	var menuItemHeight = 39;
	var menuItemWidth = 200;
	var thisMonth = 0;
	var thisYear = 0;
	var leftStart = -200;
	var listCount = 0;
	var leftEnd = 0;
	var isMoving = false;
	var movesLeft = 0;
	var gotoStart = false;
	var gotoEnd = false;
	var lastSite = "";
	var nextSite = "";
	var siteStart = 400;
	var siteWindowVisible = false;
	
	
function getHTTPObject()
{
    var request = null;

    //Mozilla-based browsers
    if(window.XMLHttpRequest){
        request = new XMLHttpRequest();
    } else if (window.ActiveXObject){
        request=new ActiveXObject("Msxml2.XMLHTTP");
        if (!request){
            request=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    if(request)  
    {
	return request;
    }  
    else 
    {
        alert("Your browser does not permit the use of all of this application's features!");
    }
}

	function loadMenu()
	{
		Effect.Appear('menu', { duration: 2 });
	}

    function LoadSite() 
	{
		loadPhotos();

		loadPosts(true);
		
		loadDates();
		
		loadTwitter();
		
		loadSearch();
		
    }
	
	function loadSearch()
	{
// Create a search control
      var searchControl = new google.search.SearchControl();
	  searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);
	  
		searchControl.setSearchCompleteCallback(this, function(searchControl, searcher) { showPanel("search_results"); });
      // Add in a full set of searchers
      var webSearch = new google.search.WebSearch();
	  var options = new google.search.SearcherOptions();
      webSearch.setSiteRestriction("006001821197199444365:rivemjzzwso");
      webSearch.setUserDefinedLabel("Results from kris.nelson");
	  options.setRoot(document.getElementById("search_results"));	  
	options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
      searchControl.addSearcher(webSearch, options);      

      // tell the searcher to draw itself and tell it where to attach
      searchControl.draw(document.getElementById("searchcontrol"));

      // execute an inital search
      //searchControl.execute("Maui");  		
	}
	
	function addHeaderTag(div, htag, s)
	{
		var h = document.createElement(htag)
		h.appendChild(document.createTextNode(s));
		div.appendChild(h);
	}
	
	function prefetchFeed(url)
	{
		var feed = new google.feeds.Feed(url);
		feed.setNumEntries(100);
		//feed.load(function(result) { alert("finished: " + url); } );
	}
	
 	function loadPosts(isInitialLoad) {
		var container = document.getElementById("posts");		  
		container.innerHTML = "";
      var feed = new google.feeds.Feed("http://kris-nelson.com/rss/index.php");
	  feed.setNumEntries(8);
      feed.load(function(result) {
        if (!result.error) {
		  addHeaderTag(container, "h3", "Recent posts from kris.nelson");
          for (var i = 0; i < result.feed.entries.length; i++) {
            var entry = result.feed.entries[i];
//            var div = document.createElement("div");
//            div.appendChild(document.createTextNode(entry.title));
            container.appendChild(formatPost(entry));
          }
        }
      });
	  
	  if (isInitialLoad == true)
	  {
		  // set this month and year
		  var today = new Date();
		  thisMonth = today.getMonth() + 1;
		  thisYear = today.getFullYear();
		  // is initial load, also load calendar
		  requestBlogDates(thisMonth, thisYear, "cal_middle");
	  }
	  else
	  {
		  // no initial load, but a reload, make posts appear again
		  Effect.Appear("posts", { duration: 0.5 });
	  }
    }
	
 	function loadDailyPosts(m, d, y) {
		//alert("Load Daily Posts for " + m + "/" + d + "/" + y); 
		// use 0 for d= in URL to retrieve entire month, make cache more efficient
		//alert("http://kris-nelson.com/rss/daily.php?m=" + m + "&d=0&y=" + y);
		var file = y.toString();
		if (m < 10) file += "0" + m.toString(); else file += m.toString();
      //var feed = new google.feeds.Feed("http://kris-nelson.com/rss/daily.php?m=" + m + "&d=0&y=" + y);
      var feed = new google.feeds.Feed("http://kris-nelson.com/rss/" + file + ".xml"); //daily.php?m=" + m + "&d=0&y=" + y);
	  feed.setNumEntries(100);
      feed.load(function(result) {
        if (!result.error) {
          var tempContainer = document.getElementById("posts_hidden");
		  tempContainer.innerHTML = "";
		  showDate = gsMonthNames[m-1] + " " + d + ", " + y;
		  addHeaderTag(tempContainer, "h3", "Posts from kris.nelson on " + showDate);
          for (var i = 0; i < result.feed.entries.length; i++) {
            var entry = result.feed.entries[i];
			// check publisher data of entry before displaying
			
			var tzo = (new Date().getTimezoneOffset()/60); 
			entry.publishedDate = new Date(entry.publishedDate);

			//alert(entry.publishedDate);
			var dt = new Date(entry.publishedDate);
			dt = new Date(dt.getTime() + (tzo * 3600000));
			
			//alert(entry.title + "\r\n" + entry.publishedDate);
			//alert(entry.publishedDate.getDate());
			if (dt.getDate() == d)
			{
				//alert("original: " + dt);
				//alert(entry.title + "\r\n" + dt + "\r\n" + dt.getDate());

				// add to list
            	tempContainer.appendChild(formatPost(entry));
			}
          }
		  
		  var lnk = document.createElement("a");
		  lnk.setAttribute("onclick", "javascript:resetPosts(0, 0, 0);");
		  lnk.setAttribute("href", "javascript:void(0);");
		  lnk.appendChild(document.createTextNode("View Recent Posts"));
		  var p = document.createElement("p");
		  p.setAttribute("class", "post");
		  p.setAttribute("className", "post");
		  p.appendChild(lnk);
		  tempContainer.appendChild(p);
		  
		  // copy to container
          var mainContainer = document.getElementById("posts");
		  mainContainer.innerHTML = tempContainer.innerHTML;
		  // show daily
			Effect.Appear("posts", { duration: 0.5 });
        }
      });
    }
		
	function resetPosts(m, d, y)
	{
		// hide current posts
		if (y > 0)
		{
			Effect.Fade("posts", { duration: 0.5,
								afterFinish: function(p){ loadDailyPosts(m, d, y); } });
		}
		else
		{
			Effect.Fade("posts", { duration: 0.5,
								afterFinish: function(p){ loadPosts(false); } });		
		}
		// use params for loading new posts
		
	}
		
	
 	function loadDates() {
      var feed = new google.feeds.Feed("http://www.theciolinos.com/rss/index.php");
	  feed.setNumEntries(10);
      feed.load(function(result) {
        if (!result.error) {
          var container = document.getElementById("dates");
          for (var i = 0; i < result.feed.entries.length; i++) {
			  if ( i >= result.feed.entries.length) break;
            var entry = result.feed.entries[i];
//            var div = document.createElement("div");
//            div.appendChild(document.createTextNode(entry.title));
            container.appendChild(formatDateEntry(entry));
          }
        }
      });
    }
		
	function loadPhotos()
	{
		requestPhotos("./flickr/index.php", "photos");
	}

	function loadTwitter()
	{
		requestTwitter("./twitter/index.php", "profile", "status");
	}
	

	function getBlogName(url)
	{
		// skip http:// - 7 chars
		url = url.substring(7);
		// find first slash
		var index = url.indexOf("/");
		var domain = url.substring(0, index);
		switch (domain)
		{
			case "www.webnelly.com": return "webnelly.com blog";
			case "www.krisandcindy.com": return "Kris & Cindy's Blog";
			case "www.photonelly.com": return "photonelly.com blog";
			case "www.kaanapalidreamin.com": return "Ka'anapali Dreamin' Blog";
			default: return "";
		}
	}

	function formatPost(entry)
	{
        var div = document.createElement("div");
		var title = entry.title;
		var postLink = entry.link;
		
		// read timezone from browser and update before display
		var tzo = (new Date().getTimezoneOffset()/60); 
		var d = new Date(entry.publishedDate);
		//alert(typeof(d));
		entry.publishedDate = new Date(d.getTime() + (tzo * 3600000));
		
		var date = new Date(entry.publishedDate).format('dddd, mmmm dd, yyyy h:nn A/P');
	  	var content = entry.contentSnippet;
		var blogName = getBlogName(postLink);
		  
		// create title as link
		  var a = document.createElement("a");
		  a.setAttribute("href", postLink);
		  a.appendChild(document.createTextNode(title));
		  div.appendChild(a);
		  
		  // check post author
		  if (entry.author != "Kris Nelson")
		  {
			  div.appendChild(document.createTextNode(" - posted by " + entry.author));
		  }
		  div.appendChild(document.createElement("br"));
			
		// create date
		var sp = document.createElement("span");
		sp.setAttribute("class", "date");
		sp.setAttribute("className", "date");
		sp.appendChild(document.createTextNode(date));		
		  if (blogName != "") sp.appendChild(document.createTextNode(" - " + blogName));
		div.appendChild(sp);
		  div.appendChild(document.createElement("br"));
		
		// create content
		div.appendChild(document.createTextNode(content));
//        div.appendChild(sp);
		  
		  div.setAttribute("class", "post");
		  div.setAttribute("className", "post");
		  return div;
	}
	
	function formatDateEntry(entry)
	{
        var div = document.createElement("div");
		var title = entry.title;
	  	var eventDate = entry.contentSnippet;

		// use date as label
		var lbl = document.createElement("label");
		lbl.appendChild(document.createTextNode(eventDate + " - "));
		div.appendChild(lbl);
		
		// create name as span
		  var sp = document.createElement("sp");
		  sp.appendChild(document.createTextNode(title));
		  div.appendChild(sp);
		  
		  div.setAttribute("class", "date");
		  div.setAttribute("className", "date");
		  return div;
	}
	
	function hidePanel(name)
	{
		switch (name)
		{
			case "search_results":
				if (resultsDisplayed == false) return;
				resultsDisplayed = false;			
				break;
				
			case "posts":
				if (postsDisplayed == false) return;
				postsDisplayed = false;			
				break;
				
			case "photos":
				if (photosDisplayed == false) return;
				photosDisplayed = false;			
				break;
				
			case "dates":
				if (datesDisplayed == false) return;
				datesDisplayed = false;			
				break;
				
			case "trips":
				if (tripsDisplayed == false) return;
				tripsDisplayed = false;			
				break;
				
			case "sites":
				if (sitesDisplayed == false) return;
				sitesDisplayed = false;			
				break;
				
			case "status":
				if (statusDisplayed == false) return;
				statusDisplayed = false;			
				break;
				
			default:
				return;
		}
		
		Effect.Fade(name, { duration: 0.5 });
		
		if (name == "posts") Effect.Fade("blog_cal", { duration: 0.5 });
	}
	
	function showPanel(name)
	{
		switch (name)
		{
			case "search_results":
				if (resultsDisplayed == true) return;		
				resultsDisplayed = true;				
				break;
				
			case "posts":
				if (postsDisplayed == true) return;		
				postsDisplayed = true;				
				break;
				
			case "photos":
				if (photosDisplayed == true) return;		
				photosDisplayed = true;				
				break;
				
			case "dates":
				if (datesDisplayed == true) return;		
				datesDisplayed = true;				
				break;
				
			case "trips":
				if (tripsDisplayed == true) return;		
				tripsDisplayed = true;				
				break;
				
			case "sites":
				if (sitesDisplayed == true) return;		
				sitesDisplayed = true;				
				break;

			case "status":
				if (statusDisplayed == true) return;		
				statusDisplayed = true;				
				break;
				
			default:
				return;
		}
		
		Effect.Appear(name, { duration: 0.5 });	
		
		if (name == "posts") Effect.Appear("blog_cal", { duration: 0.5 });
	}		

	function doShowMoves()
	{
		alert(movesLeft);
	}
	
	function doShowTop()
	{
		var lst = document.getElementById(listName);
		alert(lst.offsetLeft);
	}

	function getListCount()
	{
		var lst = document.getElementById(listName);
		var count = lst.getElementsByTagName("li").length;
		//alert(count);
		listCount = count;
		leftEnd = leftStart - menuItemWidth * (listCount - 3);
	}
	
	function hideSite()
	{
		// fade the existing site and show next
		Effect.Fade(lastSite, { duration: 0.25, 
								afterFinish: function(p){ resetSite(lastSite); showNextSite() }
							  });
	}
	
	function resetSite(d)
	{
		var div = document.getElementById(d);
		new Effect.Move(div, { x: siteStart, y: 0, 
								mode: 'absolute', 
								duration: 0
							 });	
		Effect.Appear(div, { duration: 0 });	
	}


	function showNextSite()
	{
		// move in selected site
		var div = document.getElementById(nextSite);
		
		new Effect.Move(div, { x: -400, y: 0, 
								mode: 'relative', 
								duration: 0.25, 
								afterFinish: function(p){ endMove(p) }, 
								beforeStart: function(p){ startMove(p) }
							 });		
		lastSite = nextSite;	
	}
	
	function showSite(d)
	{
		// check if site window visible
		if (siteWindowVisible == false) 
		{
			showSiteWindow(d);
			// exit for now and let callback call showSite again
			return;
		}
		
		// skip if already showing
		if (d == lastSite) return;
		// set next site
		nextSite = d;
		
		// if last site was search, hide results
		if (lastSite == "search") hidePanel("search_results"); //hideResults();
		if (nextSite == "blog") showPanel("posts"); else hidePanel("posts");
		if (nextSite == "photo") showPanel("photos"); else hidePanel("photos");
		if (nextSite == "family") showPanel("dates"); else hidePanel("dates");
		if (nextSite == "maui") showPanel("trips"); else hidePanel("trips");
		if (nextSite == "web") showPanel("sites"); else hidePanel("sites");
		if (nextSite == "twitter") showPanel("status"); else hidePanel("status");
		
		//alert("Show Div: " + d);
		// hide existing site
		if (lastSite != "")
		{
			// hide site
			hideSite();			
		}
		else
		{
			showNextSite();
		}	
	}
	
	
	function showSiteWindow(d)
	{
		// skip if already visible
		if (siteWindowVisible == true) return;
		
		// get reference
		var div = document.getElementById(siteWindowName);
	
	// update visible value
		siteWindowVisible = true;	
		
		// make appear
		Effect.Appear(div, { duration: 0.25, afterFinish: function(p){ showSite(d) } });	
	}
		
	function startMove(d)
	{
		isMoving = true;
	}
	
	function resetStart()
	{
		var lst = document.getElementById(listName);
		new Effect.Move(lst, { x: leftStart, y: 0, 
								mode: 'absolute', 
								duration: 0
							 });
	}
		
	function resetEnd()
	{
		var lst = document.getElementById(listName);
		new Effect.Move(lst, { x: leftEnd, y: 0, 
								mode: 'absolute', 
								duration: 0
							 });
	}
	
	function endMove(d)
	{
		isMoving = false;
		
		// check if moving to start next
		if (gotoStart == true)
		{
			resetStart();
			gotoStart = false;			
		}
		else if (gotoEnd == true)
		{
			resetEnd();
			gotoEnd = false;			
		}
		
		
		if (movesLeft == 0) return;
		
		if (movesLeft < 0) 
		{
			movesLeft += 1;
			doMove(-1);
		}
		else
		{
			movesLeft -= 1;
			doMove(1);
		}
		
	}
	
	function doCalMove(n)
	{
		//Effect.Fade("cal_middle", { duration: 0.25 });
		var dir = n * 300;
		new Effect.Move("cal_middle", { x: dir, y: 0, 
								mode: 'relative', 
								duration: 0.25
							 });		
		
		// get new dates
		thisMonth += n;
		
		if (thisMonth <= 0) 
		{
			// set to Dec and subtract year
			thisMonth = 12;
			thisYear -= 1;
		}
		else if (thisMonth >= 13)
		{
			// set to Jan and add year
			thisMonth = 1;
			thisYear += 1;
		}
		
		// redraw calendar
		requestBlogDates(thisMonth, thisYear, "cal_middle");
	}
	
	function doMove(n)
	{
		// check if moving
		if (isMoving == true) 
		{
			// add to moves left
			movesLeft += n;
			return;
		}
		
		// get list count if needed
		if (listCount == 0) getListCount();
		
		var lst = document.getElementById(listName);
		// get position
		left = lst.offsetLeft;		
		// add/subtract for movement
		if (n == 1)
		{
			// check for top
			if (left == leftStart) 
			{
				gotoEnd = true;
			}
			dist = menuItemWidth;
		}
		else
		{
			// check for bottom
			if (left <= leftEnd)
			{
				gotoStart = true;
			}
			dist = menuItemWidth * -1;
		}
			
		new Effect.Move(lst, { x: dist, y: 0, 
								mode: 'relative', 
								duration: 0.25, 
								afterFinish: function(p){ endMove(p) }, 
								beforeStart: function(p){ startMove(p) }
							 });	

	}
	
// m here is Jan == 1
function displayBlogDates(content, div, m, y)
{
	//alert("Aloha!\r\n" + content);
	// get list of photos as array
	var f = new Function("return " + content);
	var o  = f();
	var days = o.Days;
	
	// set month
//	var m = 8;  // Jan == 0
//	var y = 2008;
	
	var dayOne = new Date(y, m - 1, 1, 0, 0, 0);
	var startDay = dayOne.getDay();
	//alert(dayOne);
	//alert(startDay);
	// reset display
	div.innerHTML = "";
	
	// add month name
	var header = document.createElement("div");
		var title = document.createElement("div");
			title.setAttribute("class", "title");
			title.setAttribute("className", "title");
			title.appendChild(document.createTextNode(gsMonthNames[m - 1] + " " + y));
		header.appendChild(title);
	div.appendChild(header);
	
	var table = document.createElement("table");
	table.setAttribute("cellspacing", "0");
	table.setAttribute("cellpadding", "0");
	
	// start rows
	var tr = document.createElement("tr");
	
	// add starting days
	// finish row if needed
	if (startDay > 0)
	{
		for (i = 1; i <= startDay; i++)
		{
			// create cell
			var td = document.createElement("td");
			td.setAttribute("class", "empty");
			td.setAttribute("className", "empty");
			td.appendChild(document.createTextNode(" "));
			// add to row
			tr.appendChild(td);
		}	
	}
	
	var dow = 1 + startDay;
	for (i = 1; i <= days.length; i++)
	{
		// create cell		
		var td = document.createElement("td");
		
		// check if any posts this day
		var day = days[i - 1];
		if (day.Posts.length > 0)
		{
			// prefetch feed for performance
			//prefetchFeed("http://kris-nelson.com/rss/daily.php?m=" + m + "&d=" + i + "&y=" + y);
			td.setAttribute("class", "posts");
			td.setAttribute("className", "posts");
			
			// add onclick event
			td.setAttribute("onclick", "javascript:resetPosts(" + m + ", " + i + ", " + y + ");");
			var str = day.Posts.length + " post";
			if (day.Posts.length > 1) str += "s";
			td.setAttribute("title", str);
		}
		
		td.appendChild(document.createTextNode(i));
		// add to row
		tr.appendChild(td);
		
		// check day of week
		if (dow == 7)
		{
			// end current row
			table.appendChild(tr);
			// start new row
			tr = document.createElement("tr");
			// reset day of week
			dow = 1;
		}
		else
			dow++;
	}	
	
	// finish row if needed
	if (dow > 1)
	{
		for (i = dow; i <= 7; i++)
		{
			// create cell
			var td = document.createElement("td");
			td.setAttribute("class", "empty");
			td.setAttribute("className", "empty");
			td.appendChild(document.createTextNode(" "));
			// add to row
			tr.appendChild(td);
			
			// check day of week
			if (i == 7)
			{
				// end current row
				table.appendChild(tr);				
			}
		}	
	}
	
	//var p = document.createElement("p");
	//p.appendChild(document.createTextNode("Found " + days.length + " days"));
	// add para to div
	div.appendChild(table);
	div.innerHTML = div.innerHTML;
	
		new Effect.Move(div, { x: 0, y: 0, 
								mode: 'absolute', 
								duration: 0.25
							 });	
}	

function displayPhotos(content, div)
{
	// get list of photos as array
	var f = new Function("return " + content);
	var o  = f();
	var photos = o.photos.photo;
	
	//alert(photos.length);
	
	var ul = document.createElement("ul");
//	alert("Found " + photos.length + " photos");
	for (i = 0; i < photos.length; i++)
	{
		var photo = photos[i];
		//alert("Starting [" + i + "]" + photo.id);
		// check ratio to only show full sized photos
		var width = 1 * photo.o_width;
		var height = 1 * photo.o_height;
		
		var ratio = 1;
		if (width < height)
			ratio = width / height;
		else
			ratio = height / width;
		
		// check if ratio below 0.5
		if (ratio <= 0.5) continue;
		//alert("Photo: " + photo.id + ", Height: " + height + ", Width: " + width + ", Ratio: " + ratio);
		
		// create list item
		var li = document.createElement("li");
		
		// create link tag
		var lnk = document.createElement("a");
		
		// set page url as href for now
		var pageUrl = "http://www.flickr.com/photos/webnelly/" + photo.id;
		lnk.setAttribute("href", pageUrl);
		//lnk.setAttribute("id", "p" + i); // used by photo preview method
		//lnk.addEventListener("click", photoPreviewHandler, true);
		lnk.setAttribute("target", "_blank");
		lnk.setAttribute("title", photo.title);
		// create img tag
		var img = document.createElement("img");
		//img.setAttribute("id", "p" + i); // used by photo preview method
		var imgUrl = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_m.jpg";
		img.setAttribute("src", imgUrl);
		img.setAttribute("alt", photo.title);
		
		// add img to lnk
		lnk.appendChild(img);	
		
		// add link to list item
		li.appendChild(lnk);
		
		// calculate date uploaded
		var uploaded = new Date();
		uploaded.setTime(photo.dateupload * 1000);
		var str = photo.datetaken;
		while (str.indexOf('-') >= 0)
			str = str.replace('-', ' ');
		while (str.indexOf(':') >= 0)
			str = str.replace(':', ' ');
		var parts = str.split(' ');
		// build date from parts
		//alert(parts[0] + " " + parts[1] + " " + parts[2] + " " + parts[3] + " " + parts[4] + " " + parts[5]);
		var taken = new Date(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5], 0);
		
		var dtaken = formatPhotoDate(taken);
		var duploaded = formatPhotoDate(uploaded);
//		alert(photo.id + " " + formatPhotoDate(taken));
//		alert(photo.id + " " + duploaded);
		
		var p = document.createElement("p");
		var strong = document.createElement("strong");
		strong.appendChild(document.createTextNode(photo.title));
		p.appendChild(strong);
		li.appendChild(p);
		
		var dl = document.createElement("dl");
		dl = addToDL(dl, "Taken", dtaken, "", "");
		dl = addToDL(dl, "Uploaded", duploaded, "", "");

		//alert(photo.id);
		var camera = findCamera(photo.tags);
		if (camera != "") dl = addToDL(dl, "Camera", camera, "", "");

		li.appendChild(dl);

		// add title for now
		//li.appendChild(document.createTextNode(photo.title));
		// add item to list
		ul.appendChild(li);
	}
	
	// add list to div
	div.appendChild(ul);
	
}

function findCamera(tagList)
{
	var tags = tagList.split(' ');
	
	//alert(tags.length);
	for (k = 0; k < tags.length; k++)
	{
		var tag = tags[k];
		
		//alert(tag);
		switch (tag)
		{
			case "xsi"    : return "Canon Rebel XSi"; break;
			case "eos20d" : return "Canon EOS 20D"; break;
			case "sd890"  : return "Canon SD890"; break;
			case "e5600"  : return "Nikon E5600"; break;
			case "mogul"  : return "HTC Mogul"; break;
			default:
				break;
		}		
	}
	
	//alert("not found");

	return "";
}

function addToDL(dl, name, value, className, url)
{
	var dt = document.createElement("dt");
	var dd = document.createElement("dd");
	if (className != "") 
	{
		dd.setAttribute("class", className);
		dd.setAttribute("className", className);
	}
	
	dt.appendChild(document.createTextNode(name));
	if (url == "")
	{
		// create a value
		dd.appendChild(document.createTextNode(value));
	}
	else
	{
		// create a link
		var lnk = document.createElement("a");
		lnk.setAttribute("href", url);
		lnk.setAttribute("target", "_blank");
		lnk.appendChild(document.createTextNode(value));
		dd.appendChild(lnk);
	}
	dl.appendChild(dt);
	dl.appendChild(dd);
	
	return dl;
}


function displayTwitterUser(user, profileDivName)
{
	var div = removeChildNodes(profileDivName);
	
	// add paragraph tag
	var p = document.createElement("p");
	var lnk = document.createElement("a");
	lnk.setAttribute("href", "http://twitter.com/" + user.screen_name);
	lnk.setAttribute("target", "_blank");
	var img = document.createElement("img");
	img.setAttribute("src", user.profile_image_url);
	img.setAttribute("alt", "Profile Picture");
	lnk.appendChild(img);
	p.appendChild(lnk);
	p.appendChild(document.createTextNode(user.screen_name));
	// add to div
	div.appendChild(p);
	
	// start attribute list
	var dl = document.createElement("dl");
	
	// add properties
	dl = addToDL(dl, "Name:", user.name, "", "");
	dl = addToDL(dl, "Location:", user.location, "", "");
	dl = addToDL(dl, "Bio:", user.description, "long", "");
	dl = addToDL(dl, "Followers:", user.followers_count, "", "http://twitter.com/" + user.screen_name + "/followers");
	// append to div
	div.appendChild(dl);
	
	profileDisplayed = true;
}

function displayTwitter(content, profileDivName, statusDivName)
{
	// get list of photos as array
	var f = new Function("return " + content);
	//var o  = f();
	var updates = f();
	
	//alert(updates);
	
	// use first status to get user information
	if (profileDisplayed == false)
	{
		var user = updates[0].user;
		displayTwitterUser(user, profileDivName);	
	}
	
	var div = document.getElementById(statusDivName);
	
	// loop through updates
	for (i = 0; i < updates.length; i++)
	{
		var status = updates[i];
		
		// create title as link
		  var p = document.createElement("p");
		  p.appendChild(document.createTextNode("Kris " + status.text));
		  div.appendChild(p);
		  p.appendChild(document.createElement("br"));
			
		// create date
		var sp = document.createElement("span");
		sp.setAttribute("class", "date");
		sp.setAttribute("className", "date");
		//sp.appendChild(document.createTextNode(status.created_at));
		var thisDate = Date.parse(status.created_at);
		if (isNaN(thisDate))
		{
			// parse by token
			var str = status.created_at;
			while (str.indexOf(':') >= 0)
				str = str.replace(':', ' ');
			
			var parts = str.split(' ');
			
			// convert month
			var twm = 0;
			for (gm = 0; 0 < gsMonthNames.length; gm++)
			{
				var gms = gsMonthNames[gm];
				if (gms.indexOf(parts[1]) == 0)
				{
					twm = gm;
					break;
				}
			}
			
			thisDate = new Date(parts[7], twm, parts[2], parts[3], parts[4], parts[5], 0);
			
			var tzo = (new Date().getTimezoneOffset()/60); 
			thisDate -= (tzo * 3600000);
			//var dt = new Date(entry.publishedDate);
			//entry.publishedDate = new Date(dt.getTime() + (tzo * 3600000));			
			
			//alert(thisDate);
		}
		sp.appendChild(document.createTextNode(getDisplayTime(new Date(thisDate))));		
		p.appendChild(sp);
		div.appendChild(p);
		div.appendChild(document.createElement("br"));		
	}
	return;	
}

function getDisplayTime(ddt)
{
	var now = new Date();	
	// compare times
	//alert(now.getTime() + ", " + ddt);
	//return "";
	var diff = now - ddt;
	
	if (diff <= 0) return "right now";
	
	// get number of seconds
	var sec = diff / 1000;
	if (sec < 60) return sec + " seconds ago";
	// get number of minutes
	var m = Math.round(sec / 60);
	if (m == 1) return "just a minute ago";
	if (m < 60) return "about " + m + " minutes ago";
	// get number of hours
	var h = Math.round(m / 60);
	if (h == 1) return "about an hour ago";
	if (h < 24) return "about " + h + " hours ago";
	// get number of days
	var days = Math.round(h / 24);
	if (days == 1) return "yesterday";
	return days + " days ago";
	
	//return d.toString();
}

// m here is Jan == 1
function requestBlogDates(m, y, divName)
{
	// prefetch feed for dates here as well
	prefetchFeed("http://kris-nelson.com/rss/daily.php?m=" + m + "&d=0&y=" + y);

	var url = "./rss/archive.php?m=" + m + "&y=" + y;
	var httpreq = getHTTPObject();
	
    httpreq.open("GET", url, true);

    httpreq.onreadystatechange = function () {
			if (httpreq.readyState == 4)
			{
				var div = document.getElementById(divName);
		
				//alert(httpreq.responseXML);
				if (httpreq.responseText)
				{
					//div.innerHTML = "Data available."; 
					var responseText = httpreq.responseText;
					displayBlogDates(responseText, div, m, y);
				}
				else 
				{		
					div.innerHTML = "Data not available."; 
				}
			}
    }
    httpreq.send(null);		
}

function requestPhotos(url, divName)
{
	var httpreq = getHTTPObject();
	
    httpreq.open("GET", url, true);

    httpreq.onreadystatechange = function () {
			if (httpreq.readyState == 4)
			{
				var div = document.getElementById(divName);
		
				//alert(httpreq.responseXML);
				if (httpreq.responseText)
				{
					var responseText = httpreq.responseText;
					displayPhotos(responseText, div);
				}
				else 
				{		
					div.innerHTML = "Data not available."; 
				}
			}
    }
    httpreq.send(null);		
}



function requestTwitter(url, profileDivName, statusDivName)
{
	var httpreq = getHTTPObject();
	
    httpreq.open("GET", url, true);

    httpreq.onreadystatechange = function () {
			if (httpreq.readyState == 4)
			{
				var div = document.getElementById(profileDivName);

				//alert(httpreq.responseXML);
				if (httpreq.responseText)
				{
					var responseText = httpreq.responseText;
					displayTwitter(responseText, profileDivName, statusDivName);
				}
				else 
				{		
					div.innerHTML = "Data not available."; 
				}
			}
    }
    httpreq.send(null);		
}

function removeChildNodes(name)
{
	var obj = document.getElementById(name);
	
	if ( obj.hasChildNodes() )
	{
		while ( obj.childNodes.length >= 1 )
		{
			obj.removeChild( obj.firstChild );       
		} 
	}	
	
	return obj;
}

function formatPhotoDate(photoDate)
{
	var dateString = "";
	dateString += gsMonthNames[photoDate.getMonth()].substr(0, 3);
	dateString += " " + photoDate.getDate().zf(2) + ", " + photoDate.getFullYear();
	dateString += " at " + ((h = photoDate.getHours() % 12) ? h : 12) + ":";
	dateString += photoDate.getMinutes().zf(2);
	//dateString += photoDate.getSeconds().zf(2);
	dateString += photoDate.getHours() < 12 ? ' am' : ' pm';

	return dateString;
}


var gsMonthNames = new Array(
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
);

var gsDayNames = new Array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday'
);


Date.prototype.format = function(f)
{
    if (!this.valueOf())
        return ' ';

    var d = this;

    return f.replace(/(yyyy|mmmm|mmm|mm|dddd|ddd|dd|h|hh|nn|ss|a\/p)/gi,
        function($1)
        {
            switch ($1.toLowerCase())
            {
            case 'yyyy': return d.getFullYear();
            case 'mmmm': return gsMonthNames[d.getMonth()];
            case 'mmm':  return gsMonthNames[d.getMonth()].substr(0, 3);
            case 'mm':   return (d.getMonth() + 1).zf(2);
            case 'dddd': return gsDayNames[d.getDay()];
            case 'ddd':  return gsDayNames[d.getDay()].substr(0, 3);
            case 'dd':   return d.getDate().zf(2);
            case 'h':   return ((h = d.getHours() % 12) ? h : 12);
            case 'hh':   return ((h = d.getHours() % 12) ? h : 12).zf(2);
            case 'nn':   return d.getMinutes().zf(2);
            case 'ss':   return d.getSeconds().zf(2);
            case 'a/p':  return d.getHours() < 12 ? 'AM' : 'PM';
            }
        }
    );
}

Number.prototype.zf = function(f)
{
	var ss = this.toString();
	var len = ss.length;
	
	if (len >= f) return ss;
	// add zeros
	for (ii = 0; ii < f - len; ii++)
	{
		ss = "0" + ss;
	}
	return ss;
}
