var mgr;

var infoWindowOpts = {
   maxWidth : 350
}

//{guided Tour polyline managemnet
// 

MarkerManager.prototype.getPointCountFromEncoded = function(encoded)
{
	var me = this;
	var len = encoded.length;
  var index = 0;
  var count = 0;
  var array = [];
  var lat = 0;
  var lng = 0;

  while (index < len) {
    var b;
    var shift = 0;
    var result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lat += dlat;

    shift = 0;
    result = 0;
    do {
      b = encoded.charCodeAt(index++) - 63;
      result |= (b & 0x1f) << shift;
      shift += 5;
    } while (b >= 0x20);
    var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
    lng += dlng;
	
	count++;

    //array.push([lat * 1e-5, lng * 1e-5]);
  }

  return count;
}


MarkerManager.prototype.makeEncodedLevelsForXPoints = function(pointCount)
{
	var me = this;
	var encodedLevels = '';
	
	for(var i=0; i < pointCount; i++)
	{
		encodedLevels += 'B';
	}
	return encodedLevels;
}

MarkerManager.prototype.makePolylineFromEncodedPoints = function(encodedPoints)
{
	var me = this;
	var pointCount = me.getPointCountFromEncoded(encodedPoints);
	var encodedLevels = me.makeEncodedLevelsForXPoints(pointCount);
	var polyline = new google.maps.Polyline.fromEncoded({
	  color: "#195976",
	  weight: 4,
	  opacity: 0.85,
	  points: encodedPoints,
	  levels: encodedLevels,
	  zoomFactor: 32,
	  numLevels: 4
	});
	
	return polyline;
}

MarkerManager.prototype.processEncodedPolyline = function(encodedPoints, category)
{
	var me = this;
	var polyline = me.makePolylineFromEncodedPoints(encodedPoints);

	if(polyline)
	{
		polyline.setCategory(category);
		me.addPolylineOverlay_(polyline);
		me.polylines.push(polyline);
	}
	
	//
}

google.maps.Polyline.prototype.setCategory = function(category)
{
	//this is meta info for managing visibility based on categories
	var me = this;
	me.category = category;
};

google.maps.Polyline.prototype.getCategory = function()
{
	var me = this;
	return me.category;
};

MarkerManager.prototype.getPolylineCategory = function(polyline)
{
	var me = this;
	return polyline.getCategory();
};

//} polyline


google.maps.Marker.prototype.setCategory = function(category)
{
	//this is meta info for managing visibility based on categories
	var me = this;
	me.category = category;
};

google.maps.Marker.prototype.getCategory = function()
{
	var me = this;
	return me.category;
};

google.maps.Marker.prototype.setMarkerId = function(markerId)
{
	//this is meta info for managing visibility based on categories
	var me = this;
	me.markerId = markerId;
};

google.maps.Marker.prototype.getMarkerId = function()
{
	var me = this;
	return me.markerId;
};

google.maps.Marker.prototype.setExtInfoHTML = function(extInfoHTML)
{
   var me = this;
   me.extInfoHTML = extInfoHTML;
};

google.maps.Marker.prototype.getExtInfoHTML = function()
{
   var me = this;
   return me.extInfoHTML;
};

google.maps.Marker.prototype.setStartDate = function(startDate)
{
	var me = this;
	me.startDate = startDate;
}

google.maps.Marker.prototype.getStartDate = function()
{
	var me = this;
	if(me.startDate != undefined)
	{
		return me.startDate;
	} else
	{
		return 0;
	}
}

google.maps.Marker.prototype.setEndDate = function(endDate)
{
	var me = this;
	me.endDate = endDate;
}

google.maps.Marker.prototype.getEndDate = function()
{
	var me = this;
	if(me.endDate != undefined)
	{
		return me.endDate;
	} else
	{
		return 0;
	}
}


MarkerManager.prototype.getMarkerCategory = function(marker)
{
	var me = this;
	return marker.getCategory();
};

MarkerManager.prototype.getMarkerStartDate = function(marker)
{
	var me = this;
	return marker.getStartDate();
};

MarkerManager.prototype.getMarkerEndDate = function(marker)
{
	var me = this;
	return marker.getEndDate();
};

