if ('undefined' == typeof Node)
Node = { ELEMENT_NODE: 1, TEXT_NODE: 3 };
REGEX_AUTO_FIELD = /^(DPC_)?[^_]+(_Req)?((_(Int|Dbl|Date|Name|Mail|Password|Address|PostalCode|Phone|Comment)(_[0-9.]+){0,2})|(_DD-MM-YYYY)|(_MM-DD-YYYY))?$/;           
REGEX_BLANK = /^\s*$/;
REGEX_DAY = /^(0?[1-9]|[1-2][0-9]|3[01])$/;
REGEX_MONTH = /^(0?[1-9]|1[0-2])$/;                                     
REGEX_TYPED_FIELD = /_(Int|Dbl|Date|Name|Mail|Password|Address|PostalCode|Phone|Comment)(_([0-9.]+))?(_([0-9.]+))?$/;
REGEX_YEAR = /^[0-9]{2,4}$/;
REGEX_NAME = /^(\s)*(([a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377]+)((\s)*(\s|-)(\s)*([a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377]+))*)(\s)*$/;
REGEX_MAIL = /^[^@]+@(([\w\-]+\.){1,4}[a-zA-Z]{2,4}|(([01]?\d?\d|2[0-4]\d|25[0-5])\.){3}([01]?\d?\d|2[0-4]\d|25[0-5]))$/;
REGEX_PASSWORD = /^([A-Za-z0-9_]){7,14}$/;    
REGEX_ADDRESS = /^(\s)*(([0-9a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377.!:,;()\"&?]+)((\s)*(\s|-|\')(\s)*([0-9a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377.!:,;()\"&?]+))*)(\s)*$/;                               
REGEX_COMMENT = /^(\s)*(([0-9a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377.!:,;()\"&?]+)((\s)*(\s|-|\')(\s)*([0-9a-zA-\274\275\276\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\370\371\372\373\374\375\377.!:,;()\"&?]+))*)(\s)*$/;                               
REGEX_POSTALCODE = /^(\s)*(([0-9]+)((\s)*(\s|-)(\s)*([0-9]+))*)(\s)*$/;
REGEX_PHONE = /^(\s)*(([0-9]+)((\s)*(\s|-)(\s)*([0-9]+))*)(\s)*$/;    
function getFormattedDate(date,langue)
{
var currentDay = date.getDate();                                   
var currentMonth = date.getMonth();
currentMonth++;
var currentYear = date.getFullYear();
if(currentDay < 10)
{
currentDay = '0'+currentDay;
} 
if(currentMonth < 10)
{
currentMonth = '0'+currentMonth;
} 
switch(langue)
{
case 'fr':
var formattedDate = currentDay + "-" + currentMonth + "-" + currentYear;
break;
case 'en':
var formattedDate = currentMonth + "-" + currentDay + "-" + currentYear;
break;
}
return formattedDate;
}
function compare(date1, date2)
{
diff = date1.getTime()-date2.getTime();
return (diff==0?diff:diff/Math.abs(diff));
}
function checkForm(e) 
{       
e = e || window.event;
var form = e.target || e.srcElement;
var errors = '';
var faulty = null;
if(!form.elements)
{
form = form.form;
}
for (var index = 0; index < form.elements.length; ++index) 
{
var field = form.elements.item(index);
if (!field.id.match(REGEX_AUTO_FIELD))
{
continue;
}
var value = getFieldValue(field);
if(field.id == DATE_ID)
{
if('fr' == LANGUE)
{
var day = value.substring(0,2);
var month = value.substring(3,5);
}
else if('en' == LANGUE) 
{
var month = value.substring(0,2);
var day = value.substring(3,5);
}
var year = value.substring(6,10);
var internautDate = new Date();
internautDate.setDate(day);
month--;
internautDate.setMonth(month);
internautDate.setFullYear(year); 
var todayDate = new Date();
var diff = compare(internautDate, todayDate); 
if(diff <= 0)
{
var todayFormattedDate = getFormattedDate(todayDate,LANGUE);
setFieldValue(field,todayFormattedDate);
} 
else if(diff == 1)
{
var todayPlusOneYearDate = new Date();
todayPlusOneYearDate.setDate(todayDate.getDate()+365);
diff = compare(todayPlusOneYearDate,internautDate);
switch(diff)
{
case 1:
break;
case 0:
break;
default:
var todayPlusOneYearFormattedDate = getFormattedDate(todayPlusOneYearDate,'fr');  
setFieldValue(field,todayPlusOneYearFormattedDate);
break;
}
}
}
if (field.id.match(/_Req/) && value.match(REGEX_BLANK)) 
{
if(field.id == DATE_ID)
{
errors += MSG_THE_CALENDAR + MSG_BLANK + '\n';
} 
else
{
errors += getFieldName(field) + MSG_BLANK + '\n';  
}
faulty = faulty || field;
continue;
}
var match = field.id.match(REGEX_TYPED_FIELD);
if (match) 
{
var type = match[1];
var min = match[3];
var max = match[5];
isRequired = 0;
if(field.id.match(/_Req/))
{
isRequired = 1;
}
var error ='';
if(isRequired)
{
error = checkTypedField(value, type, min, max);
}
else if(!value.match(REGEX_BLANK))
{
error = checkTypedField(value, type, min, max);
}
if (error) 
{
errors += getFieldName(field) + error + '\n';
faulty = faulty || field;
}
}
}
if (!faulty)
{
return true; 
}
stopEvent(e);
alert(errors);
faulty.focus();
return false;
}
function checkTypedField(value, type, min, max) {
min = min || Number.NEGATIVE_INFINITY;
max = max || Number.POSITIVE_INFINITY;
var val;
var myRegExp;
if ('Int' == type) {
try {
val = parseInt(value, 10);
if (String(val) != value)
throw val;
} catch (e) {
return MSG_NOT_AN_INTEGER;
}
}
if ('Dbl' == type) {
try {
val = parseFloat(value);
if (String(val) != value)
throw val;
} catch (e) {
return MSG_NOT_A_DOUBLE;
}
}
if ('Int' == type || 'Dbl' == type) {
if (val < min)
return MSG_TOO_LOW;
if (val > max)
return MSG_TOO_HIGH;
}
if ('Date' == type) {
var comps = value.split('/');
if (3 != comps.length || !comps[0].match(REGEX_DAY) ||
!comps[1].match(REGEX_MONTH) ||
!comps[2].match(REGEX_YEAR))
return MSG_NOT_A_DATE;
}
if('Name' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
if(val)
{
myRegExp = REGEX_NAME;
var md = value.match(myRegExp);
if(!md){
return MSG_NOT_VALID;
}
}
}
if('Mail' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
myRegExp = REGEX_MAIL;
var md = myRegExp.exec(value);
if(!md){
return MSG_NOT_VALID;
}
}
if('Password' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
myRegExp = REGEX_PASSWORD;
var md = myRegExp.exec(value);
if(!md){
return (MSG_NOT_VALID); 
}
}
if('Address' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
if(val)
{
myRegExp = REGEX_ADDRESS;
var md = myRegExp.exec(value);
if(!md){
return MSG_NOT_VALID;
}
}
}
if('Comment' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
myRegExp = REGEX_COMMENT;
var md = myRegExp.exec(value);
if(!md){
return MSG_NOT_VALID;
}
}
if('PostalCode' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
myRegExp = REGEX_POSTALCODE;
var md = myRegExp.exec(value);
if(!md){
return MSG_NOT_VALID;
}
} 
if('Phone' == type){
val = value.length;
if(val < min)
return MSG_TOO_LOW;
if(val > max)
return MSG_TOO_HIGH;    
myRegExp = REGEX_PHONE;
var md = myRegExp.exec(value);
if(!md){
return MSG_NOT_VALID;
}
} 
return null;
} 
function getFieldName(field) {
var label = getLabelFor(field);
if (!label)
return field.name;
var text = '';
var node = label.firstChild;
while (true) {
if (Node.ELEMENT_NODE == node.nodeType && node.hasChildNodes())
node = node.firstChild;
else if (Node.TEXT_NODE == node.nodeType)
text += node.nodeValue;
if (node.nextSibling)
node = node.nextSibling;
else {
node = node.parentNode;
if (node == label)
break;
node = node.nextSibling;
}
}
return text;
}
function getFieldValue(field) {
if ('TEXTAREA' == field.tagName)
return field.value;
if ('INPUT' == field.tagName)
return field.value;
if ('SELECT' == field.tagName) {
var value = '';
if (-1 < field.selectedIndex) {
var opt = field.options[field.selectedIndex];
value = opt.value;
if (!value && !('value' in opt))
value = opt.text;
}
return value;
}
return '';
}
function getLabelFor(field) {
var labels = document.getElementsByTagName('label');
for (var index = 0; index < labels.length; ++index) {
var label = labels.item(index);
if (label.htmlFor == field.id)
return label;
}
return null;
}
function setFieldValue(field,newValue) 
{
if ('INPUT' == field.tagName)
{
field.value = newValue;
return;
}
}
function stopEvent(e) {
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
} else {
e.cancelBubble = true;
e.returnValue = false;
}
}                                                                                                