function clientConverter() {
}

clientConverter.makeDblDigit = function(val) {
	if (val < 10) {
		return '0' + val
	} else {
		return val
	}
}

clientConverter.prototype.dateToText = function(tmpDate) {

	var dateString = dateString = tmpDate.getFullYear();

	var tmpString;
	tmpString = (tmpDate.getMonth() + 1).toString();

	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	tmpString = tmpDate.getDate().toString();

	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	dateString = dateString + 'T000000';

	return dateString
}

clientConverter.prototype.dateTimeToText = function(tmpDate) {

	var dateString = dateString = tmpDate.getFullYear();

	var tmpString;
	tmpString = String(tmpDate.getMonth() + 1);
	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	tmpString = String(tmpDate.getDate());
	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	dateString = dateString + 'T';

	tmpString = String(tmpDate.getHours());
	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	tmpString = String(tmpDate.getMinutes());
	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	tmpString = String(tmpDate.getSeconds());
	if (tmpString.length == 1) { tmpString = '0' + tmpString; }
	dateString = dateString + tmpString;

	return dateString
}


clientConverter.prototype.textToDateTime = function(tmpString) {

	y = parseInt(tmpString.substr(0, 4));
	m = (tmpString.substr(4, 1) == '0') ? parseInt(tmpString.substr(5, 1)) - 1 : parseInt(tmpString.substr(4, 2)) - 1
	d = (tmpString.substr(6, 1) == '0') ? parseInt(tmpString.substr(7, 1)) : parseInt(tmpString.substr(6, 2));
	h = (tmpString.substr(9, 1) == '0') ? parseInt(tmpString.substr(10, 1)) : parseInt(tmpString.substr(9, 2));
	n = (tmpString.substr(11, 1) == '0') ? parseInt(tmpString.substr(12, 1)) : parseInt(tmpString.substr(11, 2));
	s = (tmpString.substr(13, 1) == '0') ? parseInt(tmpString.substr(14, 1)) : parseInt(tmpString.substr(13, 2));

	var tmpDate = new Date(y, m, d, h, n, s)
	return tmpDate;
}

clientConverter.prototype.toTimeString = function(datDate) {
	return clientConverter.makeDblDigit(datDate.getHours()) + ':' + clientConverter.makeDblDigit(datDate.getMinutes());
}

clientConverter.prototype.toDateString = function(datDate) {
	del = Page.GetDateDelimiter()

	d = datDate.getDate()
	m = datDate.getMonth() + 1
	//alert(datDate)
	y = datDate.getFullYear()

	switch (Page.Lcid) {
		case 1033:
			return m + '' + del + '' + d + '' + del + '' + y
			break;
		case 1053:
			d = (d < 10) ? '0' + d : d // prefix
			m = (m < 10) ? '0' + m : m  // prefix
			return y + del + m + del + d
			break;
		case 1035:
			return d + '' + del + '' + m + '' + del + '' + y
			break;
		case 1061:
			m = (m < 10) ? '0' + m : m  // prefix
			return d + '' + del + '' + m + '' + del + '' + y
			break;
		case 2052:
			return y + '' + del + '' + m + '' + del + '' + d
			break;
		default:
			d = (d < 10) ? '0' + d : d // prefix
			m = (m < 10) ? '0' + m : m

			return d + '' + del + '' + m + '' + del + '' + y
			break;
	}
}


