//////////////// dependencies  ///////////////////////////////

// 2007/11/19, Jalen: Created as a data type in SCORM 2004 3rd ED.


function timeinterval() {
	this.Validate = Validate;
	this.Parse = Parse;
	this.ToMilliseconds = ToMilliseconds;
	// Private functions
	this.validateTime = validateTime;
	this.isInteger = isInteger;
	this._UnitTestError = _UnitTestError;
	
	function Validate(sValue) {
		if (sValue.charAt(0) == "P") {
			sValue = sValue.substr(1);
			if (sValue == "")	return false;
			var aValue = sValue.split("T");
			//alert(sValue + ": " + aValue.length + " > " + aValue[0] + ", " + aValue[1]);
			if (aValue.length > 1 && aValue[0] == "") {
				return validateTime(aValue[1]);
			} else {
				// Check day part.
				sValue = aValue[0];
				var aTemp = sValue.split("Y");
				//alert(sValue + ": " + aTemp.length);
				if (aTemp.length > 1) {
					if (aTemp[0] == "" || isNaN(aTemp[0]) || !isInteger(aTemp[0])) {
						return false;
					}
					sValue = aTemp[1];
				}
				aTemp = sValue.split("M");
				if (aTemp.length > 1) {
					if (aTemp[0] == "" || isNaN(aTemp[0]) || !isInteger(aTemp[0])) {
						return false;
					}
					sValue = aTemp[1];
				}
				aTemp = sValue.split("D");
				//alert(sValue + ": " + aTemp.length);
				if (aTemp.length > 1) {
					if (aTemp[0] == "" || isNaN(aTemp[0]) || !isInteger(aTemp[0])) {
						return false;
					}
					if (aTemp[1] != "") {
						return false;
					}
				} else {
					if (sValue != "") {
						return false;
					}
				}
				if (aValue.length == 1) {
					return true;
				} else if (aValue[1] == "") {
					return false;
				} else {
					return validateTime(aValue[1]);
				}
			}
		} else {
			return false;
		}
	}

	// Convert time period from milliseconds to timeinterval format: P1Y3M2DT3H5M27.04S, PT84H5M27.04S.
	function Parse(iTime) {
		var dtm = new Date(iTime);	
		var hrs = Math.floor(iTime / (60 * 60 * 1000));
		var mins = dtm.getMinutes();
		var secs = dtm.getSeconds();
		var secFraction = "0" + Math.floor(dtm.getMilliseconds() / 10);
	
		var sHMS = "PT";
		if (hrs > 0)	sHMS += hrs + "H";
		if (mins > 0)	sHMS += mins + "M";
		if (secs > 0)	sHMS += secs + ".";
		// remove unnecessary leading 0's
		sHMS += secFraction.substr(secFraction.length-2) + "S";
		//alert(sHMS);
		return sHMS;
	}
	
	function ToMilliseconds(sTime) {		// To do
		return 0;
	}
	
	// Validate the format of the time part only. (e.g. "3H5M27.04S")
	function validateTime(sValue) {
		if (sValue == "") {
			return false;
		} else {
			var aTemp = sValue.split("H");
			//alert("split by H " + sValue + ": " + aTemp.length);
			if (aTemp.length > 1) {
				if (aTemp[0] == "" || isNaN(aTemp[0]) || !isInteger(aTemp[0])) {
					return false;
				}
				sValue = aTemp[1];
			}
			aTemp = sValue.split("M");
			//alert("split by Min " + sValue + ": " + aTemp.length + ", " + isInteger(aTemp[0]));
			if (aTemp.length > 1) {
				if (aTemp[0] == "" || isNaN(aTemp[0]) || !isInteger(aTemp[0])) {
					return false;
				}
				sValue = aTemp[1];
			}
			aTemp = sValue.split("S");
			//alert("split by S " + sValue + ": " + aTemp.length);
			if (aTemp.length == 2) {
				if (aTemp[0] == "" || isNaN(aTemp[0])) {
					return false;
				}
				if (aTemp[1] != "") {
					return false;
				}
				// Check digits after decimal point.
				sValue = aTemp[0];
				aTemp = sValue.split(".");
				if (aTemp.length == 2) {
					if (aTemp[0] == "" || aTemp[1] == "") {
						return false;
					} else {
						if (aTemp[1].length > 2) {
							return false;
						}
					}
				}
			} else {
				if (sValue != "") {
					return false;
				}
			}
			return true;
		}
	}
	
	function isInteger(iNum) {
		return iNum == Math.round(iNum);
	}
	
	function _UnitTestError() {
		var obj = new timeinterval();

		if (obj.Validate("P1Y2M3D") != true) return "error 1.1";
		if (obj.Validate("PY2M3D") != false) return "error 1.2";
		if (obj.Validate("P1YM3D") != false) return "error 1.3";
		if (obj.Validate("P1Y3D") != true) return "error 1.4";
		if (obj.Validate("P1Y2MD") != false) return "error 1.5";
		if (obj.Validate("P1Y2M3D3") != false) return "error 1.6";
		if (obj.Validate("P1Y2M") != true) return "error 1.7";
		if (obj.Validate("P1Y2MD3") != false) return "error 1.8";
		if (obj.Validate("P1Y2M3") != false) return "error 1.9";
		if (obj.Validate("P2M3D") != true) return "error 1.10";
		if (obj.Validate("P3D") != true) return "error 1.11";
		if (obj.Validate("P") != false) return "error 1.12";
		if (obj.Validate("P2Y3D") != true) return "error 1.13";
		if (obj.Validate("PT1121H2M50S") != true) return "error 1.14";
		if (obj.Validate("PTH2M50S") != false) return "error 1.15";
		if (obj.Validate("PT2M50.5S") != true) return "error 1.16";
		if (obj.Validate("PTM50S") != false) return "error 1.17";
		if (obj.Validate("PT2MS") != false) return "error 1.18";
		if (obj.Validate("PT2MS3") != false) return "error 1.19";
		if (obj.Validate("PT1H2M3") != false) return "error 1.20";
		if (obj.Validate("PT500S") != true) return "error 1.21";
		if (obj.Validate("PT5.45S") != true) return "error 1.22";
		if (obj.Validate("PT5.451S") != false) return "error 1.23";
		if (obj.Validate("PT.45S") != false) return "error 1.24";
		if (obj.Validate("PT") != false) return "error 1.25";
		if (obj.Validate("P1Y2M3DT1H2M50.21S") != true) return "error 1.26";
		if (obj.Validate("PT1H3.5S") != true) return "error 1.27";
		if (obj.Validate("PT1H3M") != true) return "error 1.28";
		if (obj.Validate("PT1H3.5M") != false) return "error 1.29";
		if (obj.Validate("") != false) return "error 1.30";
		if (obj.Validate("P33330H30M40S") != false) return "error 1.31";
		if (obj.Validate("PYT3330H30M40S") != false) return "error 1.32";
		if (obj.Validate("3 hours") != false) return "error 1.33";
		if (obj.Validate("P1Y2M3DT1H2M.21S") != false) return "error 1.34";
		if (obj.Validate("P1Y2M3DT1H0.21S") != true) return "error 1.35";
		if (obj.Validate("P1Y2M3D1H0.21S") != false) return "error 1.36";
		if (obj.Validate("P1Y2M3ST1H0.21S") != false) return "error 1.37";
		if (obj.Validate("P1Y2MT1D0.21S") != false) return "error 1.38";
		if (obj.Validate("P2MT2M") != true) return "error 1.39";
		if (obj.Validate("P2YT2.1S") != true) return "error 1.40";
		if (obj.Parse(3630250) != "PT1H30.25S") return "error 2.1";
		if (obj.Parse(2667610) != "PT44M27.61S") return "error 2.2";
		/*if (obj.ToMilliseconds("0001:00:30.25") != 3630250) return "error 3.1";
		if (obj.ToMilliseconds("0000:44:27.61") != 2667610) return "error 3.2";*/
		if (obj.isInteger(45) != true) return "error 4.1";
		if (obj.isInteger(45.2) != false) return "error 4.2";
		
		return false;
	}
	
};

