/* Объявление общих классов*/
/*  Класс наблюдатель.
	Являясь прототипом объекта, позволяет ему назначать себе наблюдателей и
	оповещать их о происходящих событиях */
function ClassObservable() {
	// НЕЛЬЗЯ ДОБАВЛЯТЬ this.observers = [] В ПРОТОТИП!!! Иначе наблюдателем будут не объекты, а прототип
	// Метод, добавляющий наблюдателя
	this.addObserver = function ($event_type, $observer, $method){
		if (!this.observers) this.observers = [];                    // Если у объекта ещё нет списка событий - создать его
		$event_type = $event_type.toLowerCase();                     // Все события должны быть написаны в нижнем регистре для унификации
		if (!this.observers[$event_type]) this.observers[$event_type] = []; // Если нет массива для данного типа событий, то необходимо его создать
		$length = this.observers[$event_type].length;                       // Вычисляем длину массива
		this.observers[$event_type][$length] = [];
		this.observers[$event_type][$length].observer = $observer;                   // Добавляем наблюдатель в конец массива
		if ($method) this.observers[$event_type][$length].method = $method;          // Добавляем наблюдатель в конец массива
	}
	this.detachObserver = function ($event, $observer) {

		var $observers, $i, $length;
		for ($i = 0, $observers = this.observers[$event], $lenght = $observers.length; $i < $lenght; $i++) {
	    	if  ($observer == $observers[$i].observer) $observers.splice($i, 1);
	    }
	}
	// Метод проверяет, являетсля ли уже объект наблюдателем данного события у данного объекта
	this.exist = function ($event, $observer) {
		var $observers, $i, $length;
		for ($i = 0, $observers = this.observers[$event], $lenght = $observers.length; $i < $lenght; $i++) {
	    	if  ($observer == $observers[$i]) return $i;
	    }
	    return false;
	}
	// Оповещает наблюдателей о происходящих событиях
	this.notify = function ($event) {                 // $event - тип события
		var $arguments, $observers, $observer, $i, $length;
		$arguments = arguments;                       // Получаем массив аргументов, с которыми был вызван метод notify
		$event = $event.toLowerCase();                // Для унификации переводим название события в нижний регистр
		if (!this.observers) return false;            // Если нет массива обработчиков,
		if (!this.observers[$event]) return false;    //  или нет массива для обработчиков данного типа - вернуть ложь
		for ($i = 0, $observers = this.observers[$event], $length = $observers.length; $i < $length; $i++) {
			$observer = $observers[$i];
        	if ($observer.observer instanceof Function) $observer.observer($event, $arguments);
			else if ($observer.observer[$observer.method] instanceof Function) $observer.observer[$observer.method]($event, $arguments);
			else if ($observer.observer.update instanceof Function) $observer.observer.update($event, $arguments);
		}
	}
}

/*  Класс, представляющий из себя набор для работы элемента с DOM */
function ClassDomObject() {
	// Возворащает вертикальную координату объекта, относительно верхней границы страницы
	this.getTopOffset = function ($object){
		var $offset = 0;
		this.topOffset = 0;
		this.leftOffset = 0;
		while ($object) {
			$offset += $object.offsetTop;
			this.topOffset += $object.offsetTop;
			this.leftOffset += $object.offsetLeft;
			$object = $object.offsetParent;
		}
		return $offset;
	}
	// Возворащает горизонтальную координату объекта, относительно левой границы страницы
	this.getLeftOffset = function ($object){
		var $offset = 0;
		this.topOffset = 0;
		this.leftOffset = 0;
		while ($object) {			$offset += $object.offsetLeft;
			this.topOffset += $object.offsetTop;
			this.leftOffset += $object.offsetLeft;
			$object = $object.offsetParent;
		}
		return $offset;
	}
	this.placeInto = function ($place, $this_body_object) {
   		var $body = $this_body_object||this.body;
   		this.body = $place.appendChild($body);
		this.notify('onElementPlacedInDom');
	}
	this.placeBefore = function ($place, $this_body_object) {
   		var $body = $this_body_object||this.body;
		var $parent = $place.parentNode;
   		this.body = $parent.insertBefore($body, $place);
		this.notify('onElementPlacedInDom');
	}
	this.placeAfter = function ($place, $this_body_object) {
   		var $body = $this_body_object||this.body;
		var $parent = $place.parentNode;
    	if ($next = $place.nextSibling) {
    		this.body = $parent.insertBefore($body, $next);
    	} else {
    		this.body = $parent.appendChild($body);
    	}
		this.notify('onElementPlacedInDom');
	}
}
ClassDomObject.prototype = new ClassObservable();

