function getById(id){return document.getElementById(id);}

function getElementbyClass(classname){  
	var inc=0;  
	var customc=new Array();  
	var alltags=document.all? document.all : document.getElementsByTagName("*");  
	for (i=0; i<alltags.length; i++) {  
		if (alltags[i].className==classname)  
		customc[inc++]=alltags[i];  
	} 
	return customc;  
} 

function getposOffset(overlay, offsettype) {
	var totaloffset=(offsettype=="left")? overlay.offsetLeft : overlay.offsetTop
	var parentEl=overlay.offsetParent
	while (parentEl!=null){
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop
		parentEl=parentEl.offsetParent
	}
	return totaloffset;
}

function ajax(nurl) 
{  this.url=nurl
   this.method='GET'
   this.data=''
   this.selfdestroy=false
   this.out_obj=null
   this.xmlHttp=null
   this.set_post=function(data){this.method='POST';this.data=data}
   this.set_get=function(){this.method='GET'}
   this.request=function(out_obj,url)
  {
   this.url=(url==null||url=='')?this.url:url
   this.out_obj=out_obj
   try
    {
    this.xmlHttp=new XMLHttpRequest()
    if (this.xmlHttp.overrideMimeType && this.method=='POST') this.xmlHttp.overrideMimeType('text/html')
    }
   catch (e)
    {
     var msv=["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"]
     for(var j=0;j<=msv.length;j++)
      {
      try 
        { 
        this.xmlHttp=new ActiveXObject(msv[j])
        break
        } 
        catch(e){ } 
      } 
     if (!this.xmlHttp) return false    
    }
    var self = this
    this.xmlHttp.onreadystatechange=function()
    {if(self.xmlHttp.readyState==4)
        {
        if (typeof(show_div)=='function') show_div(self.out_obj,self.xmlHttp.responseText)
        if (self.selfdestroy && typeof(destroy)=='function') {self.xmlHttp=null;destroy()}
        }
    }
    if (this.method=="GET") 
      {this.xmlHttp.open("GET",this.url,true);this.xmlHttp.send(null)}
      else
      {
      this.xmlHttp.open("POST", this.url, true)
      this.xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
      this.xmlHttp.setRequestHeader("Content-length", this.data.length)
      this.xmlHttp.setRequestHeader("Connection", "close")
      this.xmlHttp.send(this.data)    
      }  
    return true
    }
}
function destroy(ajax)
{// free some resources
for(var k=0;k<ajax_reqs.length;k++) if(ajax_reqs[k].xmlHttp==null){ajax_reqs.splice(k--,1);continue} 
}

var timeoutOff=850
var div_width=500
var bropacity=(document.all&&!window.opera&&!document.createTextRange)?"filter: alpha(opacity=30);":(!window.opera?"-moz-opacity: 0.3;":"opacity: 0.3;")
var ltxt="<div id='loader' class='loader'>Идет загрузка сообщения...</div>"
var timeoutOn=1000
var move_obj=true
var overdiv=new Array()
var urls=new Array()
var initurls=new Array()
var dcache=new Array()
var url_names=new Array()
var ajax_reqs=new Array()

