﻿
var openTimer=new Timer(60000);
var workTimer=new Timer;
var seswTimer=new Timer;
var menuTimer=new Timer;
var docLoadTimer=new Timer;
var menuLoadTimer=new Timer;
var priceLoadTimer=new Timer;
var debugTimer=new Timer; // временный для вставки в участки кода для тестирования времени исполнения кода;
var sid=""+Math.ceil(Math.random()*1e17); //при релоаде сохранить старый sid
var cid=sid;
var cookFlag, persFlag;
docLoadTimer.start();

/* Лентяйки */
d=document;
n=navigator;
s=screen;
a=alert;
e=escape;
u=unescape;

/*	Счётчик времени работы, запуска чего-либо. (Интегральный таймер). 
<Timer>
	Например, удобен, чтобы знать, сколько пользователь реально работал с документом, страницей.
	<remark Name="Integral Time Counter" Version="1.0" Rev="17" 
	Copyright="(c) Max Valuev, 2006."  
	Create="Wed Dec 13 04:10:58 UTC+0300 2006"
	Update="Wed Feb 15 18:03:45 UTC+0300 2007" />
*/
/* <ToDo>
		!!!! Добавить параметр smartTime();???
		Реализовать функции interv(); и pInterv();
		Разобрать конфликт таймеров 2-х и более открытых страниц.
		Протестировать поведение при сбоях в записях персист.
		Протестировать конфликт стёртой информации.
		Написать наиболее подробное описание по всем функциям, включая пост вычисляемые параметры, в том числе на стороне сервера.
		Может добавить функции .stopPersist(); .startPersist();
		Запись чтение сырые, переделать на столько на сколько возможно.
	</ToDo>
*/
function Timer(smt){
	var init=new Date(), current=new Date();

	function Pt(iVal){
		this.m		= iVal;
		this.sm	= iVal;
		this.ssm	= iVal;
	}

	var start 		= new Pt(0); // -startSm
	var stop 		= new Pt(0); // -stopSm -stopSSm
	var dur		= new Pt(0); //
	var interv	= new Pt(0); // !!!!!!!!!!!!!!!!!!!!!!
	var summ	= new Pt(0); //
	var pDur		= new Pt(0); //
	var pSumm	= new Pt(0); //
	var pInterv	= new Pt(0); // !!!!!!!!!!!!!!!!!!!!!!
	var fStart	= new Pt(0); // -Sm -SSm
	var count	= new Pt(0); // -SSm
	var flag		= new Pt(-1); // -SSm
	var load		= new Pt(0); // Для лоадера	???что это, где это, надо ли???

	var noStartCount=0, noStartTimer=0, noStopCount=0, noStopTimer=0, inoStartCount=0, inoStartTimer=0;
	
	var smTime=smt?smt:1000; //Smart Interval//

// Команды...

	// Запуск таймера. //
	this.start=function (stt, n)	{
		start.m=stt? stt:new Date();
		
		if (++count.m==1) {fStart.m=start.m; start.ssm=start.m; flag.sm=0}

		pDur.m=dur.m; pSumm.m=summ.m; dur.m=0;
		
		if (start.m-stop.m>smTime)	{start.ssm=start.m; pSumm.ssm=summ.ssm;  pDur.ssm=dur.ssm; pSumm.sm=summ.sm;  pDur.sm=dur.sm; dur.sm=0; dur.ssm=0; count.sm++; flag.sm=0}	// Новый сеанс
		else 			{summ.ssm+=start.m-stop.m; dur.ssm=start.m-start.ssm; flag.sm++} 									// Краткое прерывание
		if(flag.m==1) nspErr(n); 
		flag.m=1;

	}

	// Остановка таймера. //
	this.stop=function (stp, n)	{
		stop.m=stp? stp:new Date();
		
		if(flag.m==-1) insErr(n);
		else{
			dur.m=stop.m-start.m; 
			dur.sm+=dur.m;
			dur.ssm=stop.m-start.ssm;
			if(flag.m==1)	{summ.m+=dur.m; summ.sm+=dur.m; summ.ssm+=dur.m;}
		}
		if(flag.m==0) nstErr(n); 
		flag.m=0;

	}

	//Подготовка к сохранению/восстановлению таймера. //
	// <tip>Текущее время генерации записи таймера расчитывается как start+ses</tip>
	this.forSave=function(dev)	{
		if (!dev) dev=";";
		var w="";
		w+="start="+setVar(start, dev);
		w+="stop="+setVar(stop, dev);
		w+="dur="+setVar(dur, dev);
		w+="interv="+setVar(interv, dev);
		w+="summ="+setVar(summ, dev);
		w+="pDur="+setVar(pDur, dev);
		w+="pSumm="+setVar(pSumm, dev);
		w+="pInterv="+setVar(pInterv, dev);
		w+="fStart="+setVar(fStart, dev);
		w+="count="+setVar(count, dev);
		w+="flag="+setVar(flag, dev);
		w+="erc="+noStartCount+","+noStopCount+","+inoStartCount+dev;
		w+="ert="+noStartTimer+","+noStopTimer+","+inoStartTimer+dev;		
		w+="smt="+smTime+dev;
		w+="ses="+session()+dev;
		w+="dtcc="+Math.ceil(new Date())+dev;
		return w;
	}

	function setVar(v, dev){
		return Math.ceil(v.m)+","+Math.ceil(v.sm)+","+Math.ceil(v.ssm)+dev;
	}
	
	this.forLoad=function(v)	{
		var sV;	
		sV=v.split(";");
		getVar("start", sV);
		start.m=load.m; start.sm=load.sm; start.ssm=load.ssm;
		getVar("stop", sV);
		stop.m=load.m; stop.sm=load.sm; stop.ssm=load.ssm;
		getVar("dur", sV);
		dur.m=load.m; dur.sm=load.sm; dur.ssm=load.ssm;
		getVar("interv", sV);
		interv.m=load.m; interv.sm=load.sm; interv.ssm=load.ssm;
		getVar("summ", sV);
		summ.m=load.m; summ.sm=load.sm; summ.ssm=load.ssm;
		getVar("pDur", sV);
		pDur.m=load.m; pDur.sm=load.sm; pDur.ssm=load.ssm;
		getVar("pSumm", sV);
		pSumm.m=load.m; pSumm.sm=load.sm; pSumm.ssm=load.ssm;
		getVar("pInterv", sV);
		pInterv.m=load.m; pInterv.sm=load.sm; pInterv.ssm=load.ssm;
		getVar("fStart", sV);
		fStart.m=load.m; fStart.sm=load.sm; fStart.ssm=load.ssm;
		getVar("count", sV);
		count.m=load.m; count.sm=load.sm; count.ssm=load.ssm;
		getVar("flag", sV);
		flag.m=load.m; flag.sm=load.sm; flag.ssm=load.ssm;
		getVar("erc", sV);
		noStartCount=load.m; noStopCount=load.sm; inoStartCount=load.ssm;
		getVar("ert", sV);
		noStartTimer=load.m; noStopTimer=load.sm; inoStartTimer=load.ssm;
	}

	function getVar(s, w) {
		var  sW, ssW;	
		for(i=0; i<13; i++){ //>
			sW=w[i].split("="); 
			if (sW[0]==s){
				ssW=sW[1].split(",");
				load.m=Math.ceil(ssW[0]);
				load.sm=Math.ceil(ssW[1]);
				load.ssm=Math.ceil(ssW[2]);
				return load;
			}
		}
	}

			


	// Сброс таймера. //
//	this.reset=function ()		{}// А нужно?

// Считывание...

	// Текущая сумма. //
	this.summ=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	if (flag.m==1) return session()+summ.ssm;  else return summ.ssm;
			case "smart": 	if (flag.m==1) return session()+summ.sm;  else return summ.sm; // =.m
			default: 		if (flag.m==1) return session()+summ.m;  else return summ.m;
		}
	}

	// Текущая длительность работы. //	
	this.duration=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	if (flag.m==1) return session()+dur.ssm;  else return dur.ssm;
			case "smart": 	if (flag.m==1) return session()+dur.sm;  else return dur.sm;
			default: 		if (flag.m==1) return session();  else return dur.m;
		}
	}

	// Предыдущая сумма. //
	this.pSumm=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	return pSumm.ssm;
			case "smart": 	return pSumm.sm;  //=.m
			default: 		return pSumm.m;
		}
	}

	// Предыдущая длительности работы. //
	this.pDuration=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	return pDur.ssm;
			case "smart": 	return pDur.sm;
			default: 		return pDur.m;
		}
	}

	// Числовые значения состояния таймера. //
	this.flag=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	return flag.sm;	// Рестартов.
			case "smart": 	return flag.sm;	// Рестартов.
			default: 		return flag.m;	// Старт, стоп, инит.
		}
	}

	// Человекочитаемые обозначения состояния таймера. //
	this.status=function (smFlag)	{
		switch (tLC(smFlag)){
			case "ssmart": 	if (flag.sm>=0) return flag.m==1? "("+flag.sm+")":"stop"; else return "init";
			case "smart": 	if (flag.sm>=0) return flag.m==1? "("+flag.sm+")":"stop"; else return "init";
			default: 		if (flag.m==1) return "start"; if (flag.m==0) return "stop"; else return "init";
		}
	}
	// Количество загрузок //
	this.count=function (smFlag)	{
		switch (smFlag?smFlag.toLowerCase(): ""){
			case "ssmart": 	return count.sm; // .ssm=.sm 
			case "smart": 	return count.sm;
			default: 		return count.m;
		}
	}



	// Прочее чтение ///
	this.firstStartTime=function ()	{return fStart;}
	this.lastStopTime=function ()	{return stop.m;}
	this.initTime=function ()	{return init;}

