Source for "UrMap Plus"

By CK
Has 20 other scripts.


Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name          UrMap Plus
// @version	  2.5
// @description   Display geotagged Flickr photos and Google Maps in UrMap
// @namespace     http://webdev.yuan.cc/
// @include       http://www.urmap.com/*
// @include       http://www.urmap.com.tw/*
// @exclude       http://www.urmap.com/SearchEngine/*
// @exclude       http://www.urmap.com.tw/SearchEngine/*

// Author: ckyuan@gmail.com
//
// ==/UserScript==


(function() {

    function _gt(e) { return document.getElementsByTagName(e); }
    function _gi(e) { return document.getElementById(e); }
    function _ce(e) { return document.createElement(e); }
    function _ct(e) { return document.createTextNode(e); }

    if(unsafeWindow) w = unsafeWindow;
    else w = window;

    Umap = w._Umap;

    w.document.write = function(str) {
	var div = document.createElement('div');
	div.innerHTML = str;
	document.body.appendChild(div);
    }

    var last_x=last_y=-1,myMapApp,flickrPanel,flickrPhotos,flickrPhoto,tags,nsid,username,pages=1,page=1;
    var latlon=false,twd97=true,gmap_click=gearth_click=addtags_click=false,lat_dd,lon_dd;
    var auth_token,auth_nsid,auth_username,authenticated=false,mode=1,photostream;
    var photos = new Array();

    var js = _ce("script");
    js.language = "javascript";
    js.src = "http://webdev.yuan.cc/gmif/maps2.js";
    document.body.appendChild(js);
    var js2 = _ce("script");
    js2.language = "javascript";
    js2.src = "http://webdev.yuan.cc/maps/urmap.js";
    document.body.appendChild(js2);
    var js3 = _ce("script");
    js3.language = "javascript";
    js3.src = "http://webdev.yuan.cc/lib/md5.js";
    document.body.appendChild(js3);

//  Add "Convert to TWD97" to the toolbox
//    var info = _ce('span');
    var go = _ce('a');
    go.innerHTML = 'Convert to TWD97';
    go.href = 'javascript:;';
    go.style.marginRight = '10px';
    go.handler = function() {
	coords.innerHTML = '<b>Datum: TWD97</b><br />X=' + w.a.y;
	coords.innerHTML += ' Y=' + w._Umap.getCenter().lng();
	showLoadingMessage('Convert coords...');
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: 'http://webdev.yuan.cc/maps/twd_conv.php?y='+Umap.getCenter().lng()+'&x='+w.a.y+'&method=TM2TOLATLON&coords=TM2',
	    headers: {
		'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
		'Accept': 'application/atom+xml,application/xml,text/xml,text/plain',
	    },
	    onload: function(responseDetails) {
		hideLoadingMessage();
		var parser = new w.DOMParser();
		var dom = parser.parseFromString(responseDetails.responseText, "application/xml");

		var crds = dom.getElementsByTagName('coords');
		for(var i=0;i<crds.length;i++) {
		    if( crds[i].getAttribute('format') == 'TM2' ) {
			x = 1*crds[i].getElementsByTagName('x').item(0).firstChild.data;
			y = 1*crds[i].getElementsByTagName('y').item(0).firstChild.data;
		    }
		    if( crds[i].getAttribute('format') == 'DMS' ) {
			lat_dms = crds[i].getElementsByTagName('lat').item(0).firstChild.data;
			lon_dms = crds[i].getElementsByTagName('lon').item(0).firstChild.data;
		    }
		    if( crds[i].getAttribute('format') == 'D.d' ) {
			lat_dd = 1*crds[i].getElementsByTagName('lat').item(0).firstChild.data;
			lon_dd = 1*crds[i].getElementsByTagName('lon').item(0).firstChild.data;
			lat_dd = Math.round(lat_dd * 1000000) / 1000000.0;
			lon_dd = Math.round(lon_dd * 1000000) / 1000000.0;
		    }
		}
		var links = dom.getElementsByTagName('links');
		for(var i=0;i<links.length;i++) {
		    if( links[i].getAttribute('resource') == 'GMAPS' ) gmap = links[i].firstChild.data;
		    if( links[i].getAttribute('resource') == 'URMAP' ) urmap = (links[i].firstChild) ? links[i].firstChild.data : '';
		}

		coords.innerHTML = '<b>Datum: TWD97</b><br />Lon=' + lon_dd + ' Lat=' + lat_dd + '<br />X=' + x + ' Y=' + y;
//		info.innerHTML = 'Link to <a href="' + gmap + '&spn=0.024971,0.038242&t=k&hl=en">Google Maps</a>';
		google.url = gmap + '&spn=0.024971,0.038242&t=k&hl=en';
		twd97 = true;
		latlon = true;
		if( gmap_click ) {
		    myMapApp.setCenter(new w.GLatLng(lat_dd, lon_dd), 7+w.a.e);
		    gmap_click = false;
		}
		if( gearth_click ) {
		    flyto(lon_dd,lat_dd);
		    gearth_click = false;
		}
		if( addtags_click ) {
		    addGeoTags();
		    addtags_click = false;
		}
	    }
	});
    }
    go.addEventListener('click', go.handler, true);
    var inspt = _gi('toolbarDiv');
//    inspt.insertBefore(go, inspt.firstChild);

