(function () {
	var i = 0,
		clearoptionlist = function (formelm) {
			var numopt = formelm.options.length;
			
			formelm.disabled = false;
			
			for (i = (numopt - 1); i >= 1; i--) {
				formelm.options[i] = null;
			}
		},
		renderTimeSelector = function (sDate, oTime, fifteenMinuteIntervals, twentyMinuteIntervals) {
			var daysearch = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
				dayindex, timerange, count, hour, minute, newMinute,
				amOrPm, currentTime;
			
			for (i = 0; i < daysearch.length; i++) {
				if (sDate.substring(0, 3) === daysearch[i]) {
					dayindex = dayindex || i;
				}
			}
			
			if (dayindex) {
				count = 1;
				timerange = window.hoursArray[dayindex]
					.replace(/\b(\d[01]?)(:\d{2})? ?pm/ig,
						function (m, p, o, s) {
							return (parseFloat(p) + 12);
						})
					.replace(/:30/g, '.5')
					.replace(/:\d{2}/g, '')
					.match(/(\d+(\.5)?)/g);
				
				if (timerange) {
					clearoptionlist(oTime);
					
					for (i = parseFloat(timerange[0]);
						i < parseFloat(timerange[1]);
						i += 0.5) {
							hour = Math.floor((i >= 13) ? (i - 12) : i)
								.toString();
							minute = ((i % 1) === 0) ? ':00' : ':30';
							amOrPm = (i >= 12) ? 'pm' : 'am';
							currentTime = hour + minute + amOrPm;
							
							// output minute intervals indiscriminately
							// except when 20 minute minute intervals is enabled, in which case we must skip ':30'
							if (!twentyMinuteIntervals || (twentyMinuteIntervals && (minute !== ':30'))) {
								oTime.options[count++] = new Option(currentTime,
									currentTime);
							}
							
							// 15 minute intervals (only if 20 minute intervals is disabled)
							if (fifteenMinuteIntervals && !twentyMinuteIntervals) {
								newMinute = (minute === ':00') ?
									':15' :
									((minute === ':30') ?
									':45' :
									'');
								
								oTime.options[count++] = new Option(hour +
									newMinute + amOrPm, hour +
									newMinute + amOrPm);
							} else if (twentyMinuteIntervals) {
								newMinute = (minute === ':00') ?
									':20' :
									((minute === ':30') ?
									':40' :
									'');
								
								oTime.options[count++] = new Option(hour +
									newMinute + amOrPm, hour +
									newMinute + amOrPm);
							}
						}
				}
			}
		};
	
	window.renderTimeSelector = renderTimeSelector;
	window.clearoptionlist = clearoptionlist;
})();
