(function(window) { 

	// public
	window.byclass = function(findclass) {
		var all = document.getElementsByTagName('*');
		for(var k=0;k<all.length;k++) {
			classstr = all[k].className; // getAttribute is broken in IE
			if (typeof(classstr)!="string") { continue; }
			var pattern = new RegExp("(^|\\s)"+findclass+"(\\s|$)");
			var hasclass = (classstr.match(pattern)!=null);
			if (hasclass) return all[k];
		}
		return null;
	}
	window.byid = function(id) {
		return document.getElementById(id);
	}
	window.byname = function(name) {
		return document.getElementsByName(name)[0];
	}
	window.valuesbyname = function(objname) {
		var objs = document.getElementsByName(objname);
		var values = new Array();
		for(index in objs) {
			var element = objs[index];
			if (!element.value) { continue; }
			values.push(element.value);			
		}
		return values;
	}
	window.checkedvaluesbyname = function(objname) {
		var objs = document.getElementsByName(objname);
		var values = new Array();
		for(var i=0; i<objs.length; i++) { // using for(in) loop does not work for arrays in IE!		
			var elementx = objs[i];
			if (typeof elementx.value == 'undefined') { continue; }
			if (elementx.type.toLowerCase()=='checkbox' && elementx.checked==false) { continue; }
			if (elementx.type.toLowerCase()=='radio' && elementx.checked==false) { continue; }
			values.push(elementx.value);			
		}
		return values;
	}
	window.enterkey = function(ev) {
	  	if (ev.keyCode == 13) { 
			return true; 
		} else {
			return false;
		}
	}
	window.idle = function(func,delay) {
		var static = arguments.callee;
		if (static.timeout) { clearTimeout(static.timeout); }
		return static.timeout = setTimeout(func, delay); 
	}
	window.interval = function(func,delay) {
		return setInterval(func,delay);
	}
	window.jumpto = function(name) { 
		window.location.hash = name; 
	}
	window.noenter = function(ev) {
	  	if(ev.keyCode == 13) { return false; }
	}
	window.timeout = function(func,delay) {
		return setTimeout(func,delay);
	}
	window.when = function(conditionfunc,func,checkdelay) {
		if (conditionfunc()) {
			func();
		} else {
			var self = arguments.callee;
			var timeoutfunc = function(){ 
				self(conditionfunc,func,checkdelay); 
			}
			setTimeout(timeoutfunc, checkdelay);
		}
	}
	window.byname_checked = function(name) { 
		var byname = document.getElementsByName(name); 
		for(var i=0;i<byname.length;i++) {
			var obj = byname[i];
			if (typeof obj.checked != 'undefined') 
			if (obj.checked) return obj;
		}
		return null;
	}
	window.databyname = function(name) {
		var objs = document.getElementsByName(name);
		var data = {};
		for(var i=0;i<objs.length;i++) {
			var obj = objs[i];
			if (typeof obj.id == 'undefined') { alert('Mising id for name: '+name); return; }
			if (typeof obj.value == 'undefined') { alert('Mising value for name: '+name); return; }
			data[obj.id] = obj.value;
		} 
		return data;
	}
	window.arraybyname = function(name) {
		var objs = document.getElementsByTagName('*');
		var data = {};
		for(var i=0;i<objs.length;i++) {
			var obj = objs[i];
			if (typeof obj.name == 'undefined') { continue; }
			if (obj.name == '' || obj.name == null) { continue; }
			if (typeof obj.value == 'undefined') { continue; }
			if (obj.name == null) { continue; }

			if (obj.name==name || obj.name.indexOf(name+"[")==0) {
				data[obj.name] = obj.value
			}
		} 
		var finaldata = {};
		for(index in data) {
			var val = data[index];
			index = index.split(']').join('');
			index = index.split('[');
			index.shift();
			var ptr = finaldata;
			for(var i=0;i<index.length;i++) {
				var key = index[i];
				if (typeof ptr[key] == 'undefined') ptr[key] = {};
				if (i==index.length-1) ptr[key] = val;
				ptr = ptr[key];
			}
		}
		return finaldata;
	}
	window.selectoptionbyvalue = function(selectobj,setvalue) {
		var options = selectobj.options;
		for (var i=0;i<options.length;i++) {
			var option = options[i];
			if (option.value==setvalue) {
				selectobj.selectedIndex = i;
				return;
			}
		}
		alert('Value "'+setvalue+'" not found');
	}
	window.firefox = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		return firefox;
	}
	window.firefox10 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox1 = /Firefox\/1\./.test(navigator.userAgent);
		var firefox15 = /Firefox\/1\.5/.test(navigator.userAgent);
		return firefox && firefox1 && !firefox15;
	}
	window.firefox15 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox15 = /Firefox\/1\.5/.test(navigator.userAgent);
		return firefox && firefox15;
	}
	window.firefox20 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox2 = /Firefox\/2\./.test(navigator.userAgent);
		var firefox25 = /Firefox\/2\.5/.test(navigator.userAgent);
		return firefox && firefox2 && !firefox25;
	}
	window.firefox25 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox25 = /Firefox\/2\.5/.test(navigator.userAgent);
		return firefox && firefox25;
	}
	window.firefox30 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox3 = /Firefox\/3\./.test(navigator.userAgent);
		var firefox35 = /Firefox\/3\.5/.test(navigator.userAgent);
		return firefox && firefox3 && !firefox35;
	}
	window.firefox35 = function() {
		// http://www.useragentstring.com/pages/Firefox/
		var firefox = /Firefox/.test(navigator.userAgent);
		var firefox35 = /Firefox\/3\.5/.test(navigator.userAgent);
		return firefox && firefox35;
	}	
	window.safari = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		return gecko && safari && applewebkit;
	}
	window.safari10 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var safari85 = /Safari\/85/.test(navigator.userAgent);
		return gecko && safari && applewebkit && safari85;
	}
	window.safari12 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var safari125 = /Safari\/125/.test(navigator.userAgent);
		return gecko && safari && applewebkit && safari125;
	}
	window.safari13 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var safari3 = /Safari\/3/.test(navigator.userAgent);
		return gecko && safari && applewebkit && safari3;
	}
	window.safari2 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var safari4 = /Safari\/4/.test(navigator.userAgent);
		return gecko && safari && applewebkit && safari4;
	}
	window.safari3 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var version3 = /Version\/3/.test(navigator.userAgent);
		return gecko && safari && applewebkit && version3;
	}
	window.safari4 = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		var version4 = /Version\/4/.test(navigator.userAgent);
		return gecko && safari && applewebkit && version4;
	}
	window.ie = function() {
		// http://www.useragentstring.com/pages/Internet%20Explorer/
		var msie = /MSIE/.test(navigator.userAgent);
		var opera = /Opera/.test(navigator.userAgent);
		return msie && !opera;
	}
	window.ie6 = function() {
		// http://www.useragentstring.com/pages/Internet%20Explorer/
		var msie = /MSIE/.test(navigator.userAgent);
		var msie6 = /MSIE 6/.test(navigator.userAgent);
		var msie8 = /MSIE 8/.test(navigator.userAgent);
		var opera = /Opera/.test(navigator.userAgent);
		return msie && msie6 && !msie8 && !opera;
	}
	window.ie7 = function() {
		// http://www.useragentstring.com/pages/Internet%20Explorer/
		var msie = /MSIE/.test(navigator.userAgent);
		var msie7 = /MSIE 7/.test(navigator.userAgent);
		var opera = /Opera/.test(navigator.userAgent);
		return msie && msie7 && !opera;
	}
	window.ie8 = function() {
		// http://www.useragentstring.com/pages/Internet%20Explorer/
		var msie = /MSIE/.test(navigator.userAgent);
		var msie8 = /MSIE 8/.test(navigator.userAgent);
		var opera = /Opera/.test(navigator.userAgent);
		return msie && msie8 && !opera;
	}
	window.browsertest = function() {
		alert(navigator.userAgent+
			'\n firefox: '+window.firefox()+
			'\n firefox10: '+window.firefox10()+
			'\n firefox15: '+window.firefox15()+
			'\n firefox20: '+window.firefox20()+
			'\n firefox25: '+window.firefox25()+
			'\n firefox30: '+window.firefox30()+
			'\n firefox35: '+window.firefox35()+
			'\n safari: '+window.safari()+
			'\n safari10: '+window.safari10()+
			'\n safari12: '+window.safari12()+
			'\n safari13: '+window.safari13()+
			'\n safari2: '+window.safari2()+
			'\n safari3: '+window.safari3()+
			'\n safari4: '+window.safari4()+
			'\n ie: '+window.ie()+
			'\n ie6: '+window.ie6()+
			'\n ie7: '+window.ie7()+
			'\n ie8: '+window.ie8()
		);
		
		
		
	}

})( window );