//  Add update script link
    var qform = _gi('queryForm');
    var update_script = _ce('span');
    update_script.style.marginLeft = '20px';
    update_script.innerHTML = '<span style="margin-right:10px;"><a href="http://webdev.yuan.cc/greasemonkey/urmap.plus.about.php" title="About UrMap Plus" target="_blank">About UrMap Plus</a></span>';
    update_script.innerHTML += '<span style="margin-right:10px;"><a href="http://webdev.yuan.cc/greasemonkey/urmap.plus.user.js" title="Right-Click to update UrMap Plus script">Update UrMap Plus</a></span>';
    update_script.innerHTML += '<span style="margin-right:10px;"><a href="http://webdev.yuan.cc/maps/UrMap.kmz" title="Download UrMap location for Google Earth">UrMap for Google Earth</a></span>';
//    qform.appendChild(update_script);
//    inspt.insertBefore(update_script, inspt.firstChild);
    inspt.appendChild(update_script);


//  Add coords box
    var map = _gi('mapDiv');
    var coords = _ce('div');
    coords.style.position = 'absolute';
    coords.style.textAlign = 'left';
    coords.style.top = '10px';
    coords.style.left = '50px';
    coords.style.zIndex = 10000;
    coords.style.padding = '5px';
    coords.style.border = '1px solid #000';
    coords.style.color = '#4358c6';
    coords.style.font = '11px tahoma';
    coords.style.background = 'transparent';
    coords.style.background = '#dbe6f3';
    coords.innerHTML = 'Coords here... ';
    map.appendChild(coords);

//  Add cross cursor above the center of maps
    var cursor = _ce('div');
    cursor.style.position = 'absolute';
    cursor.style.width = '41px';
    cursor.style.height = '41px';
    cursor.style.zIndex = 21000;
//    cursor.style.border = '0px solid #ff0000';
    cursor.innerHTML = '<div style="position:absolute;width:19px;height:19px;border-right:1px solid #ff0000;border-bottom:1px solid #ff0000;"></div><div style="position:absolute;width:19px;height:19px;top:19px;left:19px;border-left:1px solid #ff0000;border-top:1px solid #ff0000;"></div><div id="cursorphoto" style="position:absolute;width:50px;height:50px;top:-5px;left:-5px;z-index:22000"></div>';
    map.appendChild(cursor);
    var showCursor = function() {
//	var mh = ''+map.style.height;
//	var mw = ''+map.style.width;
//	mh = 1*mh.replace(/px/,'');
//	mw = 1*mw.replace(/px/,'');
	var mh = map.clientHeight;
	var mw = map.clientWidth;
	cursor.style.top = Math.round(mh/2-20) + 'px';
	cursor.style.left = Math.round(mw/2-20) + 'px';
	map.removeEventListener('mouseover', showCursor, true);
    }
//    map.addEventListener('resize', showCursor, true);
    _gi('toggleInfoLink').addEventListener('click', function() { map.addEventListener('mouseover', showCursor, true); }, true);
    _gi('toggleHeaderLink').addEventListener('click', function() { map.addEventListener('mouseover', showCursor, true); }, true);
    w.window.addEventListener("resize",showCursor,true);


//  Add Google Maps div
    var google = _ce('a');
    google.setAttribute('style', 'border: 1px solid rgb(148, 148, 148); padding: 2px; background: white none repeat scroll 0%; position: absolute; right: 5px; top: 5px; z-index: 40; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-size: 12px; color: rgb(90, 89, 89); cursor: pointer; text-decoration: none;');
    google.style.position = "absolute";
    google.style.zIndex = "40";
    google.style.right = '184px';
    google.style.top = "5px";
    google.href = 'javascript:;';
    google.innerHTML = 'Google Maps';
    google.onclickHandler = function() {

	var lat = w._Umap.getCenter().lat();
	var lon = w._Umap.getCenter().lng();
	if( w.gmap_container.show ) w.gmap_container.style.display = 'none';
	else w.gmap_container.style.display = 'block';
	if ( !w.gmap_container.initialized && w.GBrowserIsCompatible()) {
//	    myMapApp = new w._MapsApplication(w.gmap, w.panel, w.metapanel, w.permalink, w.printheader, w.createMapSpecs());
//	    myMapApp.loadMap();
//	    myMapApp.map.setMapType(w.G_SATELLITE_TYPE);
	    myMapApp = new w.GMap2(w.gmap);
	    myMapApp.addControl(new w.GLargeMapControl());
	    myMapApp.addControl(new w.GMapTypeControl());
//	    myMapApp.setMapType(w.G_SATELLITE_MAP);
	    w.gmap.map = myMapApp;
	    w.gmap_container.initialized = true;
	}
	if ( w.gmap_container.initialized ) w.gmap.resizeMap(myMapApp);
	w.gmap_container.show = !w.gmap_container.show;
	gmap_click = true;
//	if(!latlon) go.handler();
//	else myMapApp.setCenter(new w.GLatLng(lat_dd, lon_dd), 10-w.a.e);
	myMapApp.setCenter(new w.GLatLng(lat, lon), 7+w._Umap.getZoomLevel());
    }
    google.addEventListener('click', google.onclickHandler, true);
    _gi('mapDiv').appendChild(google);

