Date.prototype.getDOY = function() {
	var onejan = new Date(this.getFullYear(),0,1);
	return Math.ceil((this - onejan) / 86400000);
}

Date.prototype.getJulian = function() {
return Math.floor((this / 86400000) -
(this.getTimezoneOffset()/1440) + 2440587.5);
}

function validEmail(str) {
var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
return reg.test(str);
}

function empty(str) {
var reg = /\w+/;
//alert('is this string: ('+str+') empty? -> '+!reg.test(str).toString);
if (reg.test(str) == true) {
	return false;
} else {
	return true;
}
}

function validYear(str) {
var userYear = parseInt(str);
var d = new Date();
var thisYear = d.getFullYear();
if (isNaN(userYear) || userYear < 1999 || userYear > thisYear) {
	return false;
} else {
	return true;
}
}

function validSerial(serial) {
if (!(serial.length == 12)) return "length";
var r = /^(\d{2}|[A-Za-z]{2})(\d{2})(\d{2})([0-3]{1}\d{2})(\d{3})$/i;
var ar = r.exec(serial);
var productCode = ar[1];
var productRev = parseInt(ar[2]);
var productYear = parseInt(ar[3]);
var productDay = parseInt(ar[4]);
var productNumber = parseInt(ar[5]);
if (productDay > 365) return "days";
if (productYear == 99) {
	productYear += 1900;
} else {
	productYear += 2000;
}
return productCode+','+productYear+','+productDay;
}