
/* EVAL function
====================================*/
	function $function(fName,params){
			var res=null
			if (fName) 
			{
				//var paramsStr=params?params.join(','):''
				//alert (params)
				//eval('res='+fName+'('+getArgList(params)+')')
				eval('res='+fName+'(params)')
			}
			return res
		}
		
		
	function isset(val){
		return (val || val==0 || val=='' || val===false);
		}

/* AJAX and Forms
====================================*/
	function doScript(scriptSRC,params){
		var newScript = document.createElement("SCRIPT"), paramsString="";
		//	if (!params) var params={};
		
		if (!params.from) params.from="js";
		if (!params.resultwrapper) params.resultwrapper="js";
		for (p in params) {paramsString+=paramsString?"&"+p+"="+params[p]:"?"+p+"="+params[p]}
		scriptSRC+=paramsString;
		//alert (scriptSRC); return;
		newScript.type="text/javascript";
		newScript.src=scriptSRC;   
		//document.write (scriptSRC); return;
		document.body.appendChild(newScript);
		}
	
	function putAndSendForm(fAction,fMethod,fData,fFiles){
		var f=setChild(document.body,null,null,"form"),i;
		if (fAction) f.action=fAction;
		if (fMethod) f.method=fMethod;
		for (var iName in fData)
		{ 
			i=setChild(f,null,null,"input")
			//i.setProperty("type","hidden");
			i.name=iName
			i.value=fData[iName]
		}
		
		if (fFiles)
		{
			for (var fName in fFiles)
			{
				var ff=fFiles[fName], newff=f.appendChild(ff);
				// for (var pr in ff) newff[pr]=ff[pr]
				newff.value=ff.value;
				
				//alert(i.value);
			}
			i=setChild(f,null,null,"input")
			i.name="MAX_FILE_SIZE"
			i.value=30000
			f.enctype="multipart/form-data";
		}
		
	
		f.submit();
		}
	function getRadioValue(el){
		var res=null
		el=$name(el);
		if (!el) {
			//alert (el)
			return false;
			}
		for (var i=0; i<el.length; i++){
			var iEl=el[i];
			if (iEl.checked) {
				res=iEl.value;
				break;					
				}
			}
		return res;
		}
		
		
	/* XML
	====================================*/
	function parseLineXML(xml){
		if (!xml) {
			return false;
			}
		var res=[],
			fc=xml.firstChild,
			fcA={}
		if (!fc) return {};
		if (fc.nodeType != 1) fc= fc.nextSibling;
		
		//Get fc attributes
		for (var a=0;a<fc.attributes.length;a++){
			var attr=fc.attributes[a]
			if (attr.nodeType!=2) continue
			fcA[attr.nodeName]=attr.nodeValue
			}

 	 	for (var i=0;i<fc.childNodes.length;i++){
			
			var node=fc.childNodes[i]
			if (node.nodeType!=1) continue
			
			res[i]={value:node.firstChild?node.firstChild.data:"",data:{}}
			for (var a=0;a<node.attributes.length;a++){
				var attr=node.attributes[a]
				if (attr.nodeType!=2) continue
				res[i].data[attr.nodeName]=attr.nodeValue
				}
			}
		return {head:fcA,body:res};
		}
		
		if (typeof DOMParser == "undefined") {
			   DOMParser = function () {return false;}
			
			   DOMParser.prototype.parseFromString = function (str, contentType) {
				  if (typeof ActiveXObject != "undefined") {
						 var d = new ActiveXObject("MSXML.DomDocument");
						 d.loadXML(str);
						 return d;
					  } else if (typeof XMLHttpRequest != "undefined") {
						 var req = new XMLHttpRequest;
						 req.open("GET", "data:" + (contentType || "application/xml") +
										 ";charset=utf-8," + encodeURIComponent(str), false);
						 if (req.overrideMimeType) {
							req.overrideMimeType(contentType);
							}
						 req.send(null);
						 return req.responseXML;
						}
					return false;
					}
			}
	
	/* Set cursor positions in input elements
	====================================*/
	

		function moveCaretToStart(inputObject){		
		 if (inputObject.createTextRange){
			 //IE
			var r = inputObject.createTextRange();
			r.collapse(true);
			r.select();
			}
		else if (inputObject.selectionStart){
			// Mozilla/Gecko
			inputObject.setSelectionRange(0,0);
			inputObject.focus();
			}
		}
		
		function moveCaretToEnd(inputObject){
		 if (inputObject.createTextRange){
			//IE
			var r = inputObject.createTextRange();
			r.collapse(false);
			r.select();
			}
		else if (inputObject.selectionStart){
			// Mozilla/Gecko
			var end = inputObject.value.length;
			inputObject.setSelectionRange(end,end);
			inputObject.focus();
			}
		}

