/*
	Textarea Resizer 0.2
	Allows the user to expand and shrink the height of HTML textareas
	by Chris Barr of Eject Media - http://ejectmedia.net
	Updated and extended to 1.2 by Lennart Pilon - http://ljpilon.nl

	Based on Mootools 1.2 - http://mootools.net

*/

var textareaSizer = {};

textareaSizer = new Class({

	Implements: Options,	
	options: {
		tbResizeAmount:	50,					//amount each button press will resize by
		tbResizeDuration:400,				//how long each resize takes
		tbResizeTransition: Fx.Transitions.Expo.easeOut, //the transition :P
		tbMinHeight: 50, 				//always leave a min size or it looks strange
		tbMaxHeight: false,					//set to false  for no maximum		
		tbMinWidth: 50, 				//always leave a min size or it looks strange
		tbMaxWidth: 600,					//set to false for no maximum
		tbDescription: '<span class="smaller">Resize textarea: </span>',	//text to display next to the buttons
		tbDragDescription: '<span class="smaller">Drag textarea to resize </span>',	//text to display next to the buttons
		tbSkipClass: 'nogrow',			//a class defined on textareas that you do NOT want to resize
		imgHeightGrow: '/images/arrow-down.gif',	// I like silk icons
		imgHeightShrink: '/images/arrow-up.gif',		// check http://famfamfam.com
		imgWidthGrow: 'arrow_right.png',	// I like silk icons
		imgWidthShrink: 'arrow_left.png',		// check http://famfamfam.com
		autoSize: true,				// if you want to expand a textarea which already has content (only vertical)
		sizeWidth: false,		// resize horizontal
		sizeHeight: true,		// resize vertical
		sizeDrag: false		// resize by dragging
	},
	initialize: function(options){
		
		options = $merge(this.options, options);
		this.setOptions(options);
		this.makeButtons(options);
	},
	makeButtons: function(options) {
		options = $merge(this.options, options);
		
		//make new arrays of elements
		tbEffects	= [];
		tbHeightGrowers	= [];
		tbHeightShrinkers = [];
		tbWidthGrowers	= [];
		tbWidthShrinkers = [];

		//select each textarea without the class to skip
		$$('textarea').each(function(textbox,i){
			if (!textbox.hasClass(options.tbSkipClass)){

				//create the elements
				wrapper = new Element('div').addClass('tbWrapper').setStyle('width',textbox.getStyle('width')).wraps(textbox);
				sizerWrapper = new Element('div').addClass('tbSizeChanger').injectAfter(textbox);
				// width
				if (options.sizeWidth) {
					tbWidthGrowers[i] = new Element('img').setStyles({'float':'right','display':'block'}).setProperty('src',options.imgWidthGrow).addClass('tbLarger').injectInside(sizerWrapper); 
					tbWidthShrinkers[i] = new Element('img').setStyles({'float':'right','display':'block'}).setProperty('src',options.imgWidthShrink).addClass('tbSmaller').injectInside(sizerWrapper);
				}
				// height
				if (options.sizeHeight) {
					tbHeightGrowers[i] = new Element('img').setStyles({'float':'right','display':'block'}).setProperty('src',options.imgHeightGrow).addClass('tbLarger').injectInside(sizerWrapper); 
					tbHeightShrinkers[i] = new Element('img').setStyles({'float':'right','display':'block'}).setProperty('src',options.imgHeightShrink).addClass('tbSmaller').injectInside(sizerWrapper);
				}

				// insert wrapper
				if (options.sizeWidth || options.sizeHeight || options.sizeDrag) {
					if (options.sizeDrag) {
						options.tbDescription = options.tbDragDescription;
					}
					new Element('div').addClass('tbSizeText').set('html', options.tbDescription).setStyle('float','right').injectInside(sizerWrapper);
					new Element('div').setStyle('clear','both').injectInside(sizerWrapper);
				}
				
				//create new effect
				tbEffects[i] = new Fx.Morph(textbox, {duration: options.tbResizeDuration ,transition: options.tbResizeTransition});
				
				//add click events
				// width
				if (options.sizeWidth) {
					tbWidthGrowers[i].addEvent('click', function(ev){
						new Event(ev).stop();
						toSize = textbox.getStyle('width').toInt()+options.tbResizeAmount;
						if(toSize >= options.tbMaxWidth && options.tbMaxWidth !=0){
							tbEffects[i].start({'width': options.tbMaxWidth, onComplete: function () {textbox.getParent().setStyle('width',options.tbMaxWidth);}});
						}else{
							tbEffects[i].start({'width': toSize, onComplete: function () {textbox.getParent().setStyle('width',toSize);}});
						}
					});
					tbWidthShrinkers[i].addEvent('click', function(ev){
						new Event(ev).stop();
						toSize = textbox.getStyle('width').toInt()-options.tbResizeAmount;
						if(toSize <= options.tbMinWidth){
							tbEffects[i].start({'width': options.tbMinWidth, onComplete: function () {textbox.getParent().setStyle('width',options.tbMinWidth);}});
						}else{
							tbEffects[i].start({'width': toSize, onComplete: function () {textbox.getParent().setStyle('width',toSize);}});
						}
					});
				}

				// height
				if (options.sizeHeight) {
					tbHeightGrowers[i].addEvent('click', function(ev){
						new Event(ev).stop();
						toSize = textbox.getStyle('height').toInt()+options.tbResizeAmount;
						if(toSize >= options.tbMaxHeight && options.tbMaxHeight !=0){
							tbEffects[i].start({'height': options.tbMaxHeight});
						}else{
							tbEffects[i].start({'height': toSize});
						}
					});
					tbHeightShrinkers[i].addEvent('click', function(ev){
						new Event(ev).stop();
						toSize = textbox.getStyle('height').toInt()-options.tbResizeAmount;
						if(toSize <= options.tbMinHeight){
							tbEffects[i].start({'height': options.tbMinHeight});
						}else{
							tbEffects[i].start({'height': toSize});
						}
					});
				}

				// drag
				if (options.sizeDrag) {					
					textbox.makeResizable({
						limit: {x: [options.tbMinWidth, options.tbMaxWidth], y: [options.tbMinHeight, options.tbMaxHeight]},
						onComplete: function(el){
							el.getParent().setStyle('width',el.getStyle('width'));
						}
					});
					textbox.setStyle('cursor', 'move');
						
				}
				if (options.autoSize) {
					if ( textbox.getScrollSize()['y'] > options.tbMinHeight) {
						new Fx.Morph(textbox, {duration: options.tbResizeDuration ,transition: options.tbResizeTransition}).start({'height': textbox.getScrollSize()['y'] + options.tbMinHeight});
					}
				}
			}					 					 
		});
	}
});