/*  dbtoolboxes.js    doc. v.1.22.1

		Contain:
	 				  StringToolbox
						DateToolbox
						DisplayToolbox
						ButtonToolbox
						
	  Requires:
						 DBcore (dbcore.js)
						 
*/


/* 
	 StringToolbox  v. 1.3.1
	 Performs several string handling and validating functions.
*/

StringToolbox = {
	 jsversion: '1.3.1',
	 
	 hasMaxDigits: function(numberstring,maximum) {
	   var self=StringToolbox;
	   var Result= {overall:true,correctsize:true,isnumber:true};
	 	 if (self.isPositiveInteger(maximum)) {
		 		if (numberstring.length>maximum) {
					 Result.overall=false;
					 Result.correctsize=false;
				}
		 		if (!self.isPositiveInteger(numberstring)) {
					 Result.overall=false;
					 Result.isnumber=false;
				}
		 }
		 return Result;
	 },
	 
	 hasMinimumDigits: function(numberstring,minimum) {
	   var self=StringToolbox;
	 	 var Result= {overall:true,correctsize:true,isnumber:true};
		 if (self.isPositiveInteger(minimum)) {
		 		if (numberstring.length<minimum) {
					 Result.overall=false;
					 Result.correctsize=false;
				}
		 		if (!self.isPositiveInteger(numberstring)) {
					 Result.overall=false;
					 Result.isnumber=false;
				}
		 }
		 return Result;
	 },
	 
	 hasMaxchars: function(fieldValue,maximum) {
	   var self=StringToolbox;
	 	 var Result= {overall:true,currentsize:0};
		 if (fieldValue.length>maximum) {
		 		Result.overall=false;
		 }
		 Result.currentsize=fieldValue.length;
		 return Result;
	 },
	 
	 hasMinchars: function(fieldValue,minimum) {
	   var self=StringToolbox;
	 	 var Result= {overall:true,currentsize:0};
		 if (fieldValue.length<minimum) {
		 		Result.overall=false;
		 }
		 Result.currentsize=fieldValue.length;
		 return Result;
	 },
	 
	 isEmail: function(emailString) {
	   var rule = /^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/;
		 var result = (rule.test(emailString))? true:false;
		 return result;
	 },

	 isPositiveInteger: function(numberString) {
	 	 var rule = /^\d*[1-9]\d*$/;// RegEx needed bc parseInt accepts text: 'a 3'=> 3
		 var result = (rule.test(numberString) && parseInt(numberString,10)>0) ? true:false; 
		 return result;
	 },
	 
	 isNotNegativeInteger: function(numberString) {
	 	 var rule = /^\d*[0-9]\d*$/;// RegEx needed bc parseInt accepts text: 'a 3'=> 3
		 var result = (rule.test(numberString) && parseInt(numberString,10)>=0) ? true:false; 
		 return result;
	 },
	 
	 isNotEmpty: function(theString,totalEmpty) {
	   var total= (arguments.length==2) ? totalEmpty:false;
	   var rule;
		 if (total) {
				rule=/\S/;
		 } else {
				rule = /./;
		 }
		 var result= (rule.test(theString)) ? true:false;
		 return result;
	 },
	 
	 formatAsBlok: function(numberstring,blocksize,direction) {
		var result='';
		var character='';
		var blokcounter=1;
		if (direction=='right') {
  			for (var i=numberstring.length;i>0;i--) {
						character=numberstring.charAt(i-1);
						result = character + result;
  					if (blokcounter==blocksize) {
							 result= ' '+result;
							 blokcounter=0;
						}
						blokcounter++;
  			}
		} else { // direction left:
			  for (var j=0;j<numberstring.length;j++) {
						character=numberstring.charAt(i);
						result += character;
						if (blokcounter==blocksize) {
							 result +=' ';
							 blokcounter=0;
						}
						blokcounter++;
				}
		}
		return result;
	 },
	 
	 hasNoLetters: function(numberString,mode) {
	 		var result=true; 
			var testchar;
			var allowedSymbols = ['.',',','-',' ','/','#','+','(',')','0','1','2','3','4','5','6','7','8','9'];
			var validchars = '0123456789'; 
			if (mode=='strict') {
				  for (var i=0;i<numberString.length;i++) {
							testchar = numberString.charAt(i); 
							if (validchars.indexOf(testchar) == -1) {
								 result=false;
								 break;
							}
  				 }
			} else {
  		 		for (var i=0;i<numberString.length;i++) {
  						if (!DBcore.findInArray(allowedSymbols,numberString.charAt(i))) {
  							 result=false;
  							 break;
  						}
  				}
			}
			return result;
	 },
	 
	 isNumber: function(numberstring,decimalpoints,signs) {
	 	 var Result={isnumeric:true,decimalerror:false,groupdelimitererror:false,signerror:false};
	   var validchars = '0123456789';
		 var delimiter='';
		 if (decimalpoints!='') {
		 		var delimiter=decimalpoints.charAt(0);
				var groupdelimiters=decimalpoints.substring(1);
		 }
		 var delimitercount=0;
		 var firstDelimiterPos=0;
		 var testchar;
		 for (var i=0;i<numberstring.length;i++) {
		 		 testchar = numberstring.charAt(i); 
		 		 if (validchars.indexOf(testchar) == -1) {
				 	 if (decimalpoints.indexOf(testchar)!= -1 || signs.indexOf(testchar)!= -1) {
					 		// thus decimalpoint & groupdelimiters are allowed but:
					 		if (i>0 && signs.indexOf(testchar)!= -1) {
								 Result.isnumeric=false;
								 Result.signerror=true;
  					 		 break;
							}
							if (delimitercount>0 && groupdelimiters.indexOf(testchar) != -1) {
								 Result.isnumeric=false;
								 Result.groupdelimitererror=true;
  					 		 break;
							}
							if (delimiter.indexOf(testchar) != -1) {
								 delimitercount++;
								 if (delimitercount>1 || i==(numberstring.length-1) || i==0) {
								 		Result.isnumeric=false;
										Result.decimalerror=true;
  					 		 		break;
								 }
							}
					 } else if (testchar=='-' && i==0) {
					 	 	 Result.isnumeric=false;
							 Result.signerror=true;
							 break;
					 } else if(testchar=='.' || testchar==',') {
					 	  Result.isnumeric=false;
							Result.decimalerror=true;
  					 	break;
					 } else {
    				   Result.isnumeric=false;
    					 break;
					 }
				 }
		 }
		 return Result;
	 },
	 
	 getDecimalpointType: function(decimalnumber) {
	 	 var point=',';
		 var decnumberStr = decimalnumber.toString();
		 for (var i=decnumberStr.length-1;i>-1;i--) {
		 		 if (decnumberStr.charAt(i)=='.') {
				 		point='.';
						break;
				 }
		 }
		 return point;
	 },	 
	 
	 validThousandDelimiters: function(valuestring,thousandDelChar,isDecimal) {
	    var Res={valid:true,usedAsDecimal:false,altString:''};
			var delGroup=1;
			var grpCnt=0;
			var testChar='';
			var intPart='';
			var decPart='';
			var decPos=0;
			var ok=true;
			var commaDelim='';
			var valueStr = valuestring.toString();
			if (isDecimal) {
				 if (valueStr.charAt(valueStr.length-3)==thousandDelChar) {
				 		decPos=3;
				 } else if (valueStr.charAt(valueStr.length-2)==thousandDelChar) {
				 	  decPos=2;
				 } else if (valueStr.charAt(valueStr.length-1)==thousandDelChar) {
				 	   decPos=1;
				 }
				 intPart =valueStr.substring(0,valueStr.length-decPos);
				 if (decPos>1) {
				 		Res.usedAsDecimal=true;
						commaDelim=(thousandDelChar=='.' || thousandDelChar==' ') ? ',':'.';
						decPart=valueStr.substring(valueStr.length-decPos+1,valueStr.length);
				 }
			} else {
				 intPart=valueStr;
			}
			for (var i=intPart.length-1;i>-1;i--) {
					testChar=intPart.charAt(i);
					if (testChar==thousandDelChar && i!=intPart.length-delGroup*4) {
						 Res.valid=false;
						 break;
					}
					grpCnt++;
					if (grpCnt>3) {
						 grpCnt==0;
						 delGroup++;
					}
			}
			Res.altString = intPart+commaDelim+decPart;
			return Res;
	 },
	 
	 removeChar: function(valuestring,character) {
	    var resultStr='';
			var valuestr=valuestring.toString();
			for (var i=0;i<valuestr.length;i++) {
					resultStr += (valuestr.charAt(i)==character) ? '' : valuestr.charAt(i);
			}
			return resultStr
	 },

	 removeAllChars: function(valuestring) {
	 		var allowed ='1234567890';
			var resultstring='';
			var valuestr=valuestring.toString();
			for (var i=0;i<valuestr.length;i++) {
					testChr= valuestr.charAt(i);
					resultstring += (allowed.indexOf(testChr)>-1) ? testChr:'';
			}
			return resultstring;
	 },
	 
	 removeLeadingZeros: function(valuestring) {
	   var resultStr='';
		 var isintro=true;
		 var testChr='';
		 for (var i=0;i<valuestring.length;i++) {
		    testChr=valuestring.charAt(i);
				if (isintro) {
					 if (testChr!='0') {
					 		isintro=false;
							resultStr += valuestring.charAt(i);
					 }
				} else {
					 resultStr += valuestring.charAt(i);
				}
		 }
		 return resultStr
	 },
	 
	 isDecimalString: function(decimalString,decimalpoint,decimalfix) {
	 	 var self=StringToolbox;
	 	 var Decimal = {isdecimal:true,decimalnumber:'0,0',isconverted:false,fixerror:false};
		 var delimiter= (decimalpoint=='p') ? '.' : ',';
		 var altdelimiter = (decimalpoint=='c') ? '.' : ',';
		 var delimiterlist= delimiter+altdelimiter;
		 decimalString=decimalString.toString();
		 var components = decimalString.split(delimiter);
		 var altcomponents = decimalString.split(altdelimiter);
		 var mixcomponents0=(components[0]) ? components[0].split(altdelimiter):'';
		 var mixcomponents1=(components[1]) ? components[1].split(altdelimiter):'';
		 if (mixcomponents0.length>1 || mixcomponents1.length>1 ) {
		 		Decimal.isdecimal=false;
		 } else {
    		 if (components.length>2) {
    		 		Decimal.isdecimal=false;
    		 } else {
    		 	  if (components.length<2) {
    					 if (altcomponents.length==2) {
    					 		components[0]=altcomponents[0];
    					 		components[1]=altcomponents[1];
    							Decimal.isconverted=true;
    					 } else {
    							components[1]=0;
    					 }
    				}
    				if (components[0]=='') {
    					 components[0]=0;
    					 Decimal.isconverted=true;
    				}
    				if (components[1]=='') {
    					 components[1]=0;
    					 Decimal.isconverted=true;
    				}
						if (decimalfix!=0) {
  						var fractionsize=components[1].length;
  						if (fractionsize<decimalfix) {
  							 for (var n=0;n<(decimalfix-fractionsize);n++) {components[1]+='0';}
								 Decimal.isconverted=true;
  						} else if (fractionsize>decimalfix) {
								 Decimal.fixerror=true;
								 Decimal.isdecimal=false;
							}
						}
    				var Integertest=self.isNumber(components[0],delimiterlist,'');
    				var Fractiontest=self.isNumber(components[1],delimiterlist,'');
    				if (Integertest.isnumeric && Fractiontest.isnumeric) {
    					 Decimal.decimalnumber=components[0]+delimiter+components[1];
    				} else {
    					 Decimal.isdecimal=false;
    				}
    		 }
		}
		return Decimal;
	 },
	 
	 getParamFromTheUrl: function(parmString){
	     var $res;
			 var components=[];
			 var searchStr=window.location.search.substring(1);
			 var paramPairs = searchStr.split('&');
			 for (var i=0;i<paramPairs.length;i++) {
			 		 components=paramPairs[i].split('=');
					 if (components[0]==parmString) {
					 		$res=components[1];
							break;
					 }
			 }
			 return $res;
},

	isCVRorReg8090: function(cvrString) {
			var CVR = {ok:false,correctedvalue:''};
			var cleanstring = StringToolbox.removeAllChars(cvrString);
			CVR.correctedvalue=cleanstring;
			if (cleanstring.length == 8) {
				 CVR.ok=true;
			} else if (cleanstring.length == 10 && ( cleanstring.substring(0,2)=='80' || cleanstring.substring(0,2)=='90') ){
				 CVR.ok=true;
			}
			return CVR;
	},

  isOrgNr: function(cvrString) {
			var CVR = {ok:false,correctedvalue:''};
			var cleanstring = StringToolbox.removeAllChars(cvrString);
			CVR.correctedvalue=cleanstring;
			if (cleanstring.length == 10) {
				 CVR.ok=true;
			}
			return CVR;
	},

	isCPR: function(cprString,cprLength) {
			var CPR = {ok:false,correctedvalue:''};
			var ValidDate;
			var datePart;
			var numberOfCifres = (cprLength) ? cprLength:10;
			var cleanString=StringToolbox.removeAllChars(cprString);
			if (cleanString.length == numberOfCifres) {
				 datePart=cleanString.substring(0,6);
				 ValidDate=DateToolbox.isValidDate(datePart);
				 if (ValidDate.isValid) {
				 		CPR.ok=true;
						CPR.correctedvalue=cleanString;
				 }
			}
			return CPR;
	}
	
}

