/*

	Experimental StretchText Javascript Library
	Eastgate Systems, Inc.
	Mark Bernstein
	October, 2008
	
	© 2008 by Eastgate Systems, Inc. All Rights Reserved.
	bernstein@eastgate.com
	
	Requires Prototype, Scriptalicious

*/	

function hide(targetID) {
	$$('.'+targetID).each(function(e){e.hide();})

	}
	
	
function show(targetID) {		
	$$('.'+targetID).each(function(e){e.show();})
	}
	
// -------- animations


var Stretch=Class.create({
	initialize: function(what){
		this.elements=$$(what);
		},
	empty: function(){
		return (this.elements.length==0);
		},
	only: function(what){
		this.elements=this.hasClass(what)
		},
	hidden: function() {
		return this.elements.select(this.isHidden);
		},
	transient: function() {
		return this.elements.select(this.isTransient);
		},	
	initial: function() {
		return this.elements.select(this.isInitial);
		},	
	notInitial: function() {
		return this.elements.reject(this.isInitial);
		},	
	replacement: function() {
		return this.elements.select(this.isReplacement);
		},	
	hasClass: function(what){
		return this.elements.select(function(e){return e.hasClassName(what)})
		},
	notClass: function(what){
		return this.elements.reject(function(e){return e.hasClassName(what)})
		},
	container: function(id,module){
		return $(id).select(module);
		},
	// -------------------------------------------------------------------------
	reveal: function(list){
		list.each(function(what){what.style.opacity=0;})
		list.each(function(what){what.removeClassName('hidden');})
		list.each(function(what){
//			what.scrollTo();
			what.appear();})	
		},	
	unreveal: function(list){
		list.each(function(what){what.addClassName('hidden');})	
		},		
	highlight: function(list){
		list.each(function(what){what.highlight();})
		},
	install: function(bin,that){
		if (this.empty()) return;
		
		// that is prefixed by the letters 'to'
		// in order to prevent stow() from stowing the link
		if (that.length>2) {
			that='.'+that.substring(3)
			}
				
		var f=this.container(bin,that);		
		if (f.length==0){
			this.stow(bin,that);
			return;
			}
			
		var e=this.elements.reject(this.isLink)
		if (e.length==0)e=this.elements;
		var last=e[e.length-1];	// add the new items after the last item of class 'me'

		f.each(function(what){
			what.remove();
			what.style.opacity=0
			last.insert({after:what});
			last=what;
			if (!what.hasClassName('hidden')){
				what.appear();
				}
			})
		f[0].scrollTo();
		},
	stow: function(container,module){
		var bin=$(container)
		var e=$$(module)
		e.each(function(e){log(e.tagName);e.remove(); bin.appendChild(e);})
		},
		
	// -------------------------------------------------------------------------
	//    initialization
	
	
	make_expander: function(link){
		var classes=$w(link.className)
		if (classes.length<2) {return;}
		var id=classes[1];
		link.onclick=function(){expander('.'+id);return false;}
		},
	make_jump: function make_jump(link){
		var classes=$w(link.className)
		if (classes.length<3) {return;}
		var id=classes[1];
		var dest=classes[2];
		link.onclick=function(){jump('.'+id,'.'+dest);}
		},
		
	make_margin:  function(link) {
		var classes=$w(link.className)
		if (classes.length<2) {return;}
		var id=classes[1];
		link.onclick=function(){margin('.'+id);return false;}
		},


	
	// -------------------------------------------------------------------------
	
	isHidden:	function(node){return node.hasClassName('hidden');},
	isTransient:function(node){return node.hasClassName('transient');},
	isInitial:	function(node){return node.hasClassName('initial');},
	isReplacement:function(node){return node.hasClassName('replacement');},
	isLink:		function(node){return node.tagName.toLowerCase()=='a';},
	});


	
// -------- expander


function expander(what){
	var s=new Stretch(what)
	s.only('expander')
	if (s.empty()) return;
	var showMe=s.hidden();	 
	var hideMe=s.transient();
	s.unreveal(hideMe)
	s.reveal(showMe)
	s.highlight(showMe)
	showMe.each(function(e){e.addClassName('transient')})
	}
	
function margin(what){
	var s=new Stretch(what)
	s.only('margin')
	if (s.empty()) return;
	var showMe=s.hidden();	 
	var hideMe=s.transient();
	s.unreveal(hideMe)
	s.reveal(showMe)
	s.highlight(showMe)
	
	var needOffset=true;
	var me=null;
	var diff=0;
	var initial=$$('a'+what)  // look for the first margin link with this id
	if (initial.length) me=initial[0];
	showMe.each(function(e){
		if ( needOffset && me!=null) {
			diff=e.cumulativeOffset()[1]-me.cumulativeOffset()[1];
			}
		e.style.marginTop -= (diff);
		needOffset=false; 
		})
		
	showMe.each(function(e){
		e.addClassName('transient')
		e.onclick=function(){margin(what);}
		})
	}

function replacer(what){
	var s=new Stretch(what)
	s.only('replacer')
	if (s.empty()) return;
	var showMe=s.hidden();	 
	var hideMe=s.transient();
	s.unreveal(hideMe)
	s.reveal(showMe)
	s.highlight(showMe)
	showMe.each(function(e){e.addClassName('transient')})

	}
	

	
function reset_stretch(what){
	var s=new Stretch(what)
	s.unreveal(s.notInitial())
	s.reveal(s.initial())
	}

	

// ----------  splitter: a two-way replacer

	
function chooser(what,module)
{	
	var s=new Stretch(module)
	var hideMe=s.notClass(what);	
	hideMe=hideMe.reject(function(e) {return s.isLink(e)})
	hideMe=hideMe.reject(function(e){return  s.isInitial(e)&&(!(s.isTransient(e)))})
	s.unreveal(hideMe)
	
	s.reveal(s.replacement())
	s.reveal(s.hasClass(what))
	}	
	

// ----------  take a lexia from the bin == a hidden container == and append it here, or stow it back in the bin

		
function jump(me,that)
{
	var s=new Stretch(me);
	s.install('bin',that)	
	}
	
function stow(that)
{
	var s=new Stretch(that);
	s.stow('bin',that)	
	}
	
// --------- utilities

function log(x){
	window.console.log(x);
	}


// -------- initialization

function initialize_stretchlib() {
	var s=new Stretch('')
	$$('a.expander').each(s.make_expander)
	$$('a.jump').each(s.make_jump)
	$$('a.replacer').each(make_replacer)
	$$('a.chooser').each(make_chooser)
	$$('a.margin').each(s.make_margin)
	}

	
function make_replacer(link)
{
	var classes=$w(link.className)
	if (classes.length<2) {return;}
	var id=classes[1];
	link.onclick=function(){replacer('.'+id);return false;}
	}
	
function make_chooser(link)
{
	var classes=$w(link.className)
	if (classes.length<3) {return;}
	var dest=classes[1];
	var id=classes[2]
	link.onclick=function(){chooser(dest,'.'+id);return false;}
	}
	




Event.observe(window,'load',initialize_stretchlib);