/* Types
=================================================*/
	function is_function(func){
		return (func && typeof(func)=='function');
		}
	function is_object(o){
		return (typeof(o)=='object');
		}
	
	function is_array(o){		
		return (o!=null && typeof(o)=='object' && o.unshift!=undefined);
		}
	
	function is_string(o){
		return (typeof(o)=='string');
		}
	
	function is_numeric(o){
		return !isNaN(o);
		}
	function is_null(o){
		return o===null;
		}
	
	function is_date(o){
		return (o && typeof(o)=='object' && is_function(o.getTime));
		}
	function is_valid_date(o){
		return (is_date(o) && o.getDay && !isNaN(o.getDay()));
		}
		
	function method_exists(obj,m){
		return (obj && is_object(obj) && is_function((obj)[m]) );
		}


/* DOM functions
====================================*/
	function $id(el){	
		var res;
		if (!el) return false;
		res=null;
		if (typeof(el)!="object")
		{
			if (document.getElementById(el)) res=document.getElementById(el);
		} else res=el;
		
		return res;
		}
	
	function $name(el){	
		if (!el) return false;
		var els=new Array();
	
		if (typeof(el)!="object"){
			els=document.getElementsByName(el);
		} 
		
		if (els.length!=0) return els;
		else return null;
		}
	
	
	function $tagname(tg,par){	
		if (!tg) return false;
		var els=new Array();
		par=$id(par)
		if (par && typeof(par)=="object") els=par.getElementsByTagName(tg);
		else els=document.getElementsByTagName(tg);
		
		if (els.length>1) return els
		else if (els.length==1) return els[0]
		else return [];
		}
	
	function $value(el){
		var res
		el=$id(el)
		if (!el) return ""
		
		res=el.value?el.value:null
		return res
		
		}
	
	function $innerHTML(el,text){
		el=$id(el)
		if (!el) return false
		el.innerHTML=text
		return true
		}
	function setChild(par,elID,elClass,elType,elContent,elParams){
		if (!par && !elID) return false;
		
		var el=$id(elID);
		
		if (par && !el && elType) 
		{
			//need to create and append new child
			par=$id(par);		
			el=document.createElement(elType);
			el=par.appendChild(el);
			if (elID) el.id=elID;
		}
		
		if (!el) return false;
		
		if (elClass) el.className=elClass;
		if (elContent) el.innerHTML=elContent;
		if (elParams) el=concatObjects(el,elParams);
		
		return el;
		}
	function unsetChild(el){
		if (!el) return false;
		el=$id(el);
		if (el.parentNode){
			el.parentNode.removeChild(el);
			}
		return true
		}	
	
	function getElementByTagAndClass(par,elTag,elClass){
		if (!par || !elTag) return false;
	
		par=$id(par);
		var el,elNum,els=new Array(),res=null;
		els=par.getElementsByTagName(elTag);
		if (els.length>0)
		{
			for (elNum in els) {
				el=els[elNum];
				//if (el.className && el.className==elClass)
				if (el.className && in_array(el.className.split(" "),elClass))
					res=el;
			}
		}
		
		return res;
		}
	function getElementsByTagAndClass(par,elTag,elClass){
			if (!par || !elTag) return false;
		
			par=$id(par);
			var el,elNum,els=new Array(),res=new Array();
			els=par.getElementsByTagName(elTag);
			if (els.length>0)
			{
				for (elNum in els) {
					el=els[elNum];
					if (el.className && in_array(el.className.split(" "),elClass))
					//if (el.className && el.className==elClass) 
					res.push(el);
				}
			}
			
			return res;
		}
	function getElementByTagAndProperty(par,elTag,property,propertyValue){
		if (!par || !elTag) return false;	
		par=$id(par);
		var el,elNum,els=new Array(),res=null;
		els=par.getElementsByTagName(elTag);
		if (els.length>0){
			for (elNum in els) {
				el=els[elNum];
				//if (el.className && el.className==elClass)
				if (el[property] && el[property]==propertyValue)
					res=el;
				}
			}		
		return res
		}

		
	function searchInClass(el,base){
		el=$id(el);
		if (el && el.className){
			var parts=el.className.split(' ');
			for (var i=0;i<parts.length;i++){
				var part=parts[i];				
				if (part.search(base)==0){
					return part.substr(base.length);
					}
				}
			}
		return undefined;
		}

