/*
	Данная библиотека - должна загружатся раньше всех скриптов, которые производят обращение к данной библиотеке и 
	ее объектам.
	Также библиотека переобозначает событие onLoad.
*/

//Объект - хранящий список строк которые необходимо выполнить
function WBJSLoaderConstructor()
{
	this.list=new Array();
	this.add=function(evalString) { this.list.push(evalString); }
	this.del=function(index) { this.list.splice(index,1); }
	this.toEvalString=function() { return this.list.join(';'); }
}

//Объект - хранящий в себе сведеньия о функциях, которые необходимо запустить после загрузки документа
var WBJSLoader=new WBJSLoaderConstructor();

//Переопределяем функцию преобразования строки
var encodeURIComponentOriginal=window.encodeURIComponent;
window.encodeURIComponent=function(str)
{
	str=str.replace(/\+/g,'%2B');
	return encodeURIComponentOriginal(str);
}

//Определение дополнительных функций

//Функцтия ищет наличие элемента в массиве
Array.prototype.inArray=function(obj)
{
	var result=false;
	for (var i=0; i<this.length; i++)
	{
		if(this[i]==obj)
		{
			result=true;
			break;
		}
	}
	return result;
}

//Функция возвращает номер элемента в массиве
Array.prototype.search=function(obj)
{
	var result=-1;
	for (var i=0; i<this.length; i++)
	{
		if(this[i]==obj)
		{
			result=i;
			break;
		}
	}
	return result;
}

//Функция приобразует в HTML декодированный вариант строки
function htmlspecialchars(text)
{
	var chars=Array('&','<','>','"');
	var replacements=Array('&amp;','&lt;','&gt;','&quot;');
	for(var i=0; i<chars.length; i++)
	{
		var re=new RegExp(chars[i], "gi");
		text=text.replace(re,replacements[i]);
	}
	return text;
}

//Функция производит декадирование кодированного HTML
function htmlspecialchars_decode(text)
{
	var replacements=Array('&','<','>','"');
	var chars=Array('&amp;','&lt;','&gt;','&quot;');
	for(var i=0; i<chars.length; i++)
	{
		var re=new RegExp(chars[i], "gi");
		text=text.replace(re,replacements[i]);
	}
	return text;
}

//Функция загрузки документа
//window.onload=function() { eval(WBJSLoader.toEvalString()); }
$(document).ready(function (){ window.eval(WBJSLoader.toEvalString()); });

//Конструктор набора AJAX
function AJAXListConstructor()
{
	this.query=new Array();
	this.queryID=new Array();
	this.curentID=-1;
	this.add=function(id)
	{
		var search=false;
		for (var i=0; i<this.queryID.length; i++)
		{
			if (id==this.queryID[id])
			{
				var newID=i;
				this.query[i]=null;
				search=true;
				break;
			}
		}
		if (search==true) return newID;
		else
		{
			var newID=this.query.length;
			this.query.push(null);
			this.queryID.push(id);
			return newID;
		}
	}
	this.getIndex=function(name)
	{
		var needleID=0;
		for (var i=0; i<this.query.length; i++)
		{
			if (name==this.queryID[i])
			{
				needleID=i;
				break;
			}
		}
		return needleID;
	}
	this.getByIndex=function(index) { return this.query[index]; }
	this.delByIndex=function(index)
	{
		this.query.splice(index,1);
		this.queryID.splice(index,1);
	}
}

//Созаем набор AJAX
var AJAXList=new AJAXListConstructor();

//Функция создает подключение по средствам XMLHTTPRequest
function AJAX(reqID,method,url,functionName,data,header)
{
	var index=AJAXList.getIndex(reqID);
	if (window.XMLHttpRequest)
	{
		AJAXList.query[index]=new XMLHttpRequest();
		if(functionName.indexOf('eval')==0)
		{
			AJAXList.query[index].onreadystatechange=function ()
			{
				var aborted=window.setTimeout("AJAXList.query["+index+"].abort();", 15000);
				if (AJAXList.query[index].readyState==4)
				{
					clearTimeout(aborted);
			        if (AJAXList.query[index].status==200)
					{
						var result=AJAXList.query[index].responseText;
						if(functionName=='eval')
						{
							if(result!=='') window.eval(result);
						}
						else
						{
							var collBackFunc=functionName.substr(5);
							//window.eval(collBackFunc+'(result);');
							window.eval(collBackFunc+'(AJAXList.query['+index+'].responseText);');
						}
					}
				}
			}
		}
		else eval('AJAXList.query[index].onreadystatechange='+functionName);
        if (method=='GET')
        {
			AJAXList.query[index].open(method,url,true);
	        AJAXList.query[index].send(null);
		}
		else
		{
			AJAXList.query[index].open(method,url,true);
			if (typeof header != 'undefined')
			{
				var headArray=header.split('*|*');
				for (var i=0; i<headArray.length; i++)
				{
					var tmpArray=headArray[i].split('*$*');
					AJAXList.query[index].setRequestHeader(tmpArray[0],tmpArray[1]);
				}	
			}
	        AJAXList.query[index].send(data);
		}
	}
	else
	{
		try { AJAXList.query[index]=new ActiveXObject('Msxml2.XMLHTTP'); }
		catch(e) { AJAXList.query[index]=new ActiveXObject('Microsoft.XMLHTTP'); }
		if(functionName.indexOf('eval')==0)
		{
			AJAXList.query[index].onreadystatechange=function ()
			{
				var aborted=window.setTimeout("AJAXList.query["+index+"].abort();", 15000);
				if (AJAXList.query[index].readyState==4)
				{
					clearTimeout(aborted);
			        if (AJAXList.query[index].status==200)
					{
						var result=AJAXList.query[index].responseText;
						if(functionName=='eval')
						{
							if(result!=='') window.eval(result);
						}
						else
						{
							var collBackFunc=functionName.substr(5);
							window.eval(collBackFunc+'(result);');
						}
					}
				}
			}
		}
		else eval('AJAXList.query[index].onreadystatechange='+functionName);
        if (method=='GET')
        {
			AJAXList.query[index].open(method,url,true);
	        AJAXList.query[index].send();
		}
		else
		{
			AJAXList.query[index].open(method,url,true);
			if (typeof header != 'undefined')
			{
				var headArray=header.split('*|*');
				for (var i=0; i<headArray.length; i++)
				{
					var tmpArray=headArray[i].split('*$*');
					AJAXList.query[index].setRequestHeader(tmpArray[0],tmpArray[1]);
				}	
			}
	        AJAXList.query[index].send(data);
		}
	}
}

