function slider(elemId, sliderWidth, range1, range2, step) {
    var knobWidth = 7;				// ширина и высота бегунка
    var knobHeight = 11;			// изменяются в зависимости от используемых изображений
    var sliderHeight = 11;			// высота slider'а
    
    var offsX,tmp;					// вспомагательные переменные
    var d = document;
    var isIE = d.all || window.opera;	// определяем модель DOM
    var point = (sliderWidth-knobWidth-3)/(range2-range1);
    // point - количество пикселей на единицу значения
    
    var slider = d.createElement('DIV'); // создаем slider
    slider.id = elemId + '_slider';
    slider.className = 'slider';
    d.getElementById(elemId).appendChild(slider);
    
    var knob = d.createElement('DIV');	// создаем ползунок
    knob.id = elemId + '_knob';
    knob.className = 'knob';
    slider.appendChild(knob); // добавляем его в документ
    
    knob.style.left = 0;			// бегунок в нулевое значение
    knob.style.width = knobWidth+'px';
    knob.style.height = knobHeight+'px';
    slider.style.width = sliderWidth+'px';
    slider.style.height = sliderHeight+'px';
    
    var sliderOffset = slider.offsetLeft;			// sliderOffset - абсолютное смещение slider'а
    tmp = slider.offsetParent;		// от левого края в пикселях (в IE не работает)
    while(tmp.tagName != 'BODY') {
	sliderOffset += tmp.offsetLeft;		// тут его и находим
	tmp = tmp.offsetParent;
    }
    
    if(isIE)						// в зависимости от модели DOM
    {								// назначаем слушателей событий
	knob.onmousedown = startCoord;
	slider.onclick = sliderClick;
	knob.onmouseup = endCoord;
	slider.onmouseup = endCoord;
    }
    else {
	knob.addEventListener("mousedown", startCoord, true);
	slider.addEventListener("click", sliderClick, true);
	knob.addEventListener("mouseup", endCoord, true);
	slider.addEventListener("mouseup", endCoord, true);
    }


// далее подробно не описываю, кто захочет - разберется
//////////////////// функции установки/получения значения //////////////////////////

    function setValue(x)	// установка по пикселям
    {

	if(x < 0)
	{
	    shrift_pos(0);
	    knob.style.left = 0; 
	}
	else if(x > sliderWidth-knobWidth-3)
	{
	    knob.style.left = (sliderWidth-3-knobWidth)+'px';
	    shrift_pos(range2);
	}
	else {
	    if(step == 0)
	    {
		knob.style.left = x+'px';

	    }
	    else
	    {
		shrift_pos(Math.round(x/(step*point)));
		knob.style.left = Math.round(x/(step*point))*step*point+'px';

	    }
	}
	d.getElementById('info').value = getValue();	// это вывод значения для примера
    }
    function setValue2(x)	// установка по значению
    {
	
	if(x < range1 || x > range2) alert('Value is not included into a slider range!');
	else setValue((x-range1)*point);
	
	d.getElementById('info').value = getValue();
    }

    function getValue() 
    {return Math.round(parseInt(knob.style.left)/point)+range1;}

//////////////////////////////// слушатели событий ////////////////////////////////////

    function sliderClick(e) {
	var x;
	if(isIE) {
	    if(event.srcElement != slider) return; //IE onclick bug
	    x = event.offsetX - Math.round(knobWidth/2);
	}
	else x = e.pageX-sliderOffset-knobWidth/2;
	setValue(x);
    }

    function startCoord(e) {
	if(isIE) {
	    offsX = event.clientX - parseInt(knob.style.left);
	    slider.onmousemove = mov;
	}
	else {
	    slider.addEventListener("mousemove", mov, true);
	}
    }
    
    function mov(e) {
	var x;
	if(isIE) x = event.clientX-offsX;
	else x = e.pageX-sliderOffset-knobWidth/2;

	setValue(x);
    }

    function endCoord()	{
	if(isIE) slider.onmousemove = null;
	else slider.removeEventListener("mousemove", mov, true);
    }

    // объявляем функции setValue2 и getValue как методы класса
    this.setValue = setValue2;
    this.getValue = getValue;
} // конец класса