MarkerManager.prototype.isMarkerInDateRange = function(marker)
{
	var me = this;
	var markerStartDate = me.getMarkerStartDate(marker);
   var startDate = me.dateRangeStart;
   var endDate = me.dateRangeEnd;
	
	if(markerStartDate)
	{
		var markerEndDate = marker.getEndDate();
		if(markerEndDate)
		{
			if(markerStartDate.getTime() > startDate.getTime() && markerEndDate.getTime() < endDate.getTime() )
			{
				return true;
			} else
         {
            return false;
         }
		}
	}
	
	return true;
};

MarkerManager.prototype.setDateRangeStart = function(startDate)
{
   var me = this;
   me.dateRangeStart = startDate;
}

MarkerManager.prototype.setDateRangeEnd = function(endDate)
{
   var me = this;
   me.dateRangeEnd = endDate;
}

MarkerManager.prototype.isMarkerStartDateInDateRange = function(marker)
{
	var me = this;
	var markerStartDate = me.getMarkerStartDate(marker);
   var startDate = me.dateRangeStart;
   var endDate = me.dateRangeEnd;
	
	if(markerStartDate)
	{
		if(markerStartDate.getTime() > startDate.getTime() && markerStartDate.getTime() < endDate.getTime() )
		{
			return true;
		} else
      {
         return false;
      }
	}
	
	return true;
};


Array.prototype.index = function(val) {
  for(var i = 0, l = this.length; i < l; i++) {
    if(this[i] == val) return i;
  }
  return null;
}

Array.prototype.include = function(val) {
  return this.index(val) !== null;
}

MarkerManager.prototype.processWholeGrid_ = function(markerFunction, thatEquals, callback)
{
var grid = this.grid_;
	if(grid){
		for(var zoom = grid.length - 1; zoom >= 0; zoom--)
		{
			zoomLevel = grid[zoom];
			if(zoomLevel)
			{
				for(var gridXIter = zoomLevel.length - 1; gridXIter >= 0; gridXIter--)
				{
					gridX = zoomLevel[gridXIter];
					if(gridX)
					{
						for(var gridYIter = gridX.length - 1; gridYIter >= 0; gridYIter--)
						{
							gridY = gridX[gridYIter];
							if(gridY)
							{
								for(var markerIter = gridY.length - 1; markerIter >= 0; markerIter--)
								{
									marker = gridY[markerIter];
									if(markerFunction(marker) == thatEquals)
									{
										callback(marker);
									}
								}
							}
						}
					}
				}
			}
		}
	}
};


//theEvaluator must process evaluate the response of markerFunction and return a true or false
MarkerManager.prototype.processWholeGridEvalFunction_ = function(markerFunction, theEvaluator, callback)
{
var grid = this.grid_;
	if(grid){
		for(var zoom = grid.length - 1; zoom >= 0; zoom--)
		{
			zoomLevel = grid[zoom];
			if(zoomLevel)
			{
				for(var gridXIter = zoomLevel.length - 1; gridXIter >= 0; gridXIter--)
				{
					gridX = zoomLevel[gridXIter];
					if(gridX)
					{
						for(var gridYIter = gridX.length - 1; gridYIter >= 0; gridYIter--)
						{
							gridY = gridX[gridYIter];
							if(gridY)
							{
								for(var markerIter = gridY.length - 1; markerIter >= 0; markerIter--)
								{
									marker = gridY[markerIter];
									if(theEvaluator(markerFunction(marker)))
									{
										callback(marker);
									}
								}
							}
						}
					}
				}
			}
		}
	}
};


MarkerManager.prototype.processAllMatching_ = function(bounds, markerFunction, thatEquals, callback) {
	//document.getElementById('field2').value = "removing... ";
  for (var x = bounds.minX; x <= bounds.maxX; x++) {
    for (var y = bounds.minY; y <= bounds.maxY; y++) {
		//document.getElementById('field2').value = document.getElementById('field2').value + ', ' + y;
      this.processCellMarkersMatching_(x, y,  bounds.z, markerFunction, thatEquals, callback);
    }
  }
};

MarkerManager.prototype.processAllMatchingPolylines_ = function(polylineFunction, thatEquals, callback)
{
	var me = this;
	var polylines = me.polylines;
	for (var i = 0; i < polylines.length; i++)
	{
		if(polylines[i])
		{
			var result = polylineFunction(polylines[i]);
			if(result == thatEquals)
			{
				i += callback(polylines[i]);
			}
		}
	}
}


