/*
 * Returns an new XMLHttpRequest object, or false if the browser
 * doesn't support it
 */

function newXMLHttpRequest() {

  var xmlreq = false;


  // Create XMLHttpRequest object in non-Microsoft browsers
  if (window.XMLHttpRequest) {
    xmlreq = new XMLHttpRequest();

  } else if (window.ActiveXObject) {

    try {
      // Try to create XMLHttpRequest in later versions
      // of Internet Explorer

      xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
      
    } catch (e1) {

      // Failed to create required ActiveXObject
      
      try {
        // Try version supported by older versions
        // of Internet Explorer
      
        xmlreq = new ActiveXObject("Microsoft.XMLHTTP");

      } catch (e2) {

        // Unable to create an XMLHttpRequest by any means
        xmlreq = false;
      }
    }
  }

return xmlreq;
}

 /*
	* Returns a function that waits for the specified XMLHttpRequest
	* to complete, then passes it XML response to the given handler function.
  * req - The XMLHttpRequest whose state is changing
  * responseXmlHandler - Function to pass the XML response to
  */
 function getReadyStateHandler(req, responseXmlHandler) {

   // Return an anonymous function that listens to the XMLHttpRequest instance
   return function () {

     // If the request's status is "complete"
     if (req.readyState == 4) {//1:idle;2:start;3:inthe middle;4:complete
       
       // Check that we received a successful response from the server
       if (req.status == 200) {

         // Pass the test payload of the response to the handler function.
         responseXmlHandler(req.responseText);

       } else {

         // An HTTP problem has occurred
         alert("HTTP error "+req.status+": "+req.statusText);
       }
     }
   }
 }

//Javascript XML parsor: http://www.captain.at/howto-ajax-parse-rss.php
/*
var xmlstring = '\
<rss version="2.0">\
<channel>\
   <title>Weather Underground - Rome, Italy</title>\
   <link>http://www.wunderground.com/</link>\
   <description>Weather Underground RSS Feed</description>\
   <language>EN</language>\
   <image>\
      <url>http://icons.wunderground.com/graphics/smash/wunderTransparent.gif</url>\
      <link>http://www.wunderground.com</link>\
      <title>Weather Underground</title>     \
   </image>\
   <category>weather</category>\
   <item>\
      <title>Rome, Italy Current Conditions - 5:45 PM CEST Oct. 21</title>\
      <link>http://www.wunderground.com/global/stations/16239.html</link>\
      <description>Temperature: 64&#176;F / 18&#176;C | Humidity: 100% | \
               Pressure: 29.92in / 1013hPa | Conditions: Mostly Cloudy | \
     Wind Direction: South | Wind Speed: 7mph / 11km/h | Updated: 5:45 PM CEST\
      </description>\
      <pubDate>Fri, 21 Oct 2005 15:45:00 GMT</pubDate>\
   </item>\
</channel>\
</rss>';
*/
var loadMarkers = new loadMarkers();
function loadMarkers () {

	this.map			= '';
	this.t				= 0;
	//this.user_id		= 'gmail_user';
	this.callback		= '';

	this.dateSel		= '';

	this.load = function (map, dateSel, callback) {
		
		this.map 		= map;
		this.callback	= callback;
		this.dateSel	= dateSel;
		this.ajax_req();

		//this.update();
	}
	
	this.update = function () {
		this.ajax_req('');
		window.clearTimeout(this.t);
		this.t = window.setTimeout("host_req.update()", "3000");
	}

	this.ajax_req = function () {

		var bounds = this.map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngSpan = northEast.lng() - southWest.lng();
		var latSpan = northEast.lat() - southWest.lat();

		var geoParams = '&northEastLat='+northEast.lat()+'&northEastLng='+northEast.lng();
		geoParams    += '&southWestLat='+southWest.lat()+'&southWestLng='+southWest.lng();

		//loadMarkers.dateSel is set after first calendar click
		if (loadMarkers.dateSel) geoParams += "&photoDate="+loadMarkers.dateSel;

		var date_arg = "&date="+map_gen.dateSel;

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_photos&user_id='+user_id+geoParams+date_arg+'&twitter_id='+twitter_id);
	}

	this.ajax_rcv = function (xml_str) {

		//var items = ie_xml_parser(xml_str);
		var items = xml_parser(xml_str);
		loadMarkers.callback(items);
	}
}



//****************************** OTHER USERS (WHO HAS BOOKMARKED/SUBSCRIBED TO GIVEN LINK) SECTION *********************************************
var loadSubscribers = new loadSubscribers();
function loadSubscribers () {//load latest 40 photos

	this.link			= '';
	this.callback		= '';

	this.load = function (callback, link) {
		
		this.callback	= callback;
		this.link		= link;
		this.ajax_req();
	}
	
	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_subscribers&link='+this.link);
	}

	this.ajax_rcv = function (xml_str) {

		//alert(xml_str);
		//var items = ie_xml_parser(xml_str);
		var items = xml_tag_parser(xml_str);
		loadSubscribers.callback(items);
	}
}

var loadSubscriberRss = new loadSubscriberRss();
function loadSubscriberRss () {//load rss listing under keyword as tag

	this.callback		= '';
	this.keyword;
	this.owner;

	this.load = function (callback, owner, keyword) {
		this.callback	= callback;
		this.owner		= owner;
		this.keyword    = keyword;
		this.ajax_req();
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_subscriber_rss&owner='+this.owner+"&keyword="+this.keyword);
	}

	this.ajax_rcv = function (xml_str) {

		//alert(xml_str);
		//return;

		//var items = ie_xml_parser(xml_str);
		//var items = xml_rss_parser(xml_str);

		var items = xml_tag_parser(xml_str);
		loadSubscriberRss.callback(items);
	}
}