// Внутрение функции...

	function session()		{current=new Date(); return current-start.m; }
	function tLC(str)		{return str?str.toLowerCase(): ""}

// Обработчики ошибок...
//<ToDo>Устранить баг. Таймеры ошибок не записываются (всегда 0).</ToDo>

	this.noStartCount=function ()	{return noStartCount;}
	this.noStopCount=function ()	{return noStopCount;}
	this.inoStartCount=function ()	{return inoStartCount;}
	this.noStartTimer=function ()	{return noStartTimer;}
	this.noStopTimer=function ()	{return noStopTimer;}
	this.inoStartTimer=function ()	{return inoStartTimer;} 

	var аlert=false; // true; false;
	function nstErr(nz)		{ noStartCount++; noStartTimer+=dur.m; if(аlert) a(nz+' Error "No start"');} 
	function nspErr(nz)		{ noStopCount++; noStopTimer+=dur.m; if(аlert) a(nz+' Error "No stop"');} 
	function insErr(nz)		{ inoStartCount++; inoStartTimer+=dur.m; if(аlert) a(nz+': Errot "No start after init"');}

}

// Отладочная функция отображения таймеров.
// <debug>
function outTimes(){
	var z;
	if(time){
	z  ="<table>";
	z+="<tr>";
	z+="<td>Имя</td><td></td><td>Статус</td><td></td>";
	z+="<td></td><td>Старт [смарт(перерыв)]</td>";
	z+="<td>Summ</td>";
	z+="<td>SummStop</td>";
	z+="<td>Last</td>";
	z+="<td>LastStop</td>";
	z+="<td>noStt</td>";
	z+="<td>initNoStt</td>";
	z+="</tr>";
//	z+=outTimesStringEl(workTimer, "Document");
//	z+=outTimesStringEl(bodyTimer, "Body");
	z+=outTimesStringEl(menuTimer, "Menu");
//	z+=outTimesStringEl(loadTimer, "Load");
//	z+=outTimesStringEl(menuLoadTimer, "MenuLoad");
	z+="</table>";
	time.innerHTML=z;

	}
	window.setTimeout(outTimes, 1000);

// Отладчик логирующий
function debugStart() {if(time) time.innerHTML+="<br/>Start ->"+summ.m+" "+summ.sm+" "+summ.ssm+" "+dur.m+" "+dur.sm+" "+dur.ssm;}
function debugStop() {if(time) time.innerHTML+="<br/>Stop ->"+summ.m+" "+summ.sm+" "+summ.ssm+" "+dur.m+" "+dur.sm+" "+dur.ssm;}

}
function outTimesStringEl(timer, name){
	var z="", smFl=new Array(), current = new Date();

	smFl[0]="Normal";
	smFl[1]="Smart";
	smFl[2]="SSmart";

	for(i=0; i<3; i++){ //>
	z+="<tr>";
	z+="<td>"+name+"</td><td><b>"+smFl[i]+"</b></td><td> timer is </td><td><b>"+timer.status(smFl[i])+"</b></td><td>-></td>"
	z+="<td>"+timer.count(smFl[i])+" </td>";
	z+="<td>"+timer.duration(smFl[i])+" </td>";
	z+="<td>"+timer.summ(smFl[i])+" </td>";
	z+="<td>"+timer.pDuration(smFl[i])+" </td>";
	z+="<td>"+timer.pSumm(smFl[i])+" </td>";
	z+="<td>"+timer.flag(smFl[i])+" </td>";
	z+="</tr>";
	}
	return z;

}
//</debug>

