var MeincUtil = Class.create();

MeincUtil.UNDEFINED_VALUE;
MeincUtil.getBool = function (val, deflt)
{
	if (val == true || val == false)
		return val;

	if (deflt == MeincUtil.UNDEFINED_VALUE || deflt == null)
		deflt = false;

	if (val == MeincUtil.UNDEFINED_VALUE || val == null)
		return deflt;
	else
		return val.toLowerCase() == 'true';
};

MeincUtil.createDropShadow = function(el, shadowColor)
{
	el = $(el);
	var foreColor = el.getStyle("color");
  var txt = el.innerHTML;
  var str = '<span style="position: absolute;color: ' + shadowColor + ';margin-top: 0.06em;margin-left: 0.08em;">' + txt + '</span>' +
            '<span style="position: relative;color: ' + foreColor + '">' + txt + '</span>';
  el.update(str);
}

MeincUtil.insertAtCaret = function (el, text, pre, post, message) 
{
	if (!el) return;
	
	var getText = function (text, pre, post, message) 
	{
		if (text == undefined || text == null) {
			if (message == undefined)
				message = "Enter text to insert";
			text = prompt (message,"");
		}
		if (pre != undefined) 
			text = pre + text;
		if (post != undefined)
			text += post;
		return text;
	}
	
	el.focus();
	if (document.selection) {
		// IE case
		var sel = document.selection.createRange();
		sel.text = getText(text, pre, post, message);
	} else if (el.selectionStart || el.selectionStart == '0') {
		// Mozilla, Netscape, other case
		var startPos = el.selectionStart;
		var endPos = el.selectionEnd;
		var previous = el.value;
		var newText = getText(text, pre, post, message);
		el.value = previous.substring(0, startPos) + newText + previous.substring(endPos);
		el.selectionStart = startPos + newText.length;
		el.selectionEnd = el.selectionStart;
	} else {
		// Fallback to append
		el.value += getText(text, pre, post, message);
	}
	el.focus();
}

Element.addMethods(
{
	makeUnselectable: function(element,cursor)
	{
		cursor = cursor || 'default';
		element.onselectstart = function() {return false;};
    element.unselectable = "on";
    element.style.MozUserSelect = "none";
    element.style.cursor = cursor;
		return element;
	},
	makeSelectable: function(element)
	{
		element.onselectstart = function() {return true;};
    element.unselectable = "off";
    element.style.MozUserSelect = "";
    element.style.cursor = "inherit";
		return element;
	}
});

FlexField = Class.create();
FlexField.prototype =
{
  initialize: function(element, options)
  {
    this.element = $(element);
    this.size = parseFloat(this.element.getStyle('height') || '100');
    this.options = Object.extend({
        inScreen: true,
        resizeStep: 10,
        minHeight: this.size,
        onResize: Prototype.emptyFunction
    }, options || {});

    Event.observe(this.element, "keyup", this.resize.bindAsEventListener(this));

    if (!this.options.inScreen)
        this.element.style.overflow = 'hidden';

    this.element.setAttribute("wrap", "virtual");
    this.resize();
  },
  resize : function()
  {
    this.shrink();
    this.grow();
  },
  shrink : function()
  {
    if (this.size <= this.options.minHeight)
      return;

    if (this.element.scrollHeight <= this.element.clientHeight)
    {
      this.size -= this.options.resizeStep;
      this.element.style.height = this.size + "px";
      this.shrink();
      this.options.onResize();
    }
  },
  grow : function()
  {
    if (this.element.scrollHeight > this.element.clientHeight)
    {
      if (this.options.inScreen &&
          (20 + this.element.offsetTop + this.element.clientHeight) > document.body.clientHeight)
	      return;

      this.size += (this.element.scrollHeight - this.element.clientHeight) + this.options.resizeStep;
      this.element.style.height = this.size + "px";
      this.grow();
      this.options.onResize();
    }
  }
}