var minimap_tab = {
  description: "View This Location",
  shortDescription: "View Location",
  icon: "http://www.spatialviews.com/favicon.ico",
  scope: {
    semantic: {
      "adr" : "adr",
      "geo" : "geo"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url;
    if (semanticObjectType == "adr") {
      var adr = semanticObject;
      if (adr) {
        url = "http://maps.stcstm.org/?add=";
        if (adr["street-address"]) {
          url += " " + adr["street-address"];
        }
        if ((adr.locality) || (adr.region) || (adr["postal-code"])) {
          url += " ";
          if (adr.locality) {
            url += " " + adr.locality;
            if (adr.region) {
              url += ", ";
            } else if (adr["postal-code"]) {
              url += " ";
            }
          }
          if (adr.region) {
            url += " " + adr.region;
            if (adr["postal-code"]) {
              url += " ";
            }
          }
          if (adr["postal-code"]) {
            url += adr["postal-code"];
          }
        }
        if (adr["country-name"]) {
          url += " " + adr["country-name"];
        }
      }
    return url;

    } else if (semanticObjectType == "geo") {
      if (semanticObject.latitude && semanticObject.longitude) {
	url = "http://maps.stcstm.org/?lat=" + semanticObject.latitude + "&lng=" + semanticObject.longitude;      
      }
    }
    return url;
  }
};

SemanticActions.add("minimap_tab", minimap_tab);


var minimap_list = {
  description: "Add to Minimap Address List",
  shortDescription: "Add to Address List",
  icon: "http://www.spatialviews.com/favicon.ico",
  scope: {
    semantic: {
      "adr" : "adr",
      "geo" : "geo"
    }
  },
  doAction: function(semanticObject, semanticObjectType) {
    var url;
    if (semanticObjectType == "adr") {
      var adr = semanticObject;
      if (adr) {
        url = "";
        if (adr["street-address"]) {
          url += " " + adr["street-address"];
        }
        if ((adr.locality) || (adr.region) || (adr["postal-code"])) {
          url += " ";
          if (adr.locality) {
            url += " " + adr.locality;
            if (adr.region) {
              url += ", ";
            } else if (adr["postal-code"]) {
              url += " ";
            }
          }
          if (adr.region) {
            url += " " + adr.region;
            if (adr["postal-code"]) {
              url += " ";
            }
          }
          if (adr["postal-code"]) {
            url += adr["postal-code"];
          }
        }
        if (adr["country-name"]) {
          url += " " + adr["country-name"];
        }
      }
    gAddressB = url;
    gAddress = url;
    gTitle = 'uF adr: '+ url;
    if ($('viewminimap').getAttribute('checked') == 'true'){
	geocode();
	}
	if ($('viewminimap').getAttribute('checked') != 'true'){
	toggleSidebar('viewminimap');
    setTimeout('geocode()',2000);
	}
    } else if (semanticObjectType == "geo") {
      if (semanticObject.latitude && semanticObject.longitude) {
    var data = {};
    data.lat = semanticObject.latitude;
    data.lng = semanticObject.longitude;
    data.accuracy = '8';
    data.address = semanticObject.latitude + ","+ semanticObject.longitude;
    data.title = "uF geo: " + semanticObject.latitude + ","+ semanticObject.longitude;
    try{
    data.sourceurl = content.document.location;
    if (data.sourceurl == "about:blank")
    data.sourceurl = "";
    }
    catch(err){
	data.sourceurl = "";
    }
    data.indexlabel = addressCount()+1;
    data.indexlabel = data.indexlabel.toString();
    add_object(data); 
	if ($('viewminimap').getAttribute('checked') == 'true'){
	var scope = document.getElementById('sidebar').contentWindow;
	scope.$('flock-maps-minibrowser').contentWindow.gotoLatLng(data.lat,data.lng);
	}
	if ($('viewminimap').getAttribute('checked') != 'true'){
	toggleSidebar('viewminimap');
    datalat = data.lat;
    datalng = data.lng;
	setTimeout("pan()",2000);
	}
    return true;
      }
    } 
    return true;
  }
};

SemanticActions.add("minimap_list", minimap_list);

var datalat;
var datalng;

function pan(){
        var scope = document.getElementById('sidebar').contentWindow;
		scope.$('flock-maps-minibrowser').contentWindow.gotoLatLng(datalat,datalng)

}
// *****************global/common variables********************

//const nsIRDFRemoteDataSource        = Components.interfaces.nsIRDFRemoteDataSource;


var $ = function(x) { return  document.getElementById(x); };

function $S(aID) {
	return $("sidebar").contentDocument.getElementById(aID);
}

var XXX = function () {
    	var out = ''
	if (arguments.length > 1) {
		for (var i = 0;i < arguments.length;i++) {
			out += arguments[i] + " : ";
		}
	} 
else {
}
};



var gMapsDS = null;
var gAddress = null;
var gAddressB = null;
var gTitle = null;
var gObserver = {
    onAssert            : function(ds, source, predicate, target){

                          },
    onUnassert          : function(ds, source, predicate, target){

                          },
    onChange            : function(ds, source, predicate, oldTarget, newTarget){

                          },
    onMove              : function(ds, oldSource, newSource, predicate, target){},
    onBeginUpdateBatch  : function(ds){},
    onEndUpdateBatch    : function(ds){}
};




// ################ end of global/common variables ####################


// ##################### end of init / close code #############################

//********************** datasource code ******************************

function flock_mapsGetDS() {
  var RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService().QueryInterface(Components.interfaces.nsIRDFService);
  var dirService = Components.classes['@mozilla.org/file/directory_service;1'].getService(Components.interfaces.nsIProperties);
  var profileDir = dirService.get('ProfD', Components.interfaces.nsILocalFile);

  if(!gMapsDS) {
    // Create file object in the user's profile path.
    var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
    file.initWithPath(profileDir.path);
    file.append('flock_maps.rdf');
    if(!file.exists()) file.createUnique(0,0700);
      // Create the datasource and a sequence
      gMapsDS = new RDFDataSource('file://'+file.path);
      var root = gMapsDS.getNode("urn:flock:maps:addresses");
      root.makeSeq();
    }
  return gMapsDS;
}

function rebuild() {
  var ds = flock_mapsGetDS();
  var ui = document.getElementById('address_list');
  ui.database.AddDataSource(ds.getRawDataSource());
  ui.ref = "urn:flock:maps:addresses";
  ui.builder.rebuild();
}

function _mns(str) {
  return "http://www.flock.com/rdf/maps#" + str;
}

function addressCount(){
  var ds = flock_mapsGetDS();
  var root = ds.getNode("urn:flock:maps:addresses");
  // Just using getChildCount() doesn't work for some reason. Too bad for now.
  var cnt=0;
  var children = root.getChildren();
  while(children.hasMoreElements()){
  children.getNext();
  cnt++;
  }
  return cnt;
}



function add_object(data){
	try{
	    var ds = flock_mapsGetDS();
	    var container = ds.getNode("urn:flock:maps:addresses");
	    var date=new Date();

	    var id='obj_' + date.getTime();

	    var root = ds.getNode("urn:flock:maps:addresses");
	    var node = ds.getNode("urn:flock:maps:addresses:" + id);

  	    XXX('Node: ', node);
	    XXX('Root: ', root);

	    node.addTargetOnce(_mns('id'), "urn:flock:maps:addresses:" + id );
	    node.addTargetOnce(_mns('sourceurl'), data.sourceurl + "" );
	    node.addTargetOnce(_mns('location'), data.address + "");
	    node.addTargetOnce(_mns('indexlabel'), data.indexlabel +"");
	    node.addTargetOnce(_mns('lat'), data.lat + "" );
	    node.addTargetOnce(_mns('lng'), data.lng + "" );
	    node.addTargetOnce(_mns('title'), data.title + "" );
	    node.addTargetOnce(_mns('description'), (data.description || "") );
	    node.addTargetOnce(_mns('accuracy'), data.accuracy + "" );
	    node.addTargetOnce(_mns('country'), (data.country || "") );
	    node.addTargetOnce(_mns('state'), (data.state || "") );
	    node.addTargetOnce(_mns('county'), (data.county || "") );
	    node.addTargetOnce(_mns('locality'), (data.locality || "") );
	    node.addTargetOnce(_mns('postal'), (data.postal || "") );
	    root.addChild(node);
	    ds.save();  
	    show('urn:flock:maps:addresses:'+id);
	}
	catch(e){
		XXX('add_object error', e);
	}
}

// ####################### end of main datasource code #########



// ******************* geocode code **********************
// --------- google geocoder---------------------


function geocode() {
    var address = gAddress;
    var domain = gPrefs.getCharPref("extensions.gmaps.domain");
    req = new XMLHttpRequest ();   
    req.onreadystatechange = getMapsResponse; 
    req.open("GET","http://"+domain+"/maps/geo?q="+address+"&output=json&key=ABQIAAAAYgWXR5db6m93gnVrMsuXtxQncSHX4Q3-Ab3FozCaoQoCHwys1RTHg7pQTMlWwiL_zaU6tQ386P4zMw",true);
    req.send(null);
}

function getMapsResponse(){
  if (req.readyState == 4) { 
    if (req.status == 200) 
    { 
    var results = eval("(" + req.responseText + ")");
    var code = results.Status.code;
    if (code == "200"){
    if (results.Placemark.length == 1){
    var placemark = results.Placemark[0];
    var lat = placemark.Point.coordinates[1];
    var lng = placemark.Point.coordinates[0];
    var altd = placemark.Point.coordinates[2];
    var accuracy = placemark.AddressDetails.Accuracy;
    try{var country = placemark.AddressDetails.Country.CountryNameCode;}catch(e){var country = '';};
    try{var state = placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;}catch(e){var state = '';};
    try{var county = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;}catch(e){var county = '';};
    try{var locality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;}catch(e){var locality = '';};
    try{var postal = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;}catch(e){var postal = '';}
    try{var street = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;}catch(e){var street = '';};
    var data = {};
    data.lat = lat;
    data.lng = lng;
    data.accuracy = accuracy;
    data.address = gAddressB;
    data.title = gTitle;
    data.country = country;
    data.state = state;
    data.county = county;
    data.locality = locality;
    data.postal = postal;
    data.altd = altd;
    data.street = street;
    try{
    data.sourceurl = content.document.location;
    if (data.sourceurl == "about:blank")
    data.sourceurl = "";
    }
    catch(err){
	data.sourceurl = "";
    }
    data.indexlabel = addressCount()+1;
    data.indexlabel = data.indexlabel.toString();
    add_object(data); 
    gLat = lat;
    gLng = lng;

    setTimeout('testForContextLoad()',100)
    } // end one result if
    else{
	    var geoList = $S('multiaddress-list');
	    geoList.setAttribute('hidden',false);
	    var mapDeck = $S('maps-deck');
	    mapDeck.setAttribute('hidden',true);
    for (var i = 0; i <= results.Placemark.length - 1; i++){
    var placemark = results.Placemark[i];
    var lat = placemark.Point.coordinates[1];
    var lng = placemark.Point.coordinates[0];
    var altd = placemark.Point.coordinates[2];
    var accuracy = placemark.AddressDetails.Accuracy;
    try{var country = placemark.AddressDetails.Country.CountryNameCode;}catch(e){var country = '';};
    try{var state = placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;}catch(e){var state = '';};
    try{var county = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;}catch(e){var county = '';};
    try{var locality = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;}catch(e){var locality = '';};
    try{var postal = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;}catch(e){var postal = '';};
    try{var street = placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;}catch(e){var street = '';};
    var structAdd = placemark.address;
    try{
    var url = content.document.location;
    if (url == "about:blank")
    url = "";
    }
    catch(err){
	url = "";
    }

    var coords = lat + ',' + lng;
    var listitem = document.createElement('listitem');
    listitem.setAttribute('label',structAdd);
    listitem.setAttribute('value',coords);
    listitem.setAttribute('title',structAdd);
    listitem.setAttribute('accuracy',accuracy);
    listitem.setAttribute('description','');
    listitem.setAttribute('url',url);
    listitem.setAttribute('country',country);
    listitem.setAttribute('state',state);
    listitem.setAttribute('county',county);
    listitem.setAttribute('locality',locality);
    listitem.setAttribute('postal',postal);
    listitem.setAttribute('street',street);
    listitem.setAttribute('altd',altd);
    geoList.appendChild(listitem);
    } // for
    } // end more than one else
    } // end code 200
    if (code != "200"){ 
    pipesGeocode();
    }
   } 
  } 
}

// -------------- pipes json geocoder --------------------

function pipesGeocode(){
  var address = gAddress;
  req = new XMLHttpRequest ();
  req.onreadystatechange = getaddressPipesResponse;
  req.open("GET","http://pipes.yahoo.com/pipes/pipe.run?_id=qudHFl3z2xGTWsmGnkartA&_render=json&_run=1&location="+address,true);
  req.send(null);
}

function getaddressPipesResponse(){
 if (req.readyState == 4) {
  if (req.status == 200)
  {
    var results = eval("(" + req.responseText + ")");
    var resultset = results.value.items[0];
    var lat = resultset.lat; //eg returns "56.575849"
    var lng = resultset.lon; //eg returns "-3.231635"
    var accuracy = resultset.quality; //eg returns "40"
    try{var country = resultset.country;}catch(e){var country = '';}
    try{var state = resultset.state;}catch(e){var state = '';}
    try{var locality = resultset.city;}catch(e){var locality = '';}
    try{var postal = resultset.postal;}catch(e){var postal = '';}
    try{var street = resultset.street;}catch(e){var street = '';}
    if (lat != ''){
        var data = {};
    data.lat = lat;
    data.lng = lng;
    data.accuracy = accuracy;
    data.address = gAddressB;
    data.title = gTitle;
    data.country = country;
    data.state = state;
    data.locality = locality;
    data.postal = postal;
    try{
    data.sourceurl = content.document.location;
    if (data.sourceurl == "about:blank")
    data.sourceurl = "";
    }
    catch(err){
	data.sourceurl = "";
    }
    data.indexlabel = addressCount()+1;
    data.indexlabel = data.indexlabel.toString();
    add_object(data); 
    gLat = lat;
    gLng = lng;
    setTimeout('testForContextLoad()',100);
    }
  }
 }
}

function testForContextLoad(){
	try{
	var loadfuncside = document.getElementById('sidebar').contentWindow;
	var loadfunc = loadfuncside.$('flock-maps-minibrowser').contentWindow.webTestForLoad();
	if (loadfunc == 'true'){
	var lat = gLat;
	var lng = gLng;
	var scope = document.getElementById('sidebar').contentWindow;
	scope.$('flock-maps-minibrowser').contentWindow.gotoLatLng(lat,lng);
	}
	else{
    setTimeout('testForContextLoad()',100);		
	}
	}
	catch(err){
	setTimeout('testForContextLoad()',100);
	}
}


// ################### end of geocode code #####################





