// Прототип схемы
function ClassImgChange (sId, aPreload)
{
	if (aPreload && aPreload.length)
	{
		var images = [];
		for (var i in aPreload)
		{
			images[i] = new Image();
			images[i].src = aPreload[i];
		}
	}
	this.img = document.getElementById(sId);
	this.update = function (sEventType, aArguments) {
    	this.img.src = aArguments[1];
	    this.notify('onredraw', aArguments[1]);
	}
}
ClassImgChange.prototype = new ClassDomObject();

// Входы и выходы у схемы
function ClassSchemeIo (oDiv)
{
    this.div = oDiv;
	this.img = this.div.firstChild;
	this.update = function (sEventType, aArguments)
	{
    	if (getEnding(aArguments[1]) == 'real')
    	{
    		this.img.src = changeEnding(this.img.src, 'real')
    		this.div.className = changeEnding(this.div.className, 'real')
    	}
	    else
	    {
    		this.img.src = changeEnding(this.img.src, 'sch')
    		this.div.className = changeEnding(this.div.className, 'sch')
	    }
	}
}
ClassSchemeIo.prototype = new ClassDomObject();

// Прототип переключателя видов схем
function ClassRadioLinkGroup (sId, sProperty)
{
	var i, length;
    var oThis = this;
    this.hrefs = [];
    this.property = sProperty?sProperty:null;
	this.oLinkContainer = document.getElementById(sId);
	if (!this.oLinkContainer) return;
	this.current = undefined;

	this.changeHref = function (event)
	{
		if (!event)
		{
			event = window.event;
		    event.target = event.srcElement;
		}
	    oThis.current.className = '';
	    oThis.current = event.target;
	    event.target.className = 'current';
	    if (oThis.property && event.target[oThis.property]) oThis.notify('onselect', event.target[oThis.property]);
		else oThis.notify('onselect', event.target);
		document.cookie = "sch_view="+event.target.id+"; expires=Wed, 9 Mar 2300 00:00:00; path=/;";
		event.target.blur();
	}

	this.aLinks = this.oLinkContainer.getElementsByTagName("a");
	for (i = 0, length = this.aLinks.length; i < length; i++)
	{
		if (/current/.test(this.aLinks[i].className)) this.current = this.aLinks[i];
		this.hrefs[i] = this.aLinks[i].href;
		this.aLinks[i].onclick = function(event)
			{
			oThis.changeHref(event);
			return false;
			}
	}
}
ClassRadioLinkGroup.prototype = new ClassDomObject();

function initScheme()
{	var $conteiner = document.getElementById('scheme_table');

	SCHEME_CONTROL = new ClassRadioLinkGroup ("scheme_controller", 'href');
	SCHEME = new  ClassImgChange ("scheme", SCHEME_CONTROL.hrefs);
	SCHEME_CONTROL.addObserver('onselect', SCHEME, 'update');

	var $i, $length, $temp;
	var $divs = $conteiner.getElementsByTagName('div');

	for ($i = 0, $length = $divs.length; $i < $length; $i++)
	{
		if (/_io_/.test($divs[$i].className) && $divs[$i].firstChild.src)
		{
			$temp = new ClassSchemeIo($divs[$i]);
			SCHEME.addObserver('onredraw', $temp, 'update');
		}
	}

    try
    {    	var sch_type_id = document.cookie.match(/sch_view=(.+?);/)[1];
    }
    catch (er){sch_type_id = false};
    if (sch_type_id)
    {    	try{	    	var obj_sch_view = new Object;
	    	obj_sch_view.target = document.getElementById(sch_type_id);
			SCHEME_CONTROL.changeHref(obj_sch_view);
		} catch (err) {}
    }
    else
    {
    	try{
	    	var sch_type_id = 'sch_to-real';	    	var obj_sch_view = new Object;
	    	obj_sch_view.target = document.getElementById(sch_type_id);
			SCHEME_CONTROL.changeHref(obj_sch_view);
		} catch (err) {}
    }

}

// Обновление схемы через AJAX
function getAjaxScheme()
{	var SITE_URL = document.getElementById('SITE_URL').innerHTML;
	var button = document.getElementById('refresh');
	var parent = button.parentNode;
	var span = document.createElement('span');
	span.className = 'refresh_move';
	parent.replaceChild(span, button);
/*	button.className = 'refresh_move';
	button.href = '';
*/	span.id = "refresh";
	window.httpRequester = getAjaxRequester();
	window.httpRequester.open("GET", SITE_URL + 'ajax_request/?interface=solutions&action=getSolution&module=regular&template=ajax_scheme.tpl', true)
    window.httpRequester.onreadystatechange = refreshAjaxScheme;
    httpRequester.send(null);
}

