/***********************************************************************************/
/*
Создание XMLHttpRequest-объекта
Возвращает созданный объект или null,
если XMLHttpRequest не поддерживается
*/
function createRequestObject() {
    var request = null;
    try {
        request=new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e){}
    if(!request) try {
        request=new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e){}
    if(!request) try {
        request=new XMLHttpRequest();
    } catch (e){}
    return request;
}

/*
Кодирование данных (простого ассоциативного массива вида
{ name : value, ...} в URL-escaped строку (кодировка UTF-8)
*/
function urlEncodeData(data) {
    var query = [];
    if (data instanceof Object) {
        for (var k in data) {
            query.push(encodeURIComponent(k) + "=" +
            		encodeURIComponent(data[k]));
        }
        return query.join('&');
    } else {
        return encodeURIComponent(data);
    }
}

/*
Выполнение POST-запроса 
url  - адрес запроса
data - параметры в виде простого ассоциативного массива
	{ name : value, ...} 
callback - (не обяз.) callback-функция,
	которая будет вызвана после выполнения запроса
	и получения ответа от сервера
*/
function serverRequest(url, data, callback) {
    var request = createRequestObject();
    if(!request) return false;
    request.onreadystatechange  = function() { 
            if(request.readyState == 4 && callback) callback(request);
        };
    request.open('POST', url, true);
    if (request.setRequestHeader)
        request.setRequestHeader("Content-Type",
        	"application/x-www-form-urlencoded");
    request.send(urlEncodeData(data));
    return true;
}
/***********************************************************************************/
function openMenu(node){
	var subMenu = node.parentNode.getElementsByTagName("ul")[0];
	subMenu.style.display == "none" ? subMenu.style.display = "block" : subMenu.style.display = "none";
}

function allClose(){
	var list = document.getElementById("leftmenu").getElementsByTagName("ul");
	for(var i=0;i<list.length;i++){
		list[i].style.display = "none";
	}
}

 function selectImg(obj) {
	document.getElementById('main_image').src="images/medium/"+obj;
 }

 function syncList()
 {
 }
  
 //Метод sync() - принимает список из значений атрибутов id элементов SELECT, образующих связанный список и запускает их синхронизацию
 syncList.prototype.sync = function()
 {
     //Перебираем аргументы (id элементов SELECT) и назначаем событиям onChange селектов, с соответствующими id, функцию-обработчик. 
     //В качестве обработчика выступает второй метод объекта syncList - _sync (напрямую его вызывать не нужно) 
     //Обработчик назначается всем элементам SELECT кроме последнего в списке аргументов, т.к. последний не влияет ни на какой другой элемент SELECT и с ним не нужно синхронизироваться.
     for (var i=0; i < arguments.length-1; i++)    document.getElementById(arguments[i]).onchange = (function (o,id1,id2){return function(){o._sync(id1,id2);};})(this, arguments[i], arguments[i+1]);
     document.getElementById(arguments[0]).onchange();//запускаем обработчик onchange первого селекта, чтобы при загрузке страницы заполнить дочерние селекты значениями.
 }
 //служебный метод _sync - срабатывает при смене выбранного элемента в текущем (старшем) элементе SELECT (по его событию onChange) и изменяет содержимое зависимого селекта на основании значения выбранного в старшем селекте.
 syncList.prototype._sync = function (firstSelectId, secondSelectId)
 {
     var firstSelect = document.getElementById(firstSelectId);
     var secondSelect = document.getElementById(secondSelectId);
  
     secondSelect.length = 0; //обнуляем второй (подчиненный) SELECT
     
     if (firstSelect.length>0)//если первый (старший) SELECT не пуст
     {
         //из свойства dataList, с данными для заполнения подчиненных селектов, берем ту часть данных, которая соответствует именно значению элемента, 
         //выбранного в первом селекте, и определяет содержимое подчиненного элемента SELECT.
         var optionValue = firstSelect.options[ firstSelect.selectedIndex==-1 ? 0 : firstSelect.selectedIndex].value; var optionData = this.dataList[optionValue]; if (!optionData) optionData = this.dataList[parseInt(optionValue)];
         //заполняем второй (подчиненный) селект значениями (создаем элементы option)
         for (var key in optionData || null) secondSelect.options[secondSelect.length] = new Option(optionData[key], key);
         
         //если в старшем SELECT-е нет выделенного пункта, выделяем первый
         if (firstSelect.selectedIndex == -1) setTimeout( function(){ firstSelect.options[0].selected = true;}, 1 );
         //если во втором списке нет выделенного пункта, выделяем первый его пункт
         if (secondSelect.length>0) setTimeout( function(){ secondSelect.options[0].selected = true;}, 1 );
     }
     //если второй (подчиненный) селект имеет в свою очередь свои подчиненные селекты (те, для которых он главный), 
     //то запускаем его обработчик onchange, чтобы изменить его подчиненные селекты
     secondSelect.onchange && secondSelect.onchange();
 };
 