clientConverter.prototype.getDateParts = function(strDate) {
	switch (Page.Lcid) {
		case 3081:
			x = (!isNaN(strDate.substring(2, 3))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, x + 3)
			yearMatrix = new Array(x + 4, x + 8)
			break;
		case 1033:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			monthMatrix = new Array(0, x)
			dayMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 1053:
			yearMatrix = new Array(0, 4)
			monthMatrix = new Array(5, 7)
			dayMatrix = new Array(8, 10)
			break;
		case 1035:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 1061:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 2052:
			x = (!isNaN(strDate.substring(6, 7))) ? 2 : 1
			y = (strDate.length == 8 + x) ? 2 : 1
			yearMatrix = new Array(0, 4)
			monthMatrix = new Array(5, 5 + x)
			dayMatrix = new Array(5 + x + 1, strDate.length)
			break;
		default:
			dayMatrix = new Array(0, 2)
			monthMatrix = new Array(3, 5)
			yearMatrix = new Array(6, 10)
	}
	d = parseFloat(strDate.substring(dayMatrix[0], dayMatrix[1]))
	m = parseFloat(strDate.substring(monthMatrix[0], monthMatrix[1]))
	y = parseFloat(strDate.substring(yearMatrix[0], yearMatrix[1]))

	return new Array(y, m, d)
}

clientConverter.prototype.toTime = function(strTime) {
	var tmpDate = new Date()
	timeArray = strTime.split(':')

	if (timeArray[0]) tmpDate.setHours(timeArray[0]);
	if (timeArray[1]) tmpDate.setMinutes(timeArray[1]);
	if (timeArray[2]) tmpDate.setSeconds(timeArray[2]);
	if (timeArray[3]) tmpDate.setMilliseconds(timeArray[3]);

	return tmpDate
}

clientConverter.prototype.toDate = function(strDate) {
	var tmpDate = new Date(2000, 1, 1);
	if (strDate == '') return new Date(1900, 1, 1);
	switch (Page.Lcid) {
		case 3081:
			x = (!isNaN(strDate.substring(2, 3))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, x + 3)
			yearMatrix = new Array(x + 4, x + 8)
			break;
		case 1033:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			monthMatrix = new Array(0, x)
			dayMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 1053:
			yearMatrix = new Array(0, 4)
			monthMatrix = new Array(5, 7)
			dayMatrix = new Array(8, 10)
			break;
		case 1035:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 1061:
			x = (!isNaN(strDate.substring(1, 2))) ? 2 : 1
			y = (!isNaN(strDate.substring(2 + x, 3 + x))) ? 2 : 1
			dayMatrix = new Array(0, x)
			monthMatrix = new Array(x + 1, (y + x + 1))
			yearMatrix = new Array(x + y + 2, (x + y + 6))
			break;
		case 2052:
			x = (!isNaN(strDate.substring(6, 7))) ? 2 : 1
			y = (strDate.length == 8 + x) ? 2 : 1
			yearMatrix = new Array(0, 4)
			monthMatrix = new Array(5, 5 + x)
			dayMatrix = new Array(5 + x + 1, strDate.length)
			break;
		default:
			dayMatrix = new Array(0, 2)
			monthMatrix = new Array(3, 5)
			yearMatrix = new Array(6, 10)
	}


	d = parseFloat(strDate.substring(dayMatrix[0], dayMatrix[1]))
	m = parseFloat(strDate.substring(monthMatrix[0], monthMatrix[1]))
	y = parseFloat(strDate.substring(yearMatrix[0], yearMatrix[1]))

	//alert(d + '.' + m + '.'+ y)

	tmpDate.setYear(y);
	tmpDate.setMonth(m - 1);
	tmpDate.setDate(d);
	return tmpDate
}

clientConverter.prototype.toDateTime = function(strDateTime) {
	var tmpDate = new Date()

	var strDateTimeArray = strDateTime.split(' ')
	var timeArray = strDateTimeArray[1].split(':')

	tmpDate = this.toDate(strDateTimeArray[0])

	if (timeArray[0]) tmpDate.setHours(timeArray[0]);
	if (timeArray[1]) tmpDate.setMinutes(timeArray[1]);
	if (timeArray[2]) tmpDate.setSeconds(timeArray[2]);
	if (timeArray[3]) tmpDate.setMilliseconds(timeArray[3]);

	return tmpDate
}


clientConverter.prototype.toBit = function(value) {
	if (value) {
		return '1'
	} else {
		return '0'
	}
}

clientConverter.prototype.toArray = function(theVal, strDelimiter) {
	del = (arguments[1]) ? arguments[1] : ',' // SET "," TO DEFAULT
	return theVal.split(del)
}