MarkerManager.prototype.processCellMarkersMatching_ = function(x, y, z, markerFunction, thatEquals, callback) {
  var cell = this.getGridCellNoCreate_(x, y, z);
  if (cell) {
    for (var i = cell.length - 1; i >= 0; i--) {
		if(markerFunction(cell[i]) == thatEquals)
		{
			callback(cell[i]);
		}
    }
  }
};

MarkerManager.prototype.isThisCategoryLoaded = function(category)
{
	var me = this;
	var test = me.categories.include(category);
	return test;
};


function loadCustomIcons() {
	//var customIcons = [];
	google.maps.DownloadUrl("nekmapGenIconXml2.php", function(data) {
      var xml = google.maps.Xml.parse(data);
      var customIconsXML = xml.documentElement.getElementsByTagName("customIcon");
	  var currentCategoryID;
      for (var i = 0; i < customIconsXML.length; i++) {
		var theIcon = new google.maps.Icon();
		theIcon.image = 'images/markers/' + customIconsXML[i].getAttribute("icon") + '.png';
		theIcon.transparent = 'images/markers/icon_transp.png';
      theIcon.shadow = 'images/markers/flag-shadow.png';
		theIcon.iconSize = new google.maps.Size(20, 27);
		theIcon.shadowSize = new google.maps.Size(32, 32);
		theIcon.iconAnchor = new google.maps.Point(6, 20);
		theIcon.infoWindowAnchor = new google.maps.Point(5, 1);
		currentCategoryID = customIconsXML[i].getAttribute("catid");
		customIcons[currentCategoryID] = theIcon;
      }
      onLoadCustomIcons();
    });
	//return customIcons;
}

function createMarker(point, name, address, urlstring, type) {
  var marker = new google.maps.Marker(point, customIcons[type]);
  var html = "";
  google.maps.Event.addListener(marker, 'click', function() {
    marker.openInfoWindowHtml(html, infoWindowOpts);
  });
  return marker;
}

var runTestMarkerLoad = function()
{
	addMarkersToManager(mgr, "56");
}

var showSearchFrame = function()
{
   jQuery("#searchFrame").show("fast", toggleFrameButton);
};


MarkerManager.prototype.addMarkers = function(dmarkers)
{
   var me = this;
   var dminZoom = 9;
   //document.getElementById('field2').value = "loading... ";
	for (var i = 0; i < dmarkers.length; i++) {
	    var name = dmarkers[i].getAttribute("name");
	    var address = dmarkers[i].getAttribute("address");
	    var urlstring = dmarkers[i].getAttribute("urlstring");
	    var type = dmarkers[i].getAttribute("category");
	    var polyPointsEncoded = dmarkers[i].getAttribute("polyline");
       var descShort = dmarkers[i].getAttribute("descshort");
       var phone = dmarkers[i].getAttribute("phone");
       var thumbnail = dmarkers[i].getAttribute("thumbnail");
       var old_thumbnail = dmarkers[i].getAttribute("old_thumbnail");
       var city = dmarkers[i].getAttribute("city");
       var markerId = dmarkers[i].getAttribute("id");
	    var point = new google.maps.LatLng(parseFloat(dmarkers[i].getAttribute("lat")),
	    						parseFloat(dmarkers[i].getAttribute("lng")));
	      
	    var dmarker = createMarker(point, name, address, urlstring, type);
	    dmarker.setCategory(type);
       dmarker.setMarkerId(markerId);
	    
	    if(polyPointsEncoded != '')
	    {
	    	me.processEncodedPolyline(polyPointsEncoded, type);
	    }
       
       
       var detailsA = '<a href="listing_detail.php?id='+ markerId+ '">';
       
       var imageHTML = '';
       if(thumbnail != '')
       {
         imageHTML = detailsA + '<img src="listings_images/thumbs/'+thumbnail+'" border="0" style="float:left;margin:4px;" class="markerInfoThumb"/>' +'</a>';
       }
	   else if(old_thumbnail != '')
       {
         imageHTML = detailsA + '<img src="http://www.travelthekingdom.com/img/'+old_thumbnail+'" border="0" style="float:left;margin:4px;" class="markerInfoThumb"/>' +'</a>';
       }
       
       var decscriptionHTML = '';
       if(descShort != '')
       {
          decscriptionHTML = ''+descShort+'<br />';
       }
       
       var cityHTML = '';
       if(city != '')
       {
          cityHTML = ''+city+'<br />';
       }
       
       var phoneHTML = '';
       if(phone != '')
       {
          phoneHTML += '<b>Phone: </b>' + phone + '<br />';
       }
       
       var infoWindowHtml = '<div class="infoWindowContents"><span class="WindowContentsTitle">'+
          detailsA + name +'</a></span><br />'+
          imageHTML +
          address +'<br />' +
          cityHTML + 
          phoneHTML +
          decscriptionHTML +
          detailsA + '<b>more details</b></a><br /></div>';
       
       dmarker.bindInfoWindowHtml(infoWindowHtml);
       //dmarker.infoWindowHtml = infoWindowHtml;
       
       me.lastLoadedMarkerInfoHtml = infoWindowHtml;
       me.lastLoadedMarker = dmarker;
	    me.addMarker(dmarker, dminZoom);
	}
	me.categorysMarkerCount.push(dmarkers.length);
}

