/***

DATEI DIENT NUR NOCH DER RÜCKWÄRTSKOMPATIBILITÄT
ÄNDERUNGEN AN spirito-validator.js vornehmen

	(C)opyright spirito GmbH, Germany, 2006-2007
	All rights reserved
	
	http://www.spirito.de
	This is part of the DADO Application Server Software
	
	$Revision: 2899 $
	$Author: riedel $
	$Date: 2008-01-04 11:08:50 +0100 (Fr, 04 Jan 2008) $


	Skript zum Prüfen, ob alle Pflichtfelder ausgefüllt sind
	========================================================
	
	Dazu einfach dieses Skript laden, es bindet sich automatisch
	bei onload in aller Formulare ein. 
	
	Bei onsubmit werden die Felder mit dem Attribut "mandatory" oder
	dem einem CSS Stil mit dem Namen "required" darauf geprüft,
	ob sie nicht leer sind. Wenn doch, dann werden den Feldern die Klassen
	"spirito-mandatory" und " validation-failed" hinzugefügt und es wird ein Alert 
	ausgegeben. Das Senden der Daten wird abgebrochen.
	
	validate-email
	validate-alphanum
	validate-phone
	validate-number
	validate-checked
	
	http://www.w3.org/TR/web-forms-2/
	
***/

var link_extern_blank = false
var msg_required = "### Fehler! Bitte füllen Sie alle Pflichtfelder aus!"
var msg_validate_letters = "Bitte geben Sie hier nur Buchstaben ein!"
var msg_validate_number = "Bitte geben Sie eine Zahl ein!"
var msg_validate_email = "Bitte geben Sie eine gültige E-Mail Adresse an, z.B. xyz@spirito.de.!"
var msg_validate_alpha = "Bitte geben Sie hier nur Buchstaben ein!"
var msg_validate_alphanum = 'Bitte geben Sie hier nur Ziffern und Buchstaben ein! Leerzeichen und andere Sonderzeichen sind nicht erlaubt.'
var msg_validate_letters = "Bitte geben Sie hier nur Buchstaben ein!"
var msg_validate_checked = "Bitte bestätigen Sie dieses Feld!"

// var required_hook = null

function _dadoAlert(msg) {
	try {
    	Alert(msg)
	} catch(e) {
		alert(msg)
	}
    return false
}

// add init to onload
function _dadoAddEvent(el, evname, func, useCapture) {
    /*
    Event.observe(el, evname, func)
    return
    */
    useCapture = useCapture || false
	if(window.attachEvent) {
		el.attachEvent("on" + evname, func, useCapture);
	} else {
		el.addEventListener(evname, func, useCapture);
	}
}

// stop an event
function _dadoStopEvent(event) {
    /*
    Event.stop(event)
    return 
    */
    event = event || window.event
    if (event.preventDefault) {
	  event.preventDefault();
	  event.stopPropagation();
	} else {
	  event.returnValue = false;
	  event.cancelBubble = true;
	}
    return false
}

function _dadoEventElement(event) {
    event = event || window.event
	return event.target || event.srcElement	
}

// get element of event
function _dadoGetElement(event) {
    return event.target || event.srcElement
}

// Check for class
function _dadoHasClassName(el, name) {
	return (" " + el.className + " ").indexOf(" " + name + " ") > -1
}

// Strip spaces
function _dadoStrip(s) {
    return s.toString().replace(/^\s+/, '').replace(/\s+$/, '');
}

