/* DBcore.js
	 Version 1.16.2
   - Cross browser event and DOM handling
	 - Low level utilities
*/

var DBcore = {};

DBcore.jsversion= '1.17.0';

/*  EVENT HANDLING  */
if (document.addEventListener)
{
  DBcore.addEventListener = function(target, type, listener)
  {
    target.addEventListener(type, listener, false);
  };

  DBcore.removeEventListener = function(target, type, listener)
  {
    target.removeEventListener(type, listener, false);
  };

  DBcore.preventDefault = function(event)
  {
    event.preventDefault();
  };

  DBcore.stopPropagation = function(event)
  {
    event.stopPropagation();
  };
}

else if (document.attachEvent)
{
  DBcore.addEventListener = function(target, type, listener)
  {
    if (DBcore._findListener(target, type, listener) != -1) return;
    var listener2 = function()
    {
      var event = window.event;

      if (Function.prototype.call)
      {
        listener.call(target, event);
      }
      else
      {
        target._currentListener = listener;
        target._currentListener(event)
        target._currentListener = null;
      }
    };
    target.attachEvent("on" + type, listener2);
    var listenerRecord =
    {
      target: target,
      type: type,
      listener: listener,
      listener2: listener2
    };
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;
    var listenerId = "l" + DBcore._listenerCounter++;
    if (!targetWindow._allListeners) targetWindow._allListeners = {};
    targetWindow._allListeners[listenerId] = listenerRecord;
    if (!target._listeners) target._listeners = [];
    target._listeners[target._listeners.length] = listenerId;
    if (!targetWindow._unloadListenerAdded)
    {
      targetWindow._unloadListenerAdded = true;
      targetWindow.attachEvent("onunload", DBcore._removeAllListeners);
    }
  };

  DBcore.removeEventListener = function(target, type, listener)
  {
    var listenerIndex = DBcore._findListener(target, type, listener);
    if (listenerIndex == -1) return;
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;
    var listenerId = target._listeners[listenerIndex];
    var listenerRecord = targetWindow._allListeners[listenerId];
    target.detachEvent("on" + type, listenerRecord.listener2);
    target._listeners.splice(listenerIndex, 1);
    delete targetWindow._allListeners[listenerId];
  };

  DBcore.preventDefault = function(event)
  {
    event.returnValue = false;
  };

  DBcore.stopPropagation = function(event)
  {
    event.cancelBubble = true;
  };

  DBcore._findListener = function(target, type, listener)
  {
    var listeners = target._listeners;
    if (!listeners) return -1;
    var targetDocument = target.document || target;
    var targetWindow = targetDocument.parentWindow;
    for (var i = listeners.length - 1; i >= 0; i--)
    {
      var listenerId = listeners[i];
      var listenerRecord = targetWindow._allListeners[listenerId];
      if (listenerRecord.type == type && listenerRecord.listener == listener)
      {
        return i;
      }
    }
    return -1;
  };

  DBcore._removeAllListeners = function()
  {
    var targetWindow = this;

    for (id in targetWindow._allListeners)
    {
      var listenerRecord = targetWindow._allListeners[id];
      listenerRecord.target.detachEvent(
          "on" + listenerRecord.type, listenerRecord.listener2);
      delete targetWindow._allListeners[id];
    }
  };

  DBcore._listenerCounter = 0;
}

DBcore.getTarget  = function(event) {
	var target;
  if(event.srcElement) {
		target=event.srcElement;
	} else {
	  target=event.target;
	}
	return target;
}

DBcore.start = function(runnable)
{
  DBcore.addEventListener(window, "load", runnable.init);
};


/*  CSS AND class METHODS  */
DBcore.addClass = function(target, theClass)
{
 	if (target) {
    if (!DBcore.hasClass(target, theClass))
    {
      if (target.className == "")
      {
        target.className = theClass;
      }
      else
      {
        target.className += " " + theClass;
      }
    }
	}
};