function refreshAjaxScheme()
{	if(httpRequester.readyState == 4)
	{		eval(httpRequester.responseText);  // Получение ассоциативного массива ajax_data с данными о новой схеме
		var tmp_image = new Image();
		tmp_image.onload = startChangeScheme; // Когда изображение новой схемы загружено - начинается смена схемы
		tmp_image.src = document.getElementById('FILE_URL').innerHTML + ajax_data.real;
	}
}

function startChangeScheme()
{
    {
/*	var previous =  // Получение геометрических характеристик текущей схемы, чтобы знать с какого размера изменять поле
		{
			tsk_h: document.getElementById('tsk').offsetHeight,
			tsk_w: document.getElementById('tsk').offsetWidth,
			sol_h: document.getElementById('sol').offsetHeight,
			sol_w: document.getElementById('sol').offsetWidth,
			scheme: document.getElementById('scheme_container').offsetHeight
		}
		previous.sum_h = Math.max(previous.tsk_h, previous.sol_h) + previous.scheme;
        CURRENT_HEIGHT = previous.sum_h + 30;

	var temp ={};
*/
        makeThemAbsolute();
        var new_tables = createNewTable (ajax_data);
        setOpacity(new_tables.tsk_sol, 0);
        setOpacity(new_tables.scheme_table, 0);

        SCHEME_MASTER.appendChild(new_tables.tsk_sol);
        SCHEME_MASTER.appendChild(new_tables.scheme_table);
        new_tables.scheme_table.style.top = new_tables.tsk_sol.offsetHeight + 'px';
        FUTURE_HEIGHT = new_tables.tsk_sol.offsetHeight + new_tables.scheme_table.offsetHeight + 30;

        FUTURE_HEIGHT = (FUTURE_HEIGHT>=530)?FUTURE_HEIGHT:530;
        //console.log('FUTURE_HEIGHT:' + FUTURE_HEIGHT);
        new_tables.tsk_sol.style.left = '10000px';
        new_tables.scheme_table.style.left = '10000px';

        setOpacity(new_tables.tsk_sol, 1);
        setOpacity(new_tables.scheme_table, 1);

		NEW_TSK_SOL = new_tables.tsk_sol;
        NEW_SCHEME_TABLE = new_tables.scheme_table;

		NEW_SHOWN = 0; // Флаг того, что новая схема уже показана или показывается

        DH = (FUTURE_HEIGHT - CURRENT_HEIGHT)/10;
        DH_A = Math.abs(FUTURE_HEIGHT - CURRENT_HEIGHT);
/*		//console.log(CURRENT_HEIGHT + ' -> ' + FUTURE_HEIGHT);
        //console.log(SCHEME_TABLE.offsetHeight + ' + ' + TSK_SOL.offsetHeight + ' = ' + (SCHEME_TABLE.offsetHeight + TSK_SOL.offsetHeight));
        //console.log(new_tables.tsk_sol.offsetHeight + ' + ' + new_tables.scheme_table.offsetHeight + ' = ' + (new_tables.tsk_sol.offsetHeight + new_tables.scheme_table.offsetHeight));*
       */
		TAIL_STATUS = 1; // Хвостик пузыря убирается в положения от 1 до 3
   		TAIL = document.getElementById('bub_tail'); // Собственно, сам хвостик
        TAIL_SHOWN = 1;

		// Элементы, которые требуется скрыть на время смены схемы
		HIDEOUT01 = document.getElementById('footer_hideout_01');
		HIDEOUT02 = document.getElementById('footer_hideout_02');
		HIDEOUT03 = document.getElementById('news_hideout');
		OPACITY = 1;

		if ((ajax_data.type == 1 && TAIL.className !== 'moist_tail png') || (ajax_data.type == 2 && TAIL.className !== 'composition_tail png'))
		{			window.tail_interval = setInterval(hideTail, 100);
        }

		changeBubbleSize();
//		fullupByMilk(previous.sum_h, future.sum_h);
		//document.getElementById('scheme_cache').innerHTML = ajax_data.scheme_cache;
//		document.getElementById('scheme_io_l').innerHTML = ajax_data.inputs_cache;
//		document.getElementById('scheme_io_r').innerHTML = ajax_data.outputs_cache;
	}
}

