/*
 * 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);
	}
}

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

	this.t				= 0;
	//this.user_id		= 'gmail_user';
	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("loadThumbs.update()", "10000");
		}
	}

	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_photos&user_id='+user_id+'&twitter_id='+twitter_id);
	}

	this.ajax_rcv = function (xml_str) {

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

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 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");
		
		if (title[0])		item.title	= title[0].firstChild.nodeValue; 
		if (summaries[0])	{
			item.summary	= summaries[0].firstChild.nodeValue; 
			item.summary	= unescape(item.summary).replace(/\++/g," "); 
		}
		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; 

		//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);
	}
}
