/******* часто используемые функции и решения JavaScritp  ******/


/***  визуальные эффекты и методы  ***/
/*
{
id,
x1,x2,
y1,y2
w1,w2
h1,h2
op1,op2,
duration,
direction,
funcStart
funcStep,
funcEnd
}

*/

function TweenGo(id)
{

if (!Tween[id]) return; //если Твин не создан - уходим

Tween[id].t=0
if (!Tween[id].duration) Tween[id].duration=1000

if (!Tween[id].funcStep) Tween[id].funcStep ='TweenStep_Normal';

code=Tween[id].funcStep+'("'+id+'")'
alert(code)
//if (Tween[id].clearID) clearInterval(Tween[id].clearID)
Tween[id].clearID = setInterval(code,40)

}


function TweenStep_Normal(id)
{

var T=Tween[id];
if (Tween[id].duration==undefined) Tween[id].duration=1000


Tween[id].t+=  4000/Tween[id].duration // вычисляем процент прошедшего времени

setTimeout("setDiv('search_form', '', 200)",1)
clearInterval(Tween[id].clearID)
//if (Tween[id].t >=100) {
//clearInterval(Tween[id].clearID)
//Tween[id].clearID=0
//}
//Tween[id].y += T.t*(T.y2-T.y1);


//getObj('search_form').style.top="200px"; //Math.floor(Tween[id].t) +'px';
return;
}


function getPosition(obj) 
// возвращает абсолютную позицию объекта на странице (с учетом всех над-вложенных объектов)
// на входе - ссылка на объект, на выходе - хеш массив {'x':x,'y':y}
{  
	var x=0, y=0;  
	while(obj) {    
		x+=obj.offsetLeft;    
		y+=obj.offsetTop;    
		obj=obj.offsetParent;  
	}  
	return {x: x, y:y};
}



function getWindowSize() 
// возвращает текущую ширину и высоту активного окна браузера
// на выходе хеш массив {w:width, h:weight} 
{
	var res={w:'', h:''}
	
	// общий синтаксис	
	if (self.innerHeight) 
		{res.w = self.innerWidth; res.h = self.innerHeight;}
			
	// IE 6 Strict Mode	 
	else if (document.documentElement && document.documentElement.clientHeight)
	{
		res.w = document.documentElement.clientWidth;
		res.h = document.documentElement.clientHeight;
	}	

	// Остальные версии IE	} 
	else if (document.body) {	    
		res.w = document.body.clientWidth;	    
		res.h = document.body.clientHeight;	
	}	
	return res	
}


function getWindowScroll() 
// Определение текущего скролинга окна браузера
// на выходе - хеш массив {'x':x,'y':y}
{
	var res={x:'', y:''}
	
	// Opera, Mozilla	
	if (self.pageXOffset) 
		{res.x = self.pageXOffset; res.y = self.pageYOffset;}
			
	// IE 6 Strict Mode	 
	else if (document.documentElement)
	{
		res.x = document.documentElement.scrollLeft;
		res.y = document.documentElement.scrollTop;
	}	

	// Остальные версии IE	 
	if (!res.y && !res.x && document.body) {	    
		res.x = document.body.scrollLeft;	    
		res.y = document.body.scrollTop;	
	}	
	return res	
}

// возвращает текущий вертикальный скролллинг окна
function getWindowScrollY(){
  var s=getWindowScroll();
  return s.y;
}




function centerObj(id)
/*  центрирует объект по горизонали и вертикали в окне браузера 
На входе: id - id блокового объекта (у объекта должно быть position:absolute) 
используемые функции: getWindowSize(), getWindowScroll() */
{
	var o=getObj(id), db=document.body;
	var winsize=getWindowSize()
	var winscroll=getWindowScroll()
	var objw=o.offsetWidth 
	var objh=o.offsetHeight
	var oleft=winsize.w/2-objw/2 +winscroll.x;	
	var otop=winsize.h/2 -objh/2 
	if (otop>10) otop+=winscroll.y;	
	else otop=1+winscroll.y
	
	o.style.left=oleft
	o.style.top=otop
}


// размещает объект под указателем мышки
// (совмещает с мышкой правый верхний угол объекта)
function placeUnderMouse(id, ignoreWindow)
{
	var o=getObj(id); if (!o) return false;
	var w=o.offsetWidth; 
	if (o && o.style.display=='none') 
		{o.style.display=''; w=o.offsetWidth; o.style.display='none';}
	var winscroll=getWindowScroll();
	var l=event.clientX+winscroll.x-w
	o.style.left =( l<10 ?  10 : l)
	o.style.top=event.clientY+winscroll.y
}