clientConverter.prototype.dateToJSNewDateString = function(dateVal) {
	return 'new Date(' + dateVal.getYear() + ',' + dateVal.getMonth() + ',' + dateVal.getDate() + ',' + dateVal.getHours() + ',' + dateVal.getMinutes() + ',' + dateVal.getSeconds() + ')'
}

clientConverter.prototype.toNumeric = function(theVal, valIfNaN) {
	if (isNaN(theVal) || theVal == '') {
		return parseInt(valIfNaN,10)
	}
	else {
		return parseInt(theVal,10)
	}
}

clientConverter.prototype.toDecimal = function(theVal) {
	return parseFloat(theVal.replace(',', '.'))
}

clientConverter.prototype.toHandicap = function(theVal) {
	var tempVal = parseFloat(theVal.replace(',', '.'))
	if (theVal.indexOf('+') == 0) {
		tempVal = -tempVal;
	}
	return tempVal;
}

clientConverter.prototype.handicapToText = function(theVal) {
	decimalSeperator = '.';
	if (Page.Lcid == 1030 || Page.Lcid == 1044 || Page.Lcid == 1053 || Page.Lcid == 1035 || Page.Lcid == 1061) {
		decimalSeperator = ',';
	}

	var numDec = 1;
	if (Page.CountryIsoCode == 'ZA') {
		var numDec = 0;
	}
	if (theVal > 36 && Page.CountryIsoCode == 'NO') {
		var numDec = 0;
	}
	if (theVal < 0) {
		var tempVal = '+' + Math.abs(theVal).toFixed(numDec).toString();
	}
	else {
		var tempVal = theVal.toFixed(numDec).toString();
	}
	return tempVal.replace(/\./g, decimalSeperator);
}

clientConverter.prototype.timeUnitToMinutes = function(val, valUnit) {
	switch (valUnit) {
		case 0: return val; break; // JUST MINUTES
		case 1: return val * 60; break; // HOURS -> MINUTES
		case 2: return (val * 24) * 60; break; // DAYS -> MINUTES
	}
}

clientConverter.prototype.toDblDigit = function(val) {
	if (val < 10) {
		return '0' + val
	} else {
		return val
	}
}

var cc = new clientConverter();


/*  TIME FORMATTER  */
var changeInputTime_FormatErrorText
function changeInputTime(obj) {

	if (obj.value == '') { return }

	// external values
	var _timeValue = obj.value
	var _delimiter = ':'
	var _formatErrorText = (changeInputTime_FormatErrorText) ? changeInputTime_FormatErrorText : 'The value: #DateValue#, could not be re-formatted!'

	// create LCID specific regexp patterns
	var pattern_regexp_d, pattern_regexp_dd, pattern_regexp_ddd, pattern_regexp_dddd, pattern_regexp_generic
	var pattern_returnValue

	// these are global
	pattern_regexp_d = /^\d{1}$/
	pattern_regexp_dd = /^\d{2}$/
	pattern_regexp_ddd = /^\d{3}$/
	pattern_regexp_dddd = /^\d{4}$/
	pattern_regexp_generic = /^\d{1,2}(-|\.|\/|,|:)\d{1,2}$/

	pattern_returnValue = 'hh:mm'

	var _patterns = []
	_patterns.add(['d', pattern_regexp_d])
	_patterns.add(['dd', pattern_regexp_dd])
	_patterns.add(['ddd', pattern_regexp_ddd])
	_patterns.add(['dddd', pattern_regexp_dddd])
	_patterns.add(['generic', pattern_regexp_generic])

	var _returnVal
	var _transformOK = false
	var _patternFound = false
	var _validForTransformation = false
	var _parts

	for (var i = 0; i < _patterns.length; i++) {
		//alert('testing: '+ _patterns[i][1])
		if (_timeValue.match(_patterns[i][1])) {
			_parts = changeInputTime_getParts(_timeValue, _patterns[i][0]);
			_patternFound = true;
			break;
		}
	}

	if (!_patternFound && _timeValue != '') { alert(_formatErrorText.replace('#DateValue#', _timeValue)); return }

	if (changeInputTime_isValidHour(_parts[0]) && changeInputTime_isValidMinute(_parts[1])) {
		_returnVal = pattern_returnValue.replace('hh', changeInputDate_padZeros(_parts[0]))
		_returnVal = _returnVal.replace('mm', changeInputDate_padZeros(_parts[1]))
		obj.value = _returnVal
		return true
	}

	if (!_transformOK) { alert(_formatErrorText.replace('#DateValue#', _timeValue)) }
	return _transformOK
}