//  Add Google Earth div
    var flyto = function(lon,lat) {
//	document.location = 'http://webdev.yuan.cc/maps/ge.php?BBOX=' + lon + ',' + lat + ',' + lon + ',' + lat;
	document.location = 'http://webdev.yuan.cc/gmif/makeKML.php?src=UrMap&lon=' + lon + '&lat=' + lat + '&img=http://www.urmap.com/SearchEngine/img2/logo2.gif';
    }
    var gearth = _ce('a');
    gearth.setAttribute('style', 'border: 1px solid rgb(148, 148, 148); padding: 2px; background: white none repeat scroll 0%; position: absolute; right: 5px; top: 5px; z-index: 40; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; font-size: 12px; color: rgb(90, 89, 89); cursor: pointer; text-decoration: none;');
    gearth.style.position = "absolute";
    gearth.style.zIndex = "40";
    gearth.style.right = '264px';
    gearth.style.top = "5px";
    gearth.href = 'javascript:;';
    gearth.innerHTML = 'Google Earth';
    gearth.onclickHandler = function() {
	var lat = w._Umap.getCenter().lat();
	var lon = w._Umap.getCenter().lng();
	gearth_click = true;
//	if(!latlon) go.handler();
	flyto(lon, lat);
    }
    gearth.addEventListener('click', gearth.onclickHandler, true);
    _gi('mapDiv').appendChild(gearth);

//  Add event handlers to show TM2 coords value
    var showTM2 = function() {
	if(!w._Umap) return;
	var lat = w._Umap.getCenter().lat();
	var lon = w._Umap.getCenter().lng();
	lat = Math.round(lat * 1000000) / 1000000.0;
	lon = Math.round(lon * 1000000) / 1000000.0;
	if( last_x == lon && last_y == lat ) return;
//	twd97 = false;
	latlon = false;
//	coords.innerHTML = '<b>Datum: TWD97</b><br />';
	coords.innerHTML = 'Lat = ' + lat + '<br />';
	coords.innerHTML += 'Lon = ' + lon;
	last_x = lon;
	last_y = lat;
    }
    map.addEventListener('dblclick', showTM2, true);
    map.addEventListener('mousedown', showTM2, true);
    map.addEventListener('mouseup', showTM2, true);
    map.addEventListener('mousemove', showTM2, true);
    showTM2();

    var showLoadingMessage = function(message) {
	var loadingMessage;
	if (message) loadingMessage = message;
	else loadingMessage = "Loading...";
	var disabledZone = _gi('disabledZone');
	if (!disabledZone) {
	    disabledZone = document.createElement('div');
	    disabledZone.setAttribute('id', 'disabledZone');
	    disabledZone.style.position = "absolute";
	    disabledZone.style.zIndex = "1000";
	    disabledZone.style.left = "0px";
	    disabledZone.style.top = "0px";
	    disabledZone.style.width = "100%";
	    disabledZone.style.height = "100%";
	    document.body.appendChild(disabledZone);
	    var messageZone = document.createElement('div');
	    messageZone.setAttribute('id', 'messageZone');
	    messageZone.style.position = "absolute";
	    messageZone.style.top = "0px";
	    messageZone.style.right = "0px";
	    messageZone.style.background = "red";
	    messageZone.style.color = "white";
	    messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";
	    messageZone.style.padding = "4px";
	    disabledZone.appendChild(messageZone);
	    var text = document.createTextNode(loadingMessage);
	    messageZone.appendChild(text);
	} else {
	    _gi('messageZone').innerHTML = loadingMessage;
	    disabledZone.style.visibility = 'visible';
	}
    }
    var hideLoadingMessage = function() {
	_gi('disabledZone').style.visibility = 'hidden';
    }
    var selectPhotos = function(mode) {
	var html=m1=m2=m3='';
	switch(mode) {
	    case 1: m1 = 'selected'; break;
	    case 2: m2 = 'selected'; break;
	    case 3: m3 = 'selected'; break;
	}
	html += '<div style="text-align:right">';
	html += '<select id="selectphotos" style="font-family:arial;font-size:x-small;margin-right:10px">';
	html += '	<option value="">Select Photostream</option>';
	html += '	<option value="my photos" ' + m1 + '>My photos</option>';
	html += '	<option value="geotagged taiwan" ' + m2 + ' >Geotagged Taiwan</option>';
	html += '	<option value="geotagged flickr" ' + m3 + ' >Geotagging Flickr</option>';
	html += '</select>';
	html += '</div>';
	return html;
    }
    var onChangeSelPhotos = function() {
	if( this.value == '' ) return;
	if( this.value == 'my photos' ) {
	    mode = 1;
	    photostream = auth_nsid;
	    searchPhotos(auth_nsid,1,mode);
	}
	if( this.value == 'geotagged taiwan' ) {
	    mode = 2;
	    photostream = '66961499@N00';
	    searchPhotos(photostream,1,mode);
	}
	if( this.value == 'geotagged flickr' ) {
	    mode = 3;
	    photostream = '94823070@N00';
	    searchPhotos(photostream,1,mode);
	}
    }
    var checkFlickrAuth = function() {
        var url = 'http://flickr.com/services/auth/?api_key=52694df4c74c61a95a898754a5ae610f&perms=write&api_sig=49675f7f091a3add615e46a0f911dd04';
	showLoadingMessage('Login Flickr...');
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            headers: {
                'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
                'Accept': 'application/atom+xml,application/xml,text/xml,text/plain,text/html',
            },
            onload: function(responseDetails) {
//		alert(responseDetails.responseText);
		hideLoadingMessage();
                var parser = new w.DOMParser();
                var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		var rsp = dom.getElementsByTagName('rsp');
		if( !dom || rsp.length == 0 ) {
		    GM_xmlhttpRequest({
			method: 'GET',
			url: 'http://webdev.yuan.cc/flickr/auth.php',
			headers: {
			    'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
			    'Accept': 'application/atom+xml,application/xml,text/xml,text/plain,text/html',
			},
			onload: function(responseDetails) {
			}
		    });
		    return;
		}
		if( rsp[0].getAttribute('stat') == 'ok' ) {
		    authenticated = true;
		    auth_token = dom.getElementsByTagName('token').item(0).firstChild.data;
		    auth_nsid = dom.getElementsByTagName('user').item(0).getAttribute('nsid');
		    auth_username = dom.getElementsByTagName('user').item(0).getAttribute('username');
		    flickrPanel.innerHTML = 'Logged in Flickr as ' + auth_username + ' ';
		    nsid = auth_nsid;
		    searchPhotos(auth_nsid,1,1);
		} else return;
            }
        });
    }