// Treeton Style Studio Global Document Administrator
// Глобальный объект для управления документом
function ClassDocumentAdministrator () {
    var $tdtime = new Date();
    var oThis = this;
    this.time = $tdtime.getTime();
    this.id = 'TSSGDA';
    this.init = function() {
	    this.body = document.getElementsByTagName('body')[0];
    	this.body.object = this;
    	this.body.onmouseup = function () {this.object.relaseMouse();}
    	this.body.onclick = function () {this.object.click();}
	    document.onkeypress = function (event)
	    {
	    	if (!event) event = window.event;
	    	var key = event.keyCode ? event.keyCode : event.which ? event.which : null;
			var controll_keys = '';
			if (event.shiftKey) controll_keys += 'S';
			if (event.altKey) controll_keys += 'A';
			if (event.ctrlKey) controll_keys += 'C';
			oThis.notify('onkeypress', key, controll_keys);
		}
    }
    this.click = function () {
    	this.notify('onClick');
    }
    this.relaseMouse = function () {
    	this.notify('onMouseUp');
    }
	// Размещает узел объекта $body внутри элемента с ID = $id
	this.placeIntoId = function ($body, $id) {
		var $node = document.getElementById($id);
   		$node.appendChild($body);
		this.notify('onElementPlacedInDom');
		this.notify('onAddedContent', $id);
	}
	// Размещает узел объекта $body до элемента с ID = $id
	this.placeBeforeId = function ($body, $id) {
		var $node = document.getElementById($id);
		var $parent = document.getElementById($id).parentNode;
   		$parent.insertBefore($body, $node);
		this.notify('onElementPlacedInDom');
	}
	// Размещает узел объекта $body после элемента с ID = $id
	this.placeAfterId = function ($body, $id) {
		var $node = document.getElementById($id);
		var $parent = document.getElementById($id).parentNode;
    	if ($next = $node.nextSibling) {
    		$parent.insertBefore($body, $next);
    	} else {
    		$parent.appendChild($body);
    	}
		this.notify('onElementPlacedInDom');
	}
}
ClassDocumentAdministrator.prototype = new ClassDomObject();
TSSGDA = new ClassDocumentAdministrator ();

RegisterEventHandler (window, 'load', init);

function init() {
/*	$ARTICLE = document.getElementById('article');
	if ($ARTICLE) selectTermins ();
	$SCHEME = document.getElementById('scheme');
	if ($SCHEME) initScheme();
	if (typeof(renderOrderForm) != "undefined") renderOrderForm();*/

	TSSGDA.init();
	TSSGDA.notify('onload');
	try {initScheme();}catch(err){}
    // Предзагрузка изображений
    var tmp_img = [];
    tmp_img[1] = new Image;
    tmp_img[1].src = '/mod/site/images/lnk-wave-move_01.gif';
    tmp_img[2] = new Image;
    tmp_img[2].src = '/mod/site/images/colored_bg.gif';
    tmp_img[3] = new Image;
    tmp_img[3].src = '/mod/site/images/refresh-hover.gif';
    tmp_img[4] = new Image;
    tmp_img[4].src = '/mod/site/images/refresh-move.gif';
    tmp_img[5] = new Image;
    tmp_img[5].src = '/mod/site/images/colored_bg.gif';
    tmp_img[6] = new Image;
    tmp_img[6].src = '/mod/site/images/bub_tail-1.png';
    tmp_img[7] = new Image;
    tmp_img[7].src = '/mod/site/images/bub_tail-2.png';
    tmp_img[8] = new Image;
    tmp_img[8].src = '/mod/site/images/bub_tail-3.png';

//    //console.log(tmp_img);

}

function changeEnding(sStr, sNewEnding) {
	//console.log(sStr, sNewEnding);
	return  sStr.replace( /-\w+($|\.\w{1,5}$)/, "-"+sNewEnding+"$1");
}

function getEnding(sStr) {
	var r = /-(\w+)($|\.\w{1,5}$)/;
	var arr = r.exec(sStr);
	return arr[1];
}


function echo ($message) {	var $mw = document.getElementById('messagi');
	if (!$mw) {		$mw = document.createElement('div');
		$mw = document.body.appendChild($mw);
		$mw.id = 'messagi';
	}
    $mw.innerHTML += $message + '<br/>';
}

