Object.extend(String.prototype, {
	trim: function() {
		return this.replace(/^\s+|\s+$/g, '');
	},
	isNumber: function() {
		return (this == '') || (/^[0-9]+$/).test(this);
	},	
	isPositive: function() {
		return (this == '') || (/^[1-9]{1}[0-9]*$/).test(this);
	},
	isEmail: function() {
		return (this == '') || ((/^(.*?){1,64}@(.*?){1,256}$/).test(this)); 
	},
	isPercent: function() {
		return (this == '') || ((/^[0-9]{1,3}%?$/).test(this) && (parseInt(this) >= 0) && (parseInt(this) <= 100));
	},
	isNoSpecialChar: function() {
		return (this == '') || ((this.indexOf("\\") == -1 && this.indexOf("/") == -1 && this.indexOf(":") == -1 && this.indexOf("*") == -1 && this.indexOf("?") == -1 && this.indexOf("\"") == -1 && this.indexOf("'") == -1 && this.indexOf("<") == -1 && this.indexOf(">") == -1));
	},
	unescapeTag: function() {
		return this.replace(/&lt;/g, '<').replace(/&gt;/g, '>');
	},
	escapeToInput: function() {
		return this.replace(/\"/g, '&quot;');
	}
});

Object.extend(Number.prototype, {
	currency: function() {
		var n = this.toString();
		var o = '';
		for (var i = (n.length - 3); i >= 0; i -= 3)
			o = ','+n.substr(i, 3)+o;
		i += 3;
		if (i == 0)
			return o.substr(1);
		else
			return n.substr(0, i)+o;
	},

	byteString: function(si) {
		var o = this;
		var s = ['B', 'KB', 'MB', 'GB', 'TB'];
		Object.extend(s, si || []);
		for (var i = 0; i < 5; i++) {
			if ((o > 1024) && (i < 4))
				o /= 1024;
			else
				return Math.round(o).currency()+' '+s[i];
		}
	}
});

Object.extend(Element.Methods, {
	exchangeClassName: function(el, class1, class2) {
		el = $(el);
		if (el.hasClassName(class1)) {
			el.removeClassName(class1);
			el.addClassName(class2);
		}
		else {
			el.addClassName(class1);
			el.removeClassName(class2);
		}
	}
});

Object.extend(Form.Methods, {

	wiseSerialize: function(form, url, options) {
		return url+((String(url).indexOf('?') > -1) ? '&' : '?')+Form.Methods.serialize(form, options);
	},

	getCheckBoxes: function(form, cOptions) {
		var options = { name:'', checked:false };
		Object.extend(options, cOptions || {});

		var boxes = Form.getInputs(form, 'checkbox', options.name);
		if (options.checked) {
			return boxes.findAll ( function ( box, index ) {
				return box.checked;
			});
		} else {
			return boxes;
		}
	},

	checkContents: function(form, defaultMsg) {
		form = $(form);
		var els = Form.getElements(form);

		// default text check
		
		// require check
		var chk = els.detect(function (el, index) {
			if (!el.disabled && (
				(el.getAttribute('require') == 'true') && 
				((el.value.gsub(/[ ]+/, '') == '') || (el.getAttribute('defaulttext') && el.getAttribute('firstclick') == 'None'))
			))
				return true;
		});
		if (typeof chk != 'undefined') {
			Form.Methods._outCheckError(chk, chk.getAttribute('require_msg') || defaultMsg);
			return false;
		}

		// type check
		var chk = els.detect(function (el, index) {
			var istype = el.getAttribute('istype');
			if (!el.disabled && (
				((istype == 'disksize') && (!String(el.value).isNumber() || (Number(el.value) < 0))) ||
				((istype == 'percent') && !String(el.value).isPercent()) ||
				((istype == 'positive') && !String(el.value).isPositive()) ||
				((istype == 'email') && !String(el.value).isEmail()) ||
				((istype == 'nospeicalchar') && !String(el.value).isNoSpecialChar())
			))
				return true;
		});
		if (typeof chk != 'undefined') {
			Form.Methods._outCheckError(chk, chk.getAttribute('istype_msg') || defaultMsg);
			return false;
		}

		return true;
	},

	_outCheckError: function(el, msg) {
		if (el && msg) {
			alert(msg);
			if ((el.getStyle('display') != 'none') && !el.getAttribute('disabled') && (el.getAttribute('type') != 'hidden') && el.focus) {
				try { el.focus(); } catch (e) {}
			}
		}
	},

	send: function(form, url, responser, checkFail) {
		var form = $(form);

		if (form.checkContents())
			isUtil.send(url, Form.Methods.wiseSerialize(form, url), responser);
		else if (checkFail)
			checkFail();
	},

	// modify background for disabled tag
	setDisabledBackground: function(form) {
		var form = $(form);
		if (form) {
			$A(form.elements).each(function (el) {
				var type = el.getAttribute('type');
				if (el.disabled && ((type == "text") || (type == "password") || (type == "file")))
					$(el).setStyle({'backgroundColor' : '#DDDDDD'});
			});
		}
	},

	initDefaultValue: function(form) {
		var delDefaultValue = function (ev) {
			var el = Event.element(ev);
			if (el.getAttribute('default_value_check') == 'true') {
				el.value = '';
			}
		};
		var setDefaultValue = function (ev) {
			var el = Event.element(ev);
			if (el.value == '') {
				el.value = el.getAttribute('default_value');
				el.setAttribute('default_value_check', 'true');
			}
			else {
				el.setAttribute('default_value_check', 'false');
			}
		};

		var form = $(form);
		if (form) {
			$A(form.getInputs('text')).each(function (el) {alert(el.name);
				var defaultValue = el.getAttribute('default_value');
				if (defaultValue != '') {
					el.observe('focus', delDefaultValue);
					el.observe('blur', setDefaultValue);
					if (el.value == '') {
						el.value = defaultValue;
						el.setAttribute('default_value_check', 'true');
					}
					else {
						el.setAttribute('default_value_check', 'false');
					}
				}
			});
		}
	}
});
Element.addMethods();

Object.extend(Event, {
	onLoadQueue: [],
	addOnLoad: function(obj) {
		Event.onLoadQueue.push(obj);
	},
	onLoad: function() {
		$A(Event.onLoadQueue).each(function (func) {
			func();
		});
	}
});
Event.observe(window, 'load', Event.onLoad);