var loadOtherReaders = new loadOtherReaders();
function loadOtherReaders () {//load latest 40 photos

	this.link			= '';
	this.callback		= '';

	this.load = function (callback, link) {
		
		this.callback	= callback;
		this.link		= link;
		this.ajax_req();
	}
	
	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_other_readers&link='+this.link);
	}

	this.ajax_rcv = function (xml_str) {

		//alert(xml_str);
		//var items = ie_xml_parser(xml_str);
		var items = xml_tag_parser(xml_str);
		loadOtherReaders.callback(items);
	}
}

var loadBookmarkList = new loadBookmarkList();
function loadBookmarkList () {//load rss listing under keyword as tag

	this.callback		= '';
	this.keyword;
	this.owner;

	this.load = function (callback, owner, keyword) {
		this.callback	= callback;
		this.owner		= owner;
		this.keyword    = keyword;
		this.ajax_req();
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_bookmark_list&owner='+this.owner+"&keyword="+this.keyword);
	}

	this.ajax_rcv = function (xml_str) {

		//alert(xml_str);
		//return;

		//var items = ie_xml_parser(xml_str);
		var items = xml_parser(xml_str);
		loadBookmarkList.callback(items);
	}
}



//****************************** RSS SECTION *********************************************
var loadRssTags = new loadRssTags();
function loadRssTags () {//load latest 40 photos

	this.t				= 0;
	this.callback		= '';

	this.auto_update	= true;

	this.load = function (callback) {
		
		this.callback	= callback;

		this.ajax_req();
		//this.update();
	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadRssTags.update()", "600000");//every 10 minutes
		}
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_rss_tags&user_id='+user_id);
	}

	this.ajax_rcv = function (xml_str) {

		//alert(xml_str);

		//var items = ie_xml_parser(xml_str);
		var items = xml_tag_parser(xml_str);
		loadRssTags.callback(items);
	}
}

var loadRssContent = new loadRssContent();
function loadRssContent () {//load rss listing under keyword as tag

	this.t				= 0;
	this.auto_update	= true;

	this.callback		= '';
	this.keyword;


	this.load = function (callback, keyword) {
		
		this.callback	= callback;
		this.keyword    = keyword;
		this.ajax_req();
		//this.update();

	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadRssContent.update()", "600000");//every 10 minutes
		}
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_rss&user_id='+user_id+"&keyword="+loadRssContent.keyword);
	}

	this.ajax_rcv = function (xml_str) {

		//var items = ie_xml_parser(xml_str);
		//var items = loadRssContent.keyword.match(GOOGLE_READER)?xml_google_parser(xml_str):xml_rss_parser(xml_str);		
		var items = loadRssContent.keyword.match(GOOGLE_READER)?xml_google_parser(xml_str):xml_tag_parser(xml_str);		
		loadRssContent.callback(items);
	}
}

var loadBitly = new loadBitly();
function loadBitly () {//given feed url, load its articles. Callback with parsed articles

	this.callback		= '';
	this.url;

	this.load = function (callback, url) {
		
		this.callback	= callback;
		this.url    = escape(url);
		
		//alert(this.url);
		this.ajax_req();
	}
	
	this.ajax_req = function () {

		var bitly_url = "http://api.bit.ly/shorten?version=2.0.1&";
		bitly_url += "format=xml&longUrl="+this.url+"&login=jzhang88888&apiKey=R_821f154a7494560e86514ff43efc46c9";	
		bitly_url = escape(bitly_url);

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('GET', '/proxy.php?link='+bitly_url, true);
		//req.open('GET', this.feed_url, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('');
	}

	this.ajax_rcv = function (bitly_str) {
		loadBitly.callback(bitly_parser(bitly_str));
	}
}

var loadRssFeed = new loadRssFeed();
function loadRssFeed () {//given feed url, load its articles. Callback with parsed articles

	this.t				= 0;
	this.auto_update	= true;

	this.callback		= '';
	this.feed_url;


	this.load = function (callback, feed_url) {
		
		this.callback	= callback;
		this.feed_url    = feed_url;
		this.ajax_req();
		//this.update();

	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadRssFeed.update()", "600000");//every 10 minutes
		}
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('GET', '/proxy.php?link='+this.feed_url, true);
		//req.open('GET', this.feed_url, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('');
	}

	this.ajax_rcv = function (xml_str) {
		//var items = ie_xml_parser(xml_str);
		var items = xml_rss_parser(xml_str);
		for(var i=0; i<items.length; i++) items[i].siteLink = loadRssFeed.feed_url;
		loadRssFeed.callback(items);
	}
}

