var U={

	////////////////////////////////////////////////////////////////////
	// unsorted
	////////////////////////////////////////////////////////////////////

	trim: function(str){
		str=str.replace(/^\s*/,'');
		str=str.replace(/\s*$/,'');
		return str;
	},

	last: function(arr){
		return arr[arr.length-1];
	},

	homepage: function(){//
		return (location.pathname=='/' || location.pathname=='/index.html');
	},

	newin: function(link){
		if(link && link.href){
			var newin=window.open(link.href);
			return false;
		}
	},

	tryUntil: function(function2run,testCondition){
		var testCondition=unescape(testCondition);
		var function2run=unescape(function2run);
		if(eval(testCondition)){
			try{
				eval(function2run);
			}catch(e){}
		}else{
			var date=new Date();
			setTimeout('U.tryUntil("'+ escape(function2run)+ '","'+ escape(testCondition)+ '")',(arguments[2]|100));
		}
	},

	pda: function(){
		return window.screen.width<640;
	},

	props: function(hash){
		var result='';
		for(var i in hash){
			result+=''+ i+ ': '+ hash[i]+ '\n';
		}
		return result;
	},

	defvar: function(def,data){
		return (data)?data:def;
	},

	hashToStr: function(hash){
		if(typeof hash=='object'){
			var result='hash={};';
			for(var i in hash){
				result+='hash.'+ i+ '="'+ hash[i]+ '";';
			}
		}
		result=escape(result);
		return result;
	},

	hashFromStr: function(str){
		eval(unescape(str));
		return hash;
	},

	loadBigImage: function(hash){
		if(hash.bigImgBoxId && hash.bigImgSrc && hash.previewId && hash.loaderBgcolor && hash.loaderSrc){
			if(U.gbi(hash.bigImgBoxId) && U.gbi(hash.previewId)){
				if(!this.loadBigImage_loaderImage){
					this.loadBigImage_loaderImage=new Image();
						this.loadBigImage_loaderImage.src=hash.loaderSrc;
				}
				this.loadBigImageTestLoader(U.hashToStr(hash))
			}
		}
	},

	loadBigImageTestLoader: function(hash){
		if(this.loadBigImage_loaderImage.complete){
			this.loadBigImageEnd(hash);
		}else{
			setTimeout('U.loadBigImageTestLoader("'+ hash+ '")', 100);
		}
	},

	loadBigImageEnd: function(hash){
		var hash=this.hashFromStr(hash);
		if(!this.loadBigImage_bigImage){
			this.loadBigImage_bigImage={};
		}
		if(!this.loadBigImage_bigImage[hash.previewId]){
			this.loadBigImage_bigImage[hash.previewId]=new Image();
			this.loadBigImage_bigImage[hash.previewId].src=hash.bigImgSrc;
		}
		if(this.loadBigImage_bigImage[hash.previewId].complete){
			U.gbi(hash.bigImgBoxId).innerHTML='<img src="'+ this.loadBigImage_bigImage[hash.previewId].src+ '" width="'+ this.loadBigImage_bigImage[hash.previewId].width+ '" height="'+ this.loadBigImage_bigImage[hash.previewId].height+ '" alt="">';
			if(this.loadBigImage_bigImage[hash.previewId].loaderElement){
				var loader=this.loadBigImage_bigImage[hash.previewId].loaderElement;
				loader.parentNode.replaceChild(this.loadBigImage_bigImage[hash.previewId].previewElement, loader);
				this.loadBigImage_bigImage[hash.previewId].loaderElement=null;
			}
			if(hash.functionToRun){eval(hash.functionToRun);}
			return;
		}else{
			if(!preview){
				var preview=U.gbi(hash.previewId);
			}
			if(!this.loadBigImage_bigImage[hash.previewId].loaderElement){
				this.loadBigImage_bigImage[hash.previewId].loaderElement=document.createElement('IMG');
				var loader=this.loadBigImage_bigImage[hash.previewId].loaderElement;
				
				loader.setAttribute('src',this.loadBigImage_loaderImage.src);
				loader.setAttribute('width',this.loadBigImage_loaderImage.width);
				loader.setAttribute('height',this.loadBigImage_loaderImage.height);
				
				var borderLeft=parseInt((preview.offsetWidth-loader.width)/2);
				var borderRight=preview.offsetWidth-loader.width-borderLeft;
				var borderTop=parseInt((preview.offsetHeight-loader.height)/2);
				var borderBottom=preview.offsetHeight-loader.height-borderTop;
				var top=preview.offsetTop;
				var left=preview.offsetLeft;
				
				loader.style.position='relative';
				loader.style.zIndex=999;
				loader.style.borderColor=hash.loaderBgcolor;
				loader.style.borderTopWidth=borderTop+ 'px';
				loader.style.borderRightWidth=borderRight+ 'px';
				loader.style.borderBottomWidth=borderBottom+ 'px';
				loader.style.borderLeftWidth=borderLeft+ 'px';
				
				this.loadBigImage_bigImage[hash.previewId].previewElement=preview;
				
				preview.parentNode.replaceChild(loader, preview);
			}
			
			setTimeout('U.loadBigImageTestLoader("'+ this.hashToStr(hash)+ '")', 100);
		}
	},

	////////////////////////////////////////////////////////////////////
	// events
	////////////////////////////////////////////////////////////////////
	addEvent: function(node,event,func){
		if(!node)return;
		if(node.addEventListener){
			node.addEventListener(event,func,false);
		}else{
			if(node.attachEvent){
				event='on'+event;
				node.attachEvent(event,func);
			}
		}
	},

	stopEvent: function(event){
		event.cancelBubble = true; 
		event.returnValue = false; 
		
		if(event.preventDefault) event.preventDefault(); 
		if(event.stopPropagation) event.stopPropagation();
	},

	clientX: function(){
		return this.clientXY()[0];
	},

	clientY: function(){
		return this.clientXY()[1];
	},

	clientXY: function(evt){
		if(evt){
			U.clientXY_x=evt.clientX;
			U.clientXY_y=evt.clientY;
		}else{
			if(typeof U.clientXY_x=='undefined'){
				U.clientXY_x=0;
				U.clientXY_y=0;
				this.addEvent(document,'mousemove',U.clientXY);
			}
			return [U.clientXY_x,U.clientXY_y];
		}
	},

	////////////////////////////////////////////////////////////////////
	// string
	////////////////////////////////////////////////////////////////////

	splitText: function(str,step){
		var step=step||1;
		var tmpArr=[];
		var result=[];
		var tmp, symb;
		for(var i=0; i<str.length; i++){
			symb=str.substr(i,1);
			if(symb=='&' && str.substr(i).indexOf(';')){
				tmp='&';
				do{
					i++;
					symb=str.substr(i,1);
					tmp+=symb;
				}while(symb && symb!=';');
				tmpArr.push(tmp);
			}else{
				if(symb=='<' && str.substr(i).indexOf('>')){
					tmp='<';
					do{
						i++;
						symb=str.substr(i,1);
						tmp+=symb;
					}while(symb && symb!='>');
					tmpArr.push(tmp);
				}else{
					tmpArr.push(symb);
				}
			}
		}
		if(step==1)return tmpArr;
		for(var i=0; i<tmpArr.length; i+=step){
			tmp='';
			for(var j=0; j<step; j++){
				tmp+=tmpArr[i+j]||'';
			}
			result.push(tmp);
		}
		return result;
	},

	////////////////////////////////////////////////////////////////////
	// DOM
	////////////////////////////////////////////////////////////////////

	tuneUserTable: function(table){
		var cls,th;
		var trows=new Array();
		var tdivs=new Array();
		
		trows=U.gbtr('TR',table);
		for(var i=0; i<trows.length; i++){
			tdivs=U.gbt('TD',trows[i]);
			for(var j=0; j<tdivs.length; j++){
				if(j==0){
					
					tdivs[j].style.borderLeft='1px solid white';
				}
				if(i==trows.length-1){
					
					tdivs[j].style.borderBottom='1px solid white';
				}
			}
		}
		
		tdivs=U.gbt('TD',trows[0]);
		while(tdivs[0]){
			th=document.createElement('TH');
			th.innerHTML=tdivs[0].innerHTML;
			trows[0].replaceChild(th,tdivs[0]);
		}
	},

	bodyTag: function(){
		if(!this.bodyTagLink){this.bodyTagLink=document.getElementsByTagName('body')[0];}
		return this.bodyTagLink;
	},

	gbt: function(tagname){
		var parent=U.defvar(U.bodyTag(),arguments[1]);
		return parent.getElementsByTagName(tagname);
	},

	gbtr: function(tagname){
		var parent=U.defvar(U.bodyTag(),arguments[1]);
		U.tags=new Array();
		U.gbtRecursive(tagname,parent);
		var result=U.tags;
		U.tags=null;
		return result;
	},

	gbtRecursive: function(tagname,parent){
		for(var i=0; i<parent.childNodes.length; i++){
			if(parent.childNodes[i].nodeType==1){
				if(parent.childNodes[i].tagName==tagname){
					U.tags.push(parent.childNodes[i]);
				}
				U.gbtRecursive(tagname,parent.childNodes[i]);
			}
		}
	},

	gbi: function(id){
		return document.getElementById(id);
	},

	layerX: function(elem){
		return this.layerXY(elem)[0];
	},

	layerY: function(elem){
		return this.layerXY(elem)[1];
	},

	layerXY: function(elem){
		var x=0;
		var y=0;
		while(elem){
			x+=elem.offsetLeft;
			y+=elem.offsetTop;
			elem=elem.offsetParent;
		}
		return [x,y];
	},

	////////////////////////////////////////////////////////////////////
	// array
	////////////////////////////////////////////////////////////////////
	array: {
		find: function(array,value){
			for(var i in array){
				if(array[i]==value){
					return i;
				}
			}
			return false;
		}
	},

	////////////////////////////////////////////////////////////////////
	// object
	////////////////////////////////////////////////////////////////////
	object: {
		af: function(obj,hash){//apply fields
			var fieldsArr=obj._af.split(',');
			var fieldName='';
			for(var i in fieldsArr){
				fieldName=fieldsArr[i];
				obj[fieldName]=(hash[fieldName]||null);
			}
		},

		join2str: function(obj){//join fields to a string
			var fieldsArr=obj._af.split(',');
			var fieldName='';
			var result='';
			for(var i in fieldsArr){
				fieldName=fieldsArr[i];
				if(obj[fieldName]!=null){
					result+=fieldName+ ':"'+ obj[fieldName]+ '",';
				}
			}
			if(result)result=result.substr(0,result.length-1);
			return result;
		}
	},

	////////////////////////////////////////////////////////////////////
	// animation
	////////////////////////////////////////////////////////////////////
	mouseScroll: function(hash){
		this._af='id,repeat,methodX,methodY,presets';
		U.object.af(this,hash);

		var layerid='layer'+ this.id;

		
		var layer=U.gbi(this.id);
		
		var parentLayer=layer.parentNode;

		
		if(this[layerid]!='object'){
			this[layerid]={};
			this._af='id,repeat,methodX,methodY,layer'+ this.id;
			
			parentLayer.style.width=parentLayer.offsetWidth+ 'px';
			parentLayer.style.height=parentLayer.offsetHeight+ 'px';
			parentLayer.style.position='relative';
			parentLayer.style.overflow='hidden';
			
			layer.style.position='absolute';
			
			this[layerid].layerWidth=layer.offsetWidth;
			this[layerid].layerHeight=layer.offsetHeight;
			this[layerid].parentWidth=parentLayer.offsetWidth;
			this[layerid].parentHeight=parentLayer.offsetHeight;
			this[layerid].parentLeft=parentLayer.offsetLeft;
			this[layerid].parentTop=parentLayer.offsetTop;
		}
		
			
			var bodyWidth=document.getElementsByTagName('body')[0].offsetWidth;
			if(this[layerid].centerCoords && this[layerid].bodyWidth && this.bodyWidth==bodyWidth){
			}else{
				this[layerid].bodyWidth=bodyWidth;
				this[layerid].centerCoords=U.layerXY(parentLayer);
				this[layerid].centerCoords[0]+=parentLayer.offsetWidth/2;
				this[layerid].centerCoords[1]+=parentLayer.offsetHeight/2;
			}
			
			var step=[0,0];
			if(this.methodX!=null)
				step[0]=-50*Math.sin((U.clientX()/this[layerid].centerCoords[0]-1)*Math.PI/2);
			if(this.methodY!=null)
				step[1]=-50*Math.sin((U.clientY()/this[layerid].centerCoords[1]-1)*Math.PI/2);
		
		if(step[0]){
			var layerLeft=layer.offsetLeft + step[0];
			if(this.repeat!='x' && this.repeat!='xy'){
				if(layerLeft+this[layerid].layerWidth < this[layerid].parentWidth)
					layerLeft=this[layerid].parentWidth - this[layerid].layerWidth;
				if(layerLeft > 0)layerLeft=0;
			}
			layer.style.left=layerLeft+ 'px';
		}
		if(step[1])
			var layerTop=layer.offsetTop + step[1];
			if(this.repeat!='y' && this.repeat!='xy'){
				if(layerTop+this[layerid].layerHeight < this[layerid].parentHeight)
					layerTop=this[layerid].parentHeight - this[layerid].layerHeight;
				if(layerTop > 0)layerTop=0;
			}
			layer.style.top=(layer.offsetTop + step[1])+ 'px';
		
		setTimeout('U.mouseScroll({'+ U.object.join2str(this)+ '})',20);
	},

	typewriter: function(id,text,speed,endfunc){

		var step=U.defvar(1,parseInt(speed));
		var textArr=U.splitText(text,step);
		var arrStr=textArr.join('¬');
		var endfunc=(endfunc!='')?escape(endfunc):'';
		
		if(!U.typewriterTimer){U.typewriterTimer={};}
		
		this.typewriterRec(id,arrStr,endfunc);
	},

	typewriterRec: function(id,arrStr,endfunc,position){
		var textArr=arrStr.split('¬');
		var position=position||0;
		if(position==0){U.gbi(id).innerHTML='';}
		if(position<textArr.length && U.gbi(id)){
			
			var textPortion=textArr[position];
			
			textPortion=textPortion.replace(/ /g, '&#9;');
			
			var textExisted=U.gbi(id).innerHTML
			textExisted=textExisted.replace(/&#9;/g, ' ');
			
			U.gbi(id).innerHTML=textExisted+ textPortion;
			position++;
			U.typewriterTimer[id]=setTimeout('U.typewriterRec("'+ id+ '","'+ arrStr+ '","'+ endfunc+ '","'+ position+ '")',25);
		}else{
			var endfunc=unescape(endfunc);
			eval(endfunc);
		}
	}
}
