var is=new BrowserCheck();
if(typeof utility=='undefined')utility= {};
Object_weave_safe(utility, {math: {}}	);
utility.math.intbgr2hexrgb=function(a) {
	d2h=utility.math.dec2hex;
	pad=utility.math.zeroPad;
	return"#"+pad(d2h(a%256),2)+pad(d2h((a/256)%256),2)+pad(d2h((a/65536)%256),2);
}
utility.math.mozcolor2rgb=function(color) {
	return color;
}
utility.math.dec2hex=function(x) {
	return Number(parseInt(x)).toString(16);
}
utility.math.hex2dec=function(x) {
	return parseInt(x,16);
}
utility.math.zeroPad=function(str,length) {
	if(!str)str="";
		str=str.toString();
	while(str.length<length) {
		str="0"+str;
	}
	return str;
}
utility.math.rgb2hexcolor=function(color) {
	var arr=[];
	if(arr=color.match(/^rgb\(([0-9]+),\s*([0-9]+),\s*([0-9]+)\)/i)) {
		var ret='';
		for(var i=1;i<4;i++) {
			var tmp=utility.math.dec2hex(arr[i]);
			while(tmp.length<2) {
				tmp="0"+tmp;
			}
			ret+=tmp;
		}
		return"#"+ret;
	}
	else {
		return color;
	}
}
/*
CommonSpot custom Utility Functions 
*/
// zeroPad adds 0 in frotn till length
utility.math.util_zeroPad=function(str,length){
	if (!str) str = "";
	str = str.toString();
	while (str.length < length)	{
		str = "0" + str;
	}
	return str;
}
// bgr2rgb
utility.math.intbgr2hexrgb=function(a){
	e = (a+" ").replace(/[^0-9,]*/g, "");  
	arr = e.split(",");
	retVal =  "#" + utility.math.util_zeroPad(utility.math.decimalToHex(arr[0]),2) + 
	               utility.math.util_zeroPad(utility.math.decimalToHex(arr[1]),2) + 
	               utility.math.util_zeroPad(utility.math.decimalToHex(arr[2]),2);
	return retVal;
}
// decimal to hex - should be redone
utility.math.decimalToHex=function(_decimal){
  if (!_decimal) 
    return;
  var inputDecimal = _decimal;
  var inputDecimal1 = parseInt(inputDecimal);
  var outputHex = new String("");
  var outputHex1;
  var decimalLength = inputDecimal.length;
  var decimalDigit;
  var hexDigit;
  var i = 0;
  var j = 0;
  var temp;
  for (j = 0; Math.pow(16,j) <= inputDecimal; j++);
  i = j - 1;
  while (i != -1) {
    temp = Math.floor(inputDecimal1 / Math.pow(16,i));
    if (temp!=0)
      inputDecimal1 = inputDecimal1 - temp*Math.pow(16,i);
    if (temp<10)
      outputHex1 = temp;
    else if (temp==10)
      outputHex1 = "A";
    else if(temp==11)
      outputHex1 = "B";
    else if(temp==12)
      outputHex1 = "C";
    else if(temp==13)
      outputHex1 = "D";
    else if(temp==14)
      outputHex1 = "E";
    else if(temp==15)
      outputHex1 = "F";
    else
      outputHex1 = "";
    outputHex = outputHex + outputHex1;
    i--;
	}
	if(inputDecimal=="0" || inputDecimal=="1")
		outputHex = inputDecimal;
	return outputHex;
}
Object_weave_safe(utility, {js: {}}	);
utility.js.build=function(fun1,fun2) {
	var me=function() {
		if(fun2) {
			fun2();
		}
		if(fun1) {
			fun1();
		}
	}
	return me;
}
utility.js.empty_func=function() {}	;
Object_weave_safe(utility, {debug: {}});
utility.debug.dump=function(obj,sep) {
	if(sep==undefined) {
		sep='';
	}
	tm="";
	if(typeof(obj)=="object") {
		for(i in obj) {
			tm+=sep+i+":{\n"+utility.debug.dump(obj[i],sep+'  ')+"}\n";
		}
		return tm;
	}
	if(typeof(obj)=="function")
		return sep+typeof(obj)+"\n";
	return sep+obj+"\n";
}
function al(obj,rx) {
	alert(utility.debug.dumpone(obj,rx));
}
utility.debug.dumpone=function(obj,rx,sep) {
	if(rx==undefined) {
		rx=new RegExp("","");
	}
	if(sep==undefined) {
		sep='';
	}
	tm="";
	if(typeof(obj)=="object"&&obj!=null) {
		if(typeof(obj.push)!="undefined"&&obj.push.toString().indexOf("[native code]")>0) {
			tm=sep+"Array["+obj.length+"]\n";
		}
		else {
			for(i in obj) {
				if(i.toUpperCase()==i) {
					continue;
				}
				if(!rx.test(i)) {
					continue;
				}
				try {
					if(typeof obj[i]!='function') {
						tm+=sep+i+":{"+obj[i]+"}\n";
					}
					else {}
				}
				catch(err) {
					tm+=sep+i+":ERROR {"+err.message+"}\n";
				}
			}
		}
		return tm;
	}
	if(typeof(obj)=="function")
		return sep+typeof(obj)+"\n";
	return sep+obj+"\n";
}
utility.debug.breakpoint=function(evalFunc,msg,initialExprStr) {
	if(evalFunc==null)
		evalFunc=function(e) {
			return eval(e)
		};
	if(msg==null)
		msg="";
	var result=initialExprStr||"1+2";
	while(true) {
		var expr=prompt("BREAKPOINT: "+msg+"\nEnter an expression to evaluate, or Cancel to continue.",result);
		if(expr==null||expr=="")
			return;
		try {
			result=evalFunc(expr);
		}
		catch(e) {
			result=e;
		}
	}
}
Object_weave_safe(utility, {string: {}}	);
utility.string.decodeURI=function(res) {
	try
	{
		return decodeURI(res);
	}
	catch(e){
		return res;
	}
}
utility.string.encodeURI=function(res) {
	try
	{
		var res = utility.string.decodeURI(res);
	}
	catch(e){}
	return encodeURI(res);
}
utility.string.htmlspecialchars=function(str) {
	Array_each([['>','&gt;'],['<','&lt;'],['\xA0','&nbsp;'],['"','&quot;']],function(repl,idx) {
		str=str.replace(new RegExp('['+repl[0]+']',"g"), repl[1]);
	});
	return str;
}
utility.string.getInnerText=function(str) {
	if(typeof getInnerText_tmpDiv=='undefined') {
		getInnerText_tmpDiv=document.createElement('div');
	}
	var oldstr=str;
	try {
		getInnerText_tmpDiv.innerHTML=str;
		if(is.safari) {
			str=getInnerText_tmpDiv.innerHTML;
			getInnerText_tmpDiv.innerHTML="";
		}
		else {
			str=getInnerText_tmpDiv.innerText;
			getInnerText_tmpDiv.innerHTML="";
		}
	}
	catch(e) {
		return oldstr;
	}
	if(typeof str=='undefined') {
		return oldstr;
	}
	return str;
}
utility.string.sprintf=function() {
	if(!arguments||arguments.length<1||!RegExp) {
		return;
	}
	var str=arguments[0];
	var oldstr=arguments[0];
	var re=/([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
	var a=b=[], numSubstitutions=0, numMatches=0;
	while(a=re.exec(str)) {
	var leftpart=a[1], pPad=a[2], pJustify=a[3], pMinLength=a[4];
	var pPrecision=a[5], pType=a[6], rightPart=a[7];
	numMatches++;
	if(pType=='%') {
		subst='%';
	}
	else {
		numSubstitutions++;
		if(numSubstitutions>=arguments.length) {
			return oldstr;
		}
		var param=arguments[numSubstitutions];
		var subst=param;
		if(pType=='c')
			subst=String.fromCharCode(parseInt(param));
		else if(pType=='d')
			subst=parseInt(param)?parseInt(param):0;
		else if(pType=='s')
			subst=param;
	}
	str=leftpart+subst+rightPart;
	}
	return str;
}
Object_weave_safe(utility, {dom: {}});
utility.dom.getIncludedTags=function(objRef, tagNameList, recurse) {
	if (!objRef || !objRef.childNodes)
		return null;
	var allTags = false;
	if (tagNameList == null || tagNameList.toLowerCase() == 'all')
		allTags = true;
	else
		tagSearchList = ',' + tagNameList.toLowerCase() + ',';
	if (recurse == null)
		recurse = true;
	tagsArray = new Array();
	for (var i = 0; i < objRef.childNodes.length; i++){
		if ( objRef.childNodes[i].tagName &&
						( allTags == true ||
						tagSearchList.indexOf(',' + objRef.childNodes[i].tagName.toLowerCase() + ',') != -1 ) ){
			tagsArray[tagsArray.length] = objRef.childNodes[i];
		}
		if (recurse && objRef.childNodes[i].childNodes)
			utility.dom.getIncludedChildTags(objRef.childNodes[i], tagNameList);
	}
	return tagsArray;
}
utility.dom.getIncludedChildTags=function(parentRef, tagNameList){
	if (!parentRef || !parentRef.childNodes)
		return;
	var allTags = false;
	if (tagNameList == null || tagNameList.toLowerCase() == 'all')
		allTags = true;
	else
		tagSearchList = ',' + tagNameList.toLowerCase() + ',';
	for (var i = 0; i < parentRef.childNodes.length; i++){
		if ( parentRef.childNodes[i].tagName &&
							( allTags == true ||
							tagSearchList.indexOf(',' + parentRef.childNodes[i].tagName.toLowerCase() + ',') != -1 ) ){
			tagsArray[tagsArray.length] = parentRef.childNodes[i];
		}
		if (parentRef.childNodes[i].childNodes.length != 0)
			utility.dom.getIncludedChildTags(parentRef.childNodes[i], tagNameList);
	}
}
utility.dom.setUnselectable=function(el) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}
	if(is.ie) {
		for(var i=0;i<el.all.length;i++) {
			if(el.all[i].tagName!="INPUT"&&el.all[i].tagName!="TEXTAREA") {
				var oldCurr=utility.dom.getStyleProperty(el.all[i],"cursor");
				el.all[i].unselectable="On";
				if(oldCurr=="auto") {
					el.all[i].style.cursor="default";
				}
			}
			else if(el.all[i].type=="text"||el.all[i].tagName=="TEXTAREA") {
				el.all[i].style.cursor="text";
			}
		}
	}
	else {
		var allChilds=utility.dom.getElementsByTagName(el,'*');
		Array_each(allChilds,function(child) {
			var oldCurr=utility.dom.getStyleProperty(child,"cursor");
			var isHtmlEl=(child.nodeType==1)?true: false;
			if(true) {
				var isInput=((child.nodeName.toLowerCase()=="input")&&(child.getAttribute('type')&&child.getAttribute('type').toLowerCase()=='text')||(child.getAttribute('type')&&child.getAttribute('type').toLowerCase()=='password'))?true: false;
				var isTxtArea=(child.nodeName.toLowerCase()=="textarea")?true: false;
				if(!isInput&&!isTxtArea) {
					if(oldCurr=="auto") {
						child.style.cursor="default";
					}
					var hasHTMLChilds=utility.dom.getElementsByTagName(child,'*').length?true:false;
					if(!hasHTMLChilds) {
						child.style.MozUserSelect='none';
					}
				}
				else {
					child.style.cursor="text !important";
				}
			};
		});
	}
};
utility.dom.getPixels=function(m,s) {
	var v=utility.dom.getStyleProperty(m,s);
	if(v=="medium") {
		v=2;
	}
	else {
		v=parseInt(v,10);
	}
	v=isNaN(v)?0:v;
	return v;
};
utility.dom.getBorderBox=function(el,doc) {
	doc=doc||document;
	if(typeof(el)=='string') {
		el=doc.getElementById(el);
	}
	if(!el) {
		return false;
	}
	if(el.parentNode===null||utility.dom.getStyleProperty(el,'display')=='none') {
		return false;
	}
	var ret= {x: 0, y: 0, width: 0, height: 0};
	var parent=null;
	var box;
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(el.getBoundingClientRect) {
		box=el.getBoundingClientRect();
		if(is.ie){
			var scrollTop=doc.documentElement.scrollTop||doc.body.scrollTop;
			var scrollLeft=doc.documentElement.scrollLeft||doc.body.scrollLeft;
		}
		else{
			var scrollTop=utility.dom.getPixels(el,"border-top-width");
			var scrollLeft=utility.dom.getPixels(el,"border-left-width");      
		}   
		ret.x=box.left+scrollLeft;
		ret.y=box.top+scrollTop;
		ret.width=Math.round(box.right-box.left);
		ret.height=box.bottom-box.top;
	}
	else if(doc.getBoxObjectFor) {
		box=doc.getBoxObjectFor(el);
		ret.x=box.x;
		ret.y=box.y;
		ret.width=box.width;
		ret.height=box.height;
		var btw=utility.dom.getPixels(el,"border-top-width");
		var blw=utility.dom.getPixels(el,"border-left-width");
		ret.x-=blw;
		ret.y-=btw;
	}    
	else {
		ret.x=el.offsetLeft;
		ret.y=el.offsetTop;
		ret.width=el.offsetWidth;
		ret.height=el.offsetHeight;
		parent=el.offsetParent;
		if(parent!=el) {
			while(parent) {
				ret.x+=parent.offsetLeft;
				ret.y+=parent.offsetTop;
				parent=parent.offsetParent;
			}
		}
		var blw=utility.dom.getPixels(el,"border-left-width");
		var btw=utility.dom.getPixels(el,"border-top-width");
		ret.x-=blw;
		ret.y-=btw;
		var ua=navigator.userAgent.toLowerCase();
		if(is.opera||is.safari&&utility.dom.getStyleProperty(el,'position')=='absolute') {
			ret.y-=doc.body.offsetTop;
		}
	}
	if(el.parentNode) {
		parent=el.parentNode;
	}
	else {
		parent=null;
	}
	while(parent&&parent.tagName!='BODY'&&parent.tagName!='HTML') {
		ret.x-=parent.scrollLeft;
		ret.y-=parent.scrollTop;
		if(parent.parentNode) {
			parent=parent.parentNode;
		}
		else {
			parent=null;
		}
	}
	return ret;
};
utility.dom.setBorderBox=function(el,box) {
	var pos=utility.dom.getBorderBox(el,el.ownerDocument);
	if(pos===false) {
		return false;
	}
	var delta= {x: utility.dom.getPixels(el,'left'), y: utility.dom.getPixels(el,'top')};
	var new_pos= {x: 0, y: 0};
	if(box.x!==null) {
		new_pos.x=box.x-pos.x+delta.x;
	}
	if(box.y!==null) {
		new_pos.y=box.y-pos.y+delta.y;
	}
	if(box.x!==null) {
		el.style.left=new_pos.x+'px';
	}
	if(box.y!==null) {
		el.style.top=new_pos.y+'px';
	}
	return true;
};
utility.dom.bringIntoView=function(source) {
	var box=utility.dom.getBorderBox(source,source.ownerDocument);
	if(box===false) {
		return false;
	}
	var current= {x: utility.dom.getPixels(source,'left'), y: utility.dom.getPixels(source,'top')};
	var delta= {x: 0, y: 0};
	var offset_fix= {x: 0, y: 0};
	var strictm=source.ownerDocument.compatMode=="CSS1Compat";
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	var doc=(is.ie&&strictm||is.mozilla)?source.ownerDocument.documentElement:source.ownerDocument.body;
	offset_fix.x=utility.dom.getPixels(doc,'border-left-width');
	offset_fix.y=utility.dom.getPixels(doc,'border-top-width');
	var st=doc.scrollTop;
	var ch=doc.clientHeight;
	var t=box.y+(is.ie?-offset_fix.y:offset_fix.y);
	var b=box.y+box.height+(is.ie?-offset_fix.y:offset_fix.y);
	if(b-st>ch) {
		delta.y=ch-(b-st);
		if(t+delta.y<st) {
			delta.y=st-t;
		}
	}
	else if(t<st) {
		delta.y=st-t;
	}
	if(delta.y!=0) {
		source.style.top=(current.y+delta.y)+'px';
	}
	var sl=doc.scrollLeft;
	var cw=doc.clientWidth;
	var l=box.x+(is.ie?-offset_fix.x:offset_fix.x);
	var r=box.x+box.width+(is.ie?-offset_fix.x:offset_fix.x);
	if(r-sl>cw) {
		delta.x=cw-(r-sl);
		if(l+delta.x<sl) {
			delta.x=sl-l;
		}
	}
	else if(l<sl) {
		delta.x=sl-l;
	}
	if(delta.x!=0) {
		source.style.left=(current.x+delta.x)+'px';
	}
};
utility.dom.putElementAt=function(source,target,relative,offset,biv) {
	offset=util_defaultValue(offset, {x: 0,y: 0});
	biv=util_defaultValue(biv,true);
	var si=parseInt(relative.charAt(0), 10);
	var ti=parseInt(relative.charAt(1), 10);
	var source_box=utility.dom.getBorderBox(source,source.ownerDocument);
	var target_box=utility.dom.getBorderBox(target,target.ownerDocument);
	var sx=['0', '-source_box.width', '-source_box.width', '0', '-source_box.width/2', '-source_box.width', '-source_box.width/2', '0', '-source_box.width/2'];
	var tx=['target_box.x', 'target_box.x+target_box.width', 'target_box.x+target_box.width', 'target_box.x', 'target_box.x+target_box.width/2', 'target_box.x+target_box.width', 'target_box.x+target_box.width/2', 'target_box.x', 'target_box.x+target_box.width/2'];
	var sy=['0', '0', '-source_box.height', '-source_box.height', '0', '-source_box.height/2', '-source_box.height', '-source_box.height/2', '-source_box.height/2'];
	var ty=['target_box.y', 'target_box.y', 'target_box.y+target_box.height', 'target_box.y+target_box.height', 'target_box.y', 'target_box.y+target_box.height/2', 'target_box.y+target_box.height', 'target_box.y+target_box.height/2', 'target_box.y+target_box.height/2'];
	var box= {x: 0, y: 0};
	box.x=eval(sx[si]+' + '+tx[ti])+offset.x;
	box.y=eval(sy[si]+' + '+ty[ti])+offset.y;
	utility.dom.setBorderBox(source,box);
	if(biv) {
		utility.dom.bringIntoView(source);
	}
	return true;
};
utility.dom.put=function(el,left,top) {
  el.style.left=left+'px';
  el.style.top=top+'px';
}
utility.dom.resize=function(el,width,height) {
  el.style.width=width+'px';
  el.style.height=height+'px';
}
utility.dom.focusElem=function(elem) {
	var d;
	d=this.getElem(elem);
	if(!d)
		return;
	if(d.focus)
		d.focus();
}
utility.dom.hideElem=function(elem) {
  this.setCssProperty(elem,"display","none");
}
utility.dom.showElem=function(elem,force) {
	var tag_display= {table: 'table', tr: 'table-row', td: 'table-cell'}
	elem=utility.dom.getElem(elem);
	var tn=elem.tagName.toLowerCase();
	var t;
	if(!force) {
		if(typeof tag_display[tn]!='undefined') {
			t=tag_display[tn];
		}
		else {
			t="block";
		}
	}
	else {
		t='force';
	}
	try {
		this.setCssProperty(elem,"display",t);
	}
	catch(e) {
		this.setCssProperty(elem,"display","block");
	}
}
utility.dom.toggleElem=function(elem,force) {
	elem=utility.dom.getElem(elem);
	try {
		if(!elem.style.display||elem.style.display=='none') {
			utility.dom.showElem(elem,force);
		}
		else {
			utility.dom.hideElem(elem);
		}
	}
	catch(e) {}
}
utility.dom.selectOption=function(sel,val) {
	var i;
	if(!sel)
		return;
	for(i=0;i<sel.options.length;i++) {
		sel.options[i].removeAttribute('selected');
	}
	for(i=0;i<sel.options.length;i++) {
		if(sel.options[i].value==val) {
			sel.options[i].setAttribute('selected','selected');
			sel.options[i].selected=true;
			return;
		}
		else {
			sel.options[i].removeAttribute('selected');
		}
	}
}
utility.dom.getSelected=function(sel) {
  return sel.options[sel.selectedIndex].value;
}
utility.dom.getPositionRelativeTo00=function(x,y,w,h) {
	var bw, bh, sw, sh, d;
	if(is.mozilla) {
		bw=document.width;
		bh=document.height;
		sw=window.pageXOffset;
		sh=window.pageYOffset;
	}
	else {
		var strictm=document.compatMode=="CSS1Compat";
		d=strictm?document.documentElement: document.body;
		bw=d.offsetWidth-20;
		bh=d.offsetHeight;
		sw=d.scrollLeft;
		sh=d.scrollTop;
	}
	if(x+w>bw+sw) {
		x=bw+sw-w;
	}
	if(y+h>bh+sh) {
		y=bh+sh-h;
	}
	if(x<0)
		x=0;
	if(y<0)
		y=0;
	return {x: x, y: y};
}
utility.dom.setCssProperty=function(elem,name,value) {
	var d;
	if(!elem||!name||!value)
		return;
	d=this.getElem(elem);
	if(!d)
		return;
	d.style[name]=value;
}
utility.dom.getElem=function(elem) {
	var d;
	if(typeof(elem)=="string") {
		d=document.getElementById(elem);
	}
	else {
		d=elem;
	}
	return d;
}
utility.dom.getClassNames=function(o) {
	o=utility.dom.getElem(o);
	if(!o)
		return false;
	var cn=String_trim(String_normalize_space(o.className));
	if(cn=='') {
		return[];
	}
	return cn.split(" ");
}
utility.dom.classNameAdd=function(obj,toadd) {
	var cls=utility.dom.getClassNames(obj);
	if(typeof toadd=='string') {
		toadd=toadd.split(',');
	}
	Array_each(toadd,function(item,i) {
		if(Array_indexOf(cls,item)==-1) {
			Array_push(cls,item);
		}
	});
	cls=String_trim(cls.join(' '));
	if(String_trim(obj.className)!=cls) {
		obj.className=cls;
	}
}
utility.dom.classNameRemove=function(obj,toremove) {
	var cls=utility.dom.getClassNames(obj);
	var result=[];
	if(typeof toremove=='string') {
		toremove=toremove.split(',');
	}
	Array_each(cls,function(item,i) {
		if(Array_indexOf(toremove,item)==-1) {
			Array_push(result,item);
		}
	});
	cls=String_trim(result.join(' '));
	if(String_trim(obj.className)!=cls) {
		obj.className=cls;
	}
}
utility.dom.insertAfter=function(newElement,targetElement) {
	var sibling=targetElement.nextSibling;
	var parent=targetElement.parentNode;
	if(sibling==null) {
		var toret=parent.appendChild(newElement);
	}
	else {
		var toret=parent.insertBefore(newElement,sibling);
	}
	return toret;
}
utility.dom.getPreviousSiblingByTagName=function(t,siblingName,allowSameTag) {
	if((t.nodeName.toLowerCase()==siblingName.toLowerCase())&&!allowSameTag) {
		return t;
	}
	while(t.previousSibling&&t.previousSibling.nodeName.toLowerCase()!=siblingName.toLowerCase()) {
		t=t.previousSibling;
	}
	if(t.previousSibling&&t.previousSibling.nodeName.toLowerCase()==siblingName.toLowerCase()) {
		return t.previousSibling;
	}
	else {
		return null;
	}
}
utility.dom.getNextSiblingByTagName=function(t,siblingName,allowSameTag) {
	if((t.nodeName.toLowerCase()==siblingName.toLowerCase())&&!allowSameTag) {
		return t;
	}
	while(t.nextSibling&&t.nextSibling.nodeName.toLowerCase()!=siblingName.toLowerCase()) {
		t=t.nextSibling;
	}
	if(t.nextSibling&&t.nextSibling.nodeName.toLowerCase()==siblingName.toLowerCase()) {
		return t.nextSibling;
	}
	else {
		return null;
	}
}
utility.dom.getParentByTagName=function(t,parentName) {
	if(t.nodeName.toLowerCase()==parentName.toLowerCase()) {
		return t;
	}
	while(t.parentNode&&t.parentNode.nodeName.toLowerCase()!=parentName.toLowerCase()&&t.parentNode.nodeName!='BODY') {
		t=t.parentNode;
	}
	if(t.parentNode&&t.parentNode.nodeName.toLowerCase()==parentName.toLowerCase()) {
		return t.parentNode;
	}
	else {
		return null;
	}
}
utility.dom.getElementsByTagName=function(o,sTagName) {
	var el;
	if(typeof o=='undefined') {
		o=document;
	}
	else {
		o=utility.dom.getElem(o);
	}
	if(sTagName=='*'||typeof sTagName=='undefined') {
		el=utility.dom.getAllChildren(o);
	}
	else {
		el=o.getElementsByTagName(sTagName.toLowerCase());
	}
	return el;
}
utility.dom.getElementsByClassName=function(o,sClassName,sTagName) {
	var elements=[];
	Array_each(utility.dom.getElementsByTagName(o,sTagName), function(elem,i) {
		if(Array_indexOf(utility.dom.getClassNames(elem), sClassName)!=-1) {
			Array_push(elements,elem);
		}
	});
	return elements;
}
utility.dom.getElementById=function(o,sId,sTagName) {
	var elements=[];
	Array_each(utility.dom.getElementsByTagName(o,sTagName), function(elem,i) {
		if(typeof elem.id!="undefined"&&elem.id!=null&&elem.id.toString()==sId) {
			Array_push(elements,elem);
		}
	});
	return elements;
}
utility.dom.getElementsByProps=function(start,props_hash) {
	var unfiltered, toret=[];
	if(typeof(start)=='undefined') {
		start=document;
	}
	else {
		start=utility.dom.getElem(o);
	}
	if(o.all) {
		unfiltered=o.all;
	}
	else {
		unfiltered=o.getElementsByTagName('*');
	}
	Array_each(unfiltered,function(item) {
		var cond=true;
		for(i in props_hash) {
			try {
				var value=item[i];
			}
			catch(e) {
				value=null;
			}
			cond=cond&&(value==props_hash[i]);
		}
		if(cond) {
			Array_push(toret,item);
		}
	});
	return toret;
}
utility.dom.getChildrenByTagName=function(elem,tag) {
	var result=[];
	var x;
	if(typeof(tag)=='undefined')
		tag='*';
	tag=tag.toLowerCase();
	if(!elem.childNodes)
		return result;
	for(var i=0;i<elem.childNodes.length;i++) {
		x=elem.childNodes[i];
		try {
			if((typeof(x)!='undefined'&&typeof(x.tagName)!='undefined'&&x.tagName.toLowerCase()==tag)||tag=='*') {
				Array_push(result,x);
			}
		}
		catch(e) {}
	}
	return result;
}
utility.dom.getChildrenByClassName=function(elem,sClassName,sTagName) {
	var result=[];
	result=Array_each(utility.dom.getChildrenByTagName(sTagName), function(elem,i) {
		if(Array_indexOf(utility.dom.getClassNames(item), sClassName)!=-1) {
			Array_push(result,elem);
		}
	});
}
utility.dom.getAllChildren=function(e) {
  return e.all?e.all: e.getElementsByTagName('*');
}
utility.dom.getElementsBySelector=function(selector,startfrom) {
	if(typeof startfrom=='undefined') {
		startfrom=document;
	}
	if(!document.getElementsByTagName) {
		return[];
	}
	var tokens=selector.split(' ');
	var currentContext=new Array(startfrom);
	for(var i=0;i<tokens.length;i++) {
		token=tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');
		if(token.indexOf('#')>-1) {
			var bits=token.split('#');
			var tagName=bits[0];
			var id=bits[1];
			var element=document.getElementById(id);
			if(element&&tagName&&element.nodeName.toLowerCase()!=tagName) {
				return[];
			}
			currentContext=new Array(element);
			continue;
		}
		if(token.indexOf('.')>-1) {
			var bits=token.split('.');
			var tagName=bits[0];
			var className=bits[1];
			if(!tagName) {
				tagName='*';
			}
			var found=new Array;
			var foundCount=0;
			for(var h=0;h<currentContext.length;h++) {
				var elements;
				if(tagName=='*') {
					elements=utility.dom.getAllChildren(currentContext[h]);
				}
				else {
					elements=currentContext[h].getElementsByTagName(tagName);
				}
				for(var j=0;j<elements.length;j++) {
					found[foundCount++]=elements[j];
				}
			}
			currentContext=new Array;
			var currentContextIndex=0;
			for(var k=0;k<found.length;k++) {
				if(found[k].className&&found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
					currentContext[currentContextIndex++]=found[k];
				}
			}
			continue;
		}
		if(token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
			var tagName=RegExp.$1;
			var attrName=RegExp.$2;
			var attrOperator=RegExp.$3;
			var attrValue=RegExp.$4;
			if(!tagName) {
				tagName='*';
			}
			var found=new Array;
			var foundCount=0;
			for(var h=0;h<currentContext.length;h++) {
				var elements;
				if(tagName=='*') {
					elements=utility.dom.getAllChildren(currentContext[h]);
				}
				else {
					elements=currentContext[h].getElementsByTagName(tagName);
				}
				for(var j=0;j<elements.length;j++) {
					found[foundCount++]=elements[j];
				}
			}
			currentContext=new Array;
			var currentContextIndex=0;
			var checkFunction;
			switch(attrOperator) {
				case'=': 
					checkFunction=function(e) {
						try {
							return(e.getAttribute(attrName).toString()==attrValue);
						}
						catch(ex) {}
					};
					break;
				case'~':
					checkFunction=function(e) {
						try {
							return(e.getAttribute(attrName).toString().match(new RegExp(attrValue)));
						}
						catch(ex) {
							return false;
						}
					};
					break;
				case'|':
					checkFunction=function(e) {
						return(e.getAttribute(attrName).toString().match(new RegExp('^'+attrValue+'-?')));
					};
					break;
				case'^':
					checkFunction=function(e) {
						return(e.getAttribute(attrName).toString().indexOf(attrValue)==0);
					};
					break;
				case'$':
					checkFunction=function(e) {
						return(e.getAttribute(attrName).toString().lastIndexOf(attrValue)==e.getAttribute(attrName).length-attrValue.length);
					};
					break;
				case'*':
					checkFunction=function(e) {
						return(e.getAttribute(attrName).toString().indexOf(attrValue)>-1);
					};
					break;
				default:
					checkFunction=function(e) {
						return e.getAttribute(attrName);
					};
			}
			currentContext=new Array;
			var currentContextIndex=0;
			for(var k=0;k<found.length;k++) {
				if(checkFunction(found[k])) {
					currentContext[currentContextIndex++]=found[k];
				}
			}
			continue;
		}
		tagName=token;
		var found=new Array;
		var foundCount=0;
		for(var h=0;h<currentContext.length;h++) {
			if(currentContext[h]!=null) {
				var elements=currentContext[h].getElementsByTagName(tagName);
				for(var j=0;j<elements.length;j++) {
					found[foundCount++]=elements[j];
				}
			}
		}
		currentContext=found;
	}
	return currentContext;
}
utility.dom.createForm=function(options,inputs,doc) {
	if(typeof options=='undefined')
		options= {};
	if(typeof inputs=='undefined')
		inputs=[];
	if(typeof doc=='undefined')
		doc=document;
	var default_options= {name: '', id: '', action: '', method: 'POST', target: ''}
	options=Object_weave_safe(options,default_options);
	var frm=utility.dom.createElement("FORM", {name: options.name,id: options.id,action: options.action,method: options.method,style: "display: none",acceptCharset: jsCharset});
	Array_each(inputs,function(input,i) {
		frm.appendChild(utility.dom.createElement('INPUT', {'type': 'hidden','id': input[0],'name': input[0],'value': input[1]}));
	});
	frm.appendChild(utility.dom.createElement('INPUT', {'type': 'hidden','id': '_charset_','name': '_charset_'}));
	frm=doc.body.appendChild(frm);
	frm.target=options.target;
	return frm;
}
utility.dom.createIframe=function(options,doc) {
	if(typeof options=='undefined')
		options= {};
	if(typeof doc=='undefined')
		doc=document;
	var default_options= {name: '', id: '', src: options.src}
	options=Object_weave_safe(options,default_options);
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	if(is.mozilla) {
		var ifr=utility.dom.createElement('iframe', {'id': options.id,'name': options.name,'style': 'display: none;'});
		ifr.src=options.src;
		ifr=doc.body.appendChild(ifr);
		ifr.name=options.name;
		ifr.id=options.id;
	}
	else if(is.ie) {
		var str='<iframe name="'+options.name+'" src="'+options.src+'" id="'+options.id+'" style="display: none;"></iframe>';
		var dv=doc.createElement('div');
		doc.body.appendChild(dv);
		dv.innerHTML=str;
	}
	var ifr=doc.getElementById(options.id);
	return ifr;
}
utility.dom.addIframeLoad=function(ifr,functor) {
	if(is.mozilla) {
		ifr.onload=function() {
			functor();
		}
	}
	else {
		ifr.onreadystatechange=function() {
			if(ifr.readyState=='complete') {
				functor();
			}
		}
	}
}
utility.dom.removeIframeLoad=function(ifr) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(is.ie) {
		ifr.onreadystatechange=function() {};
	}
	if(is.mozilla) {
		ifr.onload=function() {};
	}
}
utility.dom.buildUrl=function() {}
utility.dom.stripAttributes=function(el,additional_arr) {
	var cearElementProps=['onload', 'data', 'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'ondblclick', 'onclick', 'onselectstart', 'oncontextmenu', 'onkeydown', 'onkeypress', 'onkeyup', 'onblur', 'onfocus', 'onbeforedeactivate', 'onchange'];
	if(typeof el=='undefined'||el==null) {
		return true;
	}
	for(var c=cearElementProps.length;c--;) {
		el[cearElementProps[c]]=null;
	}
	if(typeof additional_arr!='undefined') {
		for(var c=additional_arr.length;c--;) {
			el[additional_arr[c]]=null;
		}
	}
}
utility.dom.attachEvent2=function(where,type,what,when) {
  utility.dom.attachEvent_base(where,type,what,when,1);
}
utility.dom.attachEvent=function(where,type,what,when) {
  utility.dom.attachEvent_base(where,type,what,when,0);
}
  
// Begin: FIX (Issue 2794) -- Part 1 of 2.
// New code: Called in raiseEvent below. Fixes broken src of the dragged-and-dropped image in RTE.
utility.dom.fixDragDropImgSrc = function(ktmlFrObj, imageID, imageSrc){
	 ktmlFrObj.getElementById(imageID).setAttribute('src', imageSrc);
}
// End: FIX (Issue 2794) -- Part 1 of 2.
  
utility.dom.attachEvent_base=function(where,type,what,when,add_first) {
	if(typeof(when)=='undefined')
		when=1;
	var doNotAdd=type.match(/unload$/i);
	var real_type=type.match(/^on/)?type: 'on'+type;
	var logical_type=type.replace(/^on/,'');
	if(typeof where.__eventHandlers=='undefined') {
		where.__eventHandlers= {};
	}
	var place=null;
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	if(typeof where.__eventHandlers[logical_type]=='undefined') {
		where.__eventHandlers[logical_type]=[];
		place=where.__eventHandlers[logical_type];
		var fixDragDrop = '';
		if(is.mozilla&&logical_type=='mousedown'){
			fixDragDrop = function(e) {
				if(!e&&window.event) {
					e=window.event;
				}
				// Begin: FIX (Issue 2794) -- Part 2 of 2.
				// New code:
				// e.target.src retains the correct src value which is used to fix the broken src of the dragged-and-dropped image in RTE.
				if (!Ktml_object && opener)
					var Ktml_object = opener.Ktml_object;
				if (Ktml_object){
					var pNode = (e.target).parentNode;
					var str = pNode.innerHTML;
					if(/(\.\.\/){2}/.test(str)){
						if (typeof util_removeSiteNameFromHTMLForPaste != 'undefined')
							pNode.innerHTML = util_removeSiteNameFromHTMLForPaste(Ktml_object,str);
					}
				}
			}
		}
		// End: FIX (Issue 2794) -- Part 2 of 2.		

		var raiseEvent=function(e) {
			if(!e&&window.event) {
				e=window.event;
			}
			for(var i=0;i<where.__eventHandlers[logical_type].length;i++) {
				var f=where.__eventHandlers[logical_type][i];
				if(typeof f=='function') {
					f.apply(where,[e]);
					f=null;
				}
			}
		}
		if(where.addEventListener) {
			where.addEventListener(logical_type,raiseEvent,false);
			if(fixDragDrop!='')
				where.addEventListener(logical_type,fixDragDrop,false);
		}
		else if(where.attachEvent) {
			where.attachEvent("on"+logical_type,raiseEvent);
			if(fixDragDrop!='')
				where.attachEvent("on"+logical_type,fixDragDrop);
		}
		else {
			where["on"+logical_type]=raiseEvent;
			if(fixDragDrop!='')
				where["on"+logical_type]=fixDragDrop;
			
		}
		if((!(is.ie&&is.mac))&&!doNotAdd) {
			EventCache.add(where,logical_type,raiseEvent,1);
			if(fixDragDrop!='')
				EventCache.add(where,logical_type,fixDragDrop,1);
		}
	}
	else {
		place=where.__eventHandlers[logical_type];
	}
	for(var i=0;i<place.length;i++) {
		if(place[i]==what) {
			return;
		}
	}
	place[place.length]=what;
};
var EventCache=function() {
	var listEvents=[];
	return {listEvents: listEvents, add: function(node,sEventName,fHandler,bCapture) {
		Array_push(listEvents,arguments);
	}, flush:function() {
		var i, item;
		for(i=listEvents.length-1;i>=0;i=i-1) {
			item=listEvents[i];
			if(!item) {
				continue;
			}
			if(item[0].removeEventListener) {
				item[0].removeEventListener(item[1],item[2],item[3]);
			};
			var logical_type='';
			if(item[1].substring(0,2)!="on") {
				logical_type=item[1];
				item[1]="on"+item[1];
			}
			else {
				logical_type=item[1].substring(2,event_name_without_on.length);
			};
			if(typeof item[0].__eventHandlers!='undefined'&&typeof item[0].__eventHandlers[logical_type]!='undefined') {
				item[0].__eventHandlers[logical_type]=null;
			}
			if(item[0].detachEvent) {
				item[0].detachEvent(item[1],item[2]);
			};
			item[0][item[1]]=null;
		};
		listEvents=null;
	}
};
}();
utility.dom.getStyleProperty=function(el,property) {
	try {
		var value=el.style[property];
	}
	catch(e) {
		return"";
	}
	if(!value) {
		if(el.ownerDocument.defaultView && typeof(el.ownerDocument.defaultView.getComputedStyle)=="function") {
			value=el.ownerDocument.defaultView.getComputedStyle(el,"");
			if(value){
				value = value.getPropertyValue(property);
			}
		}
		else if(el.currentStyle) {
			var m=property.split(/-/);
			if(m.length>0) {
				property=m[0];
				for(var i=1;i<m.length;i++) {
					property+=m[i].charAt(0).toUpperCase()+m[i].substring(1);
				}
			}
			value=el.currentStyle[property];
		}
		else if(el.style) {
		value=el.style[property];
		}
	}
	//alert ('1038'+value); 
	return value;
}
utility.dom.getLink=function(link) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(!is.ie) {
		href=link.getAttribute('href');
	}
	else {
		if(!is.mac) {
			href=link.outerHTML.toString().replace(/.*href="([^"]*)".*/, "$1");
		}
		else {
			href=link.getAttribute('href');
		}
	}
	return href;
}
utility.dom.getDisplay=function(el) {
  return utility.dom.getStyleProperty(el,'display');
}
utility.dom.getVisibility=function(el) {
  return utility.dom.getStyleProperty(el,'visibility');
}
var first_getAbsolutePos_caller_element=null;
utility.dom.getAbsolutePos=function(el) {
	var scrollleft=0, scrolltop=0, tn=el.tagName.toUpperCase();
	if(utility.dom.getAbsolutePos.caller!=utility.dom.getAbsolutePos) {
		first_getAbsolutePos_caller_element=el;
	}
	if(Array_indexOf(['BODY','HTML'],tn)==-1&&first_getAbsolutePos_caller_element!=el) {
		if(el.scrollLeft) {
			scrollleft=el.scrollLeft;
		}
		if(el.scrollTop) {
			scrolltop=el.scrollTop;
		}
	}
	var r= {x: el.offsetLeft-scrollleft, y: el.offsetTop-scrolltop};
	if(el.offsetParent&&tn!='BODY') {
		var tmp=utility.dom.getAbsolutePos(el.offsetParent);
		r.x+=tmp.x;
		r.y+=tmp.y;
	}
	return r;
}
utility.dom.setEventVars=function(e) {
	var targ;
	var relTarg;
	var posx=0;
	var posy=0;
	if(!e) {
		e=window.event;
	}
	if(!e) {
		return {'e': null, 'relTarg': null, 'targ': null, 'posx': 0, 'posy': 0, 'leftclick': false, 'middleclick': false, 'rightclick': false, 'type': ''};
	}
	if(e.relatedTarget) {
		relTarg=e.relatedTarget;
	}
	else if(e.fromElement) {
		relTarg=e.fromElement;
	}
	if(e.target) {
		targ=e.target;
	}
	else if(e.srcElement) {
		targ=e.srcElement;
	}
	var st=utility.dom.getPageScroll();
	if(e.pageX||e.pageY) {
		posx=e.pageX;
		posy=e.pageY;
	}
	else if(e.clientX||e.clientY) {
		posx=e.clientX+st.x;
		posy=e.clientY+st.y;
	}
	if(window.event) {
		var leftclick=(e.button==1);
		var middleclick=(e.button==4);
		var rightclick=(e.button==2);
	}
	else {
		var leftclick=(e.button==0);
		var middleclick=(e.button==1);
		var rightclick=(e.button==2||e.button==0&&is.mac&&e.ctrlKey);
	}
	var o= {'e': e, 'relTarg': relTarg, 'targ': targ, 'posx': posx, 'posy': posy, 'leftclick': leftclick, 'middleclick': middleclick, 'rightclick': rightclick}
	try {
		o.type=e.type;
	}
	catch(err) {
		o.type='';
	}
	return o;
}
utility.dom.stopEvent=function(e) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}
	if(typeof e!="undefined"&&e!=null) {
		if(is.ie) {
			e.cancelBubble=true;
		}
		if(e.stopPropagation) {
			e.stopPropagation();
		}
		if(is.ie) {
			e.returnValue=false;
		}
		if(e.preventDefault) {
			e.preventDefault();
		}
	}
	return false;
}
utility.dom.toggleSpecialTags=function(el,exclude,mode,documentObject,boxRecipient) {
	var hide_tags=['select'];
	if(mode==1) {
		var boxObject=utility.dom.getBox(el);
	}
	for(var i=0;i<hide_tags.length;i++) {
		var _document=null;
		if(documentObject&&documentObject.nodeType&&(documentObject.nodeType==9)) {
			_document=documentObject;
			utility.dom.toggleSpecialTags._saved_DOC=documentObject;
		}
		else if(documentObject&&utility.dom.toggleSpecialTags._saved_DOC&&utility.dom.toggleSpecialTags._saved_DOC.nodeType&&(utility.dom.toggleSpecialTags._saved_DOC.nodeType==9)) {
			_document=utility.dom.toggleSpecialTags._saved_DOC;
		}
		else {
			_document=document;
		};
		var arr=_document.getElementsByTagName(hide_tags[i]);
		for(var j=0;j<arr.length;j++) {
			if(exclude==arr[j]) {
				continue;
			}
			if(mode==1) {
				var cVisibility=utility.dom.getVisibility(arr[j]);
				var cDisplay=utility.dom.getDisplay(arr[j]);
				if(cDisplay=="none"||cVisibility=="hidden") {
					continue;
				}
				var boxSelect=utility.dom.getBox(arr[j]);
				if(boxRecipient) {
					var parentBox=utility.dom.getBox(boxRecipient);
					boxSelect.x+=parentBox.x;
					boxSelect.y+=parentBox.y;
				}
				var overlap=utility.dom.boxOverlap(boxObject,boxSelect);
				if(overlap) {
					if(documentObject&&boxRecipient) {
						if(!arr[j].oldPosition) {
							var cPosition=utility.dom.getStyleProperty(arr[j],"position");
							arr[j].oldPosition=cPosition;
						}
						if(!arr[j].oldLeft) {
							var cLeft=utility.dom.getStyleProperty(arr[j],"left");
							arr[j].oldLeft=cLeft;
						}
						arr[j].style.position="relative";
						arr[j].style.left="-1000px";
					}
					else {
						if(!arr[j].oldvisibility) {
							arr[j].oldvisibility=cVisibility;
						}
						arr[j].style.visibility='hidden';
					}
				}
			}
			else {
				if(documentObject&&boxRecipient) {
					if(arr[j].oldPosition) {
						arr[j].style.position=arr[j].oldPosition;
						arr[j].removeAttribute("oldPosition");
					}
					if(arr[j].oldLeft) {
						arr[j].style.left=arr[j].oldLeft;
						arr[j].removeAttribute("oldLeft");
					}
				}
				else {
					if(arr[j].oldvisibility) {
						arr[j].style.visibility=arr[j].oldvisibility;
					}
				}
			}
		}
	}
}
utility.dom.boxOverlap=function(b1,b2) {
	if((b1.x+b1.width)<b2.x||b1.x>(b2.x+b2.width)||(b1.y+b1.height)<b2.y||b1.y>(b2.y+b2.height)||false) {
		return false;
	}
	return true;
}
utility.dom.getBox=function(el) {
	var box= {"x": 0, "y": 0, "width": 0, "height": 0, "scrollTop": 0, "scrollLeft": 0};
	var strictm=el.ownerDocument.compatMode=="CSS1Compat";
	if(el.getBoundingClientRect) {
		var rect=el.getBoundingClientRect();
		box.x=rect.left;
		box.y=rect.top;
		box.width=rect.right-rect.left;
		box.height=rect.bottom-rect.top;
		box.scrollLeft=0;
		box.scrollTop=0;
		if (is.mozilla){
			box.scrollLeft=(strictm?el.ownerDocument.documentElement: el.ownerDocument.body).scrollLeft;
			box.scrollTop=(strictm?el.ownerDocument.documentElement: el.ownerDocument.body).scrollTop;
		}    
	}  
	else if(el.ownerDocument.getBoxObjectFor) { // firefox 2 and less
		var rect=el.ownerDocument.getBoxObjectFor(el);
		box.x=rect.x-el.parentNode.scrollLeft;
		box.y=rect.y-el.parentNode.scrollTop;
		box.width=rect.width;
		box.height=rect.height;
		box.scrollLeft=(strictm?el.ownerDocument.documentElement: el.ownerDocument.body).scrollLeft;
		box.scrollTop=(strictm?el.ownerDocument.documentElement: el.ownerDocument.body).scrollTop;
	}
	else {
		var tmp=utility.dom.getAbsolutePos(el);
		box.x=tmp.x-el.parentNode.scrollLeft;
		box.y=tmp.y-el.parentNode.scrollTop;
		box.width=utility.dom.getStyleProperty(el,'width');
		box.height=utility.dom.getStyleProperty(el,'height');
		box.scrollLeft=el.ownerDocument.body.scrollLeft;
		box.scrollTop=el.ownerDocument.body.scrollTop;
	}
	return box;
}
utility.dom.getBBox=function(el) {
	var box= {"x": 0, "y": 0, "width": 0, "height": 0, "scrollTop": 0, "scrollLeft": 0};
	var strictm=el.ownerDocument.compatMode=="CSS1Compat";
	if(el.getBoundingClientRect && is.mozilla) { // firefox 3 and above
		var doc=strictm?el.ownerDocument.documentElement: document;
		var bt=parseInt(utility.dom.getStyleProperty(el,"border-top-width"));
		var bl=parseInt(utility.dom.getStyleProperty(el,"border-left-width"));
		var br=parseInt(utility.dom.getStyleProperty(el,"border-right-width"));
		var bb=parseInt(utility.dom.getStyleProperty(el,"border-bottom-width"));
		var rect=el.getBoundingClientRect()
		var sl=0;
		var st=0;
		while(el.parentNode) {
			if(el.scrollTop) {
				st+=el.scrollTop;
			}
			if(el.scrollLeft) {
				sl+=el.scrollLeft;
			}
			el=el.parentNode;
		}
		box.scrollLeft=sl;
		box.scrollTop=st;
		box.x=Math.round(rect.left)-bl-sl;
		box.y=Math.round(rect.top)-bt-st;
		box.width=Math.round(rect.right-rect.left);
		box.height=Math.round(rect.bottom-rect.top);
	}
	else if(el.getBoundingClientRect && !is.mozilla) {
		var pel=strictm?el.ownerDocument.documentElement: document.body;
		var bt=parseInt(utility.dom.getStyleProperty(el,"border-top-width"))||0;
		var bl=parseInt(utility.dom.getStyleProperty(el,"border-left-width"))||0;
		var rect=el.getBoundingClientRect();
		box.x=rect.left-bl;
		box.y=rect.top-bt;
		box.width=rect.right-rect.left;
		box.height=rect.bottom-rect.top;
		box.scrollLeft=0;
		box.scrollTop=0;
	}
	else if(el.ownerDocument.getBoxObjectFor) { // firefox 2 ??
		var doc=strictm?el.ownerDocument.documentElement: document;
		var bt=parseInt(utility.dom.getStyleProperty(el,"border-top-width"));
		var bl=parseInt(utility.dom.getStyleProperty(el,"border-left-width"));
		var br=parseInt(utility.dom.getStyleProperty(el,"border-right-width"));
		var bb=parseInt(utility.dom.getStyleProperty(el,"border-bottom-width"));
		var rect=el.ownerDocument.getBoxObjectFor(el);
		var sl=0;
		var st=0;
		while(el.parentNode) {
			if(el.scrollTop) {
				st+=el.scrollTop;
			}
			if(el.scrollLeft) {
				sl+=el.scrollLeft;
			}
			el=el.parentNode;
		}
		box.scrollLeft=sl;
		box.scrollTop=st;
		box.x=rect.x-bl-sl;
		box.y=rect.y-bt-st;
		box.width=rect.width;
		box.height=rect.height;
	} 
	else {
		var pel=el.ownerDocument.documentElement;
		var mt=parseInt(utility.dom.getStyleProperty(pel,"margin-top"));
		var ml=parseInt(utility.dom.getStyleProperty(pel,"margin-left"));
		var bt=parseInt(utility.dom.getStyleProperty(pel,"border-top-width"));
		var bl=parseInt(utility.dom.getStyleProperty(pel,"border-left-width"));
		var pt=parseInt(utility.dom.getStyleProperty(pel,"padding-top"));
		var pl=parseInt(utility.dom.getStyleProperty(pel,"padding-left"));
		pel=el.offsetParent;
		var mt2=parseInt(utility.dom.getStyleProperty(pel,"margin-top"));
		var ml2=parseInt(utility.dom.getStyleProperty(pel,"margin-left"));
		var bt2=0;
		var bl2=0;
		var pt2=0;
		var pl2=0;
		var tmp=utility.dom.getAbsolutePos(el);
		box.x=tmp.x;
		box.y=tmp.y;
		box.width=parseInt(utility.dom.getStyleProperty(el,'width'));
		box.height=parseInt(utility.dom.getStyleProperty(el,'height'));
		box.scrollLeft=el.ownerDocument.body.scrollLeft;
		box.scrollTop=el.ownerDocument.body.scrollTop;
		if(is.opera) {
			box.x-=(ml+bl+pl+ml2);
			box.y-=mt+bt+pt+mt2;
		}
	}
	return box;
}
utility.dom.getPageInnerSize=function() {
	var x, y;
	if(typeof self.innerHeight!="undefined") {
		x=self.innerWidth;
		y=self.innerHeight;
	}
	else if(typeof document.compatMode!='undefined'&&document.compatMode=='CSS1Compat') {
		x=document.documentElement.clientWidth;
		y=document.documentElement.clientHeight;
	}
	else if(document.body) {
		x=document.body.clientWidth;
		y=document.body.clientHeight;
	}
	return {x: x, y: y};
}
utility.dom.getPageScroll=function() {
	var x, y;
	if(typeof self.pageYOffset!='undefined') {
		x=self.pageXOffset;
		y=self.pageYOffset;
	}
	else if(typeof document.compatMode!='undefined'&&document.compatMode=='CSS1Compat') {
		x=document.documentElement.scrollLeft;
		y=document.documentElement.scrollTop;
	}
	else if(document.body) {
		x=document.body.scrollLeft;
		y=document.body.scrollTop;
	}
	return {x: x, y: y};
}
utility.dom.createElement=function(type,attribs,wnd) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}
	if(typeof wnd!='undefined') {
		var elem=wnd.document.createElement(type);
	}
	else {
		var elem=document.createElement(type);
	}
	if(typeof attribs!='undefined') {
		for(var i in attribs) {
			switch(true) {
				case(i=='text'): 
					elem.appendChild(document.createTextNode(attribs[i]));
					break;
				case(i=='class'): 
					elem.className=attribs[i];
					break;
				case(i=='id'): 
					elem.id=attribs[i];
					break;
				case(i=='acceptCharset'):
					if(is.ie)
						document.charset=attribs[i];
					elem.acceptCharset=attribs[i];
					break;	
				case(i=='type'): 
					if(type.toLowerCase()=="input"&&is.ie&&is.mac) {
						var tspn=document.createElement("SPAN");
						document.body.appendChild(tspn);
						tspn.style.display="none";
						tspn.innerHTML=elem.outerHTML.replace(/<input/i,"<input type=\""+attribs[i]+"\"");
						elem=tspn.firstChild;
						document.body.removeChild(tspn);
					}
					else if(type.toLowerCase()=="input"&&is.mac&&is.safari) {
						elem.setAttribute('type',attribs[i]);
					}
					else {
						elem.type=attribs[i];
					}
					break;
				case(i=='style'):
					elem.style.cssText=attribs[i];
					break;
				default:
					try {
						elem.setAttribute(i,attribs[i]);
						elem[i]=attribs[i];
					}
					catch(e) {}
			}
		}
	}
	if(attribs['value']) {
	elem.value=attribs['value'];
	}