// возвращает координаты и размеры объекта 
//в виде хеша {x:x, y:y, w:w, h:h}
function getObjProp(obj)  
{  
	this.w=obj.offsetWidth; 
	this.h=obj.offsetHeight;
	
	if (obj.style.display=='none') 
		{	obj.style.display=''; 
			this.w=obj.offsetWidth; 
			this.h=obj.offsetHeight;
			obj.style.display='none';
		}
	
	this.x=0, this.y=0;  
	while(obj) {    
		this.x+=obj.offsetLeft;    
		this.y+=obj.offsetTop;    
		obj=obj.offsetParent;  
	}  
	
	return this; 
}

// возвращает координаты мышки
function getMouse()
{
	var winscroll=getWindowScroll();
	return {x:event.clientX+winscroll.x , y:event.clientY+winscroll.y}
}

// размещает объект "obj" в заданное положение "x,y"
function placeObj(obj, x,y)
{	obj.style.top=y +"px"
	obj.style.left=x +"px"
}




function setDiv(id, x,y,w,h) 
//устанавливает для слоя заданные координаты  (x,y) и размеры (w,h)
{
	var d=getObj(id); 
	if (x!=null && x!='') d.style.pixelLeft=x //left=x+'px'; 
	if (y!=null && y!='') d.style.pixelTop=y //top	=y+'px';
 	if (w) d.style.width=w+'px'; 
	if (h) d.style.height=h+'px';
}


function getDivProp(id) 
// возвращает текущие свойства слоя - координаты слоя DIV и его размеры
{
	var d=getObj(id);
	var r={
		x:d.style.posLeft ,
		y:d.style.posTop ,
		w:d.style.posWidth ,
		h:d.style.posHeight
	}
	return r
}


 
// планове изменение цвета шрифта дял элемента 'id'
// формат цвета: {200,200,255} или {0x11,0x99,0x77}
// --- не доработано
function fadeColor(id, colorStart, colorEnd, delay) 
{ 
  if (c > 0) { 
    c -= 10; 
    document.getElementById(id).style.color = "rgb("+c+" , "+c+" , "+c+")"; 
    t = setTimeout( "rgb ()", 100 ); 
   } 
  else 
    clearTimeout(t) 
} 



// функция fade осуществляет плавное появление/исчезновение элемента
// written by Yuriy Nasretdinov
// el - ссылка на объект или идентификатор
// duration  - длительность эффекта в секундах
// outMode - если задано, то объект исчезает, иначе - плавно появляется (из состояния hidden)
function fade(el,duration, outMode)
{
        if(!duration) var duration=0.3;
        
        el=getObj(el)
  
        if(el.runtimeStyle) //IE, filter works only with absolute positioned elements, or elements with specified width or height. Other elements are just _made_ to answer there conditions
        {
                if(el.style.position!='absolute' && !el.style.width && !el.style.height)
                {
                        el.style.width=el.offsetWidth+'px';
                        el.style.height=el.offsetHeight+'px';
                }
                
                el.runtimeStyle.filter='BlendTrans(Duration='+duration+')';
               if (!outMode || outMode=='in')
               { 
                 el.style.visibility = "hidden";
                 el.filters["BlendTrans"].Apply();
                 el.style.visibility = "visible";
               }
               else
               {
                 el.style.visibility = "visible";
                 el.filters["BlendTrans"].Apply();
                 el.style.visibility = "hidden";
               }
                el.filters["BlendTrans"].Play();
                return true;
        }
        
        if(el.style.opacity!=undefined) //Mozilla, maybe in some time in the future... opera
        {
                
                
                
                if (!outMode || outMode=='in')
                {
                var bit= -1/(duration*25);
                el.style.opacity=0;
                }
                else // mode 'out'
                {
                var bit= 1/(duration*25);
                el.style.opacity=1;
                }
                
                el.style.visibility="visible";
                
                
                var op=function()
                {
                        if(el.style.opacity>1) return;
                        if(el.style.opacity<0) return;
                        el.style.opacity-=bit; //fucky "+" works like if a digit was a string
                        
                        setTimeout(op,40);
                }
                op();
                return true;
        }
        
        return false;
}


