//here some useful functions
SERVICE_ENABLED=true;
SERVICE_UNIQUE_ID=0;
MOUSE_POSITION_X=0;
MOUSE_POSITION_Y=0;
//функция проверяющая объявлена ли переменная
defined=function(varName){
	var retVal=true;
	try{
		(eval(varName));
	}catch(e){
		if(e){
			retVal=false;
		}
	}
	return retVal;
}

function IE(){
	return navigator.userAgent.toLowerCase().indexOf("msie")!=-1;
}

function OPERA(){
	return navigator.userAgent.toLowerCase().indexOf("opera")!=-1;
}

function FIREFOX(){
	return navigator.userAgent.toLowerCase().indexOf("firefox")!=-1;
}


function getScriptDirByFileName(fileName){
	var scripts=document.getElementsByTagName('script');
	script_src='';
	for (i=0;i<scripts.length;i++){
		if (scripts[i].src.indexOf(fileName)!=-1){
			script_src=scripts[i].src.replace(/^http:\/\/[^\/]*\//,'').replace(/[\/]?[^\/]*$/,'');
			break;
		}
	}
	return(script_src)
}

function $(eId){return document.getElementById(eId);}

function getUniqueId(){return(SERVICE_UNIQUE_ID++);}

Array.prototype.search=function(key){
	for (i in this){
		if (this[i]==key){
			return(i);
		}
		return(-1);
	}
}

Array.prototype.deleteValue=function(val){
	var tmp=new Array();
	for (i=0;i<this.length;i++){
		if (this[i]==val){
			continue;
		}
		tmp.push(this[i]);
	}
	return tmp;
}
Array.prototype.deleteByIndex=function(index){
	var tmp=new Array();
	for (i=0;i<this.length;i++){
		if (i==index){
			continue;
		}
		tmp.push(this[i]);
	}
	return tmp;
}


//Здесь класс Event
EVENT=function(){
	this.objects=new Array();
}

EVENT.prototype.add=function(obj,eventName,value){
	if (!this.objects[obj]){
		this.objects[obj]=new Array();
	}
	if (!this.objects[obj][eventName]){
		this.objects[obj][eventName]=new Array();
	}
	this.objects[obj][eventName].push(value);
	str='function(event){';
	for(var i=0;i<this.objects[obj][eventName].length;i++){
		str+=this.objects[obj][eventName][i]+';\n';
	}
	str+='}';
	eval(obj+'.'+eventName+'='+str);
}

EVENT.prototype.set=function(obj,eventName,value){
	if (!this.objects[obj]){
		this.objects[obj]=new Array();
	}
	this.objects[obj][eventName]=new Array();
	this.objects[obj][eventName].push(value);
	str='function(){'+value+';}';
	eval(obj+'.'+eventName+'='+str);
}

EVENT.prototype.clear=function(obj,eventName){
	try{
		//alert(obj);
		//alert(eventName);
		this.objects[obj][eventName]=new Array();
	}finally{}
	eval(obj+'.'+eventName+'=null');
}

EVENT.prototype.unset=function(obj,eventName,what){
	if (!this.objects[obj]||!this.objects[obj][eventName]){
		return -1;
	}
	this.objects[obj][eventName]=this.objects[obj][eventName].deleteValue(what)
	if (!this.objects[obj][eventName][0]){
		eval(obj+'.'+eventName+'=null');
		return;
	}
	str='function(event){';
	for(var i=0;i<this.objects[obj][eventName].length;i++){
		str+=this.objects[obj][eventName][i]+';\n';
	}
	str+='}';
	eval(obj+'.'+eventName+'='+str);
}


$Event=new EVENT();


//mouse_position_handler
function saveMousePosition(e){
	if (!e){
		e=window.event;
	}
	MOUSE_POSITION_X=e.clientX;
	MOUSE_POSITION_Y=e.clientY;
}
function getMousePosition(scrollFlag){
	if (scrollFlag){
		var scroll=getScrollPosition();
		return {x:MOUSE_POSITION_X+scroll.left,y:MOUSE_POSITION_Y+scroll.top}
	}
	return {x:MOUSE_POSITION_X,y:MOUSE_POSITION_Y}
}
$Event.add('document','onmousemove','saveMousePosition(event)');
//end of mouse_position_handler

function getWindowSize(){
	var w=document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
	var h=document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
	return({width:w,height:h});
}

function getScrollPosition(){
	var t=self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
	var l=self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
	return({top:t,left:l});
}

function getDocumentSize(){
	if(document.compatMode=='CSS1Compat' && !window.opera){
		var h=(document.documentElement.scrollHeight > document.documentElement.offsetHeight)?document.documentElement.scrollHeight:document.documentElement.offsetHeight;
		var w=(document.documentElement.scrollWidth > document.documentElement.offsetWidth)?document.documentElement.scrollWidth:document.documentElement.offsetWidth;
	}else{
		var h=(document.body.scrollHeight > document.body.offsetHeight)?document.body.scrollHeight:document.body.offsetHeight;
		var w=(document.body.scrollWidth > document.body.offsetWidth)?document.body.scrollWidth:document.body.offsetWidth;
	}
	return({height:h,width:w})
}

function getElementPosition(elem){
    if (typeof(elem)!='Object'){
		elem = document.getElementById(elem);
	}
    var w = elem.offsetWidth;
    var h = elem.offsetHeight;
    var l = 0;
    var t = 0;
    while (elem){
        l += elem.offsetLeft;
        t += elem.offsetTop;
        elem = elem.offsetParent;
    }
    return {"left":l, "top":t, "width": w, "height":h};
}

function evalHtmlScripts(html_string){
	var pattern=/<script[\s\S]*?>[\s\S]*?<\/script>/ig;
	var jsObj=html_string.match(pattern);
	if(jsObj){
		re1=/<\/script>/i;
		re2=/<script[\s\S]*?>/
		for(var i=0;i<jsObj.length;i++){
			jsObj[i]=jsObj[i].replace(re1,"");
			jsObj[i]=jsObj[i].replace(re2,'');
			jsObj[i]=jsObj[i].replace(/\n*/,'');
			eval(jsObj[i]);
		}
	} 
}

String.prototype.translit = function(){
	var alpha={
		'а':'a','б':'b','в':'v','г':'g','д':'d','е':'e','ё':'yo','ж':'zh','з':'z','и':'i','й':'j','к':'k','л':'l','м':'m','н':'n','о':'o',
		'п':'p','р':'r','с':'s','т':'t','у':'u','ф':'f','х':'h','ц':'c','ч':'ch','ш':'sh','щ':'sch','ы':'y','э':'e','ю':'yu','я':'ya',
		'А':'A','Б':'B','В':'V','Г':'G','Д':'D','Е':'E','Ё':'YO','Ж':'ZH','З':'Z','И':'I','Й':'J','К':'K','Л':'L','М':'M','Н':'N','О':'O',
		'П':'P','Р':'R','С':'S','Т':'T','У':'U','Ф':'F','Х':'H','Ц':'C','Ч':'CH','Ш':'SH','Щ':'SCH','Ы':'Y','Э':'E','Ю':'YU','Я':'YA',
		' ':'_','(':'(',')':')','_':'_'
	}
	str='';
	for (var i=0;i<this.length;i++){
		if (alpha[this[i]]){
			str+=alpha[this[i]];
		}else{
			switch(this[i]){
				case 'ъ':
				case 'Ъ':
				case 'ь':
				case 'Ь':
					break;
				default:
					str+=this[i];
			}
		}
	}
	return(str);
}

String.prototype.addSlashes = function(){
	var toEscape=new Array('"',"'");
	var str=this;
	for (var i=0;i<toEscape.length;i++){
		str=str.replace(toEscape[i],'\\'+toEscape[i]);
	}
	return str;
}

String.prototype.trim = function(){
	return this.replace(/(^\s+)|(\s+$)/g, "");
}