/* Positioning and view
====================================*/
	function getWhereIs(block){
		var blockLeft = 0;
		var blockTop = 0;
			while(block) {
				blockLeft += block.offsetLeft;
				blockTop += block.offsetTop;
				block = block.offsetParent;
			}
			return { left:blockLeft, top:blockTop }
		}
	function setPosition(el,pos){
		el=$id(el)
		if (!el) {
			return false;
			}
		
		if (pos.left!=null) el.style.left=pos.left+"px"
		if (pos.top!=null) el.style.top=pos.top+"px"
		
		return false
		}	
	/* function switchElementVisibility(el,state){
			var states=new Array('hidden','showed')
			el=$id(el)
			var searchTmpl='/'+states[0]+'/'
			if (state==null)
				newState=(el.className.search(states[0])>-1)?1:0
			else
				newState=state
			currState=(newState==0)?1:0
			strTempl='/'+states[currState]+'/'
	
			if (el.className.indexOf(states[state])>0)
				el.className.replace(strTempl, states[state])
			else 
				el.className=states[newState]
			} */
	function switchElementVisibility(el,state){
		var states=new Array('hidden','showed'),
			newState,
			currState=0
		//alert (el+" '"+$id(el).className+"' state="+state)
		el=$id(el)
		
		if (el.className.search(states[0])>-1)
			currState=0
		else if (el.className.search(states[1])>-1)
			currState=1
		newState=(state==null)?((currState==0)?1:0):state
	
		strTempl='/'+states[currState]+'/'
	
		if (el.className.search(states[currState])>-1)
			el.className=el.className.replace(states[currState], states[newState])
		else 
			el.className+=" "+states[newState]
			
		return newState
		}
	function toggleClass(el,state,states){
			states=states?states:['hidden','showed']
			el=$id(el)
			var searchTmpl='/'+states[0]+'/',
				newState=(state==null)?((el.className.search(states[0])>-1)?1:0):state,
				currState=(newState==0)?1:0;
			if (el.className!=null && el.className.search(states[currState])>-1){
				el.className=el.className.replace(states[currState], states[newState])
				}
			else 
				if (el.className!=null && el.className.search(states[newState])<0)
					el.className+=" "+states[newState]
			return newState;
			}
	
/* STRING functions
====================================*/
	function NtoBR(strToClear){
		
		nIndex=strToClear.indexOf('\n');
		//	alert (nIndex);
		while (nIndex>0)
		{
			leftPart=strToClear.substr(0,nIndex);
			rightPart=strToClear.substr(nIndex+1, strToClear.length-1);
			strToClear=leftPart+"<BR>"+rightPart;
			nIndex=strToClear.indexOf("\n");
		}
	
		nIndex=strToClear.indexOf('\r');
		//	alert (nIndex);
		while (nIndex>0)
		{
			leftPart=strToClear.substr(0,nIndex);
			rightPart=strToClear.substr(nIndex+1, strToClear.length-1);
			strToClear=leftPart+rightPart;
			nIndex=strToClear.indexOf("\r");
		}
		
		//	alert (strToClear);
		return strToClear;
		}
	
	function BRtoN(strToClear){
	
		nIndex=strToClear.indexOf('<BR>');
		//	alert (strLength);
		while (nIndex>0)
		{
			leftPart=strToClear.substr(0,nIndex);
			rightPart=strToClear.substr(nIndex+4, strToClear.length-1);
			strToClear=leftPart+'\n'+rightPart;
			nIndex=strToClear.indexOf("<BR>");
		}
		
		nIndex=strToClear.indexOf('<br>');
		while (nIndex>0)
		{
			leftPart=strToClear.substr(0,nIndex);
			rightPart=strToClear.substr(nIndex+4, strToClear.length-1);
			strToClear=leftPart+'\n'+rightPart;
			nIndex=strToClear.indexOf("<br>");
		}
		
		
		return strToClear;
		}
		
	String.prototype.firstCharUpper=function(){
		return this.substr(0,1).toUpperCase()+this.substr(1)
		}
	String.prototype.isNullDate=function(){
		return (this=="0000-00-00 00:00:00");
		}

/* Array functions
====================================*/
	function in_array(arr,el){
		var res=0
		for (elNum in arr) if (el==arr[elNum]) res++
		return res
		}
	
	function getArgList(params){
		var argList=''
		for (var paramName in params)
			{
				argList+=argList?',':''
				argList+='"'+params[paramName]+'"'
			}
			
		return argList
		}
	function setArray(el){
		if ((typeof el=="object") && el.length!=null)	
			return el
		else
			return [el]
		}
		