function createNewTable (ajax_data)
{	// Создается таблица tsk_sol
	var tsk_sol = document.createElement('table');
	tsk_sol.className = 'tsk_sol nosp';
	tsk_sol.id = 'tsk_sol';
	tsk_sol.style.width = TSK_SOL.offsetWidth + 'px';
	////console.log(tsk_sol.style.width);
	var tbody = document.createElement('tbody');
	tsk_sol.appendChild(tbody);
	var tr = document.createElement('tr');
	tbody.appendChild(tr);
	var td = document.createElement('td');      // Первая колонка с отступом
	td.className = 'inner_left_margin';
	tr.appendChild(td);
	td = document.createElement('td');          // Вторая колонка с задачей
	td.className = 'tsk';
	tr.appendChild(td);
	td.innerHTML = '<div id="tsk"><h3 class="notopspace">Задача</h3><span id="main_think">' + ajax_data.main_think; + '</span></div>';
	td = document.createElement('td');          // Третья колонка с решением
	td.className = 'sol';
	tr.appendChild(td);
	td.innerHTML = '<div id="sol"><h3 class="notopspace">Решение</h3><span id="idea">' + ajax_data.idea; + '</span></div>';


	// Создается таблица scheme_table
	var scheme_table = document.createElement('table');
	scheme_table.className = 'scheme nosp';
	scheme_table.id = 'scheme_table';
	tbody = document.createElement('tbody');
	scheme_table.appendChild(tbody);
	tr = document.createElement('tr');
	tbody.appendChild(tr);
	td = document.createElement('td');      // Первая колонка с входными элементами
	td.id = 'scheme_io_l';
	td.width="30%";
	td.innerHTML = ajax_data.inputs_cache;
	tr.appendChild(td);
	td = document.createElement('td');      // Вторая колонка с элементами схемы
	td.className = 'scheme_place';
    var div = document.createElement('div');
    div.id = 'scheme_container';
    div.className = 'nosp scheme_container';
    div.innerHTML = '<img id="scheme" src="/var/files/'+ajax_data.real+'"><div id="scheme_cache">'+ajax_data.scheme_cache+'</div>';
    td.appendChild(div);
	tr.appendChild(td);
	td = document.createElement('td');      // Третья колонка с выходными элементами
	td.id = 'scheme_io_r';
	td.width="30%";
	td.innerHTML = ajax_data.outputs_cache;
	tr.appendChild(td);

	tsk_sol.style.position = 'absolute'; // Задвигаем новую схему далеко-о-о-о
	tsk_sol.style.left = '100px';

	scheme_table.style.position = 'absolute';
	scheme_table.style.left = '100px';

	return {'tsk_sol': tsk_sol, 'scheme_table': scheme_table}; // Возвращаем массив таблиц
}


