var sims = {
	version: "0.1",
	element_functions: new Array(),
	g: function(){
		if(arguments.length > 0){ var id = arguments[0]; }
		if(arguments.length > 1){ var createSimsEl = arguments[1]; } else { createSimsEl = true; }
		if(document.getElementById(id) == undefined){
			return(false);
		}
		el = document.getElementById(id);
		if(createSimsEl && el.simsEl != true){
			el = sims.createSimsEl(el);
		}
		return(el);
	},
	gByClass: function (classname)  {
		var node = document.body;
		var emty = true;
		var a = [];
		var re = new RegExp('\\b' + classname + '\\b');
		var els = node.getElementsByTagName("*");
		for(var i=0,j=els.length; i<j; i++){
			if( re.test(els[i].className) ){
				if(els[i].simsEl != true){
					els[i] = sims.createSimsEl(els[i]);
				}
				a.push( els[i] );
				emty = false;
			}
		}
		if(emty != true){
			return a;
		} else {
			return(false);
		}
	},
	createAllSimsElements: function(){
		for(tagname in sims.element_functions){
			for( el in document.getElementsByTagName(tagname) ){
				sims.createSimsEl(el);
			}
		}
	},
	setSimsElVar: function(tagname_function,theFunction){
		tagname_function = tagname_function.split(".");
		tagname = tagname_function[0].toUpperCase();
		tagFunction = tagname_function[1];
		if(!sims.element_functions[tagname]){
			sims.element_functions[tagname] = new Array();
		}
		sims.element_functions[tagname][tagFunction] = theFunction;
	},
	createSimsEl: function(el){
		el.toggle = function(displayStyle){
			if(!displayStyle){
				displayStyle = "block";
			}
			if(this.style.display == "none"){
				this.style.display = displayStyle;
			} else {
				this.style.display = "none";
			}
		}
		el.toggleAtribute = function(attribute,value1,value2){
			if(this[attribute] == value1){
				this[attribute] = value2;
			} else {
				this[attribute] = value1;
			}
		}
		el.animationInProgress = false;
		el.shrink = function(shrinkTo,speed,started){
			if(this.animationInProgress && started != true){
				return(false);
			}
			this.animationInProgress = true;
			if(this.id == ""){
				d = new Date();
				this.id = "id" + d.getTime();
			}
			if(speed <= 100){
				speed1 = 101 - speed;
				speed2 = 1;
			} else {
				speed2 = speed - 100;
				speed1 = 1;
			}
			this.style.overflow = "hidden";
			curHeight = this.height();
			if(curHeight > shrinkTo && curHeight > 0){
				if(curHeight < speed2){ curHeight = speed2; };
				this.style.height = parseInt(curHeight) - speed2 + "px";
				setTimeout("sims.g('" + this.id + "').shrink(" + shrinkTo + "," + speed + ",true);",speed1);
			} else {
				this.style.display = "none";
				this.animationInProgress = false;
			}
		}
		el.grow = function(growTo,speed,started){
			if(this.animationInProgress && started != true){
				return(false);
			}
			this.animationInProgress = true;
			this.style.display = "block";
			if(growTo == "auto"){
				tempHeight = this.height();
				this.style.height = "auto";
				growTo = this.offsetHeight;
				this.style.height = tempHeight;
				this.prevHeight = "auto";
			}
			if(this.id == ""){
				d = new Date();
				this.id = "id" + d.getTime();
			}
			if(speed <= 100){
				speed1 = 101 - speed;
				speed2 = 1;
			} else {
				speed2 = speed - 100;
				speed1 = 1;
			}
			this.style.overflow = "hidden";
			curHeight = this.height();
			if(curHeight < growTo){
				if( parseInt(curHeight) + parseInt(speed2) > growTo){
					this.style.height = growTo + "px";
				} else {
					this.style.height = parseInt(curHeight) + speed2 + "px";
				}
				setTimeout("sims.g('" + this.id + "').grow(" + growTo + "," + speed + ",true);",speed1);
			} else {
				this.style.overflow = "visible";
				if(this.prevHeight == "auto"){ this.style.height = "auto"; }
				this.animationInProgress = false;
			}
		}
		el.toggleGrow = function(shrinkTo,growTo,speed){
			if(this.cssProperty('display') == "none"){
				this.grow(growTo,speed);
			} else {
				this.shrink(shrinkTo,speed);
			}
		}
		sims.css.addCssFunctions(el);
		switch(el.tagName){
			case "FORM":
				el.validate = function(dispErrors){ if(dispErrors == ""){ dispErrors = false; } return(sims.security.validateForm(this,dispErrors)); }
			break;
			
			case "INPUT":
				el.validate = function(){
					if(this.value == "" && this.verplicht == false){
						return(true);
					} else if(this.validateAs != ""){
						return(sims.security.validate(this.value,this.validateAs));
					} else if(!this.validateAs){
						return true;
					}
				}
				if(el.type == "file"){
					el.getExtension = function(){
						filename = el.value;
						if(filename != ""){
							var dot = filename.lastIndexOf("."); 
							if( dot == -1 ){
								return false; 
							}
							var extension = filename.substr(dot + 1,filename.length); 
							
							return extension.toLowerCase(); 
						} else {
							return false;
						}
					}
				}
			break;
			
			default:
				
			break;
		}
		
		el.gByClass = function (classname)  {
			var node = this;
			var emty = true;
			var a = [];
			var re = new RegExp('\\b' + classname + '\\b');
			var els = node.getElementsByTagName("*");
			for(var i=0,j=els.length; i<j; i++){
				if( re.test(els[i].className) ){
					if(els[i].simsEl != true){
						a.push( sims.createSimsEl(els[i]) );
					} else {
						a.push( els[i] );
					}
					emty = false;
				}
			}
			if(emty != true){
				return a;
			} else {
				return(false);
			}
		}
		
		if(sims.element_functions[el.tagName]){
			for(varname in sims.element_functions[el.tagName]){
				el[varname] = sims.element_functions[el.tagName][varname];
			}
		}
		
		el.simsEl = true;
		el.insertAfter = function(el){
			var parent = this.parentNode;
			if(parent.lastchild == this) { parent.appendChild(el); } else { parent.insertBefore(el, this.nextSibling); }
		}
		el.remove = function(){
			this.parentNode.removeChild(this);
		}
		el.removeChilds = function(){
			while(this.hasChildNodes()){
				this.removeChild(this.lastChild);
			}
		}
		return(el);
	},
	addOnloadFunction: function(func){
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = func;
		} else {
			window.onload = function() {
				if (oldonload) {
					oldonload();
				}
				func();
			}
		}
	},
	
	url: {
		domain: document.domain,
		uri: location.href.replace(/\?.*/,''),
		queryString: window.location.search.substring(1),
		queryStringRestore: function() { this.queryString = window.location.search.substring(1); },
		queryStringValue: function(valName){
			queryString = this.queryString;
			if(queryString != ""){
				name_valueArray = queryString.split("&");
				for (i=0;i<name_valueArray.length;i++) {
					name_value = name_valueArray[i].split("=");
					if(name_value[0] == valName){
						return name_value[1];
					}
				}
			}
			return(false);
		},
		queryStringAdd: function(valName,valValue){
			valName = escape(valName);
			valValue = escape(valValue);
			queryString = this.queryString;
			queryArray = new Array();
			if(queryString != ""){
				name_valueArray = queryString.split("&");
				for (i=0;i<name_valueArray.length;i++) {
					name_value = name_valueArray[i].split("=");
					name = name_value[0];
					value = name_value[1];
					queryArray[name] = value;
				}
			}
			queryArray[valName] = valValue;
			newQueryString = "";
			for (name in queryArray){
				newQueryString += name + "=" + queryArray[name] + "&";
			}
			newQueryString = newQueryString.substring(0,newQueryString.length-1);
			this.queryString = newQueryString;
			return(newQueryString);
		},
		fullUrl: function(){ 
			if(this.queryString != ""){
				return(this.uri + "?" + this.queryString);
			} else {
				return(this.uri);
			}
		},
		queryStringRemove: function(valName){
			valName = escape(valName);
			queryString = this.queryString;
			queryArray = new Array();
			if(queryString != ""){
				name_valueArray = queryString.split("&");
				for (i=0;i<name_valueArray.length;i++) {
					name_value = name_valueArray[i].split("=");
					name = name_value[0];
					value = name_value[1];
					queryArray[name] = value;
				}
			}
			newQueryString = "";
			for (name in queryArray){
				if(name != valName){
					newQueryString += name + "=" + queryArray[name] + "&";
				}
			}
			newQueryString = newQueryString.substring(0,newQueryString.length-1);
			this.queryString = newQueryString;
			return(newQueryString);
		}	
	},
	//Ajax Functies
	ajax: {
		version: "0.1",
		getResponse: function(url,method,variables){
			xmlHttp = this.getXmlHttpObject();
			if(method == "POST"){
				var poststring = "";
				for (varName in variables){
					poststring += encodeURI(varName) + "=" + encodeURI( variables[varName] ) + "&";
				}
				poststring = poststring.substring(0,poststring.length-1);
				xmlHttp.open('POST', url, false);
				xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				xmlHttp.setRequestHeader("Content-length", poststring.length);
				xmlHttp.setRequestHeader("Connection", "close");
				xmlHttp.send(poststring);
			} else {
				xmlHttp.open("GET",url,false);
				xmlHttp.send(null);
			}
			return(xmlHttp.responseText);
		},
		execResponse: function(url){
			eval(this.getResponse(url));
		},
		getObj: function(url){
			return(eval('(' + this.getResponse(url) + ')'));
		},
		getXmlHttpObject: function(){
			var xmlHttp=null;
			try{
				// Firefox, Opera 8.0+, Safari
				xmlHttp=new XMLHttpRequest();
			}
			catch(e){
				// Internet Explorer
				try{
					xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
				}
				catch(e){
					xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
				}
			}
			return xmlHttp;
		}
	},
	//Math functies
	math: {
		random: function(min,max){
			return Math.floor(Math.random()*(max-min+1)+min);
		}
	},
	//Security functies
	security: {
		validate: function(value,validateAs){
			var r_filter=/^.*$/;
			switch(validateAs){
				case "url":
					r_filter = /^s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/;
				break;
				
				case "pretty_url":
					r_filter = /^[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+$/;
				break;
				
				case "bestandsnaam":
					r_filter = /^[A-Za-z0-9\.\_\(\)\-\ ]+$/;
				break;
			
				case "letters_numbers":
					r_filter = /^([A-Za-z0-9])+$/;
				break;
			
				case "letters_numbers_spaces":
					r_filter = /^([A-Za-z0-9\ ])+$/;
				break;
				
				case "pers_naam":
					r_filter = /^([A-Za-z0-9\ \'\.\-])+$/;
				break;
				
				case "text":
					r_filter = /^([a-zA-Z])+$/;
				break;
				
				case "letters":
					r_filter = /^([a-zA-Z])+$/;
				break;
				
				case "numbers":
					r_filter = /^([0-9])+$/;
				break;
				
				case "email":
					r_filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				break;
		
				case "telnum":
					r_filter = /^(\+?(\(?\d\)?){10,13})$/;
				break;
				
				case "password":
					r_filter = /^[A-Za-z0-9\.\_\#\@\*\&]+$/;
				break;
				
				case "mysql_zoekterm":
					r_filter = /^([A-Za-z0-9\ \*\-\&\@\.\_])+$/;
				break;
				
				case "postcode":
					r_filter = /^[0-9]{4}\s?[A-Za-z]{2}$/;
				break;
				
				default:
					return(false);
				break;
			}
			return( r_filter.test(value) );
		},
		validateForm: function(el,alertErrors){
			allValid = true;
			foutmelding = "Het formulier is niet verwerkt.\n";
			for( var i = 0; i < el.elements.length; i++ ){
				if( el.elements[i].veldnaam != "" && el.elements[i].verplicht == true && el.elements[i].value == ""){
					foutmelding += "- Het veld '" + el.elements[i].veldnaam + "' is verplicht.\n";
					allValid = false;
					if(typeof el.elements[i].onblur == 'function'){
						el.elements[i].onblur();
					}
				} else if (el.elements[i].value != "" && typeof el.elements[i].validate == 'function' && el.elements[i].validateAs && el.elements[i].validate() == false) {
					foutmelding += "- Het veld '" + el.elements[i].veldnaam + "' is niet juist ingevuld.\n";
					allValid = false;
					if(typeof el.elements[i].onblur == 'function'){
						el.elements[i].onblur();
					}
				} else if(typeof el.elements[i].onblur == 'function'){
					el.elements[i].onblur();
				}
			}
			if(allValid == false){
				if(alertErrors){
					alert(foutmelding);
				}
			}
			return(allValid);
		}
	},
	// Google Analitics
	analytics: function(code){
		var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
		document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
		sims.addOnloadFunction(function(){
			try {
				var pageTracker = _gat._getTracker(code);
			} catch(err) {}
		});
	},
	//CSS Tools -> Werkt nu alleen met px, em, %, etc converter maken.
	css: {
		object: true,
		addCssFunctions: function(el){
			el.marginTop = this.marginTop;
			el.marginBottom = this.marginBottom;
			el.paddingTop = this.paddingTop;
			el.paddingBottom = this.paddingBottom;
			el.height = this.height;
			el.cssProperty = this.cssProperty;
		},
		sizeInPx: function(size){
			switch( size.substring(size.length-2) ){
				case "px":
					return( parseInt( size.substring(0,size.length-2) ) );
				break;
				
				default:
					return(false);
				break;
			}
		},
		cssProperty: function(el,property){
			/*if(arguments.length > 0){ var id = arguments[0]; }
			if(arguments.length > 1){ var createSimsEl = arguments[1]; } else { createSimsEl = true; }
			if(document.getElementById(id) == undefined){
			return(false);
			*/
			if(!this.object){
				property = el;
				el = this;
			}
			if( el.currentStyle ){ //IE
				return( el.currentStyle[property] );
			} else if ( document.defaultView && document.defaultView.getComputedStyle ){ // Mozilla
				return( document.defaultView.getComputedStyle(el, null)[property] );
			} else {
				return( el.style[property] );
			}
		},
		height: function(el){
			if(!this.object){
				el = this;
			}
			var height = sims.css.cssProperty(el,'height');

			if(height != "" && height != "auto"){
				return( sims.css.sizeInPx(height) );
			} else {
				return(el.offsetHeight);
			}
		},
		marginTop: function(el){
			if(!this.object){
				el = this;
			}
			var elMarginTop = sims.css.cssProperty(el,'marginTop');
			var elMargin = sims.css.cssProperty(el,'margin');
			if(elMarginTop != ""){
				return( sims.css.sizeInPx(elMarginTop) );
			} else if (elMargin != ""){
				margin = elMargin.split(" ");
				marginTop = margin[0];
				return( sims.css.sizeInPx(marginTop) );
			} else {
				return("auto");
			}
		},
		marginBottom: function(el){
			if(!this.object){
				el = this;
			}
			var elMarginBottom = sims.css.cssProperty(el,'marginBottom');
			var elMargin = sims.css.cssProperty(el,'margin');
			if(elMarginBottom != ""){
				return( sims.css.sizeInPx(elMarginBottom) );
			} else if (elMargin != ""){
				margin = elMargin.split(" ");
				if(margin.length > 2){
					marginBottom = margin[2];
				} else {
					marginBottom = margin[0];
				}
				return( sims.css.sizeInPx(marginBottom) );
			} else {
				return("auto");
			}
		},
		paddingTop: function(el){
			if(!this.object){
				el = this;
			}
			var elPaddingTop = sims.css.cssProperty(el,'paddingTop');
			var elPadding = sims.css.cssProperty(el,'padding');
			if(elPaddingTop != ""){
				return( sims.css.sizeInPx(elPaddingTop) );
			} else if (elPadding != ""){
				padding = elPadding.split(" ");
				paddingTop = padding[0];
				return( sims.css.sizeInPx(paddingTop) );
			} else {
				return("auto");
			}
		},
		paddingBottom: function(el){
			if(!this.object){
				el = this;
			}
			var elPaddingBottom = sims.css.cssProperty(el,'paddingBottom');
			var elPadding = sims.css.cssProperty(el,'padding');
			if(elPaddingBottom != ""){
				return( sims.css.sizeInPx(elPaddingBottom) );
			} else if (elPadding != ""){
				padding = elPadding.split(" ");
				if(padding.length > 2){
					paddingBottom = padding[2];
				} else {
					paddingBottom = padding[0];
				}
				return( sims.css.sizeInPx(paddingBottom) );
			} else {
				return("auto");
			}
		}
	}
}
