﻿/*
 * LiveWord 1.0b - HTML Context Bible
 *
 * Copyright (c) 2010 Dmitriy Nikitenko (www.LiveWord.info)
 * Licensed under the GPL
 *
 * $Date: 2010-01-11 17:56:07 -0500 (Mon, 14 Jan 2008) $
 * $Rev: 1 $
 */
 
/*
если есть alt, то значение из него, иначе innerHTML
*/
var LiveWord={
 version:'1.0b'
, isEvntL:false
, openIDs:{}//id открытых окошек
, host:location.host=='localhost:8081'?"http://localhost:808/bible/":"http://liveword.info/bible/"
, attrPrefix:'LiveWord'
, prefix:'popLiveWord'
, isSafari:false//browser Safari
, isChrome:false//browser Chrome 
, curID:0 //счетчик для id созданного окна
, lng:{}
, curLng:'ru'
, curVersion:'RST'
, res:null
, windowOffset:5 //отступ от края экрана
, cursorOffset:10 //отступ от курсора по вертикале
, isInit:false
, isFirstOpen:true
, chapList:{}//список подгруженных
, onload: function(){
		var a=document.getElementsByTagName("CITE");
		//		if (window.addEventListener) window.addEventListener('load', $onload_exec, false); else window.attachEvent("onload", $onload_exec);
		var isL=LiveWord.isEvntL;
		var css;
		for(var i=0;i<a.length;i++)
		{
			css=a[i].className;
			if(css && css.indexOf('LiveWord')>=0) continue;//уже есть
			a[i].className=(css?css+' ':'')+'LiveWord';

			if(isL)  
				a[i].addEventListener('click',LiveWord.show,false);
			else
				a[i].attachEvent('onclick',LiveWord.show);//a[i].attachEvent('onclick',function(){LiveWord.show(event)})
		}
	}
, init: function(h){
		if(h){
			
		};
		LiveWord.isSafari=navigator.userAgent.indexOf(' Safari')>0;
		LiveWord.isChrome=navigator.userAgent.indexOf(' Chrome')>0;
		LiveWord.res=LiveWord.lng[LiveWord.curLng];
		LiveWord.isInit=true;
	}
, firstOpen: function(){
		LiveWord.isFirstOpen=false;
		lwAjx({
			url:LiveWord.host+ "exec.ashx"
			,q:{t:'firstOpen'}
		});
	}
, show:function(e){
		if(!LiveWord.isInit)  LiveWord.init();
		if(LiveWord.isFirstOpen) LiveWord.firstOpen();
		if(!e) e=event;//IE
		var oLnk=e.currentTarget || e.srcElement;
		var id=(oLnk.getAttribute(LiveWord.attrPrefix+'ID'));
		if(id)
		{
			var obj=document.getElementById(LiveWord.prefix+id);
			if(obj) return LiveWord.align(e,oLnk,obj); //объект уже открыт, но возможно смещен, выравниваем опять
		}
		else
		{
			id=++LiveWord.curID;
			LiveWord.openIDs[id]=true;
		}
		
		//var pop=el({tag:'table', name:''});
		//var popBody=el({tag:'TBODY', to:pop});
		//var head=el({tag:'table',name:'Head', to:pop, cellPadding:0, cellSpacing:0});
		var pop=el({name:''});
		var ref=oLnk.getAttribute('alt') || oLnk.getAttribute('title') || oLnk.innerHTML;
		//main
		var tbl=el({tag:'table',name:'Head', to:pop, cellPadding:0, cellSpacing:0});
			var tbody=el({tag:'TBODY', to:tbl});
			var tr=el({tag:'TR', to:tbody});
			//logo
			el({tag:'td',to:tr, html:"<img src='"+LiveWord.host+"ico.png' onclick='LiveWord.info(" + id + ");' alt='?' title='About' />"});
			//caption
			var td=el({tag:'th', to:tr});
				el({tag:'DIV', name:'Capt', to:td, html:ref});
			//close
			el({tag:'td', to:tr, html:"<img src='"+LiveWord.host+"close.gif' onclick='LiveWord.close(this);'  alt='X' title='Close'/>"});		

		var body=el({to:pop, name:'Body',html:LiveWord.res.loading});
		document.body.appendChild(pop);
		oLnk.setAttribute(LiveWord.attrPrefix+'ID',id);
		
		LiveWord.align(e,oLnk,pop);
		var p=LiveWord.analyze(ref);
		if(!p) return body.innerHTML=LiveWord.res.invalidAddr;
		var iChap=p.chAmt, isErr=false;
		for(var iCh in p.chapters)
			lwAjx({
				url:LiveWord.host+LiveWord.curVersion+"/"+p.book+'-'+iCh+'.txt'
				,type:'json'
				,tag:{iCh:iCh, name:LiveWord.curVersion+p.book+'-'+iCh}
				,on: function(j){
					p.chapters[j.iCh]=LiveWord.chapList[j.name];
					if(!p.chapters[j.iCh])
					{//broken Link
						isErr=true; 
						iChap=0; 
						body.innerHTML=LiveWord.res.loadPageErr;
						lwAjx({
							url:LiveWord.host+"exec.ashx", 
							q:{t:'invalidLink',value:LiveWord.host+LiveWord.curVersion+"/"+p.book+'-'+j.iCh+'.txt'}
						});
						return;
					}
					if(--iChap>0 || isErr) return;
					//загрузилось все
					LiveWord.openText(id,p,body);
					p=null;
				}
			});
		
		function el(h){
			var o=document.createElement(h.tag || 'div'); delete h.tag;
			if(h.name!=undefined)
			{
				o.className=LiveWord.prefix+h.name; delete h.name;
				o.id=o.className+id;
			}
			if(h.to) {h.to.appendChild(o);delete h.to;	}
			if(h.html) {o.innerHTML=h.html;delete h.html;	}
			for(var i in h) o.setAttribute(i,h[i]);
			return o;
		}
	}
, openText: function(id, p,body)
{
		var isShowChapter=p.chAmt>1;
		var isHead=p.addr.length>1;
		if(!isHead && p.addr[0].v && p.addr[0].v.length==1)
			return body.innerHTML=p.chapters[p.addr[0].c][p.addr[0].v[0]-1];//всего один стих
		var iCh;
		var s='', v;
		for(var i=0;i<p.addr.length;i++)
		{
			iCh=p.addr[i].c;
			v=p.addr[i].v;
			//заголовок отрывка
			if(isHead)
				{
					s+="<div>"+iCh+":";
					if(v)
						s+=v[0]+(v.length==1?'':'-' +v[v.length-1]);
					else
						s+='1-'+p.chapters[iCh].length;
					s+="</div>";
				}
			if(v)
				{
					s+="<p>"+p.chapters[iCh][v[0]-1]+"</p>";
					for(var j=1;j<v.length;j++) 
						s+="<p><sup>"+v[j]+"</sup>&nbsp;"+p.chapters[iCh][v[j]-1]+"</p>";
				}
			else
				{
					var l=p.chapters[iCh].length;
					for(var j=0;j<l;j++) s+="<p><sup>"+(j+1)+"</sup> "+p.chapters[iCh][j]+"</p>";
				}
		}
		body.innerHTML=s;
	}
, align: function(e,lnk, pop){
		var d=document.documentElement || document.body;
		var dScroll=LiveWord.isSafari || LiveWord.isChrome?document.body:d;
		
		var x=dScroll.scrollLeft+ e.clientX-pop.offsetWidth/2;
		var y=dScroll.scrollTop+e.clientY+LiveWord.cursorOffset;
		if(x<dScroll.scrollLeft) x=dScroll.scrollLeft+LiveWord.windowOffset;
		else if(x+pop.offsetWidth>d.scrollLeft+d.clientWidth) x=dScroll.scrollLeft+d.clientWidth-pop.offsetWidth-LiveWord.windowOffset;
		if(y+pop.offsetHeight	>dScroll.scrollTop+d.clientHeight)
		{
			var dy=e.clientY+dScroll.scrollTop-pop.offsetHeight-LiveWord.cursorOffset;
			if(dy>dScroll.scrollTop) y=dy;
		}
		
		pop.style.left=x+'px';
		pop.style.top=y+'px';
		pop.style.visibility='visible';
		//var x=lnk.offsetTop;
	}
, offset: function(o){
		var d=document.documentElement || document.body;
		var x=o.offsetLeft, y=o.offsetTop, sx=d.scrollLeft+o.scrollLeft, sy=d.scrollTop+o.scrollTop;
		
		while(o.offsetParent){
			o=o.offsetParent;
			x+=o.offsetLeft;
			y+=o.offsetTop;
			sx+=o.scrollLeft;
			sy+=o.scrollTop;
		};
		return {x:x, y:y, sx:sx, sy:sy};
		
	}
, close: function(o){
		var pop=o.parentNode.parentNode.parentNode.parentNode.parentNode;
		var id=pop.id.substring(LiveWord.prefix.length);
		pop.parentNode.removeChild(pop);
		delete LiveWord.openIDs[id];
			//var id=pop.id.substring(LiveWord.prefix.length);
			
		//td.removeAttribute
	}
, info:function(id){
		//alert('Инфо автора');
		document.getElementById(LiveWord.prefix+'Capt'+id).innerHTML=LiveWord.res.aboutCaption;
		document.getElementById(LiveWord.prefix+'Body'+id).innerHTML=LiveWord.res.about;
	}
, analyze: function(s){
			function trim(s){return s.replace(/(^\s+)|(\s+$)/g, '')};
			function isn(s){return s.length>0 &&  /^\d{1,3}$/.test(s);};
		s=trim(s);
		if(s.length<4) return;// {err:LiveWord.res.invalidAddr}
		var i=s.substring(2).search(/\d/);
		if(i<0) return;
		i+=2;
		var bookName=s.substring(0,i).toLowerCase().replace(/[^\d\a-z\а-я]/g,'');
		//var bookName=s.substring(0,i).replace(/[^\d\a-z\а-я]/gi,'').toLowerCase();
		var iBook=LiveWord.res.books[bookName.substring(0,4)];
		if(iBook==undefined) return;
		var iBookMaxChp=LiveWord.res.chapters[iBook];
		//анализ глав
		var addr=[];
		var addr0=s.substring(i).replace(/\,\ /g,';').replace(/\./g,',').replace(/[^\d\:\;\-\,]/g,'').split(';');//.replace(/\,/g,';')
		var ind,ic;
		var chapters={};
		for(ind=0;ind<addr0.length;ind++)
		{
			s=addr0[ind];
			i=s.indexOf(':');
			if(i<0)
			{//chapter only
				if(!isn(s))	return;
				s*=1;
				if(s>iBookMaxChp) return;
				addr.push({c:s});
				chapters[s]=true;
			}
			else
			{//chapter and verses
				ic=s.substring(0,i); if(!isn(ic)) return;
				s=s.substr(i+1);
				//addr.push({c:ic*1});
				//addr[ind]={c:ic*1};
				ic*=1;
				chapters[ic]=true;
				//var v=[];
				s=s.split(',');
				for(j=0;j<s.length;j++)
					if((i=s[j].indexOf('-'))<0)
					{ //one verse
						if(!isn(s[j])) return;
						addr.push({c:ic,v:[s[j]]});
						//v.push(s[j]);
					}
					else
					{//range
						var v=[];
						var i1=s[j].substring(0,i), i2=s[j].substr(i+1);
						if(!isn(i1) || !isn(i2) || i1*1>=i2*1) return;
						for(i=i1*1;i<=i2;i++) v.push(i);
						addr.push({c:ic,v:v});
					}
				//addr[ind].v=v;
			}
		}
		var isBlocks=false;
		var iChapAmt=0; for(i in chapters)  iChapAmt++;//кол-во разных глав
		return {book:iBook, chAmt:iChapAmt, chapters:chapters, addr:addr};
	}
};

