/**
 * Foldable Class
 *
 * Objects of the Foldable class are used to create HTML containers that
 * can be folded, and of course unfolded. The Foldable(s) will animate the 
 * HTML container into the (un)folded view. This class uses the YAHOO's
 * YUI Library (developer.yahoo.com/yui) for DOM functions and animation.
 *
 * @author Tom Bauwens
 * @package RedCMS Javascript
 */
Foldable = function(el,unfolded,folded){ this.init(el,unfolded,folded); }
Foldable.prototype = {
	init: function(el,unfolded,folded,initState){
		this.EL = el; this.unfoldedEL = unfolded || el+'Unfolded';
		this.foldedEL = folded || el+'Folded';
		this.region = YAHOO.util.Dom.getRegion(el);
		this.unfoldedHeight = this.region['bottom']-this.region['top'];
		this.foldedHeight = 0;
		this.foldCookie = new REDCookie(el);
		var st = this.foldCookie.readValue();
		if( st && (st=='folded'||st=='unfolded') ) this.foldState = st;
		else if( initState && (initState=='folded'||initState=='unfolded') )  this.foldState = st;
		else this.foldState = 'folded';
		if(this.foldState=='folded') this.fold(false); else this.unfold(false);
	},
	fold: function(ani){
		if(ani){
			YAHOO.util.Dom.setStyle(this.unfoldedEL,'display','none');
			YAHOO.util.Dom.setStyle(this.EL,'height',this.unfoldedHeight);
			YAHOO.util.Dom.setStyle(this.foldedEL,'display','block');
			this.calcFoldedHeight();
			var anim = new YAHOO.util.Anim(this.EL);
			anim.attributes.height = { to: this.foldedHeight };
			anim.method = YAHOO.util.Easing.easeOut;
			anim.duration = 0.25; anim.animate();
		} else {
			YAHOO.util.Dom.setStyle(this.unfoldedEL,'display','none');
			YAHOO.util.Dom.setStyle(this.foldedEL,'display','block');
			this.calcFoldedHeight();
		}
		this.foldCookie.writeValue('folded');
	},
	unfold: function(ani){
		if(ani){
			YAHOO.util.Dom.setStyle(this.foldedEL,'display','none');
			YAHOO.util.Dom.setStyle(this.EL,'height',this.foldedHeight);
			var anim = new YAHOO.util.Anim(this.EL);
			anim.attributes.height = { to: this.unfoldedHeight };
			anim.method = YAHOO.util.Easing.easeOut;
			anim.duration = 0.25;
			anim.animate();
			anim.onComplete.subscribe(this.onUnfolded,this);
		} else {
			YAHOO.util.Dom.setStyle(this.foldedEL,'display','none');
			YAHOO.util.Dom.setStyle(this.unfoldedEL,'display','block');
		}
		this.foldCookie.writeValue('unfolded');
	},
	calcFoldedHeight: function(){
		if(this.foldedHeight==0){
			var r = YAHOO.util.Dom.getRegion(this.foldedEL);
			this.foldedHeight = r['bottom']-r['top'];
		}
	},
	onUnfolded: function(state,anistring,t){
		YAHOO.util.Dom.setStyle(t.unfoldedEL,'display','block');
	}
};


/**
 * REDCookie Class
 *
 * This class provides an interface to create/edit/delete cookies from JS Code
 *
 * @author Tom Bauwens
 * @package RedCMS Javascript
 */
REDCookie = function(cookieName){ this.init(cookieName); }
REDCookie.prototype = {
	init: function(cookieName){
		// alert('init()');
		this._cookieName = cookieName;
	},
	writeValue: function(value,nDate,nDateModifier)
	{
		var expires = ( nDate && nDateModifier ) ? "; expires="+this._calcExpireDate(nDate,nDateModifier) : '';
		document.cookie = this._cookieName+"="+value+expires+"; path=/";
	},
	readValue: function(){
		var nameEQ = this._cookieName + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++)
		{
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return false;
	},
	_calcExpireDate: function(n,_modifier){
		// alert('_calcExpireDate()');
		switch(_modifier.toLowerCase())
		{
			case 'days': n = parseInt(n)*24*60*60*1000; break;
			default: n = parseInt(n); break;
		}
		var date = new Date();
		date.setTime(date.getTime()+n);
		return date.toGMTString();
	}
};

/**
 * RatingInterface Class
 *
 * The RatingInterface class is used to mount interface control(s) that introduce 1-5 star ratings.
 *
 * @author Tom Bauwens
 * @package RedCMS Javascript
 */
RatingInterface = function(_name){ this.init(_name); }
RatingInterface.prototype = {
	init: function(_name)
	{
		this._name = _name;
		this._initPhrase = '';
		this._star = new Array();
		for( var i=0; i<5; i++ )
		{
			this._star[i] = { FILLED: false, FULL: false };
		}
	},
	setStar: function(n,fi,fu)
	{
		this._star[(n-1)] = { FILLED: fi, FULL: fu };
	},
	hover: function(n)
	{
		for( var i=1; i<6; i++ )
		{
			var e = document.getElementById(this._name+'_'+i);
			if(e)
			{
				starimg = 'img/star';
				if(n>=i)  starimg += '_fill';
				else starimg += '_vote';
				starimg += '.gif';
				e.src = starimg;
			}
		}
		var e = document.getElementById(this._name+'_display');
		if(e) e.innerHTML = n;
	},
	showInitState: function()
	{
		for( var i=0; i<5; i++ )
		{
			var e = document.getElementById(this._name+'_'+(i+1));
			if(e)
			{
				var im = 'img/star';
				if(this._star[i]['FILLED'])
				{
					im += '_fill';
					if(!this._star[i]['FULL']) im += '_half';
				}
				im += '.gif';
				e.src = im;
			}
		}
		var e = document.getElementById(this._name+'_display');
		if(e) e.innerHTML = this._initPhrase;
	},
	setInitPhrase: function(p)
	{
		this._initPhrase = p;
	}
};

/**
 * HTMLString Class
 *
 * This class provides methods to perform operations on a HTML String
 *
 * @author Tom Bauwens
 * @package RedCMS Javascript
 */
HTMLString = function(_html){ this.init(_html); }
HTMLString.prototype = {
	init: function(_html)
	{
		this._html = _html;
	},
	getJS: function()
	{
		var s1 = this._html.search(/<script[^>]*>/);
		if(s1>0)
		{
			var s2 = this._html.indexOf('<\/script>',s1);
			if(s2>0&&s2>s1)
			{
				var s1 = this._html.indexOf('>',s1);
				if(s1>0)
				{
					s1 ++;
					var js  = this._html.substring(s1,s2);
					s1 = js.indexOf('<!--');
					if(s1>0)
					{
						js = js.substring(s1+4,js.length);
					}
					return js;
				}
			}
		}
		
		return false;
	}
}