// add an individual Marker to the map
MarkerManager.prototype.addMarkerToManager = function(markerId)
{
   var me = this;
   var singleMarker;
   me.addIdToExceptionList(markerId);
   google.maps.DownloadUrl("getMarker.php?markerid="+markerId, function(data)
      {
         var xml = google.maps.Xml.parse(data);
         var dmarkers = xml.documentElement.getElementsByTagName("marker");
         me.addMarkers(dmarkers);
         
         if(me.lastLoadedMarker != undefined)
         {
            var marker = me.lastLoadedMarker;
            if(me.lastLoadedMarkerChangedHandle != undefined)
            {
               google.maps.Event.removeListener(me.lastLoadedMarkerChangedHandle);
               me.lastLoadedMarkerChangedHandle = null;
            }
            
            me.lastLoadedMarkerChangedHandle = google.maps.Event.bind(me, "changed", me, me.displayInfoWindowLastLoaded_);
            me.map_.panTo(marker.getLatLng());
            if(marker.isHidden == false)
            {
               marker.openInfoWindowHtml(me.lastLoadedMarkerInfoHtml, infoWindowOpts);
            }
         }
      });
   
};

// after panTo in addMarkerToManager, the changed event will trigger on this marker
// this then, displays the info window and removes the event handler
MarkerManager.prototype.displayInfoWindowLastLoaded = function()
{
   var me = this;
   var marker = me.lastLoadedMarker;
   marker.openInfoWindowHtml(me.lastLoadedMarkerInfoHtml, infoWindowOpts);
   google.maps.Event.removeListener(me.lastLoadedMarkerChangedHandle);
   me.lastLoadedMarkerChangedHandle = null;
};

//this function does not care if the marker manager already loaded this category, so run it through mgr.addCategoryToManager
MarkerManager.prototype.addMarkersToManager = function(category)
{
	var me = this;
	google.maps.DownloadUrl("getCatIdMarkers.php?catid="+category, function(data) {
	   var xml = google.maps.Xml.parse(data);
	   var dmarkers = xml.documentElement.getElementsByTagName("marker");
	   me.addMarkers(dmarkers);
	});
	
};

var nEKPublicCalendar;
var nEKEventsQuery;
var feedUrl = "http://www.google.com/calendar/feeds/nektta@gmail.com/public/full";
var baseFeedUrl = "http://www.google.com/calendar/feeds/nektta@gmail.com/public/";

var changeEventsDateRange = function(startDate)
{
	
	// Create and set the minimum and maximum start time for the date query
	if(startDate)
	{
		var curdate = startDate;
		jQuery("#nextMonth_head").html("The Month Following: " + jQuery.datepicker.formatDate('mm-dd-yy', curdate) + " in the Northeast Kingdom" );
	} else {
		var curdate = new Date();
	}
	
	var futdate = new Date();
	var expdate = curdate.getTime();
	expdate += 3600*1000*24*30; //expires in 1 hour(milliseconds) 
	futdate.setTime(expdate);

   
   mgr.setDateRangeStart(curdate);
   mgr.setDateRangeEnd(futdate);
   mgr.reloadEvents();

};