// Функция конвертирования времени в человекочитаемый формат (есть ещё чего исправлять).
function tdConvert(d,de){
	var z="";
	var day=24*60*60*1000;
	var days=(d/day-d/day%1)
	var dz = new Date ();
	dz.setTime(d);
	if(d>=day){
		z +=days+(days<=1? ' день ':' дней ')+'и '; //>
	}
	z += dz.getUTCHours()>0? dz.getUTCHours() + " ч. " : "" ;
	z += dz.getUTCMinutes()>0? dz.getUTCMinutes() + " мин. " : "" ;
	z += dz.getUTCSeconds() + ".";
	z += dz.getUTCMilliseconds()<100? "0":""; //>
	z += dz.getUTCMilliseconds()<10  ? "0":""; //>
	z += dz.getUTCMilliseconds() + " сек. ";
	z += de>0? "["+Math.round(d/de*10000)/100+"%]":"\t";
	//z += "\t("+d+")";
	return(z);
}
//</Timer>


//Онлайновый запуск таймера работы со страницей сайта.//
function document.onfocusin()		{ workTimer.start();}
function document.onfocusout()	{ workTimer.stop();}



function Loaded(page) {
//	loadTimer.stop();
//	loadTimer.start();
	
	//Загрузка интегрального таймера времени работы со страницей и старт, если он необходим.
	//здесь возможен еще более изощеренный механизм и вообще желательно выбросить в отдельную функцию.
	if(loadPers("workTimer")!="null"){
		
		if(workTimer.flag()==1){
			workTimer.forLoad(loadPers("workTimer")); 
			workTimer.start();
		}
		else{
			workTimer.forLoad(loadPers("workTimer")); 
		}		
	}
	//но всё равно нет гарантий, что в промежутке вышеизложенной функции выполнения не произойдёт казус.

	//Загрузка интегрального таймера открытой страницей и старт.
	if(loadPers("openTimer")!="null"){
		openTimer.forLoad(loadPers("openTimer"));
	}
	openTimer.start();

	//здесь протестировать на текущее состояние таймера, на то значение, которое внутри иначе возможны казусы.

	function Menu.onfocusin()		{ menuTimer.start();}
	function Menu.onfocusout()		{ menuTimer.stop();}
// Отладка таймеров.
//	function tictak.onclick()		{  savePers(menuTimer.forSave());}
//	function taktic.onclick()		{  menuTimer.forLoad(loadPers());}
//	outTimes(); // Отладка таймеров

//*********************************************************************************************************************************//
//*********************************************************************************************************************************//
//*********************************************************************************************************************************//
// Начало.
	InitStat();
	if (!page) page="main";
	sendStat("Enter", page);
	Menu.innerHTML =  getXMLTransform("menu.xml","menu.xslt");
	menuNavigate("main","main", "Enter"); // Или Рефреш.
	Doc.innerHTML =  getXMLTransform(page+".xml","main.xslt");
	forusers.style.display="none";
	fornousers.style.display="";	
	//Menu2.focus();
	this.focus();
	docLoadTimer.stop();

	//Добавить из фаворитов или с записанной страницы.
	
//	a(getXMLsrc("doc.txt"));
//	a(getObjectData("doc.txt"));
//	oT=oO;
//	a(dsoTAK.xml);

	//a(loadInfo('ToDo', true));


//	a(d.frames("dsoTAK").d.all(1));
	if(loadInfo('ToDo', true)==0) window.setTimeout("openPop('Main')", 1000);


}
function sendStat(eventAction, eventName, eventObject, clientAction, clientObject, actionObject){
	// Чо ещё.
	// В будущем проверку на отправку части данных. При необходимости доставание их из персист
	// Фулл или только таймеры.
	
	var z="";
	var eid=""+Math.ceil(Math.random()*1e17);
	var dt=new Date();
	ids="eid="+eid+"&sid="+sid+"&cid="+cid+"&dt="+Math.ceil(dt)+"&tz="+dt.getTimezoneOffset();
	
	z+="&ea="+eventAction;
	z+="&en="+eventName;
	z+="&eo="+eventObject;
	z+="&ca="+clientAction;
	z+="&co="+clientObject;
	z+="&ao="+actionObject;

	z+="&fref="+e(loadInfo('fRef', true));
	z+="&ref="+e(d.referrer);
	z+="&floc="+e(loadInfo('fLoc', true));
	z+="&loc="+e(d.location);
	
	// Урезать лишнее
	z+="&an="+n.appName;
	z+="&av="+n.appVersion;
	z+="&ce="+n.cookieEnabled;
	z+="&cfl="+cookFlag;
	z+="&pfl="+persFlag;
	z+="&ist="+loadInfoStS;
	z+="&cpu="+n.cpuClass;
	z+="&ol="+n.onLine;
	z+="&pf="+n.platform;
	z+="&bl="+n.browserLanguage;
	z+="&sl="+n.systemLanguage;
	z+="&ul="+n.userLanguage;
	z+="&te="+n.taintEnabled();
	z+="&je="+n.javaEnabled();
	z+="&tos="+typeof(screen);
	z+="&ah="+s.availHeight;
	z+="&aw="+s.availWidth;
	z+="&cd="+(s.colorDepth?s.colorDepth:s.pixelDepth);
	z+="&h="+s.height;
	z+="&w="+s.width;
	z+="&ui="+s.updateInterval;
	z+="&ch="+d.body.clientHeight;
	z+="&cw="+d.body.clientWidth;
	z+="&dx="+s.deviceXDPI;
	z+="&dy="+s.deviceYDPI;
	z+="&lx="+s.logicalXDPI;
	z+="&ly="+s.logicalYDPI;
	z+="&sll="+screenLeft;
	z+="&stl="+screenTop;
	z+="&cl="+d.body.clientLeft;
	z+="&ct="+d.body.clientTop;
	z+="&se="+s.fontSmoothingEnabled;
	z+="&chr="+d.defaultCharset;
	
	//a(z);
	getXMLTransform("cc.php?"+ids+z);
	getXMLTransform("ct.php?name=openTimer&"+ids+"&"+openTimer.forSave("&"));
	getXMLTransform("ct.php?name=workTimer&"+ids+"&"+workTimer.forSave("&"));

	//open("cc.php?"+ids+z);

	//+посмотреть что ещё.
}

