function Email() {
	if (Email.__instance__) {
		return Email.__instance__;
	} else {
		Email.__instance__ = this;
	}
	this.availableChars = 'abcdefghijklmnopqrstuvwxyz0123456789';
	this.unavailableChars = '_- ';

	this.encipher = function(plainText) {
		plainText = plainText.toLowerCase();
		var ciperedText = "";
		for (var i=0; i<plainText.length; i++) {
			ciperedText = ciperedText + this.encipherChar(plainText.charAt(i), plainText.length, true);
		}
		return ciperedText;
	}

	this.encipherChar = function(baseChar, shiftIndex) {
		if (this.unavailableChars.indexOf(baseChar) > -1) {
			return baseChar;
		}
		if (baseChar == '@') {
			return '$';
		}	
		if (baseChar == '.') {
			return '#';
		}			
		var shiftSum = shiftIndex + this.availableChars.indexOf(baseChar);
		return (this.availableChars.charAt((shiftSum < this.availableChars.length) ?
				shiftSum : (shiftSum % this.availableChars.length)));
	}


	this.decipher = function(ciperedText) {
		ciperedText = ciperedText.toLowerCase();
		var plainText = "";
		for (var i=0; i<ciperedText.length; i++) {
			plainText = plainText + this.decipherChar(ciperedText.charAt(i), ciperedText.length, false);
		}
		return plainText;
	}

	this.decipherChar = function(baseChar, shiftIndex) {
		if (this.unavailableChars.indexOf(baseChar) > -1) {
			return baseChar;
		}
		if (baseChar == '$') {
			return '@';
		}	
		if (baseChar == '#') {
			return '.';
		}
		var shiftDifference = this.availableChars.indexOf(baseChar) - shiftIndex;
		return (this.availableChars.charAt((shiftDifference < 0) ?
				shiftDifference + this.availableChars.length : shiftDifference));
	}
	
	this.getMailTo = function(cipheredAddress) {
		parent.location = "ma" + "il" + "to" + ':' + this.decipher(cipheredAddress);
	}
	this.writeMailToLink = function(title, cipheredAddress) {
		document.write('<a href="javascript:new Email().getMailTo(\''+cipheredAddress+'\');" onmouseover="window.status=\'E-Mail us!\';return true;" onmouseout="window.status=\'\'">'+title+'</a>')
	}
}
Email.__instance__ = null;
