
Object.extend(Element, {
	getWidth: function(element) {
	   	element = $(element);
	   	return element.offsetWidth;
	},
	setWidth: function(element,w) {
	   	element = $(element);
    	element.style.width = w +"px";
	},
	setHeight: function(element,h) {
   		element = $(element);
    	element.style.height = h +"px";
	},
	setTop: function(element,t) {
	   	element = $(element);
    	element.style.top = t +"px";
	},
	setSrc: function(element,src) {
    	element = $(element);
    	element.src = src;
	},
	setHref: function(element,href) {
    	element = $(element);
    	element.href = href;
	},
	setInnerHTML: function(element,content) {
		element = $(element);
		element.innerHTML = content;
	}
});

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}

Element.append = function(element, content) {
    var previousContent = $(element).innerHTML;
    Element.update(element, previousContent + content);
}



//form unserializer: http://dev.rubyonrails.org/attachment/ticket/5902/sf_function.diff
Form.Element.setValue =  function(element, value) {
    element = $(element);
    //var method = element.tagName.toLowerCase();
    //Form.Element.Unserializers[method](element, value);
    Form.Element.Unserializers.input(element, value);
}
var $SF = Form.Element.setValue;

Form.Element.Unserializers = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'submit':
      case 'hidden':
      case 'password':
      case 'text':
        return Form.Element.Unserializers.textarea(element, value);
      case 'checkbox':
      case 'radio':
        return Form.Element.Unserializers.inputSelector(element, value);
      case 'select-one':
        return Form.Element.Unserializers.selectOne(element, value);
    }
    return false;
  },

  inputSelector: function(element, value) {
    element.checked = value;
  },

  textarea: function(element, value) {
    element.value = value;
  },

  select: function(element, value) {
    return Form.Element.Unserializers[element.type == 'select-one' ?
      'selectOne' : 'selectMany'](element, value);
  },

  selectOne: function(element, value) {
    element.value = value;
  },

  selectMany: function(element, value) {
    var option;
    for (var i = 0; i < element.options.length; i++) {
      option = element.options[i];
      option.selected = value.indexOf(option.value || option.text) != -1;
    }
  }
}
//form unserialize:
Form.unserialize = function(form, serializedData) {
    serializedData.keys().each(function(key) {
        $SF(form[key], serializedData[key]);
    });
}

// Array.insert( index, value ) - Insert value at index, without overwriting existing keys
Array.prototype.insert = function( i, v ) {
 if( i>=0 ) {
  var a = this.slice(), b = a.splice( i );
  a[i] = v;
  return a.concat( b );
 }
};

Event.KEY_ESC = 27;
Event.KEY_SPACE = 32;


Position.center = function(element) {
    var options = Object.extend({
        zIndex: 999,
        update: false
    }, arguments[1] || {});
    element = $(element)
    if(!element._centered) {
        Element.setStyle(element, {position: 'absolute', zIndex: options.zIndex });
        element._centered = true;
    }
    var dims = Element.getDimensions(element);
    Position.prepare();
    var winSize = document.viewport.getDimensions();
    var winWidth = winSize.width;
    var winHeight = winSize.height;
    var offLeft = (Position.deltaX + Math.floor((winWidth - dims.width) / 2));
    var offTop = (Position.deltaY + Math.floor((winHeight - dims.height) / 2));
    element.style.top = ((offTop != null && offTop > 0) ? offTop : '0') + 'px';
    element.style.left = ((offLeft != null && offLeft > 0) ? offLeft : '0') + 'px';
    if(options.update) {
        Event.observe(window, 'resize', function(evt) {
            Position.center(element);
        }, false);
        Event.observe(window, 'scroll', function(evt) {
            Position.center(element);
        }, false);
    }
}





