﻿$dl(function () {
		StairwayToHeaven.Init();
		Stair.Init();
});

var StairwayToHeaven={};

StairwayToHeaven.Cache={};

// TODO: from server
StairwayToHeaven.PerPage=9;
StairwayToHeaven.Init=function () {
	StairwayToHeaven.FirstStair=$("contentMenu");
	StairwayToHeaven.AreaWidth=$("content").offsetWidth-$("contentMenu").offsetWidth-9;
	StairwayToHeaven.LoadAncestorSubjects();
};
StairwayToHeaven.LoadAncestorSubjects=function () {
	// need Subject property, so can't assign events only
	//StairwayToHeaven.AssignEvents($("menu"));StairwayToHeaven.AssignEvents($("menu-marketing"));return;

	Mantis.Reut.Code.DAL.AjaxGetSubjectsByParent(
		0,
		Mantis.Reut.Client.Language.LanguageId,
		function (res) {
			var subjects=res.value;
			var contents=[],marketing=[];

			subjects.each(function (s) { (s.IsMarketing ? marketing : contents).push(s); });

			if ($("menu")) {
				$A($("menu").childNodes).each( function (o) { if (o.nodeType==1) $(o).remove(); } );
				StairwayToHeaven.PrintSubjects(contents,$("menu"));
			}

			if ($("menu-marketing")) {
				$A($("menu-marketing").childNodes).each( function (o) { if (o.nodeType==1) $(o).remove(); } );
				StairwayToHeaven.PrintSubjects(marketing,$("menu-marketing"));
			}
		}
	);
};
StairwayToHeaven.PrintSubjects=function (subjects,ul) {
	subjects.each(
		function (s) {
			//if (s.DirectPublicationCount==0 && s.ChildSubjectsCount==0) return;
			var a=_("a",_("li",ul));
			a.innerHTML=s.Header;
			a.hideFocus=true;
			a.href="Default.aspx?SubjectId="+s.SubjectId;
			a.Subject=s;
		}
	);
	StairwayToHeaven.AssignEvents(ul);
};
StairwayToHeaven.AssignEvents=function (el) {
	$(el).observe("click",function (e) {
		var opener=Event.findElementByFunction(e,function (o) { return o.Stair; }) || StairwayToHeaven.FirstStair;
		var a=Event.findElementByFunction(e,function (o) { return o.tagName=="A" && o.Subject; });
		if (a) {
			if (opener.Last) opener.Last.removeClassName("curr");
			opener.Last=a;
			a.Parent=opener;
			$(a).addClassName("curr");

			if ((opener.Stair && opener.Stair.Loaded) || !opener.Stair) StairwayToHeaven.LoadNextStair(a.Subject,opener);
			Event.stop(e);
			return false;
		}
	});
};
StairwayToHeaven.LoadNextStair=function (subject,opener) {
	var stair=new Stair(opener);

	var div=stair.Element;
	
	stair.Wait(true);

	var ul=_("ul",div);
	ul.addClassName("menu");

	//if (subject.HasLobby) {
		var a=_("a",_("li",ul,{ className:"lobby" }));
		a.innerHTML="<strong>"+subject.Header+"</strong> <em>"+Mantis.Reut.Client.Language.GetString("index_lobby")+" &raquo;</em>";
		/*if (!subject.ChildSubjectsCount) */a.href=Site.RootPath+"Default.aspx?SubjectId="+subject.SubjectId;
	//}

	if (subject.ChildSubjectsCount) {
		var cacheKey="AjaxGetSubjectsByParent_"+subject.SubjectId;
		if (StairwayToHeaven.Cache[cacheKey]) {
			stair.Wait(false);
			StairwayToHeaven.PrintSubjects(StairwayToHeaven.Cache[cacheKey],ul);
			stair.Move();
		}
		else {
			stair.Move(function () {
				Mantis.Reut.Code.DAL.AjaxGetSubjectsByParent(
					subject.SubjectId,
					Mantis.Reut.Client.Language.LanguageId,
					function (res) {
						StairwayToHeaven.Cache["AjaxGetSubjectsByParent_"+subject.SubjectId]=res.value;
						stair.Wait(false);
						StairwayToHeaven.PrintSubjects(res.value,ul);
					}
				);
			});
		}
	}
	else {
		div.addClassName("publications");
		div.setStyle({width:StairwayToHeaven.AreaWidth+"px"});

		ul.setStyle({width:"auto"});

		stair.Publications=true;
		stair.Move(function () {
			stair.Wait(false);
			StairwayToHeaven.LoadPublications(subject,1,stair);
		});
	}
	
	Mantis.Reut.Client.OuterShadow.Apply(div,4,8);
	Mantis.Reut.Client.OuterShadow.ApplyBottom(div,4,20);
};
StairwayToHeaven.LoadPublications=function (subject,page,stair,callback) {
	stair.Wait(true);
	Mantis.Reut.Code.DAL.AjaxGetSubjectPublications(
		subject.SubjectId,
		page,
		function (res) {
			StairwayToHeaven.PrintPublications(subject,stair,res.value,page);
			StairwayToHeaven.PrintPublicationsPaging(subject,stair,page);
			if (typeof(callback)=="function") callback();
			stair.Wait(false);
		}
	);
};
StairwayToHeaven.PrintPublications=function (subject,stair,pubs,currentPage) {
	var div=stair.Element;

	var pubList=_("div",div);
	pubList.addClassName("pubList");

	pubs.each(
		function (p) {
			var div=_("div",pubList);
			div.addClassName("pub");

			var typeString='';
			if (Mantis.Reut.Client.Language.Direction==Mantis.Reut.Client.Language.LanguageDirection.RTL) typeString='<div class="typeIcon typeIcon'+p.PublicationType.PublicationTypeId+'" title="'+Mantis.Text.Escape(p.PublicationType.Header)+'"></div><a>'+p.PublicationType.Header+'</a>';
			else typeString='<a>'+p.PublicationType.Header+'</a><div class="typeIcon typeIcon'+p.PublicationType.PublicationTypeId+'" title="'+Mantis.Text.Escape(p.PublicationType.Header)+'"></div>';

			div.innerHTML='\
	<div class="properties">\
		<div class="type">'+typeString+'</div>\
		<div class="date">'+p.PublicationDate.Format(Mantis.Reut.Client.Language.Definitions["clientdateformat"])+'</div>\
	</div>\
	<div>\
		<div class="right"></div>\
		<div class="left">\
			<h2><a href="'+Site.RootPath+'Publication.aspx?PublicationId='+p.PublicationId+'">'+p.MapHeader+'</a></h2>\
		</div>\
	</div>\
	<div class="case" onclick="Case.Add(this,'+p.PublicationId+')" title="'+Mantis.Text.Escape(Mantis.Reut.Client.Language.GetString("link_to_case"))+'"></div>\
			';

			//_("div",div,{ className:"hr" });
		}
	);

	var lastMarkedPub=null;
	Event.observe(
		pubList,
		"mouseover",
		function (e) {
			var pub=Event.findElementByFunction(e,function (o) { return $(o).hasClassName("pub"); });
			if (!pub) return;
			pub.addClassName("over");
			if (lastMarkedPub && lastMarkedPub!=pub) lastMarkedPub.removeClassName("over");
			lastMarkedPub=pub;
		}
	);
	var lastMarkedPub=null;
	Event.observe(
		pubList,
		"mouseout",
		function (e) {
			if (lastMarkedPub) lastMarkedPub.removeClassName("over");
		}
	);

	if (StairwayToHeaven.pubList) StairwayToHeaven.pubList.remove();
	StairwayToHeaven.pubList=pubList;	
};
// TODO: optimize
StairwayToHeaven.PrintPublicationsPaging=function (subject,stair,currentPage) {
	if (stair.Paging) stair.Paging.Element.remove();

	var paging=new Paging(
		Math.ceil(subject.DirectPublicationCount/StairwayToHeaven.PerPage) || 1,
		currentPage,
		function loadFunction(newPage) {
			StairwayToHeaven.LoadPublications(subject,newPage,stair);
		},
		"#SubjectId="+subject.SubjectId+"&Page="
	);

	paging.Print(stair.Element);
	stair.Paging=paging;
};

