/*  dberrorhandler.js  v. 1.12.2
 
 		Requires:
	 					DBcore  (dbcore.js)
						XML error message file (/js_css/js/lib/dberrormessages.xml)

*/

ErrorHandler = {

	jsversion: '1.12.2',
	errordoc: null,
	errorId:0,
	languagecode: 'en',
	errorboxActive: false,
	errorfieldId: '',
	_coreCompliant: false,
	
	errorMessageHead: {
						da: 'Fejl i felt',
						en: '',
						sv: '',
						fi: '',
						nb: ''
	},
	
  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 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;
			}
			if (typeof CalculatorToolbox != "undefined" && CalculatorToolbox.CTBXactive) {
				self.showErrorNearFieldBox(element,value,specs,message);
			} else {
  				self.showErrorInLI(element,formfieldId,value,specs,message);
			}
		}
	},
	
	showErrorInLI: function(element,formfieldId,value,specs,message) {
		var self=ErrorHandler;
		var labeltxt='';
		var label;
		var labelspec;
		var mesbox;
		var li;
		while (element.parentNode) {
  		   		if (element.parentNode.tagName == 'LI') {
  			 		li = element.parentNode;
  					labelspec = DBcore.getLabelFor(element);
  					if (labelspec.found) {
    					 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);
  						 	}
					}
  					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;
  			 	}
  			}
	},
	
	showErrorNearFieldBox: function(element,value,specs,message) {
		var self=ErrorHandler;
		var labeltxt='';
		var label;
		var labelspec;
		var mesbox;
		var bodyElement = document.getElementsByTagName('body')[0];
		var bodyOffsets = DBcore.tallyBodyOffsets(element);
		var errorElement = element;
		while (element.parentNode) {
			if (element.parentNode.tagName == 'LI') {
				labelspec = DBcore.getLabelFor(element);
				label = labelspec.label;
				labeltxt=self._getLabeltxt(label);
				mesbox = self._createMesbox2(message,labeltxt,value,specs);
				mesbox._errorElement = errorElement;
				bodyElement.appendChild(mesbox);
				if (typeof window.chrome != "undefined"){
					mesbox.style.top = bodyOffsets[0] - 4 + "px";
					mesbox.style.left = bodyOffsets[1] - mesbox.offsetWidth - 12 + "px";
				}
				else if (typeof document.all != "undefined"){
					mesbox.style.top = bodyOffsets[0] - 4 + "px";
					mesbox.style.left = bodyOffsets[1] - mesbox.offsetWidth - 10 + "px";
				}
				else if (typeof document.all == "undefined"){
					mesbox.style.top = bodyOffsets[0] + 1 + "px";
					mesbox.style.left = bodyOffsets[1] - mesbox.offsetWidth - 12 + "px";
				}				
				else{
					mesbox.style.top = bodyOffsets[0];
					mesbox.style.left = bodyOffsets[1];
				}
				self.errorboxActive = true;
				break;
			} else {
  				element = element.parentNode;
  			}
		}
	},
	
	resetError: function() {
	  var self=ErrorHandler;
		if (self.errorboxActive) {
			 self._removeErrorbox();
			 self.removeErrorMark();
			 self.errorboxActive =false;
		}
	},
	
	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 mesbox;
		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" >';
		mesboxHtml += messagePart1+'<br />'+messagePart2;
		mesboxHtml += '</div>';
		mesboxHtml += '<div class="stopFloat"></div>';
		mesboxHtml += '</div></div>';
		mesboxHtml += '<div class="stopFloat"></div>';
		mesboxHtml += '</div>';
		mesbox = document.createElement("div");
		mesbox.innerHTML=mesboxHtml;
		return mesbox;
	},
	
	_createMesbox2: function(messageText,labeltxt,value,specs) {
		var self=ErrorHandler;
		var mesbox;
		var message=self.evaluateAtFunctions(messageText,labeltxt,value,specs);
		var messagesnips=message.split('..');
		var messagePart1=messagesnips[0]+'. ';
		messagesnips.shift();
		var messagePart2=messagesnips.join('. ');
		var errorMesHeadText = self.errorMessageHead[self.languagecode];
		/*var mesboxHtml = '<div class="errorBoxHead">' + errorMesHeadText +'</div>';
		mesboxHtml += '<p class="errormessage">' + messagePart1+'<br />'+messagePart2 + '</p>';*/
		var mesboxHtml = '<div class="errorBoxArrow"></div>\
							<div class="errorBoxHeading">' + errorMesHeadText + '</div>\
							<div class="errorBoxText">' + messagePart1 + '<br />' + messagePart2 + '</div>';
		mesbox = document.createElement("div");
		mesbox.innerHTML=mesboxHtml;		
		mesbox.className = "errorBoxModal";
		return mesbox;
	},
	
	_removeErrorbox: function() {
		var self=ErrorHandler;
		(typeof CalculatorToolbox != "undefined" && CalculatorToolbox.CTBXactive) ? self._removeModalErrorbox() : self._removeInlineErrorbox();
	},
	
	_removeInlineErrorbox: function(){
		var self=ErrorHandler;
		var errorline;
		var ydreDiv;
		var errorboxclass = 'errorline';
		var eboxes=DBcore.getElementsByClass(errorboxclass);
		if (eboxes.length>0) {
			for (var i=0;i<eboxes.length;i++) {
    			errorline = eboxes[i];
				ydreDiv = errorline.parentNode;
      			ydreDiv.parentNode.removeChild(ydreDiv);
			}
		}
	},
	
	_removeModalErrorbox: function(){
		var self=ErrorHandler;		
		var errorboxclass = 'errorBoxModal';
		var eboxes=DBcore.getElementsByClass(errorboxclass);
		if (eboxes.length>0) {
			for (var i=0;i<eboxes.length;i++) {
    			if (eboxes[i].parentNode) eboxes[i].parentNode.removeChild(eboxes[i]);
			}
		}
	},
	
	_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=[];
		var parts = message.split('.');
		message = parts.join('..');
		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);


