/*************************************************************

 *	SXBB - Select Expand BBcodes MOD v1.0.2

 *

 *	Copyright (C) 2004, Markus (http://www.phpmix.com)

 *	This script is released under GPL License.

 *	Feel free to use this script (or part of it) wherever you need

 *	it ...but please, give credit to original author. Thank you. :-)

 *	We will also appreciate any links you could give us.

 *

 *	Enjoy! ;-)

 *

 *************************************************************/



//

// ADVICE: Editor Settings -> TabSize 4 ;-)

//



function SXBB_IsIEMac()

{

	// Any better way to detect IEMac?

	var ua = String(navigator.userAgent).toLowerCase();

	if( document.all && ua.indexOf("mac") >= 0 )

	{

		return true;

	}

	return false;

}

function SXBB_IsOverflowAble()

{

	// Reliable overflow usage seems to require correct DOM support with some exceptions:

	// - Opera5/6 renders 'auto' as if it was 'visible'. Bang!

	// - IEMac seems to be buggy in some circumstances:

	//   http://sonofhans.net/mac_ie5_bug/

	//

	if( document.getElementById && document.childNodes && !SXBB_IsIEMac() )

	{

		return true;

	}

	return false;

}



function _SXBB(id)

{

	this.id = id;

	this.size = this.min = 70;	// --- Adjust MINIMUM_BLOCK_HEIGHT here :-)

	this.extra = 5;			// --- This is added to height when expanded

	this.margin = 20;		// --- Hide [expand] command if just a few pixels height when expanded.

	this.T = [];

}



_SXBB.prototype.genCmd = function(cmd, txt)

{

	return '&nbsp;[&nbsp;<a href="javascript:void(0)" onclick="SXBB[\''+this.id+'\'].'+cmd+'(\''+txt+'\');" onfocus="this.blur();">'+txt+'</a>&nbsp;]';

}



_SXBB.prototype.writeCmd = function()

{

	var s='';

	if( (document.selection && !SXBB_IsIEMac()) || (document.createRange && (document.getSelection || window.getSelection)) )

	{

		s += this.genCmd('select', this.T['select']);

	}

	if( SXBB_IsOverflowAble() )

	{

		// Actually, the [expand] link will be placed by the onload event (if necessary) :-)

		s += '<span id="'+this.id+'x"></span>';

	}

	document.write(s);	// ‹Select› ‹Expand›

}



_SXBB.prototype.writeDiv = function()

{

	// Use 'overflow:auto;height:#px' only if 'overflow:auto' is supported...

	// Works on IE4+, Mozilla, Opera7, Safari

	// Fails on IEMac, NS4, Opera6-

	//

	var s = ( SXBB_IsOverflowAble() ? 'style="margin: 0px; padding: 0px; overflow: auto; height: '+this.min+'px;"' : 'style="padding: 0px; margin: 0px;"' );

	document.write('<div id="'+this.id+'" '+s+'>');

}



_SXBB.prototype.getObj = function(id)

{

	return ( document.getElementById ? document.getElementById(id) : null );

}



_SXBB.prototype.select = function()

{

	var o = this.getObj(this.id);

	if( !o ) return;

	var r, s;

	if( document.selection && !SXBB_IsIEMac() )

	{

		// Works on: IE5+

		// To be confirmed: IE4? / IEMac fails?

		r = document.body.createTextRange();

		r.moveToElementText(o);

		r.select();

	}

	else if( document.createRange && (document.getSelection || window.getSelection) )

	{

		// Works on: Netscape/Mozilla/Konqueror/Safari

		// To be confirmed: Konqueror/Safari use window.getSelection ?

		r = document.createRange();

		r.selectNodeContents(o);

		s = window.getSelection ? window.getSelection() : document.getSelection();

		s.removeAllRanges();

		s.addRange(r);

	}

}



_SXBB.prototype.resize = function(cmd)

{

	var o = this.getObj(this.id);

	if( !o )

	{

		return;

	}

	var x = this.getObj(this.id+'x');

	if( !x )

	{

		return;

	}



	// First, deal with requested command...

	if( cmd == 'onload' || cmd == 'onresize' )

	{

		if( o.scrollHeight <= this.min ) { x.innerHTML = ''; return; }

		if( x.innerHTML != '' ) { return; }

		if( cmd == 'onload' )

		{

			x.innerHTML = this.genCmd('resize', this.T['expand']);

			return;

		}

		cmd = this.T['contract'];

	}

	if( cmd == this.T['expand'] )

	{

		this.size = o.scrollHeight + this.extra;

		o.style.height = 'auto';

		o.style.overflow = 'visible';

		// Check to conditionally hide the [expand] link, if once expanded, adding [contract] is not really useful.

		x.innerHTML = ( (o.scrollHeight-this.margin) > this.min ? this.genCmd('resize', this.T['contract']) : '' );

	}

	else

	{

		this.size = this.min;

		o.style.height = this.size + 'px';

		o.style.overflow = 'auto';

		x.innerHTML = this.genCmd('resize', this.T['expand']);

	}

	if( cmd != 'onresize' )

	{

		// If necessary, adjust height of outer blocks...

		if( o.parentNode )

		{

			for( o = o.parentNode; o.parentNode; o = o.parentNode )

			{

				if( o.tagName && o.tagName == 'DIV' && o.id && o.id.indexOf('SXBB') == 0 )

				{

					if( !document.all ) SXBB[o.id].resize(this.T['contract']);

					SXBB[o.id].resize(this.T['expand']);

				}

			}

		}

	}

	return false;

}



// --------------------------------------------------------------------------------

// Actually, this script is being included for every instance of a boxed BBCode,

// so... we MUST do something to ensure we only do the job just once!

//

if( typeof(SXBB) == 'undefined' ) {

// --------------------------------------------------------------------------------



var SXBB = [];



// --------------------------------------------------------------------------------

if( SXBB_IsOverflowAble() ) {	// The following is Not necessary on some browsers!

// --------------------------------------------------------------------------------



var SXBB_oldOnLoad = null;

var SXBB_oldOnResize = null;



function SXBB_onLoad()

{

	if( SXBB_oldOnLoad ) { SXBB_oldOnLoad(); SXBB_oldOnLoad = null; }

	//SXBB_evalSize('onload');
	for( var id in SXBB ) SXBB[id].resize(SXBB[id].T['expand']);

}

function SXBB_onResize()

{

	if( SXBB_oldOnResize ) { SXBB_oldOnResize(); SXBB_oldOnResize = null; }

	SXBB_evalSize('onresize');

}

function SXBB_evalSize(cmd)

{

	for( var id in SXBB ) SXBB[id].resize(cmd);

}



if( window.addEventListener )

{

	// The DOM method

	window.addEventListener('load', SXBB_onLoad, false);

	window.addEventListener('resize', SXBB_onResize, false);

}

else if( window.attachEvent )

{

	// The IE Method

	window.attachEvent('onload', SXBB_onLoad);

	window.attachEvent('onresize', SXBB_onResize);

}

else

{

	// The 'legacy' method

	SXBB_oldOnLoad = window.onload;

	SXBB_oldOnResize = window.onresize;

	window.onload = SXBB_onLoad;

	window.onresize = SXBB_onResize;

}



// --------------------------------------------------------------------------------

}	// if( SXBB_IsOverflowAble() )

// --------------------------------------------------------------------------------

}	// if( typeof(SXBB) == 'undefined' )

// --------------------------------------------------------------------------------

