///////////////////////////////////////////////////////////////////////////////
// Basic vs1
// dependencies: none;
// Copyright 2004, N-Soluções. All rights Reserved.
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// Strings
///////////////////////////////////////////////////////////////////////////////

function Strings_isEmpty(str) {
	return !str || !str.length;
}

function Strings_removeLeading(str, pattern) {
	if(Strings_isEmpty(str)) {
		return "";
	}
	else {
		var firstPos = -1;
		for(var i=0; i<str.length; i++) {
			if(str.charAt(i) != pattern) {
				firstPos = i;
				break;			
			}
		}
		if(firstPos == -1) {
			return "";
		}
		else {
			return str.substring(firstPos);
		}
	}
}

function Strings_removeTrailing(str, pattern) {
	if(Strings_isEmpty(str)) {
		return "";
	}
	else {
		var lastPos = -1;
		for(var j=(str.length)-1; j>=0; j--) {
			if(str.charAt(j) != pattern) {
				lastPos = j;
				break;
			}
		}
		if(lastPos == -1) {
			return "";
		}
		else {
			return str.substring(0, lastPos+1);
		}
	}
}

function Strings_remove(str, pattern) {
	return Strings_removeTrailing(Strings_removeLeading(str, pattern), pattern);
}

function Strings_replace(str, oldChar, newChar) {
	if(Strings_isEmpty(str)) {
		return "";
	}
	else {
		var convertedString = str.split(oldChar);
		convertedString = convertedString.join(newChar);
		return convertedString;
	}
}

function Strings_trim(str) {
	if(Strings_isEmpty(str)) {
		return "";
	}
	else {
		str = Strings_replace(str, "\n", " ");
		str = Strings_replace(str, "\t", " ");
		str = Strings_replace(str, "\b", " ");
		return Strings_remove(str, " ");
	}
}

function Strings_toInteger(str) {
	//! replace implementation for parseInt(str, [10]);
	if(Strings_isEmpty(str)) {
		return "";
	}
	else {
		// IE bug:
		str = Strings_removeLeading(str, '0');
		if(Strings_isEmpty(str)) {
			return 0;
		}
		else {
			return parseInt(str);
		}
	}
}

function Strings_valueOf(number, llength, rlength) {
	if(!llength) llength = 0;
	if(!rlength) rlength = 0;
	var array = (number+"").split(".");
	var lead = "";

	// First step: separation of functions:

	// valueOf(int number, int length)
	if(array.length == 1 && rlength == 0) {
		var str = number + "";
		if(str.length < llength) {
			for(var i=str.length; i<llength; i++) {
				lead += "0";
			}
		}
		return lead + number;
	}

	// valueOf(double number, int llength, int rlength)
	else {
		if(array.length == 1) {
			array = Array(array[0], "0");
		}
		if(array[0].length < llength) {
			for(var j=array[0].length; j<llength; j++) {
				lead += "0";
			}
		}
		// Note: float.toPrecision's argument considers the left of the number also.
		var precision = array[0].length + array[1].length;
		if(rlength > 0) {
			precision = array[0].length + rlength;
		}
		return lead + parseFloat(array[0]+"."+array[1]).toPrecision(precision);
	}
}

function Strings_class() {
	this.isEmpty = Strings_isEmpty;
	this.removeLeading = Strings_removeLeading;
	this.removeTrailing = Strings_removeTrailing;
	this.remove = Strings_remove;
	this.replace = Strings_replace;
	this.trim = Strings_trim;
	this.toInteger = Strings_toInteger;
	this.valueOf = Strings_valueOf;
}

var Strings = new Strings_class();

///////////////////////////////////////////////////////////////////////////////
// Dates
///////////////////////////////////////////////////////////////////////////////

function Dates_isLeap(year) {
	return ((year%400==0)||((year%4==0)&&(year%100!=0)));
}

function Dates_getYear(date) {
	return date.getYear() > 1900 ? date.getYear() : date.getYear() + 1900;
}

function Dates_toString(date) {
	return Dates_getYear(date)+"-"+Strings_valueOf(date.getMonth()+1, 2)+"-"+Strings_valueOf(date.getDate(), 2);
}

function Dates_valueOf(str) {
	if(str && str.length > 0) {
		if(str.indexOf(" ") != -1) {
			delimiter = " ";
		}
		else if(str.indexOf("/") != -1) {
			delimiter = "/";
		}
		else if(str.indexOf("-") != -1) {
			delimiter = "-";
		}
		else {
			return false;
		}
		var array = str.split(delimiter);
		var year = 0;
		var day = 0;
		if(array[0].length == 4) {
			year = Strings.toInteger(array[0]);
			day = Strings.toInteger(array[2]);
		}
		else {
			day = Strings.toInteger(array[0]);
			year = Strings.toInteger(array[2]);
		}
		// year:
		if(year < 1900 || year > 2500) {
			return false;
		}
		// month:
		var month = 0;
		var months = [["JAN", 31], ["FEV", 28], ["MAR", 31], ["ABR", 30], ["MAI", 31], ["JUN", 30], ["JUL", 31], ["AGO", 31], ["SET", 30], ["OUT", 31], ["NOV", 30], ["DEZ", 31]];
		if(isNaN(array[1])) {
			for(var j=0; j<months.length; j++) {
				if(array[1].toUpperCase() == months[j][0]) {
					month = j+1;
				}
			}
		}
		else {
			month = Strings.toInteger(array[1]);
		}
		if(month < 1 || month > 12) {
			return false;
		}
		// day:
		if(day < 1 || day > months[month-1][1]) {
			if(month==2 && Dates_isLeap(year) && day==29) {
				// noop;
			}
			else {
				return false;
			}
		}
		// build Date object:
		var date = new Date();
		date.setYear(year);
		date.setMonth(month-1);
		date.setDate(day);
		// reset time attributes:
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);
		return date;
	}
	else {
		return false;
	}
}

function Dates_equals(date1, date2) {
	return date1.getYear()==date2.getYear() && date1.getMonth()==date2.getMonth() && date1.getDate()==date2.getDate(); 
}

function Dates_class() {
	this.isLeap = Dates_isLeap;
	this.getYear = Dates_getYear;
	this.toString = Dates_toString;
	this.valueOf = Dates_valueOf;
	this.equals = Dates_equals;
}

var Dates = new Dates_class();