//  checkFlickrAuth();

//  Add flickr photos to map
    w.flickr = function() {
	var infoPanel = _gi('infoDiv');
	var tmpdivs = infoPanel.getElementsByTagName('div');

	if( tmpdivs.length == 0 ) return;
	clearInterval(flickr_handler);
//	for(var i=0;i<tmpdivs.length;i++) {
//	    if( tmpdivs[i].className == 'tabArea' ) tabArea = tmpdivs[i];
//	    if( tmpdivs[i].className == 'tabBodyArea' ) tabBodyArea = tmpdivs[i];
//	}

	showCursor();
	tabArea = _gi('tabDiv').firstChild;
	tabBodyArea = tabArea.nextSibling;
	var flickrTab = _ce('div');
	flickrTab.setAttribute('style', 'border: 1px solid rgb(136, 136, 255); margin: 0px 3px; padding: 2px 5px 1px; background: transparent none repeat scroll 0%; float: left; height: 15px; cursor: pointer; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;');
	flickrTab.className = 'tab tabOff';
	flickrTab.innerHTML = 'Flickr';
	flickrTab.onclickHandler = function() {
	    flickrBody.style.display = 'block';
	    cursor.style.display = 'block';
	    _gi('listDiv').style.display = 'none';
	    _gi('routingDiv').style.display = 'none';
	    _gi('poiDiv').style.display = 'none';
	    _gi('detailDiv').style.display = 'none';
	    var tmpdivs = tabArea.getElementsByTagName('div');
	    for(var i=0;i<tmpdivs.length;i++) {
		if( tmpdivs[i].className == 'tab tabOn' ) 
		    tmpdivs[i].className = 'tab tabOff';
	    }
	    flickrTab.className = 'tab tabOn';
	    if( authenticated ) {
		flickrPanel.innerHTML = 'Logged in Flickr as ' + auth_username + ' ';
	    } else {
		flickrPanel.innerHTML = 'To geotag photos, please <a href="http://www.flickr.com/services/auth/?api_key=52694df4c74c61a95a898754a5ae610f&perms=write&api_sig=49675f7f091a3add615e46a0f911dd04">login flickr</a> first.';
	    }
	}
	flickrTab.onblurHandler = function() {
	    cursor.style.display = 'none';
	    flickrBody.style.display = 'none';
	    flickrTab.className = 'tab tabOff';
	}
	flickrTab.addEventListener('click', flickrTab.onclickHandler, true);
	var tmpdivs = tabArea.getElementsByTagName('div');
	for(var i=0;i<tmpdivs.length;i++) 
	    tmpdivs[i].addEventListener('click', flickrTab.onblurHandler, true);

	var flickrBody = _ce('div');
	flickrBody.className = 'tabBody';
	flickrBody.id = 'flickrTab';
	flickrBody.style.display = 'none';
	flickrBody.style.textAlign = 'center';

	tabArea.appendChild(flickrTab);
	tabBodyArea.appendChild(flickrBody);

	flickrPanel = _ce('div');
	var flickrSearch = _ce('div');
	flickrPhotos = _ce('div');
	flickrPhoto = _ce('div');
	flickrBody.appendChild(flickrPanel);
	flickrBody.appendChild(flickrSearch);
	flickrBody.appendChild(flickrPhotos);
	flickrBody.appendChild(flickrPhoto);

	flickrPanel.style.background = '#e8f2fd';
	flickrPanel.style.textAlign = 'left';
	flickrPanel.style.color = '#0070d7';
	flickrPanel.style.fontSize = 'small';
	flickrPanel.style.fontFamily = 'arial';
	flickrPanel.style.padding = '4px';
	flickrPanel.style.margin = '5px 5px 1px 5px';
	
	flickrSearch.style.background = '#e8f2fd';
	flickrSearch.style.textAlign = 'left';
	flickrSearch.style.color = '#0070d7';
	flickrSearch.style.fontSize = 'x-small';
	flickrSearch.style.fontFamily = 'arial';
	flickrSearch.style.padding = '2px';
	flickrSearch.style.margin = '0px 5px 5px 5px';
	flickrSearch.innerHTML = '<span><strong>Search Filter: </strong>';
	flickrSearch.innerHTML += '<input type=radio id="flickrtag2" name="flickrtag" value="all"><label for="flickrtag2"> All</label></span>';
	flickrSearch.innerHTML += '<input type=radio id="flickrtag1" name="flickrtag" checked value="geotagged"><input type="text" id="searchtags" name="tags" value="geotagged" style="font-family:arial;font-size:x-small" size="20"><br />';
//	flickrSearch.innerHTML += '<input type=radio id="flickrtag1" name="flickrtag" checked value="geotagged"><label for="flickrtag1"> Geotagged </label><br />';
	flickrSearch.innerHTML += '<span><strong>http://flickr.com/photos/';
	flickrSearch.innerHTML += '<input type=text id="flickruser" style="font-family:arial;font-size:x-small" size=8>/</strong> ';
	flickrSearch.innerHTML += '<input type=button id="flickrsearch" style="font-family:arial;font-size:x-small" value="Search"></span>';

	flickrPhoto.style.padding = '0px';
	flickrPhoto.style.margin = '5px 0px 0px 0px';

	_gi('flickrsearch').addEventListener('click', searchUser, true);
	_gi('flickruser').addEventListener('change', searchUser, true);
	_gi('flickrtag1').addEventListener('click', searchPhotos, true);
	_gi('flickrtag2').addEventListener('click', searchPhotos, true);
	_gi('searchtags').addEventListener('change', searchPhotos, true);
	checkFlickrAuth();
    }
    var flickr_handler = setInterval("flickr()", 500);

    var searchUser = function() {
	username = _gi('flickruser').value;
	var url = 'http://www.flickr.com/photos/' + username + '/';
	showLoadingMessage('Search user...');
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: 'http://flickr.com/services/rest/?method=flickr.urls.lookupUser&api_key=bc60075f4ce963fab3fac473d0741fe8&url=' + url,
	    headers: {
		'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
		'Accept': 'application/atom+xml,application/xml,text/xml,text/plain',
	    },
	    onload: function(responseDetails) {
		hideLoadingMessage();
		flickrPhoto.innerHTML = '';
		var parser = new w.DOMParser();
		var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		var users = dom.getElementsByTagName('user');
		if( users.length == 0 ) {
		    alert('No such user');
		    return;
		}
		nsid = users[0].getAttribute('id');
		searchPhotos(nsid,1,1);
	    }
	});
    }

    var searchPhotos = function(userid,page,mode) {
	if( page == undefined || mode == undefined ) {
	    mode = 1;
	    userid = nsid;
	    page = 1;
	}
	if( userid == undefined ) userid = '';
	if(mode == 1) {
	    var str = '' + _gi('searchtags').value;
	    tags = str.replace(/ +/,',');
	    if( _gi('flickrtag1').checked ) tags = '&tag_mode=all&tags=' + tags;
	    if( _gi('flickrtag2').checked ) tags = '';
	    if( tags == '' && userid == '' ) {
		alert('Plesae input username or tags.');
		return;
	    }
	    var url = 'http://flickr.com/services/rest/?method=flickr.photos.search&api_key=bc60075f4ce963fab3fac473d0741fe8&user_id=' + userid + tags + '&per_page=20&page=' + page;
	}
	if(mode==2 || mode==3) {
	    var url = 'http://flickr.com/services/rest/?method=flickr.groups.pools.getPhotos&api_key=bc60075f4ce963fab3fac473d0741fe8&group_id=' + userid + '&per_page=20&page=' + page;
	}
	showLoadingMessage('Loading photos...');
	// alert(mode + ',' + url);
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: url,
	    headers: {
		'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
		'Accept': 'application/atom+xml,application/xml,text/xml,text/plain',
	    },
	    onload: function(responseDetails) {
		// alert(responseDetails.responseText);
		hideLoadingMessage();
		var i,id;
		var parser = new w.DOMParser();
		var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		if( dom.getElementsByTagName('photos').length ) 
		    pages = 1*dom.getElementsByTagName('photos')[0].getAttribute('pages');
		else return;
		var _photos = dom.getElementsByTagName('photo');
		flickrPhotos.innerHTML = selectPhotos(mode);
		for(i=0;i<_photos.length;i++) {
		    id = _photos[i].getAttribute('id');
		    photos[id] = new Object();
		    photos[id].id = id;
		    photos[id].lat = -1;
		    photos[id].lon = -1;
		    photos[id].owner = _photos[i].getAttribute('owner');
		    photos[id].secret = _photos[i].getAttribute('secret');
		    photos[id].server = _photos[i].getAttribute('server');
		    photos[id].title = _photos[i].getAttribute('title');
		    photos[id].img_s = 'http://static.flickr.com/' + photos[id].server + '/' + id + '_' + photos[id].secret + '_s.jpg';
		    photos[id].img_m = 'http://static.flickr.com/' + photos[id].server + '/' + id + '_' + photos[id].secret + '_m.jpg';
		    photos[id].url = 'http://www.flickr.com/photos/' + photos[id].owner + '/' + id + '/';
		    flickrPhotos.innerHTML += '<a href="javascript:;" id="flickr_'+id+'" flickr="'+id+'" title="'+ photos[id].title +'"><img src="' + photos[id].img_s + '" alt="' + photos[id].title + '" border=0 width=50 height=50 style="margin:1px 1px 1px 1px;-moz-opacity:0.8;" onmouseover="this.style.MozOpacity=1" onmouseout="this.style.MozOpacity=0.8" /></a>';
		}
		var _page = _ce('div');
		_page.style.margin = '5px';
		_page.style.fontFamily = 'arial';
		_page.style.fontSize = 'small';
		_page.innerHTML = pager(page,pages);
		w.changePage = function(p) {
		    page = p;
		    if(mode==1) searchPhotos(nsid,p,mode);
		    else searchPhotos(photostream,p,mode);
		}
		flickrPhotos.appendChild(_page);
		_gi('selectphotos').addEventListener('change', onChangeSelPhotos, true);

		for(i=0;i<_photos.length;i++) {
		    id = _photos[i].getAttribute('id');
		    _link = _gi('flickr_'+id);
		    _link.addEventListener('click', locatePhoto, true);
		}
	    }
	});
    }

    var convCoords = function(value) {

	var DMS = /^([\+\-]?)(\d{0,3})\.([0-5]?\d)\.([0-5]?\d)\.(\d+)$/;
	var DMm = /^([\+\-]?)(\d{0,3})\.([0-5]?\d)\.(\d+)$/;
	var Dd =  /^[\+\-]?\d{0,3}\.\d+$/;

	value = '' + value;
	if( DMS.test(value) ) {
	    a = DMS.exec(value);
	    value = ((1*('0.'+a[5]) + 1*a[4])/60 + 1*a[3] )/60 + 1*a[2];
	    if( a[1] == '-' ) value = -1*value;
	    return value;
	}
	if( DMm.test(value) ) {
	    a = DMm.exec(value);
	    value = a[3] + '.' + a[4];
	    value = (1*value)/60 + 1*a[2];
	    if( a[1] == '-' ) value = -1*value;
	    return value;
	}
	if( Dd.test(value) ) {
	    return 1*value;
	}
	return 1*value;
    }

    var addGeoTags = function() {
//	if( !latlon ) {
//	    addtags_click = true;
//	    go.handler();
//	    return;
//	}
	var lat_dd = w._Umap.getCenter().lat();
	var lon_dd = w._Umap.getCenter().lng();
	lat_dd = Math.round(lat_dd * 1000000) / 1000000.0;
	lon_dd = Math.round(lon_dd * 1000000) / 1000000.0;
	var photo_id = _gi('addtags').getAttribute('flickr');
	var newlocation = false;

	if( photos[photo_id].lon == lon_dd && photos[photo_id].lat == lat_dd ) return;
	if( photos[photo_id].lat == -1 ) var newlocation = true;

	photos[photo_id].lon = photos[photo_id].twd97_lon = lon_dd;
	photos[photo_id].lat = photos[photo_id].twd97_lat = lat_dd;
//	photos[photo_id].x = w.a.y;
//	photos[photo_id].y = Umap.getCenter().lng();
	photos[photo_id].datum = 'WGS84';
	var method = 'flickr.photos.addTags';
	var api_key = '52694df4c74c61a95a898754a5ae610f';
	var tags = 'geotagged geo:tool=urmap geo:tool=yuancc geo:lat=' +lat_dd+ ' geo:lon=' +lon_dd;
	var str = '2e2303df15cc90a7api_key' + api_key + 'auth_token' + auth_token + 'method' + method + 'photo_id' + photo_id + 'tags' + tags;
	var api_sig = w.hex_md5(str);
	var url = 'http://www.flickr.com/services/rest/?method=flickr.photos.addTags&api_key=' +api_key+ '&photo_id=' + photo_id + '&tags=' + tags + '&auth_token=' + auth_token + '&api_sig=' + api_sig;
	showLoadingMessage('Add tags...');
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            headers: {
                'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
                'Accept': 'application/atom+xml,application/xml,text/xml,text/plain,text/html',
            },
            onload: function(responseDetails) {
		hideLoadingMessage();
                var parser = new w.DOMParser();
                var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		if( dom.getElementsByTagName('rsp')[0].getAttribute('stat') == 'ok' ) {
//		    alert('Geotags added!');
		    _gi('geotags').innerHTML = 'Coords: ' + photos[photo_id].lon + ', ' + photos[photo_id].lat;
		}
	    }
	});

	if( newlocation ) return;
	var method = 'flickr.photos.removeTag';
	var tag_id = photos[photo_id].tag_lat;
	var str = '2e2303df15cc90a7api_key' + api_key + 'auth_token' + auth_token + 'method' + method + 'tag_id' + tag_id;
	var api_sig = w.hex_md5(str);
	var url = 'http://www.flickr.com/services/rest/?method=flickr.photos.removeTag&api_key=' +api_key+ '&tag_id=' + tag_id + '&auth_token=' + auth_token + '&api_sig=' + api_sig;
