// $$ Thursday, 25 Oct 2007 16:13:40 Uhr asc casserole24.de $$
// knapper mit Positiv-liste ::= erlaubt alle landesspezifischen Glyphen in ISO-Latin-1

var i8nRE = /^[\- a-zA-Z0-9,\u00BF-\u00d6\u00d8-\u00f6\u00f8-\u024f\.']{2,50}$/;
 
// für feldprüfung
var KLDomains = Array('de', 'sk', 'nl', 'no', 'fi', 'se', 'ch', 'at', 'be', 'cz');

function check_errMsg( errMsg, caller ){

try
{ errMsgText = $( errMsg ).innerHTML; }
catch (jsError)
{ 
	//console.log("Error with MSG '%s'", errMsg );
	// console.log( "Problem with :", caller.name );
	// console.error( errMsg, "fehlt in :",document,"\n\t Error:", jsError );
	return errMsg;
	}	
//console.log('MSG good-> "%s"', errMsgText );
return errMsgText;
}

function isLocalized( errMsg, caller )
{
	if ( ( !errMsg.length) || (errMsg.substring(0,2)=="**") ){
		//console.warn( 'nicht lokalisiert:', errMsg.substring(0,8), "in: ",caller );
		return errMsg; }
	return errMsg;
}

function kdnr_req( kd_nr1_obj, kd_nr2_obj, defaultMsg )
{
	ergArr = new Array();
	
	// regEx 
	 var regEx_kdNr1=/^[0-9]{7,9}$/;
	 var regEx_kdNr2=/^[0-9]{2}$/;
	
	// spezial für adva-testlogin 'testkon / to' etc.
	// angepasst für cornelia's 9-stelliges KundenNummer-Feld
	if ( (kd_nr1_obj.value=="testkon" && kd_nr2_obj.value=="to") || (kd_nr1_obj.value=="testkonto") ) 
	{	//console.info( "/ord/login: TESTUSER-Login" );
		hideError( kd_nr1_obj );
		return ergArr;
	}
	 if( !kd_nr1_obj.value.length || !kd_nr2_obj.value.length )
	 {	// TB1805 "Die Kundennummer ist nicht gültig."
		if (!defaultMsg)
			{var errMsg = check_errMsg('errMsg1805', this );}
		else {var errMsg = defaultMsg;}
		
		ergArr.push( kd_nr1_obj, errMsg );
		return ergArr;
	}
	if(kd_nr1_obj.value.match(regEx_kdNr1 ) == null)
	{	// TB1806 "Der vordere Teil ist nicht richtig!"
		if (!defaultMsg)
			{var errMsg = check_errMsg('errMsg1806', this );}
		else {var errMsg = defaultMsg;}
	
		ergArr.push( kd_nr1_obj, errMsg );
 		return ergArr;
	  } 
	if(kd_nr2_obj.value.match(regEx_kdNr2 ) == null)
	{	// TB1807 "Der hintere Teil ist nicht richtig!"
		if (!defaultMsg)
			{var errMsg = check_errMsg('errMsg1807', this );}
		else {var errMsg = defaultMsg;}
		
		ergArr.push( kd_nr2_obj, errMsg );
	  	return ergArr;
	  }
	hideError( kd_nr1_obj );
	hideError( kd_nr2_obj );
	return ergArr;
}

function datum_req( tag_obj, monat_obj, jahr_obj, modus, hideError )
/* 	erwartet tag,monat,jahr als Referenzen zu den entsp. FORM-input-feldern(object).
	4.modi-> 	"zp" für Zahlpause oder 
				"lp" für Lieferpause oder 
				"ap" für Altersprüfung oder
				"zu" für 'in zukunft' 
		default ist 'ap' für Altersprüfung 
	5.hideObj -> 	flag, ob hideError() gerufen werden soll, sofern die Inhaltsprüfung
					des Datums positiv endet.
*/
{
	//Rückgabearray -> Liste mit [ Feld-Obj.-Referenz, Fehlermeldung ]
	ergArr = new Array();
	// regEx
	var regEx_tag=/^0?[1-9]{1}$|(1|2)[0-9]{1}$|^3[01]$/;
	var regEx_monat=/(^0?[1-9]{1}$|^1[012]{1}$){1}/;
	var regEx_jahr=/(^1(8|9)[0-9]{2}|^200[0-9]{1})/;

	// syntaktische Prüfung der Datums-elemente per regEx
	
 	//Tag 
 	 if( tag_obj.value.match(regEx_tag) == null )
			{	//TB1796
			var errMsg = check_errMsg('errMsg1796', this );
			ergArr.push( tag_obj, errMsg );
			//console.info( "TAG des Datums ist nicht ok.(%s)", tag_obj.name );
			return ergArr;
			}
 	//Monat
 	 if( monat_obj.value.match(regEx_monat) == null )
			{	//TB1797
			var errMsg = check_errMsg('errMsg1797', this );
			ergArr.push( monat_obj, errMsg );
			//console.info( "MONAT des Datums ist nicht ok.(%s)", monat_obj.name );
			return ergArr;
			}
 	//Jahr
 	if( jahr_obj.value.match(regEx_jahr) == null )
			{	//TB1798
			var errMsg = check_errMsg('errMsg1798', this );
			ergArr.push( jahr_obj, errMsg );
			//console.info( "JAHR des Datums ist nicht ok.(%s)", jahr_obj.name );
			return ergArr;
			}
	//ende der syntax-Prüfung -> datum ok
	//console.info( "datum_req: Syntax des Datums(%s.%s.%s) ist ok.",tag_obj.value, monat_obj.value, jahr_obj.value );

	//jetzt
 	heute = new Date();
	heute = heute.getTime();
	
	//const TAG
	var TAG = 60 * 60 * 24 * 1000;
	var JAHR = TAG * 356;
	var J18 = JAHR * 18;
	var J110 = JAHR * 110;
	
	//Eingabe-Datum des Users
 	in_Tag = new Date( 
		parseInt( jahr_obj.value,10 ),
 		parseInt( monat_obj.value,10 ) - 1,
 		parseInt( tag_obj.value,10 )
	);
	
	var in_Tag = in_Tag.getTime();
	
	//wurde param 'modus' mitgegeben ?
	if (datum_req.arguments.length > 3)
	{ 
		modus = datum_req.arguments[3]; 
		hideObj = datum_req.arguments[4]; 
	}
	//nein, dann default 'Altersprüfung'
	else { modus = "ap"; }
	
	//console.info("\tModus ist: %s",modus);
	
	switch( modus )
	{ //Altersprüfung - Geburtstag
	case "ap":
		{
		mj = heute - J18 ;
		if (mj < in_Tag ) { //TB1799
			errMsg = check_errMsg('errMsg1799', this );
			ergArr.push( tag_obj, errMsg );
			return ergArr;
			}
		else if ( in_Tag < ( heute - J110) ){//TB0918
			errMsg = check_errMsg('errMsg918', this );
			//dateStr = ppDate(myDate);
			ergArr.push( tag_obj, errMsg );
			return ergArr; };
		}//eo-case "ap"
		break;
	case "zp":
	  { //Zahlpause bis max. 180 Tage
		tage=180; 
		maxTag = heute + (tage * TAG);
		if (in_Tag < heute) 
			{//TB1802
			errMsg = check_errMsg('errMsg1802', this );
			ergArr.push( tag_obj, errMsg);
			return ergArr;
			}
		else if ( (in_Tag>maxTag && in_Tag>heute) || in_Tag < heute)
		 	{//TB1803
			myDate = new Date(maxTag-TAG);
			errMsg = check_errMsg('errMsg1804', this );
			dateStr = ppDate(myDate);
			errMsg = errMsg.replace('+ppDate(myDate)+', dateStr);
			//console.log( "Zahl/Lieferpause : %s:", errMsg );
			ergArr.push( tag_obj, errMsg );
			}
		}//eo-case "zp"
		break;
	case "lp":
		{ //Lieferpause bis max. heute plus 90 Tage
		tage=90; 
		maxTag = heute + ( tage * TAG );
		
		if (in_Tag < heute) 
			{//TB1802
			errMsg = check_errMsg('errMsg1802', this );
			ergArr.push( tag_obj, errMsg );
			return ergArr;
			}
		else if (in_Tag>maxTag && in_Tag>heute) 
			{//TB1803
		 	myDate = new Date(maxTag-TAG);
			errMsg = check_errMsg('errMsg1803', this );
			dateStr = ppDate(myDate);
			errMsg = errMsg.replace('+ppDate(myDate)+', dateStr);
			//console.log( "Zahl/Lieferpause : %s:", errMsg );
			ergArr.push( tag_obj, errMsg);
			}//eo-if
		}//eo-case "lp"
		break;
	case "zu":
		{//datum muss größer heute sein
		if ( in_Tag < heute )
		{//TB1802
			errMsg = check_errMsg('errMsg1802', this );
			ergArr.push( tag_obj, errMsg );
			ergArr.push( monat_obj, errMsg );
			ergArr.push( jahr_obj, errMsg );
			return ergArr;
		}//eo-if
		}//eo-case "zu"
		break;
	} //eo-switch
	
	// datum ist formell und inhaltlich ok
	if ( !$defined('hideObj') ){ 
		hideError( tag_obj );
		hideError( monat_obj ); 
		hideError( jahr_obj ); 
	}

	return ergArr;
}

function telefon_req( vorw_obj, phone_obj, errMsg1, errMsg2 )
{
	ergArr = new Array();

	// regEx 
	var regEx_vorw=/^[0-9]{2,5}$/;
	var regEx_phone=/^[0-9]{3,50}$/;
	
 	// vorwahl
	if (!errMsg1)
		{ var errMsg1 = check_errMsg( 'errMsg1808', this );}

 	 if( vorw_obj.value.match(regEx_vorw) == null )
     	{ ergArr.push( vorw_obj, errMsg1 ); }

 	// telefon
	if (!errMsg2)
		{ var errMsg2 = check_errMsg( 'errMsg1809', this );}

 	 if( phone_obj.value.match(regEx_phone) == null ){ 
		ergArr.push( phone_obj, errMsg2 );
		return ergArr; 
	};

	hideError( vorw_obj );
	hideError( phone_obj );
	return ergArr;
}

function plzstr_req( plz_obj, ort_obj)
{
	var ergArr = new Array();

	// regEx 
	var regEx_plz=/[0-9]{4,8}/;

	if (arguments.length==4){ 
		var msg1 = arguments[2];
		var msg2 = arguments[3]; }
	else {//default-msgs
		var msg1 = check_errMsg( 'errMsg1810', this );
		var msg2 = check_errMsg( 'errMsg1811', this );}
	
	 if(plz_obj.value.match( regEx_plz ) == null)
	 	{ ergArr.push( plz_obj, msg1 ); }
	
	 if(ort_obj.value.match( i8nRE ) == null){ 
		ergArr.push( ort_obj, msg2 );
		return ergArr;
	}

	hideError( plz_obj );
	hideError( ort_obj );
	return ergArr;
}

function betrag_req( euro_obj, cent_obj )
{
/* prüft eine betragseingabe in die felder euro und cent.
akzeptiert werden 4-stellige Beträge vor dem Komma und 2-stellig dahinter.*/

	var ergArr = new Array();
	
	// regEx 
	var regEx_betrag=/^[0-9]{1,4},[0-9]{0,2}/;
	
	var betrag = new Array( euro_obj.value, cent_obj.value).join();
	if( betrag.match( regEx_betrag ) == null)
	{	//TB1812
		errMsg = check_errMsg( 'errMsg1812', this );
		ergArr.push( euro_obj, errMsg );
		ergArr.push( cent_obj, errMsg );
		// ergArr.push( euro_obj, "Betrag bitte richtig angeben: Bsp.: 12,45 ");
	  	return ergArr;
	  } 
	hideError( euro_obj );
	hideError( cent_obj );
	return ergArr;
}

function bonus_req( bon_obj, errMsg )
{
	ergArr = new Array();
	if (!errMsg)
		{ errMsg = check_errMsg( 'errMsg1813', this ); }
	
	 var regEx_bon=/^[a-zA-Z0-9]{4}$/;

	if(bon_obj.value.match(regEx_bon ) == null)
	{	
		ergArr.push( bon_obj, errMsg );
  		return ergArr;
  	}
	hideError( bon_obj );
	return ergArr;
}

function gut_req( gut_obj, errMsg )
{
	ergArr = new Array();
	
	// regEx 
	 var regEx_gut=/^[a-zA-Z0-9]{4}$/;

	 if(gut_obj.value.match(regEx_gut ) == null)
	 {	//TB1814
		errMsg = check_errMsg( 'errMsg1814', this );
		ergArr.push( gut_obj, errMsg );
		//console.info( "Gutschein: falsche Syntax.", gut_obj.name );
	  return ergArr;
	  }
	hideError( gut_obj );
	return ergArr;
}

function vorname_req( vorname_obj, errMsg )
{
	ergArr = new Array();
	
	if (!errMsg)
		{ errMsg = check_errMsg( 'errMsg170', this ); }

	// regEx 
	//var regEx_vorname=/^([\-A-Za-zöäüÄÖÜß]+ ?){1,3}/;
	//var regEx_vorname=/^\S{3,40}/;
	
	 if(vorname_obj.value.match( i8nRE ) == null)
	 {
		ergArr.push( vorname_obj, errMsg );
		//console.info( "Vorname(%s): falsche Syntax.", vorname_obj.value );
		return ergArr;
	  }//-if

	hideError( vorname_obj );
	return ergArr;
}

function nachname_req( nachname_obj, errMsg )
{
	ergArr = new Array();
	// errMsg171 = "Bitte geben Sie Ihren Nachnamen ein.";

	if (!errMsg)
		{ errMsg = check_errMsg( 'errMsg171', this ); }

//	var regEx_nachname=/^([\-A-Za-zöäüÄÖÜßåÅøØ]+ ?){1,3}/;
//	var regEx_nachname=/^\S{3,40}/;

	 if(nachname_obj.value.match( i8nRE ) == null)
	 {
		ergArr.push( nachname_obj, errMsg );
		//console.info( "Nachname('%s'): falsche Syntax.",nachname_obj.value );
		return ergArr;
	  }//-if
	hideError( nachname_obj );
	return ergArr;
}

function strasse_req( str_obj, errMsg )
{
	ergArr = new Array();
	
	// regEx 
	//var regEx_str=/^[0-9a-zA-ZöäüÄÖÜßåÅøØ\-\.]{1,34}/;
	//var regEx_str=/^\S{3,40}/;
	var regEx_str=i8nRE;
	
	 if (str_obj.value.match( i8nRE ) == null)
	 {	
		if (arguments.length > 1 )
			{ errMsg = arguments[1]; }
		else { errMsg = check_errMsg( 'errMsg1817', this ); }
		
		ergArr.push( str_obj, errMsg );
		//console.info( "Strasse: falsche Syntax." );
		return ergArr;
	  }
	hideError( str_obj );
	return ergArr;
}

function email_req( email_obj, errMsg )
{
	// alert("email_req arg0: "+arguments.length);

	ergArr = new Array();

	// errMsg = "Geben Sie Ihre email-Adresse an.";
	if (!errMsg)
		{ errMsg = check_errMsg( 'errMsg302', this ); }
	
	if ( ( email_obj.value.length==0) && (arguments.length > 1)){
		hideError( email_obj );
		return ergArr;
	};
	
	if ( !validateEmail( email_obj.value ) ) 
	{
		ergArr=ergArr.concat( email_obj, errMsg );
	}
	else { hideError( email_obj );}

	return ergArr;
}

// subs für feldprüfungen

function validateEmail(email)
// aus anderem JS-validator?
{
    if(email.length <= 0)
	{
	  return false;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}

function gps( obj, regEx, mymsg)
//generell purpose regEx tester
{
	if (!obj) 
	{
		//console.error("jsForm.js:gps => kein Objekt erhalten! ABBRUCH.");
		var a = new Array();
		return a ;
	}
		
	if(obj.value.match( regEx ) == null)
		{ return new Array( obj, mymsg ); }
	else 
	{
		if ( !gps.arguments[3])
			{hideError( obj );}
		var a = new Array();
		return a ;
	}
}//eo-func-gps

function ppDate( myDate ) {
// pretty print Date
	if (arguments.length==1) {var locale="de";};
	
	// - einen Tag 
	dom = myDate.getDate();
	month = myDate.getMonth();
	year = myDate.getFullYear();

	var months = new Array("Jan", "Feb", "Mar", "Apr", "Mai", "Jun",
							"Jul", "Aug", "Sep", "Okt", "Nov", "Dec");

	var dows = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");

	switch(locale)
	{
	case "de":
		{//=>'27. Sep. 2007'
			var mymsg = dom+". "+months[month]+". "+year;
			return mymsg;
		}//eo-case "de"
		break;    
	default:
	{//warnen
		//console.warn("func(ppDate): locale '%s' nicht definiert.", locale);
		return myDate.toLocaleString();
	}//eo-case-default
	}//eo-switch "locale"
	
}//eo-function-ppDate

function processErrors( ergArr, setFocus )
// erwartet Array mit paarwweisen Form-Objekten & Fehlermeldungen
// z.B: Array( nachname(objekt), "meldung"(string),  )
{ 
	var submitForm = false;
	//console.info("entered pE with=%s",ergArr );
	while (ergArr.length > 0)
	{
		mymsg = ergArr.pop();
		obj = ergArr.pop();
		
		//console.info("\t -> Fehler in Feld=%s, msg=%s",obj.name, mymsg );
		if (obj.name=="w_wunsch") 
		{
			//console.warn("IE6/7 sonderfall.");
			myShowError( obj, mymsg );
			submitForm = false;
		} else {
			showError( obj, mymsg );
			submitForm = false;
		};
		//console.log("setFocus->%s", obj.id);
		//obj.focus();
	} //eo-while
//	console.info("finished processErrors", submitForm);
	//if (submitForm==false && (setFocus) )
	return submitForm;
}

// für userfeedback an den feldern

function showError( obj, strError)
{ // fehlermeldung
	var errDiv = $('error_'+obj.name );
	
	//console.log("div found (%s)", errDiv);
	if (obj.type.test(/radio/) )
	{ 
		var errBlock = obj.getParent().getParent();
		errBlock.addClass("blockerror");
		// errBlock.setStyle("width", "210px");
	} else { 
		//rahmen- und hintergrund-Farbe
		obj.setStyle('background-color', '#FCEDEB');
		obj.setStyle('border-color', '#DB3624');
	} //eo-if
	
	if ( !errDiv ) 
	{ //last resort-> positional access!
		console.warn("missing errDiv-definition for (%s) !", obj.id );
		errDiv = obj.getParent().getFirst();
	}
	// fill error-hint and show errDiv
	errDiv.innerHTML = strError;
	errDiv.setStyle("display", "block");
} //eo-func 'showError'

function hideError( obj )
{ //gegenstück zu 'showError'-function
	var errDiv = $('error_'+obj.name );
	
	if ( obj.type.test(/radio/) ){
		var errBlock = obj.getParent().getParent();
		errBlock.removeClass("blockerror");
	} else { 
		obj.setStyle('background-color','#ffffff');
		obj.setStyle('border-color', "#004e7f #8db4cb #8db4cb #004e7f");
	}
	
	if ( !errDiv ) 
	{ //last resort-> positional access!
		console.warn("missing errDiv-definition for (%s) !", obj.id );
		errDiv = obj.getParent().getFirst();
	}
	errDiv.innerHTML = "";
	errDiv.setStyle( "display", "none");
} //eo-func 'hideError'

function cleanUpForm( theForm )
//vereinfachung: entfernt alle Rahmen innerhalb der FORM 'theForm'(object)
//entfernt nur von 'text'-, 'radio'- und 'select-one'-feldern
{
	//return;
	for (var i=0; i < theForm.length; i++) 
	{
		obj = theForm.elements[i];
		// if ( obj.type != "select-one" && obj.type != "hidden" && obj.type != "button" && obj.type != "radio" ) 
		if ( obj.type == "text" || obj.type == "radio" ) 
			{ hideError( obj ); }
		else if (obj.type == "select-one" )
			{ myHideError( obj ); }
	}
}

// utils & scratch

function hasHREFparent (obj) {
	var found = false;
	var p = false;
	while( !found ){
		if (obj.getParent().tagName == "A")
			{ found = obj.getParent(); break}
		else if ( obj.getParent().tagName == "HTML" )
			{ found = false; break}
		else { obj = obj.getParent(); continue }
	}
	return found;
}//eo function "hasHREFparent"

function add( item, list){
	if ( $type(item)=="array")
		list = list.merge( item );
	else { list.push( item ); }
} //eo-add

function checkMAP (mapName) {
	var theAreas = $$("map[name="+mapName.slice(1)+"] area" );
	var result = [];
	for (var i=0; i < theAreas.length; i++) {
		if ( !theAreas[i].alt || !theAreas[i].title )
			result.push( theAreas[i] );
	};
	return result;
}//eo function "checkMAP"

function checkPage() {
	var linkedIMG = [];
	var ohneALT = [];
	var ohneTITLE = [];
	var soloIMG = [];
	var soloNoALT = [];
	
	//loop alle img-tags
	for (var i=0; i < document.images.length; i++) {
		var myIMG = document.images[i];
		var theHREF = hasHREFparent(myIMG);
		if ( theHREF ) {
			add( myIMG, linkedIMG );
			if ( !myIMG.hasAttribute("alt") || (myIMG.alt == "")) 
				{ add( myIMG, ohneALT ); }
			else if ( !theHREF.hasAttribute("title") || (theHREF.title == "") ) 
				{ add( myIMG, ohneALT ) }
		} else if (myIMG.hasAttribute("USEMAP") )
			{ add( checkMAP( myIMG.getProperty("usemap")) , ohneALT); }
		else if ( !myIMG.hasAttribute("alt") )
			{ add( myIMG, soloNoALT ); }
		else { add( myIMG, soloIMG ); }
	};
	
	//loop alle a-tag's
	var linkNoTITLE = [];
	for (var i=0; i < document.links.length; i++) {
		var theA = document.links[i];
		if ( (!theA.hasAttribute("title")) || (theA.title=="") ){
			add( theA, linkNoTITLE );
		} 
	};

	if (linkNoTITLE.length){
		console.group("A-Tag's Title-Attribut prüfen(%s) ", linkNoTITLE.length);
		for (var i=0; i < linkNoTITLE.length; i++) {
			console.log(linkNoTITLE[i]);
		};
		console.groupEnd();
	}//eo-if
	
	if (ohneALT.length){
		console.warn( "IMG's-ALT-Attribut & A-Tag TITLE-Attribut prüfen(%s) :\n",
		 ohneALT.length, ohneALT);
	}//eo-if
	
	if (soloNoALT.length){
		console.error( "IMG's-ALT-Attribut prüfen(%s) :\n", 
		soloNoALT.length, soloNoALT);
	}
	console.group("Alle verlinkten IMG's(%d) : ", linkedIMG.length);
		console.log( linkedIMG );
	console.groupEnd();
} //eo-func 'checkPage'