/* 
	 DateToolbox  v. 1.2.2
	 Performs several date handling and validating functions.
*/

DateToolbox = {
  
	jsversion: '1.2.1',
	_day: 0,
	_month: 0, 		// jan=1
	_year: 0, 
	_weekday: 0, // sunday=0
	_hour:0,
	_mins:0,
	
	writeDateToFormat: function(format,formfieldId) {
		var self=DateToolbox;
		var delim = '';
		switch (format) {
				case 'S':
						 delim='/';
						 break;
				case 'D':
						 delim='-';
						 break;
				default:
						delim='.';
						break;		
		}
		var day = ('0'+self._day).slice(-2);
		var month = ('0'+self._month).slice(-2);
		document.getElementById(formfieldId).value=day+delim+month+delim+self._year;
	},
	
	writeTimeToFormat: function(format,formfieldId) {
	  var self=DateToolbox;
		var delim = ':';
		var hour= ('0'+self._hour).slice(-2);
		var mins= ('0'+self._mins).slice(-2);
		document.getElementById(formfieldId).value=hour+delim+mins;
	},
	
	getMaxdaysInMonth: function(monthNumber,theYear) { // jan=1
		var year = DateToolbox._makeYear4d(theYear);
	  var maxdaylist = [0,31,28,31,30,31,30,31,31,30,31,30,31];
		if (monthNumber==2) {maxdaylist[2]= (year%4==0 && year&100!=0 || year&400==0) ? 29:28;}
		return maxdaylist[monthNumber];
	},
	
	isValidDate: function(assumedDateStr) {
		var self=DateToolbox;
		var dateValid={isValid:false,errorId:''};
	  self._splitDateToComponents(assumedDateStr);
		if (DateToolbox._year==-1) {
		   dateValid['errorId']='N4';
		} else if (DateToolbox._year==-2) { // year out of range
			 dateValid['errorId']='D9';
		} else if (DateToolbox._year==0) {
			 dateValid['errorId']='D2';
		} else if (!(DateToolbox._month>0 && self._month<13)) {
			 dateValid['errorId']='D1';							 // Month out of range
		} else if (!(DateToolbox._day>0 && DateToolbox._day<=self.getMaxdaysInMonth(DateToolbox._month,DateToolbox._year))) {
			 dateValid['errorId']='D2';							 // Day out of range
		} else {
			 dateValid['isValid']=true;
		}
		return dateValid;
	},
	
	isValidTime: function(assumedTimeStr) {
		var self=DateToolbox;
		var timeValid={isValid:false,errorId:''};
		self._splitTimeToComponents(assumedTimeStr);
		if (DateToolbox._hour>-1 && DateToolbox._mins>-1) {
			 if (DateToolbox._hour>23 || DateToolbox._mins>59 ) {
			 		timeValid['errorId']='D3';
			 } else {
			 	 	timeValid['isValid']=true;
			 }
		} else {
			 timeValid['errorId']='D4';
		}
		return timeValid;
	},
	
	isNotInWeekend: function(assumedDateStr) {
	  var Result= {notWeekend:false,errorId:''};
	  var self=DateToolbox;
		var DateEvaluation= self.isValidDate(assumedDateStr);
		Result.errorId=DateEvaluation.errorId;
	  if (DateEvaluation.isValid) {
			 var weekday=DateToolbox._weekday;
			 if (weekday>0 && weekday<6) {
			 		Result.notWeekend=true;
			 }
		}
		return Result;
	},
	
	roundMinutes: function(minutSteps) {
		var self=DateToolbox;
		var legalsteps= "5,10,15,30,";
		var mstep= (minutSteps!='undefined' && legalsteps.indexOf((minutSteps+','))>0)? minutSteps : 5;
		var minuts=self._mins;
		var hour=self._hour;
		minuts= (minuts%mstep==0) ? minuts : mstep*(Math.floor(minuts/mstep)+1);
		if (minuts>=60) {
			 hour++;
			 minuts=0;
		}
		self._hour=hour;
		self._mins=minuts;
	},
	
	differenceInDays: function(assumedDateStr1,assumedDateStr2,absmodeOn) {
		var result=-1; // = error
	  var self=DateToolbox;
		var absolute = (absmodeOn!=null) ? absmodeOn:true;
	  var Evaluate1=self.isValidDate(assumedDateStr1);
		if (Evaluate1.isValid) {
			  var Date1= new Date;
				Date1.setFullYear(self._year,(self._month-1),self._day);
				var millisecs1=Date1.getTime();
			  var Evaluate2=self.isValidDate(assumedDateStr2);
    		if (Evaluate2.isValid) {
    		   var Date2= new Date;
					 Date2.setFullYear(self._year,(self._month-1),self._day);
					 var millisecs2=Date2.getTime();
					 var difference = (absolute) ? Math.abs(millisecs2-millisecs1) : millisecs2-millisecs1;
					 result= Math.floor(difference/86400000); // 1 day= 86400000 ms
    		}
		}		
		return result;
	},
	
	isDaysAHead: function(futureDateString,numberOfDays) {
	  var Result={ok:true,difference:0};
		var self=DateToolbox;
		var thisDate = new Date;
		var thisDayString=thisDate.getDate()+'.'+(thisDate.getMonth()+1)+'.'+thisDate.getFullYear();
		var daydifference=self.differenceInDays(thisDayString,futureDateString,false);
		if (daydifference<numberOfDays) {
			 Result.ok=false;
			 Result.difference=daydifference;
		}
		return Result;
	},
	
	getDateSerie: function(ahead,count,noweekends,hollidayAr,marksunday,includeYear) {
		var self=DateToolbox;
	  var resultAr= new Array();
		var dropYear= (includeYear) ? false : true;
		var dayObj = {};
	  var dateserie='';
		var Dateinfo;
		var weeknumber;
		var xday= new Date;
		var weekday=xday.getDay();
		var msecs=xday.setHours(0,0,0);// midnigt
		var msecsInADay= 86400000;
		for (var i=0;i<count;i++) {
			xday.setTime(msecs);
			weekday=xday.getDay();
			if (i>=ahead) {
				if (!(noweekends && (weekday==0 || weekday==6)) ) { // && !(DBcore.findInArray(hollidayAr,msecs)))
  				 dayObj= new Object;
					 if (dropYear) {
					 		var datecomp=xday.toLocaleDateString().split(' ');
							dayObj.datestring = datecomp[0]+' '+datecomp[1];
					 } else {
  				 	  dayObj.datestring=xday.toLocaleDateString();
					 }
  				 dayObj.weekday=weekday;
  				 dayObj.timestamp=msecs;
  				 resultAr.push(dayObj);
  			} else if(weekday==0 & marksunday) {
					 Dateinfo=self._getWeeknumber(xday);
					 weeknumber= (Dateinfo.weeknumber<52) ? Dateinfo.weeknumber+1:1;
					 dayObj= new Object;
					 dayObj.datestring='--[ '+weeknumber+' ]--';
					 resultAr.push(dayObj);
				}
			}
			msecs+=msecsInADay;
		}
		return resultAr;
	},
	
	getAgeInYears: function(birthdayString) {
		 var age=0;
		 var today= new Date;
	   var Evaluate=DateToolbox.isValidDate(birthdayString);
		 if (Evaluate.isValid) {
				var rawAge=today.getFullYear()-DateToolbox._year;
				rawAge = (rawAge<0) ? 100+rawAge: rawAge;
				if (DateToolbox._month>(today.getMonth()+1)) {
					 age=rawAge-1;
				} else if (DateToolbox._month==(today.getMonth()+1) && DateToolbox._day>today.getDate()) {
					 age=rawAge-1;
				} else {
					 age=rawAge;
				}
		 }
		 return age
	},
	
	loadHolydays: function() {
	  var self=DateToolbox;
		var holydays=[];
		var Holyday;
		var country;
		var days;
		var dateElements;
		var datestr;
		var datecomponents;
		var root= (document.getElementById('debug') && document.getElementById('debug').value==1) ? '': '/';
		var holydaysurl = root + 'js_css/js/lib/holydays.xml';
  	var holydaysdoc=DBcore.doGetSync(holydaysurl)  //DBcore.XMLload(holydaysurl);
  	var htmlatr=document.getElementsByTagName('html')[0].attributes;
  	var languagecode=htmlatr.lang.value;
		var countries=holydaysdoc.getElementsByTagName('country');
		for (var i=0;i<countries.length;i++) {
  			if (countries[i].getAttribute('code')==languagecode) {
					 country=countries[i];
					 break;
				}
		}
		if (country) {
			 days=country.getElementsByTagName('day');
			 if (days) {
  			 for (var d=0;d<days.length;d++) {
  			 		 dateElements=days[d].getElementsByTagName('date');
  			 		 datestr=dateElements[0].firstChild.nodeValue;
  					 datecomponents=datestr.split('.');
  					 Holyday = new Date();
  					 Holyday.setDate(datecomponents[0]);
  					 Holyday.setMonth(datecomponents[1]-1);
  					 Holyday.setYear(datecomponents[2]);
  					 Holyday.setHours(0,0,0);
  					 holydays.push(Holyday.getTime());
  			 }
			 }
		}
		return holydays;
	},
		
	_makeYear4d: function(year) { // 2 digit => 20xx
		var year2d=Math.abs(year);
	  var year4d = (year2d<100) ? 2000+year2d:year2d;
		return year4d;
	},
	
	_splitDateToComponents: function(inputDateStr) {
	  var self=DateToolbox;
		var dateStr=inputDateStr;
		if (inputDateStr.length==6) {
			 dateStr = inputDateStr.substring(0,2)+'.'+inputDateStr.substring(2,4)+'.'+inputDateStr.substring(4,6);
		}
		var Theday= new Date;
		var convDateStr=dateStr;
		if (StringToolbox.hasNoLetters(convDateStr,'loose')) {
  		convDateStr=convDateStr.replace(/\/|-/g,'.');
  		var dateArr=convDateStr.split('.');
  		if (dateArr.length==3 && dateArr[0]!=''  && dateArr[1]!='' && dateArr[2]!='') {
      		var day =parseInt(dateArr[0],10);
      		var month=parseInt(dateArr[1],10);
      		var year=self._makeYear4d(parseInt(dateArr[2],10));
      		self._day=day;
      		self._month=month;
      		self._year=year;
					if (year<1900 || year>2100) self._year=-2;;
      		Theday.setFullYear(year,(month-1),day);
      		self._weekday=Theday.getDay();
  		} else {
  			  self._day=0;
    		  self._month=0;
    		  self._year=0;
  				self._weekday=-1;
  		}
		} else {
			 self._year=-1;
		}
	},
	
	_splitTimeToComponents: function(timeStr) {
	   var self=DateToolbox;
		 var convTimeStr=timeStr;
		 convTimeStr=convTimeStr.replace(/\.|,|-/g,':');
		 var timeArr=convTimeStr.split(':');
		 if (timeArr.length==2) {
		 		self._hour= parseInt(timeArr[0],10);
		 		self._mins= parseInt(timeArr[1],10);
		 } else if (timeArr.length==1 && timeArr[0]>0 && timeArr[0]<24) {
		 	  self._hour= parseInt(timeArr[0],10);
				self._mins=0;
		 } else {
		 	  self._hour=-1;
				self._mins=-1;
		 }
	},
	
	_getWeeknumber: function(dateObject) {
		var Result ={weeknumber:0,daynumberOfYear:0};
		var weeknumber;
		var newyear = new Date(dateObject.getFullYear(),0,1);
		var firstday = newyear.getDay()-1;
		firstday = (firstday >= 0 ? firstday : firstday + 7);
		var daynumber = Math.floor((dateObject.getTime()-newyear.getTime()-(dateObject.getTimezoneOffset()-newyear.getTimezoneOffset())*60000)/86400000) + 1;
		Result.daynumberOfYear=daynumber;
		if(firstday < 4) {
				weeknumber = Math.floor((daynumber+firstday-1)/7) + 1;
				if(weeknumber > 52) {
						nextYear = new Date(dateObject.getFullYear() + 1,0,1);
						nextfirstday = nextYear.getDay() - 1;
						nextfirstday = nextfirstday >= 0 ? nextfirstday : nextfirstday + 7;
						weeknumber = nextfirstday < 4 ? 1 : 53;
				}
		} else {
			 weeknumber = Math.floor((daynumber+firstday-1)/7);
		}
		Result.weeknumber=weeknumber;
		return Result;
	}
	
}