var loadYahooSearch = new loadYahooSearch();
function loadYahooSearch () {//given a term, return searched

	this.ITEM_COUNT		= 1;
	this.callback		= '';
	this.search_url;

	this.load = function (callback, term) {
		
		this.callback	= callback;
		
		//this.search_url = "http://api.search.live.net/json.aspx?";
		//this.search_url += "AppId=31F0ADBE0CD60B873C18F5AB19E8103B670BD706&";
		//this.search_url += "Query=" +  escape(term)+"&";
		//this.search_url += "Market=en-US&Sources=web+spell&Web.Count="+this.ITEM_COUNT+"&";
		//this.search_url += "JsonType=raw";	

		//Bing does not work going throught dreamhost
		//this.search_url = "http://api.bing.net/xml.aspx?AppId=31F0ADBE0CD60B873C18F5AB19E8103B670BD706";
		//this.search_url += "&Verstion=2.2&Market=en-US&Query=android&Sources=web+spell&web.count=1&xmltype=elementbased";
		
		this.search_url = "http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=";						
		this.search_url += "fYjnAwXV34GaRBUImw3jR6s9Exz.BWFlYGnE2B0Lw76WktlsxqHALXTSW0HyIhHFXqwwtmg-";
		//this.search_url += "YahooDemo";						
		this.search_url += "&query=";
		this.search_url += escape(term);						
		this.search_url += "&results=" + this.ITEM_COUNT;	
		
		this.ajax_req();
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('GET', '/proxy.php?link='+escape(this.search_url), true);
		//req.open('GET', this.search_url, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('');
	}

	this.ajax_rcv = function (xml_str) {
		
		//var items = ie_xml_parser(xml_str);
		var items = xml_yahoo_parser (xml_str);
		//for(var i=0; i<items.length; i++) items[i].siteLink = loadRssFeed.feed_url;
		loadYahooSearch.callback(items);
	}
}