function stopBubble(oEvent)
{
   	if (!oEvent) oEvent = window.event;
	if (oEvent.stopPropagation) oEvent.stopPropagation(); // для DOM-совместимых браузеров
	else window.event.cancelBubble = true; //для IE
}


function getNumEnding (int, type)
{
	var type = type||1;
	var end = new Array();
	end[1] = ['', 'а', 'ов'];
	end[2] = ['й', 'я', 'ев'];
	end[3] = ['у', 'ы', ''];

	if (int>=11 && int<=19) ending=end[type][2];
		else {
			i = int % 10;
			switch (i)
			{
		   case (1): ending = end[type][0]; break;
		   case (2):
		   case (3):
		   case (4): ending = end[type][1]; break;
		   default: ending = end[type][2];
			}
		}
return ending;
}

function getAjaxRequester()
{
	var requester;
	if (window.XMLHttpRequest)	requester = new window.XMLHttpRequest();
	else
	{
		if (window.ActiveXObject)
		{
	         requester = new ActiveXObject("Msxml2.XMLHTTP");
	         if (!requester)
	         {
		         requester = new ActiveXObject("Microsoft.XMLHTTP");
		         if (!requester) alert("Error occurred");
	         }
		}
		else alert("Error occurred");
    }
	return requester;
}


function setOpacity (obj,  opacity)
	{
	  obj.opacity =  opacity||obj.opacity;
	  var  opacity_property = getOpacity();
	  if (! opacity_property) return; // Если не существует элемент с указанным id или браузер не поддерживает ни один из известных функции способов управления прозрачностью

	  if ( opacity_property=='filter')  // Internet Explorer 5.5+
	  {
	     opacity *= 100;
	    // Если уже установлена прозрачность, то меняем её через коллекцию filters, иначе добавляем прозрачность через style.filter
	    var  alpha = obj.filters['DXImageTransform.Microsoft.alpha'] || obj.filters.alpha;
	    if ( alpha)  alpha.opacity =  opacity;
	    else obj.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+ opacity+")"; // Для того чтобы не затереть другие фильтры используем "+="
	  }
	  else // Другие браузеры
	   obj.style[ opacity_property] =  opacity;
}

function getOpacity ()
	{
	  if (typeof document.body.style.opacity == 'string') // CSS3 compliant (Moz 1.7+, Safari 1.2+, Opera 9, IE7)
	    return 'opacity';
	  else if (typeof document.body.style.MozOpacity == 'string') // Mozilla 1.6 и младше, Firefox 0.8
	    return 'MozOpacity';
	  else if (typeof document.body.style.KhtmlOpacity == 'string') // Konqueror 3.1, Safari 1.1
	    return 'KhtmlOpacity';
	  else if (document.body.filters && document.body.canHaveHTML) // Internet Explorer 5.5+
	    return 'filter';
	  return false; //нет прозрачности
	}

function fake (event)
{
	if (!event) event = window.event;
	event.preventDefault();
	return false;
}

function RegisterEventHandler (obj, eventName, handler)
{
	if (obj.attachEvent)
	obj.attachEvent ('on' + eventName, handler);
	else if (obj.addEventListener)
	obj.addEventListener (eventName, handler, true);
}

function getOffset (obj){
	var topOffset = 0;
	var leftOffset = 0;
	while (obj)
	{
		topOffset += obj.offsetTop;
		leftOffset += obj.offsetLeft;
		obj = obj.offsetParent;
	}
	return [leftOffset, topOffset];
}

function getDimensions(obj){
	var arr = {};
	arr['width'] = obj.offsetWidth;
	arr['height'] = obj.offsetHeight;
	var lr = getOffset(obj);
	arr['left'] = lr[0];
	arr['top'] = lr[1];
	return arr;
}

var carrier_gas_last_index='Ar';
function modif(index)
{
	var carrier_gas ={
		Ar:		"аргон"
		,He:	"гелий"
		,N:		"аргон или гелий"
		,O:		"аргон или гелий"
		,H:		"аргон или гелий"
	}
	$("#carrier_gas").text(carrier_gas[index]);
	if (carrier_gas_last_index!=index){
		$('#'+carrier_gas_last_index).css('display','none');	//	именно css, не hide()
		$("#"+index).css('display','block');
		carrier_gas_last_index=index;
	}
}