function changeInputTime_isValidHour(iHour) {
	if (iHour <= 23) return true
}

function changeInputTime_isValidMinute(iMinute) {
	if (iMinute <= 59) return true
}

function changeInputTime_getParts(value, format) {
	switch (format) {
		case 'd':
			var _p = []
			_p[0] = parseInt(value, 10)
			_p[1] = 0
			return _p; break;
		case 'dd':
			var _p = []
			_p[0] = parseInt(value, 10)
			_p[1] = 0
			return _p; break;
		case 'ddd':
			var _p = []
			_p[0] = parseInt(value.substring(0, 1), 10)
			_p[1] = parseInt(value.substring(1, 3), 10)
			return _p; break;
		case 'dddd':
			var _p = []
			_p[0] = parseInt(value.substring(0, 2), 10)
			_p[1] = parseInt(value.substring(2, 4), 10)
			return _p; break;
		case 'generic':
			var _p = []
			ptrn = /^(\d+)(-|\.|\/|,|:)(\d+)$/
			m = value.match(ptrn);
			if (m == null) {
				_p[0] = 0; _p[1] = 0; return
			}
			_p[0] = parseInt(m[1], 10)
			if (m[3].length == 1) {
				m[3] = m[3] + '0';
			}
			_p[1] = (m[3] < 10) ? parseInt('0' + m[3], 10) : parseInt(m[3], 10)
			return _p; break;
	}
}


/*  DATE FORMATTER  */
var changeInputDate_LCID, changeInputDate_Delimiter, changeInputDate_FormatErrorText
function changeInputDate(obj) {

	// external values
	var _dateValue = obj.value
	var _delimiter = (changeInputDate_Delimiter) ? changeInputDate_Delimiter : '-'
	var _lcid = (changeInputDate_LCID) ? changeInputDate_LCID : 1030
	var _formatErrorText = (changeInputDate_FormatErrorText) ? changeInputDate_FormatErrorText : 'The value: #DateValue#, could not be re-formatted!'

	// create LCID specific regexp patterns
	var pattern_regexp_yymmdd, pattern_regexp_yyyymmdd, pattern_regexp_yy_mm_dd, pattern_regexp_yyyy_mm_dd
	var pattern_returnValue

	// these are global
	pattern_regexp_mmdd = /^\d{4}$/
	pattern_regexp_yymmdd = /^\d{6}$/
	pattern_regexp_yyyymmdd = /^\d{8}$/
	pattern_regexp_yy_mm_dd = /^\d{2}(-|\.|\/)\d{2}(-|\.|\/)\d{2}$/
	pattern_regexp_mm_dd = /^\d{2}(-|\.|\/)\d{2}$/

	switch (_lcid) {
		case 1053: case 1033:
			pattern_regexp_yyyy_mm_dd = /^\d{4}(-|\.|\/)\d{2}(-|\.|\/)\d{2}$/
			pattern_returnValue = 'yyyy#mm#dd'
			break;
		case 1030: default:
			pattern_regexp_yyyy_mm_dd = /^\d{2}(-|\.|\/)\d{2}(-|\.|\/)\d{4}$/
			pattern_returnValue = 'dd#mm#yyyy'
			break;
	}

	var _patterns = []
	_patterns.add(['mmdd', pattern_regexp_mmdd])
	_patterns.add(['mm#dd', pattern_regexp_mm_dd])
	_patterns.add(['yymmdd', pattern_regexp_yymmdd])
	_patterns.add(['yyyymmdd', pattern_regexp_yyyymmdd])
	_patterns.add(['yy#mm#dd', pattern_regexp_yy_mm_dd])
	_patterns.add(['yyyy#mm#dd', pattern_regexp_yyyy_mm_dd])

	var _returnVal
	var _transformOK = false
	var _patternFound = false
	var _validForTransformation = false
	var _parts

	for (var i = 0; i < _patterns.length; i++) {
		//alert('testing: '+ _patterns[i][1])
		if (_dateValue.match(_patterns[i][1])) {
			_parts = changeInputDate_getParts(_lcid, _dateValue, _patterns[i][0]);
			_patternFound = true;
			break;
		}
	}

	if (!_patternFound) { alert(_formatErrorText.replace('#DateValue#', _dateValue)); return }

	if (changeInputDate_isValidMonth(_parts[1]) && changeInputDate_isValidDay(_parts[2])) {

		_returnVal = pattern_returnValue.replace('yyyy', changeInputDate_getFullYear(_parts[0]))
		_returnVal = _returnVal.replace('mm', _parts[1])
		_returnVal = _returnVal.replace('dd', _parts[2])
		while (_returnVal.indexOf('#') >= 0) { _returnVal = _returnVal.replace('#', _delimiter) }
		obj.value = _returnVal
		return true
	}

	if (!_transformOK) { alert(_formatErrorText.replace('#DateValue#', _dateValue)) }
	return _transformOK
}