//***************************** RSS FEED SECTION ******************************************************
var addSubscribe = new addSubscribe();
function addSubscribe () {

	this.callback		= '';
	this.feedObj;

	this.load = function (callback, feedObj) {
		
		this.callback		= callback;
		this.feedObj		= feedObj;

		var server_args = "action=add_subscribe";
		
		server_args += "&title="+escape(feedObj.title);
		server_args += "&description="+escape(feedObj.description);
		server_args += "&link="+feedObj.link;
		server_args += "&owner="+feedObj.owner;
		//server_args += "&pubDate="+feedObj.pubDate;
		
		server_args += "&tag="+feedObj.tag;

		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (dbid) {
		addSubscribe.callback(dbid);
	}
}

var deleteSubscribe = new deleteSubscribe();
function deleteSubscribe () {//load latest 40 photos

	this.callback		= '';
	this.keyword;
	this.link;

	this.load = function (callback, keyword, link) {
		
		this.callback		= callback;
		this.keyword		= keyword;
		this.link			= link;

		this.ajax_req(keyword, link);
	}

	this.ajax_req = function (keyword, link) {

		//alert(star_dbid);

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send("action=delete_subscribe&keyword="+keyword+"&link="+link+"&owner="+user_id);
	}

	this.ajax_rcv = function (result) {
		//alert(server_result);
		deleteSubscribe.callback(result);
	}
}

var checkFeedStar = new checkFeedStar();
function checkFeedStar () {//load latest 40 photos

	this.callback		= '';
	this.feed_link;

	this.load = function (callback, feed_link) {
		
		this.callback		 = callback;
		this.feed_link    = feed_link;

		var server_args = "action=check_feed_star";
		server_args += "&link="+feed_link;
		server_args += "&owner="+user_id; //user_id is globally defined at rss.php
		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (star_on) {
		checkFeedStar.callback(star_on);
	}
}

var checkFeedSubscribe = new checkFeedSubscribe();
function checkFeedSubscribe () {//load latest 40 photos

	this.callback		= '';
	this.feed_link;

	this.load = function (callback, feed_link) {
		
		this.callback		= callback;
		this.feed_link		= feed_link;

		var server_args = "action=check_feed_subscribe";
		server_args += "&link="+feed_link;
		server_args += "&owner="+user_id; //user_id is globally defined at rss.php
		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (subscribe_on) {
		//alert(subscribe_on);
		checkFeedSubscribe.callback(subscribe_on);
	}
}











//***************************** BOOKMARKS SECTION ******************************************************
var addBookmark = new addBookmark();
function addBookmark () {//load latest 40 photos

	this.callback		= '';
	this.bookmarkObj;

	this.load = function (callback, bookmarkObj) {
		
		this.callback		= callback;
		this.bookmarkObj    = bookmarkObj;

//alert(bookmarkObj.summary);

		var server_args = "action=add_bookmark";
		
		server_args += "&title="+escape(bookmarkObj.title);
		server_args += "&summary="+escape(bookmarkObj.summary);
		//server_args += "&description="+escape(bookmarkObj.description);
		server_args += "&link="+bookmarkObj.link;
		server_args += "&owner="+bookmarkObj.owner;
		server_args += "&pubDate="+bookmarkObj.pubDate;
		
		server_args += "&rss_host_title="+bookmarkObj.siteTitle;
		server_args += "&rss_host="+bookmarkObj.siteLink;
		
		//if (bookmarkObj.filename)	server_args += "&filenames="+bookmarkObj.filenames;
		//if (bookmarkObj.video_keys) server_args += "&video_keys="+bookmarkObj.video_keys;
		if (bookmarkObj.yt_key)		server_args += "&video_keys="+bookmarkObj.yt_key;
		if (bookmarkObj.thumbLink)	server_args += "&filenames="+bookmarkObj.thumbLink;

		server_args += "&tag="+bookmarkObj.tag;

		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (bookmark_dbid) {
alert(bookmark_dbid);
		addBookmark.callback(bookmark_dbid);
	}
}

var deleteBookmark = new deleteBookmark();
function deleteBookmark () {//load latest 40 photos

	this.callback		= '';
	this.keyword;
	this.article_link;

	this.load = function (callback, keyword, article_link) {
		
		this.callback		= callback;
		this.keyword		= keyword;
		this.article_link	= article_link;

		this.ajax_req(keyword, article_link);
	}

	this.ajax_req = function (keyword, article_link) {

		//alert(star_dbid);

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send("action=delete_bookmark&keyword="+keyword+"&article_link="+article_link+"&owner="+user_id);
	}

	this.ajax_rcv = function (server_result) {
		//alert(server_result);
		deleteBookmark.callback(server_result);
	}
}

var checkStar = new checkStar(); //check bookmarks star
function checkStar () {//load latest 40 photos

	this.callback		= '';
	this.article_link;

	this.load = function (callback, article_link) {
		
		this.callback		 = callback;
		this.article_link    = article_link;

		var server_args = "action=check_star";
		server_args += "&link="+article_link;
		server_args += "&owner="+user_id; //user_id is globally defined at rss.php
		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (star_on) {

		//alert(star_on);
		checkStar.callback(star_on);
	}
}

var checkBookmark = new checkBookmark();
function checkBookmark () {//load latest 40 photos

	this.callback		= '';
	this.feed_link;

	this.load = function (callback, feed_link) {
		
		this.callback		= callback;
		this.feed_link		= feed_link;

		var server_args = "action=check_bookmark";
		server_args += "&link="+feed_link;
		//server_args += "&owner="+user_id; //user_id is globally defined at rss.php
		this.ajax_req(server_args);
	}

	this.ajax_req = function (server_args) {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		req.send(server_args);
	}

	this.ajax_rcv = function (subscribe_on) {
		//alert(subscribe_on);
		checkBookmark.callback(subscribe_on);
	}
}





var loadUsers = new loadUsers(); //load all users who also subscribed znotes by db_id
function loadUsers () {//load latest 40 photos

	this.t				= 0;
	this.callback		= '';
	this.db_id;

	this.auto_update	= true;

	this.load = function (callback, db_id) {
		
		this.callback	= callback;
		this.db_id		= db_id;

		this.ajax_req();
		//this.update();
	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadUsers.update()", "600000");//every 10 minutes
		}
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_users&db_id='+loadUsers.db_id);
	}

	this.ajax_rcv = function (xml_str) {

		//var items = ie_xml_parser(xml_str);
		var items = xml_tag_parser(xml_str);
		loadUsers.callback(items);
	}
}


var loadContent = new loadContent();
function loadContent () {//load latest 40 photos

	this.t				= 0;
	this.auto_update	= true;

	this.callback		= '';
	this.keyword;


	this.load = function (callback, keyword) {
		
		this.callback	= callback;
		this.keyword    = keyword;
		this.ajax_req();
		//this.update();

		//alert(keyword);

	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadContent.update()", "600000");//every 10 minutes
		}
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_bookmarks&user_id='+user_id+"&keyword="+loadContent.keyword.replace(/\s+/g,"")+"&db_id="+db_id);
	}

	this.ajax_rcv = function (xml_str) {

//alert(xml_str);

		//var items = ie_xml_parser(xml_str);
		var items = xml_parser(xml_str);
		loadContent.callback(items, loadContent.keyword);
	}
}


















var loadBoundedThumbs = new loadBoundedThumbs();
function loadBoundedThumbs () {//load current bounded map

	this.t				= 0;
	//this.user_id		= 'gmail_user';
	this.callback		= '';
	this.map			= '';
	this.dateSel		= '';

	this.auto_update	= true;

	this.load = function (map, dateSel, callback) {
		
		this.map		= map;
		this.dateSel	= dateSel;
		this.callback	= callback;
		this.ajax_req();
		//this.update();

	}
	
	this.update = function () {

		if (this.auto_update) {
			this.ajax_req('');
			window.clearTimeout(this.t);
			this.t = window.setTimeout("loadBoundedThumbs.update()", "10000");
		}
	}

	this.ajax_req = function () {

		var bounds = this.map.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngSpan = northEast.lng() - southWest.lng();
		var latSpan = northEast.lat() - southWest.lat();

		var geoParams = '&northEastLat='+northEast.lat()+'&northEastLng='+northEast.lng();
		geoParams    += '&southWestLat='+southWest.lat()+'&southWestLng='+southWest.lng();

		//loadMarkers.dateSel is set after first calendar click
		if (loadBoundedThumbs.dateSel) geoParams += "&photoDate="+loadMarkers.dateSel;


		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_photos&user_id='+user_id+geoParams+'&twitter_id='+twitter_id);
	}

	this.ajax_rcv = function (xml_str) {
//alert(xml_str);

		//var items = ie_xml_parser(xml_str);
		var items = xml_parser(xml_str);
		loadBoundedThumbs.callback(items);
	}
}

//load date(yyyymmdd) vs. photo count
var loadCalendar = new loadCalendar();
function loadCalendar () {//load latest 40 photos

	this.t				= 0;
	//this.user_id		= 'gmail_user';
	this.callback		= '';

	this.load = function (callback) {
		
		this.callback	= callback;
		this.ajax_req();
	}
	
	this.ajax_req = function () {

		
		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_calendar&user_id='+user_id+'&twitter_id='+twitter_id);
	}

	this.ajax_rcv = function (xml_str) {
//alert(xml_str);

		//var items = ie_xml_parser(xml_str);
		var items = xml_parser(xml_str);
		loadCalendar.callback(items);
	}
}

var deletePhoto = new deletePhoto();
function deletePhoto () {//load latest 40 photos

	this.db_id		= '';
	this.callback	= '';

	this.setId = function (db_id, callback) {
		
		this.db_id	= db_id;
		this.callback	= callback;
		this.ajax_req();
	}
	
	this.ajax_req = function () {
		
		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=delete_photo&user_id='+user_id+"&db_id="+this.db_id);
	}

	this.ajax_rcv = function (xml_str) {

		location.reload(true);
//alert(xml_str);
	}
}


var editPhoto = new editPhoto();
function editPhoto () {//load latest 40 photos

	this.title		= '';
	this.summary	= '';
	this.permission	= '';
	this.into	= '';
	this.db_id	= '';

	this.go = function (title, summary, permission, intro, db_id) {
		
		this.title		= escape(title);
		this.summary	= escape(summary);
		this.permission	= escape(permission);
		this.intro		= escape(intro);
		this.db_id		= db_id;
		this.ajax_req();
	}
	
	this.ajax_req = function () {
		

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=edit_photo&user_id='+user_id+"&title="+this.title+"&summary="+this.summary+"&permission="+this.permission+"&intro="+this.intro+"&db_id="+this.db_id);
	}

	this.ajax_rcv = function (xml_str) {

alert(xml_str);
	}
}
















//load photos for given date(yyyymmdd)
var loadCalendarPhotos = new loadCalendarPhotos();
function loadCalendarPhotos () {//load latest 40 photos

	this.date			= 0;
	//this.user_id		= 'gmail_user';
	this.callback		= '';

	this.load = function (date) {
		this.date		= date;
		this.ajax_req();
	}
	
	this.ajax_req = function () {

		//alert(user_id);

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', '/service.php', true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send('action=load_calendar_photos&date='+this.date+'&user_id='+user_id+'&twitter_id='+twitter_id);//twitter_id id global passed via argument
	}

	this.ajax_rcv = function (xml_str) {
//alert(xml_str);

		//var items = ie_xml_parser(xml_str);
		
		var photoObjs = xml_parser(xml_str);
		map_gen.thumbCallback(photoObjs);
		map_gen.loadCallback(photoObjs, "1");
	}
}

//IE XML parser
function ie_xml_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory

	var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	xmlDoc.async="false";
	xmlDoc.loadXML("xml_string");
	var oRV = xmlDoc.getElementsByTagName("item");


	return null;
}


//alert(typeof DOMParser); //function|object for all but ie where="undefined"
//IE DOMParser support:http://erik.eae.net/archives/2005/07/03/20.19.18/
if (typeof DOMParser == "undefined") {
	DOMParser = function () {}
	DOMParser.prototype.parseFromString = function (str, contentType) {
      if (typeof ActiveXObject != "undefined") {
         var d = new ActiveXObject("MSXML.DomDocument");
         d.loadXML(str);
         return d;
      } else if (typeof XMLHttpRequest != "undefined") {
         var req = new XMLHttpRequest;
         req.open("GET", "data:" + (contentType || "application/xml") +
                         ";charset=utf-8," + encodeURIComponent(str), false);
         if (req.overrideMimeType) {
            req.overrideMimeType(contentType);
         }
         req.send(null);
         return req.responseXML;
      }
   }
}


function bitly_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");
	var root		= xmlobject.getElementsByTagName('bitly')[0];
	
	var results		= root.getElementsByTagName("results")[0];
	var nodeKeyVal	= results.getElementsByTagName("nodeKeyVal")[0];
	var bitly_url	= nodeKeyVal.getElementsByTagName("shortUrl")[0].firstChild.nodeValue; 

	return bitly_url;
}

function xml_yahoo_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");
	var root		= xmlobject.getElementsByTagName('ResultSet')[0];
	
/*
	try {
		var channels	= root.getElementsByTagName("channel");		
	}
	catch (err)
	{
		//showMask(false);
		//alert(xml_string);
		//alert("not rss, try atom");
		return xml_atom_parser(xml_string);		

	}
*/	
	var items		= root.getElementsByTagName("Result");


	//var siteTitles	= channels[0].getElementsByTagName("title");
	//var siteTitle	= siteTitles[0].firstChild.nodeValue;
	
	//var siteDescs	= channels[0].getElementsByTagName("description");
	//var siteDesc	= siteDescs[0].firstChild.nodeValue;

 	//var image		= channels[0].getElementsByTagName("image");
	//var url			= image[0].getElementsByTagName("url");
	//var siteIcon	= image[0].firstChild.nodeValue;
	
	var rssItems = new Array();
	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		//item.siteTitle	= siteTitle; 
		//item.siteDesc	= siteDesc; 
		
		var title		= items[i].getElementsByTagName("Title");
		var description	= items[i].getElementsByTagName("Summary");
		var content		= items[i].getElementsByTagName("content");
		//var creator		= items[i].getElementsByTagName("creator");
		
		var link		= items[i].getElementsByTagName("Url");
		var pubDate		= items[i].getElementsByTagName("ModificationDate");

		try
		{
			if (title[0])		item.title			= title[0].firstChild.nodeValue; 
		}
		catch (err)
		{
			alert(err);
		}
	
		try {
			if (description[0])	item.description	= description[0].firstChild.nodeValue; 
		} catch(err) {
		}
		
		try{
			if (link[0])		item.link	= link[0].firstChild.nodeValue; 
		} catch(err) {
		}

		try{
			if (pubDate[0])		item.pubDate	= pubDate[0].firstChild.nodeValue; 
		} catch(err) {
		}
		
		rssItems[i] = item;
	}
	return rssItems;
}