function openPop(page) {
	
	sendStat("Open form", "Free List", page);
	Pop.innerHTML =  getXMLTransform("poplist.xml","main.xslt");

	// Вставка статистики. // <ToDo>!!! Переделать по человечески !!! И вообще на эвенте отправки.</ToDo>
	//Это всё времянка.
	d.all("Ref").value=d.referrer;
	d.all("Loc").value=d.location;
	d.all("FirstRef").value=u(getCook('fRef'));
	d.all("FirstLoc").value=u(getCook('fLoc'));
	d.all("Cookie").value=u(d.cookie);
}

function closePop(page) {
	sendStat("Close form", "Free List");
	Pop.innerHTML ="";
}

function viewTip(Text) {
	Tip.innerHTML = Text;

}

function unLoaded() {
	//Остановка таймеров, запись значений персист //

	openTimer.stop();
	savePers("openTimer", openTimer.forSave());

	function document.onfocusin()		{}
	function document.onfocusout()	{}
	if(workTimer.flag()==1) workTimer.stop();
	savePers("workTimer", workTimer.forSave());
	sendStat("Exit", "main", window.event.type);
	//open("index.php");
	//a(screen);
	var oPopup = window.createPopup();

	
	
/////////////////////////// <ToDo>!!! Сюда добавить вызов функции статистики выхода если нет ответа, то пресист (или сначала пресист).</ToDo>
	//a(openTimer.forSave());
	//a("Exit:\n"+u(d.cookie));
}