var setupEventCategoryQuery = function(category)
{
   // Create and set the minimum and maximum start time for the date query
	
	var curdate = mgr.dateRangeStart;
	
	var futdate = mgr.dateRangeEnd;

	var startMinString = jQuery.datepicker.formatDate('yy-mm-dd', curdate) + 'T00:00:00.00-06:00';
	var startMaxString = jQuery.datepicker.formatDate('yy-mm-dd', futdate) + 'T00:00:00.00-06:00';
	
	
	var startMin = new google.gdata.DateTime.fromIso8601(startMinString);
	var startMax = new google.gdata.DateTime.fromIso8601(startMaxString);
   
	CategoryEventsQuery = new google.gdata.calendar.CalendarEventQuery(feedUrl);
   CategoryEventsQuery.setMaxResults(30);
	CategoryEventsQuery.setMinimumStartTime(startMin);
	CategoryEventsQuery.setMaximumStartTime(startMax);
   CategoryEventsQuery.setParam('extq', '[CatID:'+category+']');
	
	
	CategoryEventsQuery.setOrderBy('starttime');
	CategoryEventsQuery.setSortOrder('ascending');
	CategoryEventsQuery.setSingleEvents(true);
	
};

var handleEventError = function(e)
{
	var theError = e.cause ? e.cause.statusText : e.message;
	jQuery("#loadingIndicator").hide();
	
	jQuery("#nextMonth").html("There was an error!: " +
		theError + "<br />");
}



function setupNEKPublicCalendar()
{
	google.gdata.client.init(handleEventError)
	nEKPublicCalendar = new google.gdata.calendar.CalendarService('nektta-publicEventFeedApp-1');
	
}

function getExtendedPropertyByName(extendedPropArray,propName)
{
   for(var i = 0; i < extendedPropArray.length; i++)
   {
      if(extendedPropArray[i].getName() == propName)
      {
         return extendedPropArray[i].getValue();
      }
   }
   
   return '';
}


var handleEventsCategoryLoad = function(root)
{
   me = mgr;
	// Obtain the array of matched CalendarEventEntry
	var eventEntries = root.feed.getEntries();
   var eventsAddedCount = 0;
	
	// If there is matches for the date query
	if (eventEntries.length > 0) {
		for (var i = 0; i < eventEntries.length; i++) {
		   var event = eventEntries[i];
		   var startTime = event.getTimes()[0].startTime;
		   var endTime = event.getTimes()[0].endTime;
		   var gStartTime = google.gdata.DateTime.fromIso8601(startTime);
		   var gEndTime = google.gdata.DateTime.fromIso8601(endTime);
         var address = '';
         var lat = 0.0;
         var lng = 0.0;
         var urlstring = '';
         var itsCatID;
         
         var extendedProperties = event.getExtendedProperties();
			if(extendedProperties[0])
			{
            itsCatID = extendedProperties[0].getValue();
			} else {
            itsCatID = '';
			}
         
         
         var itsPhysicalAddress;
         itsPhysicalAddress = getExtendedPropertyByName(extendedProperties,'physicalAddress');
         
         
         var itsLat;
         itsLat = getExtendedPropertyByName(extendedProperties,'latitude');
         
         if(itsLat != '')
         {
            lat = itsLat;
         }
         
         var itsLng;
         itsLng = getExtendedPropertyByName(extendedProperties,'longitude');
			
         if(itsLng != '')
         {
            lng = itsLng;
         }
		   
		   var jStartTime = new Date();
		   var jEndTime = new Date();
		   jStartTime = gStartTime.getDate();
		   jEndTime = gEndTime.getDate()
		  
         var dminZoom = 9;
		   

         var name = event.getTitle().getText();
         
         //need to look up address, then use geocode to get the lat and lng?
         //will have to search for the url in the description
         
         var address = itsPhysicalAddress;
         var urlstring = urlstring;
         var type = itsCatID;
         //var polyline = dmarkers[i].getAttribute("polyline");
         var point = new google.maps.LatLng( parseFloat(lat), parseFloat(lng) );
         
         var dmarker = createMarker(point, name, address, urlstring, type);
         dmarker.setCategory(type);
         dmarker.setStartDate(jStartTime);
         dmarker.setEndDate(jEndTime);
         var eventDetailsHTML = creatEventDetailsHTML(event);
         dmarker.setExtInfoHTML(eventDetailsHTML);
         //dmarker.bindInfoWindowHtml(eventDetailsHTML);
         google.maps.Event.addListener(dmarker, 'click', function(){ 
            this.openExtInfoWindow(
              me.map_,
              "event_info_window",
              this.getExtInfoHTML(),
              {beakOffset: 3}
            ); 
          });
         me.addMarker(dmarker, dminZoom);

		   eventsAddedCount++;

		}
      me.categorysMarkerCount.push(eventsAddedCount);

	} else {
		// No match is found for the date query
	}
}