function xml_google_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");

	var root		= xmlobject.getElementsByTagName('object')[0];	
	var items		= root.getElementsByTagName("object");
	
	var url ="";
	var rssItems = new Array();
	var index = 0;
	for (i=0; i<items.length; i++) {
		
		var item		= new Object;

		//var link		= items[i].firstChild.getAttribute("name"); //return id
		//var link		= items[i].firstChild.nodeName;  //return "string";
		var entries		= items[i].getElementsByTagName('string');//[0];	
	
		item.link	= entries[0].firstChild.nodeValue.replace(/^feed\//,"");
		item.title	= entries[1].firstChild.nodeValue;

		if (item.link.indexOf("http") >=0) {
			//url += item.link;
			rssItems[index++] = item;
		}
	}

//alert(url+rssItems.length);
	//alert(rssItems[0].link);
	return rssItems;
}

function xml_rss_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");

	var root		= xmlobject.getElementsByTagName('rss')[0];
	
	try {
		var channels	= root.getElementsByTagName("channel");		
	}
	catch (err)
	{
		//showMask(false);
		//alert(xml_string);
		//alert("not rss, try atom");
		return xml_atom_parser(xml_string);		

	}
	
	var items		= channels[0].getElementsByTagName("item");
	var siteTitles	= channels[0].getElementsByTagName("title");
	var siteDescs	= channels[0].getElementsByTagName("description");
	
	try
	{
		var siteTitle	= siteTitles[0].firstChild.nodeValue;
	}
	catch (err)
	{
		var siteTitle = "RSS Feed";
	}

	try {var siteDesc	= siteDescs[0].firstChild.nodeValue;}
	catch (err){}

	//var siteDescs	= channels[0].getElementsByTagName("description");
	//var siteDesc	= siteDescs[0].firstChild.nodeValue;

 	//var image		= channels[0].getElementsByTagName("image");
	//var url			= image[0].getElementsByTagName("url");
	//var siteIcon	= image[0].firstChild.nodeValue;
	
	var rssItems = new Array();
	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		item.siteTitle	= siteTitle; 
		item.siteDesc	= siteDesc; 
		
		var title		= items[i].getElementsByTagName("title");
		var description	= items[i].getElementsByTagName("description");
		var content		= items[i].getElementsByTagNameNS("http://purl.org/rss/1.0/modules/content/", "encoded");
		//var creator		= items[i].getElementsByTagName("creator");
