/* часто используемые функции и решения JavaScritp  */



// getObj(id) - получить объект по его ID 
//function getObj(id) {return document.getElementById(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);
}



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 ShowHide (obj, state) { 
		var o=getObj(obj);
		if (state==0 || state==1)
		 	o.style.display=state? '':'none';
		else 
		{
			if (o.style.display=='none') {o.style.display='';}
			else {o.style.display='none';}
		}
}
showHide=ShowHide;


// showHideBigPhoto (img, canvasId)  - показывает / скрывает большое фото
// img - ссылка на большую картикну, 
// canvasID - id объекта (изначально скрытый DIV), внутри которого расположено большое фото

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 getPosition(obj) 
{  
	var x=0, y=0;  
	while(obj) {    
		x+=obj.offsetLeft;    
		y+=obj.offsetTop;    
		obj=obj.offsetParent;  
	}  
	return {x: x, y:y};
}



function getWindowSize() // Определение текущей ширины и высоты активного окна браузера 
{
	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() // Определение текущего скролинга окна браузера
{
	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;
}


/* 
центрируем объект по горизонали и вертикали в окне браузера 
id - id блокового объекта
у объектно должно быть position:absolute 
используемые функции: getWindowSize(), getWindowScroll()
*/

function centerObj(id)
{
	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
}


// возвращает координаты и размеры объекта
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}
}

// размещает объект в заданное положение
function placeObj(obj, x,y)
{	obj.style.top=y +"px"
	obj.style.left=x +"px"
}



// предварительная загрузка изображения
preImgs=[]
function preloadImage(imageFile)
{
  preImgs[preImgs.length]=new Image()
  preImgs[preImgs.length-1].src=imageFile
}


/* текущее время */
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 )



//устанавливает для слоя заданные координаты 
function setDiv(id, 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';
}

// возвращает текущие свойства слоя - координаты слоя DIV и его размеры
function getDivProp(id) 
{
	var d=getObj(id);
	var r={
		x:d.style.posLeft ,
		y:d.style.posTop ,
		w:d.style.posWidth ,
		h:d.style.posHeight
	}
	return r
}


/* вывод кода нажатой клавиши */

//document.onkeydown = alertKeyCode;
function alertKeyCode(e) {
	if (!e) e = window.event;
	var k = e.keyCode;
	alert(k)
}


function setStatusBar(msgStr) { self.status = msgStr; }
