function ItineraryOverlays() {
	var ov = new OverlayCollection('itineraryOverlays', 150);
	
	//Settings
	ov.useLabels = true;
	ov.labelType = 'Numeric';
	
	ov.getIconStyle = function(placemark) {
		return 'itinerary';
	}
	
	//Show Placemarks
	ov.markPlacemarkListings = function(){
		this.unmarkPlacemarkListings();
		if(this.length > 0){
			var placemarks = this.getPage(this.currPage);
			var self = this;
			for (var i = 0; i < placemarks.length; i++)
			{
				var placemark = placemarks[i];
				html = parsePlacemarkData('<a href="#" title="View On Map"><img src="placemark:sm_iconimage" style="vertical-align:middle;margin:0 3px"></a>', placemarks[i]);
				placemarkHolder = jQuery('#itinerary .placemark_' + placemarks[i].prikey);
				placemarkHolder.html(html);
				jQuery("a", placemarkHolder).click(function(){self.execHandler("gotoplacemark",jQuery(this).data("placemark"));return false}).data("placemark",placemark);
			}
		}
	}
	
	//Clear Placemarks
	ov.unmarkPlacemarkListings = function(){
		if(this.length > 0){
			var placemarks = this.getPage(this.currPage);
			for (var i = 0; i < placemarks.length; i++)
				jQuery('#itinerary .placemark_' + placemarks[i].prikey).html("");
		}
	}
	
	//Clear Placemarks
	ov.clearListings = function() {
		jQuery(jQuery.fn.svGoogleMaps.args.iContain + ' .gContent').html('');
	}
	
	//Show Placemarks
	ov.showListings = function(){
		this.clearListings();
		var placemarks = this.getPage(this.currPage, 'showpinnedlistings');
		if (placemarks.length > 0) {
			jQuery(jQuery.fn.svGoogleMaps.args.iContain).show();
		}
		for (var i = 0; i < placemarks.length; i++){
			this.addToList(placemarks[i]);
		}
		if (!placemarks.length) jQuery(jQuery.fn.svGoogleMaps.args.iContain+' .gContent').html('You currently have no listings in your myTucson. Start planning your trip by searching the map below and clicking the "Add to myTucson" button on a listing.');
	}
	
	//Add Item to Pinned Display List
	ov.addToList = function(placemark){
		var useDiv,containerDiv,leftColumnDiv,middleColumnDiv,rightColumnDiv,currentDivs,d,columnSize,divLength;
		// size of columns (in rows)
		columnSize = 6;
		
		// main container div, parent node for the left and right columns, and initial container for up to the column size specified above
		containerDiv = jQuery(jQuery.fn.svGoogleMaps.args.iContain+' .gContent');
		// if the container div was not found, then the whole thing is going to fail
		if (!containerDiv.length) return false;
		// get the DOM object from the jquery object
		containerDiv = containerDiv.get(0);
		
		// left column div should exist if there are more items than columnSize
		leftColumnDiv = jQuery(jQuery.fn.svGoogleMaps.args.iContain+' .gContent .gItineraryColumnLeft');
		if (!leftColumnDiv.length) leftColumnDiv = null;
		else leftColumnDiv = leftColumnDiv.get(0);
		
		// middle column div should exist if left column div exists
		middleColumnDiv = jQuery(jQuery.fn.svGoogleMaps.args.iContain+' .gContent .gItineraryColumnMiddle');
		if (!middleColumnDiv.length) middleColumnDiv = null;
		else middleColumnDiv = middleColumnDiv.get(0);
		
		// right column div should exist if left column div exists
		rightColumnDiv = jQuery(jQuery.fn.svGoogleMaps.args.iContain+' .gContent .gItineraryColumnRight');
		if (!rightColumnDiv.length) rightColumnDiv = null;
		else rightColumnDiv = rightColumnDiv.get(0);
		
		// measure the actual number of items
			// right column div should always be the default if it exists
		if (rightColumnDiv) currentDivs = rightColumnDiv.getElementsByTagName('div');
			// middle column div should be the default if the right column does not yet exist
		else if (middleColumnDiv) currentDivs = middleColumnDiv.getElementsByTagName('div');
			// left column div should never be the default at this point, so this will likely never occur
		else if (leftColumnDiv) currentDivs = leftColumnDiv.getElementsByTagName('div');
			// container div is the default until the # of items > columnSize
		else currentDivs = containerDiv.getElementsByTagName('div');
		
		// if the right column has already been established, then go with that
		if (rightColumnDiv) {
			// don't let it hit 100
			if (currentDivs.length==49) return false;
			useDiv = rightColumnDiv;
			// if we've already exceeded the column size, then the items need to be divided between the two columns
			if (currentDivs.length>=columnSize && currentDivs.length==middleColumnDiv.getElementsByTagName('div').length) {
				if (middleColumnDiv.getElementsByTagName('div').length==leftColumnDiv.getElementsByTagName('div').length) {
					// add a copy of the first item in the middle column to the left column
					leftColumnDiv.appendChild(middleColumnDiv.childNodes[0].cloneNode(true));
					// remove the first item from the middle column, as it's been copied to the left column
					middleColumnDiv.removeChild(middleColumnDiv.childNodes[0]);
				}
				// add a copy of the first item in the right column to the middle column
				middleColumnDiv.appendChild(currentDivs[0].cloneNode(true));
				// remove the first item from the right column, as it's been copied to the middle column
				rightColumnDiv.removeChild(currentDivs[0]);
			}
		}
		// if the middle column has already been established and the right column does not exist, go with that
		else if (middleColumnDiv) {
			useDiv = middleColumnDiv;
			// create right column
			if (currentDivs.length==columnSize) {
				// the right column is created but nothing is added, as it will receive the new item being added with this function call
				rightColumnDiv = document.createElement('div');
				rightColumnDiv.className = 'gItineraryColumnRight';
				newLeftColumnDiv = leftColumnDiv.cloneNode(true);
				newLeftColumnDiv.style.width = '31%';
				newMiddleColumnDiv = middleColumnDiv.cloneNode(true);
				newMiddleColumnDiv.style.width = '31%';
				newMiddleColumnDiv.style.borderRight = 'solid 1px #CCC';
				containerDiv.removeChild(leftColumnDiv);
				containerDiv.removeChild(middleColumnDiv);
				containerDiv.appendChild(rightColumnDiv);
				containerDiv.appendChild(newMiddleColumnDiv);
				containerDiv.appendChild(newLeftColumnDiv);
				useDiv = rightColumnDiv;
			}
		}
		// this should never occur
		else if (leftColumnDiv) useDiv = leftColumnDiv;
		// # of items <= columnSize
		else {
			// # of items = columnSize, so the columns have to be created and populated
			if (currentDivs.length==columnSize) {
				// the middle column is created but nothing is added, as it will receive the new item being added with this function call
				middleColumnDiv = document.createElement('div');
				middleColumnDiv.className = 'gItineraryColumnMiddle';
				// the left column is created then all of the items from the container div are put into it
				leftColumnDiv = document.createElement('div');
				leftColumnDiv.className = 'gItineraryColumnLeft';
				// this must be set because currentDivs.length will change as divs are removed, so you'll get strange results on the loop
				divLength = currentDivs.length;
				for (var d=0; d<divLength; d++) {
					leftColumnDiv.appendChild(currentDivs[0].cloneNode(true));
					currentDivs[0].parentNode.removeChild(currentDivs[0]);
				}
				// append both columns to the container div. right column goes first because it floats right
				containerDiv.appendChild(middleColumnDiv);
				containerDiv.appendChild(leftColumnDiv);
				// since we're at the columnSize, right column becomes the active div where the new item will go
				useDiv = middleColumnDiv;
			}
			// # of items < columnSize
			else useDiv = containerDiv;
		}
				
		// add the new item to the active div
		d = document.createElement('div');
		d.innerHTML = parsePlacemarkData('<img src="placemark:sm_iconimage" align="left"><a href="#" onclick="javascript:jQuery.fn.svGoogleMaps.goToPlacemark(placemark:prikey); return false;">placemark:name</a>',placemark);
		useDiv.appendChild(d);
	}
	
	ov.getInfoHTML = jQuery.fn.svGoogleMaps.ov.initial.getInfoHTML;
	
	return ov;
}