/*
		if (i==0) {
			try
			{
			alert(description[0].firstChild.nodeValue);
				
			}
			catch (err)
			{
			}
		}


		if (i==0)
		{
			try
			{
			alert(content[0].firstChild.nodeValue);
			}
			catch (err)
			{
				//alert(err);
			}
		}
	*/	
		var link		= items[i].getElementsByTagName("link");
		var pubDate		= items[i].getElementsByTagName("pubDate");
		var timestamp	= items[i].getElementsByTagName("timestamp");

		try
		{
			if (title[0])		item.title			= title[0].firstChild.nodeValue; 
		}
		catch (err)
		{
			alert(err);
		}
	
		try{
			//if (description[0])	item.description	= description[0].firstChild.nodeValue; 
			if (description[0])	item.summary	= description[0].firstChild.nodeValue; 
		} catch(err) {
		}

		try{

			if (content[0])	item.summary		= content[0].firstChild.nodeValue; 
			
			//item.summary = item.summary.replace(/\<\!\[CDATA\[/g, "");
			//item.summary = item.summary.replace(/\]\]\>$/, "");
			//alert(item.summary);

		} catch(err) {

			//alert("ajax 926: could not parse content");
		}


		try {
			//var photo = description.replace(/.+?(http.+?\.\w{2,4}).+$/gi, "$1");.+?\.(jpg|png)
			var photoPattern = /http\:\/\/\S+?\.(jpg|png)/ig;

			//var resultArray = photoPattern.exec(item.summary);
			//item.thumbLink = resultArray[0]; //CAUTION: ARG 0//YYYYYYYYYYYYYYYYYYYYYiiii only works the first result.
			var photosArray = item.summary.match(photoPattern); 
			item.thumbLink = photosArray[photosArray.length-1]; 

		} catch(err) {
		}

		try{
			var photoPattern = /http\:\/\/www.youtube.com\/v\/([\w\-\d]{10,})/ig;
			var resultArray = photoPattern.exec(unescape(item.summary));
			item.yt_key = resultArray[1]; //CAUTION: ARG 1


		} catch(err) {
		}

		//item.title += item.summary;

		//alert(item.content);
		//if (creator[0])	item.creator		= creator[0].firstChild.nodeValue; 
		
		if (link[0])		item.link			= link[0].firstChild.nodeValue; 
		if (pubDate[0])		item.pubDate		= pubDate[0].firstChild.nodeValue; 
		if (timestamp[0])	item.timestamp		= timestamp[0].firstChild.nodeValue; 
			
		rssItems[i] = item;
	}

	//alert(rssItems[0].description);
	return rssItems;
}