DBcore.getElementsByClass = function(theClass)
{
  var elementArray = [];

  if (document.all)
  {
    elementArray = document.all;
  }
  else
  {
    elementArray = document.getElementsByTagName("*");
  }

  var matchedArray = [];
  var pattern = new RegExp("(^| )" + theClass + "( |$)");

  for (var i = 0; i < elementArray.length; i++)
  {
    if (pattern.test(elementArray[i].className))
    {
      matchedArray[matchedArray.length] = elementArray[i];
    }
  }

  return matchedArray;
};

DBcore.hasClass = function(target, theClass)
{
  var pattern = new RegExp("(^| )" + theClass + "( |$)");
  if (pattern.test(target.className))
  {
    return true;
  }
  return false;
};

DBcore.hasTrigger = function(target,triggerFunctionName) {
  var pattern = new RegExp("(^| )" + triggerFunctionName + "(-| |$)");
	if (pattern.test(target.className)){
    return true;
  }
  return false;
};

DBcore.getTriggerParams = function(target,triggerFunctionName) {
	var params=[];
	var classes=target.className.split(' ');
	for (var i=0;i<classes.length;i++) {
	 if (classes[i].indexOf(triggerFunctionName+'-')!=-1) {
	 		params=classes[i].split('-');
			params.shift();
			break;
	 }
	}
	return params
};

DBcore.getClassParts = function(theClass) {
	var Res = {classFunction:'',classParams:[]};
	var classParts=theClass.split('-');
	Res.classFunction=classParts[0];
  classParts.shift();
	Res.classParams=classParts;
	return Res;
};

DBcore.removeClass = function(target, theClass)
{
  if (target) {
    var pattern = new RegExp("(^| )" + theClass + "( |$)");
  
    target.className = target.className.replace(pattern, "$1");
    target.className = target.className.replace(/ $/, "");
	}
};

DBcore.getComputedStyle = function(element, styleProperty)
{
  var computedStyle = null;
  if (typeof element.currentStyle != "undefined")
  {
    computedStyle = element.currentStyle;
  }
  else
  {
		computedStyle=window.getComputedStyle(element,null).styleProperty;
  }
  return computedStyle[styleProperty];
};

DBcore.hasHiddenParent= function(field) {
  var ishidden=false;
	var element=field.parentNode;
		while (element && element.tagName!='body') {
			 if (DBcore.hasClass(element,'hide') || DBcore.hasClass(element,'jshide') || DBcore.hasClass(element,'jsnotvisible')) {
					ishidden=true;
					break;
			 }
			 element=element.parentNode;
		}
	return ishidden;
}

/*  XML  */

// cross browser XML import

DBcore._xmlrequest=null;
DBcore._xmreqUrl= null;
DBcore._xmlreqMethod = 'GET';
DBcore._xmlreqAsync=true;
DBcore._xmlreqStatus=null;
DBcore._xmlreqStatusText='';
DBcore._xmlreqpostData=null;
DBcore._xmlreqReadyState=null;
DBcore._xmlreqResponseText=null;
DBcore._xmlreqResponseXML=null;
DBcore._xmlreqHandleResp=null;
DBcore._xmlreqResponseFormat = 'text';
DBcore._xmlreqMimeType=null;

DBcore._setMimeType = function(mimeType) {DBcore._xmlreqMimeType=mimeType};

DBcore._newrequest= function () {
		if (!DBcore._xmlrequest) {
		   try {
		   	   DBcore._xmlrequest = new XMLHttpRequest(); // FF,IE7,SAF
		   }
		   catch (e) {
		   		 try {
				 	 DBcore._xmlrequest = new ActiveXObject("Msxml2.XMLHTTP");// IE 5,6
				 }
				 catch (e) {
				 	   try {
					   	   DBcore._xmlrequest = new ActiveXObject("Microsoft.XMLHTTP");// alt. IE 5,6
					   }
					   catch (e) {
					   		 return false;
					   }
		   		 }
		   }
		}
		return DBcore._xmlrequest;
};

