//IPInfoDB jQuery JSON query example
//Tested with FF 3.5, Opera 10, Chome 5 and IE 8
//Geolocation data is stored as serialized JSON in a cookie
//Bug reports : http://forum.ipinfodb.com/viewforum.php?f=7
function geolocate(timezone, cityPrecision) {
  var key = 'b2b63e8fcfdc3a791b2889ac96d454cb83f4c7a12ede86ef0da4a7720f8a3352';
  var api = (cityPrecision) ? "ip-city" : "ip-country";
  var domain = 'api.ipinfodb.com';
  var version = 'v3';
  var url = "http://" + domain + "/" + version + "/" + api + "/?key=" + key + "&format=json" + "&callback=?";
  var geodata;
  var JSON = JSON || {};
  
  
  // implement JSON.stringify serialization
  JSON.stringify = JSON.stringify || function (obj) {
	var t = typeof (obj);
	if (t != "object" || obj === null) {
	  // simple data type
	  if (t == "string") obj = '"'+obj+'"';
		return String(obj);
	} else {
	// recurse array or object
	  var n, v, json = [], arr = (obj && obj.constructor == Array);
	  for (n in obj) {
		v = obj[n]; t = typeof(v);
		if (t == "string") v = '"'+v+'"';
		else if (t == "object" && v !== null) v = JSON.stringify(v);
		json.push((arr ? "" : '"' + n + '":') + String(v));
	  }
	  return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
	}
  };
  
  // implement JSON.parse de-serialization
  JSON.parse = JSON.parse || function (str) {
	if (str === "") str = '""';
	  eval("var p=" + str + ";");
	  return p;
  };
  
  //Check if cookie already exist. If not, query IPInfoDB
  this.checkcookie = function(callback) {
	geolocationCookie = getCookie('geolocation');
	if (!geolocationCookie) {
	  getGeolocation(callback);
	} else {
	  geodata = JSON.parse(geolocationCookie);
	  callback();
	}
  }
  
  //Return a geolocation field
  this.getField = function(field) {
	try {
	  return geodata[field];
	} catch(err) {}
  }
  
  //Request to IPInfoDB
  function getGeolocation(callback) {
	try {
	  jQuery.getJSON(url,
	  function(data){
		if (data['statusCode'] == 'OK') {
		  geodata = data;
		  JSONString = JSON.stringify(geodata);
		  setCookie('geolocation', JSONString, 365);
		  callback();
		}
	  });
	} catch(err) {}
  }

  //Set the cookie
  function setCookie(c_name, value, expire) {
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expire);
	document.cookie = c_name+ "=" +escape(value) + ((expire==null) ? "" : ";expires="+exdate.toGMTString());
  }
  
  //Get the cookie content
  function getCookie(c_name) {
	if (document.cookie.length > 0 ) {
	  c_start=document.cookie.indexOf(c_name + "=");
	  if (c_start != -1){
		c_start=c_start + c_name.length+1;
		c_end=document.cookie.indexOf(";",c_start);
		if (c_end == -1) {
		  c_end=document.cookie.length;
		}
		return unescape(document.cookie.substring(c_start,c_end));
	  }
	}
	return '';
  }
}