function setOpacity(id, op)
// устанавливает прозрачность  для объекта, кросс-браузерная функция
// на входе: id - идентификатор объекта, op - прозрачность % (0-100)
{
	
	var el=getObj(id)
	
	
	if (op>2 && el.style.visibility=='hidden') el.style.visibility='visible';
  if (op>2 && el.style.display=='none') el.style.display='';	
	
	var attr,s
	if (el.style.opacity != null) attr = 'opacity'; //CSS3
	else if (el.style.MozOpacity != null) attr = 'MozOpacity'; //Mozilla
	else if (el.style.KhtmlOpacity != null) attr = 'KhtmlOpacity'; //Konqueror, Safari, ...
	if (el.style.filter!=null) {el.style.filter = "alpha(opacity="+Math.round(op)+");"
	if (op<=2) {el.style.visibility='hidden';}
	}
    else 
	{el.style[attr] = Math.floor(op/10)*0.1;}
	//alert(attr)
	
	
}



bigFotoStore =new Image();
bigFotoImage= new Object();
bigFotoCanvasId='ShowBigFoto';
bigFotoImgId =  bigFotoCanvasId+'_Image'
bigFotoDescId =  bigFotoCanvasId+'_Description'
bigFotoCanvasStyle="<style>"
+" #"+bigFotoCanvasId+" {border:1px solid #444; border-right:3px solid #555;border-bottom:3px solid #555; width:; height:; position:absolute; top:0; left:0; background:#fff; z-index:10; padding:20px; text-align: center;}"
+ "#"+bigFotoCanvasId+" A:link,#"+bigFotoCanvasId+" A:visited {position:absolute; top:0px;  display:block; width:70px; padding:2px 5px; height:22px; font-size:16px; font-weight:bold; text-align:right; cursor:pointer; color:#e00; text-decoration:none; font-family:Arial;  } "
+"#"+bigFotoCanvasId+" A:hover {background:#f00; color:#fff;}"
+"#"+bigFotoCanvasId+" IMG {position:relative;z-index:11; border:1px solid #ccc;}"
+"#"+bigFotoCanvasId+" DIV {border:0px solid #444; position:absolute; left:0; top:90px; width:390px; text-align: center; color:#345;color:#f00;}"
+"#"+bigFotoCanvasId+">DIV {width:340px; top:150px;}"
+"#"+bigFotoCanvasId+" SPAN {display:block; text-align:center; margin:-15px 70px 5px 70px; font-weight:bold;}"
+"#"+bigFotoCanvasId+".BigFotoCanvasAuto {width:auto;height:auto;}"
+"#"+bigFotoCanvasId+'_back {position:absolute; top:0; left:0; width:300px; height:50px; border:1px solid #f00; z-index:12; width:100%; top:expression(getWindowScrollY()) }'

+"</style>"
wr(bigFotoCanvasStyle)

function closeBigPhoto()
{
  Canv=getObj(bigFotoCanvasId);
	Im = getObj(bigFotoImgId);
	if (!Canv) return;
  Canv.style.display='none';
  Im.src=''; Im.style.display='none';
  Canv.className=''; //location='#gallery';
  Im.style.borderColor=''
  Canv.style.opacity= '';
  Canv.style.filter= "";
}


function showBigPhoto (img, description, isClose)
{

  if (!getObj(bigFotoCanvasId)) 
	{
    /*
    var BackCanv= document.createElement('DIV')
			BackCanv.id= bigFotoCanvasId+'_back'
			BackCanv.onmouseover=function(){
      //alert(1)
      }
      document.body.appendChild(BackCanv)
     */


    
    var Canv = document.createElement('DIV')
			Canv.id= bigFotoCanvasId
			Canv.style.display='none'
			Canv.onclick= function()
      {
        closeBigPhoto();
      }


      document.body.appendChild(Canv)

    var Span = document.createElement('SPAN')
			Span.id=bigFotoDescId
			Canv.appendChild(Span)
		var Im = document.createElement('IMG')
			Im.id= bigFotoImgId
			Im.style.display='none'
			Im.onload= function()
      {
        this.style.display=''; this.style.visibility='visible';
        var o=getObj(bigFotoCanvasId);
        o.className='BigFotoCanvasAuto';
        o.style.width=''; o.style.height='';
        centerObj(bigFotoCanvasId);
        window.location='#'+bigFotoCanvasId;


      }

      /*
      Canv.onmouseout = function()
      {
        if (getObj(bigFotoImgId).style.display!='none')
        {
          var Canv= getObj(bigFotoCanvasId);

          Canv.style.opacity= '0.8';
          Canv.style.filter= "alpha(opacity=80)";
          setTimeout(closeBigPhoto, 700)
        }
      } */
			Canv.appendChild(Im)
		var Link = document.createElement('A')
			Link.href='javascript:void();'
			Link.innerHTML='ЗАКРЫТЬ'
			Link.style.right='0px';
			Canv.appendChild(Link)


    var Div = document.createElement('DIV')
			Div.innerHTML='загрузка...'
			Canv.appendChild(Div)
	}
	else 
	{
		Canv=getObj(bigFotoCanvasId);
		Im = getObj(bigFotoImgId);
	}


	getObj(bigFotoDescId).innerHTML=description
	Canv.style.width='400px'; Canv.style.height='200px';
	if (Canv.style.display=='none')
	{
		Canv.style.display='block'
		centerObj(Canv)
	}
	else
  {
    Canv.style.display='block'
  }

  Im.style.display='none'; Im.style.visibility='hidden';

  //Im.src=img
  setTimeout("getObj(bigFotoImgId).src='"+img+"'",1000)

return;

	
}
showBigFoto=showBigPhoto;