/*---------- lwAjx ----------*/
var lwaj_cache=new Array();
function lwAjx(h) {
	//полная очистка
		for(var i=lwaj_cache.length-1;i>=0;i--)
		{
			if(lwaj_cache[i].closed){
				lwaj_cache[i].dispose();
				lwaj_cache[i]=null;
				lwaj_cache.splice(i,1);
			}
		};
	if(lwaj_cache.length==0) LiveWord.chapList={};//очистка прошлых
	
	var o=new lwaj_cls();
	lwaj_cache.push(o);
	o.isSingle=true;
	o.Go(h);
	o=h=req=null;
	};
	
var lwaj_cls= function() {this.initialize.apply(this, arguments)};

lwaj_cls.prototype={
  closed: false
, isSingle:false//одноразовый объект
/* св-ва req:
	status
	responseXML
	responseBody
	responseText
	statusText
	onreadystatechange
	readyState
*/	
, initialize: function(){ }
, Go: function(h){
			var url = h.url;
			//обработка параметров
			if (h.q && h.q.constructor == Object) { var s = ''; for (var i in h.q) s += '&' + i + '=' + escape(h.q[i]); h.q = s.substring(1); } //передан Hash
			//отделяем url от параметров
			var pInd = url.indexOf('?');
			if (pInd > 0) { var p = url.substring(pInd + 1); url = url.substring(0, pInd); h.q = (h.q ? h.q + '&' + p : p); }
			else if (h.q == undefined || h.q=='')  h.q = null;
			
			if (h.q != null) { url += '?' + h.q; }
			delete h.q;
			h.obj=this;
			var scr = document.createElement("SCRIPT");
			scr.ajax_readyState = false;
			scr.onload = this.reqChange(scr,h);
			scr.onreadystatechange = this.reqChange(scr,h);
			scr.src = url;
			document.getElementsByTagName("script")[0].parentNode.appendChild(scr);
	}
, reqChange: function(scr,h){
		return function() {
			if (scr.ajax_readyState)		return;
			//статус ошибки h.onErr не работает
			if (! scr.readyState || scr.readyState == "loaded" || scr.readyState == "complete") {
			scr.ajax_readyState = true;
			//function.apply(scr);
			 //h.on.apply(scr,[h.tag])
			if(h.on) h.on(h.tag);
			//callback.apply(scr, callbackArgsArray)
			scr.parentNode.removeChild(scr);
			h.obj.dispose(); 	h.obj=null; 
			}
		}
	}
/* ---------------------------- */
, dispose: function(){
		this.closed=true;
		this.tag=null;
	}
};