//Функция обертка для создания AJAX запросов
function AJAXQuery(reqID,method,url,functionName,data,header) { AJAXList.add(reqID); AJAX(reqID,method,url,functionName,data,header); }

//Функция для открытия окна без статус баров и т.п.
function openWindow (page,width,height,scroll)
{
	window.status='';
	window.open(page, 'openWindow'+Math.round(Math.random()*100), 'width='+width+',height='+height+',scrollbars='+scroll+',status=yes,toolbar=no,menubar=no,directories=no,titlebar=no');
}

//Функция просмотра картинки в отдельном окне
function lookImage(pic, wi, hei)
{
	var w="width="+wi;
	var h="height="+hei;
	opWin=open("","displayWindow", w+", "+h+", status=no, toolbar=no, menubar=no, resizable=no, scrollbars=no");
	opWin.document.open();
	opWin.document.write("<html><head><title>Image</title></head>");
	opWin.document.write("<body leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\"><img src=\""+pic+"\" border=\"0\"></body></html>");
	opWin.document.close();
}

//Возвращает значение указанной куки
function getCookieData(LabelName)
{
	var labelLen=LabelName.length;
	var cookieData=document.cookie;
	var cLen=cookieData.length;
	var i=0;
	var cEnd;
	while (i<cLen)
	{
		var j=i+labelLen;
		if (cookieData.substring(i,j)==LabelName)
		{
			cEnd=cookieData.indexOf(";",j);
			if (cEnd==-1) cEnd = cookieData.length;
			return unescape(cookieData.substring(j+1,cEnd))
		}
		i++;
    }
    return ""
}

//Функция возвращает n раз повторенный символ - :) самая бесполезная функция ))))
function repeatStr(n,str)
{
	var newStr='';
	for (var i=0; i<=n; i++) newStr+=str;
	return newStr;
}

//Функция находит место положение объекта и возвращает его координаты
function findXY(obj)
{
	var curleft=0, curtop=0;
	while(obj)
	{
		curleft+=obj.offsetLeft;
		curtop+=obj.offsetTop;
		obj=obj.offsetParent;
	}
	return [curleft, curtop];
}

//Функция определяет размер окна с документом
function getPageSize()
{
	var xScroll, yScroll;

	if (window.innerHeight && window.scrollMaxY)
	{
		xScroll = window.innerWidth + window.scrollMaxX;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight) { 
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else {
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}

	var windowWidth, windowHeight;

	if (self.innerHeight)
	{
		if(document.documentElement.clientWidth) {
				windowWidth = document.documentElement.clientWidth; 
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}

	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	if(xScroll < windowWidth){	
		pageWidth = xScroll;		
	} else {
		pageWidth = windowWidth;
	}

	return [pageWidth,pageHeight];
}

//Конструктор для профиля онлайн сервиса, который устраивает опрос
function WBUserOnlineProfileConstructor(type,time,life,value,urlAdded,serviceAddress,step)
{
	this.type=type;
	this.time=time;
	this.life=life;
	this.value=value;
	this.urlAdded=urlAdded;
	this.serviceAddress=serviceAddress;
	this.counter=null;
	this.started=false;
	this.step=1000*60;
}

//Переменная профиля онлайн сканера
var WBUserOnlineProfile=null;

//Функция стартует сканер профиля
function WBUserOnlineStart()
{
	WBUserOnline(WBUserOnlineProfile.type,WBUserOnlineProfile.time,WBUserOnlineProfile.life,WBUserOnlineProfile.value,WBUserOnlineProfile.urlAdded,WBUserOnlineProfile.serviceAddress);
	if(WBUserOnlineProfile.started==false)
	{
		WBUserOnlineProfile.started=true;
		WBUserOnlineProfile.counter=setInterval('WBUserOnlineStart()',WBUserOnlineProfile.step);
	}
}

//Функция по указаным параметрам создает подключение к сервису проверки он лайн - наличия пользователей на сайте
function WBUserOnline(type,time,life,value,urlAdded,serviceAddress)
{
	var urlParm=urlAdded+'&type='+type+'&life='+life+'&time='+time+'&value='+value;
	AJAXQuery('WBUserOnline','GET',serviceAddress+'?'+urlParm,'eval');
}