// var mysl1 = new slider('sl', 300, 0, 200, 20);

function sleep(ms)
{
	var dt = new Date();
	dt.setTime(dt.getTime() + ms);
	while (new Date().getTime() < dt.getTime());
}


var node_pos = 0;
var slider_pos = 0;
function move_left(nodeId, step, slider_step, max_step)
{
    var node = document.getElementById(nodeId);
    if (node && node_pos != 0)
    {

	if(slider_pos<=max_step)
	{
	    if(slider_pos<=max_step)
	    {
		slider_pos = slider_pos - slider_step;
	    }
	    node_pos = node_pos+step;
	    node.style.left = node_pos+"px";
	    mysl2.setValue(slider_pos);
	}
    }

}

function move_right(nodeId, step, slider_step, max_step)
{
    var node = document.getElementById(nodeId);
    if (node)
    {
	if(slider_pos<max_step)
	{
	    if(slider_pos<max_step)
	    {
		slider_pos = slider_pos + slider_step;
	    }
	    node_pos = node_pos-step;
	    node.style.left = node_pos+"px";
	    mysl2.setValue(slider_pos);
	}
    }
}

function shrift_pos(pos)
{
    var node = document.getElementById("gallery_block");
    if (node)
    {
//	alert(pos);
	if(pos==0)
	    node_pos = 0;
	else
	    node_pos = 193*pos;
	node.style.left = "-"+node_pos+"px";
    }

}


// -------------------------

var xmlHttp=createXmlHttpRequestObject();
var url = "";
var dose = 2;
var ajaxEnable = 1;
var ajaxExecute = 1;
var number_of_images = 0;
var object_step_in_px = 0;
var visible_images = 0;
var left_images = 0;
var left_images_pos = 0;
var tagg = false;

function createXmlHttpRequestObject()
{
 var xmlHttp;
 try
 {
	xmlHttp=new XMLHttpRequest();
 }
 catch(e)
 {	var XmlHttpVersion=new Array("MSXML2.XMLHTTP.6.0",
 							 "MSXML2.XMLHTTP.5.0",
 							 "MSXML2.XMLHTTP.46.0",
 							 "MSXML2.XMLHTTP.3.0",
 							 "MSXML2.XMLHTTP",
 							 "Microsoft.XMLHTTP");
 	for(var i=0;i<XmlHttpVersion.length && !xmlHttp;i++)
 	{
		try
 		{
			xmlHttp=new ActiveXObject(XmlHttpVersion[i]);
 		}
 		catch(e)
		{
		}
 	}
 }
 if(!xmlHttp) alert("Ошибка создания объекта XMLHttpRequest.");
 else return xmlHttp;
}

function process(url, object_step, vis_img, tag)
{
    if(tag)
	tagg = tag;

    if(vis_img)
	visible_images = vis_img;
    if(object_step)
	object_step_in_px = object_step;
    if(ajaxEnable && ajaxExecute)
    {
	ajaxExecute = 0;
	url = process_dose(url);
	if(xmlHttp)
	{
	    try
	    {
		xmlHttp.open("GET",url,true);
		xmlHttp.onreadystatechange=handleRequestStateChange;
		xmlHttp.send(null);
//		    alert(number_of_images);
	    }
	    catch(e)
	    {
		alert("Невозможно соединиться с сервером:\n"+e.toString());
	    }
	}
    }
    else if((visible_images+left_images) != number_of_images)
    {
	    var w=document.getElementById("image_slider");
	    w.style.left = (parseInt(left_images_pos)-parseInt(object_step_in_px))+'px';
	    left_images_pos = parseInt(left_images_pos)-parseInt(object_step_in_px);
	    left_images++;
	    if(left_images == (number_of_images-1-visible_images) && ajaxEnable)
	    {
		ajaxExecute = 1;
		process(url);
	    }
    }

	    process_kr();

    if(left_images_pos != 0)
    {
	var kl_pass=document.getElementById("kl_pass");
	    kl_pass.style.visibility = "hidden";
	    kl_pass.style.position = "absolute";
	var kl_act=document.getElementById("kl_act");
	    kl_act.style.visibility = "visible";
	    kl_act.style.position = "relative";
    }
}