DBcore._doXMLRequest = function () {
		if (DBcore._newrequest()) {
		   DBcore._xmlrequest.open(DBcore._xmlreqMethod,DBcore._xmreqUrl,DBcore._xmlreqAsync);
		   if (DBcore._xmlreqMimeType) {
		   	  try {
			  	    DBcore._xmlrequest.overrideMimeType(DBcore._xmlreqMimeType); //IE7, FF, SAF
			  }
			  catch (e) {
			  		// Continue IE6, Opera... cannot override.
			  }
		   }
		   DBcore._xmlrequest.onreadystatechange = function () {
		   		var resp=null;
		   		if (DBcore._xmlrequest.readyState==4) {
				   switch (DBcore._xmlreqResponseFormat) {
				   		  case 'text':
    						  	 resp= DBcore._xmlrequest.responseText;
								  	 break;
						  case 'xml':
						  	   		 resp= DBcore._xmlrequest.responseXML; 
									 break;
						  case 'object':
						  	   		 resp=DBcore._xmlrequest;
									 break;
				   }
				   if (DBcore._xmlrequest.status>=200 && DBcore._xmlrequest.status<=299) {
				   	  DBcore._xmlreqHandleResp(resp);
				   } else {
				   	  //DBcore._xmlreqHandleErr(resp); just keep silent.
				   }
				}
		   }
		   DBcore._xmlrequest.send(DBcore._xmlreqpostData);
		}
}

DBcore._doSyncXMLRequest = function () {
		if (DBcore._newrequest()) {
			 DBcore._xmlrequest.open(DBcore._xmlreqMethod,DBcore._xmreqUrl,DBcore._xmlreqAsync);
		   if (DBcore._xmlreqMimeType) {
		   	  try {
			  	    DBcore._xmlrequest.overrideMimeType(DBcore._xmlreqMimeType); //IE7, FF, SAF
  			  }
  			  catch (e) {
  			  		// Continue IE6, Opera... cannot override.
  			  }
		   }
			 try {
			 		 DBcore._xmlrequest.send(DBcore._xmlreqpostData);
			 }
			 catch (e) {} // file:// protocol problem
			 if ((DBcore._xmlrequest.status>=200 && DBcore._xmlrequest.status<=299) || DBcore._xmlrequest.status==0) { //0: localfile
			 				respdoc= DBcore._xmlrequest.responseXML;
			 } else {
				  // DBcore._xmlreqHandleErr(resp); just keep silent.
			 }
			 return respdoc;
		}
}

DBcore.doGet = function(url,responshandler,format) {
    DBcore._xmreqUrl=url;
		DBcore._xmlreqHandleResp=responshandler;
		DBcore._xmlreqResponseFormat= format || 'xml';
		DBcore._doXMLRequest();
};

DBcore.doGetSync = function(url) {
     DBcore._xmreqUrl=url;
		 DBcore._xmlreqAsync=false;
		 return DBcore._doSyncXMLRequest();
};

DBcore.xmlTextParse = function(text) {
    if (typeof DOMParser != "undefined") {
        return (new DOMParser( )).parseFromString(text, "application/xml");
    }
    else if (window.ActiveXObject) {
        var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
				xmldoc.async=false;
        xmldoc.loadXML(text);
        return xmldoc;
    }
    else {
        // Safari hack:
        var url = "data:text/xml;charset=utf-8," + encodeURIComponent(text);
        var request = new XMLHttpRequest( );
        request.open("GET", url, false);
        request.send(null);
        return request.responseXML;
    }
};


/*  DOM  */
DBcore.make = function(tagname, attributes, children) {
    if (arguments.length == 2 &&
        (attributes instanceof Array || typeof attributes == "string")) {
        children = attributes;
        attributes = null;
    }
    var e = document.createElement(tagname);
    if (attributes) {
        for(var name in attributes) e.setAttribute(name, attributes[name]);
    }
    if (children != null) {
        if (children instanceof Array) {
            for(var i = 0; i < children.length; i++) {
                var child = children[i];
                if (typeof child == "string")
                    child = document.createTextNode(child);
                e.appendChild(child);
            }
        }
        else if (typeof children == "string")
            e.appendChild(document.createTextNode(children));
        else e.appendChild(children);
    }
    return e;
}

DBcore.getText = function(n) {
    var strings = [];
    getStrings(n, strings);
    return strings.join("");
    function getStrings(n, strings) {
        if (n.nodeType == 3 /* Node.TEXT_NODE */)
            strings.push(n.data);
        else if (n.nodeType == 1 /* Node.ELEMENT_NODE */) {
            for(var m = n.firstChild; m != null; m = m.nextSibling) {
                getStrings(m, strings);
            }
        }
    }
}

