//>>built

define("dojox/geo/charting/widget/Map", ["dojo/_base/kernel", "dojo/_base/lang", "dojo/_base/declare","dojo/_base/html","dojo/dom-geometry",
		"dijit/_Widget","dojox/geo/charting/Map"],
							function(dojo, lang, declare, html,domGeom, Widget, Map) {

return declare("dojox.geo.charting.widget.Map", Widget, {
	// summary:
	//		A map viewer widget based on the dojox.geo.charting.Map component
	//
	//	description:
	//		The `dojox.geo.charting.widget.Map` widget combines map display together with charting capabilities. 
	//		It encapsulates  an `dojox.geo.charting.Map` object on which most operations are delegated.
	//		Parameters can be passed as argument at construction time to specify map data file (json shape format)
	//		as well as charting data. 
	// 
	//	The parameters are :
	//	
	// * `shapeData`: The json object containing map data or the name of the file containing map data.
	// * `dataStore`: the dataStore to fetch the charting data from
	// * `dataBindingAttribute`: property name of the dataStore items to use as value for charting
	// * `markerData`: tooltips to display for map features, handled as json style.
	// * `adjustMapCenterOnResize`: if true, the center of the map remains the same when resizing the widget   
	// * `adjustMapScaleOnResize`: if true, the map scale is adjusted to leave the visible portion of the map identical as much as possible 
	//
	//	example:
	//
	// |	var map = new dojox.geo.charting.widget.Map({
	// |		shapeData : 'map.json',
	// |		adjustMapCenterOnresize : true,
	// |		adjustMapScaleOnresize : true,
	// |	});

	shapeData : "",
	dataStore : null,
	dataBindingAttribute : "",
	dataBindingValueFunction: null,
	markerData : "",
	series : "",
	adjustMapCenterOnResize: null,
	adjustMapScaleOnResize: null,
	animateOnResize: null,
	onFeatureClick: null,
	onFeatureOver: null,
	enableMouseSupport: null,
	enableTouchSupport: null,
	enableMouseZoom: null,
	enableMousePan: null,
	enableKeyboardSupport: false,
	showTooltips: false,
	enableFeatureZoom: null,
	colorAnimationDuration: 0,
	mouseClickThreshold: 2,
	_mouseInteractionSupport:null,
	_touchInteractionSupport:null,
	_keyboardInteractionSupport:null,
	constructor : function(/* Object */options, /* HtmlNode */div){
		//	summary: 
		//		Constructs a new Map widget
		this.map = null;
	},

	startup : function(){
		this.inherited(arguments);
		if (this.map) {
			this.map.fitToMapContents();
		}
		
	},

	postMixInProperties : function(){
		this.inherited(arguments);
	},

	create : function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){
		this.inherited(arguments);
	},
	
	getInnerMap: function() {
		return this.map;
	},
	

	buildRendering : function(){
		//	summary:
		//		Construct the UI for this widget, creates the underlying real dojox.geo.charting.Map object.		
		//	tags:
		//		protected
		this.inherited(arguments);
		if (this.shapeData) {
			this.map = new Map(this.domNode, this.shapeData);
			if (this.markerData && (this.markerData.length > 0))
				this.map.setMarkerData(this.markerData);
			
			if (this.dataStore) {
				if (this.dataBindingValueFunction) {
					this.map.setDataBindingValueFunction(this.dataBindingValueFunction);
				}
				this.map.setDataStore(this.dataStore,this.dataBindingAttribute);
			}
			
			if (this.series && (this.series.length > 0)) {
				this.map.addSeries(this.series);
			}
			
			if (this.onFeatureClick) {
				this.map.onFeatureClick = this.onFeatureClick;
			}
			if (this.onFeatureOver) {
				this.map.onFeatureOver = this.onFeatureOver;
			}
			if (this.enableMouseSupport) {
				
				if (!dojox.geo.charting.MouseInteractionSupport) {
					throw Error("Can't find dojox.geo.charting.MouseInteractionSupport. Didn't you forget to dojo" + ".require() it?");
				}
				var options = {};
				options.enablePan = this.enableMousePan;
				options.enableZoom = this.enableMouseZoom;
				options.mouseClickThreshold = this.mouseClickThreshold;
				this._mouseInteractionSupport = new dojox.geo.charting.MouseInteractionSupport(this.map,options);
				this._mouseInteractionSupport.connect();
			}
			
			if (this.enableTouchSupport) {
				if (!dojox.geo.charting.TouchInteractionSupport) {
					throw Error("Can't find dojox.geo.charting.TouchInteractionSupport. Didn't you forget to dojo" + ".require() it?");
				}
				this._touchInteractionSupport = new dojox.geo.charting.TouchInteractionSupport(this.map,{});
				this._touchInteractionSupport.connect(); 
			}
			if (this.enableKeyboardSupport) {
				if (!dojox.geo.charting.KeyboardInteractionSupport) {
					throw Error("Can't find dojox.geo.charting.KeyboardInteractionSupport. Didn't you forget to dojo" + ".require() it?");
				}
				this._keyboardInteractionSupport = new dojox.geo.charting.KeyboardInteractionSupport(this.map,{});
				this._keyboardInteractionSupport.connect(); 
			}
			this.map.showTooltips = this.showTooltips;
			this.map.enableFeatureZoom = this.enableFeatureZoom;
			this.map.colorAnimationDuration = this.colorAnimationDuration;
			
			
		}
	},
	

	resize : function(b){
		//	summary:
		//		Resize the widget.
		//	description:
		//		Resize the domNode and the widget to the dimensions of a box of the following form:
		//			`{ l: 50, t: 200, w: 300: h: 150 }`
		//	box:
		//		If passed, denotes the new size of the widget.

		var box;
		switch (arguments.length) {
			case 0:
				// case 0, do not resize the div, just the surface
				break;
			case 1:
				// argument, override node box
				box = lang.mixin({}, b);
				domGeom.getMarginBox(this.domNode, box);
				break;
			case 2:
				// two argument, width, height
				box = {
					w : arguments[0],
					h : arguments[1]
				};
				domGeom.getMarginBox(this.domNode, box);
				break;
		}
		
		if (this.map) {
			this.map.resize(this.adjustMapCenterOnResize,this.adjustMapScaleOnResize,this.animateOnResize);
		}
	}
});
});