function makeThemAbsolute()
{	CURRENT_HEIGHT = document.getElementById('absolute_master').offsetHeight;//tsk_sol_height + scheme_table_height;
    //console.log('CURRENT_HEIGHT:' + CURRENT_HEIGHT);

	var scheme_table = document.getElementById('scheme_table');
	var tsk_sol = document.getElementById('tsk_sol');
	var scheme_master = document.getElementById('scheme_master');
	var absolute_master = document.getElementById('absolute_master');

	var tsk_sol_height = tsk_sol.offsetHeight;  						// Получение геометрических размеров таблиц;
    var scheme_table_height = scheme_table.offsetHeight;

	absolute_master.style.position = 'relative';                        // Чтобы пузырь ре скукоживался из-за абсолютности схемы, нужно поставить охватывающую распорку
	var new_w = Math.floor(absolute_master.offsetWidth);
	if ((/msie/i).test(navigator.userAgent))
	{
		new_w -= 2;
	}
	absolute_master.style.width = new_w + 'px';
	tsk_sol.style.width = tsk_sol.offsetWidth + 'px';                   // Тоже применимо к таблице с заголовком
	tsk_sol.style.position = 'absolute';
	tsk_sol.style.left = '20px';                                        // 20px для того, чтобы компенсировать особенности табличной верстки (связано с технологией получения границ пузыря)

	scheme_table.style.top = tsk_sol.offsetHeight + 'px';
	scheme_table.style.width = scheme_table.offsetWidth + 'px';
	scheme_table.style.height = scheme_table.offsetHeight + 'px';
	scheme_table.style.position = 'absolute';

	scheme_table.style.left = '20px';
	scheme_master.style.position = 'absolute';
	scheme_master.style.left = '-20px';
	scheme_master.style.overflow = 'hidden';
	scheme_master.style.width = scheme_table.offsetWidth + 40 + 'px';
	scheme_master.style.height = scheme_table.offsetHeight + 'px';

	////console.log('!!'+CURRENT_HEIGHT);
	TD_CONTENT = document.getElementById('absolute_master');                 // Глобальный объект пузыря, нужен для плавного изменения его размеров
	TD_CONTENT.style.height = CURRENT_HEIGHT + 'px';

	W = scheme_table.offsetWidth;                                       // Куча всяких глобальных переменных... некрасиво, но время поджимает
	TSK_SOL = tsk_sol;
	SCHEME_TABLE = scheme_table;

	SCHEME_MASTER = scheme_master;
	ABSOLUTE_MASTER = absolute_master;

	scheme_table.id += 'old';
	tsk_sol.id += 'old';
	document.getElementById('tsk').id += 'old';
	document.getElementById('main_think').id += 'old';
	document.getElementById('sol').id += 'old';
	document.getElementById('idea').id += 'old';
	document.getElementById('scheme_io_l').id += 'old';
	document.getElementById('scheme_container').id += 'old';
	document.getElementById('scheme').id += 'old';
	document.getElementById('scheme_cache').id += 'old';
	document.getElementById('scheme_io_r').id += 'old';

	// Теперь, когда мы запомнили таблицы в глобальных переменных и сделали их абсолютными, они больше не достойны носить собственные
	// id и их нужно удалить (они ещё потребуются для новой таблицы)


/*	var temp_html = SCHEME_MASTER.innerHTML;
	SCHEME_TABLE.id = "old_scheme_table";
	TSK_SOL.id = "old_tsk_sol";

		document.getElementById('main_think').id = 'old_main_think';
		document.getElementById('idea').id = 'old_idea';
		document.getElementById('scheme_cache').id = 'old_scheme_cache';
		document.getElementById('scheme_io_r').id = 'old_scheme_io_r';
		document.getElementById('scheme_io_l').id = 'old_scheme_io_l';
		document.getElementById('scheme').id = 'old_scheme';

	SCHEME_MASTER.innerHTML += temp_html;
	NEW_SCHEME_TABLE = document.getElementById('scheme_table');
	NEW_TSK_SOL = document.getElementById('tsk_sol');
	NEW_SCHEME_TABLE.style.top = tsk_sol.offsetHeight + 'px';
	NEW_SCHEME_TABLE.style.height = scheme_table.offsetHeight + 'px';
    NEW_SCHEME_TABLE.style.left = '100px';
    NEW_TSK_SOL.style.left = '100px';

        document.getElementById('ajax_parking').innerHTML = '';
		document.getElementById('main_think').innerHTML = ajax_data.main_think;
		document.getElementById('idea').innerHTML = ajax_data.idea;
		document.getElementById('scheme_cache').innerHTML = ajax_data.scheme_cache;
		document.getElementById('scheme_io_r').innerHTML = ajax_data.outputs_cache;
		document.getElementById('scheme_io_l').innerHTML = ajax_data.inputs_cache;
		document.getElementById('scheme').src = '/var/files/' + ajax_data.real;
*/}

function changeBubbleSize()
{
    TABLE_HEIGHT_COUNTER = document.getElementById('height_counter');
	START = CURRENT_HEIGHT;
	END = FUTURE_HEIGHT;
	S = Math.abs(END - START);
	X = 1;
	SPEED = 1;
	ACCELERATION = 50;
	DIRECTION = (END - START)/S;
	TIME = 0;

    window.producer = setInterval(slideScheme, 10);
}


function makeThemRelative()
{
	document.getElementsByTagName('body')[0].style.overflowX = 'hidden';
	var scheme_table = document.getElementById('scheme_table');
	var scheme_master = document.getElementById('scheme_master');
	var absolute_master = document.getElementById('absolute_master');
	var tsk_sol = document.getElementById('tsk_sol');
	absolute_master.style.width = 'auto';
	tsk_sol.style.width = '90%';
	tsk_sol.style.position = 'relative';
	tsk_sol.style.left = '0';
	absolute_master.style.position = 'relative';
	scheme_table.style.top = '0';
	scheme_table.style.width = '100%';
	scheme_table.style.height = 'auto';
	scheme_table.style.position = 'relative';
	scheme_table.style.left = '0px';
	scheme_master.style.position = 'relative';
	scheme_master.style.left = '0px';
	scheme_master.style.overflow = 'visible';
	scheme_master.style.width = '100%';
	scheme_master.style.height ='auto';

	var button = document.getElementById('refresh');
	var parent = button.parentNode;
	var a = document.createElement('a');
	a.className = 'refresh';
	a.href = "javascript: getAjaxScheme();";
	parent.replaceChild(a, button);
/*	button.className = 'refresh_move';
	button.href = '';
*/	a.id = "refresh";





}