function Stair(opener) {
	this.Opener=opener;

	var t=this;

	var div=_("div",$("content"));
	div.addClassName("stair");

	//if (Mantis.Reut.Client.Language.Direction==Mantis.Reut.Client.Language.LanguageDirection.RTL) div.setStyle({left:opener.offsetLeft+"px"});
	//else div.setStyle({left:"-10px"});

	div.setStyle({"z-index":opener.getStyle("z-index")-1});
	div.setStyle({left:"-1000px"});

	this.Element=div;
	this.Level=opener.Stair ? opener.Stair.Level+1 : 0;
	div.Stair=this;

	if (StairwayToHeaven.Stack[this.Level]) StairwayToHeaven.RemoveFromLevel(this.Level);
}
Stair.prototype.Move=function (afterFinish,duration) {
	var t=this;

	var div=this.Element;
	div.show();

	StairwayToHeaven.Stack.push(this);
	
	StairwayToHeaven.AreaWidth-=div.offsetWidth;

	Mantis.Reut.Client.OuterShadow.Apply(div,4,8);

	var openerLevel=this.Level-1;

	if (Mantis.Reut.Client.Language.Direction==Mantis.Reut.Client.Language.LanguageDirection.LTR)  div.setStyle({left:((this.Opener.offsetLeft+this.Opener.offsetWidth)-div.offsetWidth)+"px"});
	else div.setStyle({left:this.Opener.offsetLeft+"px"});

	// open
	new Effect.Move(div,{
		x:Mantis.Reut.Client.Language.Direction==Mantis.Reut.Client.Language.LanguageDirection.LTR ? div.offsetWidth : -div.offsetWidth,
		afterFinish:function () {
			t.Loaded=true;
			if (typeof(afterFinish)=="function") afterFinish();
			t.Opened=true;
		},
		duration:duration || .8,
		queue:"end"
	});

	/*if (StairwayToHeaven.Stack.length==1) */
	StairwayToHeaven.ModeOpen(true,div);
};
Stair.prototype.Remove=function (duration,afterFinish) {
	var t=this;
	StairwayToHeaven.Stack.pop();
	var div=this.Element;

	StairwayToHeaven.AreaWidth+=div.offsetWidth;

	// close
	new Effect.Move(div,{
		x:Mantis.Reut.Client.Language.Direction==Mantis.Reut.Client.Language.LanguageDirection.LTR ? -div.offsetWidth : div.offsetWidth,
		afterFinish:function () {
			div.remove();
			if (typeof(afterFinish)=="function") afterFinish();
			try {
				if ((t.Opener.Last.Parent!=t.Opener) || StairwayToHeaven.Stack.length==0) t.Opener.Last.removeClassName("curr");
			}
			catch (ex) {}
			/*if (StairwayToHeaven.Stack.length==0) */
			StairwayToHeaven.ModeOpen(false);
			t.Opened=false;
		},
		duration:duration || this.Publications ? .6 : .4,
		//duration:1,
		//delay:2,
		queue:"end"
	});

	//StairwayToHeaven.ModeOpen(false);
};


