function isDigit(c) {return ((c >= "0") && (c <= "9"));}
function isAlpha(c) {var valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ àâäéèêëîïôöùûü'- ";if (valid.indexOf(c) == -1) return false;else return true;}
function startsWith(str,tok) {if (str.length>=tok.length) {if (str.substr(0,tok.length)==tok) {return(true);} else {return(false);}} else {return(false);}}
function getForAttribute(elem) {/* All - IE */var str = elem.getAttribute("for");/* IE */if (str==null) str = elem.getAttribute("htmlFor");return(str);}
function getLabelName(frm,en) {var str = "";for (var i=0; i<frm.getElementsByTagName("label").length; i++) {el_la = frm.getElementsByTagName("label")[i];l_i=getForAttribute(el_la);if (en==l_i) {str = el_la.firstChild.nodeValue;}}return(str);}
function getRadioValue(rGN) {radios = document.getElementsByName(rGN);for (i = 0; i < radios.length; i++) {if (radios[i].checked) return("OK");}return("");}
function getMultiValue(rGN) {s = document.getElementsByName(rGN);t = s[0];for (i = 0; i < t.length; i++) {if (t[i].selected) {return("OK");}}return("");}
function checkDigit(s) {var result=true;for (i=0; i<s.length; i++)result = result && isDigit(s.charAt(i));return !result;}
function checkAlpha(s) {var result=true;for (i=0; i<s.length; i++) {result = result && isAlpha(s.charAt(i));}return !result;}
function checkDate(s) {var c=true;var d=date_format;var db=d.indexOf("DD");var mb=d.indexOf("MM");var yb=d.indexOf("YYYY");var yl=4;var yt="YYYY";if (yb==-1) {yb=d.indexOf("YY");yl=2;yt="YY";}if ((db==-1)||(mb==-1)||(yb==-1)) {c=false;} else {if (s.length!=d.length) {c=false;} else {var stmp=s.replace(s.substr(yb,yl),"").replace(s.substr(db,2),"").replace(s.substr(mb,2),"");var sd_f=d.replace("DD","").replace("MM","").replace(yt,"");if (stmp!=sd_f) {c=false;} else {if (stmp.length>0) {var separator=stmp.substr(0,1);} else {var separator="";}var j=s.substr(db,2);var m=s.substr(mb,2);var a=s.substr(yb,yl);var bi=((parseInt(a,10) % 4 )==0);if (((m=="01") || (m=="03") ||(m=="05") || (m=="07") || (m=="08") || (m=="10") || (m=="12")) && ((Math.round(j)>=1) && (Math.round(j)<=31))) {c=true;}else {if (((m=="04")||(m=="06")||(m=="09")||(m=="11")) && ((Math.round(j)>=1) && (Math.round(j)<=30))) {c=true;}else {if (bi) {c=(((Math.round(j)>=1) && (Math.round(j)<=29)) && (m=="02"));}else {c=(((Math.round(j)>=1) && (Math.round(j)<=28)) && (m=="02"));}}}}}}return !c;}
function checkMacId(macid) {var macidRE=/^[0-9A-Fa-f][0-9A-Fa-f]-[0-9A-Fa-f][0-9A-Fa-f]-[0-9A-Fa-f][0-9A-Fa-f]-[0-9A-Fa-f][0-9A-Fa-f]-[0-9A-Fa-f][0-9A-Fa-f]-[0-9A-Fa-f][0-9A-Fa-f]$/;if (macid.match(macidRE)==null)return true;else return false;}
function checkEmail (emailStr) {var emailPat=/^(.+)@(.+)$/;var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";var validChars="\[^\\s" + specialChars + "\]";var quotedUser="(\"[^\"]*\")";var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;var atom=validChars + '+';var word="(" + atom + "|" + quotedUser + ")";var userPat=new RegExp("^" + word + "(\\." + word + ")*$");var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");var matchArray=emailStr.match(emailPat);if (matchArray==null) {return true;}var user=matchArray[1];var domain=matchArray[2];if (user.match(userPat)==null) {return true;}var IPArray=domain.match(ipDomainPat);if (IPArray!=null) {for (var i=1;i<=4;i++) {if (IPArray[i]>255){return true;}}return false;}var domainArray=domain.match(domainPat);if (domainArray==null) {return true;}var atomPat=new RegExp(atom,"g");var domArr=domain.match(atomPat);var len=domArr.length;if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>3) {return true;}if (len<2) {return true;}if (emailStr.length>64){return true;}return false;}
function checkLength(c,i) {if (c.length<i){return true;}else{return false;}}
function checkIP(ip) {var ipRE=/^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;if (ip.match(ipRE)==null)return true;else return false;}
function checkUrl(url) {var urlRE=/^(http:\/\/|https:\/\/|ftp:\/\/){1}(.+)(.+){1,2}$/;if (url.match(urlRE)==null)return true;else return false;}
function checkSMS(s) {return !(/^[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()èéùàüñöä+'\"&%\/\\*.:,;<>=?@!# -]+$/).test(s);}
function checkPWD(s) {return !(/^[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]+$/).test(s);}
function checkMobilePhone(s) {
	if (s.length!=10) {
		return true;
	} else if (!startsWith(s,"06")) {
		return true;
	} else if (checkDigit(s)) {
		return true;
	} else {
		return false;
	}
}

function check_handler(frm,str,check,msgs,name) {
	var ret = false;
	var paramfor = "";
	if (check=="required") {if (str=="") {ret=true;alert(name+":\n"+msgs[1]);}}
	else if ((str!="")&&(check=="alpha")) {if(checkAlpha(str)) {ret=true;alert(name+":\n"+msgs[2]);}}
	else if ((str!="")&&(check=="pwd")) {if(checkPWD(str)) {ret=true;alert(name+":\n"+msgs[13]);}}
	else if ((str!="")&&(check=="digit")) {if(checkDigit(str)) {ret=true;alert(name+":\n"+msgs[3]);}}
	else if ((str!="")&&(check=="macid")) {if(checkMacId(str)) {ret=true;alert(name+":\n"+msgs[4]);}}
	else if ((str!="")&&(check=="email")) {if(checkEmail(str)) {ret=true;alert(name+":\n"+msgs[5]);}}
	else if ((str!="")&&(check=="date")) {if(checkDate(str)) {ret=true;alert(name+":\n"+msgs[6]);}}
	else if (startsWith(check,"EQ")) {if (str.length>0){if (check.length>=2) {var param = check.substr(2,check.length);elem = document.getElementById("fo_"+param);if (elem==undefined) {alert("Syntax ERROR for parameter '"+name+"' and check '"+check+"' ! "+param+" is undefined !");ret = true;}else {if (str!=elem.value) {paramfor = getLabelName(frm,"fo_"+param);ret = true;}}}else {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! EQpassword1 for example !");ret = true;}if (ret) {alert(name+":\n"+msgs[11]+paramfor);}}}
	else if (startsWith(check,"lenEQ")) {if (str.length>0){if (check.length>=5) {var val = parseInt(check.substr(5,check.length),10);if (isNaN(val)) {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenEQ4 for example !");ret = true;}else {if (str.length!=val) {ret = true;}}} else {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenEQ4 for example !");ret = true;} if (ret){alert(name+":\n"+msgs[7]);}}}
	else if (startsWith(check,"lenLT")) {if (str.length>0){if (check.length>=5) {var val = parseInt(check.substr(5,check.length),10);if (isNaN(val)) {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenLT4 for example !");ret = true;}else {if (str.length>val) {ret = true;}}} else {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenLT4 for example !");ret = true;} if (ret){alert(name+":\n"+msgs[7]);}}}
	else if (startsWith(check,"lenGT")) {if (str.length>0){if (check.length>=5) {var val = parseInt(check.substr(5,check.length),10);if (isNaN(val)) {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenGT4 for example !");ret = true;}else {if (str.length<val) {ret = true;}}} else {alert("Syntax ERROR for value '"+str+"' and check '"+check+"' ! lenGT4 for example !");ret = true;} if (ret){alert(name+":\n"+msgs[7]);}}}
	else if ((str!="")&&(check=="url")) {if(checkUrl(str)) {ret=true;alert(name+":\n"+msgs[8]);}}
	else if ((str!="")&&(check=="ip")) {if(checkIP(str)) {ret=true;alert(name+":\n"+msgs[9]);}}
	else if ((str!="")&&(check=="sms")) {if(checkSMS(str)) {ret=true;alert(name+":\n"+msgs[10]);}}
	else if ((str!="")&&(check=="mobilefr")) {if(checkMobilePhone(str)) {ret=true;alert(name+":\n"+msgs[12]);}}
	return(ret);
}

var s_f_lock = 0;
function submit_form(errtxt) {if (s_f_lock==1) {alert(errtxt);return false;} else {s_f_lock = 1;return true;}}

var s_l_lock = 0;
function submit_link(link,errtxt) {if (s_l_lock==1) {alert(errtxt);} else {s_l_lock = 1;document.location.href=link; }}

function redirect_link(link) { document.location.href=link; }

function readonly_form(msgs) {
	alert(msgs);
	return(false);
}

var c_f_lock = 0;
function check_form(frm,msgs) {
	if (c_f_lock==1) {alert(msgs[0]);return(false);}
	if(!document.getElementById || !document.createTextNode){return(true);}
	for (var i=0; i<frm.getElementsByTagName("label").length; i++) {
		element_label = frm.getElementsByTagName("label")[i];
		lbl_name = element_label.firstChild.nodeValue;
		lbl_id   = getForAttribute(element_label);
		// Only labels starting with fo_...
		if (lbl_id.length>3) {
			var lbl_kind = lbl_id.substr(0,3);
			if (lbl_kind=="fo_") {
				elem = document.getElementById(lbl_id);
				if (!elem) elem = document.getElementById(lbl_id+"0"); // for radio and checkbox
				if (elem) {
					// Element found !
					var eltype  = elem.type;
					var elvalue = elem.value;
					var elname  = elem.name;
					var name    = lbl_id.substr(3,lbl_id.length);
					var chec = document.getElementById('ch_'+name);
					// Is there something to check for this element ?
					if (chec) { 
						checklist = chec.value.split(',');
						for (var j = 0; j<checklist.length; j++) {
							var ret = true;
							if ((eltype=="text")||(eltype=="password")||(eltype=="file")||(eltype=="textarea")||(eltype=="select-one")) {ret = check_handler(frm,elvalue,checklist[j],msgs,lbl_name);}
							else if (eltype=="radio") {ret = check_handler(frm,getRadioValue(lbl_id),checklist[j],msgs,lbl_name);}
							else if (eltype=="checkbox") {ret = check_handler(frm,getRadioValue(lbl_id+"[]"),checklist[j],msgs,lbl_name);}
							else if (eltype=="select-multiple") {ret = check_handler(frm,getMultiValue(lbl_id+"[]"),checklist[j],msgs,lbl_name);}
							else {alert("Unknown type : "+eltype);}
							//Error Found
							if (ret) {element_label.className="labelerr";elem.focus();return(false);}
							else {element_label.className="labelok";}
						}
					}
				}
			}
		}
	}
	c_f_lock = 1;
	return(true);
}

// Sliders
//
var carpeDefaultSliderLength      = 100
var carpeSliderDefaultOrientation = 'horizontal'
var carpeSliderClassName          = 'carpe_slider'
var carpeSliderDisplayClassName   = 'carpe_slider_display'
function carpeGetElementsByClass(className) {
	var classElements = new Array()
	var els = document.getElementsByTagName("*")
	var elsLen = els.length
	var pattern = new RegExp("\\b" + className + "\\b")
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i]
			j++
		}
	}
	return classElements;
}
function carpeLeft(elmnt, pos) {
	if (!(elmnt = document.getElementById(elmnt))) return 0;
	if (elmnt.style && (typeof(elmnt.style.left) == 'string')) {
		if (typeof(pos) == 'number') elmnt.style.left = pos + 'px';
		else {
			pos = parseInt(elmnt.style.left,10);
			if (isNaN(pos)) pos = 0;
		}
	} else if (elmnt.style && elmnt.style.pixelLeft) {
		if (typeof(pos) == 'number') elmnt.style.pixelLeft = pos;
		else pos = elmnt.style.pixelLeft;
	}
	return pos;
}
function carpeTop(elmnt, pos) {
	if (!(elmnt = document.getElementById(elmnt))) return 0;
	if (elmnt.style && (typeof(elmnt.style.top) == 'string')) {
		if (typeof(pos) == 'number') elmnt.style.top = pos + 'px';
		else {
			pos = parseInt(elmnt.style.top,10);
			if (isNaN(pos)) pos = 0;
		}
	} else if (elmnt.style && elmnt.style.pixelTop) {
		if (typeof(pos) == 'number') elmnt.style.pixelTop = pos;
		else pos = elmnt.style.pixelTop;
	}
	return pos;
}
function moveSlider(evnt) {
	var evnt = (!evnt) ? window.event : evnt; 
	if (mouseover) { 
		x = slider.startOffsetX + evnt.screenX 
		y = slider.startOffsetY + evnt.screenY 
		if (x > slider.xMax) x = slider.xMax 
		if (x < 0) x = 0 
		if (y > slider.yMax) y = slider.yMax 
		if (y < 0) y = 0 
		carpeLeft(slider.id, x)  
		carpeTop(slider.id, y) 
		sliderVal = x + y 
		sliderPos = (slider.distance / display.valuecount) * 
			Math.round(display.valuecount * sliderVal / slider.distance)
		v = Math.round((sliderPos * slider.scale + slider.from) * 
			Math.pow(10, display.decimals)) / Math.pow(10, display.decimals)
		display.value = v 
		return false
	}
	return
}
function slide(evnt) {
	if (!evnt) evnt = window.event; 
	slider = (evnt.target) ? evnt.target : evnt.srcElement; 
	dist = parseInt(slider.getAttribute('distance'),10) 
	slider.distance = dist ? dist : carpeDefaultSliderLength 
	ori = slider.getAttribute('orientation') 
	orientation = ((ori == 'horizontal') || (ori == 'vertical')) ? ori : carpeSliderDefaultOrientation	
	displayId = slider.getAttribute('display') 
	display = document.getElementById(displayId) 
	display.sliderId = slider.id 
	dec = parseInt(display.getAttribute('decimals'),10) 
	display.decimals = dec ? dec : 0 
	val = parseInt(display.getAttribute('valuecount'),10)  
	display.valuecount = val ? val : slider.distance + 1 
	from = parseFloat(display.getAttribute('from')) 
	from = from ? from : 0 
	to = parseFloat(display.getAttribute('to')) 
	to = to ? to : slider.distance 
	slider.scale = (to - from) / slider.distance 
	if (orientation == 'vertical') { 
		slider.from = to 
		slider.xMax = 0
		slider.yMax = slider.distance
		slider.scale = -slider.scale 
	} else { 
		slider.from = from
		slider.xMax = slider.distance
		slider.yMax = 0
	}
	slider.startOffsetX = carpeLeft(slider.id) - evnt.screenX 
	slider.startOffsetY = carpeTop(slider.id) - evnt.screenY 
	mouseover = true
	document.onmousemove = moveSlider 
	document.onmouseup = sliderMouseUp 
	return false
}
function sliderMouseUp() {
	if (mouseover) {
		v = (display.value) ? display.value : 0 
		pos = (v - slider.from)/(slider.scale) 
		if (slider.yMax == 0) {
			pos = (pos > slider.xMax) ? slider.xMax : pos
			pos = (pos < 0) ? 0 : pos
			carpeLeft(slider.id, pos) 
		}
		if (slider.xMax == 0) {
			pos = (pos > slider.yMax) ? slider.yMax : pos
			pos = (pos < 0) ? 0 : pos
			carpeTop(slider.id, pos) 
		}
		if (document.removeEventListener) { 
			document.removeEventListener('mousemove', moveSlider, false)
			document.removeEventListener('mouseup', sliderMouseUp, false)
		}
		else if (document.detachEvent) { 
			document.detachEvent('onmousemove', moveSlider)
			document.detachEvent('onmouseup', sliderMouseUp)
		}
	}
	mouseover = false 
}
function focusDisplay(evnt) {
	if (!evnt) evnt = window.event; 
	display = (evnt.target) ? evnt.target : evnt.srcElement; 
	lock = display.getAttribute('typelock') 
	if (lock == 'on') {
		display.blur()
	}
	return
}
window.onload = function() {
	sliders = carpeGetElementsByClass(carpeSliderClassName) 
	for (i = 0; i < sliders.length; i++) {
		sliders[i].onmousedown = slide 
	}
	displays = carpeGetElementsByClass(carpeSliderDisplayClassName) 
	for (i = 0; i < displays.length; i++) {
		displays[i].onfocus = focusDisplay 
	}
}
