/*  -*-mode: Java; coding: latin-1;-*- Time-stamp: "2005-05-13 20:47:10 ADT"

 "Resizeable textarea functions" by Sean M. Burke, sburke@cpan.org, 2005

 You can use, modify, and redistribute this only under the terms of the
 Perl Artistic License: 
  http://www.perl.com/pub/a/language/misc/Artistic.html

*/

var // Configurables:
  tar_Drag_increments = 15, // number of pixels that we grow by

  // Sizes (in pixels) that no draggable textarea should exceed:
  tar_Min_Height =  120,    tar_Min_Width =  120,
  tar_Max_Height = 1400,   tar_Max_Width  = 1400
;

// End of configurables

//==========================================================================
var tar_Textarea, tar_Orig_width, tar_Orig_height, tar_Grip, tar_Cursor_start_x, tar_Cursor_start_y;

function tar_drag_start (event, textarea_id) {
  Textarea = tar_id(textarea_id);

  if(! tar_find_draggable(event) ) return;

  tar_add_class(Grip, "activedrag");

  Cursor_start_x = event.clientX;
  Cursor_start_y = event.clientY;
  Orig_width   = parseInt( Textarea.style.width    , 10 );
  Orig_height  = parseInt( Textarea.style.height   , 10 );

  // Capture mousemove and mouseup events on the page.
  document.addEventListener("mousemove", tar_drag_move, true);
  document.addEventListener("mouseup",   tar_drag_stop, true);

  event.preventDefault();
  return;
}

// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

function tar_drag_move(event) {
  var
   new_width  = event.clientX - Cursor_start_x + Orig_width ,
   new_height = event.clientY - Cursor_start_y + Orig_height;

  new_width  = tar_constrain_range(tar_Min_Width ,new_width , tar_Max_Width,  tar_Drag_increments);;
  new_height = tar_constrain_range(tar_Min_Height,new_height, tar_Max_Height, tar_Drag_increments);;

  Textarea.style.width  = new_width+'px';
  Textarea.style.height = new_height+'px';

  event.preventDefault();
  return;
}

// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

function tar_drag_stop(event) {
  // Stop capturing the mousemove and mouseup events.
  tar_remove_class(Grip, "activedrag");
  document.removeEventListener("mousemove", tar_drag_move, true);
  document.removeEventListener("mouseup",   tar_drag_stop, true);
  return;
}

// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

function tar_constrain_range (min, i, max, incr) {
  if(incr)  i = Math.floor(i/incr) * incr;
  return(
	 (i > max) ? max
	:(i < min) ? min
        : i
  );
}

// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

function tar_find_draggable (event) {
  if(!event)  throw tar_complaining("No event?!");

  var el = event.target;
  if(!el) {
    if(window.event) throw tar_complaining(
"Your browser is too old to allow textarea resizing.  Upgrade at getfirefox.com"
    );
    // Modern browsers implement the DOM Events model, dammit!

    throw tar_complaining("No event target?!");
  }

  //trace("Dragging ", el.tagName, "#", el.id);

  if (el.nodeType == document.TEXT_NODE)  el = el.parentNode;
  while(el) {
    if( el.tagName == "BODY" ) { el = false; break; }
    if( tar_has_class(el, 'draggable') ) break; // found it!
    el = el.parentNode;
  }
  if(!el) return false; // undraggable
  Grip = el;
  return true;
}


// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
// Misc library functions:

function tar_has_class (el, classname) {
  return(
	 (" " + (el.className || '') + " ").indexOf(classname) >= 0
  );
}

function tar_add_class (el, newclass) {
  var classes = (el.className || '').split(" ");
  classes.push(newclass);
  el.className = classes.join(" ");
  return el;
}

function tar_remove_class (el, endclass) {
  if(!el.className) return el;
  var classes = el.className.split(" ");
  for(var i = 0; i < classes.length; i++) {
    if(classes[i] == endclass) classes[i] = '';
  }
  el.className = classes.join(" ");
  return el;
}

function tar_id (name) { // find element with the given ID, else exception.
  var object = tar_id_try(name);
  if( ! object ) throw tar_complaining("Failed to find element with id='"
   + name + "' in " + document.location );
  return object;
}

function tar_id_try (name) {
  var object = document.getElementById(name);
  return object;
}

function tar_complaining () {
  var _ = [];
  for(var i = 0; i < arguments.length; i++) { _.push(arguments[i]) }
  _ = _.join("");
  if(! _.length) out = "Unknown error!?!";
  void alert(_);
  return new Error(_,_);
}

// And a sanity-check:
if(!document.getElementById) throw tar_complaining(
"Your browser is too old to show this page quite right.  Upgrade at getfirefox.com"
);


//End

