UNPKG

anypicker

Version:

AnyPicker is a customizable jQuery Picker Library for Mobile OS. Create custom mobile pickers (Date, Time, Rating etc) for iOS, Android & Windows. Use pre-built pickers like Date Picker, Time Picker, Date Time Picker, etc

2,721 lines • 76.9 kB
/* ----------------------------------------------------------------------------- 

  AnyPicker - Customizable Picker for Mobile OS
  Version 2.0.9
  Copyright (c)2017 Lajpat Shah
  Contributors : https://github.com/nehakadam/AnyPicker/contributors
  Repository : https://github.com/nehakadam/AnyPicker
  Homepage : https://nehakadam.github.io/AnyPicker

 ----------------------------------------------------------------------------- */

// --------------------------------- Global Variables : AnyPicker.DateTime Start -----------------------------------

//"use strict";

$.AnyPicker = $.extend(true, $.AnyPicker, {

	defaults: // Defaults Settings
	{

		selectedDate: null,

		i18n: 
		{
			veryShortDays: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
			shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
			fullDays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
			shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
			fullMonths: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
			numbers: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
			meridiem: 
			{
				a: ["a", "p"],
				aa: ["am", "pm"],
				A: ["A", "P"],
				AA: ["AM", "PM"]
			},

			componentLabels: {
				date: "Date",
				day: "Day",
				month: "Month",
				year: "Year",
				hours: "Hours",
				minutes: "Minutes",
				seconds: "Seconds",
				meridiem: "Meridiem"
			}
		},

		inputDateTimeFormat: "",
		dateTimeFormat: "dd-MM-yyyy hh:mm AA",

		tzOffset: "",

		maxValue: null,
		minValue: null,
		maxYear: 0,
		disableValues: {},

		intervals: 
		{
			h: 1,
			m: 1,
			s: 1
		},
		roundOff: true

		//------------------ Callback Functions Start --------------------------

		//------------------ Callback Functions End ----------------------------
	},

	tempDefaults: // Plugin-level Variables required to maintain state across methods
	{
		oMinMax: {},
		oArrPDisable: {},
		sDateTimeMode: "",
		sArrDateTimeFormat: [],
		sDateTimeRegex: "",
		diffDateTimeFormats: false,
		sArrInputDateTimeFormat: [],
		sInputDateTimeRegex: "",
		sHeaderTitleType: "Static",
		sArrHeaderTitleFormat: [],
		dPrevDate: null
	},

	extra: // Common Temporary Variables
	{
		dToday: new Date(),

		iMS: 
		{ 
			m: 6E4, 
			h: 36E5, 
			d: 864E5, 
			w: 6048E5 
		},

		sFormatRegex: /(\[[^\[]*\])|(\\)?(MMMM|MMM|MM?|DDDD|DDD|DD|D|dd?|yyyy|YYYY|yy|YY|y|Y|aa?|AA?|hh?|HH?|mm?|ss?|x|X|zz?|ZZ?|.)/g,

		en: 
		{
			veryShortDays: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
			shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
			fullDays: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
			shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
			fullMonths: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
			numbers: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
			meridiem: 
			{
				a: ["a", "p"],
				aa: ["am", "pm"],
				A: ["A", "P"],
				AA: ["PM", "PM"]
			}
		},

		sArrDateComponents: 
		[
			"d", "dd", "DD", "DDD", "DDDD",
			"M", "MM", "MMM", "MMMM",
			"y", "yy", "yyyy", "Y", "YY", "YYYY",
			"h", "hh", "H", "HH",
			"m", "mm",
			"s", "ss",
			"AA", "A", "aa", "a"
		],

		sArrDateTimeModes:
		[
			"date",
			"time",
			"datetime"
		]
	}

});

// --------------------------------- Global Variables : AnyPicker.DateTime End --------------------------------------

// --------------------------------- Functions : AnyPicker.DateTime Start ------------------------------------

AnyPicker.prototype = $.extend(AnyPicker.prototype, {

	_isSupportedFormat: function(sFormat)
	{
		var apo = this;
		return (sFormat.search($.AnyPicker.extra.sFormatRegex, "") !== -1);		
	},

	/*
	
	A function to set components data of picker for a particular datetime format.
	
	*/
	__setComponentsOfDateTimePicker: function()
	{
		var apo = this;

		var iTempIndex, sFormat;

		apo.setting.components = [];
		apo.tmp.numOfComp = 0;
		apo.setting.dataSource = [];

		var bHasDateComponent = (apo.setting.dateTimeFormat.search(/D|d|M|y|Y/, "") !== -1),
		bHasTimeComponent = (apo.setting.dateTimeFormat.search(/H|h|m|s|A|a/, "") !== -1);

		apo.tmp.sDateTimeMode = (bHasDateComponent && bHasTimeComponent) ? "datetime" : (bHasDateComponent ? "date" : (bHasTimeComponent ? "time" : ""));
	
		if($.CF.isValid(apo.setting.dateTimeFormat))
		{
			if($.CF.isValid(apo.setting.inputDateTimeFormat))
			{
				apo.tmp.diffDateTimeFormats = (apo.setting.dateTimeFormat !== apo.setting.inputDateTimeFormat);
			}
			else
			{
				apo.setting.inputDateTimeFormat = apo.setting.dateTimeFormat;
				apo.tmp.diffDateTimeFormats = false;
			}
		}
		else
		{
			console.log("Invalid DateTimeFormat");
		}
	
		apo.tmp.sArrDateTimeFormat = apo._setDateTimeFormatComponentsArray(apo.setting.dateTimeFormat);
		if(apo.tmp.diffDateTimeFormats)
			apo.tmp.sArrInputDateTimeFormat = apo._setDateTimeFormatComponentsArray(apo.setting.inputDateTimeFormat);

		//----------------- Code to concatenate separators End -------------
	
		apo.tmp.sDateTimeRegex = apo._createDateTimeRegex(apo.tmp.sArrDateTimeFormat);
		if(apo.tmp.diffDateTimeFormats)
			apo.tmp.sInputDateTimeRegex = apo._createDateTimeRegex(apo.tmp.sArrInputDateTimeFormat);

		apo.setSelectedDate(apo.setting.selectedDate);
		apo.parseDisableValues();

		var bMMMMddYYYY = apo.setting.dateTimeFormat.match(/(MMMM).*(dd|d).*(yyyy|YYYY)/);
		if(apo.tmp.sArrDateTimeFormat.length > 0)
		{
			for(iTempIndex = 0; iTempIndex < apo.tmp.sArrDateTimeFormat.length; iTempIndex++)
			{
				sFormat = apo.tmp.sArrDateTimeFormat[iTempIndex];
				if(sFormat.search(/D|d|M|y|Y|H|h|m|s|A|a/, "g") !== -1)
				{
					apo._setComponentAndDataSourceForFormat(sFormat, {"MMMMddYYYY": bMMMMddYYYY});
				}
			}
		}

		if(!apo.tmp.headerTitleDefined && $.CF.compareStrings(apo.setting.mode, "datetime") && !$.CF.compareStrings(apo.setting.theme, "iOS"))
		{
			apo.setting.headerTitle.contentBehaviour = "Dynamic";
			if(apo.tmp.sDateTimeMode === "datetime")
			{
				if(apo._formatContains(apo.tmp.sArrDateTimeFormat, ["d", "M", "y|Y", "h", "m"], "and") && apo._formatContains(apo.tmp.sArrDateTimeFormat, ["a", "A"], "or"))
					apo.setting.headerTitle.format = "dd.MM.yyyy, hh:mm " + apo._getFormatForComponent("meridiem");
				else if(apo._formatContains(apo.tmp.sArrDateTimeFormat, ["d", "M", "y|Y", "H", "m"], "and"))
					apo.setting.headerTitle.format = "dd.MM.yyyy, HH:mm";
				else
					apo.setting.headerTitle.format = apo.setting.dateTimeFormat;
			}
			else if(apo.tmp.sDateTimeMode === "date")
			{
				if(apo._formatContains(apo.tmp.sArrDateTimeFormat, ["d", "M", "y|Y"], "and"))
					apo.setting.headerTitle.format = "DDD, MMM dd, yyyy";
				else
					apo.setting.headerTitle.format = apo.setting.dateTimeFormat;
			}
			else if(apo.tmp.sDateTimeMode === "time")
			{
				if(apo._formatContains(apo.tmp.sArrDateTimeFormat, ["h", "m"], "and") && apo._formatContains(apo.tmp.sArrDateTimeFormat, ["a", "A"], "or"))
					apo.setting.headerTitle.format = "hh:mm " + apo._getFormatForComponent("meridiem");
				else if(apo._formatContains(apo.tmp.sArrDateTimeFormat, ["H", "m"], "and"))
					apo.setting.headerTitle.format = "HH:mm";
				else
					apo.setting.headerTitle.format = apo.setting.dateTimeFormat;
			}
		}

		if($.CF.compareStrings(apo.setting.headerTitle.contentBehaviour, "Dynamic") && $.CF.isValid(apo.setting.headerTitle.format))
		{
			if(typeof apo.setting.headerTitle.format === "function")
				apo.tmp.sHeaderTitleType = "DynamicFunction";
			else if(typeof apo.setting.headerTitle.format === "string")
			{
				apo.tmp.sHeaderTitleType = "DynamicString";
				apo.tmp.sArrHeaderTitleFormat = apo._matchRegex($.AnyPicker.extra.sFormatRegex, apo.setting.headerTitle.format);
			}
		}
	},

	// Public Method
	setSelectedDate: function(oDate)
	{
		var apo = this;

		if($.CF.isValid(oDate))
		{
			if(typeof oDate === "string")
			{
				apo.tmp.selectedDate = apo._parseInputDateTime(oDate);
			}
			else if(Object.prototype.toString.call(oDate) === "[object Date]")
			{
				apo.setting.selectedDate = apo.formatOutputDates(oDate);
				apo.tmp.selectedDate = new Date(oDate);
			}

			if(apo.setting.inputElement !== null)
			{	
				var $oInput = $(apo.setting.inputElement);
				if(apo.tmp.oInputElemValid.bIsInput)
				{
					$oInput.val(apo.setting.selectedDate);
				}
				else
				{
					$oInput.text(apo.setting.selectedDate);
				}
			}
		}
		else
		{
			apo.tmp.selectedDate = new Date($.AnyPicker.extra.dToday);
		}
	},

	// Public Method
	setMinimumDate: function(oDate)
	{
		var apo = this;

		apo.setting.minValue = oDate;
		apo.parseDisableValues();
	},

	// Public Method
	setMaximumDate: function(oDate)
	{
		var apo = this;

		apo.setting.maxValue = oDate;
		apo.parseDisableValues();
	},

	_getFormatForComponent: function(sCompName)
	{
		var apo = this;
		for(var iTempIndex = 0; iTempIndex < apo.tmp.numOfComp; iTempIndex++)
		{
			var oComp = apo.setting.components[iTempIndex];
			if(oComp.name === sCompName)
				return oComp.format;
		}
	},

	_formatContains: function(sArrFormat, sArrComp, bLogic)
	{
		var apo = this;
		var iTempIndex1, iTempIndex2,
		bArrComp = [], bContains;

		for(iTempIndex1 = 0; iTempIndex1 < sArrComp.length; iTempIndex1++)
		{
			var sComp = sArrComp[iTempIndex1],
			bComp = false;
			for(iTempIndex2 = 0; iTempIndex2 < sArrFormat.length; iTempIndex2++)
			{
				var sFormat = sArrFormat[iTempIndex2];
				if($.CF.isValid(sFormat) && $.CF.isValid(sComp))
				{
					if(sFormat.search(new RegExp(sComp), "") !== -1)
					{
						bComp = true;
						break;
					}
				}
			}
			bArrComp.push(bComp);
		}

		if(bLogic === "and")
		{
			bContains = true;
			for(iTempIndex1 = 0; iTempIndex1 < bArrComp.length; iTempIndex1++)
			{
				if(bArrComp[iTempIndex1] !== true)
				{
					bContains = false;
					break;
				}
			}
		}
		else if(bLogic === "or")
		{
			bContains = false;
			for(iTempIndex1 = 0; iTempIndex1 < bArrComp.length; iTempIndex1++)
			{
				if(bArrComp[iTempIndex1] === true)
				{
					bContains = true;
					break;
				}
			}
		}

		return bContains;
	},

	_setComponentAndDataSourceForFormat: function(sCompFormat, sArrSpecial)
	{
		var apo = this;

		var oComp = {}, oData = {},
		bIsSupportedFormat = apo._isSupportedFormat(sCompFormat);

		if(bIsSupportedFormat)
		{
			if(sCompFormat === "d" || sCompFormat === "dd")
			{
				oComp.name = "date";
				oComp.label = apo.setting.i18n.componentLabels.date;
				oComp.type = "date";

				if($.CF.compareStrings(apo.setting.theme, "iOS"))
				{
					if(sArrSpecial.MMMMddYYYY)
					{
						oComp.width = "24%";
						oComp.textAlign = "right";
					}
				}
			}
			else if(sCompFormat === "DD" || sCompFormat === "DDD" || sCompFormat === "DDDD")
			{
				oComp.name = "day";
				oComp.label = apo.setting.i18n.componentLabels.day;
				oComp.type = "date";
			}
			else if(sCompFormat === "M" || sCompFormat === "MM" || sCompFormat === "MMM" || sCompFormat === "MMMM")
			{
				oComp.name = "month";
				oComp.label = apo.setting.i18n.componentLabels.month;
				oComp.type = "date";

				if($.CF.compareStrings(apo.setting.theme, "iOS"))
				{
					if(sArrSpecial.MMMMddYYYY)
					{
						oComp.width = "46%";
						oComp.textAlign = "left";
					}
				}
			}
			else if(sCompFormat === "y" || sCompFormat === "Y" || sCompFormat === "yyyy" || sCompFormat === "Y" || sCompFormat === "YYYY")
			{
				oComp.name = "year";
				oComp.label = apo.setting.i18n.componentLabels.year;
				oComp.type = "date";

				if($.CF.compareStrings(apo.setting.theme, "iOS"))
				{
					if(sArrSpecial.MMMMddYYYY)
					{
						oComp.width = "30%";
						oComp.textAlign = "right";
					}
				}
			}
			else if(sCompFormat === "H" || sCompFormat === "HH" || sCompFormat === "h" || sCompFormat === "hh")
			{
				oComp.name = "hours";
				oComp.label = apo.setting.i18n.componentLabels.hours;
				oComp.type = "time";
			}
			else if(sCompFormat === "m" || sCompFormat === "mm")
			{
				oComp.name = "minutes";
				oComp.label = apo.setting.i18n.componentLabels.minutes;
				oComp.type = "time";
			}
			else if(sCompFormat === "s" || sCompFormat === "ss")
			{
				oComp.name = "seconds";
				oComp.label = apo.setting.i18n.componentLabels.seconds;
				oComp.type = "time";
			}
			else if(sCompFormat === "aa" || sCompFormat === "a" || sCompFormat === "AA" || sCompFormat === "A")
			{
				oComp.name = "meridiem";
				oComp.label = apo.setting.i18n.componentLabels.meridiem;
				oComp.type = "time";
			}
			else
				console.log("Picker Component for " + sCompFormat + " can noot be added because the format you specified as  " + sCompFormat + "  cannot be parsed using this function. If you want to parse it, please add the condition in the _setComponentAndDataSourceForFormat function.");
		
			oComp.format = sCompFormat;
			oComp.component = apo.tmp.numOfComp;
			apo.setting.components.push(oComp);

			oData.component = oComp.component;
			oData.data = apo.__setDataSourceArrayForComponent(oComp.name, sCompFormat);
			apo.setting.dataSource.push(oData);
		
			apo.tmp.numOfComp++;
		}
	},

	__setDataSourceArrayForComponent: function(sCompName, sCompFormat)
	{
		var apo = this;
	
		var iChars, iTempIndex, 
		iDaysOfMonth, iStartValue, iEndValue, 
		iTotalYears, iStepYears, 
		oArrData = [], 
		oSelectedDate = apo.getDateObject(apo.tmp.selectedDate), 
		oMin = null, oMax = null;

		if($.CF.isValid(apo.tmp.oMinMax.min))
		{
			oMin = apo.getDateObject(apo.tmp.oMinMax.min);
		}
		if($.CF.isValid(apo.tmp.oMinMax.max))
		{
			oMax = apo.getDateObject(apo.tmp.oMinMax.max);
		}
	
		if(sCompName === "day")
		{
			if(sCompFormat === "DD")
			{
				for(iTempIndex = 0; iTempIndex < $.AnyPicker.extra.en.veryShortDays.length; iTempIndex++)
				{
					oArrData.push(
					{
						val: iTempIndex,
						label: apo.setting.i18n.veryShortDays[iTempIndex]
					});
				}
			}
			else if(sCompFormat === "DDD")
			{
				for(iTempIndex = 0; iTempIndex < $.AnyPicker.extra.en.shortDays.length; iTempIndex++)
				{
					oArrData.push(
					{
						val: iTempIndex,
						label: apo.setting.i18n.shortDays[iTempIndex]
					});
				}
			}
			else if(sCompFormat === "DDDD")
			{
				for(iTempIndex = 0; iTempIndex < $.AnyPicker.extra.en.fullDays.length; iTempIndex++)
				{
					oArrData.push(
					{
						val: iTempIndex,
						label: apo.setting.i18n.fullDays[iTempIndex]
					});
				}
			}
		}
		else if(sCompName === "date")
		{
			iDaysOfMonth = 31;
		
			iStartValue = 1;
			iEndValue = iDaysOfMonth;
			if($.CF.isValid(oMin) && $.CF.isValid(oMax))
			{
				if((oMin.y === oMax.y) && (oMin.M === oMax.M))
				{
					iStartValue = oMin.d;
					iEndValue = oMax.d;
				}
			}

			for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex++)
			{
				if(sCompFormat === "d")
					iChars = 0;
				else if(sCompFormat === "dd")
					iChars = 2;

				oArrData.push(
				{
					val: iTempIndex,
					label: apo.getNumberStringInFormat(iTempIndex, iChars, true)
				});
			}
		}
		else if(sCompName === "month")
		{
			iStartValue = 1;
			iEndValue = 12;
			if($.CF.isValid(oMin) && $.CF.isValid(oMax))
			{
				if(oMin.y === oMax.y)
				{
					iStartValue = oMin.M;
					iEndValue = oMax.M;

					if(sCompFormat === "M" || sCompFormat === "MM")
					{
						iStartValue++;
						iEndValue++;
					}
				}
			}

			if(sCompFormat === "M" || sCompFormat === "MM")
			{
				if(sCompFormat === "M")
					iChars = 0;
				else if(sCompFormat === "MM")
					iChars = 2;

				for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex++)
				{
					oArrData.push(
					{
						val: (iTempIndex - 1),
						label: apo.getNumberStringInFormat(iTempIndex, iChars, true)
					});
				}
			}
			else if(sCompFormat === "MMM")
			{
				for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex++)
				{
					oArrData.push(
					{
						val: (iTempIndex - 1),
						label: apo.setting.i18n.shortMonths[iTempIndex - 1]
					});
				}
			}
			else if(sCompFormat === "MMMM")
			{
				for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex++)
				{
					oArrData.push(
					{
						val: (iTempIndex - 1),
						label: apo.setting.i18n.fullMonths[iTempIndex - 1] 
					});
				}
			}
		}
		else if(sCompName === "year")
		{
			iTotalYears = (apo.setting.maxRows === 0) ? 50 : apo.setting.maxRows;
			iStepYears = Math.floor(iTotalYears / 2);
		
			if($.CF.isValid(oMin))
				iStartValue = oMin.y;
			else
				iStartValue = (iTotalYears % 2 === 0) ? (oSelectedDate.y - iStepYears - 1) : (oSelectedDate.y - iStepYears);
		
			if($.CF.isValid(oMax))
				iEndValue = oMax.y;
			else
				iEndValue = (oSelectedDate.y + iStepYears);
		
			for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex++)
			{
				oArrData.push(
				{
					val: iTempIndex,
					label: apo.getNumberStringInFormat(iTempIndex, 0, true)
				});
			}
		}
		else if(sCompName === "hours")
		{
			var iArrHourValues = [],
			iStartHour = 0;

			if(!apo.setting.roundOff)
			{
				iStartHour = oSelectedDate.H;
				while((iStartHour - apo.setting.intervals.h) >= 0)
					iStartHour -= apo.setting.intervals.h;
			}

			if(sCompFormat === "h" || sCompFormat === "hh")
			{
				iArrHourValues = [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

				iStartHour = iStartHour % 12;
				iStartHour = (iStartHour === 0) ? 12 : iStartHour;
				iStartValue = iArrHourValues.indexOf(iStartHour);
				iEndValue = 11;
			}
			else if(sCompFormat === "H" || sCompFormat === "HH")
			{
				iStartValue = iStartHour;
				iEndValue = 23;
			}

			if(sCompFormat === "h" || sCompFormat === "H")
				iChars = 0;
			else if(sCompFormat === "hh" || sCompFormat === "HH")
				iChars = 2;

			for(iTempIndex = iStartValue; iTempIndex <= iEndValue; iTempIndex = (iTempIndex + apo.setting.intervals.h))
			{
				if(sCompFormat === "h" || sCompFormat === "hh")
				{
					oArrData.push(
					{
						val: iArrHourValues[iTempIndex],
						label: apo.getNumberStringInFormat(iArrHourValues[iTempIndex], iChars, true)
					});
				}
				else if(sCompFormat === "H" || sCompFormat === "HH")
				{
					oArrData.push(
					{
						val: iTempIndex,
						label: apo.getNumberStringInFormat(iTempIndex, iChars, true)
					});
				}
			}
		}
		else if(sCompName === "minutes")
		{
			var iStartMinute = 0;
			if(!apo.setting.roundOff)
			{
				iStartMinute = oSelectedDate.m;
				while((iStartMinute - apo.setting.intervals.m) >= 0)
					iStartMinute -= apo.setting.intervals.m;
			}

			if(sCompFormat === "m")
				iChars = 0;
			else if(sCompFormat === "mm")
				iChars = 2;
		
			for(iTempIndex = iStartMinute; iTempIndex < 60; iTempIndex = (iTempIndex + apo.setting.intervals.m))
			{
				oArrData.push(
				{
					val: iTempIndex,
					label: apo.getNumberStringInFormat(iTempIndex, iChars, true) 
				});
			}
		}
		else if(sCompName === "seconds")
		{
			var iStartSeconds = 0;
			if(!apo.setting.roundOff)
			{
				iStartSeconds = oSelectedDate.s;
				while((iStartSeconds - apo.setting.intervals.s) >= 0)
					iStartSeconds -= apo.setting.intervals.s;
			}

			if(sCompFormat === "s")
				iChars = 0;
			else if(sCompFormat === "ss")
				iChars = 2;
		
			for(iTempIndex = iStartSeconds; iTempIndex < 60; iTempIndex = (iTempIndex + apo.setting.intervals.s))
			{
				oArrData.push(
				{
					val: iTempIndex,
					label: apo.getNumberStringInFormat(iTempIndex, iChars, true)
				});
			}
		}
		else if(sCompName === "meridiem")
		{
			for(iTempIndex = 0; iTempIndex < 2; iTempIndex++)
			{
				oArrData.push(
				{
					val: iTempIndex,
					label: apo.setting.i18n.meridiem[sCompFormat][iTempIndex]
				});
			}
		}

		return oArrData;
	},

	_setDateTimeFormatComponentsArray: function(sDateTimeFormat)
	{
		var apo = this;
		var sArrDateTimeFormat = apo._matchRegex($.AnyPicker.extra.sFormatRegex, sDateTimeFormat);
	
		//----------------- Code to concatenate separators Start -------------------
		var iTempIndex, sPrevFormat = "", sArrTempFormat = [];
		for(iTempIndex = 0; iTempIndex < sArrDateTimeFormat.length; iTempIndex++)
		{
			var sTempFormat = sArrDateTimeFormat[iTempIndex];
			if(sTempFormat.match(/[a-zA-Z0-9]/))
			{
				if(sPrevFormat !== "")
				{
					sArrTempFormat.push(sPrevFormat);
					sPrevFormat = "";
				}
				sArrTempFormat.push(sTempFormat);
			}
			else
				sPrevFormat += sTempFormat;
		}
		if(sPrevFormat !== "")
		{
			sArrTempFormat.push(sPrevFormat);
			sPrevFormat = "";
		}
		return sArrTempFormat;
	},

	_createDateTimeRegex: function(sArrDateTimeFormat)
	{
		var apo = this;
		var iTempIndex, sFormat,
		sInRegex = "", sOutRegex = "",
		sRegexStart = "(\\[[^\\[]*\\])|(\\\\)?",
		sRegexEnd = "|.",
		sDateTimeRegex;

		sInRegex += sRegexStart;
		for(iTempIndex = 0; iTempIndex < sArrDateTimeFormat.length; iTempIndex++)
		{
			sFormat = sArrDateTimeFormat[iTempIndex];
			sInRegex = apo._getRegexComponentForFormat(sInRegex, sFormat);
		}
		sInRegex += sRegexEnd;
		sDateTimeRegex = new RegExp(sInRegex, "g");
		return sDateTimeRegex;
	},

	_getRegexComponentForFormat: function(sInRegex, sFormat)
	{
		var apo = this;

		//removed code with \b, because it was causing RegExp matching to break while using Unicode Characters. as \b and \w enforce restriction on characters be a subset of [A-Z,a-z,0-9]

		if(sFormat === "d" || sFormat === "dd")
		{
			sInRegex += "(\\d{1,2})";
		}
		else if(sFormat === "DD")
		{	
			/*
			sInRegex += "(\\b";
			sInRegex += apo.setting.i18n.veryShortDays.join("\\b|\\b");
			sInRegex += "\\b)";
			*/
			sInRegex += "(";
			sInRegex += apo.setting.i18n.veryShortDays.join("|");
			sInRegex += ")";
		}
		else if(sFormat === "DDD")
		{
			sInRegex += "(";
			sInRegex += apo.setting.i18n.shortDays.join("|");
			sInRegex += ")";
		}
		else if(sFormat === "DDDD")
		{
			sInRegex += "(";
			sInRegex += apo.setting.i18n.fullDays.join("|");
			sInRegex += ")";
		}
		else if(sFormat === "M" || sFormat === "MM")
		{
			sInRegex += "(\\d{1,2})";
		}
		else if(sFormat === "MMM")
		{
			sInRegex += "(";
			sInRegex += apo.setting.i18n.shortMonths.join("|");
			sInRegex += ")";
		}
		else if(sFormat === "MMMM")
		{
			/*
			sInRegex += "(\\b";
			sInRegex += apo.setting.i18n.fullMonths.join("\\b|\\b");
			sInRegex += "\\b)";
			*/
			sInRegex += "(";
			sInRegex += apo.setting.i18n.fullMonths.join("|");
			sInRegex += ")";
		}
		else if($.CF.compareStrings(sFormat, "y") || $.CF.compareStrings(sFormat, "yyyy"))
		{
			sInRegex += "(\\d{1,4})";
		}
		else if($.CF.compareStrings(sFormat, "yy"))
		{
			sInRegex += "(\\d{2})";
		}
		else if($.CF.compareStrings(sFormat, "h") || $.CF.compareStrings(sFormat, "hh"))
		{
			sInRegex += "(\\d{1,2})";
		}
		else if(sFormat === "m" || sFormat === "mm")
		{
			sInRegex += "(\\d{1,2})";
		}
		else if(sFormat === "s" || sFormat === "ss")
		{
			sInRegex += "(\\d{1,2})";
		}
		else if(sFormat === "a" || sFormat === "aa" || sFormat === "A" || sFormat === "AA")
		{
			sInRegex += "(";

			if(sFormat === "a")
				sInRegex += apo.setting.i18n.meridiem.a.join("|");
			else if(sFormat === "aa")
				sInRegex += apo.setting.i18n.meridiem.aa.join("|");
			else if(sFormat === "A")
				sInRegex += apo.setting.i18n.meridiem.A.join("|");
			else if(sFormat === "AA")
				sInRegex += apo.setting.i18n.meridiem.AA.join("|");

			sInRegex += ")";
		}
		else if(sFormat === "/" || sFormat === "-" || sFormat === "." || sFormat === " " || sFormat === ":" || sFormat === ",")
		{
			//sInRegex += "(\\b" +sFormat + "\\b)";
			sInRegex += "(/|-|.| |:|,)";
		}
		else
		{
			//sInRegex += "(\\b" +sFormat + "\\b)";
			sInRegex += "(" + sFormat + ")";
		}

		return sInRegex;
	},

	_matchRegex: function(sRegex, sString)
	{
		var apo = this;
		var sArrOut = [], sArrString = [];
	
		while((sArrString = sRegex.exec(sString)) !== null) 
		{
			for(var iTempIndex = 3; iTempIndex < sArrString.length; iTempIndex++)
    		{
    			sArrOut.push(sArrString[iTempIndex]);
    		}
    		if(sArrString.index === sRegex.lastIndex) 
    		{
        		sRegex.lastIndex++;
    		}
		}

		return sArrOut;
	},

	_parseInputDateTime: function(sDate)
	{
		var apo = this;
		var oThisDate = null, oDate = {},
		iTempIndex, sFormat, sDTComp,
		iArrDateTimeComps, sDateTimeRegex, iArrDateTimeFormatComps;

		if(typeof sDate === "string")
		{
			iArrDateTimeFormatComps =  apo.tmp.diffDateTimeFormats ? apo.tmp.sArrInputDateTimeFormat : apo.tmp.sArrDateTimeFormat;
			sDateTimeRegex =  apo.tmp.diffDateTimeFormats ? apo.tmp.sInputDateTimeRegex : apo.tmp.sDateTimeRegex;
			iArrDateTimeComps = apo._matchRegex(sDateTimeRegex, sDate);
		
			for(iTempIndex = 0; iTempIndex < iArrDateTimeFormatComps.length; iTempIndex++)
			{
				sFormat = iArrDateTimeFormatComps[iTempIndex];
				sDTComp = iArrDateTimeComps[iTempIndex];

				if(sFormat.search(/D|d|M|y|Y|H|h|m|s|A|a/, "") !== -1)
					oDate = apo._setInputDateTimeValue(sFormat, sDTComp, oDate);
			}

			if($.CF.isValid(oDate.h))
			{
				if(($.CF.compareStrings(oDate.me, "AM") || $.CF.compareStrings(oDate.sm, "A")) && oDate.h === 12)
					oDate.H = 0;
				else if(($.CF.compareStrings(oDate.me, "PM") || $.CF.compareStrings(oDate.sm, "P")) && oDate.h < 12)
					oDate.H = oDate.h + 12;
				else
					oDate.H = oDate.h;
			}
			
			oThisDate = apo.setDateInFormat({"iDate": oDate}, "");
		}
		else if(Object.prototype.toString.call(sDate) === "[object Date]")
		{
			oThisDate = new Date(sDate);
		}
	
		return oThisDate;
	},

	_setInputDateTimeValue: function(sDateTimeFormat, sDateTimeValue, oThisDate)
	{
		var apo = this;

		if(apo._isSupportedFormat(sDateTimeFormat))
		{
			if(sDateTimeFormat === "d" || sDateTimeFormat === "dd")
			{
				oThisDate.d = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "M" || sDateTimeFormat === "MM")
			{
				oThisDate.M = parseInt(sDateTimeValue) - 1;
			}
			else if(sDateTimeFormat === "MMM")
			{
				oThisDate.M = apo.setting.i18n.shortMonths.indexOf(sDateTimeValue);
			}
			else if(sDateTimeFormat === "MMMM")
			{
				oThisDate.M = apo.setting.i18n.fullMonths.indexOf(sDateTimeValue);
			}
			else if($.CF.compareStrings(sDateTimeFormat, "yy"))
			{
				oThisDate.y = parseInt(sDateTimeValue);

				var iMaxPrefix = (apo.setting.maxYear / 100), // first two digits of the year
				iMaxSuffix = (apo.setting.maxYear % 100); // last two digits of the year
			
				if(oThisDate.y > iMaxSuffix)
					oThisDate.y = ((iMaxPrefix - 1) * 100) + oThisDate.y;
				else
					oThisDate.y = (iMaxPrefix * 100) + oThisDate.y;
			}
			else if($.CF.compareStrings(sDateTimeFormat, "y") || $.CF.compareStrings(sDateTimeFormat, "yyyy"))
			{
				oThisDate.y = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "H" || sDateTimeFormat === "HH")
			{
				oThisDate.H = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "h" || sDateTimeFormat === "hh")
			{
				oThisDate.h = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "m" || sDateTimeFormat === "mm")
			{
				oThisDate.m = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "s" || sDateTimeFormat === "ss")
			{
				oThisDate.s = parseInt(sDateTimeValue);
			}
			else if(sDateTimeFormat === "a" || sDateTimeFormat === "A")
			{
				if($.CF.isValid(sDateTimeValue))
				{
					if(sDateTimeValue.search(/A/gi, "") !== -1)
						oThisDate.me = "A";
					else if(sDateTimeValue.search(/P/gi, "") !== -1)
						oThisDate.me = "P";
				}
			}
			else if(sDateTimeFormat === "aa" || sDateTimeFormat === "AA")
			{
				if($.CF.isValid(sDateTimeValue))
				{
					if(sDateTimeValue.search(/AM/gi, "") !== -1)
						oThisDate.me = "AM";
					else if(sDateTimeValue.search(/PM/gi, "") !== -1)
						oThisDate.me = "PM";
				}
			}
		}
	
		return oThisDate;
	},

	// Public Method
	formatOutputDates: function(dDate, oFormat)
	{
		var apo = this;
		var sOutput = "", sFormat, iTempIndex,
		sArrFormat, oDate;

		if($.CF.isValid(oFormat))
		{
			if(typeof oFormat === "string")
				sArrFormat = apo._setDateTimeFormatComponentsArray(oFormat);
			else if(typeof oFormat === "object")
				sArrFormat = oFormat;
			else
				sArrFormat = (apo.tmp.diffDateTimeFormats ? apo.tmp.sArrInputDateTimeFormat : apo.tmp.sArrDateTimeFormat);
		}
		else
			sArrFormat = (apo.tmp.diffDateTimeFormats ? apo.tmp.sArrInputDateTimeFormat : apo.tmp.sArrDateTimeFormat);

		oDate = apo.getDateObject(dDate);

		for(iTempIndex = 0; iTempIndex < sArrFormat.length; iTempIndex++)
		{
			sFormat = sArrFormat[iTempIndex];

			if(sFormat === "dd")
			{
				sOutput += apo.getNumberStringInFormat(oDate.d, 2, true);
			}
			else if(sFormat === "d")
			{
				sOutput += apo.getNumberStringInFormat(oDate.d, 0, true);
			}
			else if(sFormat === "DDDD")
			{
				sOutput += apo.setting.i18n.fullDays[oDate.D];
			}
			else if(sFormat === "DDD")
			{
				sOutput += apo.setting.i18n.shortDays[oDate.D];
			}
			else if(sFormat === "DD")
			{
				sOutput += apo.setting.i18n.veryShortDays[oDate.D];
			}
			else if(sFormat === "MMMM")
			{
				sOutput += apo.setting.i18n.fullMonths[oDate.M];
			}
			else if(sFormat === "MMM")
			{
				sOutput += apo.setting.i18n.shortMonths[oDate.M];
			}
			else if(sFormat === "MM")
			{
				sOutput += apo.getNumberStringInFormat((oDate.M + 1), 2, true);
			}
			else if(sFormat === "M")
			{
				sOutput += apo.getNumberStringInFormat((oDate.M + 1), 0, true);
			}
			else if($.CF.compareStrings(sFormat, "yyyy"))
			{
				sOutput += apo.getNumberStringInFormat(oDate.y, 4, true);
			}
			else if($.CF.compareStrings(sFormat, "yy"))
			{
				var iYear = ((Math.floor(oDate.y / 10) % 10) * 10) + (oDate.y % 10);
				sOutput += apo.getNumberStringInFormat(iYear, 2, true);
			}
			else if($.CF.compareStrings(sFormat, "y"))
			{
				sOutput += apo.getNumberStringInFormat(oDate.y, 4, true);
			}
			else if(sFormat === "hh")
			{
				sOutput += apo.getNumberStringInFormat(oDate.h, 2, true);
			}
			else if(sFormat === "h")
			{
				sOutput += apo.getNumberStringInFormat(oDate.h, 0, true);
			}
			else if(sFormat === "HH")
			{
				sOutput += apo.getNumberStringInFormat(oDate.H, 2, true);
			}
			else if(sFormat === "H")
			{
				sOutput += apo.getNumberStringInFormat(oDate.H, 0, true);
			}
			else if(sFormat === "mm")
			{
				sOutput += apo.getNumberStringInFormat(oDate.m, 2, true);
			}
			else if(sFormat === "m")
			{
				sOutput += apo.getNumberStringInFormat(oDate.m, 0, true);
			}
			else if(sFormat === "ss")
			{
				sOutput += apo.getNumberStringInFormat(oDate.s, 2, true);
			}
			else if(sFormat === "s")
			{
				sOutput += apo.getNumberStringInFormat(oDate.s, 0, true);
			}
			else if(sFormat === "aa")
			{
				sOutput += oDate.me;
			}
			else if(sFormat === "a")
			{
				sOutput += oDate.sm;
			}
			else if(sFormat === "AA")
			{
				sOutput += oDate.me.toUpperCase();
			}
			else if(sFormat === "A")
			{
				sOutput += oDate.sm.toUpperCase();
			}
			else
			{
				sOutput += sFormat;
			}
		}

		return sOutput;
	},

	// Public Method
	parseDisableValues: function()
	{
		var apo = this;
		apo.tmp.oMinMax = 
		{
			min: null,
			max: null
		};
		apo.tmp.oArrPDisable = 
		{
			day: [],
			date: [],
			time: [],
			datetime: []
		};
		var iTempIndex, iTempIndex1, iTempIndex2;

		if($.CF.isValid(apo.setting.minValue))
		{
			var dMin = apo._parseInputDateTime(apo.setting.minValue);
			if($.CF.isValid(dMin))
				apo.tmp.oMinMax.min = dMin;
		}
		if($.CF.isValid(apo.setting.maxValue))
		{
			var dMax = apo._parseInputDateTime(apo.setting.maxValue);
			if($.CF.isValid(dMax))
				apo.tmp.oMinMax.max = dMax;
		}


		var bIsOutOfBounds = false;
		if($.CF.isValid(apo.tmp.oMinMax.min) && $.CF.isValid(apo.tmp.oMinMax.max))
		{
			if(apo.tmp.sDateTimeMode === "date")
			{
				if(!(apo.compareDates(apo.tmp.selectedDate, apo.tmp.oMinMax.min) >= 1 && apo.compareDates(apo.tmp.selectedDate, apo.tmp.oMinMax.max) <= -1))
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "time")
			{
				if(!(apo.compareTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.min) >= 1 && apo.compareTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.max) <= -1))
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "datetime")
			{
				if(!(apo.compareDateTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.min) >= 1 && apo.compareDateTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.max) <= -1))
					bIsOutOfBounds = true;
			}

			if(bIsOutOfBounds)
			{
				apo.setting.selectedDate = new Date(apo.tmp.oMinMax.min);
				apo.tmp.selectedDate = new Date(apo.tmp.oMinMax.min);
			}
		}
		else if($.CF.isValid(apo.tmp.oMinMax.min))
		{
			if(apo.tmp.sDateTimeMode === "date")
			{
				if(apo.compareDates(apo.tmp.selectedDate, apo.tmp.oMinMax.min) < -1)
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "time")
			{
				if(apo.compareTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.min) < -1)
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "datetime")
			{
				if(apo.compareDateTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.min) < -1)
					bIsOutOfBounds = true;
			}

			if(bIsOutOfBounds)
			{
				apo.setting.selectedDate = new Date(apo.tmp.oMinMax.min);
				apo.tmp.selectedDate = new Date(apo.tmp.oMinMax.min);
			}
		}
		else if($.CF.isValid(apo.tmp.oMinMax.max))
		{
			if(apo.tmp.sDateTimeMode === "date")
			{
				if(apo.compareDates(apo.tmp.selectedDate, apo.tmp.oMinMax.max) > 1)
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "time")
			{
				if(apo.compareTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.max) > 1)
					bIsOutOfBounds = true;
			}
			else if(apo.tmp.sDateTimeMode === "datetime")
			{
				if(apo.compareDateTimes(apo.tmp.selectedDate, apo.tmp.oMinMax.max) > 1)
					bIsOutOfBounds = true;
			}

			if(bIsOutOfBounds)
			{
				apo.setting.selectedDate = new Date(apo.tmp.oMinMax.max);
				apo.tmp.selectedDate = new Date(apo.tmp.oMinMax.max);
			}
		}

		if(apo.tmp.sDateTimeMode === "date")
			apo.tmp.oArrPDisable.date.push(apo.tmp.oMinMax);
		else if(apo.tmp.sDateTimeMode === "time")
			apo.tmp.oArrPDisable.time.push({day: [], val: [apo.tmp.oMinMax]});
		else if(apo.tmp.sDateTimeMode === "datetime")
			apo.tmp.oArrPDisable.datetime.push(apo.tmp.oMinMax);

		if($.CF.isValid(apo.setting.disableValues))
		{
			// Parse Days
			if($.CF.isValid(apo.setting.disableValues.day) && apo.setting.disableValues.day.length > 0)
			{
				for(iTempIndex = 0; iTempIndex < apo.setting.disableValues.day.length; iTempIndex++)
				{
					if(apo.setting.disableValues.day[iTempIndex] >= 0 && apo.setting.disableValues.day[iTempIndex] <= 6)
					{
						apo.tmp.oArrPDisable.day.push(apo.setting.disableValues.day[iTempIndex]);
					}
				}
			}

			// Parse Dates
			if($.CF.isValid(apo.setting.disableValues.date) && apo.setting.disableValues.date.length > 0)
			{
				for(iTempIndex = 0; iTempIndex < apo.setting.disableValues.date.length; iTempIndex++)
				{
					var oDate = apo.setting.disableValues.date[iTempIndex],
					oOutDate = null;

					if($.CF.isValid(oDate.val))
					{
						var oDateVal = apo._parseInputDateTime(oDate.val);
						if($.CF.isValid(oDateVal))
						{
							if(oOutDate === null)
								oOutDate = {};
							oOutDate.val = oDateVal;
						}
					}
					if($.CF.isValid(oDate.start))
					{
						var oDateStart = apo._parseInputDateTime(oDate.start);
						if($.CF.isValid(oDateStart))
						{
							if(oOutDate === null)
								oOutDate = {};
							oOutDate.start = oDateStart;
						}
					}
					if($.CF.isValid(oDate.end))
					{
						var oDateEnd = apo._parseInputDateTime(oDate.end);
						if($.CF.isValid(oDateEnd))
						{
							if(oOutDate === null)
								oOutDate = {};
							oOutDate.end = oDateEnd;
						}
					}

					if($.CF.isValid(oOutDate))
						apo.tmp.oArrPDisable.date.push(oOutDate);
				}
			}

			// Parse Times
			if($.CF.isValid(apo.setting.disableValues.time) && apo.setting.disableValues.time.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.setting.disableValues.time.length; iTempIndex1++)
				{
					var oDayTime = apo.setting.disableValues.time[iTempIndex1],
					bIsValidDay = $.CF.isValid(oDayTime.day) && (oDayTime.day.length > 0),
					bIsValidVal = $.CF.isValid(oDayTime.val) && (oDayTime.val.length > 0);

					if(bIsValidVal)
					{
						var oArrTimes = [];
						for(iTempIndex2 = 0; iTempIndex2 < oDayTime.val.length; iTempIndex2++)
						{
							var oTime = oDayTime.val[iTempIndex2],
							oOutTime = null;

							if($.CF.isValid(oTime.val))
							{
								var oTimeVal = apo._parseInputDateTime(oTime.val);
								if($.CF.isValid(oTimeVal))
								{
									if(oOutTime === null)
										oOutTime = {};
									oOutTime.val = oTime;									
								}
							}
							if($.CF.isValid(oTime.start))
							{
								var oTimeStart = apo._parseInputDateTime(oTime.start);
								if($.CF.isValid(oTimeStart))
								{
									if(oOutTime === null)
										oOutTime = {};
									oOutTime.start = oTimeStart;
								}
							}
							if($.CF.isValid(oTime.end))
							{
								var oTimeEnd = apo._parseInputDateTime(oTime.end);
								if($.CF.isValid(oTimeEnd))
								{
									if(oOutTime === null)
										oOutTime = {};
									oOutTime.end = oTimeEnd;	
								}
							}

							if($.CF.isValid(oOutTime))
								oArrTimes.push(oOutTime);
						}

						if(oArrTimes.length > 0)
						{
							apo.tmp.oArrPDisable.time.push(
							{
								day: (bIsValidDay ? oDayTime.day : []),
								val: oArrTimes
							});
						}
					}
				}
			}

			// Parse DateTimes
			if($.CF.isValid(apo.setting.disableValues.datetime) && apo.setting.disableValues.datetime.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.setting.disableValues.datetime.length; iTempIndex1++)
				{
					var oDateTime = apo.setting.disableValues.datetime[iTempIndex1],
					oOutDateTime = null;
				
					if($.CF.isValid(oDateTime.val))
					{
						var oDateTimeVal = apo._parseInputDateTime(oDateTime.val);
						if($.CF.isValid(oDateTimeVal))
						{
							if(oOutDateTime === null)
								oOutDateTime = {};
							oOutDateTime.val = oDateTimeVal;
						}
					}
					if($.CF.isValid(oDateTime.start))
					{
						var oDateTimeStart = apo._parseInputDateTime(oDateTime.start);
						if($.CF.isValid(oDateTimeStart))
						{
							if(oOutDateTime === null)
								oOutDateTime = {};
							oOutDateTime.start = oDateTimeStart;
						}
					}
					if($.CF.isValid(oDateTime.end))
					{
						var oDateTimeEnd = apo._parseInputDateTime(oDateTime.end);
						if($.CF.isValid(oDateTimeEnd))
						{
							if(oOutDateTime === null)
								oOutDateTime = {};
							oOutDateTime.end = oDateTimeEnd;
						}
					}

					if($.CF.isValid(oOutDateTime))
						apo.tmp.oArrPDisable.datetime.push(oOutDateTime);
				}
			}
		}
		else
			console.log("Invalid value for AnyPicker plugin option disableValues");
	},

	__setSelectedDateTimeInComponent: function()
	{
		var apo = this;
		var iTempIndex, oComp, sValue = "", iChars, 
		oSelectedDate = apo.getDateObject(apo.tmp.selectedDate);
	
		for(iTempIndex = 0; iTempIndex < apo.tmp.numOfComp; iTempIndex++)
		{			
			oComp = apo.setting.components[iTempIndex];

			if(oComp.name === "date")
			{
				sValue = oSelectedDate.d;
			}
			else if(oComp.name === "day")
			{
				sValue = oSelectedDate.D;
			}
			else if(oComp.name === "month")
			{
				sValue = oSelectedDate.M;
			}
			else if(oComp.name === "year")
			{
				sValue = oSelectedDate.y;
			}
			else if(oComp.name === "hours")
			{
				if(oComp.format === "h" || oComp.format === "hh")
					sValue = oSelectedDate.h;
				else if(oComp.format === "H" || oComp.format === "HH")
					sValue = oSelectedDate.H;
			}
			else if(oComp.name === "minutes")
			{
				sValue = oSelectedDate.m;
			}
			else if(oComp.name === "seconds")
			{
				sValue = oSelectedDate.s;
			}
			else if(oComp.name === "meridiem")
			{
				if(oSelectedDate.sm === "a")
					sValue = 0;
				else if(oSelectedDate.sm === "p")
					sValue = 1;
			}

			apo.__changeComponentValue(iTempIndex, sValue);
		}
	},

	__disableInvalidRowsOfDateTimePicker: function()
	{
		var apo = this;
		var iTempIndex1, iTempIndex2, iTempIndex3, iTempIndex4,
		oArrValues = [], sValue, oArrSelectedValues,
		oComp, sCompName, sCompFormat, oData;

		if(apo.tmp.numOfComp === 1)
		{
			oComp = apo.setting.components[0];
			sCompName = oComp.name;
			sCompFormat = oComp.format;
			oData = apo.setting.dataSource[0].data;

			if(sCompName === "day")
			{
				for(iTempIndex1 = 0; iTempIndex1 < oData.length; iTempIndex1++)
				{
					for(iTempIndex2 = 0; iTempIndex2 < apo.tmp.oArrPDisable.day.length; iTempIndex2++)
					{
						if(apo.tmp.oArrPDisable.day[iTempIndex2] === oData[iTempIndex2].val)
						{
							$(apo.elem).find("#ap-row-0-" + iTempIndex1).addClass("ap-row-disabled ap-row-invalid");
						}
					}
				}	
			}
		}
		else
		{
			oArrSelectedValues = apo.__getSelectedDate(true)[1];
			
			for(iTempIndex1 = 0; iTempIndex1 < apo.setting.dataSource.length; iTempIndex1++) // change values of one component (dataSource)
			{
				var oData1 = apo.setting.dataSource[iTempIndex1];

				for(iTempIndex2 = 0; iTempIndex2 < oData1.data.length; iTempIndex2++) // dataSource.data values
				{
					var oDateToValidate = {
									d: 1,
									M: 0,
									y: 0,
									H: 0,
									h: 0,
									m: 0,
									s: 0,
									sm: 0
								};

					for(iTempIndex3 = 0; iTempIndex3 < apo.tmp.numOfComp; iTempIndex3++) // set selected values
					{
						if(iTempIndex3 === iTempIndex1)
						{
							sValue =  oData1.data[iTempIndex2].val;

							oComp = apo.setting.components[iTempIndex3];
							sCompName = oComp.name;
							sCompFormat = oComp.format;
						}
						else
						{
							sValue = oArrSelectedValues[iTempIndex3];

							oComp = apo.setting.components[iTempIndex3];
							sCompName = oComp.name;
							sCompFormat = oComp.format;
						}
						
						if(sCompName === "date")
						{
							oDateToValidate.d = parseInt(sValue);
						}
						else if(sCompName === "month")
						{
							oDateToValidate.M = parseInt(sValue); // parseInt(sValue) - 1
						}
						else if(sCompName === "year")
						{
							oDateToValidate.y = parseInt(sValue);
						}
						else if(sCompName === "hours")
						{
							if(sCompFormat === "h" || sCompFormat === "hh")
							{
								oDateToValidate.h = parseInt(sValue);
								oDateToValidate.H = -1;
							}
							else if(sCompFormat === "H" || sCompFormat === "HH")
							{
								oDateToValidate.H = parseInt(sValue);
							}
						}
						else if(sCompName === "minutes")
						{
							oDateToValidate.m = parseInt(sValue);
						}
						else if(sCompName === "seconds")
						{
							oDateToValidate.s = parseInt(sValue);
						}
						else if(sCompName === "meridiem")
						{
							oDateToValidate.sm = parseInt(sValue);
						}
					}

					if(oDateToValidate.H === -1)
					{
						oDateToValidate.H = (oDateToValidate.sm === 1) ? ((oDateToValidate.h === 12) ? 12 : (oDateToValidate.h + 12)) : ((oDateToValidate.h === 12) ? 0 : oDateToValidate.h);
					}

					var dNewSelectedDate = apo.setDateInFormat({"iDate": oDateToValidate}, "");
					var bValidDate = apo.__validateSelectedDate(dNewSelectedDate, true, false);
					if(!bValidDate)
					{
						$("#ap-component-" + iTempIndex1).find("#ap-row-" + iTempIndex1 + "-" + iTempIndex2).addClass("ap-row-disabled ap-row-invalid");
					}
				}
			}
		}
	},

	__getSelectedDate: function(bGetObject)
	{
		var apo = this;

		var iTempIndex, oComp, oArrSelected, oElemSelected, iValue,
		oNewSelectedDate = apo.getDateObject(apo.tmp.selectedDate),
		dNewSelectedDate = {}, iMeridiem = 0, oArrSelectedValues = [];
	
		for(iTempIndex = 0; iTempIndex < apo.tmp.numOfComp; iTempIndex++)
		{
			oComp = apo.setting.components[iTempIndex];
			oArrSelected = $(apo.tmp.overlaySelector).find("#ap-component-" + iTempIndex + " .ap-row-selected");
			oElemSelected = (oArrSelected.length > 0) ? oArrSelected[0] : null;

			iValue = parseInt($(oElemSelected).data('value'));
			oArrSelectedValues.push(iValue);
			if(oComp.name === "date")
			{
				oNewSelectedDate.d = isNaN(iValue) ? oNewSelectedDate.d : iValue;
			}
			else if(oComp.name === "day")
			{
				oNewSelectedDate.D = isNaN(iValue) ? oNewSelectedDate.D : iValue;
			}
			else if(oComp.name === "month")
			{
				oNewSelectedDate.M = isNaN(iValue) ? oNewSelectedDate.M : iValue;
			}
			else if(oComp.name === "year")
			{
				oNewSelectedDate.y = isNaN(iValue) ? oNewSelectedDate.y : iValue;
			}
			else if(oComp.name === "hours")
			{
				if(oComp.format === "h" || oComp.format === "hh")
				{
					oNewSelectedDate.h = isNaN(iValue) ? oNewSelectedDate.h : iValue;
					oNewSelectedDate.H = -1;
				}
				else
					oNewSelectedDate.H = isNaN(iValue) ? oNewSelectedDate.H : iValue;
			}
			else if(oComp.name === "minutes")
			{
				oNewSelectedDate.m = isNaN(iValue) ? oNewSelectedDate.m : iValue;
			}
			else if(oComp.name === "seconds")
			{
				oNewSelectedDate.s = isNaN(iValue) ? oNewSelectedDate.s : iValue;
			}
			else if(oComp.name === "meridiem")
			{
				iMeridiem = isNaN(iValue) ? (oNewSelectedDate.sm === "a" ? 0 : 1) : iValue;
			}
		}

		if(oNewSelectedDate.H === -1)
		{
			oNewSelectedDate.H = (iMeridiem === 1) ? ((oNewSelectedDate.h === 12) ? 12 : (oNewSelectedDate.h + 12)) : ((oNewSelectedDate.h === 12) ? 0 : oNewSelectedDate.h);
		}

		var iNoOfDays = apo._getNumberOfDaysOfMonth(oNewSelectedDate.M, oNewSelectedDate.y);
		if(oNewSelectedDate.d > iNoOfDays)
			oNewSelectedDate.d = iNoOfDays;

		dNewSelectedDate = apo.setDateInFormat({"iDate": oNewSelectedDate}, "");
		if(bGetObject)
			return [dNewSelectedDate, oArrSelectedValues];
		else
			return dNewSelectedDate;
	},

	/*

	1. Get New selectedDate based on the selected values in the Picker Components.
	2. Check whether new selectedDate is equal to or is in the range of disable date/time/datetimes
	3. If selectedDate matches disableDates then select previous value of selectedDate

	*/
	__validateSelectedDate: function(dNewSelectedDate, bReturnResult, bIsBefore)
	{
		var apo = this;

		var oNewSelectedDate = apo.getDateObject(dNewSelectedDate);

		if($.CF.isValid(apo.tmp.oArrPDisable))
		{
			var iTempIndex1, iTempIndex2,
			bHasDateComponent = (apo.tmp.sDateTimeMode === "datetime" || apo.tmp.sDateTimeMode === "date"),
			bHasTimeComponent = (apo.tmp.sDateTimeMode === "datetime" || apo.tmp.sDateTimeMode === "time"),
			bInvalidSelected = false,
			bResult = true,
			bLTMin, bGTMax, bDirIsBefore, oDateRecord, oTimeRecord;
		
			// -----------------------------------------------------------------
		
			// Validate Day

			if(!bInvalidSelected && bHasDateComponent && apo.tmp.oArrPDisable.day.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.tmp.oArrPDisable.day.length; iTempIndex1++)
				{
					if(apo.tmp.oArrPDisable.day[iTempIndex1] === oNewSelectedDate.D)
					{
						if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
						{
							bInvalidSelected = true;
							dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, dNewSelectedDate, "day");
							apo.tmp.selectedDate = new Date(dNewSelectedDate);
							apo.__scrollToSelectedRow();
						}
						else
						{
							if(bReturnResult)
								bResult = false;
							else
								apo.__scrollToSelectedRow();
						}
						break;
					}
				}
			}
			else
			{
				//console.log("No Disable Day Specified");
			}

			// -----------------------------------------------------------------

			// Validate Date
			if(!bInvalidSelected && bHasDateComponent && apo.tmp.oArrPDisable.date.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.tmp.oArrPDisable.date.length; iTempIndex1++)
				{
					oDateRecord = apo.tmp.oArrPDisable.date[iTempIndex1];

					if($.CF.isValid(oDateRecord.val))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.val) === 0)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, dNewSelectedDate, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.start) && $.CF.isValid(oDateRecord.end))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.start) >= 0 && apo.compareDates(dNewSelectedDate, oDateRecord.end) <= 0)
						{
							
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, oDateRecord.start, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.start))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.start) >= 0)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(true, oDateRecord.start, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.end))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.end) <= 0)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(false, oDateRecord.end, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.min) && $.CF.isValid(oDateRecord.max))
					{
						bLTMin = apo.compareDates(dNewSelectedDate, oDateRecord.min) < 0;
						bGTMax = apo.compareDates(dNewSelectedDate, oDateRecord.max) > 0;
						bDirIsBefore = bLTMin ? true : bGTMax ? false : true;
						if(bLTMin || bGTMax)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bDirIsBefore, oDateRecord.min, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.min))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.min) < 0)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(false, oDateRecord.min, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.max))
					{
						if(apo.compareDates(dNewSelectedDate, oDateRecord.max) > 0)
						{
							if(apo.compareDates(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(true, oDateRecord.max, "date");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
				}
			}
			else
			{
				//console.log("No Disable Date Specified");
			}

			// -----------------------------------------------------------------

			// Validate Time

			if(!bInvalidSelected && bHasTimeComponent && apo.tmp.oArrPDisable.time.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.tmp.oArrPDisable.time.length; iTempIndex1++)
				{
					var oDayRecord = apo.tmp.oArrPDisable.time[iTempIndex1],
					bIsValidDay = false;

					if($.CF.isValid(oDayRecord.day) && oDayRecord.day.length > 0)
					{
						for(iTempIndex2 = 0; iTempIndex2 < oDayRecord.day.length; iTempIndex2++)
						{
							bIsValidDay = (oDayRecord.day[iTempIndex2] === oNewSelectedDate.D);
							if(bIsValidDay)
								break;
						}
					}
					else
						bIsValidDay = true;

					if(bIsValidDay)
					{
						for(iTempIndex2 = 0; iTempIndex2 < oDayRecord.val.length; iTempIndex2++)
						{
							oTimeRecord = oDayRecord.val[iTempIndex2];

							if($.CF.isValid(oTimeRecord.val))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.val) === 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, dNewSelectedDate, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.start) && $.CF.isValid(oTimeRecord.end))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.start) >= 0 && apo.compareTimes(dNewSelectedDate, oTimeRecord.end) <= 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, oTimeRecord.start, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.start))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.start) >= 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(true, oTimeRecord.start, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.end))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.end) <= 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(false, oTimeRecord.end, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.min) && $.CF.isValid(oTimeRecord.max))
							{
								bLTMin = apo.compareTimes(dNewSelectedDate, oTimeRecord.min) < 0;
								bGTMax = apo.compareTimes(dNewSelectedDate, oTimeRecord.max) > 0;
								bDirIsBefore = bLTMin ? true : bGTMax ? false : true;
								
								if(bLTMin || bGTMax)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(bDirIsBefore, oTimeRecord.min, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.min))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.min) < 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(false, oTimeRecord.min, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
							else if($.CF.isValid(oTimeRecord.max))
							{
								if(apo.compareTimes(dNewSelectedDate, oTimeRecord.max) > 0)
								{
									if(apo.compareTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
									{
										bInvalidSelected = true;
										dNewSelectedDate = apo._findValidSelectedDate(true, oTimeRecord.max, "time");
										apo.tmp.selectedDate = new Date(dNewSelectedDate);
										apo.__scrollToSelectedRow();
									}
									else
									{
										if(bReturnResult)
											bResult = false;
										else
											apo.__scrollToSelectedRow();
									}
									break;
								}
							}
						}
					}
				}
			}
			else
			{
				//console.log("No Disable Time Specified");
			}

			// -----------------------------------------------------------------

			// Validate DateTime

			if(!bInvalidSelected && bHasTimeComponent && apo.tmp.oArrPDisable.datetime.length > 0)
			{
				for(iTempIndex1 = 0; iTempIndex1 < apo.tmp.oArrPDisable.datetime.length; iTempIndex1++)
				{
					oDateRecord = apo.tmp.oArrPDisable.datetime[iTempIndex1];
				
					if($.CF.isValid(oDateRecord.val))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.val) === 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, dNewSelectedDate, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.start) && $.CF.isValid(oDateRecord.end))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.start) >= 0 && apo.compareDateTimes(dNewSelectedDate, oDateRecord.end) <= 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bIsBefore, oDateRecord.start, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.start))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.start) >= 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(true, oDateRecord.start, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.end))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.end) <= 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(false, oDateRecord.end, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.min) && $.CF.isValid(oDateRecord.max))
					{
						bLTMin = apo.compareDateTimes(dNewSelectedDate, oDateRecord.min) < 0;
						bGTMax = apo.compareDateTimes(dNewSelectedDate, oDateRecord.max) > 0;
						bDirIsBefore = bLTMin ? true : bGTMax ? false : true;
						if(bLTMin || bGTMax)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(bDirIsBefore, oDateRecord.min, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.min))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.min) < 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(false, oDateRecord.min, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
					else if($.CF.isValid(oDateRecord.max))
					{
						if(apo.compareDateTimes(dNewSelectedDate, oDateRecord.max) > 0)
						{
							if(apo.compareDateTimes(dNewSelectedDate, apo.tmp.selectedDate) === 0)
							{
								bInvalidSelected = true;
								dNewSelectedDate = apo._findValidSelectedDate(true, oDateRecord.max, "datetime");
								apo.tmp.selectedDate = new Date(dNewSelectedDate);
								apo.__scrollToSelectedRow();
							}
							else
							{
								if(bReturnResult)
									bResult = false;
								else
									apo.__scrollToSelectedRow();
							}
							break;
						}
					}
				}
			}
			else
			{
				//console.log("No Disable DateTime Specified");
			}

			// -----------------------------------------------------------------

			if(bReturnResult)
				return bResult;
		}
		else
		{
			if(bReturnResult)
				return true;
		}
	},

	_findValidSelectedDate: function(bIsBefore, dDate, sType)
	{
		var apo = this;
	
		if(sType === "day" || sType === "date")
		{
			if($.CF.isValid(apo.setting.minValue) && apo.compareDates(apo.setting.minValue, dDate) >= 0)
			{
				dDate = new Date(apo.setting.minValue);
				bIsBefore = false;
			}

			if($.CF.isValid(apo.setting.maxValue) && apo.compareDates(apo.setting.maxValue, dDate) <= 0)
			{
				dDate = new Date(apo.setting.maxValue);
				bIsBefore = true;
			}

			do
			{
				if(bIsBefore)
					dDate = new Date(dDate.getTime() - $.AnyPicker.extra.iMS.d);
				else
					dDate = new Date(dDate.getTime() + $.AnyPicker.extra.iMS.d);
				if(apo.__validateSelectedDate(dDate, true, false))
				{
					if((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareDates(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareDates(apo.setting.maxValue, dDate) >= 0)))
					{
						return dDate;
					}
				}

			}while((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareDates(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareDates(apo.setting.maxValue, dDate) >= 0)));
		}
		else if(sType === "time")
		{
			if($.CF.isValid(apo.setting.minValue) && apo.compareTimes(apo.setting.minValue, dDate) >= 0)
			{
				dDate = new Date(apo.setting.minValue);
				bIsBefore = false;
			}

			if($.CF.isValid(apo.setting.maxValue) && apo.compareTimes(apo.setting.maxValue, dDate) <= 0)
			{
				dDate = new Date(apo.setting.maxValue);
				bIsBefore = true;
			}

			do
			{
				if(bIsBefore)
					dDate = new Date(dDate.getTime() - ($.AnyPicker.extra.iMS.m * apo.setting.intervals.m));
				else
					dDate = new Date(dDate.getTime() + ($.AnyPicker.extra.iMS.m * apo.setting.intervals.m));
				if(apo.__validateSelectedDate(dDate, true, false))
				{
					if((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareTimes(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareTimes(apo.setting.maxValue, dDate) >= 0)))
					{
						return dDate;
					}
				}
			}while((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareTimes(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareTimes(apo.setting.maxValue, dDate) >= 0)));
		}
		else if(sType === "datetime")
		{
			if($.CF.isValid(apo.setting.minValue) && apo.compareDateTimes(apo.setting.minValue, dDate) >= 0)
			{
				dDate = new Date(apo.setting.minValue);
				bIsBefore = false;
			}

			if($.CF.isValid(apo.setting.maxValue) && apo.compareDateTimes(apo.setting.maxValue, dDate) <= 0)
			{
				dDate = new Date(apo.setting.maxValue);
				bIsBefore = true;
			}

			do
			{
				if(bIsBefore)
					dDate = new Date(dDate.getTime() - ($.AnyPicker.extra.iMS.m * apo.setting.intervals.m));
				else
					dDate = new Date(dDate.getTime() + ($.AnyPicker.extra.iMS.m * apo.setting.intervals.m));
				
				if(apo.__validateSelectedDate(dDate, true, false))
				{
					if((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareDateTimes(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareDateTimes(apo.setting.maxValue, dDate) >= 0)))
					{
						return dDate;
					}
				}
			}while((!$.CF.isValid(apo.setting.minValue) || ($.CF.isValid(apo.setting.minValue) && apo.compareDateTimes(apo.setting.minValue, dDate) <= 0)) && (!$.CF.isValid(apo.setting.maxValue) || ($.CF.isValid(apo.setting.maxValue) && apo.compareDateTimes(apo.setting.maxValue, dDate) >= 0)));
		}
	
		if($.CF.isValid(apo.setting.minValue))
		{
			return apo.setting.minValue;
		}
	},

	__setDaysOfMonthInDatePicker: function()
	{
		var apo = this;

		var iTempIndex, oComp, iDateComp = null, sDateCompFormat = null;
		for(iTempIndex = 0; iTempIndex < apo.tmp.numOfComp; iTempIndex++)
		{
			oComp = apo.setting.components[iTempIndex];
			if(oComp.name === "date")
			{
				iDateComp = oComp.component;
				sDateCompFormat = oComp.format;
			}
		}

		if(iDateComp !== null)
		{
			var oSelectedDate = apo.getDateObject(apo.tmp.selectedDate),
			iNoOfDays = apo._getNumberOfDaysOfMonth(oSelectedDate.M, oSelectedDate.y),
			bHasAria = false;

			for(iTempIndex = (iNoOfDays + 1); iTempIndex <= 31; iTempIndex++)
			{
				var $oHiddenElem = $("#ap-component-" + iDateComp).find("#ap-row-" + iDateComp + "-" + (iTempIndex - 1));
				$oHiddenElem.addClass("ap-row-disabled ap-row-hidden");
				if(!bHasAria)
					bHasAria = ($oHiddenElem.attr("aria-selected") === "true") ? true : false;
			}
			
			if(bHasAria)
			{
				var dTemp = new Date(oSelectedDate.y, oSelectedDate.M, iNoOfDays, oSelectedDate.H, oSelectedDate.m, oSelectedDate.s, oSelectedDate.ms);
				
				apo.__validateSelectedDate(dTemp, false, true);
				apo.__scrollToSelectedRow();
			}
		}
	},

	//------------------------------- Date Manipulation Functions Start -------------------------------

	// Public Method
	setDateInFormat: function(oInput, sType)
	{
		var apo = this;

		if(oInput.date === undefined && oInput.iDate === undefined)
			oInput.date = apo._getCurrentDate();
		if(oInput.iDate === undefined)
		{
			oInput.iDate = {
				d: oInput.date.getDate(),
				M: oInput.date.getMonth(),
				y: oInput.date.getFullYear(),
				H: oInput.date.getHours(),
				m: oInput.date.getMinutes(),
				s: oInput.date.getSeconds(),
				ms: oInput.date.getMilliseconds()
			};
		}
		else
		{
			oInput.iDate = {
				d: (oInput.iDate.d !== undefined) ? oInput.iDate.d : 1,
				M: (oInput.iDate.M !== undefined) ? oInput.iDate.M : $.AnyPicker.extra.dToday.getMonth(),
				y: (oInput.iDate.y !== undefined) ? oInput.iDate.y : $.AnyPicker.extra.dToday.getFullYear(),
				H: (oInput.iDate.H !== undefined) ? oInput.iDate.H : 0,
				m: (oInput.iDate.m !== undefined) ? oInput.iDate.m : 0,
				s: (oInput.iDate.s !== undefined) ? oInput.iDate.s : 0,
				ms: (oInput.iDate.ms !== undefined) ? oInput.iDate.ms : 0
			};
		}

		var dDate;
		if(!$.CF.isValid(sType))
			dDate = new Date(oInput.iDate.y, oInput.iDate.M, oInput.iDate.d, oInput.iDate.H, oInput.iDate.m, oInput.iDate.s, oInput.iDate.ms);
		else if(sType === "START")
			dDate = new Date(oInput.iDate.y, oInput.iDate.M, oInput.iDate.d, 0, 0, 0, 0);
		else if(sType === "END")
			dDate = new Date(oInput.iDate.y, oInput.iDate.M, oInput.iDate.d, 23, 59, 59, 999);
	
		return dDate;
	},

	_getCurrentDate: function()
	{
		var apo = this;
		var dToday = apo.getDateByAddingOutputTZOffset(apo.convertToUTC(new Date()), apo.setting.tzOffset);
		return dToday;
	},

	// Public Method
	convertToUTC: function(dIpDate, sIpTZOffset)
	{
		var apo = this;
		return new Date(dIpDate.getTime() - ((sIpTZOffset === undefined || sIpTZOffset === "" || sIpTZOffset === null) ?  -(dIpDate.getTimezoneOffset() * $.AnyPicker.extra.iMS.m) : apo._getTZOffsetInMS(sIpTZOffset)));
	},

	_getTZOffsetInMS: function(sTZOffset)
	{
		var apo = this;
		var iOffsetMS = 0;
		if(sTZOffset === undefined || sTZOffset === "" || sTZOffset === null)
			iOffsetMS = -($.AnyPicker.extra.dToday.getTimezoneOffset() * $.AnyPicker.extra.iMS.m);
		else
		{
			var sArrTZOffset = apo._matchRegex(/^([+|-]{1})([0-1]{0,1}[0-9]{1}):([0-6]{0,1}[0-9]{1})$/, sTZOffset);
			iOffsetMS = parseInt(sArrTZOffset[2]) * $.AnyPicker.extra.iMS.h + parseInt(sArrTZOffset[3]) * $.AnyPicker.extra.iMS.m;
			iOffsetMS = (sArrTZOffset[1]==="+") ? iOffsetMS : -iOffsetMS;
		}
		return iOffsetMS;
	},

	// Public Method
	getDateByAddingOutputTZOffset: function(dIpDate, sOpTZOffset)
	{
		var apo = this;
		return new Date(dIpDate.getTime() + apo._getTZOffsetInMS(sOpTZOffset));
	},

	// Public Method
	normalizeDateTimeWithOffset: function(dIpDate, sIpTZOffset, sOpTZOffset)
	{
		var apo = this;
		return apo.getDateByAddingOutputTZOffset(apo.convertToUTC(dIpDate, sIpTZOffset), sOpTZOffset);
	},

	_getNumberOfDaysOfMonth: function(iMonth, iYear)
	{
		var apo = this;
		var iArrMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
		iArrLeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		if(iYear % 4 === 0)
			return iArrLeapYearMonthDays[iMonth];
		else
			return iArrMonthDays[iMonth];
	},

	_normalizeDateTime: function(dInputDate, sFunction, sUnit)
	{
		var apo = this;
		// sFunction = "START" | "END"
		// sUnit = "s" | "m" | "h" | "T" | "d" | "M" | 
	
		var dOutputDate,
		iArrInput = 
		{
			d: dInputDate.getDate(),
			M: dInputDate.getMonth(),
			y: dInputDate.getFullYear(),
			H: dInputDate.getHours(),
			m: dInputDate.getMinutes(),
			s: dInputDate.getSeconds()
		};
	
		switch(sUnit)
		{
			case "s":
				{
					if(sFunction === "START")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, iArrInput.H, iArrInput.m, 0, 0);
					else if(sFunction === "END")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, iArrInput.H, iArrInput.m, 59, 999);
				}
				break;
			case "m":
				{
					if(sFunction === "START")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, iArrInput.H, 0, 0, 0);
					else if(sFunction === "END")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, iArrInput.H, 59, 59, 999);
				}
				break;
			case "h":
			case "T":
				{
					if(sFunction === "START")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, 0, 0, 0, 0);
					else if(sFunction === "END")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, iArrInput.d, 23, 59, 59, 999);
				}
				break;
			case "d":
			case "dE":
				{
					if(sFunction === "START")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, 1, 0, 0, 0, 0);
					else if(sFunction === "END")
						dOutputDate = new Date(iArrInput.y, iArrInput.M, apo._getNumberOfDaysOfMonth(iArrInput.M, iArrInput.y), 0, 0, 0, 0);
				}
				break;
			case "M":
			case "ME":
			case "y":
			case "yE":
				{
					if(sFunction === "START")
						dOutputDate = new Date(iArrInput.y, 0, 1, 0, 0, 0, 0);
					else if(sFunction === "END")
						dOutputDate = new Date(iArrInput.y, 11, apo._getNumberOfDaysOfMonth(11, iArrInput.y), 0, 0, 0, 0);
				}
				break;
		}
	
		if(sUnit === "dE" || sUnit === "ME" || sUnit === "yE")
			dOutputDate = apo._normalizeDateTime(dOutputDate, "END", "T");
	
		return dOutputDate;
	},

	_getDifference: function(sUnit, dDate1, dDate2)
	{
		var apo = this;
		// sUnit = "ms | "s" | "m" | "h" | "T" | "d" | "M"| "y"
	
		var iUnitDiff, iMSDiff = dDate1.getTime() - dDate2.getTime();
	
		if(sUnit === "ms")
			iUnitDiff = iMSDiff;
		else if(sUnit === "s")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.s);
		else if(sUnit === "m")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.m);
		else if(sUnit === "h")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.h);
		else if(sUnit === "d")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.d);
		else if(sUnit === "M")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.m);
		else if(sUnit === "y")
			iUnitDiff = (iMSDiff / $.AnyPicker.extra.iMS.y);
	
		return iUnitDiff;
	},

	// Public Method
	compareDates: function(dDate1, dDate2)
	{
		var apo = this;
		dDate1 = apo._normalizeDateTime(dDate1, "START", "T");
		dDate2 = apo._normalizeDateTime(dDate2, "START", "T");
		var iDateDiff = apo._getDifference("d", dDate1, dDate2);
		return (iDateDiff === 0) ? iDateDiff: (iDateDiff/Math.abs(iDateDiff));
	},

	// Public Method
	compareDateTimes: function(dDate1, dDate2)
	{
		var apo = this;
		var iDateTimeDiff = apo._getDifference("m", dDate1, dDate2);
		return (iDateTimeDiff === 0) ? iDateTimeDiff: (iDateTimeDiff/Math.abs(iDateTimeDiff));
	},

	// Public Method
	compareTimes: function(dDate1, dDate2)
	{
		var apo = this;
		var dDateTime1 = new Date($.AnyPicker.extra.dToday),
		dDateTime2 = new Date($.AnyPicker.extra.dToday);

		dDateTime1.setHours(dDate1.getHours());
		dDateTime1.setMinutes(dDate1.getMinutes());
		dDateTime1.setSeconds(dDate1.getSeconds());

		dDateTime2.setHours(dDate2.getHours());
		dDateTime2.setMinutes(dDate2.getMinutes());
		dDateTime2.setSeconds(dDate2.getSeconds());

		return apo.compareDateTimes(dDateTime1, dDateTime2);
	},

	// Public Method
	getNumberStringInFormat: function(iNumber, iChars, bIsLocalized)
	{
		var apo = this;
		var iTempIndex, sFormattedString = "", sNumber = iNumber.toString(), iNumberLength = sNumber.length;
		if(iChars !== 0)
		{
			for(iTempIndex = 0; iTempIndex < (iChars - iNumberLength); iTempIndex++)
				sFormattedString += (bIsLocalized ? apo.setting.i18n.numbers[0] : "0");
		}
		if(!bIsLocalized)
			sFormattedString += sNumber;
		else
		{
			for(iTempIndex = 0; iTempIndex < iNumberLength; iTempIndex++)
				sFormattedString += apo.setting.i18n.numbers[parseInt(sNumber.charAt(iTempIndex))];
		}
		return sFormattedString;
	},

	// Public Method
	getDateObject: function(dInput)
	{
		var apo = this;
	
		var oInput = {
			D: dInput.getDay(),
			d: dInput.getDate(),
			M: dInput.getMonth(),
			y: dInput.getFullYear(),
			H: dInput.getHours(),
			m: dInput.getMinutes(),
			s: dInput.getSeconds(),
			ms: dInput.getMilliseconds()
		};
		
		oInput.h = (oInput.H > 12) ? (oInput.H - 12) : ((oInput.H === 0) ? 12 : oInput.H);
		oInput.me = (oInput.H < 12) ?  "am" : "pm";
		oInput.sm = (oInput.H < 12) ?  "a" : "p";
		
		return oInput;
	}

	//------------------------------- Date Manipulation Functions End -------------------------------

});

// --------------------------------- Functions : AnyPicker.DateTime End --------------------------------------