/* Object functions
====================================*/
	function concatObjects(obj1,obj2){
		var res={}
		for (var pName in obj1){
			res[pName]=obj1[pName]
			}
		for (var pName in obj2)
			if (!res[pName]) res[pName]=obj2[pName]
		return res
		}

	function duplicateObject(obj){
		if (is_date(obj)){
			return obj;
			}
		var res=is_array(obj)?[]:{};
		for (var i in obj){
			if (is_object(obj[i])){
				res[i]=duplicateObject(obj[i]);
				}
			else{
				res[i]=obj[i];
				}			
			}
		return res;
		}
	
/* Debugging
====================================*/	
	function testObject(obj,isWrite,noAlert){
		var o="",
			sprt=isWrite?"<br/>":"\n"
		for (var p in obj){
			var subObj=obj[p];
			if (typeof subObj=="object"){
				subObj=testObject(subObj,null,true);
				}
			else {
				//alert("type of subObj is "+typeof subObj);
				}
			o+=p+"=>"+subObj+sprt
			}
		if (isWrite){
			document.write(o)
			}
		else {
			if (!noAlert)
				alert (o)
			}
		return o;
		}
	
/* PROTOTYPES
===================================== */
	
	/* String
	===================================== */
	
	
	
/* EVENTS	
====================================*/
	function MXX_EVENTS(){
		this.Elements=[]
		this.Events=[]
		this.eventObj=this
		this.append=function(el,evnt,func,weight){
			el=$id(el)
			if (!el) return
			if (!in_array(this.Elements,el)){
				el.eventObj=this				
				el.elNum=this.Elements.push(el)-1
				this.Events[el.elNum]={}
				}
			var evnts=setArray(evnt)
			for (var e=0;e<evnts.length;e++){
				var cEvnt=evnts[e]
				if (!this.Events[el.elNum][cEvnt])
					this.Events[el.elNum][cEvnt]=[]
				var funcs=setArray(func)
				this.Events[el.elNum][cEvnt]=this.Events[el.elNum][cEvnt].concat(funcs)			
				if (!this["router_"+cEvnt]) eval('this["router_'+cEvnt+'"]=function(eArg){this.eventObj.router(this,"'+cEvnt+'",eArg)}')
				
				eval('el["'+cEvnt+'"]=this["router_'+cEvnt+'"]')
				//if (cEvnt=="onclick") alert(el.id+"\n"+el.onclick)
				}
			
			}
		this.router=function(el,evnt,eArg){
			
			var elData=el.eventObj.Events[el.elNum]
			
			
			//FIXME
			/* if (!elData) {
				alert (el+" "+evnt)
					return;
				} */
			if (!elData || 	!elData[evnt]) {
				//alert (el.onclick)
				//evnt="onclick" 
				return
				}
				
			for (var e=0;e<elData[evnt].length;e++){
				if (elData[evnt][e] && typeof(elData[evnt][e]=="function"))
					elData[evnt][e].call(el,eArg)
				else {
					//testObject(el.eventObj.Events[el.elNum]["onfocus"])
					//testObject(elData[evnt]);
					}
				}
			//return false;//?
			
			}
		
		}
	var EVENTS=new MXX_EVENTS()
	
	function getKeyPressed(e){
		var KEYCODES=new Array()
			KEYCODES[9]="TAB"
			KEYCODES[13]="ENTER"
			KEYCODES[27]="ESC"
			KEYCODES[35]="END"
			KEYCODES[36]="HOME"
			KEYCODES[37]="ARROWLEFT"
			KEYCODES[38]="ARROWUP"
			KEYCODES[39]="ARROWRIGHT"
			KEYCODES[40]="ARROWDOWN"			
			
		var intKey=-1,
			targetField
		if (window.event){
			intKey=event.keyCode
			targetField=event.srcElement
			}
		else{
			intKey=e.which
			targetField=e.target
			}

		var res=(KEYCODES[intKey])?KEYCODES[intKey]:intKey
		return res
		}

