function addHandler(object, event, handler, useCapture)
  {
  if(object.addEventListener)
    {
    object.addEventListener(event, handler, useCapture ? useCapture : false);
    }
  else if(object.attachEvent)
    {
    object.attachEvent('on' + event, handler);
    }
  else alert("Add handler is not supported");
  }

function removeHandler(object, event, handler)
  {
  if(object.removeEventListener)
    {
    object.removeEventListener(event, handler, false);
    }
  else if(object.detachEvent)
    {
    object.detachEvent('on' + event, handler);
    }
  else alert("Remove handler is not supported");
  }



function put_ajax_data(url, divid, object)
  {
  var callback = function(textdata)
    {
    var div = document.getElementById(divid);
    
    if(div == undefined)
      {
      if(object == undefined)
        {
        object = document.body;
        }

      var dinadiv = document.createElement("div");
      dinadiv.setAttribute("id", divid);
      object.appendChild(dinadiv);
      div = document.getElementById(divid);
      }
    
    //if( ! div.className.match(/ajax_loaded/) )
    //  {
    //  div.className += " ajax_loaded";
    //  }

    div.innerHTML = textdata;
    }
  
  get_ajax_data(url, callback, 10000);
  
  return false;
  }

function get_ajax_data(url, callback, waittime)
  {
  if(waittime == undefined)
    {
    waittime = 10000;
    }

  var xmlhttp = getXmlHttp();

  var timeout = setTimeout( function(){ xmlhttp.abort(); handleError("Сервер не отвечает"); }, waittime);

  xmlhttp.open("GET", url, true);
  xmlhttp.onreadystatechange = function()
    {
    if(xmlhttp.readyState != 4) return;
    
    clearTimeout(timeout) // очистить таймаут при наступлении readyState 4

    if(xmlhttp.status == 200)
      {
      callback(xmlhttp.responseText); //xmlhttp.responseText, xmlhttp.responseXML
      }
    else
      {
      handleError(xmlhttp.statusText) // вызвать обработчик ошибки с текстом ответа
      }
    }

  xmlhttp.setRequestHeader("User-Agent", "AJAX");
  xmlhttp.send(null);
  }

function getXmlHttp()
  {
  var xmlhttp = false;
  
  try
    {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
  catch (e)
    {
    try
      {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
    catch (E)
      {
      xmlhttp = false;
      }
    }
  
  if(!xmlhttp && typeof XMLHttpRequest != 'undefined')
    {
    xmlhttp = new XMLHttpRequest();
    }
  
  return xmlhttp;
  }

function handleError(message)
  {
  // обработчик ошибки
  alert("Ошибка: " + message)
  }

function confirm_delete()
  {
  return confirm("Вы подтверждаете удаление?\nОперацию нельзя будет отменить!");
  }







/*  slideshow  */

function slideshow(parentid, timeout) {
  
  this.timeout = 2000;
  this.loadagainafter = 500;
  
  this.fadestat = 0;
  this.fademax = 20;
  this.fadetime = 50;
    
  this.currentpic = 0;

}

slideshow.prototype.run = function() {
  
  if(this.parentid == undefined) return false;
  
  this.parentobj = document.getElementById(this.parentid);
  
  if( ! this.parentobj ) return false;

 
  if( this.pics == undefined || this.pics.length < 2 ) return false;
  
  this.change();
  
  return true;

};



// сменить картинку
slideshow.prototype.change = function() {
  
  this.currentpic++;
  
  if( this.currentpic >= this.pics.length ) this.currentpic = 0;

  this.addpic( this.pics[ this.currentpic ] ); // добавляем следующую картинку
  
  this.get_image_list(); // заполняем список текущих картинок
  
  this.opacity(this.piclist[1], 0);

  var self = this;
  setTimeout(function() { self.fade() }, this.timeout);
};



// перейти плавно от одной картинки к другой
slideshow.prototype.fade = function() {
  
  var self = this;

  //if( this.piclist[0].complete != undefined && this.piclist[0].complete == false ) {
  //  setTimeout(function() { self.fade() }, this.loadagainafter);
  //  return false;
  //}

  this.fadestat++;

  var copacity = this.fadestat / this.fademax;
  copacity = Math.round(copacity * 100) / 100;

  this.opacity( this.piclist[0], 1 - copacity );
  this.opacity( this.piclist[1], copacity );
  
  if(this.fadestat < this.fademax) {
    setTimeout(function() { self.fade() }, this.fadetime);
  }
  else {
    this.fadestat = 0;
    this.removepic();
    this.change();
  }

};


// добавить нижележащую картинку, пусть пока загружается
slideshow.prototype.addpic = function(src) {

  var newpic = document.createElement("img");
  //newpic.setAttribute("id", this.lastid);
  newpic.setAttribute("src", src);
  //this.opacity(newpic, 0);
  this.parentobj.appendChild(newpic);

};

// удалить вышележащую картинку
slideshow.prototype.removepic = function() {

  //this.get_image_list();
  //var img = this.parentobj.getElementByTagName("img");
  //var child = document.getElementById(this.lastid);
  this.parentobj.removeChild( this.piclist[0] );

};


slideshow.prototype.get_image_list = function() {

  var children = this.parentobj.childNodes;
  var c = 0;
  this.piclist = new Array();

  for(var i = 0; i < children.length; i++) {
        
    if( children[i].tagName == "IMG" ) {
      this.piclist[c] = children[i];
      c++;
    }
  }

}

slideshow.prototype.opacity = function(obj, level) {

  if( obj.filters ) {
    var oAlpha = obj.filters["DXImageTransform.Microsoft.alpha"] || obj.filters.alpha;
    if (oAlpha) oAlpha.opacity = level * 100;
    else obj.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity=" + (level * 100) + ")"; 
  }
  else obj.style.opacity = level;

};