// Зона статистики

function setStat(){

}

//<Cook>
function InitStat(){
	setCook('test', sid);	if (getCook('test')==sid)	cookFlag=true;	else cookFlag=false;
	savePers('test', sid);	if (loadPers('test')==sid)	persFlag=true;	else persFlag=false;
	mvCookID=loadInfo('mvCookID', true);
	loadInfoStS=loadInfoSt;
	if (mvCookID==null){
		saveInfo("mvCookID", cid);
		saveInfo("fRef", d.referrer);
		saveInfo("fLoc", d.location);
		saveInfo("ToDo", 0);
		//a("First:\n"+u(d.cookie));
	}
	if (mvCookID!=null) cid=mvCookID;
	visit=Math.ceil(loadInfo('visit'))+1;
	saveInfo('visit', visit);	

	//Времянка
	var UP=loadInfo('UP');
	if(UP=="1"){
		fornousers.style.display="none";
		forusers.style.display="";
	}
	//a("Enter:\n"+u(d.cookie));

}
function saveInfo(name, value) {
		setCook(name, value);
		savePers(name, value);
}

//Может возможен и немного другой алгоритм.
function loadInfo(name, restore) {
	if(!cookFlag && !persFlag) {loadInfoSt="Block" ; return null;}
	var cookValue=getCook(name);
	var persValue=loadPers(name);
	if(cookValue=="null") cookValue=null;
	if(persValue=="null") persValue=null;
	if(cookValue!=persValue){
		if(persFlag && persValue!=null)	{if(restore) setCook(name, persValue); loadInfoSt="Persist"; return persValue;}
		if(cookFlag && cookValue!=null)	{if(restore) savePers(name, cookValue); loadInfoSt="Cookie"; return cookValue;}
		loadInfoSt="Exclude";
		return null;		
	}
	else {loadInfoSt=cookValue==null?"Null":"All"; return cookValue;}
}
//</Cook>

