
function str_split ( f_string, f_split_length){
    f_string += '';

    if (f_split_length == undefined) {
        f_split_length = 1;
    }
    if(f_split_length > 0){
        var result = [];
        while(f_string.length > f_split_length) {
            result[result.length] = f_string.substring(0, f_split_length);
            f_string = f_string.substring(f_split_length);
        }
        result[result.length] = f_string;
        return result;
    }
    return false;
}

var Config = {
	speed : 1000
};

var Init = {
	res : null,
	key : null,
	type: null
};

var Styles = {
	showType : function (type) {
		var eff = new Fx.Scroll('flower', {duration: Config.speed, transition: Fx.Transitions.Quint.easeOut});
		eff.toElement('type_'+type);
	},
	createBox : function (inhoud,titel,type) {
		var t = new Element('div',{'class':'box '+type});
		var h2 = new Element('h2',{});
		h2.appendText(titel);
		h2.inject(t);
		t.innerHTML += inhoud;
		t.inject($('res'));
		t.highlight('#ddf');
	},

	convertToReadAble : function (str) {
		var ret = '';
		var split = str_split(str,70);
		for(var i = 0;i<split.length;i++) {
			ret += split[i]+'<br />';
		}

		return ret;
	}
};

var Parse = {
	parseEncrypt : function (text) {
		var obj = JSONP.parse(text);
		if(obj.error == 1) {
			Styles.createBox(obj.result,'ERROR','red');
		} else {

			Init.res = obj.resultstr;
			Init.key = obj.key;

			var text = '<table width="100%"><tr><td>Cryptosysteem:</td><td><span class="mark">'+obj.type+'</span></td></tr>\n';
			text += '<tr><td>Tijd:</td><td>'+obj.time+' s</td></tr>\n';
			text += '<tr><td>Sleutel:</td><td>'+obj.key+'</td></tr></table>\n';
			Styles.createBox(text,'Encrypt mode','blue');
			Styles.createBox(Styles.convertToReadAble(obj.resultstr.toUpperCase()),'Ciphertext','green');

			Form.createDecrypt();
		}
	},
	parseDecrypt : function (text) {
		var obj = JSONP.parse(text);
		if(obj.error == 1) {
			Styles.createBox(obj.result,'ERROR','red');
		} else {
			var text = '<table width="100%"><tr><td>Cryptosysteem:</td><td><span class="mark">'+obj.type+'</span></td></tr>\n';
			text += '<tr><td>Tijd:</td><td>'+obj.time+' s</td></tr>\n';
			text += '<tr><td>Sleutel:</td><td>'+obj.key+'</td></tr></table>\n';
			Styles.createBox(text,'Decrypt mode','blue');
			Styles.createBox(Styles.convertToReadAble(obj.resultstr.toUpperCase()),'Plaintext','green');
		}
	}
};

var JSONP = {
	parse : function (text) {
		return $try(function () {
					return eval('('+text+')');
				});
	}
};

var Loader = {
	show : function () {
		$('loader').setStyle('display','block');
	},
	hide : function () {
		$('loader').setStyle('display','none');
	}
};

var Form = {
	send : function () {
		var selected = $('enc').getSelected().get('value');
		Init.type = selected;
		var url = 'type='+selected;
		switch(selected.getLast()) {
			case "0":
			case "5":
				url += '&key='+escape($('sleutelcrap').get('value'))+'&r='+escape($('rounds').get('value'));
			break;

			case "1":
				url += '&rotatie='+escape($('rotatie').get('value'));
			break;

			case "2":
				url += '&key='+escape($('sleutelvig').get('value'));
			break;

			case "3":
				url += '&pos='+$('posA').getSelected().get('value')+','+$('posB').getSelected().get('value')+','+$('posC').getSelected().get('value');
			break;
		}

		url += '&input='+escape($('input').get('value'));

		var req = new Request({
				url:'loader.php',
				method:'post',
				link:'chain',
				onRequest : function () {
					Loader.show();
					$('res').empty();
				},
				onSuccess : function (text) {
					Parse.parseEncrypt(text);
					Loader.hide();
				}
			});
		req.setHeader('X-HWX','PWS');
		req.send(url);
	},

	createDecrypt : function () {
		var p = new Element('p',{'align':'right'});
		var button = new Element('input',{'type':'button','value':'Decrypt','class':'decrypt'});
		button.inject(p);
		$$('#res .green').each(function (el) {
			p.inject(el);
		});

		button.addEvent('click', function (el) {
			Form.decrypt();
			return false;
		});
	},

	decrypt : function () {
		var url = 'type='+Init.type+'&key='+escape(Init.key)+'&input='+escape(Init.res);
		var req = new Request({
				url:'decrypt.php',
				method:'post',
				link:'chain',
				onRequest : function () {
					Loader.show();
				},
				onSuccess : function (text) {
					Parse.parseDecrypt(text);
					Loader.hide();
				}
			});
		req.setHeader('X-HWX','PWS');
		req.send(url);
	}
};