//	showLoadingMessage('Remove tags...');
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            headers: {
                'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
                'Accept': 'application/atom+xml,application/xml,text/xml,text/plain,text/html',
            },
            onload: function(responseDetails) {
//		hideLoadingMessage();
                var parser = new w.DOMParser();
                var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		if( dom.getElementsByTagName('rsp')[0].getAttribute('stat') != 'ok' ) {
		    alert('Warning: tag modified fails!');
		}
	    }
	});
	
	var tag_id = photos[photo_id].tag_lon;
	var str = '2e2303df15cc90a7api_key' + api_key + 'auth_token' + auth_token + 'method' + method + 'tag_id' + tag_id;
	var api_sig = w.hex_md5(str);
	var url = 'http://www.flickr.com/services/rest/?method=flickr.photos.removeTag&api_key=' +api_key+ '&tag_id=' + tag_id + '&auth_token=' + auth_token + '&api_sig=' + api_sig;
//	showLoadingMessage('Remove tags...');
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            headers: {
                'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
                'Accept': 'application/atom+xml,application/xml,text/xml,text/plain,text/html',
            },
            onload: function(responseDetails) {
//		hideLoadingMessage();
                var parser = new w.DOMParser();
                var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		if( dom.getElementsByTagName('rsp')[0].getAttribute('stat') != 'ok' ) {
		    alert('Warning: tag modified fails!');
		}
	    }
	});
    }

    var locatePhoto = function(id,lat,lon) {
	if( lat == undefined ) {
	    var id = this.getAttribute('flickr');
	    var html='';
//	    html = '<h4>' + photos[id].title + '</h4>';
	    html += '<div style="padding:4px 4px 4px 4px;border:1px solid #444;background:#fff;margin:2px 5px 2px 5px;text-align:center;">';
	    html += '<a href="' + photos[id].url + '" target="_blank"><img src="' + photos[id].img_m + '" border=0 /></a>';
	    html += '<p style="margin:0px;padding:4px 0px 0px 0px"><span style="font-size:medium;font-weight:bolder;"><strong>' + photos[id].title + '</strong></span><br /><span id="geotags"></span>';
//	    if( authenticated )
	    html += '<br /><input id="addtags" type=button flickr="'+id+'" style="font-family:arial;font-size:x-small" value="Save Location">';
	    html += '</p></div>';
	    flickrPhoto.innerHTML = html;
//	    if( auth_nsid != nsid || mode!=1 ) _gi('addtags').disabled = true;
	    if( auth_nsid != photos[id].owner ) _gi('addtags').disabled = true;
//	    cursor.style.backgroundImage = 'url("' + photos[id].img_s + '")';
	    _gi('cursorphoto').innerHTML = '';
	    _gi('addtags').addEventListener('click', addGeoTags, true);
	    if( photos[id].lat == -1 ) {
		getLatLon(id);
		return;
	    }
	}
	if( lat != undefined && lon != undefined ) w._Umap.centerMap(new w.ULatLng(lat,lon));

        if( !photos[id].marker ) {
            var label = photos[id].title;
            var desc = '<div style="width:200px;font-size:10px"><img src="' + photos[id].img_s + '" width=50 height=50 align="left" /><b>' + photos[id].title + '</b><br />' + photos[id].lat + ', ' + photos[id].lon + '<br />';
            desc += (photos[id].taken) ? photos[id].taken.toGMTString() : '';
            desc += '<br clear="all"><p>' + photos[id].description + '</p>See <a href="javascript:;" onclick="_gi(\'searchtags\').value=\'geotagged\';changeTab(1);searchPhotos(\'' +photos[id].owner+ '\',1,1)">' + ((photos[id].username)? photos[id].username : 'owner') + '\'s geotagged photos</a>. <br /><a href="javascript:;" onclick="ping('+id+')">Ping Yuan.CC Maps</a>.</div>';
            var marker = new w.UMarker(new w.ULatLng(photos[id].lat, photos[id].lon),null,label,desc);
            marker.html = desc;
            marker.addListener('mouseover', function() {
                marker.openInfoWindow(marker.html);
//              map.centerAtLatLng(map.LatLng(photos[id].lat, photos[id].lon));
            });
            photos[id].marker = marker;
            w._Umap.addOverlay(marker);
        }
        photos[id].marker.openInfoWindow(photos[id].marker.html);

	return;

	if( photos[id].datum == 'TWD97' && photos[id].x != undefined ) {
	    w.a.ag(photos[id].x,photos[id].y,w.a.e);
	    if( myMapApp ) myMapApp.setCenter(new w.GLatLng(photos[id].twd97_lat, photos[id].twd97_lon), 7+w.a.e);
	    _gi('geotags').innerHTML = 'Coords: ' + photos[id].twd97_lon + ', ' + photos[id].twd97_lat;
	    _gi('cursorphoto').innerHTML = '<img src="' + photos[id].img_s + '" width=50 height=50 style="-moz-opacity:0.5;" onmouseover="this.style.MozOpacity=1" onmouseout="this.style.MozOpacity=0.5" />';
	    showTM2();
	    return;
	}

	showLoadingMessage('Convert coords...');
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: 'http://webdev.yuan.cc/maps/twd_conv.php?lat='+photos[id].lat+'&lon='+photos[id].lon+'&method=LATLONTOTM2&coords=LATLON',
	    headers: {
		'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/0.6.4',
		'Accept': 'application/atom+xml,application/xml,text/xml,text/plain',
	    },
	    onload: function(responseDetails) {
		hideLoadingMessage();
		var parser = new w.DOMParser();
		var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
		var crds = dom.getElementsByTagName('coords');
		for(var i=0;i<crds.length;i++) {
		    if( crds[i].getAttribute('format') == 'TM2' ) {
			x = 1*crds[i].getElementsByTagName('x').item(0).firstChild.data;
			y = 1*crds[i].getElementsByTagName('y').item(0).firstChild.data;
		    }
		    if( crds[i].getAttribute('format') == 'DMS' ) {
			lat_dms = crds[i].getElementsByTagName('lat').item(0).firstChild.data;
			lon_dms = crds[i].getElementsByTagName('lon').item(0).firstChild.data;
		    }
		    if( crds[i].getAttribute('format') == 'D.d' ) {
			lat_dd = 1*crds[i].getElementsByTagName('lat').item(0).firstChild.data;
			lon_dd = 1*crds[i].getElementsByTagName('lon').item(0).firstChild.data;
		    }
		}
		var links = dom.getElementsByTagName('links');
		for(var i=0;i<links.length;i++) {
		    if( links[i].getAttribute('resource') == 'GMAPS' ) gmap = links[i].firstChild.data;
		    if( links[i].getAttribute('resource') == 'URMAP' ) urmap = (links[i].firstChild) ? links[i].firstChild.data : '';
		}

		photos[id].x = x;
		photos[id].y = y;
		photos[id].datum = 'TWD97';
		locatePhoto(id,lat_dd,lon_dd);
	    }
	});

    }

    var getLatLon = function(id) {

	var callback = function(result) {
	    hideLoadingMessage();
	    var parser = new w.DOMParser();
	    var dom = parser.parseFromString(result.responseText, "application/xml");
	    var pid = dom.getElementsByTagName('photo').item(0).getAttribute('id');

	    if(!photos[pid]) photos[pid] = new Object();
	    photos[pid].id = id;
	    photos[pid].lat = -1;
	    photos[pid].lon = -1;
	    photos[pid].owner = dom.getElementsByTagName('owner').item(0).getAttribute('nsid');
	    photos[pid].username = dom.getElementsByTagName('owner').item(0).getAttribute('username');
	    photos[pid].secret = dom.getElementsByTagName('photo').item(0).getAttribute('secret');
	    photos[pid].server = dom.getElementsByTagName('photo').item(0).getAttribute('server');
	    photos[pid].title = (dom.getElementsByTagName('title').item(0).firstChild) ? dom.getElementsByTagName('title').item(0).firstChild.data : '';
	    photos[pid].description = (dom.getElementsByTagName('description').item(0).firstChild) ? dom.getElementsByTagName('description').item(0).firstChild.data: '';
	    photos[pid].img_s = 'http://static.flickr.com/' + photos[pid].server + '/' + pid + '_' + photos[pid].secret + '_s.jpg';
	    photos[pid].img_m = 'http://static.flickr.com/' + photos[pid].server + '/' + pid + '_' + photos[pid].secret + '_m.jpg';
	    photos[pid].url = 'http://www.flickr.com/photos/' + photos[pid].owner + '/' + pid + '/';

	    var tags = dom.getElementsByTagName('tag');
	    for(var i=0; i<tags.length; i++) {
		var splits = tags[i].getAttribute('raw').split('=');
		if( splits[0] == 'geo:lat' ) { var lat = convCoords(splits[1]); var tag_lat = tags[i].getAttribute('id'); }
		if( splits[0] == 'geo:lon' || splits[0] == 'geo:long' ) { var lon = convCoords(splits[1]); var tag_lon = tags[i].getAttribute('id'); }
//		if( splits[0] == 'geo:datum' && ( splits[1] == 'TOKYO' || splits[1] == 'Tokyo' || splits[1] == 'tokyo' ) ) GMiF.datum = 'TOKYO';
	    }
	    if( lat != undefined && lon != undefined ) {
		photos[pid].tag_lat = tag_lat;
		photos[pid].tag_lon = tag_lon;
		photos[pid].lat = lat;
		photos[pid].lon = lon;
		photos[pid].twd97_lat = lat;
		photos[pid].twd97_lon = lon;
		photos[pid].datum = 'TWD97';
		locatePhoto(pid,lat,lon);
	    }
	}

	showLoadingMessage('Read photoinfo...');
	GM_xmlhttpRequest({
	    method: 'GET',
	    url: 'http://flickr.com/services/rest/?method=flickr.photos.getInfo&api_key=bc60075f4ce963fab3fac473d0741fe8&photo_id=' + id,
	    headers: {
		'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey GMap in Flickr',
		'Accept': 'application/atom+xml,application/xml,text/xml'
	    },
	    onload: callback
	});
    }

