/*!
Copyright (C) 2009 AD: Daniel Lear all Rights Reserved.
This software is the proprietary information of Daniel Lear.
Use is subject to strict licensing terms and requires
written permission from the owner.
dwlear@gmail.com
@author Daniel Lear
*/

var VernamCipher =
{
	key:'',
	range:'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@-_.',
	msg:'',
	
	setKey:function(k)
	{
		this.key = k
	},
	keyAt:function(i)
	{
		if(i !== parseInt(i))
		{
			alert('keyAt error')
			return false;
		}
		var len = this.key.length-1
		while(i>len) i -= len
		return this.key[i];
	},
	decrypt:function(str)
	{
		this.msg = str
		var i = 0,
			k = 0,
			len = str.length,
			out = ''
		while(i<len)
		{
			out += this.take(str[i], this.keyAt(i))
			i++
		}
		return out;
	},
	encrypt:function(str)
	{
		this.msg = str
		var i = 0,
			k = 0,
			len = str.length,
			out = ''
		while(i<len)
		{
			out += this.combine(str[i], this.keyAt(i))
			i++
		}
		return out;
	},
	combine:function(c,k)
	{
		var i = this.getNum(c) + this.getNum(k)
		if(i>=this.range.length) i -= this.range.length
		return this.getChr(i)
	},
	take:function(c,k)
	{
		var i = this.getNum(c) - this.getNum(k)
		if(i<0) i += this.range.length
		return this.getChr(i)		
	},
	getNum:function(chr)
	{
		var i = 0,
			len = this.range.length
		do{
			if(chr==this.range[i++])
				return i;
		}while(i<len);
		alert('getNum error: '+this.msg)
		return false;
	},
	getChr:function(i)
	{
		if(i !== parseInt(i))
		{
			alert('getChr null error')
			return false;
		}
		if(i<0 || i>=this.range.length)
		{
			alert('getChr length error:'+i)
			return false;
		}
		return this.range[i];
	}
}