/* Date prototypes
====================================*/
	var MONTHS=new Array("������","�������","�����","������","���","����","����","�������","��������","�������","������","�������");
	Date.prototype.getReadable=function()
	{
		var d=this.getDate(),
		m=MONTHS[this.getMonth()],
		y=this.getFullYear(),
		o=d+'&nbsp;'+m+'&nbsp;'+y;
		return o;	
	}
	
	Date.prototype.getTimeStamp=function()
	{
		var d=this.getDate(),
		m=this.getMonth()+1,
		y=this.getFullYear();
		
		if (d<10) d="0"+d;
		if (m<10) m="0"+m;
	//	alert (y);
		return ""+y+m+d+"000000";
	}
	
	Date.prototype.getFromTimeStamp=function(ts)
	{
		ts=ts+"";
		var y=parseInt(ts.substr(0,4)),
		m=parseInt(ts.substr(4,2))-1,
		d=parseInt(ts.substr(6,2));
		
		this.setFullYear(y)
		this.setMonth(m)
		this.setDate(d)
		this.setHours(0)
		this.setMinutes(0)
		this.setSeconds(0)
		
	
		return true
	}
	
	Date.prototype.getFromDT=function(dt)
	{
		dt=dt+"";
		var y=parseInt(dt.substr(0,4)),
		m=dt.substr(5,2)-1,
		d=dt.substr(8,2);
		//alert (dt+" "+y+" "+m+" "+d)
		
		this.setFullYear(y)
		this.setMonth(m)
		this.setDate(d)
		this.setHours(0)
		this.setMinutes(0)
		this.setSeconds(0)
		
	
		return true
	}
	
	Date.prototype.offsetDaysFromDate=function(dt,days)
	{
		var nd=new Date();
		this.setMonth(dt.getMonth());
		this.setFullYear(dt.getFullYear());
		this.setDate(dt.getDate()+days);
	
	}
	
/* Displaying page
====================================*/
	function SitePageBase(){
		this.realPageTitle=this.getClearPageTitle();		
		this.GET={};
		this.hashArraysDelimiter=',';
		this.parseHash();		
		}
		
	SitePageBase.prototype={
		redirect:function(page){
			if(!page) page="/";
			if (page.search(/^https?\:\/\//i)<0){
				if (page.substr(0,1)!='/')
					page="/"+page;
				page=SITE_URL+page;
				}
			window.location=page;
			return false;
			},
		refresh:function(){
			window.location.reload(false);
			},		
		prepareHash:function(h){
			var strHash='';
			if (is_object(h)){
				var arHash=[];
				for (var pName in h){
					var prop=h[pName];
					if ((is_string(prop) || is_numeric(prop)) && typeof(prop)!='undefined'){
						arHash.push(pName+'='+this.encodeHashValue(String(prop)));
						}
					else if (is_array(prop)){
						arHash.push(pName+'='+this.encodeHashValue(prop.join(this.hashArraysDelimiter),true));
						}
					}
				strHash=arHash.join('&');
				}
			else if (is_string(h)){
				strHash=h;
				}
			else{
				return false;
				}
			return strHash;
			},
			encodeHashValue:function(v,test){
				return encodeURIComponent(v);
//				return escape(encodeURIComponent(v));
				},
			decodeHashValue:function(v){
				v=decodeURIComponent(v);
//				v=unescape(decodeURIComponent(v));
				/*v=v.replace_multiply(
					[
					 	['_e_','='],
						['_a_','&']
					 	]
					);*/
				return String(v);
				},
		getHash:function(){
			return (location.hash).substr(1);
			},
		setHash:function(h){
			var 
				strHash=this.prepareHash(h),
				currEmptyHash=location.href.charAt(location.href.length-1)=='#';
			if(currEmptyHash){
				window.location=location.href+(strHash||'');
				}
			else if (strHash || location.hash){
				location.hash=(strHash||'');
				}
			return strHash;
			},		
		parseHash:function(){
			var
				h=this.getHash(),
				params={};
			if (!isset(h) || h==''){
				return false;
				}
			var arHash=h.split('&');			
			for (var i in arHash){
				var prop=arHash[i];				
				if (!is_string(prop)){
					continue;
					}
				var p=prop.split('=');					
				if (!p.length || p.length<2){
					continue;
					}
				var 
					field=p[0],
					value=this.decodeHashValue(p[1]);
				/*test array*/
				var parts=value.split(this.hashArraysDelimiter);
				if (parts.length>1){
					value=parts;					
					}
				params[field]=value;				
				}			
			this.$GET=params;
			return params;
			},
		getClearPageTitle:function(){
			return document.title.split('#').shift();
			
			},
		setTitle:function(t){
			if (t){
				document.title=t;
				}
			},
		restoreTitle:function(){
			this.setTitle(this.realPageTitle);
			}
		};
		
	window['jQuery'] && (function($){
		$(function(){
			SitePage=new SitePageBase();	
			});
		})(jQuery);
