/*Define an overlay collection*/
function OverlayCollection(name,pagesize){
	this.data = new Object();
	this.length = 0;
	this.bounds = new GLatLngBounds();
	this.pagesize = pagesize;
	this.name = name;
	this.currPage = 1;
	this.useLabels = false;
	this.labelType = 'Numeric';//[TODO] You will have to manually update this, will refactor to run off option in the future
	this.handlers = new Object();
	var self = this;

	this.getIconStyle = function(placemark){
		return placemark.iconstyle;
	}

	this.removeHandler = function(type,fn){
		if(this.handlers[type]){
			for (var i = 0; i < this.handlers[type].length; i++){
				if(this.handlers[type][i] == fn){
					this.handlers[type].splice(i,1);
				}
			}
		}
	}

	this.addHandler = function(type,fn,bind){
		if(!this.handlers[type])
			this.handlers[type] = new Array();
		this.handlers[type].push((bind ? $.shove(fn, this) : fn));
	}
	
	this.execHandler = function(){
		var type = arguments[0];
		if(arguments.length > 1){
			var source = arguments[1];
		}
		var a = new Array();
		for (var i = 1; i < arguments.length; i++){
			a.push(arguments[i]);
		}
		if(this.handlers[type] && this.handlers[type].length){
			for (var i = 0; i < this.handlers[type].length; i++){
				this.handlers[type][i].apply(source,a);
			}
		}
	}

	this.set = function(placemark){
		var exists = this.check(placemark);
		if(!exists)
			this.length++;
		this.data[placemark.prikey] = placemark;		
		placemark.collection = this;
		return !exists;
	}
	
	this.check = function(placemark){
		if(this.data[placemark.prikey]){
			return true;
		}
		else
			return false;
	}
	
	this.clearAll = function(){
		this.data = new Object();
		this.length = 0;
		this.bounds = new GLatLngBounds();
	}
	
	this.get = function(prikey){
		return this.data[prikey];
	}
	
	this.numPages = function(){
		return Math.ceil(this.length / this.pagesize);
	}

	this.getPage = function(page){
		var oc = new OverlayCollection();
		var arr = new Array();
		var startrow = (page-1) * this.pagesize;
		var endrow = (Math.min(this.length,page * this.pagesize-1));

		var cnt = 0;
		if(!this.sortIndex){
			for(var i in this.data){
				if(cnt > endrow)
					break;
				if(cnt >= startrow)
					arr.push(this.data[i]);
				cnt++;
			}
			return arr;
		}
		else{
			return this.sortIndex.slice(startrow,endrow);
		}
	}
	
	this.clear = function(placemark){
		if(this.check(placemark)){
			this.length--;
			delete this.data[placemark.prikey];
		}
		this.calcBounds();
	}
	
	this.calcBounds = function(){
		var pm = this.getPage(this.currPage);
		this.bounds = new GLatLngBounds();
		for (var i = 0; i < pm.length; i++){
			if(pm[i].marker)
				this.bounds.extend(pm[i].marker.getPoint());
		}
		return this.bounds;
	}
	
	this.getInfoHTML = function(placemark){
		return placemark.name;
	}

	this.findSpot = function(arr,field,searchValue,low,high){
		var l = arr.length;
	
		if(typeof(low) == 'undefined')
			var low = 0;
	
		if(typeof(high) == 'undefined')
			var high = arr.length-1;
	
		if (high < low)
			return low;
		else if (high == low){
			return arr[low][field] > searchValue ? low : low+1;
		}
	
		if(arr[high][field] < searchValue)
			return high + 1;
	
		if (arr[low][field] > searchValue)
			return Math.max(low - 1,0);
	
		var i = low + Math.ceil((high-low) / 2);
	
	
		if(arr[i][field] > searchValue)
			return this.findSpot(arr,field,searchValue,low,i-1);
		else if(arr[i][field] < searchValue)
			return this.findSpot(arr,field,searchValue,i+1,high);
		else
			return i;
	}

	this.sortBy = function(sortBy){
		var index = new Array();
		
		for(var i in this.data)
			index.push(this.data[i]);
			
		index.sort(function(a,b){return a[sortBy] > b[sortBy]});
		
		this.clearAll();
		for(var i = 0; i < index.length; i++)
			this.set(index[i]);
	},
	this.getToolTip = function(placemark){
		return placemark.name;
	}
}

