/*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 = 'Alpha';
	this.handlers = new Object();

	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 ? fn.bind(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](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){
			var m = this.findSpot(index,sortBy,this.data[i][sortBy]);
			var pt1 = new Array();
			var itemArr = [this.data[i]];
			var pt2 = new Array();
			if (m == 0){
				index = itemArr.concat(index);
			}
			else{
				pt1 = index.slice(0,m);
				if (m < index.length){
					pt2 = index.slice(m,index.length);
				}
				index = pt1.concat(itemArr,pt2);
			}
		}
		this.sortIndex = index;
		return index;
	},
	this.getToolTip = function(placemark){
		return placemark.name;
	}
	


}