return elem;
};
utility.dom.getImports=function(s) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	try {
		if(is.ie) {
			return s.imports;
		}
		else {
			var toret=[];
			for(var i=0;i<s.cssRules.length;i++) {
				if(is.safari) {
					if(typeof s.cssRules[i].href!='undefined') {
						Array_push(toret,s.cssRules[i].styleSheet);
					}
				}
				else {
					if(s.cssRules[i].toString().match('CSSImportRule')) {
						Array_push(toret,s.cssRules[i].styleSheet);
					}
				}
			}
			return toret;
		}
	}
	catch(e) {
		return[];
	}
}
utility.dom.getRuleBySelector=function(s,rx) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	try {
		var koll=[];
		if(is.ie) {
			koll=s.rules;
		}
		else {
			koll=s.cssRules;
		}
		var toret=[];
		for(var i=0;i<koll.length;i++) {
			var rule=koll[i];
			if(rule.selectorText.toString().match(rx)) {
				Array_push(toret,rule);
			}
		}
		return toret;
	}
	catch(e) {
		return[];
	}
}
utility.dom.createStyleSheet=function(doc,path) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(is.ie) {
		return doc.createStyleSheet(path);
	}
	else if(is.mozilla) {
		var theHeadNode=doc.getElementsByTagName("head")[0];
		var theStyleNode=doc.createElement('style');
		theStyleNode.type="text/css";
		theStyleNode.rules=new Array();
		theHeadNode.appendChild(theStyleNode);
		if(path!="") {
			var xmlHttp=new XMLHttpRequest();
			try {
				xmlHttp.open("GET",path,false);
				xmlHttp.send(null);
			}
			catch(e) {
				alert('Cannot load a stylesheet from a server other than the current server.\r\nThe current server is "'+doc.location.hostname+'".\r\nThe requested stylesheet URL is "'+path+'".');
				return null;
			}
			if(xmlHttp.status==404) {
				prompt('Stylesheet was not found: ',path);
				return null;
			}
			var theTextNode=doc.createTextNode(xmlHttp.responseText);
			theStyleNode.appendChild(theTextNode);
			var re=/\s*\{([^\}]*)\}\s*/;
			nameList=xmlHttp.responseText.split(re);
			for(var i=0;i<nameList.length;i=i+2) {
				var rul=new Object();
				rul.selectorText=nameList[i];
				rul.cssText=nameList[i+1];
				theStyleNode.rules.push(rul);
			}
		}
		else {
			var theTextNode=doc.createTextNode('u');
			theStyleNode.appendChild(theTextNode);
		}
		return theStyleNode;
	}
}
Object_weave_safe(utility, { date: {}});
$UNI_DATETIME_MASK_SEPARATORS=['-','/','[',']','(',')','*','+','.','\s',':'];
$UNI_DATETIME_MASK_REGEXP='[';
for(var i=0;i<$UNI_DATETIME_MASK_SEPARATORS.length;i++) {
  $UNI_DATETIME_MASK_REGEXP+="\\"+$UNI_DATETIME_MASK_SEPARATORS[i]+'|';
}
$UNI_DATETIME_MASK_REGEXP+=']';
$UNI_DATETIME_MASK_REGEXP=new RegExp($UNI_DATETIME_MASK_REGEXP,"g");
utility.date.date2regexp=function(txt) {
  txt=txt.replace(/[\/\-\.]/g,'DATESEPARATOR');
  txt=txt.replace(/([-\/\[\]\(\)\*\+\.\: ])/g, '\\$1');
  txt=txt.replace(/DATESEPARATOR/g,'[\\/\\-\\.]');
  txt=txt.replace(/(\\s)/g, '\s');
  txt=txt.replace(/yyyy/gi,'([0-9]{1,4})');
  txt=txt.replace(/yy/gi,'([0-9]{1,4})');
  txt=txt.replace(/y/gi,'([0-9]{1,4})');
  txt=txt.replace(/mm/g,'([0-9]{1,2})');
  txt=txt.replace(/m/g,'([0-9]{1,2})');
  txt=txt.replace(/dd/g,'([0-9]{1,2})');
  txt=txt.replace(/d/g,'([0-9]{1,2})');
  txt=txt.replace(/HH/g,'([0-9]{1,2})*');
  txt=txt.replace(/H/g,'([0-9]{1,2})*');
  txt=txt.replace(/hh/g,'([0-9]{1,2})*');
  txt=txt.replace(/h/g,'([0-9]{1,2})*');
  txt=txt.replace(/ii/g,'([0-9]{1,2})*');
  txt=txt.replace(/i/g,'([0-9]{1,2})*');
  txt=txt.replace(/ss/g,'([0-9]{1,2})*');
  txt=txt.replace(/s/g,'([0-9]{1,2})*');
  txt=txt.replace(/tt/g,'(AM|PM|am|pm|A|P|a|p)*');
  txt=txt.replace(/t/g,'(AM|PM|am|pm|A|P|a|p)*');
  txt=txt.replace(/ /g,' *');
  txt=txt.replace(/:/g,':*');
  var re=new RegExp('^'+txt+'$');
  return re;
}
utility.date.parse_date=function(arr,dateMask) {
	var vYear=vMonth=vDay=null;
	var vHour=vHour12h=vHour24H=vMinutes=vSeconds=vTimeMarker1C=vTimeMarker2C=null;
	var groups=dateMask.split($UNI_DATETIME_MASK_REGEXP);
	var groupIdx=0;
	var vTimeMarkerUpdate=0;
	for(var i=0;i<groups.length;i++) {
		var currentGroupMask=groups[i];
		groupIdx++;
		var groupValue=arr[groupIdx];
		if(Array_indexOf('HH,H,ii,i,ss,s'.split(','), currentGroupMask)>=0) {
			if(groupValue==''||typeof groupValue=='undefined') {
				groupValue='0';
			}
		}
		if(Array_indexOf('hh,h'.split(','), currentGroupMask)>=0) {
			var tmpValue=parseInt(groupValue,10);
			if(groupValue==''||typeof groupValue=='undefined') {
				groupValue='12';
			}
			else if(tmpValue>12&&tmpValue<24) {
				var index=(Array_indexOf(groups,'t')>=0?Array_indexOf(groups,'t')+1: Array_indexOf(groups,'tt')+1);
				if(arr[index]=='') {
					groupValue=tmpValue-12;
					vTimeMarkerUpdate=1;
				}
			}
		}
		if(Array_indexOf('tt,t'.split(','), currentGroupMask)>=0) {
			if(groupValue=='') {
				groupValue=[['A', 'AM'], ['P', 'PM']][vTimeMarkerUpdate][currentGroupMask.length-1];
			}
		}
		switch(currentGroupMask) {
			case'yyyy': 
			case'YYYY': 
				vYear=parseInt(groupValue,10);
				break;
			case'yy': 
			case'YY': 
			case'y': 
				vYear=parseInt(groupValue,10);
				if(vYear<1000) {
					if(vYear<10) {
						vYear=2000+vYear;
					}
					else {
						if(vYear<70) {
							vYear=2000+vYear;
						}
						else {
							vYear=1900+vYear;
						}
					}
				}
				break;
			case'mm':
			case'm':
				vMonth=parseInt(groupValue,10);
				break;
			case'dd':
			case'd':
				vDay=parseInt(groupValue,10);
				break;
			case'HH':
			case'H':
				vHour24H=parseInt(groupValue,10);
				break;
			case'hh':
			case'h':
				vHour12h=parseInt(groupValue,10);
				break;
			case'ii':
			case'i':
				vMinutes=parseInt(groupValue,10);
				break;
			case'ss':
			case's':
				vSeconds=parseInt(groupValue,10);
				break;
			case't':
				vTimeMarker1C=groupValue;
				break;
			case'tt':
				vTimeMarker2C=groupValue;
				break;
		}
	}
	vYear=vYear==null?1900:vYear;
	vMonth=vMonth==null?0:vMonth;
	vDay=vDay==null?1:vDay;
	vMinutes=vMinutes==null?0:vMinutes;
	vSeconds=vSeconds==null?0:vSeconds;
	var vHourOffset=0;
	if(vHour12h!=null) {
		if(vHour12h>=1&&vHour12h<=12) {
			vHour=vHour12h;
			if((vTimeMarker1C||vTimeMarker2C||"").charAt(0)=="P") {
				if(vHour12h<12) {
					vHour=vHour12h+12;
				}
			}
			else {
				if(vHour12h==12) {
					vHour=0;
				}
			}
		}
		else {
			vHour=-1000;
		}
	}
	else if(vHour24H!=null) {
		vHour=vHour24H;
	}
	else {
		vHour=0;
	}
	var o= {'year': vYear, 'month': vMonth, 'day': vDay, 'hour': vHour, 'minutes': vMinutes, 'seconds': vSeconds};
	if(dateMask.indexOf('y')<0&&dateMask.indexOf('m')<0&&dateMask.indexOf('d')<0) {
		o['year']='1900';
		o['month']='1';
		o['day']=1;
	}
	return o;
}
Object_weave_safe(utility, {window: {}});
utility.window.openWindow=function(target,url,width,height) {
	var wndHandler;
	var left=(screen.width-width)/2;
	var top=(screen.height-height)/2;
	var winargs="width="+width+", height="+height+", resizable=No, scrollbars=No, status=Yes, modal=yes, dependent=yes, dialog=yes, left="+left+", top="+top;
	wndHandler=window.open(url,target,winargs);
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	if(wndHandler) {
		utility.window.reference=wndHandler;
		var ctrlModalBlocker=document.getElementById('modalBlocker');
		if(!ctrlModalBlocker) {
			var ctrlModalBlocker=utility.dom.createElement("DIV", {'id': 'modalBlocker','style': 'display: block'});
			var pos=utility.dom.getPageInnerSize();
			ctrlModalBlocker.style.zIndex=999;
			ctrlModalBlocker.style.width=(pos.x)+'px';
			ctrlModalBlocker.style.height=(pos.y)+'px';
			prepfixieinsertnodescrollup();
			//ctrlModalBlocker=document.body.insertBefore(ctrlModalBlocker,document.body.firstChild);
			utility.dom.attachEvent(ctrlModalBlocker,'onmousedown',function() {
				return utility.window.focusmodal();
			});
			utility.dom.attachEvent(ctrlModalBlocker,'ondblclick',function() {
				return utility.window.focusmodal();
			});
			utility.dom.attachEvent(ctrlModalBlocker,is.ie?'onbeforeactivate':'onfocus',function() {
				return utility.window.focusmodal();
			});
			utility.dom.attachEvent(is.mozilla?window.document.body:window,is.ie?'onbeforeactivate':'focus',function() {
				return utility.window.focusmodal();
			});
			fixieinsertnodescrollup();
		}
		else {
		ctrlModalBlocker.style.display='block';
		}
		wndHandler.focus();
	}
	if(!wndHandler) {
		alert(translate('Cannot open dialog. Please allow site popups.'));
	}
	return wndHandler;
};
function prepfixieinsertnodescrollup() {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(is.ie&&typeof(ktmls)!="undefined") {
		prepfixieinsertnodescrollup.scrolls=[];
		for(var i=0;i<ktmls.length;i++) {
			prepfixieinsertnodescrollup.scrolls[i]=ktmls[i].edit.body.scrollTop;
		}
	}
}
function fixieinsertnodescrollup() {
  window.setTimeout("fixieinsertnodescrollup_late()", 1);
};
function fixieinsertnodescrollup_late() {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(is.ie&&typeof(ktmls)!="undefined") {
		for(var i=ktmls.length-1;i>=0;i--) {
			ktmls[i].edit.body.scrollTop=prepfixieinsertnodescrollup.scrolls[i];
		}
	}
};
utility.window.focusmodal=function() {
	if(utility.window.reference&&!utility.window.reference.closed) {
		utility.window.reference.focus();
		return;
	}
	utility.window.hideModalBlocker();
};
utility.window.hideModalBlocker=function(wnd) {
	if(!wnd) {
		wnd=window;
	}
	utility.window.reference=null;
	if(wnd.closed) {
		return;
	}
	var ctrlModalBlocker=wnd.document.getElementById('modalBlocker');
	if(ctrlModalBlocker) {
		ctrlModalBlocker.style.display='none';
	}
};
utility.window.close=function() {
  window.close();
};
utility.popup= {};
utility.popup.stiva=[];
utility.popup.makeModal=function(clickCallBack,elementOnTop,stopEvents) {
	if(typeof(stopEvents)=="undefined") {
		stopEvents=true;
	}
	utility.popup.stiva.push( {'element': elementOnTop,'callback': clickCallBack,'stopEvents': stopEvents});
};
utility.popup.removeModal=function(e) {
	if(utility.popup.stiva.length==0) {
		return;
	}
	if(utility.popup.force||e) {
		var tmp=utility.popup.stiva[utility.popup.stiva.length-1];
		if(e) {
			var o=utility.dom.setEventVars(e);
			var clickedElement=o.targ;
			while(clickedElement) {
				if(tmp.element&&clickedElement==tmp.element) {
					break;
				}
				if(clickedElement.mi&&clickedElement.mi['action_event']!='mousedown') {
					break;
				}
				clickedElement=clickedElement.parentNode;
			}
			if(clickedElement) {
				return;
			}
		}
		if(tmp.callback) {
			tmp.callback();
		}
		utility.popup.stiva.pop();
		utility.popup.removeModal(e);
	}
	utility.dom.toggleSpecialTags(null,false,0,true,true);
};
utility.popup.escapeModal=function(e) {
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}	
	if(utility.popup.stiva.length>0) {
		if(!utility.popup.stiva[utility.popup.stiva.length-1].stopEvents) {
			return true;
		}
		var o=utility.dom.setEventVars(e);
		if(e.keyCode==27) {
			utility.popup.force=true;
			utility.popup.removeModal(o.e);
			utility.popup.force=false;
		}
		if(is.ie&&!o.e.ctrlKey) {
			try {
				o.e.keyCode=90909090;
			}
			catch(e) {};
		}
		utility.dom.stopEvent(o.e);
		return false;
	}
	return true;
}
utility.window.blockInterface=function(cursor,el,customId) {
	if(typeof(cursor)=="undefined") {
		cursor="wait";
	}
	var ctrlInterfaceBlocker=utility.dom.createElement('div', {});
	ctrlInterfaceBlocker.className='interfaceBlocker';
	ctrlInterfaceBlocker.id=customId||'interfaceBlocker';
	prepfixieinsertnodescrollup();
	ctrlInterfaceBlocker=document.body.appendChild(ctrlInterfaceBlocker);
	fixieinsertnodescrollup();
	ctrlInterfaceBlocker.style.cursor=cursor;
	var pos;
	if(!el) {
		pos=utility.dom.getPageInnerSize();
		ctrlInterfaceBlocker.style.width=pos.x+'px';
		ctrlInterfaceBlocker.style.height=pos.y+'px';
	}
	else {
		pos=utility.dom.getBox(el);
		ctrlInterfaceBlocker.style.top=pos.y+'px';
		ctrlInterfaceBlocker.style.left=pos.x+'px';
		ctrlInterfaceBlocker.style.width=pos.width+'px';
		ctrlInterfaceBlocker.style.height=pos.height+'px';
	}
};
utility.window.unblockInterface=function() {
	var ctrlInterfaceBlocker=document.getElementById('interfaceBlocker');
	if(ctrlInterfaceBlocker) {
		document.body.removeChild(ctrlInterfaceBlocker);
	}
};
utility.window.setModal=function(set_unselectable) {
	if(typeof set_unselectable=="undefined") {
		set_unselectable=true;
	}
	window.isloading=false;
	window.focus();
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	if(!window.dialogArguments) {
		window.onbeforeunload=function() {
			if(!window.opener.closed) {
				utility.window.hideModalBlocker(window.opener);
			}
		}
		if(set_unselectable) {
			utility.dom.setUnselectable(window.document.body);
		}
	}
	else {
		window.opener=dialogArguments;
	}
	if(!window.opener) {
		document.body.innerHTML="<center>Invalid context! No opener.</center>"+'<div style="display: none !important">'+document.body.innerHTML+'</div>';
		return;
	}
	if(window.opener.topOpener) {
		window.topOpener=window.opener.topOpener;
	}
	else {
		window.topOpener=window.opener;
	}
	utility.dom.attachEvent(is.ie?window.document.body:window,'keydown',function(e) {
		var ret=utility.popup.escapeModal(e);
		if(ret&&e.keyCode==27) {
			utility.window.close();
		}
	});
	utility.dom.attachEvent2(window.document.body,'mousedown',utility.popup.removeModal);
};
Object_weave_safe(utility, {cookie: {}});
utility.cookie.set=function(name,value,lifespan,access_path) {
	var cookietext=name+"="+escape(value);
	if(lifespan!=null) {
		var date=new Date();
		date.setTime(date.getTime()+(1000*60*60*24*lifespan));
		cookietext+=";expires="+date.toGMTString();
	}
	if(access_path!=null) {
		cookietext+=";path="+access_path;
	}
	document.cookie=cookietext;
	return null;
}
utility.cookie.get=function(name) {
	var nameeq=name+"=";
	var ca=document.cookie.split(';');
	for(var i=0;i<ca.length;i++) {
		var c=ca[i];
		while(c.charAt(0)==' ') {
			c=c.substring(1,c.length);
		}
		if(c.indexOf(nameeq)==0) {
			return unescape(c.substring(nameeq.length,c.length));
		}
	}
	return null;
}
utility.cookie.del=function(name,path) {
  utility.cookie.set(name,"",-1,path);
}
UIDGenerator=function(name) {
	if(typeof(name)=='undefined') {
		name='iaktuid_'+Math.random().toString().substring(2,6)+'_';
	}
	this.name=name;
	this.counter=1;
}
UIDGenerator.prototype.generate=function(detail) {
	if(typeof(detail)=='undefined') {
		detail='';
	}
	return(this.name+detail+this.counter+++'_');
}
ObjectStorage=function(name) {
  this.storage= {};
  this.gen=new UIDGenerator(name+"_reference_by_id_");
}
ObjectStorage.prototype.add=ObjectStorage.prototype.storeObject=function(obj) {
	var type=obj.constructor.toString().match(/^\s*function\s*([^\s\(]*)\s*\(/i);
	if(!type) {
		type="unknown_contructor";
	}
	else {
		type=type[1];
	}
	var newId=this.gen.generate(type);
	obj.id=newId;
	this.storage[newId]=obj;
}
ObjectStorage.prototype.get=ObjectStorage.prototype.getObject=function(id) {
  return this.storage[id];
}
ObjectStorage.prototype.deleteObject=function(id) {
  delete this.storage[id];
}
ObjectStorage.prototype.dispose=function() {
  this.storage=null;
}
QueryString=function(str) {
	if(typeof str=='undefined') {
		var str=window.location.search.toString();
	}
	this.keys=new Array();
	this.values=new Array();
	var query=str;
	if(str.indexOf('?')==0) {
		query=str.substring(1);
	}
	query=query.replace(/&amp;/g,'&');
	var pairs=query.split("&");
	for(var i=0;i<pairs.length;i++) {
		var pos=pairs[i].indexOf('=');
		if(pos>=0) {
			var argname=pairs[i].substring(0,pos);
			var value=pairs[i].substring(pos+1);
			this.keys[this.keys.length]=argname;
			this.values[this.values.length]=value;
		}
	}
}
QueryString.prototype.find=function(key) {
	var value=null;
	for(var i=0;i<this.keys.length;i++) {
		if(this.keys[i]==key) {
			value=this.values[i];
			break;
		}
	}
	return value;
}
KT_Tooltips= {cname: 'kt_add_tooltips', worked: [], cancel: false, gen: new UIDGenerator(), show: function(id,x,y) {
		var div=document.getElementById(id);
		if(!div) {
			return;
		}
		div.style.left='-1000px';
		div.style.top='-1000px';
		div.style.display='block';
		var pos=utility.dom.getBBox(div);
		var pos2=utility.dom.getPositionRelativeTo00(x,y,pos.width+2,pos.height+2);
		div.style.left=pos2.x+'px';
		div.style.top=pos2.y+'px';
	}, hide:function(id) {
		var div=document.getElementById(id);
		if(!div) {
			return;
		}
		div.style.display='none';
	}, clear_timeout:function(id,mode) {
		var to=id+mode+"timeout";
		if(typeof window[to]!='undefined') {
			clearTimeout(window[to]);
		}
	}, clear_showtimeout:function(id) {
		KT_Tooltips.clear_timeout(id,'show');
	}, clear_hidetimeout:function(id) {
		KT_Tooltips.clear_timeout(id,'hide');
	}, set_timeout:function(id,mode,time) {
		var params_str='', params_arr=[];
		if(arguments.length>3) {
			for(var i=3;i<arguments.length;i++) {
				Array_push(params_arr,arguments[i]);
			}
		}
		params_str=params_arr.join(', ');
		if(params_str!='') {
			params_str=', '+params_str;
		}
		var str="KT_Tooltips."+mode+"('"+id+"'"+params_str+")";
		var to=id+mode+"timeout";
		window[to]=setTimeout(str,time);
	}, set_showtimeout:function(id,vars) {
		KT_Tooltips.set_timeout(id,"show",1000,vars.x,vars.y);
	}, set_hidetimeout:function(id) {
		KT_Tooltips.set_timeout(id,"hide",250);
	}, attach_single:function(link) {
		if(typeof is=='undefined') {
			is=new BrowserCheck();
		}		
		if(is.ie||is.safari) {
			return;
		}
		var title=link.title;
		var mytip=null;
		if(link.getAttribute('divid')) {
			mytip=document.getElementById(link.getAttribute('divid'));
			if(mytip) {
				document.body.removeChild(mytip);
			}
			link.removeAttribute('divid');
		}
		if(/[\r\n]/.test(title)) {
			var divid=KT_Tooltips.gen.generate("tooltip");
			var div=utility.dom.createElement("div", {'class': 'tooltip_div','id': divid});
			div.innerHTML=link.getAttribute("title").toString().replace(/\r\n/g,"<br />").replace(/[\r|\n]/g,"<br />");
			link.divid=divid;
			div=document.body.appendChild(div);
			link.removeAttribute("title");
			link.setAttribute("divid",divid);
			if(!mytip) {
				utility.dom.attachEvent(link,'mouseover',function(e) {
					var id=link.getAttribute("divid");
					var pos=utility.dom.getBBox(link);
					var vars=utility.dom.setEventVars(e);
					KT_Tooltips.clear_hidetimeout(id);
					var obj= {x: pos.x+Math.round(pos.width/2), y: pos.y+Math.round(pos.height/2)+10};
					KT_Tooltips.set_showtimeout(id,obj);
					utility.dom.stopEvent(e);
				});
				utility.dom.attachEvent(link,'mouseout',function(e) {
					var id=link.getAttribute("divid");
					KT_Tooltips.clear_showtimeout(id);
					KT_Tooltips.set_hidetimeout(id);
					utility.dom.stopEvent(e);
				});
			}
		}
	}, attach:function() {
		KT_Tooltips.worked=[];
		if(typeof is=='undefined') {
			is=new BrowserCheck();
		}			
		if(is.ie||is.safari) {
			return;
		}
		Array_each(utility.dom.getElementsByClassName(document.body,KT_Tooltips.cname), function(el) {
			Array_each(el.getElementsByTagName('a'), KT_Tooltips.attach_single);
		})
	}
};
utility.dom.attachEvent(window,'load',KT_Tooltips.attach);
function getDomDocumentPrefix() {
	if(getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	var prefixes=["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for(var i=0;i<prefixes.length;i++) {
		try {
			o=new ActiveXObject(prefixes[i]+".DomDocument");
			return getDomDocumentPrefix.prefix=prefixes[i];
		}
		catch(ex) {}
	}
	throw new Error("Could not find an installed XML parser");
}
function getXmlHttpPrefix() {
	if(getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	var prefixes=["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for(var i=0;i<prefixes.length;i++) {
		try {
			o=new ActiveXObject(prefixes[i]+".XmlHttp");
			return getXmlHttpPrefix.prefix=prefixes[i];
		}
		catch(ex) {}
	}
	throw new Error("Could not find an installed XML parser");
}
function XmlHttp() {}
XmlHttp.create=function() {
	try {
		if(window.XMLHttpRequest) {
			var req=new XMLHttpRequest();
			if(req.readyState==null) {
				req.readyState=1;
				req.addEventListener("load",function() {
					req.readyState=4;
					if(typeof req.onreadystatechange=="function")
					req.onreadystatechange();
				}, false);
			}
			return req;
		}
		if(window.ActiveXObject) {
			var ax=new ActiveXObject(getXmlHttpPrefix()+".XmlHttp");
			return ax;
		}
	}
	catch(ex) {}
	throw new Error("Your browser does not support XmlHttp objects");
}
XmlHttp.post=function(rpc,url,postStr) {
	try {
		rpc.open("POST",url,false);
		rpc.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		rpc.send(postStr);
	}
	catch(e) {
		return false;
	}
	return rpc;
}
XmlHttp.get=function(rpc,url,getStr) {
	try {
		rpc.open("GET",getStr,false);
		rpc.send(null);
	}
	catch(e) {
		return false;
	}
	return rpc;
}
function XmlDocument() {}
XmlDocument.create=function() {
	try {
		if(document.implementation&&document.implementation.createDocument) {
			var doc=document.implementation.createDocument("","",null);
			if(doc.readyState==null) {
				doc.readyState=1;
				doc.addEventListener("load",function() {
					doc.readyState=4;
					if(typeof doc.onreadystatechange=="function")
						doc.onreadystatechange();
				}, false);
			}
			return doc;
		}
		if(window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix()+".DomDocument");
	}
	catch(ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};
if(window.DOMParser&&window.XMLSerializer&&window.Node&&Node.prototype&&Node.prototype.__defineGetter__) {
	Document.prototype.loadXML=function(s) {
		var doc2=(new DOMParser()).parseFromString(s,"text/xml");
		while(this.hasChildNodes())
			this.removeChild(this.lastChild);
		var ret=false;
		for(var i=0;i<doc2.childNodes.length;i++) {
			this.appendChild(this.importNode(doc2.childNodes[i],true));
			ret=true;
		}
		return ret;
	};
	var documentProto=Document.prototype;
	var documentGrandProto=documentProto.__proto__= {
		__proto__: documentProto.__proto__
	};
	if(documentGrandProto) {
		documentGrandProto.__defineGetter__('xml',function() {
			return(new XMLSerializer()).serializeToString(this);
		});
	}
	var elementProto=Element.prototype;
	var elementGrandProto=elementProto.__proto__= {
		__proto__: elementProto.__proto__
	};
	if(elementGrandProto) {
		elementGrandProto.__defineGetter__('text',function() {
			return(new XMLSerializer()).serializeToString(this).replace(/<[^>]*>/g,'');
		});
		elementGrandProto.__defineGetter__('innerText',function() {
			return(new XMLSerializer()).serializeToString(this).replace(/<[^>]*>/g,'');
		});
		elementGrandProto.__defineSetter__('innerText',function(new_value) {
			var tn=this.ownerDocument.createTextNode(new_value);
			this.innerHTML="";
			this.appendChild(tn);
		});
	}
}
function evaluateXPath(aNode,aExpr) {
	var found=[];
	if(typeof is=='undefined') {
		is=new BrowserCheck();
	}		
	if(is.mozilla) {
		if(typeof evaluateXPath.xpe=="undefined") {
			evaluateXPath.xpe=new XPathEvaluator();
		}
		var result=evaluateXPath.xpe.evaluate(aExpr,aNode,null,XPathResult.ANY_TYPE,null);
		while(res=result.iterateNext()) {
			found.push(res);
		}
	}
	else if(is.ie) {
		var result=aNode.selectNodes(aExpr);
		for(var i=0;i<result.length;i++) {
			found.push(result[i]);
		}
	}
	if(found.length==0) {
		found=false;
	}
	return found;
};
function BrowserCheck() {
	var b=navigator.appName.toString();
	var up=navigator.platform.toString();
	var ua=navigator.userAgent.toString();
	this.mozilla=this.ie=this.opera=r=false;
	var re_opera=/Opera.([0-9\.]*)/i;
	var re_msie=/MSIE.([0-9\.]*)/i;
	var re_gecko=/gecko/i;
	var re_safari=/safari\/([\d\.]*)/i;
	if(ua.match(re_opera)) {
		r=ua.match(re_opera);
		this.opera=true;
		this.version=parseFloat(r[1]);
	}
	else if(ua.match(re_msie)) {
		r=ua.match(re_msie);
		this.ie=true;
		this.version=parseFloat(r[1]);
	}
	else if(ua.match(re_safari)) {
		this.mozilla=true;
		this.safari=true;
		this.version=1.4;
	}
	else if(ua.match(re_gecko)) {
		var re_gecko_version=/rv:\s*([0-9\.]+)/i;
		r=ua.match(re_gecko_version);
		this.mozilla=true;
		this.version=parseFloat(r[1]);
	}
	this.windows=this.mac=this.linux=false;
	this.Platform=ua.match(/windows/i)?"windows":(ua.match(/linux/i)?"linux":(ua.match(/mac/i)?"mac":ua.match(/unix/i)?"unix":"unknown"));
	this[this.Platform]=true;
	this.v=this.version;
	this.valid=this.ie&&this.v>=6||this.mozilla&&this.v>=1.4;
	if(this.safari&&this.mac&&this.mozilla) {
		this.mozilla=false;
	}
};
function sortFormHandlers(arr) {
	for(var i=0;i<arr.length;i++) {
		var fh1=arr[i];
		for(var j=i+1;j<arr.length;j++) {
			var fh2=arr[j];
			if(fh2[0]<fh1[0]) {
				var tmp=fh1;
				arr[i]=fh2;
				arr[j]=tmp;
			}
		}
	}
};
function GLOBAL_registerFormSubmitEventHandler(function_name,priority) {
	var frms=document.getElementsByTagName('form');
	for(var i=0;i<frms.length;i++) {
		var frm=frms[i];
		if(typeof frm.onsubmit!='undefined'&&frm.onsubmit!=null) {
			var form_handlers=frm.form_handlers;
			if(form_handlers) {
			  form_handlers[form_handlers.length]=[priority, function_name];
			  sortFormHandlers(form_handlers);
			}
			else {
			  frm.__kt_onsubmit=frm.onsubmit;
			  frm.onsubmit=new Function('e','if (!KT_formSubmittalHandler(e)) return false;');
			  form_handlers=[];
			  form_handlers[form_handlers.length]=[priority, function_name];
			}
			frm.form_handlers=form_handlers;
		}
		else {
			frm.onsubmit=new Function('e','return KT_formSubmittalHandler(e);');
			var form_handlers=[];
			form_handlers[form_handlers.length]=[priority, function_name];
			frm.form_handlers=form_handlers;
		}
	}
};
var fire_starter=null;
var global_form_submit_lock=false;
function KT_formSubmittalHandler(e) {
	var frm=null;
	var o=utility.dom.setEventVars(e);
	if(!o.e) {
		return true;
	}
	try {
		if(global_form_submit_lock) {
			utility.dom.stopEvent(o.e);
			return false;
		}
		frm=o.targ;
		if(!frm) {
			return true;
		}
		if(!frm.tagName) {
			return true;
		}
		if(frm.tagName.toLowerCase()!="form") {
			frm=frm.form;
		}
	}
	catch(err) {}
	if(!frm) {
		frm=fire_starter;
	}
	if(!frm) {
		return true;
	}
	if(typeof(UNI_disableButtons)!='undefined') {
		UNI_disableButtons(frm,/.*/,true);
	}
	var ret=true;
	var form_handlers=frm.form_handlers;
	if(form_handlers) {
		for(var i=0;i<form_handlers.length;i++) {
			var fun=form_handlers[i];
			eval("ret = "+fun[1]+"(o.e);");
			if(!ret) {
				break;
			}
		}
	}
	if(is.ie&&is.mac&&typeof(UNI_disableButtons)!='undefined') {
		UNI_disableButtons(frm,/.*/,false);
	}
	if(!ret) {
		try {
			utility.dom.stopEvent(o.e);
		}
		catch(err) {}
		if(!global_form_submit_lock&&typeof(UNI_disableButtons)!='undefined') {
			UNI_disableButtons(frm,/.*/,false);
		}
		return false;
	}
	else {
		if(frm.__kt_onsubmit) {
			var ret=frm.__kt_onsubmit(o.e);
			if(typeof(ret)=='undefined'||ret) {
				return true;
			}
			else {
				return false;
			}
		}
		return true;
	}
};

utility.dom.attachEvent(window,'unload',EventCache.flush);