function process_left(url, object_step, vis_img)
{
    if(left_images_pos != 0)
    {

	    var w=document.getElementById("image_slider");
	    w.style.left = (parseInt(left_images_pos)+parseInt(object_step_in_px))+'px';
	    left_images_pos = parseInt(left_images_pos)+parseInt(object_step_in_px);
	    left_images--;
    }

    if((visible_images+left_images) != number_of_images)
    {
	var kr_pass=document.getElementById("kr_pass");
	    kr_pass.style.visibility = "hidden";
	    kr_pass.style.position = "absolute";
	var kr_act=document.getElementById("kr_act");
	    kr_act.style.visibility = "visible";
	    kr_act.style.position = "relative";
    }


    if(left_images_pos == 0)
    {
	var kl_pass=document.getElementById("kl_pass");
	    kl_pass.style.visibility = "visible";
	    kl_pass.style.position = "relative";
	var kl_act=document.getElementById("kl_act");
	    kl_act.style.visibility = "hidden";
	    kl_act.style.position = "absolute";
    }
}

function process_kr()
{
    if((visible_images+left_images) < number_of_images)
    {
	var kr_pass=document.getElementById("kr_pass");
	    kr_pass.style.visibility = "hidden";
	    kr_pass.style.position = "absolute";
	var kr_act=document.getElementById("kr_act");
	    kr_act.style.visibility = "visible";
	    kr_act.style.position = "relative";
    }
    else if((visible_images+left_images) >= number_of_images)
    {
	var kr_pass=document.getElementById("kr_pass");
	    kr_pass.style.visibility = "visible";
	    kr_pass.style.position = "relative";
	var kr_act=document.getElementById("kr_act");
	    kr_act.style.visibility = "hidden";
	    kr_act.style.position = "absolute";
    }
}
function process_dose(url)
{

     if(dose == 2)
    {
	url += "sc-1";
	dose++;
	if(tagg)
	{
	    url += "-t-"+tagg;
	}
    }
    else
    {
	url += "sc-"+dose;
	dose++;
	if(tagg)
	{
	    url += "-t-"+tagg;
	}
    }


    return url;
}

function handleRequestStateChange()
{
 if(xmlHttp.readyState==4)
 { 	if(xmlHttp.status==200)
 	{ 	try
 		{
			handleServerResponse();
 		}
 		catch(e)
 		{
			alert("Ошибка чтения ответа: "+e.toString());
 		}
 	}
    else
    {
  	alert("Возникли проблемы во время получения данных:\n"+xmlHttp.statusText);
    }
  }
}

function handleServerResponse()
{
    var nameArray = new Array();
    var serv_response = xmlHttp.responseXML.documentElement;
    if(serv_response.childNodes.length)
    {
	lastArray = xmlToArray(serv_response.getElementsByTagName("last"));
	if(lastArray[0] == 0)
	    ajaxEnable = 1;
	else
	    ajaxEnable = 0;

	numObjectsArray = xmlToArray(serv_response.getElementsByTagName("num_objects"));
	number_of_images = parseInt(number_of_images)+parseInt(numObjectsArray[0]);
	process_kr();
	if(numObjectsArray[0] == 0)
	    ajaxEnable = 0;

	htmlArray = xmlToArray(serv_response.getElementsByTagName("html"));
    }

    var w=document.getElementById("image_slider");
    w.style.width = (parseInt(number_of_images)*parseInt(object_step_in_px))+'px';

    var k=document.getElementById("image_slider");
    k.innerHTML+=htmlArray[0]+"\n";
}

function xmlToArray(resultsXml)
{
  var resultsArray = new Array();  
  for(i=0;i<resultsXml.length;i++)
    resultsArray[i]=resultsXml.item(i).firstChild.data;
  return resultsArray;
}

