if (Garmin == undefined) var Garmin = {};
if (Garmin.Foto == undefined) Garmin.Foto = {};



/** Abstract base class for individual photo metadata returned from photo service.
 * @class Garmin.Photo.AbstractPhoto
 *
 * @abstract
 * @constructor 
 * @param {json} raw JSON object returned by specific photo service
 */
Garmin.Foto.AbstractPhoto = Class.create();
Garmin.Foto.AbstractPhoto.prototype = {

	initialize: function() {
		this._init.call(arguments);			
	},
	
	_init: function(json) {
       	this.json = json;
       	//this.index = index;
 	},
	
	getIcon: function() { throw new Error("AbstractPhoto.getIcon undefined"); },

	getPhotoID: function() { throw new Error("AbstractPhoto.getPhotoID undefined"); },

	getTitle: function() { throw new Error("AbstractPhoto.getTitle undefined"); },
 
	setTitle: function(title) { throw new Error("AbstractPhoto.setTitle undefined"); },
 
	photoURL: function() { throw new Error("AbstractPhoto.photoURL undefined"); },

	iconURL: function() { throw new Error("AbstractPhoto.iconURL undefined"); },

	getPhotoPageURL: function() { throw new Error("AbstractPhoto.getPhotoPageURL undefined"); },

	getLat: function() { throw new Error("AbstractPhoto.getLat undefined"); },

	getLng: function() { throw new Error("AbstractPhoto.getLng undefined"); },

	setLat: function(lat) { throw new Error("AbstractPhoto.setLat undefined"); },

	//getIndex: function() { return this.index; },

	getWidth: function() { throw new Error("AbstractPhoto.getWidth undefined"); },
 
	getHeight: function() { throw new Error("AbstractPhoto.getHeight undefined"); },
	
	scaleSize: function(scale) { return {width: Math.round(this.getWidth() * scale), height: Math.round(this.getHeight() * scale)}; },

	getOwnerName: function() { throw new Error("AbstractPhoto.getOwnerName undefined"); },
 
	getOwnerURL: function() { throw new Error("AbstractPhoto.getOwnerURL undefined"); },

	toString: function() { return "Photo "+this.getPhotoID()+" "+this.getTitle(); },
	
	properties: function(scalePhoto) {
		var photoSize = this.scaleSize( (scalePhoto || 1) );
		return $H({
			id: this.getPhotoID(), title: this.getTitle(), ownerName: this.getOwnerName(), ownerURL: this.getOwnerURL(), 
			photoURL: this.photoURL(), photoPageURL: this.getPhotoPageURL(), width: photoSize.width,  height: photoSize.height, 
			iconURL: this.iconURL(), lat: this.getLat(), lng: this.getLng()
		}); 
	}

};