function _dadoValidateForm(form) {
	var failed = 0
    var msg = msg_required
    var vfield = null
    
    function _dadoValidateFields(inp, isoption) {
        var failed = 0
        for(var i=0; i<inp.length; i++) {
            var isFailed = 0;
            var e = inp[i]
            var ovalue = e.value

            // Sample entfernen
            if(!isoption && _dadoHasClassName(e, "sample")) {
                e.value = ""
            }

            // Alle warning Tags entfernen, werden bei Bedarf neu gesetzt
            e.className = e.className.replace(/ spirito-mandatory validation-failed failed$/, '')

            var value = _dadoStrip(e.value)

            // Auf Format bei Textfeldern prüfen 
            if(!isoption) {
                for (var j=0; j<validation_rules.length; j++) {
                    if(value!="" && _dadoHasClassName(e, validation_rules[j][0]) ) {                        
                        if(!validation_rules[j][2](value)) {
                            isFailed = 1;
                            msg = validation_rules[j][1]
                            vfield = e
                        }
                    }
                }
            }
            
            // Auf Inhalt prüfen
            if(_dadoHasClassName(e, "required") || e.getAttribute('mandatory')) {                
                // console.log(e.name, e.checked, e.getAttribute("type", ""))
                if(isoption && e.options.selectedIndex==0) {
                    isFailed = 1;
                } else if((e.getAttribute("type", "") + "").toLowerCase()=="checkbox" && e.checked==false) {
                    isFailed = 1;                
                } else if(value=="") {
                    isFailed = 1;
                    msg = msg_required
                    // Sample zurücksetzen
                    if(value != ovalue) {
                        e.value = ovalue
                    }
                }
                if(isFailed)
                    vfield = null
            }            

            // Fehlerklassen hinzufügen oder entfernen
            if(isFailed != 0){
                e.className += " spirito-mandatory validation-failed failed";
                failed += 1;
            }
        }
        return failed
    }
        
    var validation_rules = [
    	['validate-number', msg_validate_number,, function(v) {
    				return !isNaN(v);
    			}],
    	['validate-digits', msg_validate_letters, function(v) {
    				return !/[^\d]/.test(v);
    			}],
    	['validate-alpha', msg_validate_alpha, function (v) {
    				return /^[a-zA-Z]+$/.test(v)
    			}],
    	['validate-alphanum', msg_validate_alphanum, function(v) {
    				return !/\W/.test(v)
    			}],
    	['validate-date', 'Please enter a valid date.', function(v) {
    				var test = new Date(v);
    				return !isNaN(test);
    			}],
    	['validate-email', msg_validate_email, function (v) {
    				return /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
    			}],
    	['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
    				
					var upper = 31;
					if(/^(\d{2})\/(\d{2})\/(\d{4})$/.test(v)) { // dd/mm/yyy
						if(RegExp.$2 == '02') upper = 29;
						if((RegExp.$1 <= upper) && (RegExp.$2 <= 12)) {
							return true;
						} else {
							return false;
						}
					} 
					return false;				
    			}],
    	['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00 .', function(v) {
    				// [$]1[##][,###]+[.##]
    				// [$]1###+[.##]
    				// [$]0.##
    				// [$].##
    				return /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
    			}]
        ]

    failed += _dadoValidateFields(form.getElementsByTagName("input", false));
    failed += _dadoValidateFields(form.getElementsByTagName("textarea", false));
    failed += _dadoValidateFields(form.getElementsByTagName("select", true));

    if(failed > 0) {
        if(vfield)
            vfield.focus()
        _dadoAlert(msg.replace(/\#\#\#/, failed))
        return false;
    }
    return true
}

function _dadoSampleFields(inp) {
	for(var i=0; i<inp.length; i++) {
		var el = inp[i]	
		if(_dadoHasClassName(el, "sample")) {
			
			el._changed = false
			
			_dadoAddEvent(el, "focus", function(event) {
			    var el = _dadoGetElement(event)
				var isoption = el.tagName.toLowerCase() == "select"
				if(_dadoHasClassName(el, "sample")) {					
				    if(!isoption)
						el.value = ""					
					el.className = (" " + el.className + " ").replace(/ sample /, ' ')
				}	
				return true
			})
			
			_dadoAddEvent(el, "keypress", function(event) {
			    var el = _dadoGetElement(event)
				el._changed = true
				return true
			})
			
			_dadoAddEvent(el, "blur", function(event) {			 
    			var el = _dadoGetElement(event)
				var isoption = el.tagName.toLowerCase() == "select"
				// _dadoAlert(this._changed)
				if(this._changed || (isoption && el.options.selectedIndex!=0)) {
					el._changed = true
					return 
				}
				if(el._changed || el.value.length>0) {
					el._changed = true
					return 
				}			
				if(!isoption)
					el.value = el.defaultValue
				el.className += " sample"
				return true
			})
			
			/*
			dadoAddEvent(el, "change", function(event) {			
    			var el = _dadoGetElement(event)
				var isoption = el.tagName.toLowerCase() == "select"
				// _dadoAlert(this._changed)
				if(this._changed || (isoption && el.options.selectedIndex!=0)) {
					el._changed = true
					return 
				}
				if(el._changed || el.value.length>0) {
					el._changed = true
					return 
				}			
				if(!isoption)
					el.value = el.defaultValue
				el.className += " sample"
				return true
			})
			*/
		}
	}
}

function _dadoSampleForm(form) {
	_dadoSampleFields(form.getElementsByTagName("input"))
	_dadoSampleFields(form.getElementsByTagName("textarea"))
	// _dadoSampleFields(form.getElementsByTagName("select"))
}

function dadoForms(node) {
	var el = null
	var elm = node.getElementsByTagName("form")
	for(var i=0; i<elm.length; i++) {		
		try {			
			el = elm[i]		
			// console.log("wai", el)
			if(el.dadowai!=true && (!_dadoHasClassName(el,"wai-off"))) {
				el.dadowai = true	
				el.dadowaiokay = false		
				_dadoSampleForm(el)
				/*
				if(_dadoHasClassName(el, "wai")) {
					_dadoSample(el)
				}
				*/
				el.dadooldsubmit = el.onsubmit				
				// _dadoAddEvent(el, "submit", _dadoContinue)				
				// _dadoAddEvent(el, "submit", function(event) {				
				el.onsubmit = function(event) {
					var el = _dadoEventElement(event)
					el.dadowaiokay = false		
						
					// Test!
					if(_dadoValidateForm(this)) {
						
						// Test rest!
						if(el.dadooldsubmit && !el.dadooldsubmit(event)) {
						    _dadoStopEvent(event)  
							return false
						}
						
					} else {
						
						// Stop propagation!
						_dadoStopEvent(event)                    				
						return false
					}				

                    el.dadowaiokay = true
					return true
				}
				// }, false)	
			}	
		} catch(e) {;}
	}
}

/*
function _dadoContinue(event) {
    event = event || window.event
    var el = event.target || event.srcElement
    try {
        if(el.dado_continue) {
            _dadoAlert("ok")
            return true        
        }
    } catch(e) { ; }
    alert("stop")
    _dadoStopEvent(event)
    return false
}
*/

function dadoLinks(node) {
	var elm = node.getElementsByTagName("a")
	for(var i=0; i<elm.length; i++)	{	
		if(elm[i].dadowai!=true) {
			elm[i].dadowai = true
			try {
				if(_dadoHasClassName(elm[i], "_blank")) {
					// _dadoAlert(elm[i].innerHTML)
					elm[i].setAttribute("target", "_blank")
				} else if(link_extern_blank && elm[i].href.toString().indexOf("http://")==0 && elm[i].href.toString().indexOf("http://"+location.host)<0) {
					elm[i].setAttribute("target", "_blank")
				}
			} catch(e) { ; }
		}
	}	
}

function dadoWAI(node) {
	dadoForms(node)
	dadoLinks(node)
}

function _dadoWAI() {
	dadoWAI(document)
}

// add init to onload
_dadoAddEvent(window, "load", _dadoWAI)