StairwayToHeaven.ModeOpen=function (isOpen) {
	Mantis.Reut.Client.ToggleProblematicTagVisibility($("contentMain"),"select",!isOpen);
	if ($("aboveContent")) {
		if (isOpen) $("aboveContent").setAttribute("lastVisibility",$("aboveContent").getStyle("visibility"));
		$("aboveContent").setStyle({visibility:!isOpen ? $("aboveContent").getAttribute("lastVisibility") : "hidden"});
	}
}

Stair.Init=function () {
	var icon=_("div");
	icon.addClassName("icon");
	icon.onclick=function () {
		StairwayToHeaven.RemoveAll();
	};

	Stair.stairIcon=icon;
};
Stair.prototype.Wait=function (start) {
	var icon=Stair.stairIcon;
	this.Element.appendChild(icon);
	icon.className="";
	icon.addClassName("icon");
	icon.addClassName(start ? "wait" : "close");
	icon.innerHTML=Mantis.Reut.Client.Language.GetString(start ? "index_loading" : "index_close");
};
StairwayToHeaven.Stack=[];
StairwayToHeaven.RemoveFromLevel=function (level) {
	for (var i=StairwayToHeaven.Stack.length-1;i>level-1;i--) StairwayToHeaven.Stack[i].Remove();
};
StairwayToHeaven.RemoveAll=function (level) {
	for (var i=StairwayToHeaven.Stack.length-1;i>=0;i--) StairwayToHeaven.Stack[i].Remove();
};