////////////////////////// Навигационный участок

function mn(oldID, ID){
	ev=event.srcElement;
	ev.style.cursor='wait';
	setTimeout("menuNavigate('"+oldID+"', '"+ID+"')",1);
	setTimeout("ev.style.cursor='hand'",1);
}

// Функция навигации по меню.
function menuNavigate(oldID, ID, evsrc) {

	//window.setTimeout("bo.style.cursor='wait'",1);
	//zzzzz=;
	//if(event.srcElement){
	//event.srcElement.style.cursor='wait';}
	
	menuLoadTimer.start();
	window.setTimeout("d.all('menu"+oldID+"').style.display = 'none'", 1);
	window.setTimeout("d.all('menu"+ID+"').style.display = ''", 10);
	//d.all("menu"+ID).style.display = "";
	
	//window.setTimeout("d.all('menu'+oldID).style.display = 'none',1);
	//window.setTimeout("d.all('menu'+oldID).style.display = '',1);
	Doc.innerHTML =  getXMLTransform(ID+".xml", "main.xslt");
	forusers.style.display="none";
	fornousers.style.display="";
	IsUseCookies=true;
	var UP=getCook('UP');
	if(UP=="1"){
		fornousers.style.display="none";
		forusers.style.display="";
	}
	IsUseCookies=false;
	//window.setTimeout("bo.style.cursor='auto'",1);
	//if(zzzzz){
	//	window.setTimeout("zzzzz.style.cursor='hand'",1);
	//}
	menuLoadTimer.stop();
	sendStat("Open page", ID, ID, "menu");
	if(ID=="spisok") window.setTimeout("openPop('spisok')", 500);
	
}

function openPrice(src) {
	
	priceLoadTimer.start();
	d.all("price").style.display = "";
	currEl = event.srcElement;
	currEl.style.cursor='wait';
	window.setTimeout("insertPrice('"+src+"')", 1);
	window.setTimeout("currEl.style.cursor='hand'", 1);
	priceLoadTimer.stop();
}

function insertPrice(src) {
	price.innerHTML =  getXMLTransform(src, "prices.xslt");
}


