/**
 * Standard form validator...
 *
 * @author	Bobo Wieland bobo@plucera.se
 * @version 1.0b 2006-04-05
 **/

function Validator() {
	switch(arguments.length){
		case 1 :
			this.invalidOption = arguments[0];
			break;
		default:
	}

	function valueSet(str){
		str = str.trim();
		return (str.length) ? true : false;
	} this.valueSet = valueSet;

	function isEmail(str){
		var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/;
		var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.(com|net|org|edu|biz|gov|info|aero|cat|coop|int|jobs|mil|mobi|museum|name|pro|tel|travel|[a-z]{2}|[0-9]{1,3})(\]?)$/;
		return (!reg1.test(str) && reg2.test(str)) ? true : false;
	} this.isEmail = isEmail;

	function isPhone(pn) {
		var reg = /[^0-9\-\[\]\(\)]+/;
		var pref = '';
		pn = pn.replace(/(\s*)/g, "");
		if (pn.charAt(0) == '+') {
			pn = pn.substr(1,pn.length-1);
			pref = '+';
		}
		return (pn.length && !reg.test(pn)) ? pref+pn : false;
	} this.isPhone = isPhone;

	function isDate(dateStr){
		/* Known limitation to be fixed: 29th of Feb is allways valid... */
		var daynum = Array(31,29,31,30,31,30,31,31,30,31,30,31);
		var year;
		var month;
		var day;
		var correct = false;
		dateStr = dateStr.replace(/(\s*)/g, "");
		switch(dateStr.length) {
			case 6:
				year = parseInt("20" + dateStr.substring(0,2));
				month = parseInt(dateStr.substring(2,4),10);
				day = parseInt(dateStr.substring(4),10);
				correct = true;
			break;
			case 8:
				var separator = dateStr.indexOf("-");
				if (separator == -1) {
					year = parseInt("20" + dateStr.substring(2,4));
					month = parseInt(dateStr.substring(4,6),10);
					day = parseInt(dateStr.substring(6),10);
					correct = true;
				}
				else if (separator == 2 && dateStr.lastIndexOf("-") == 5) {
					year = parseInt("20" + dateStr.substring(0,2));
					month = parseInt(dateStr.substring(3,5),10);
					day = parseInt(dateStr.substring(6),10);
					correct = true;
				}
			break;
			case 10:
				var separator = dateStr.indexOf("-");
				if (separator == 4 && dateStr.lastIndexOf("-") == 7) {
					year = parseInt("20" + dateStr.substring(2,4));
					month = parseInt(dateStr.substring(5,7),10);
					day = parseInt(dateStr.substring(8),10);
					correct = true;
				}
			break;
		}
		if (correct && month > 0 && month <= 12 && day > 0 && day <= daynum[month-1]) {
			dateStr = year + "-";
			if (month < 10) { dateStr += "0"; }
			dateStr += month + "-";
			if (day < 10) {	dateStr += "0"; }
			dateStr += day;
		}
		else {
			dateStr = false;
		}
		return dateStr;
	} this.isDate = isDate;


	function dateInRange() {
		var retVal;
		if (arguments.length == 3) {
			var dates = new Array(3);
			for (i = 0; i < 3; i++) {
				var y = 2000 + parseInt(arguments[i].substring(2,4),10);
				var m = (parseInt(arguments[i].substring(5,7),10)-1);
				var d = parseInt(arguments[i].substring(8),10);
				dates[i] = (new Date(y,m,d)).getTime();
			}
			if (dates[0] >= dates[1] && dates[0] <= dates[2]) {
				retVal = true;
			}
			else {
				retVal = false;
			}
		}
		else {
			retVal = -1;
		}
		return retVal;
	} this.dateInRange = dateInRange;

	function isTime(timeStr){
		var hour;
		var min;
		var correct = false;
		timeStr = timeStr.replace(/(\s*)/g, "");
		var separator = timeStr.indexOf(":");
		if (separator == -1) {
			if (timeStr.length == 3) {
				hour = parseInt(timeStr.substring(0,1),10);
				min = parseInt(timeStr.substring(1),10);
				correct = true;
			}
			else {
				hour = parseInt(timeStr.substring(0,2),10);
				min = parseInt(timeStr.substring(2),10);
				correct = true;
			}
		}
		else {
			hour = parseInt(timeStr.substring(0,separator),10);
			min = parseInt(timeStr.substring(separator+1),10);
			correct = true;
		}
		if (correct && hour >= 0 && hour < 24 && min >= 0 && min < 60) {
			timeStr = "";
			if (hour < 10) { timeStr += "0"; }
			timeStr += hour + ":";
			if (min < 10) {	timeStr += "0"; }
			timeStr += min;
		}
		else {
			timeStr = false;
		}
		return timeStr;
	} this.isTime = isTime;

	function validOption(selectBox) {
		return (selectBox.options[selectBox.selectedIndex].value == this.invalidOption) ? false : true;
	} this.validOption = validOption;

	function validPassword() {
		var retVal = true;
		var reg = /\W/;
		switch(arguments.length){
			case 1:
				if (!arguments[0].length || reg.test(arguments[0])) { retVal = false; }
			break;
			case 2:
				if (!arguments[0].length || arguments[0] != arguments[1] || reg.test(arguments[0])) { retVal = false; }
			break;
			default:
		}
		return retVal;
	} this.validPassword = validPassword;

	function digits() {
		d = arguments[0];
		d = d.replace(/(\s*)/g, "");

		switch(arguments.length){
			case 1:
				if (d.match(/\D/)) { d = false; }
			break;
			case 2:
				if (d.match(/\D/) || d.length != arguments[1]) { d = false; }
			break;
			default:
				d = false;
		}
		return d;
	} this.digits = digits;

	function isPersonNummer(d6_8,d4,strict) {
		var retVal = false;
		var part1 = this.digits(d6_8);
		var part2 = this.digits(d4);
		if (part1 != false && part1.length == 6 && this.isDate(part1)) {
			if (!strict) { retVal = true; }
			else if (strict && part2 != false && part2.length == 4) {
				pnr = "" + part1 + part2;
				var ctrlDigit = 0;
				for (var i = 0; i < 9; i++) {
					digit = parseInt(pnr.charAt(i));
					if (i%2) {
						ctrlDigit += digit;
					}
					else if (digit < 5) {
						ctrlDigit += digit*2;
					}
					else {
						ctrlDigit += (digit*2)-9;
					}
				}
				ctrlDigit = ctrlDigit%10;
				if (ctrlDigit) {
					ctrlDigit = 10 - ctrlDigit;
				}
				if (ctrlDigit == pnr.charAt(9)) {
					retVal = true;
				}
			}
		}
		return retVal;
	} this.isPersonNummer = isPersonNummer;



	function done(f){
		jsok = document.createElement("input");
		jsok.setAttribute("type", "hidden");
		jsok.setAttribute("name", "jsok");
		f.appendChild(jsok);
	} this.done = done;

};

String.prototype.trim = function() {
	a = this.replace(/^\s+/, '');
	return a.replace(/\s+$/, '');
};