PHI = 5/10*3.1415;
BETA = 10/10*3.1415;


function slidePosition(iT) // iT = 0..100
{	var alpha = iT*BETA/100;
	return Math.sin(PHI + alpha) - Math.sin(PHI);
}

function slideScheme()
{	var left =  W*slidePosition(TIME) + 20 + 'px';
	SCHEME_TABLE.style.left = left;
	TSK_SOL.style.left = left;
    ////console.log('TIME: ' + TIME + ' Left = ' + left);

	TIME += 2;

	if (Math.abs(CURRENT_HEIGHT - FUTURE_HEIGHT) > 1)
	{		CURRENT_HEIGHT += DH;
		DH = (FUTURE_HEIGHT - CURRENT_HEIGHT)/10;
		TD_CONTENT.style.height = CURRENT_HEIGHT + 'px';
		SCHEME_MASTER.style.height = CURRENT_HEIGHT + 'px';
	}

	// Скрытие футера
	if (OPACITY > 0 && (DH_A > 5))
	{		OPACITY -= 0.2;
		setOpacity(HIDEOUT01, OPACITY);
		setOpacity(HIDEOUT02, OPACITY);
		setOpacity(HIDEOUT03, OPACITY);
	}

	if (TIME == 22)
	{
 		TIME_NEW = 62;   		window.producer_new = setInterval(slideNewScheme, 10);
	}

	if (TIME>100)
	{
//		////console.log(ajax_data);
		clearInterval(window.producer);
		SCHEME_TABLE.parentNode.removeChild(SCHEME_TABLE);
		TSK_SOL.parentNode.removeChild(TSK_SOL);
	}
}

function restoreOpacity()
{	if (OPACITY < 1)
	{
		OPACITY += 0.2;
		setOpacity(HIDEOUT01, OPACITY);
		setOpacity(HIDEOUT02, OPACITY);
		setOpacity(HIDEOUT03, OPACITY);
	}
	else clearInterval(window.restore_opacity);

}

function hideTail ()
{	if (TAIL_STATUS < 3)
	{
		TAIL_STATUS++;
		TAIL.src = changeEnding(TAIL.src, TAIL_STATUS)
	}
	else
	{		TAIL_SHOWN = 0;
		clearInterval(window.tail_interval);
 		TAIL.style.display = 'none';
		if (ajax_data.type == 1) TAIL.className = 'moist_tail png';
		else TAIL.className = 'composition_tail png';
	}
}

function showTail ()
{	if (TAIL_STATUS > 1)
	{
		TAIL_STATUS--;
		TAIL.src = changeEnding(TAIL.src, TAIL_STATUS)
	}
	else clearInterval(window.tail_interval);
}

function slideNewScheme()
{
	var left = -W*slidePosition(TIME_NEW) + 20 + 'px';
	NEW_SCHEME_TABLE.style.left = left;
	NEW_TSK_SOL.style.left = left;
    ////console.log('TIME_NEW: ' + TIME_NEW + ' Left = ' + left);
	TIME_NEW -= 2;
	if (TIME_NEW == 30)
	{		TAIL.style.display = 'block';
		window.tail_interval = setInterval(showTail, 100);
	}
	if (TIME_NEW<=0)
	{
		TIME_NEW = 0;
		var left = -W*slidePosition(TIME) + 20 + 'px';
		NEW_SCHEME_TABLE.style.left = left;
		clearInterval(window.producer_new);
		makeThemRelative();
		window.restore_opacity = setInterval(restoreOpacity, 10);
	}
}


function resizeBubble ()
{//	//////console.log(X + ' ' + S + ' ' + CUR_HEIGHT);
	SPEED = velocity (X/S - 0.40);
	X += SPEED * ACCELERATION;
	//////console.log(X);
	CUR_HEIGHT = START + (X*DIRECTION);
	TABLE_HEIGHT_COUNTER.style.height = CUR_HEIGHT + 'px';
	if (SPEED == 0)
	{		var button = document.getElementById('refresh');
		button.className = 'refresh';
		button.href = 'javascript: getAjaxScheme();';
		clearInterval(window.producer);
	}
}


function velocity (x)
{
	 if(x>=0.45 || x<=-0.40) return 0;
	 else return (Math.cos(x*6.283)+1)/2;
}































