DBcore.getLabelFor = function(field) {
		var Res= {found:false,label:''};
		var label;
		var legend;
		var children;
  	var container=field.parentNode;
		var labels=container.getElementsByTagName('LABEL');
		for (var i=0;i<labels.length;i++) {
				label=labels[i];
					if (DBcore.hasClass(label,'group')) { // legend is then the group-label
						  while (container && container.tagName!='body') {
										if (container.tagName=='FIELDSET') {
											 children=container.childNodes;
											 for (var j=0;j<children.length;j++) {
											 		 if (children[j].nodeType==1 && children[j].tagName=='LEGEND') {
													 		legend = children[j];
															Res['label']=legend;
															Res['found']=true;
															break;
													 }
											 }
										}
										container = container.parentNode;
										if (Res.found) break;
							}
							break;
					} else if (label.getAttribute('for')==field.id) {
					 		Res['label']=label;
							Res['found']=true;
							break;
					}
		}
		return Res;
}

DBcore.getNearestLabel= function(field) {
		var Res= {found:false,label:''};
		var labelPosition = [];
		var labelposFound=false;
		var siblings=field.parentNode.childNodes;
		for (var i=0;i<siblings.length;i++) {
				if (siblings[i]==field) {
					 var fieldpos=i;
				} else if (siblings[i].nodeType==1 && siblings[i].tagName=='LABEL') {
					 labelPosition.push(i);
					 labelposFound=true;
				}
		}
		if (labelposFound) {
			 for (var j=labelPosition.length;j>0;j--) {
		 		 if (labelPosition[j-1]<fieldpos) {
				 		Res['label']=siblings[labelPosition];
						Res['found']=true;
				 }
		 	 }
		}
		return Res;
}


/*  STRING MANIPULATION  */

DBcore.trim = function(txt){
    return txt.replace(/^\s*|\s*$/g,'');
}

DBcore.ltrim = function(txt){
    return txt.replace(/^\s*/g,'');
}

DBcore.rtrim = function(txt){
    return txt.replace(/\s*$/g,'');
}

DBcore.removeNonAlpha=function(txt) {
		var result='';
		var testChar;
    var allowed = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		for (var i=0;i<txt.length;i++) {
				testChar=txt.charAt(i);
				if (allowed.indexOf(testChar)>-1) {result += testChar;}
		}
		return result;
}
/* Math */

DBcore.multiplyCommaDecimal = function(decimalnumber,multiplyer) {
  var res=0;
	if (decimalnumber!='') {
  	var cleanDecimalnumber='';
  	for (var i=0;i<decimalnumber.length;i++) {
  			if (decimalnumber.charAt(i)!='.') {cleanDecimalnumber=cleanDecimalnumber+decimalnumber.charAt(i);}
  	}
  	var valueParts=cleanDecimalnumber.split(',');
  	var jsvalue= valueParts[0]+'.'+valueParts[1];
  	jsvalue=multiplyer*jsvalue;
  	var valuestring=jsvalue.toString();
  	res=valuestring.replace(/\./g, ",");
	}
	return res;
}

/* FORMS */

DBcore.selectedValueOf = function(field) {
  if (field.type=='select-one') {
		 if (field.selectedIndex>-1) {
		 		return field.options[field.selectedIndex].value;
		 } else {
		 	  return field.options[0].value;
		 }
	}
}

DBcore.selectedValuesOf = function(field) {
     var selection=[];
		 for (var i=0;i<field.options.length;i++){
		 		 if (field.options[i].selected) {
				   selection.push(field.options[i].value);
				 }
		 }
		 return selection;
}

DBcore.findDefaultOption = function(field) {
		var  foundIndex=-1;
		for (var i=0;i<field.options.length;i++){
				field.options[i].defaultSelected;
				foundIndex=i;
				break;
		}
		return foundIndex;
}

DBcore.selectedTextOf = function(field) {
  if (field.type=='select-one') {
		 return field.options[field.selectedIndex].text;
	}
}