function ShowHide (obj, state, useVisibility) 
// скрывает|показывает объект
{ 
		var o=getObj(obj), showstate=0;; 
		if (state===0 || state===1)
		{	
		 	if (useVisibility)
					o.style.visibility = (state ? 'visible':'hidden');
			else 	o.style.display= (state ? '':'none');
		}
		else 
		if (useVisibility)
		{
			if (o.style.visibility=='hidden') {o.style.visibility='visible';}
			else {o.style.visibility='hidden';}
		}
		else 
		{
			if (o.style.display=='none') {o.style.display='';}
			else {o.style.display='none';}
		}

return (o.style.display=='none'? 0 :1);		
}
showHide=ShowHide;


/********************************/

// возвращает объект, на входе - ID объекта или сам объект 
function getObj(id) {return ( typeof(id)== "object"? id : document.getElementById(id))}

/* вывод текста в документ  */
function wr(t) {document.write(t);}

/* вывод email в документ  */
function write_email(email1, email2) {
	var email=trim(email1)+'@'+trim(email2);
	document.write('<a href="mailto:'+email+'">'+email+'</a>');
	}


/* вывод текста в документ без потери форматирования  */
function wrpre(t) {document.write('<pre>'+t+'</pre>');}


//JS скрипт для получения содержимого URL 
  