function openIt(ID) {

	showIt = d.all("g"+ID);
	if (showIt !=null){
		if (showIt.style.display == "none") {
			showIt.style.display = "" ;
			d.images("m"+ID).src = "images/minus.gif"
		} 
		else {
			showIt.style.display = "none" ;
			d.images("m"+ID).src = "images/plus.gif"

		}
	}   
    
	showIt = d.all("p"+ID);
	if (showIt !=null) {
		if (showIt.style.display == "none") {
			<!--InsertBlock(ID);--> // временно удалил для раскрывающихся списков
			showIt.style.display = "" ;
			d.images("m"+ID).src = "images/minus.gif"

		}
		else {
			showIt.style.display = "none" ;
			<!--showIt.innerHTML = '';--> // временно удалил для раскрывающихся списков
			d.images("m"+ID).src = "images/plus.gif"
		}
	}

}

function InsertBlock(ID, Format) {
	AddIt = d.all("p"+ID);
	AddIt.innerHTML = "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp<font size=-4 color=888888>Загрузка...</font>";
	window.setTimeout("InsertBlockPix("+ID+")", 1);
}

function InsertBlockPix(ID) {
	AddIt = d.all("p"+ID);
	AddIt.innerHTML='Куча всякой туфты';
}

function Pic(Code, ID, Art, Name, P, L, W, H, M, PW, PH) {
	var ht='';
	ht +='&nbsp;<TABLE class="icons" ID="i'+ID+'">';
	ht +='<TR><TD colspan=2 class="pic" align="center">';
	ht +='<img class="ipic" border=0 src="catalog/pix160/'+Code+'.jpg" onclick="OpenBig('+Code+')"';
	ht +='alt="Код: '+Code;
	ht +=' Наименование: ' +Name;
	ht +=' Артикул: '+ Art;
	ht +=' Кол-во в упаковке: '+P;
	ht +=' Длина: '+L;
	ht +=' Ширина: '+W;
	ht +=' Высота: '+H;
	ht +=' Вес: '+M+'"';
	ht +=' width='+PW+' height='+PH+'>';
	ht +='</TD></TR><TR><TD align="center">Артикул:</TD><TD>'+Art+'</TD></TR>';
	ht +='</TD></TR><TR><TD colspan=2 align="center">'+Name+'</TD></TR>';
	ht +='</TABLE>&nbsp; ';
	return ht;
}

function OpenBig(Code) {
	currEl = event.srcElement;
	currEl.style.cursor='wait';
	window.setTimeout("OpenBigz("+Code+")", 1);
	window.setTimeout("currEl.style.cursor='hand'", 1);
}

function OpenBigz(Code) {
	NWin=window.open('catalog/pix/'+Code+'.jpg',null,'height=500,width=500,resizable=yes,scrollbars=yes');
	NWin.focus();
}

function Picol() {
	ht +='<TR><TD colspan=2 class="pic" align="center"><a href="pics/'+Code+'.jpg">';
	ht +=' width='+PW+' height='+PH+'></a>';
}
function ColorIt(ID) {

	showIt = d.all("t"+ID);
	if (showIt !=null){
		showIt.className ="bgblock";
	}  
	showIt = d.all("z"+ID);
	if (showIt !=null){
		showIt.style.backgroundColor="#dddddd";
	}  

}     

function UnColorIt(ID) {

	showIt = d.all("t"+ID);
	if (showIt !=null){
		showIt.className = "wblock";
	} 
	showIt = d.all("z"+ID);
	if (showIt !=null){
		showIt.style.backgroundColor="#ffffff";
	}  

}     
function ColorIt11(ID) {


	showIt = d.all("z"+ID);
	if (showIt !=null){
		showIt.style.backgroundColor="#dddddd";
	}  

}     

function UnColorIt11(ID) {


	showIt = d.all("z"+ID);
	if (showIt !=null){
		showIt.style.backgroundColor="#ffffff";
	}  

}     
function UnColorItqqq(ID) {

	showIt = d.all("t"+ID);
	if (showIt !=null){
		showIt.className = showIt.className.slice(0,2);
	}  
}


// Берём  XML внешнего источника. При необходимости преобразовываем через XSLT.
// Вариант применения: <Код объекта ID>.outerHTML  или .innerHTML=  getXMLTransform('File.xml', ['File.xslt'])
// или вставить внутрь функции: Функция(getXMLTransform('File.xml', ['File.xslt'])).
// есть вероятность искажения при последующих обработках возврата функции.