LiveWord.isEvntL=window.addEventListener?true:false;
(window.addEventListener || window.attachEvent)(LiveWord.isEvntL?'load':'onload',LiveWord.onload,false);

LiveWord.lng.ru={
aboutCaption: 'Информация о проекте'
,about: "<br>"
			+"<a href='http://liveword.info/page/Bible.aspx' target='_blank'><img src='" + LiveWord.host + "bn.jpg' align=left width='100' height='143' /></a>"
			+"<center><b>LiveWord Bible " + LiveWord.version + "</b><br><br>Контекстная HTML Библия</center><br>"
			+"<table cellspacing=0 cellpadding=0 class=LiveWordAuthor>"
			+"<tr><td>Автор:</td><td>Никитенко Дмитрий</td></tr>"
			+"<tr><td>Блог:</td><td><a href='http://www.LiveWord.info' target='_blank'>www.LiveWord.info</a></td></tr>"
			+"<tr><td valign='top'>Контакт:</td><td><a href='mailto:bible@LiveWord.info' target='_blank'>bible@LiveWord.info</a></td></tr>"
			+"<tr><td></td><td>&nbsp;</td></tr>"
			+"<tr><td colspan=2 align=center ><a href='http://liveword.info/page/Bible.aspx' target='_blank'>Информация о проекте</a></td></tr>"
			+"</table>"
,invalidAddr:'неверный указатель текста Писания'
,loading:'<center>...идет загрузка...</center>'
,loadPageErr:"<center style='color:maroon;margin-top:10px'>Адрес текста не найден,<br>либо cервер в данный момент недоступен.<br><br>Приносим извинение за неудобства.<br><br>Сообщение об ошибке отправлено администратору</center>"
,loadSrvErr:"<center style='color:maroon;margin-top:10px'>Сервер временно не доступен.<br>Приносим извинение за неудобства.<br><br>Попробуйте позже.</center>"
,chapters:[0,50,40,27,36,34,24,21,4,31,24,22,25,29,36,10,13,10,42,150,31,12,8,66,52,5,48,14,14,3,9,1,4,7,3,3,3,2,14,4,28,16,24,21,28,5,5,3,5,1,1,1,16,16,13,6,6,4,4,5,3,6,4,3,1,13,22]
,books:{'бт':1,'быт':1,'быти':1,'исх':2,'исхо':2,'лев':3,'лв':3,'леви':3,'чис':4,'числ':4,'чс':4,'вт':5,'втор':5,'иис':6,'нав':6,'иисн':6,'иису':6,'иснав':6,'суд':7,'судь':7,'суде':7,'рф':8,'руф':8,'руфь':8,'1цар':9,'2цар':10,'3цар':11,'4цар':12,'1пар':13,'1пр':13,'2пар':14,'2пр':14,'ез':15,'езд':15,'ездр':15,'нм':16,'неем':16,'есф':17,'есфи':17,'иов':18,'иова':18,'пс':19,'псал':19,'псл':19,'прит':20,'пр':20,'еккл':21,'ек':21,'екк':21,'песн':22,'псн':22,'ис':23,'иса':23,'исаи':23,'исай':23,'иер':24,'иере':24,'плач':25,'плч':25,'пл':25,'плие':25,'иез':26,'из':26,'иезе':26,'дан':27,'дн':27,'днл':27,'дани':27,'ос':28,'осия':28,'осии':28,'иоил':29,'ам':30,'амс':30,'амос':30,'авд':31,'авди':31,'ион':32,'иона':32,'ионы':32,'мих':33,'мх':33,'михе':33,'наум':34,'авв':35,'авва':35,'соф':36,'софо':36,'агг':37,'агге':37,'зах':38,'зхр':38,'заха':38,'мал':39,'млх':39,'мала':39,'матф':40,'мтф':40,'мф':40,'мар':41,'марк':41,'мрк':41,'мр':41,'мк':41,'лук':42,'лк':42,'лука':42,'луки':42,'иоан':43,'ин':43,'деян':44,'дея':44,'иак':45,'ик':45,'иако':45,'1пет':46,'1пт':46,'2пет':47,'2пт':47,'1ин':48,'1иоа':48,'2ин':49,'2иоа':49,'3ин':50,'3иоа':50,'иуд':51,'ид':51,'иуда':51,'иуды':51,'рим':52,'римл':52,'1кор':53,'2кор':54,'гал':55,'гала':55,'еф':56,'ефес':56,'фил':57,'флп':57,'фили':57,'кол':58,'коло':58,'1фес':59,'1фс':59,'2фес':60,'2фс':60,'1тим':61,'2тим':62,'тит':63,'титу':63,'флм':64,'флмн':64,'фили':64,'евр':65,'евре':65,'откр':66,'отк':66,'апок':66}}