var Demo = {
	send : false,
	start : function () {
		var url = 'action=demostart&bits='+$('bits').get('value')+'&text='+$('input').get('value');
		var req = new Request({
				url:'demoAjax.php',
				method:'post',
				onRequest : function () {
					Loader.show();
					Demo.send = true;
				},
				onSuccess : function (text) {
					Demo.parse(text);
					Loader.hide();
				}
			});
		req.setHeader('X-HWX','PWS');
		req.send(url);
	},

	parse : function (text) {
		Init.res = JSONP.parse(text);
		if(Init.res == null) {
			alert('FOUT');
			this.reset();
			return;
		}

		if($chk(Init.res.error)) {
			alert('Er is een fout opgetreden');
			alert(Init.res.message);
			return;
		}

		/*this.deel1();
		this.deel2();
		this.deel3();
		this.deel4();
		this.deel5();
		this.deel6();
		this.deel7();*/
	},

	addBlock : function (where,data,kleur) {
		var t = new Element('div',{class:'boxMe '+kleur});
		t.innerHTML = data;
		t.setStyle('opacity',0);
		t.inject($(where));
		t.fade('in');
	},

	deel1 : function () {
		$$('.start').each(function (el) {
			el.setStyle('opacity',0);
			el.fade('in');
		});

	},

	deel2 : function () {
		var dataHan = '<h2>key information</h2>';
		dataHan += '<span class="kop">Public:</span><span class="bol">N:</span>'+str_split(Init.res.han.n,33).join('<br />')+'<br /><span class="bol">E:</span> '+Init.res.han.e+'<br /><span class="kop">Private:</span> <span class="bol">D:</span>'+str_split(Init.res.han.d,33).join('<br />')+'<br /> <span class="bol">P:</span>'+str_split(Init.res.han.p,33).join('<br />')+'<br /><span class="bol">Q:</span> '+str_split(Init.res.han.q,33).join('<br />');
		this.addBlock('han',dataHan,'green');
	},

	deel3 : function () {
		var dataAsjen = '<h2>key information</h2>';
		dataAsjen += '<div id="publicAsjen"><span class="kop">Public:</span><span class="bol">N:</span>'+str_split(Init.res.asjen.n,33).join('<br />')+'<br /><span class="bol">E:</span> '+Init.res.asjen.e+'</div><div id="privateAsjen"><span class="kop">Private:</span> <span class="bol">D:</span>'+str_split(Init.res.asjen.d,33).join('<br />')+'<br /></div> <span class="bol">P:</span>'+str_split(Init.res.asjen.p,33).join('<br />')+'<br /><span class="bol">Q:</span> '+str_split(Init.res.asjen.q,33).join('<br />');
		this.addBlock('asjen',dataAsjen,'green');
	},

	deel4 : function () {
		var data = '<h2>Verzenden voorbereiden</h2>';
		data += '<div id="key2"><span class="bol">key:</span> '+Init.res.key+'<br /></div>';
		data += '<span class="kop">Ciphertext van CRAP</span>';
		data += str_split(Init.res.ciphertext,33).join('<br />')+'<br />';
		data += '<span class="kop">Encrypt key met RSA</span>';
		data += '<div id="usedPublic"><span class="kop">public van asjen:</span><span class="bol">N:</span> '+str_split(Init.res.asjen.n,33).join('<br />')+' (Van Asjen)<br /><span class="bol">E:</span> '+Init.res.asjen.e+'</div>';
		data += '<span class="kop">Resultaat van RSA</span>';
		data += str_split(Init.res.keyRSA.substr(0,200)+' ... (ong. 500 cijfers meer)',33).join('<br />');
		this.addBlock('han',data,'blue');
	},

	deel5 : function () {
		$('usedPublic').morph('.high');
		$('publicAsjen').morph('.high');
	},

	deel6 : function () {
		var data = '<h2>ontvangen verwerken</h2>';
		data += '<span class="kop">Ontvangen CRAP tekst</span>';
		data += str_split(Init.res.ciphertext,33).join('<br />')+'<br />';
		data += '<span class="kop">Ontvangen RSA key</span>';
		data += str_split(Init.res.keyRSA.substr(0,100)+' ... (ong. 600 cijfers meer)',33).join('<br />');
		data += '<span class="kop">decrypt sleutel met rsa</span>';
		data += '<div id="usedPrivate"><span class="kop">Private van asjen</span><span class="bol">D:</span> '+str_split(Init.res.asjen.d,33).join('<br />')+' (Vanuit Private key)<br /></div><div id="usedPublic2"><span class="bol">N:</span> '+str_split(Init.res.asjen.n,33).join('<br />')+'<br /></div>';
		data += '<span class="kop">Decrypted key:</span><div id="key1"><span class="bol">key:</span> '+Init.res.orgRSA + '</div>';
		this.addBlock('asjen',data,'blue');
	},
	deel7 : function () {
		$('privateAsjen').morph('.high2');
		$('usedPublic2').morph('.high');
		$('usedPrivate').morph('.high2');
	},

	deel8 : function () {
		$('key1').morph('.key');
		$('key2').morph('.key');
	},

	deel9 : function () {
		var data = '<h2>Decrypted</h2>';
		data += '<span class="kop">Orginele tekst:</span>';
		data += str_split(Init.res.plaintext,40).join('<br />');
		this.addBlock('asjen',data,'red');
	},

	doKeys : function () {
		if(this.send == true) {
			this.counter++;
			if(this.counter < 10) {
				eval('this.deel'+this.counter+'()');
			} else {
				this.counter--;
			}
		}
	},

	counter : 0,

	reset : function () {
		if(this.send == true) {
			Init.res = null;

			this.send = false;
		}
	}
};
