<?xml version="1.0" encoding="UTF-8"?>
<Module>
  <ModulePrefs 
    title="Flickr photos map" 
    directory_title="Flickr"
    description="Flickr map of recent photos"
    author="Kishore Senji"
    author_email="ksenji@gmail.com"
    screenshot="http://myjavaserver.com/~ksenji/flickrmap.ig.gif"
    author_location=""
    author_affiliation="none"
    title_url=""
    render_inline="optional">    
    <Locale lang="en" country="us" />
  </ModulePrefs>
  
  <UserPref name="show" display_name="Show" datatype="enum" default_value="recent">
    <EnumValue value="recent" display_value="Recent photos"/>
    <EnumValue value="interesting" display_value="Interesting photos"/>
  </UserPref>
  
  <UserPref name="count" display_name="Number of Photos" datatype="enum" default_value="15">
    <EnumValue value="5" display_value="5"/>
    <EnumValue value="10" display_value="10"/>
    <EnumValue value="15" display_value="15"/>
    <EnumValue value="25" display_value="25"/>
  </UserPref>
  
  <Content type="html">

    <![CDATA[
      <script src="http://maps.google.com/maps?file=js" type="text/javascript"></script>
      <div id="map" style="width:100%;height:300px"></div>
      <script type="text/javascript">
        
        function FlickrMapModule__MODULE_ID__(id) {
          
          var map;
          
          var prefs;
          var FLICKR_API_KEY = "67a0bdf6edc20f2cd9a922e4c1afb005";
          var FLICKR_SERVER_URL = "http://static.flickr.com/";
          var FLICKR_PHOTO_URL = "http://www.flickr.com/photos/";
          var self = this;

          var ShowEnum = {
            RECENT      : "recent",
            INTERESTING : "interesting"
          };          

          var FlickrUrlEnum = {
            RECENT : "http://www.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=" + FLICKR_API_KEY,
            INTERESTING : "http://www.flickr.com/services/rest/?method=flickr.interestingness.getList&api_key=" + FLICKR_API_KEY,
            PROFILE_INFO : "http://www.flickr.com/services/rest/?method=flickr.people.getInfo&api_key=" + FLICKR_API_KEY + "&user_id="
          };
          
          var YAHOO_GEO_SERVICE = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=flickrmap&location=";
          
          var Helper = {          
            getXmlDoc : function(xmlString) {
              // from http://developer.mozilla.org/en/docs/Migrate_apps_from_Internet_Explorer_to_Mozilla
              var myDocument;
              if (document.implementation.createDocument){
                // Mozilla, create a new DOMParser
                var parser = new DOMParser();
                myDocument = parser.parseFromString(xmlString, "text/xml");
              } else if (window.ActiveXObject){
                // Internet Explorer, create a new XML document using ActiveX
                // and use loadXML as a DOM parser.
                myDocument = new ActiveXObject("Microsoft.XMLDOM");
                myDocument.async="false";
                myDocument.loadXML(xmlString);
              }
              return myDocument;
            }   
          };
          
          /** this kind of previleged methods are OK since there is going to be only one instance of this module */
          this.load = function() {
            prefs = new _IG_Prefs(id);
            map = new GMap(_gel("map"));
            map.addControl(new GSmallMapControl());
            //map.addControl(new GMapTypeControl());
            map.centerAndZoom(new GPoint(-94.240234, 33.134557), 14);
            
            self.loadFlickrMap();
          }
          
          this.loadFlickrMap = function() {
            var show = prefs.getString("show");
            var photos = [];
            var url = (show == ShowEnum.RECENT) ? FlickrUrlEnum.RECENT : FlickrUrlEnum.INTERESTING;
            
            _IG_FetchContent(url, function(details) {
              var xmlDoc = Helper.getXmlDoc(details);
              var photoTags = xmlDoc.getElementsByTagName("photo");
              for(var i=0; i < photoTags.length; i++) {
                var photoElement = photoTags[i];
                photos.push({
                  SRC   : FLICKR_SERVER_URL + photoElement.getAttribute("server") + "/" + photoElement.getAttribute("id") + "_" + photoElement.getAttribute("secret") + "_s.jpg",
                  TITLE : photoElement.getAttribute("title"),
                  OWNER : photoElement.getAttribute("owner"),
                  URL   : FLICKR_PHOTO_URL + photoElement.getAttribute("owner") + "/" + photoElement.getAttribute("id")
                });
              }
              
              var count = prefs.getInt("count");
              var max = _min(count, photos.length);
              
              var i = 0;
              var index = 0;
              var displayOnePhoto = function () {
                if((index > max) || (i >= photos.length)) {
                  return;
                }
                var photo = photos[i];
                _IG_FetchContent(FlickrUrlEnum.PROFILE_INFO + photo.OWNER, function(details) {
                  var xmlDoc = Helper.getXmlDoc(details);
                  var locations = xmlDoc.getElementsByTagName("location");
                  var location = null;
                  if(locations.length > 0) {
                    location = locations[0].firstChild ? locations[0].firstChild.nodeValue : null;
                  }
                  if((location != null) && (_trim(location) != "")) {
                    _IG_FetchContent(YAHOO_GEO_SERVICE + location, function(details) {
                      
                      if(details != null && _trim(details) != "") {                      
                      var xmlDoc = Helper.getXmlDoc(details);                      
                      var results = xmlDoc.getElementsByTagName("Result");
                      if(results.length > 0) {
                        var result = results[0];
                        var latitude = result.getElementsByTagName("Latitude")[0].firstChild.nodeValue;
                        var longitude = result.getElementsByTagName("Longitude")[0].firstChild.nodeValue;
                        
                        var gpoint = new GPoint(longitude, latitude);
                        var icon = new GIcon();
                        icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
                        icon.shadow = "http://labs.google.com/ridefinder/images/mm_20_shadow.png";
                        icon.iconSize = new GSize(12, 20);
                        icon.shadowSize = new GSize(22, 20);
                        icon.iconAnchor = new GPoint(6, 20);
                        icon.infoWindowAnchor = new GPoint(5, 1);
                        var gmarker = new GMarker(gpoint, icon);
                         
                        GEvent.addListener(gmarker, "click", function() {                          
                          gmarker.openInfoWindowHtml("<table cellpadding=\"1\" cellspacing=\"1\"><tr><td><a href=\"" + photo.URL + "\" target=\"_blank\"><img src=\"" + photo.SRC + "\" border=\"0\"></a></td><td><span style=\"width:100px;color:#0000ff;font-size:0.7em;font-weight:bold\">" + photo.TITLE + "</span></td></tr></table>");
                        });
                        
                        map.addOverlay(gmarker);
                        }
                        index++;
                        i++;
                        displayOnePhoto();
                      }
                    });
                  } else {
                    i++;
                    displayOnePhoto();
                  }
                });
              };
              displayOnePhoto();
            });
          }
        }
        
        var flickrMapModule__MODULE_ID__ = new FlickrMapModule__MODULE_ID__(__MODULE_ID__);
        _IG_RegisterOnloadHandler(flickrMapModule__MODULE_ID__.load);
      </script>      
    ]]>
  </Content>
</Module>