function changeInputDate_isValidMonth(iMonth) {
	if (iMonth <= 12) return true
}

function changeInputDate_isValidDay(iDay) {
	if (iDay <= 31) return true
}

function changeInputDate_getFullYear(iYear) {
	if (parseInt(iYear, 10) > 1000) return iYear
	if (parseInt(iYear, 10) < 20) {
		return '20' + changeInputDate_padZeros(iYear)
	} else {
		return '19' + changeInputDate_padZeros(iYear)
	}
}

function changeInputDate_padZeros(val) {
	if (parseInt(val, 10) < 10) {
		return '0' + parseInt(val, 10)
	}
	return parseInt(val, 10)
}

function changeInputDate_getParts(lcid, value, format) {
	switch (format) {
		case 'mmdd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = new Date().getFullYear()
					_p[1] = value.substring(0, 2)
					_p[2] = value.substring(2, 4)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = new Date().getFullYear()
					_p[1] = value.substring(2, 4)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
		case 'mm#dd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = new Date().getFullYear()
					_p[1] = value.substring(0, 2)
					_p[2] = value.substring(3, 5)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = new Date().getFullYear()
					_p[1] = value.substring(3, 5)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
		case 'yymmdd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = value.substring(0, 2)
					_p[1] = value.substring(2, 4)
					_p[2] = value.substring(4, 6)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = value.substring(4, 6)
					_p[1] = value.substring(2, 4)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
		case 'yyyymmdd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = value.substring(0, 4)
					_p[1] = value.substring(4, 6)
					_p[2] = value.substring(6, 8)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = value.substring(4, 8)
					_p[1] = value.substring(2, 4)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
		case 'yy#mm#dd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = value.substring(0, 2)
					_p[1] = value.substring(3, 5)
					_p[2] = value.substring(6, 8)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = value.substring(6, 8)
					_p[1] = value.substring(3, 5)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
		case 'yyyy#mm#dd':
			switch (lcid) {
				case 1053: case 1033:
					var _p = []
					_p[0] = value.substring(0, 4)
					_p[1] = value.substring(5, 7)
					_p[2] = value.substring(8, 10)
					return _p; break;
				case 1030: default:
					var _p = []
					_p[0] = value.substring(6, 10)
					_p[1] = value.substring(3, 5)
					_p[2] = value.substring(0, 2)
					return _p; break;
			}
			break;
	}
}