/* 
	 DisplayToolbox  v. 1.2.0
	 Performs show and hide functionality for HTML elements.
*/

DisplayToolbox = {
   jsversion: '1.2.0',
	 
	 hideByClass: function(nameOfClass) {
	    var elements = DBcore.getElementsByClass(nameOfClass);
			for (var i=0;i<elements.length;i++) {
				DBcore.addClass(elements[i],'hide');
				DBcore.removeClass(elements[i],'show');
		  }
	 },
	 
	 showByClass: function(nameOfClass) {
	    var elements = DBcore.getElementsByClass(nameOfClass);
			for (var i=0;i<elements.length;i++) {
				DBcore.addClass(elements[i],'show');
				DBcore.removeClass(elements[i],'hide');
		  }
	 },
	 
	 showElement: function(element) {
			DBcore.removeClass(element,'hide');
	    DBcore.addClass(element,'show');
			if (element.style.display!='') element.style.display='block';// Fix to double-click hack. 
	 },
	 
	 fadeInElement: function(element) {
			 element.style.opacity=0;
			 element.style.filter = 'alpha(opacity=0)';
			 DisplayToolbox.showElement(element);
			 DBcore.fadelement=element;
			 for (var i=0;i<11;i++) {
			 		 setTimeout('DBcore.setOpacity('+i+')',100*i);
			 }
	 },
	  
	 hideElement: function(element) {
	    DBcore.removeClass(element,'show');
			DBcore.addClass(element,'hide');
			if (element.style.display!='') element.style.display='none'; // Fix to double-click hack. 
	 },
	 
	 fadeOutElement: function(element) {
	  	 DBcore.fadelement=element;
			 for (var i=10;i>-1;i--) {
			 		 setTimeout('DBcore.setOpacity('+i+')',100*(11-i));
			 }
			 DisplayToolbox.hideElement(element);
	 },
	 
	 makeElementVisible: function(element) {
	    DBcore.addClass(element,'jsvisible');
			DBcore.removeClass(element,'jsnotvisible');
	 },
	 
	 makeElementNotVisible: function(element) {
	    DBcore.addClass(element,'jsnotvisible');
			DBcore.removeClass(element,'jsvisible');
	 },
	 
	 showFieldAndLabel: function(field) {
	    self=DisplayToolbox;
	    self.showElement(field);
	    var labelobj=DBcore.getLabelFor(field);
			if (labelobj.found) {
				 self.showElement(labelobj.label);
			}
	 },
	 
	 hideFieldAndLabel: function(field) {
	    self=DisplayToolbox;
	    self.hideElement(field);
	    var labelobj=DBcore.getLabelFor(field);
			if (labelobj.found) {
				 self.hideElement(labelobj.label);
			}
	 },
	 
	 showContainer: function(field) {
	 		var container=field.parentNode;
			DisplayToolbox.showElement(container);
	 },
	 
	 hideContainer: function(field) {
	 		var container=field.parentNode;
			DisplayToolbox.hideElement(container);
	 },
	 
	 starcontrol: function(target,mode) {
  	   var show = (mode=='visible') ? true : false;
  		 var starspan;
  		 var targetPassed=false;
  		 var siblings=target.parentNode.childNodes;
  		 for (var i=0;i<siblings.length;i++) {
     		 if (targetPassed && siblings[i].nodeType==1 && siblings[i].tagName=='SPAN' && DBcore.hasClass(siblings[i],'reqmark')) {
    		 		starspan=siblings[i];
    				break;
    		 } else if (!targetPassed) {
    		 	  targetPassed = (siblings[i]==target) ? true : false ;
    		 }
  		 }
    	if (starspan){
    		 if (show) {
    		 		DisplayToolbox.makeElementVisible(starspan);
    		 } else {
    		 	  DisplayToolbox.makeElementNotVisible(starspan);
    		 }
  		}
	 },
	 
	 lockElement: function(element) {
	 	  if (element.type=='text') {
				 		element.readonly='true';
				 } else {
				 	  element.disabled='true';
				 }
	 },
	 
	 unlockElement: function(element) {
	 	  if (element.type=='text') {
				 		element.readonly=false;
				 } else {
				 	  element.disabled=false;
				 }
	 }
	 
}