DBcore.setSelectedValue = function(selectbox,selectvalue) {
		 var targetindex=-1;
		 for (var i=0;i<selectbox.options.length;i++){
		 		 if (selectbox.options[i].value==selectvalue) {
				 		targetindex=i;
						break;
				 }
		 }
		selectbox.selectedIndex=targetindex;
}

DBcore.setRadioValue = function(radiobutton,checkvalue) {
		if (radiobutton.type=='radio') {
  		var butname=radiobutton.name;
  		var inputs= document.getElementsByTagName('input');
			for (var i=0;i<inputs.length;i++) {
					if (inputs[i].type=='radio' && inputs[i].name==butname && inputs[i].value==checkvalue) {
						 inputs[i].checked=true;
						 break;
					}
			}
		}
}

DBcore.getRadioValue = function(radiobutton) {
    var buttonvalue='';
		if (radiobutton.type=='radio') {
			var butname=radiobutton.name;
  		var inputs= document.getElementsByTagName('input');
			for (var i=0;i<inputs.length;i++) {
			 		if (inputs[i].type=='radio' && inputs[i].checked && inputs[i].name==butname) {
						 buttonvalue=inputs[i].value;
						 break;
					}
			}
		}
		return buttonvalue;
}

DBcore.disableChildren = function(enclosingElement,mode) {
   var children = enclosingElement.childNodes;
	 for (var i=0;i<children.length;i++) {
	 		 if (children[i].tagName=='INPUT') {
			 		children[i].disabled=mode;
			 }
	 }
}


/* COOKIES  */

DBcore.hasCookiesEnabled= function() {
	var result=false;
	if (navigator.cookieEnabled != undefined) return navigator.cookieEnabled;
	document.cookie = "testcookie=test; max-age=10000";  // ...in case navigator.cookieEnabled is not supported
	var cookies = document.cookie;
  if (cookies.indexOf("testcookie=test") == -1) {
        result=false;
  } else {
        document.cookie = "testcookie=test; max-age=0";  // Delete cookie again.
        result = true;
  }
	return result;
}

DBcore.getCookie =function(cookiename) {
	var found=false;
	var enabled=DBcore.hasCookiesEnabled();
	var valueArray= [];
	var allcookies = document.cookie;
  if (allcookies != "") {
		 enabled=true;
		 var cookies = allcookies.split(';');
		 var cookie=null;
		 for(var i=0;i<cookies.length;i++) {
		 		if (cookies[i].substring(0,cookiename.length+1) == (cookiename + "=")) {
            cookie = cookies[i];
						found=true;
            break;
        }	
		 }
		 if (found) {
		 		var cookiecontent = cookie.substring(cookiename.length+1);
				var cookieValuepairs = cookiecontent.split('&'); 
				for(var i=0;i<cookieValuepairs.length;i++) {
					cookieValuepairs[i] = cookieValuepairs[i].split(':');
					valueArray[cookieValuepairs[i][0]]= decodeURIComponent(cookieValuepairs[i][1]);
				}
		 }
	}
	return {'enabled':enabled,'found':found,'cookievalues':valueArray};
}

DBcore.getCookieValue=function(cookiename,valuename) { // Depricated. Use getCookieLight...
  var result='';
	var Cookie=DBcore.getCookie(cookiename);
	if (Cookie.enabled && Cookie.found) {
		 result = Cookie.cookievalues[valuename];
	}
	return result;
}

DBcore.getCookieLight =function(name) {
	 var res='';
	 var valuepair;
	 var cookiename;
	 var cookies = document.cookie.split(';');
	 for (var i=0;i<cookies.length;i++) {
	 		 valuepair=cookies[i].split('=');
			 cookiename=DBcore.trim(valuepair[0]);
			 if (cookiename==name) {
			 		res=unescape(valuepair[1]);
					break;
			 }
	 }
	 return res;
}

DBcore.setCookie= function(cookiename,valueObject,daysToLive,path,domain,secure) {
  var valueString='';
	var del='';
  for (var property in valueObject) {
			valueString= del+valueString+property+':'+encodeURIComponent(valueObject[property]);
			del='&';
	}
	var cookie = cookiename + '=' + valueString;
  if (daysToLive || daysToLive == 0) {
        cookie += "; max-age=" + (daysToLive*24*60*60);
  }
  if (path) cookie += "; path=" + path;
  if (domain) cookie += "; domain=" + domain;
  if (secure) cookie += "; secure";
	document.cookie = cookie;	
}