function getXMLTransform(XMLsrc, XSLTsrc) {

	if (XSLTsrc){
		var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
		var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
		xslDoc.async = false;	//???
		xslDoc.load(XSLTsrc);

		if (xslDoc.parseError.errorCode != 0) {
  	 		var myErr = xslDoc.parseError;
	  		a("Ошибка  в " +XSLTsrc+ " : "+ myErr.reason + "(" +myErr.errorCode + ") Line:"+myErr.line+"  LinePos:"+ myErr.linepos);
		}
 		else {
			xslt.stylesheet = xslDoc;
			var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
			var z = new ActiveXObject("Msxml2.DOMDocument.4.0");
			xmlDoc.async = false;	//???
			xmlDoc.load(XMLsrc);

			if (xmlDoc.parseError.errorCode != 0) {
				var myErr = xmlDoc.parseError;
				a("Ошибка  в " +XMLsrc+ " : " + myErr.reason + "(" +myErr.errorCode + ") Line:"+myErr.line+"  LinePos:"+ myErr.linepos);
			}	
			else {	
				xslProc = xslt.createProcessor();
				xslProc.input = xmlDoc;
				xslProc.transform();

				//если смотришь что получилось, то применяй: return(" "+xslProc.output)
				//if (XSLTsrc == "main.xslt") a(xslProc.output); 

				return(xslProc.output);
			}
		}
	}
	else { 
		var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.4.0");
		xmlDoc.async = false;
		xmlDoc.load(XMLsrc); 
		if (xmlDoc.parseError.errorCode != 0){ 
                                                var myErr = xmlDoc.parseError;
			a("Ошибка  в " +XMLsrc+ " : "  + myErr.reason + "(" +myErr.errorCode + ") Line:"+myErr.line+"  LinePos:"+ myErr.linepos);
		} 

		else {
			//a(xmlDoc.xml); //тоже вероятны искажения после применения этой отладки ???.
		 	return (xmlDoc.xml);

		}
	}
}

function testРass(){

	//zz=getXMLTransform("answer.txt");
	zz=getXMLTransform("try.php?p="+SMSPass.value);
	zzz=zz.split(">");
	zzzz=zzz[1].split("#");
	if(zzzz[0]=="true"){
//		menuNavigate("spisok","spisok");
//		Doc.innerHTML =  getXMLTransform("openspisok.xml","main.xslt");
		forusers.style.display="block";
		fornousers.style.display="none";
		IsUseCookies=true;
		setCook("UP", "1");
		IsUseCookies=false;
	}
	else{
		a("Вы ввели некорректный пароль. Попробуйте ещё раз повторить ввод.");
	}
}

// Динамический вариант с внешнего через тег <xml src="test.xml">;

////////////Всякое дебагерское..................................
function getXMLsrc(XMLsrc){

	oX.src = XMLsrc;
	return(oX.xml); //
//	return(oX.value);
}
function getObjectData(Data){

	oO.data = Data;
	return(oO);

}

function mmm(){
//a("Start");
//oX.src="html://";
//a(oX.xml);
}

// Вариант заполнения формы
///////////////////////////////////////////////////////
// if (tmpStr!=null) { d.forms.forma.elements['text'].value=tmpStr; } 
// (вместо поиска элемента)
///////////////////////////////////////////////////////

// Отладочный Таймер проверки времени исполнения кода
// Важно лишние таймеры этой серии не оставлять.
///////////////////////////////////////////////////////
//	debugTimer.start(); 	//вставить в начале кода
//	debugTimer.stop();	//вставить в конце кода
//	a(debugTimer.forSave());	//полный список таймеров
//	a(debugTimer.duration());	//только простой Duration
// А вообще сюда стоит забабахать функцию, выводящую HTML табличку в отдельном окошке

// Очень интересный образец реакции на эвенты и в частности на все клики. Возвращает куда кликнули !!!
//function d.onclick()		{
//	txtOutput = event.srcElement.tagName;
//	txtOutput1 = event.srcElement.type;
//	txtOutput2 = event.srcElement.parentElement;
//	a(txtOutput+"\n"+txtOutput1+"\n1"+txtOutput2.tagName);
//}

//////////////////Alert////////////////////
// a( "[sMessage]");
/////////////////////////////////////////////