/* 
	 ButtonToolbox  v. 0.0.3
	 Performs certain button manipulations and behaviours.
*/

ButtonToolbox = {
	 jsversion: '0.0.3',
	 
	 checkForActivation: function(field) {
	 	 var self=ButtonToolbox;
		 var targetbuttons= new Array();
		 var found=false;
		 var form=field.form;
		 var buttons= document.getElementsByTagName('button');
		 for (var i=0;i<buttons.length;i++) {
		 		 if (buttons[i].form==form && buttons[i]._activationenabled) {
				 		found=true;
						targetbuttons.push(buttons[i]);
				 }
		 }
		 return {'found':found,'targets':targetbuttons};
	 },

	 activateByRequired: function(button) {
	 		 var self=ButtonToolbox;
  	 	 var allrequiredFilled=true;
  	 	 var form=button.form;
  		 for (var i=0;i<form.elements.length;i++) {
  		 		 if (DBcore.hasClass(form.elements[i],'required') && !StringToolbox.isNotEmpty(form.elements[i].value,false)) {
  				 		allrequiredFilled=false;
  						break;
  				 } else if (DBcore.hasClass(form.elements[i],'required-NW') && !StringToolbox.isNotEmpty(form.elements[i].value,true)) {
  				 	  allrequiredFilled=false;
  						break;
  				 } else if (DBcore.hasClass(form.elements[i],'requiredIfVisible') && DBcore.hasHiddenParent(form.elements[i])) {
					 	  allrequiredFilled=false;
  						break;
					 }
  		 }
  		 if (allrequiredFilled) {
  		 		DBcore.removeClass(button,'inactivebutton');
  				button._inactivetitle=button.getAttribute('title');
					button.setAttribute('title','');
  		 } else {
  		 	  self.deactivateButton(button);
  		 }
	 },
	 
	 deactivateButton: function(button) {
  	 	 DBcore.addClass(button,'inactivebutton');
  		 if (typeof button._inactivetitle != 'undefined') {
  				button.setAttribute('title',button._inactivetitle);
  		 }
	 },
	 
	 showIfClipboardData: function(button) {
	 		var result=false;
	    if (window.clipboardData && clipboardData.setData) {
			   DisplayToolbox.makeElementVisible(button);
				 DBcore.removeClass(button,'jshide');
				 result=true;
			} else {
				 DisplayToolbox.makeElementNotVisible(button);
			}
			return result;
	 }
	 
}


