function observeTextAreas() {
	var TAs = $$('textarea');
	TAs.each(function(ta) {
		if (Element.hasClassName(ta, 'limited')) {
			ta.observe('keypress',function(){
				limitTextArea(ta);
			});	
		} else {
			ta.observe('keypress',function(){
				growTextArea(ta);
			});
		}
	});
}

function growTextArea(ta) {
	var collapsed_size = parseInt(ta.getStyle('height').split('px')[0]);
	var lines = ta.value.split("\n");
	var count = lines.length;
	lines.each(function(line) { 
		count += parseInt(line.length / 20); 
	});
	var rows = parseInt(collapsed_size / 10);
	if (count > rows) {
		ta.style.height = (collapsed_size * 2) + 'px';
	}
	if (count <= rows) {
		ta.style.height = collapsed_size + 'px';
	}
}

function limitTextArea(ta){
	var height = parseInt(ta.rows);
	var width = parseInt(ta.cols);
	var maxlimit = height * width;
	if ($F(ta).length >= maxlimit) {
		$(ta).value = $F(ta).substring(0, maxlimit);
	}
	var remaining = maxlimit - $F(ta).length;
	if (remaining < 20) {
		$('counter').innerHTML = "<strong>"+remaining + " characters remaining</strong>";	
	}else {
		$('counter').innerHTML = remaining + " characters remaining";
	}
		
		
}

function linkBehavior() {
	var links = $$('a.behave');
	links.each(function(l) {
		if (l.hasClassName('toggle') && l.id.match('toggle:')) {
			l.observe('click',function(e) { 
				var parts = l.id.split(':');
				if (parts[2]) {
					new Effect.toggle($(parts[1]),parts[2], {duration:0.3});
				} else {
					$(parts[1]).toggle(); 
				}
				if (l.hasClassName("expander")) {
          if (l.innerHTML == "[hide details]") {
            l.innerHTML = "[show details]";
          } else {
            l.innerHTML = "[hide details]";
          }
				}
				e.stop();
			});
		}
	});
}

function setupExpandOnlyLinks() {
  var links = $$('a.anchor_expand');
  links.each(function(l) {
    l.observe('click', function(e) {
      var parts = l.id.split(':');
      if(parts[1]) {
        $(parts[1]).show();
        $("toggle:" + parts[1] + ":blind").innerHTML = "[hide details]"
      }
    });
  });
}

function setupExpanderLinks() {
  var links = $$('a.expander');
  links.each(function(l) {
    var parts = l.id.split(':');
    if ($(parts[1]).visible()) {
      l.innerHTML = "[hide details]";
    } else {
      l.innerHTML = "[show details]";
    }
  });
}

function setExpanderIcon(expander_elem, content_div) {

}

function setupFormHints() {
	var forms = $$('.form_hinter');
	forms.each(function(f) {
		var inputs = $$('#'+f.id+' input').concat($$('#'+f.id+' textarea'));
		inputs.each(function(i) {
			var sibs = i.siblings();
			sibs.each(function(s) {
				if (s.hasClassName('formhint')) {
					i.observe('focus',function() {
						var i_pos = i.cumulativeOffset();
						var i_viewpos = i.viewportOffset();
						var hint_left = i_pos[0] + i.getWidth() + 10;
						s.setStyle({ left: hint_left+'px', top: i_pos[1]+'px' });
						s.show();
					});
					i.observe('blur',function() {
						s.hide();
					});
					return;
				}
			});
		});
	});
}

Event.observe(window, 'load', function() {
  linkBehavior();
  setupExpanderLinks();
  setupExpandOnlyLinks();
  setupFormHints();
  observeTextAreas();
});