function xml_atom_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");

	var root		= xmlobject.getElementsByTagName('feed')[0];
	
	try {
		var channels	= root.getElementsByTagName("id");		
	}
	catch (err)
	{
		showMask(false);
		//alert(xml_string);
		alert("Fail to parse feed as RSS and as ATOM. Giving up parsing.");
	}
	
	//var items		= channels[0].getElementsByTagName("entry");
	var items		= root.getElementsByTagName("entry");
	//alert("items count: "+items.length);

	var titles		= root.getElementsByTagName("title");
	var siteTitle	= titles[0].firstChild.nodeValue;

	var subtitles	= root.getElementsByTagName("subtitle");
	
	try {
		var siteDesc	= subtitles[0].firstChild.nodeValue;
		
	}
	catch (err)
	{
		//alert(err);
	}
	
	var updates		= root.getElementsByTagName("updated");
	var siteUpdate	= updates[0].firstChild.nodeValue;

 	//var siteLinks	= root.getElementsByTagName("link");
	//var siteLink	= siteLinks[0].firstChild.nodeValue;
	//alert("in xml_atom_parser..."+siteLink);

	//var siteDescs	= channels[0].getElementsByTagName("description");
	//var siteDesc	= siteDescs[0].firstChild.nodeValue;

 	//var image		= channels[0].getElementsByTagName("image");
	//var url			= image[0].getElementsByTagName("url");
	//var siteIcon	= image[0].firstChild.nodeValue;
	
	var rssItems = new Array();
	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		item.siteTitle	= siteTitle; 
		item.siteDesc	= siteDesc; 
		
		var title		= items[i].getElementsByTagName("title");
		//var description	= items[i].getElementsByTagName("description");
		var content		= items[i].getElementsByTagName("content");
		var summary		= items[i].getElementsByTagName("summary");
		//var creator		= items[i].getElementsByTagName("creator");
		
		var link		= items[i].getElementsByTagName("link");

/*
		if (item.link.length<10)
		{
			alert("abc");
			item.link		= link[0].getAttribute("href");
		}
*/



		var published	= items[i].getElementsByTagName("published");
		var updated		= items[i].getElementsByTagName("updated");

		if (title[0])		item.title			= title[0].firstChild.nodeValue; 
		if (published[0])	item.pubDate		= published[0].firstChild.nodeValue; 
		try {item.link			= link[0].getAttribute("href");}
		catch (err){}
		
		if (summary[0])		item.description	= summary[0].firstChild.nodeValue; 
		if (content[0])		item.content		= content[0].firstChild.nodeValue; 
		
		item.summary = "";
		try {if (item.description.length>0) item.summary=unescape(item.description);}
		catch (err){}

		try {if (item.content.length>0) item.summary=unescape(item.content);}
		catch (err){}

		try {
			//var photo = description.replace(/.+?(http.+?\.\w{2,4}).+$/gi, "$1");.+?\.(jpg|png)
			var photoPattern = /http\:\/\/\S+?\.(jpg|png)/ig;
			var resultArray = photoPattern.exec(unescape(item.summary));
			item.thumbLink = resultArray[0]; //CAUSION: ARG 0

		} catch(err) {
		}

		try{
			var photoPattern = /http\:\/\/www.youtube.com\/v\/([\w\-\d]{10,})/ig;
			var resultArray = photoPattern.exec(unescape(item.summary));
			item.yt_key = resultArray[1]; //CAUSION: ARG 1


		} catch(err) {
		}

		rssItems[i] = item;
	}

	return rssItems;
}

function xml_tag_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");

	// get a reference to the root-element "rss"
	var root = xmlobject.getElementsByTagName('rss')[0];
	// get reference to "channel" element

	var channels = root.getElementsByTagName("channel");		
	// now get all "item" tags in the channel
	var items = channels[0].getElementsByTagName("item");

	var siteTitles	= channels[0].getElementsByTagName("title");
	var siteTitle	= siteTitles[0].firstChild.nodeValue;
	
	var siteDescs = channels[0].getElementsByTagName("description");
	var siteDesc = siteDescs[0].firstChild.nodeValue;

	var rssItems = new Array();

	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		item.siteTitle	= siteTitle; 
		item.siteDesc	= siteDesc; 
		
		var title		= items[i].getElementsByTagName("title");
		var keyword		= items[i].getElementsByTagName("keyword");
		var owner		= items[i].getElementsByTagName("owner");
		var link		= items[i].getElementsByTagName("link");

//alert(summaries);

		if (link[0])		item.link			= link[0].firstChild.nodeValue; 
		if (title[0])		item.title		= title[0].firstChild.nodeValue; 
		if (keyword[0])		item.keyword	= keyword[0].firstChild.nodeValue; 
		if (owner[0])		item.owner		= owner[0].firstChild.nodeValue; 

		//id,db_table,owner,permission,type,link,rss_host_title,rss_host,
		//filenames,video_keys,rating,logintude,latitue,last_updated,timestamp;

		rssItems[i] = item;
	}
	return rssItems;
}


/*
function xml_aaa_parser(xml_string) { //Same as xml_tag_parser. Redundant!
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");
	var root		= xmlobject.getElementsByTagName('rss')[0];
	var channels	= root.getElementsByTagName("channel");		
	var items		= channels[0].getElementsByTagName("item");
	
	var rssItems = new Array();
	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		
		var title		= items[i].getElementsByTagName("title");
		var description	= items[i].getElementsByTagName("description");
		var content		= items[i].getElementsByTagNameNS("http://purl.org/rss/1.0/modules/content/", "encoded");

		var link		= items[i].getElementsByTagName("link");
		var pubDate		= items[i].getElementsByTagName("pubDate");
		var timestamp	= items[i].getElementsByTagName("timestamp");

		try
		{
			if (title[0])		item.title			= title[0].firstChild.nodeValue; 
		}
		catch (err)
		{
			alert(err);
		}
		
		if (link[0])		item.link			= link[0].firstChild.nodeValue; 
		if (pubDate[0])		item.pubDate		= pubDate[0].firstChild.nodeValue; 
		if (timestamp[0])	item.timestamp		= timestamp[0].firstChild.nodeValue; 
			
		rssItems[i] = item;
	}

	//alert(rssItems[0].description);
	return rssItems;
}
*/