function show_div(id,data)
{
var obj=getById(id)
var div=getById('res'+id)
if (data!='') 
   { 
     var cacheid=cache_id(getid2(id))
     if (!dcache[cacheid]) dcache[cacheid]=data
     var temp=/<!--clist='(\d+):(\d+)'-->/i.exec(data)
     if(/<!--MYSQL_ERROR-->/.test(data)) return;
     if (temp!=null) {
     	 var nsum=parseInt(temp[2]); // суммарное количество собщений
     	 var ncur=parseInt(temp[1]); // индекс текущего сообщения (с нуля) 
         var left=(ncur>0)?"<a href='#' onclick='return mgoto(0,"+ncur+",\""+id+"\");' title='К первому сообщению'>«&nbsp;</a><a href='#' onclick='return mgoto("+(ncur-1)+","+ncur+",\""+id+"\");' title='К предыдущему сообщению'>‹&nbsp;</a>":"«&nbsp;‹&nbsp;";
         var right=(ncur<(nsum-1))?"<a href='#' onclick='return mgoto("+(ncur+1)+","+ncur+",\""+id+"\");' title='К следующему сообщению'>&nbsp;›</a><a href='#' onclick='return mgoto("+(nsum-1)+","+ncur+",\""+id+"\");' title='К последнему сообщению'>&nbsp;»</a>":"&nbsp;›&nbsp;»"
         if (nsum>1) data=data.replace(/(class='flright2'.*?>)/i,'$1'+left+"<a href='#' onclick='return mgoto(0,-1,\""+id+"\");' title='К первоначальному сообщению'>"+(ncur+1)+"/"+nsum+"</a>"+right+"&nbsp;&nbsp;")
     }
     data1=data.replace(/^<div.*?>/i,"<div class='obertka'>")
     div.innerHTML="<div class='shadow' style='"+bropacity+"'><span style='visibility:hidden'>"+data1+"</span></div>"+data
   }
var ws=getScrollXY()
var dx=getposOffset(obj,"left")
var dy=getposOffset(obj,"top")
var dh=div.clientHeight
dx=(dx+div_width<get_ww())?dx:get_ww()-div_width-30
dy=(dy+dh<ws[1]+get_wh())?dy+15:(dh>get_wh()?ws[1]+15:ws[1]+get_wh()-dh-10)
if (move_obj)
{
 div.style.left=dx+"px"
 div.style.top=dy+"px"
 div.style.visibility='visible' 
}
}

function construct_url(url,num)
{
	var rcat=/cat=([a-zA-Z_\/]+)/i;
	var rimg=/img=([0-9_]+\.jpg)/i;
	var rurl=/(.*?\?)/i;
	var vcat=rcat.exec(url);
	var vimg=rimg.exec(url);
	var vurl=rurl.exec(url);
	return vurl[1]+'cat='+vcat[1]+'&img='+vimg[1]+"&start="+num;
}
function cache_id(id) {
	var url=urls[id]
	var rcat=/cat=([a-zA-Z_\/]+)/i
	var rimg=/img=([0-9_]+)/i
	var rstart=/start=(\d+)/i
	var vcat=rcat.exec(url)
	var vimg=rimg.exec(url)
	var vstart=rstart.exec(url)
	vstart=(vstart)?parseInt(vstart[1]):0;
	return vcat[1]+':'+vimg[1]+':'+vstart;
}
/*
num - индекс требуемого сообщения, на которое осуществляется переход
cur - индекс текущего сообщения
*/
function mgoto(num,cur,id)
{
    if (num>0) urls[getid2(id)]=construct_url(urls[getid2(id)],num); 
    else urls[getid2(id)]=initurls[getid2(id)];
	move_obj=false;
	showtopic(id,getid2(id),true);
	return false;
}

function getElementByName(obj,type,name)
{
	var elems=obj.getElementsByTagName(type)
	var i=0
	for (var j=0;j<elems.length;j++) 
	 if (elems[j].name==name) return elems[j]
	return false;
}

function getid(obj)  {return obj.id.substring(3)}
function getid2(str) {return str.substring(3)}
function outq(obj)   {mout(obj.id)}
function overr(e)    {overdiv[getid(this)]=true}
function outr(e)     {if (!e) var e = window.event; if (checkIt('safari') || checkML(this,e)) mout(getid(this))}
function mout(id)    {overdiv[id]=false;setTimeout("resclear('"+id+"')",timeoutOff)}
function showt(obj,urlid,cache)
{overdiv[obj.id]=true;setTimeout("showtopic('"+obj.id+"','"+urlid+"',"+cache+")",timeoutOn)}
function checkIt(string)
{var detect=navigator.userAgent.toLowerCase();
 return detect.indexOf(string) + 1;}