function pager(page,pages) {

    if( pages == 1 ) return '';

    var i, str='Page: ';

    if( pages > 1 && pages <= 10 ) {
        for(i=1; i<=pages; i++) {
            if( i==page ) str += '<a href="javascript:;"><font color=red><b>' + i + '</b></font></a> ';
            else str += '<a href="javascript:;" onClick="changePage('+i+')"><b>' + i + '</b></a> ';
        }
    } else if( pages>10 && page < 10 ) {
        for(i=1; i<=10; i++) {
            if( i==page ) str += '<a href="javascript:;"><font color=red><b>' + i + '</b></font></a> ';
            else str += '<a href="javascript:;" onClick="changePage(' + i + ')"><b>' + i + '</b></a> ';
        }
        i = Math.round((10+1*pages)/2);
        if( i != pages ) str += '...<a href="javascript:;" onClick="changePage(' + i + ')"><b>' + i + '</b></a>...';
        str += '<a href="javascript:;" onClick="changePage(' + pages + ')"><b>' + pages + '</b></a> ';
    } else if( pages>10 && page>=10 && page<(pages-5) ) {
        str += '<a href="javascript:;" onClick="changePage(' +1+ ')"><b>' + 1 + '</b></a>...';
        i = Math.round((page-2)/2);
        str += '<a href="javascript:;" onClick="changePage(' + i + ')"><b>' + i + '</b></a>...';
        for(i=(page-2); i<=(page+2); i++) {
            if( i==page ) str += '<a href="javascript:;"><font color=red><b>' + i + '</b></font></a> ';
            else str += '<a href="javascript:;" onClick="changePage(' + i + ') "><b>' + i + '</b></a> ';
        }
        i = Math.round((1*i+1*pages)/2);
        str += '...<a href="javascript:;" onClick="changePage(' + i + ')"><b>' + i + '</b></a> ';
        str += '...<a href="javascript:;" onClick="changePage(' + pages + ')"><b>' + pages + '</b></a> ';
    } else if( pages>10 && page>=10 & page>=(pages-5) ) {
        i = Math.round((page-2)/2);
        str += '<a href="javascript:;" onClick="changePage(' +1+ ')"><b>' + 1 + '</b></a>...';
        str += '<a href="javascript:;" onClick="changePage(' +i+ ')"><b>' + i + '</b></a>...';
        for(i=page-3; i<=pages; i++) {
            if( i==page ) str += '<a href="javascript:;"><font color=red><b>' + i + '</b></font></a> ';
            else str += '<a href="javascript:;" onClick="changePage(' + i + ')"><b>' + i + '</b></a> ';
        }
    }

    return str;
}


})();