/*  dberrorhandler.js  v. 1.11.2
 
 		Requires:
	 					DBcore  (dbcore.js)
						XML error message file (/js_css/js/lib/dberrormessages.xml)

*/

ErrorHandler = {

	jsversion: '1.11.2',
	errordoc: null,
	errorId:0,
	languagecode: 'en',
	errorboxActive: false,
	errorfieldId: '',
	_coreCompliant: false,
	
  init: function() {
				 var self=ErrorHandler;
				 var root= (document.getElementById('debug') && document.getElementById('debug').value==1) ? '': '/';
				 var CoreCompliance=DBcore.getJSversion(DBcore,'1.8.0');
				 self._coreCompliant=CoreCompliance.compliant;
				 if (self._coreCompliant) {
				 	 var errormessageurl = root + 'js_css/js/lib/dberrormessages.xml';
					 if (!self.errordoc) {
  				 		self.errordoc=DBcore.doGetSync(errormessageurl);
					 }
  				 var htmlatr=document.getElementsByTagName('html')[0].attributes;
  				 self.languagecode=htmlatr.lang.value;
					 if (document.getElementById('langoverride')) {
					 		self.languagecode=document.getElementById('langoverride').value;
					 }
				 }
	},
	
	_handleXMLsetup: function(XMLfromFile) {
				ErrorHandler.errordoc=XMLfromFile;
	},

	getErrormessage: function(errorId,XMLtext) {
				 var self=ErrorHandler;
				 ErrorHandler.errorId=errorId;
				 var errormessage='Error';
				 var errormessages;
				 var languages= [];
				 if (self._coreCompliant && self.errordoc!=null) {
				 		if (errorId.substring(0,1)=='X' && arguments.length>1 && XMLtext!='') {
    				 	 var xerrordoc = DBcore.xmlTextParse(XMLtext);
							 errormessages=xerrordoc.getElementsByTagName('errormessage');
						} else {
							 errormessages=self.errordoc.getElementsByTagName('errormessage');
						}
						for (var i=0;i<errormessages.length;i++) {
  				 		 if (errormessages[i].getAttribute('errid')==errorId) {
  						 		languages=errormessages[i].getElementsByTagName('language');
  								for (var j=0;j<languages.length;j++) {
  										if (languages[j].getAttribute('code')==self.languagecode) {
  											 if (languages[j].firstChild) errormessage=languages[j].firstChild.nodeValue;
  											 break;
  										}
  								}
  						 }
      			}
				 }
				 return errormessage;
	},
	
	getMessageFromXML: function(messageId) {
			var self=ErrorHandler;
			var message='';	 
			if (!self.errordoc) {
				 var root= (document.getElementById('debug') && document.getElementById('debug').value==1) ? '': '/';
				 var errormessageurl = root + 'js_css/js/lib/dberrormessages.xml';
  			 self.errordoc=DBcore.doGetSync(errormessageurl);
			}
  		var htmlatr=document.getElementsByTagName('html')[0].attributes;
  		self.languagecode=htmlatr.lang.value;
			errormessages=self.errordoc.getElementsByTagName('errormessage');
			for (var i=0;i<errormessages.length;i++) {
  				 		 if (errormessages[i].getAttribute('errid')==messageId) {
  						 		languages=errormessages[i].getElementsByTagName('language');
  								for (var j=0;j<languages.length;j++) {
  										if (languages[j].getAttribute('code')==self.languagecode) {
  											 if (languages[j].firstChild) message=languages[j].firstChild.nodeValue;
												 message=self._translateLink(message);
  											 break;
  										}
  								}
  						 }
      }
			return message;
	},
	
	showErrorInline: function(errorId,formfieldId,Values,XMLtext) {  // <= Default entry for error calls
		var self=ErrorHandler;
		var labeltxt='';
		var specs= new Array();
		if (self._coreCompliant && self.errordoc!=null) {
  	  var message = self.getErrormessage(errorId,XMLtext);
  		var element= document.getElementById(formfieldId);
  		var value=element.value;
			if (arguments.length==2) {
    			specs['minimum']=element._specmin;
    			specs['maximum']=element._specmax;
    			specs['list']=element._speclist;
    			specs['brandname']=element._specbrandname;
					specs['text1']=element._text1;
					specs['text2']=element._text2;
			} else {
					specs['minimum']= (Values.minimum) ? Values.minimum:element._specmin;
					specs['maximum']= (Values.maximum) ? Values.maximum:element._specmax;
					specs['list']= (Values.list) ? Values.list:element._speclist;
					specs['brandname']= (Values.brandname) ? Values.brandname:element._specbrandname;
					specs['text1']= (Values.text1) ? Values.text1:element._text1;
					specs['text2']= (Values.text2) ? Values.text2:element._text2;
			}
  		while (element.parentNode) {
  		   if (element.parentNode.tagName=='LI') {
  			 		var li=element.parentNode;
  					var labelspec=DBcore.getLabelFor(element);
  					if (labelspec.found) {
    					var label=labelspec.label;
    					 labeltxt=self._getLabeltxt(label);
  					} else { // for sake of IE:
							 labelspec=DBcore.getNearestLabel(element);
							 if (labelspec.found) {
      					 label=labelspec.label;
      					 labeltxt=self._getLabeltxt(label);
  						 }
						}
  					var mesbox = self._createMesbox1(message,labeltxt,value,specs);
  					li.insertBefore(mesbox,li.firstChild);
  					self.errorboxActive=true;
  					self.errorfieldId=formfieldId;
						// IE/CMS fix:
			 			window.setTimeout(function() {mesbox.style.display="block";},100);
  					break;
  			 } else {
  			 	  element=element.parentNode;
  			 }
  		}
		}
	},
	
	resetError: function() {
	  var self=ErrorHandler;
		if (self.errorboxActive) {
			 self._removeErrorbox();
			 self.removeErrorMark();
		}
	},
	
	setErrorMark: function(formfieldId) {
	  var field=document.getElementById(formfieldId);
		if (ErrorHandler.errorId=='F1' && DBcore.hasTrigger(field,'cardnumber')) {
			   field=ErrorHandler.nearestEmptyCardNumber(field);
		} 
		DBcore.addClass(field,'errormark');
		self.errorfieldId=formfieldId;
	},
	
	selectInputContent: function(formfieldId) {
	  var field=document.getElementById(formfieldId);
		if (field.tagName != 'SELECT' && (field.type=='text' || field.type=='textarea')) {
			 if (ErrorHandler.errorId=='F1' && DBcore.hasTrigger(field,'cardnumber')) {
			   field=ErrorHandler.nearestEmptyCardNumber(field);
			 } 
	  	 field.select();
		}
	},
	
	removeErrorMark: function() {
		var self=ErrorHandler;
		var fieldId=self.errorfieldId;
		var field=document.getElementById(fieldId);
		DBcore.removeClass(field,'errormark');
	},
	
	_createMesbox1: function(messageText,labeltxt,value,specs) {
		var self=ErrorHandler;
		var message=self.evaluateAtFunctions(messageText,labeltxt,value,specs);
		var messagesnips=message.split('.');
		var messagePart1=messagesnips[0]+'. ';
		messagesnips.shift();
		var messagePart2=messagesnips.join('. ');
		var mesboxHtml ='<div id="ELSEerrorline" class="errorline"><div id="ELSEerrorframe" class="errorframe">';
		mesboxHtml += '<div id="ELSEerrorbox" class="errorbox"><div class="errorsign">';
		mesboxHtml += '!';
		mesboxHtml += '</div>';
		mesboxHtml += '<div class="errormessage" title="Switch to virtual buffer">';
		mesboxHtml += messagePart1+'<br />'+messagePart2;
		mesboxHtml += '</div>';
		mesboxHtml += '<div class="stopFloat"></div>';
		mesboxHtml += '</div></div>';
		mesboxHtml += '<div class="stopFloat"></div>';
		mesboxHtml += '</div>';
		var mesbox = document.createElement("div");
		mesbox.innerHTML=mesboxHtml;
		return mesbox;
	},
	
	_removeErrorbox: function() {
		var self=ErrorHandler;
		var eboxes=DBcore.getElementsByClass('errorline');
		if (eboxes.length>0) {
			for (var i=0;i<eboxes.length;i++) {
    			var errorline=eboxes[i];
					var ydreDiv=errorline.parentNode;
      		ydreDiv.parentNode.removeChild(ydreDiv);
			}
		}
	},
	
	_getLabeltxt: function(label) {
		var txt=DBcore.getText(label);
		if (txt !='') {
			txt=txt.split(':')[0];
			txt=txt.split('(')[0];
			txt=DBcore.trim(txt);
		}
		return txt;
	},
	
	_translateLink: function(messageStr) {
		var res=messageStr;
		var stringparts = messageStr.split('(@abeg');
		if (stringparts.length>1) {
			 var firstPart = stringparts[0];
			 var endPosOfLink = stringparts[1].indexOf(')');
			 var linkContent = stringparts[1].slice(0,endPosOfLink);
			 var restOfString = stringparts[1].slice(endPosOfLink+1);
			 stringparts = restOfString.split('(@aend)');
			 res = firstPart+'<a'+linkContent+' >'+stringparts[0]+'</a>'+stringparts[1];
		}
		return res;
	},
	
	evaluateAtFunctions: function(messageText,textToInsert,elementValue,specs) {
		var message=messageText;
		var messageAr=[];
		if (message.indexOf('(@label)')>-1) {
			 var labeltxt= "'"+textToInsert+"'";
			 messageAr=message.split('(@label)');
			 message=messageAr.join(labeltxt);
		}
		if (message.indexOf('(@value)')>-1) {
			 var valuetxt= "'"+elementValue+"'";
			 messageAr=message.split('(@value)');
			 message=messageAr.join(valuetxt);
		}
		if (message.indexOf('(@minimum)')>-1) {
			 var minimumtxt= specs['minimum'];
			 messageAr=message.split('(@minimum)');
			 message=messageAr.join(minimumtxt);
		}
		if (message.indexOf('(@maximum)')>-1) {
			 var maximumtxt= specs['maximum'];
			 messageAr=message.split('(@maximum)');
			 message=messageAr.join(maximumtxt);
		}
		if (message.indexOf('(@list)')>-1) {
			 var listtxt= "'"+specs['list']+"'";
			 messageAr=message.split('(@list)');
			 message=messageAr.join(listtxt);
		}
		if (message.indexOf('(@brandname)')>-1) {
			 var brandtxt= "'"+specs['brandname']+"'";
			 messageAr=message.split('(@brandname)');
			 message=messageAr.join(brandtxt);
		}
		if (message.indexOf('(@text1)')>-1) {
			 var txt1= "'"+specs['text1']+"'";
			 messageAr=message.split('(@text1)');
			 message=messageAr.join(txt1);
		}
		if (message.indexOf('(@text2)')>-1) {
			 var txt2= "'"+specs['text2']+"'";
			 messageAr=message.split('(@text2)');
			 message=messageAr.join(txt2);
		}
		if (message.indexOf('(@br)')>-1) {
			 messageAr=message.split('(@br)');
			 message=messageAr.join('<br />');
		}
		message=ErrorHandler._translateLink(message);
		return message;
	},
	
	nearestEmptyCardNumber: function(field) { // remember card numbers are shown in reverse order.
		var firstEmpty=field;
		var element = field;
		while (element.nextSibling) {
					element=element.nextSibling;
					if (DBcore.hasTrigger(field,'cardnumber') && element.value=='') {
						 firstEmpty=element;
					} 
		}
		return firstEmpty;
	}

}
DBcore.start(ErrorHandler);