MarkerManager.prototype.addEventMarkersToManager = function(category)
{
   var me = this;
   setupEventCategoryQuery(category);
	nEKPublicCalendar.getEventsFeed(CategoryEventsQuery, handleEventsCategoryLoad, handleEventError);
}
  
MarkerManager.prototype.addCategoryToManager = function(category)
{
	var me = this;
	if(!me.isThisCategoryLoaded(category))
	{
		me.removeFromArray(me.categoryKillList, category);
		me.categories.push(category);
		me.addMarkersToManager(category);
		return true;
	}
	return false;
};

MarkerManager.prototype.addEventsCategoryToManager = function(category)
{
	var me = this;
	if(!me.isThisCategoryLoaded(category))
	{
		me.removeFromArray(me.categoryKillList, category);
		me.categories.push(category);
		me.addEventMarkersToManager(category);
		return true;
	}
	return false;
};


/**
 * Removes all currently displayed markers of specified category
 */
MarkerManager.prototype.clearCategoryMarkersFromMap = function(category)
{
	var me = this;
	if(me.isThisCategoryLoaded(category))
	{
		me.addCategoryToKillList(category);
		me.processAllMatching_(me.shownBounds_, me.getMarkerCategory, category, me.removeMarker_); // quickly removes shown markers
      me.processAllMatching_(me.shownBounds_, me.isMarkerStartDateInDateRange_, false, me.removeMarker_); // quickly removes shown markers
		//me.processWholeGrid_(me.getMarkerCategory, category, me.removeMarker_); // removes the rest of markers not shown
		me.processAllMatchingPolylines_(me.getPolylineCategory, category, me.removePolylineOverlay_); // quickly removes shown markers
		var categoryIndex = me.categories.index(category);
		me.removeFromArray(me.categories,category);
		me.categorysMarkerCount.splice(categoryIndex,1);
	}
};


var eventsCatIDArray = [];

function loadEventsCategoryList() {
	google.maps.DownloadUrl("nekmapCategoryList.php", function(data) {
	  var xml = google.maps.Xml.parse(data);
	  var customIconsXML = xml.documentElement.getElementsByTagName("category");
	  for (var i = 0; i < customIconsXML.length; i++) {
		  eventsCatIDArray[i] = customIconsXML[i].getAttribute("catid");
	  }
	});
}

function isNotNull(value)
{
   if(value != null)
   {
      return true;
   } else
   {
      return false;
   }
};

function isPositive(value)
{
   if(value > 0)
   {
      return true;
   } else
   {
      return false;
   }
};
      
MarkerManager.prototype.reloadEvents = function()
{
   var me = this;
   var categoryReloadList = [];
   me.processWholeGridEvalFunction_(me.getMarkerStartDate, isPositive, me.removeMarker_); // removes all events
   for( var i = 0; i < eventsCatIDArray.length; i++ )
   {
      var categoryIndex = me.categories.index(eventsCatIDArray[i]);
      if(categoryIndex != null)
      {
         categoryReloadList.push(eventsCatIDArray[i]);
         me.removeFromArray(me.categories,eventsCatIDArray[i]);
         me.categorysMarkerCount.splice(categoryIndex,1);
      }
   }
   
   for( var i = 0; i < categoryReloadList.length; i++ )
   {
      me.addEventsCategoryToManager(categoryReloadList[i]);
   }
}

// you supply the <select name="sample name"></select> around this
var makeOptionList = function(optionKeyArray, optionValueArray, inputName, domId, className, selected, containing) {
	var selectedString = selected+'';
	
	var optionString = '';
	optionString += '<select name="'+ inputName + '" class="'+ className +'" id="'+ domId +'">\n';
	optionString += '<option selected value=""></option>\n';

	
	for (var i = 0; i < optionKeyArray.length; i++) {
		 var key = optionKeyArray[i];
		 var value = optionValueArray[i];
		 var keyString = key + '';
		 
		 optionString += '\n<option class="'+ className +'" value="'+ key +'"';
		 
		 if(containing)
		 {
			 if(selectedString.match(keyString))
			 {
				 optionString += 'selected >*';
			 } else
			 {
				 optionString += '>';
			 }
		 } else
		 {
			 if(selected == key)
			 {
				 optionString += 'selected >*';
			 } else
			 {
				 optionString += '>';
			 }
		 }
		 optionString += key+': '+value+'</option>\n';
		 
	}
	optionString += '</select>\n';
	return optionString;
}