function showtopic(id,urlid,cache)
{
if (!overdiv[id]) return
overdiv[id]=false
var obj=getById(id),exists=true,subobj=getById('res'+id)
var query=/.*?\?(.*)/i
var vquery=query.exec(urls[getid2(id)])
var request="ajax_engine.php?"+vquery[1];
var cachedata=(dcache[cache_id(getid2(id))])?dcache[cache_id(getid2(id))]:''
if (!subobj) 
  {
  subobj=document.createElement("div")
  subobj.id='res'+id
  subobj.onmouseover=overr
  subobj.onmouseout=outr
  subobj.className='content'
  subobj.innerHTML=ltxt
  document.body.appendChild(subobj)
  exists=false
  var  dx=getposOffset(obj,"left")
  dx=(dx+div_width<get_ww())?dx:get_ww()-div_width-30
  subobj.style.left=dx+"px"
  subobj.style.top=getposOffset(obj,"top")+15+"px"
  subobj.style.visibility='visible'
  }
if (!cache || cachedata=='') {exists=false;subobj.innerHTML=ltxt}
request+=(cache)?"":"&"+Math.random() 
if (!exists)
     {
     var l=ajax_reqs.length
     ajax_reqs[l]=new ajax(request)
     ajax_reqs[l].selfdestroy=true
     ajax_reqs[l].request(id)
     }  
  else 
     show_div(id,cachedata) 
}
// hide divs
function resclear(id)
{
 if (!overdiv[id])
  {
   move_obj=true
   var obj=getById('res'+id)
   hideit(obj);
  }                                   
}
function hideit(obj,type) {if (obj){if (type) obj.style.display='none'; else obj.style.visibility='hidden'}}
function containsDOM (container, containee)
{ var isParent = false
try {do {if ((isParent = container == containee)) break; containee = containee.parentNode;} while (containee != null)}
catch(e){}; return isParent} 
function checkME (element, evt)
{ if (element.contains && evt.fromElement) { return !element.contains(evt.fromElement); } else if (evt.relatedTarget) { return !containsDOM(element, evt.relatedTarget); } } 
function checkML (element, evt)
{ if (element.contains && evt.toElement) { return !element.contains(evt.toElement); } else if (evt.relatedTarget) { return !containsDOM(element, evt.relatedTarget); } }
function get_ww()
{
var frameWidth=800;
if (self.innerWidth)
	frameWidth = self.innerWidth;
else if (document.documentElement && document.documentElement.clientWidth)
	frameWidth = document.documentElement.clientWidth;
else if (document.body)
	frameWidth = document.body.clientWidth;
return frameWidth;
}
function get_wh()
{var frameHeight=640;
if (self.innerHeight)
	frameHeight = self.innerHeight;
else if (document.documentElement && document.documentElement.clientHeight)
	frameHeight = document.documentElement.clientHeight;
else if (document.body)
	frameHeight = document.body.clientHeight;
return frameHeight;
}
function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement &&
      ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

//attach ajax to links and images
function attachL() 
{
	if (!document.getElementById) return;
	var url,cache=true,elems=new Array()
	elems=getElementbyClass('pusto');
	var myregURL=/<a.*?href=\"(http:\/\/.*?\/)?(.*?)\".*?>(.*?)<\/a>/i;
	var count=0;

	for (i=0;i<elems.length;i++) 
	 { 
	  elems[i].innerHTML=elems[i].innerHTML.replace(/\r?\n/mg,'')
	  	url=myregURL.exec(elems[i].innerHTML);
	  	if (url!=null)
	  	if (url[2]!='' && url[2]!='undefined') {
	  		urls[count++]=url[2];
	  	}
	 }
	for (i=0;i<urls.length;i++) {
		initurls[i]=urls[i]=urls[i].replace(/&amp;/i,'&');
	}
}

attachL();