﻿// -- core --

Object.extend = function(object, base){
	for(var property in base){
		object[property] = base[property];
	}
	return object;
};

// -- Array --

var $break = function(){ throw $break; };
var $continue = function(){ throw $continue; };
var Enumerable = {
	each: function(iterator){
		try{
			for(var i = 0; i < this.length; i++){
				try{
					iterator(this[i], i);
				}catch(e){
					if(e != $continue) throw e;
				}
			}
		}catch(e){
			if(e != $break) throw e;
		}
	},
	indexOf: function(object){
		for(var i = 0; i < this.length; i++){
			if(this[i] == object) return i;
		}
		return -1;
	},
	clone: function(){
		return [].concat(this);
	}
};

Object.extend(Array.prototype, Enumerable);

// -- String.prototype --

// html escape
String.prototype.escapeHTML = function(){
	return this.replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
};

// -- shorthands --

// getElementById
function $(id){
	return document.getElementById(id);
}
// getElementsByName + Enumerable
function $N(name){
	return $A(document.getElementsByName(name));
}
// getElementsByTagName + Enumerable
function $T(tag){
	return $A(document.getElementsByTagName(tag));
}
// extends Enumerable
function $A(list){
	return Object.extend(list, Enumerable);
}
// createElement
function newNode(tag){
	return document.createElement(tag);
}
// createTextNode
function newText(text){
	return document.createTextNode(text);
}