/* MISC. */

DBcore.getJSversion = function(ScriptObject,complianceString) {
  var compliant=true;
	var versionString=ScriptObject.jsversion;
	var versionComponents = versionString.split('.');
	for (var i=0;i<3;i++) {
	  versionComponents[i]=(typeof versionComponents[i] !='undefined') ? parseInt(versionComponents[i],10):0;
	}
	if (arguments.length==2) {
		 var complianceComponents=complianceString.split('.');
		 for (var i=0;i<3;i++) {
		 		 var testvalue= (typeof complianceComponents[i] !='undefined') ? parseInt(complianceComponents[i],10):0;
				 if (testvalue>versionComponents[i]) {
				 		compliant=false;
						break;
				 } else if (testvalue<versionComponents[i]) {
				 	  break;
				 }
		 }
	} else {
	   compliant=false;
	}
  return {'version':versionComponents[0],'subversion':versionComponents[1],'subsubversion':versionComponents[2],'compliant':compliant}
}

DBcore.isInsideFieldgroup = function(field) {
  var isInside=false;
	var element=field.parentNode;
		while (element && element.tagName!='body') {
			 if (DBcore.hasClass(element,'fieldgroup') || DBcore.hasClass(element,'fieldgroupcontent')) {
					isInside=true;
					break;
			 }
			 element=element.parentNode;
		}
	return isInside;
}

DBcore.getURLparams = function() {
	Params={};
	var searchstring=window.location.search.substr(1);
	if (searchstring!='') {
  	var pairs=searchstring.split('&');
  	for (var i=0;i<pairs.length;i++) {
    	var pair=pairs[i].split('=');
			Params[pair[0]]=pair[1];
  	}
	}
	return Params;
}

DBcore.findInArray = function(theArray,searchStr) {
    if (!Array.prototype.find) {
  		Array.prototype.find = function(searchStr) {  
      	var returnArray = false; 
  			if (typeof(theArray) != 'undefined') {
        	for (i=0; i<this.length; i++) {    
        			if (typeof(searchStr) == 'function') {      
        					if (searchStr.test(this[i])) {        
        						if (!returnArray) { returnArray = [] }        
        								returnArray.push(i);      
        						}    
        					} else {      
        					  if (this[i]===searchStr) {        
        							if (!returnArray) { returnArray = [] }        
        							returnArray.push(i);      
        						}    
        					}  
        	}
  			}
      	return returnArray;
      }
		}
		return theArray.find(searchStr);
}

DBcore.filterDomain = function() {
  var dmn=document.domain;
	var parts=dmn.split('.');
	var dot= (dmn.indexOf('co.uk')>-1) ? 3:2;
	if (dot<parts.length) {
		 dmn='';
		 for (var i=parts.length-dot;i<dot;i++) {
		 		 dmn += parts[i]+'.';
		 }
		 dmn += parts[dot];
		 document.domain=dmn;
	}
}

DBcore.cleanupNumber=function(mixedstring) {
	  var Result={number:'',removed:[]};
		var validchars = '0123456789';
		var testchar='';
		for (var i=0;i<mixedstring.length;i++) {
				testchar=mixedstring.charAt(i);
				if (validchars.indexOf(testchar) > -1) {
					 Result.number = Result.number+mixedstring.charAt(i).toString();
				} else {
					 Result.removed.push(mixedstring.charAt(i));
				}
		}
		return Result;
	}
	
DBcore.getLanguagecode= function() {
  var languagecode;
	var htmlatr=document.getElementsByTagName('html')[0].attributes;
  languagecode=htmlatr.lang.value;
	if (document.getElementById('langoverride')) {
			languagecode=document.getElementById('langoverride').value;
	}
	return languagecode;
}

DBcore.fadelement=null;
	
DBcore.setOpacity= function(value) {
	DBcore.fadelement.style.opacity = value/10;
  DBcore.fadelement.style.filter = 'alpha(opacity=' + value*10 + ')';
}


