/**************************************
	Comparator Objects
**************************************/


function Comparator() {
	this.compare = comparator_compare;
	this.toString = comparator_toString;
}

function comparator_compare(value1, value2) {
	if 		((!value1 && value2) || (value1 < value2)) return -1;
	else if ((value1 && !value2) || (value1 > value2)) return 1;
	else return 0;
}

function comparator_toString() {
	return "Comparator";
}

function DateComparator() {
	this.compare = dateComparator_compare;
	this.toString = dateComparator_toString;
}

function dateComparator_toString() {
	return "DateComparator";
}

function dateComparator_compare(value1, value2) {
	try {
		var date1 = new Date(value1);
		var date2 = new Date(value2);
		
		return comparator_compare(date1,date2);
	} catch (e) {
		return 0;
	}
}


function StringComparator(caseSensitive) {
	this.caseSensitive = caseSensitive;
	this.compare = stringComparator_compare;
	this.toString = stringComparator_toString;
}

function stringComparator_toString() {
	return "StringComparator";
}

function stringComparator_compare(value1, value2) {
	try {
		if (!this.caseSensitive) {
			value1 = value1.toLowerCase();	
			value2 = value2.toLowerCase();	
		}
	} catch (e) {
		//ignored
	}	
	
	return comparator_compare(value1,value2);
}


function NumberComparator() {
	this.compare = numberComparator_compare;
	this.toString = numberComparator_toString;
}

function numberComparator_compare(value1, value2) {
	try {
		var number1 = new Number(value1);
		var number2 = new Number(value2);
		
		return comparator_compare(number1,number2);
	} catch (e) {
		return comparator_compare(value1,value2);
	}
}

function numberComparator_toString() {
	return "NumberComparator";
}