var getHtmlReady=true, getHtmlUrl='', getHtmlID='', xmlDoc=null; 
function getHTML(url, queryID) // посылает запрос на url-адрес 
{

	if (!getHtmlReady) 
	{ 
		thiscode='getHTML("'+url+'", "'+queryID+'")'
		setTimeout(  thiscode  , 100); 
		return false; 
	}
	getHtmlReady=false;
	
	
	if (!url.match(/https:\/\//i)) url='http://'+ url.replace( /^\s*http:\/\//i , '');

	//alert(url)
	getHtmlUrl=url; 
	getHtmlID=queryID ? queryID:'';
	
	if (typeof window.ActiveXObject != 'undefined' ) {
		xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
		xmlDoc.onreadystatechange = getHTMLEnd;
	} else {
		xmlDoc = new XMLHttpRequest();
		xmlDoc.onload = getHTMLEnd;
	}
	xmlDoc.open("GET", url, true);
	xmlDoc.send(null);
}


function getHTMLEnd() // получает html-код - ответ на запрос - и передает его PHP скрипту 
{
	if (xmlDoc.readyState != 4) return false;
	var Response= xmlDoc.responseText, queryID=getHtmlID;
	f=getObj('sendForm');
	f.html.value=Response
	f.url.value=getHtmlUrl
	f.sid.value=queryID
	setTimeout("f.submit()", 10);	
	setTimeout("getHtmlReady=true;", 100);
}

//получает содержимое BODY из локального IFRAME 
function getFrameHTML(frameID) 
{
if (document.frames) return document.frames[frameID].document.body.innerHTML;
else  return getObj(frameID).contentWindow.document.body.innerHTML; 
}
getFrameContent = getFrameHTML


/*
изменение содержимого фрейма:   	getObj(frameName).src=URL
получение адреса фрейма: 		getObj(frameName).src
проверка пустого фрейма
*/



function isInArray(element, arr)
{
	for (var i in arr) {if (arr[i] == element) return true;}
	return false;
}

/* убрать пробельные символы в начале и в конце строки */
function trim(str)
{
	return str.replace(/^\s+/, '').replace(/\s+$/, '');
}



// возвращает значение Cookie по имени name
function getCookie(name)
{
	// коррекция для русских имен
	var n2=encodeURIComponent(name); 
	if (name!=n2) name=n2
	
	var c = document.cookie;
	if (c.length < 1) return false;

	var b = c.indexOf(n + '=');
	if (b == -1) return false;

	b += (n.length + 1);
	var e = c.indexOf(';', b);

	return unescape((e == -1) ? c.substring(b) : c.substring(b, e));
}

// Записывает Cookie с именем name и значением value
// на срок hours часов, если срок не указан - то на время текущей сессии браузера
// (куки хранятся только в пределах одного браузера)

function setCookie(name, value, hours)
{
	// коррекция для русских имен
	var n2=encodeURIComponent(name); 
	if (name!=n2) name=n2
	
	var expire = "";
	if(hours != null)
	{ expire = new Date((new Date()).getTime() + hours * 3600000);
	expire = "; expires=" + expire.toGMTString();
	}
	document.cookie = name + "=" + escape(value) + expire;
}


function deleteCookie(name) 
{	
	// коррекция для русских имен
	var n2=encodeURIComponent(name); 
	if (name!=n2) name=n2
	
	if (getCookie(name)) document.cookie = name+'='+
	';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

// проверяет e-mail на корректность
function checkEmail(email){
	return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email) 
}


function isIE()
{
 return (document.all && document.all.item && (window.opera==undefined) );
}





// предварительная загрузка 1 изображения
preImgs=[]
function preloadImage(imageFile)
{
  preImgs[preImgs.length]=new Image()
  preImgs[preImgs.length-1].src=imageFile
}


// предварительная загрузка нескольких изображений с увеличение счетчика прогресса
preImgs=[]
preloadImagesProgress=0
function preloadImages(images)
{
  if (!arguments.length) return;
  n=arguments.length;
  for (i=0;i<n; i++)
  {
      preImgs[i]=new Image();
      preImgs[i].src= arguments[i];
      preImgs[i].onload=function() {preloadImagesProgress++}
  }
}

 


/* текущее время */
function thisTime() { var t=new Date(); return t.getTime(); }


/* форматирует время в виде часы:минуты:секунды */
function formatTime(time) {
	var t=new Date(), d=':';
	if (time!=undefined) t.setTime(parseInt(time)) 
	var h= (time==undefined ) ?  num2(t.getHours())+d : '';
	var m= t.getMinutes() ?  num2(t.getMinutes())+d : '00:';
	return h+m+ num2(t.getSeconds())
}


// создать строковое представление хеша-объекта
// d - объект (который нужно преобразовать в строку)
function Dump(d,l) { 
    if (l == null) l = 1;
    var s = '';
    if (typeof(d) == "object") {
        s += typeof(d) + " {\n";
        for (var k in d) {
            for (var i=0; i<l; i++) s += "  ";
            s += k+": " + Dump(d[k],l+1);
        }
        for (var i=0; i<l-1; i++) s += "  ";
        s += "}\n"
    } else {
        s += "" + d + "\n";
    }
    return s;
}
// пример: alert(Dump(document.body.style))


// простая версия - вывод всех ствойств 1го уровня у объекта
function allProp(obj){
	str=''
	for (key in obj) { str+='obj.'+key+' = '+ obj[key] + ' \t\t'}
	return str
}
//пример: alert(allProp(this))  

function alertAllProp(obj, fl){
	str=''; c=''
	for (key in obj) { 
		if (typeof(obj[key])=="object" && obj[key]!=null) c="{"+obj[key].length+"}"
		else if(fl) continue;
		str+='obj.'+key+' = '+ obj[key] + c+ ' \t\t'
	}
	alert(str)
}

// печать всех свойств объекта - в конце документа
function writeAllProp(obj){
	str=''
	for (key in obj) { str+='obj.'+key+' = '+ obj[key] + ' \r\r'}
	document.write("<pre>"+str+"</pre>")
}



// сортировка массива по значениям
function sortArray(arr){
	var t1= [].concat(arr).sort( function(a,b) { return (a-b)} )
	var t2=new Array;
	for (var i=0,j=0; i<t1.length; i++)
	{  
		if (t1[i]!= undefined) 
			if (trim(t1[i])!='')  
				 { t2[j]=t1[i]; j++; }
	}
	return t2
}	


// защищённый от ошибок поиск регулярного выражения в строке
// возвращает найденную строку, соответствующую подстроке (в скобках) в регулярном выражении
function findStr(str, regExp) 
{
	var m=str.match(regExp)
	if (m) return m[1]; else return false;
}

//пример: r= findStr(str, /Результат поиска:[^0-9]+[^<]+[^с]+сайтов[^0-9]+([^<]+)/i )





/* вывод кода нажатой клавиши */

//инициализация- - document.onkeydown = alertKeyCode;
function alertKeyCode(e) {
	if (!e) e = window.event;
	var k = e.keyCode;
	alert(k)
}


function setStatusBar(msgStr) { top.status = msgStr; }