function xml_parser(xml_string) { //for xeeku host only (not for RSS feed as fields are prioperitory
		
	var xmlobject = (new DOMParser()).parseFromString(xml_string, "text/xml");

	// get a reference to the root-element "rss"
	var root = xmlobject.getElementsByTagName('rss')[0];
	// get reference to "channel" element

	var channels = root.getElementsByTagName("channel");		
	// now get all "item" tags in the channel
	var items = channels[0].getElementsByTagName("item");

	var siteTitles	= channels[0].getElementsByTagName("title");
	var siteTitle	= siteTitles[0].firstChild.nodeValue;
	
	var siteDescs = channels[0].getElementsByTagName("description");
	var siteDesc = siteDescs[0].firstChild.nodeValue;

	var rssItems = new Array();

	for (i=0; i<items.length; i++) {
		
		var item		= new Object;
		item.siteTitle	= siteTitle; 
		item.siteDesc	= siteDesc; 
		
		var title		= items[i].getElementsByTagName("title");
		var summaries	= items[i].getElementsByTagName("summary");
		var date		= items[i].getElementsByTagName("timestamp");
		var filenames	= items[i].getElementsByTagName("filenames");
		var rss_host_title	= items[i].getElementsByTagName("rss_host_title");
		var video_keys	= items[i].getElementsByTagName("video_keys");
		var link		= items[i].getElementsByTagName("link");
		var latitude	= items[i].getElementsByTagName("latitude");
		var longitude	= items[i].getElementsByTagName("longitude");
		var photo_calendar	= items[i].getElementsByTagName("photo_calendar");
		var photo_count	= items[i].getElementsByTagName("photo_count");
		var db_id		= items[i].getElementsByTagName("id");
		var rating		= items[i].getElementsByTagName("rating");
		var timestamp	= items[i].getElementsByTagName("timestamp");
		var tag			= items[i].getElementsByTagName("tag");

//alert(summaries);

		if (title[0])		item.title	= title[0].firstChild.nodeValue; 
		if (summaries[0].firstChild)	item.summary	= summaries[0].firstChild.nodeValue; 
		if (date[0])		item.date		= date[0].firstChild.nodeValue; 
		if (filenames[0])	item.filenames	= filenames[0].firstChild.nodeValue; 
		if (rss_host_title[0]) item.host_title	= rss_host_title[0].firstChild.nodeValue; 
		if (video_keys[0])	item.video_keys	= video_keys[0].firstChild.nodeValue; 
		if (link[0])		item.link		= link[0].firstChild.nodeValue; 
		if (latitude[0])	item.latitude	= latitude[0].firstChild.nodeValue; 
		if (longitude[0])	item.longitude	= longitude[0].firstChild.nodeValue; 
		if (photo_calendar[0])	item.photo_calendar	= photo_calendar[0].firstChild.nodeValue; 
		if (photo_count[0])	item.photo_count	= photo_count[0].firstChild.nodeValue; 
		if (db_id[0])		item.db_id	= db_id[0].firstChild.nodeValue; 
		if (rating[0])		item.rating	= rating[0].firstChild.nodeValue; 
		if (timestamp[0])	item.timestamp	= timestamp[0].firstChild.nodeValue; 
		if (tag[0])			item.tag	= tag[0].firstChild.nodeValue; 

		//id,db_table,owner,permission,type,link,rss_host_title,rss_host,
		//filenames,video_keys,rating,logintude,latitue,last_updated,timestamp;

		rssItems[i] = item;
	}
	return rssItems;
}


var rss_req = new rss_req();
function rss_req () {

	this.t				= 0;
    this.url			= '';
    this.callback		= '';

	this.start = function (url, callback) {
		
		this.url 	= "http://booklet.xeeku.com/proxy.php?link="+url;
		this.callback 	= callback;

		this.ajax_req();
		//this.update();
	}
	
	this.update = function () {
		this.ajax_req('');
		window.clearTimeout(this.t);
		this.t = window.setTimeout("rss_req.update()", "30000");
	}

	this.ajax_req = function () {

		var req = newXMLHttpRequest();
		req.onreadystatechange = getReadyStateHandler(req, this.ajax_rcv);
		req.open('POST', this.url, true);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send("nothing");
	}

	this.ajax_rcv = function (text) {

		var xmlobject = (new DOMParser()).parseFromString(text, "text/xml");
		// get a reference to the root-element "rss"
		var root = xmlobject.getElementsByTagName('rss')[0];
		// get reference to "channel" element
		var channels = root.getElementsByTagName("channel");		
		// now get all "item" tags in the channel
		var items = channels[0].getElementsByTagName("item");
		
		var siteTitles	= channels[0].getElementsByTagName("title");
		var siteTitle	= siteTitles[0].firstChild.nodeValue;
		
		var siteDescs = channels[0].getElementsByTagName("description");
		var siteDesc = siteDescs[0].firstChild.nodeValue;

		var rssItems = new Array();
		for (i=0; i<items.length; i++) {
			
			var item		= new Object;
			item.siteTitle	= siteTitle; 
			item.siteDesc	= siteDesc; 
			
			var title			= items[i].getElementsByTagName("title");
			var descriptions	= items[i].getElementsByTagName("description");
			var date			= items[i].getElementsByTagName("pubDate");
			
			item.title	= title[0].firstChild.nodeValue; 
			item.desc	= descriptions[0].firstChild.nodeValue; 
			item.date	= date[0].firstChild.nodeValue; 

			rssItems[i] = item;
		}

		rss_req.callback(rssItems);
	}
}
