// TODO implement _t()
var i18n = i18n || {};

jQuery.i18n.addDictionary({
	'EXPAND': "expand",
	'COLLAPSE': "collapse"
});

;(function($) {
	
	$.fn.DemandMap_CategoryControl = function(mapSelector, _options) { 
		
		var defaults = {
			'loadingIndicator': '<div class="loadingIndicator"><img src="cms/images/network-save.gif" /></div>',
			'defaultRegionZoom': 8,
			'redrawDelayMs': 750,
			'allCategoriesChecked': false
		};
		
		return this.each(function(){
			var options = $.extend({}, defaults, _options);
			
			// Reference to this control
			var $this = $(this);
			var container = this;
			
			// objects
			var $map = $(mapSelector);
			
			// state
			// avoid more than one request running at any given moment
			var ajaxManager = $.manageAjax({manageType: 'abortOld', maxReq: 0}); 
			
			// set up ui
			$('.Actions', container).hide();
			
			// event handlers
			$('form :checkbox', container).bind('click', function(e) {
				if(!Number(e.target.value)) return false;
			
				var categoryID = Number(e.target.value);
				if(e.target.checked) {
					loadCategories(categoryID);
				} else {
					e.target.checked = '';
					unloadCategories(categoryID);
				}
				
				return true;
			});

			// Update map whenever it moves
			$map.bind('DemandMap:move', function(e, bounds, zoom) {
				loadCategories(null);	
			});
			
			// add loading indicator
			$('#DemandCategoryID li', container).append(options.loadingIndicator);
			$('#DemandCategoryID li .loadingIndicator', container).hide();
			
			$('ul', container).DemandMap_collapsible();
			
			if($.jget['categories']) {
				var categories = $.jget['categories'].split(',');
				for(var i=0; i<categories.length; i++) {
					var categoryEl = $('input[title=' + categories[i] + ']', this).get(0);
					if(categoryEl) categoryEl.checked = 'checked';
				}
			} else if(options.allCategoriesChecked) {
				$(':checkbox', container).each(function(index, el) {
					this.checked = 'checked';
				});
			}
			
			// load all checked points
			loadCategories();
						
			function loadCategories(categoryID) {
				var toplevelCategoryIDs = [];
				if(categoryID && categoryID > 0) {
					toplevelCategoryIDs.push(categoryID);
				} else {
				   $('input:checked', container).each(function(index, el) {
				      toplevelCategoryIDs.push(el.value);
				   });
				}
				
				// make sure subcategories are selected
				for(var i=0; i<toplevelCategoryIDs.length; i++) {
				   var isSubcategory = $($.sprintf('input[value=%d]', toplevelCategoryIDs[i]), container).hasClass('subcategory');
					if(!isSubcategory) {
						$('#DemandCategory'+toplevelCategoryIDs[i]+' input.subcategory', container).each(function(index, el) {
							el.checked = 'checked';
						});
					}
				}
				
				var categoryIDs = getSelectedCategories();
				if(categoryIDs.length) {
					// set loading indicator
					$this.addClass('loading');
				} else {
					$this.removeClass('loading');
					
					$map.fn('clearMarkers');
					return false;
				}
				
				ajaxManager.add({
					url: getDataURL(),
					success: function(markersJson) {
					    // Get queue size
					    var i,queueSize = 0;
					    for(i=0;i<ajaxManager.queue.length;i++) if(ajaxManager.queue[i]) queueSize++;
					    
					    if(queueSize <= 1) {
            				$this.removeClass('loading');
    						$map.fn('addPoints', markersJson.items);
    						$this.trigger('DemandCategoryControl:loadcategories', [categoryIDs, markersJson.items]);
						}
					},
					dataType: 'json'
				});
			}
		
			
			function unloadCategories(categoryID) {
				if(categoryID) {
					var isSubcategory = $($.sprintf('input[value=%d]', categoryID), container).hasClass('subcategory');
					if(!isSubcategory) {
						$('#DemandCategory'+categoryID+' input.subcategory', container).each(function(index, el) {
							el.checked = '';
						});
					}
				}
				
				ajaxManager.abort();
				
				loadCategories();
			}
			
			function getDataURL() {
				var url = 'api/v1/DemandPoint.json?CategoryID=%s&Bounds[sw]=%s,%s&Bounds[ne]=%s,%s&relationdepth=0&add_fields=ParentCategoryID'; 

				var bounds = $map.fn('getQueryBounds');
				var ne = bounds.getNorthEast();
				var sw = bounds.getSouthWest();

				var categoryIDs = getSelectedCategories();
				
				// avoid returning all points when no categories are selected by forcing a pseudo categoryid
				if(!categoryIDs || !categoryIDs.length) categoryIDs = [-1];
				
				if($.jget['owneremail']) url += '&OwnerEmail=' + $.jget['owneremail'];
				if($.jget['ownerid']) url += '&OwnerID=' + Number($.jget['ownerid']);
				
				//return "api/v1/DemandPoint.json";

				var dataUrlThing = $.sprintf(url,
					categoryIDs.join(','),
					sw.lng(),
					sw.lat(),
					ne.lng(),
					ne.lat()
				);

				console.log(dataUrlThing);

				return dataUrlThing;

			}
			
			function getSelectedCategories() {
				return $.map($('input:checked', container),function(el, i) {
					return el.value;
				});
			}
			
			function _setLoading(isLoading, categoryID) {
				var el = $($.sprintf('input[value=%s]', categoryID), container)[0];
				if(isLoading) {
					//el.checked = '';
					//el.disabled = true;
					$('.loadingIndicator', el.parentNode).show();
					$(el.parentNode).addClass('loading');
				} else {
					//el.checked = 'checked';
					//el.disabled = '';
					$('.loadingIndicator', el.parentNode).hide();
					$(el.parentNode).removeClass('loading');
				}
			}
			
			function abortAjaxProcesses() {
				for(var i=0; i<_ajaxProcesses.length; i++) {
					if(typeof _ajaxProcesses[i].abort != 'undefined') _ajaxProcesses[i].abort();
					if(typeof _ajaxProcesses[i].close != 'undefined') _ajaxProcesses[i].close();
				}
				
				_ajaxProcesses = [];
			}
			
			// ######## public methods #########
			$this.fn({
				'getDataURL' : function() {
					return getDataURL();
				}
			});
		});
	}
})(jQuery);
