﻿// Scripting: Hendrik Muus

// letters will be replaced with digits
repl = new Array (	"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
			"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
		 	"10","11","12","13","14","15","16","17","18","19","20","21","22",
		 	"23","24","25","26","27","28","29","30","31","32","33","34","35");

// country codes, fixed length for those countries, appliance of EU REGULATION 2560/2001 and IBAN example
ilbc = new Array (	"AD","AT","BA","BE","BG","CH","CS","CY","CZ","DE","DK","EE","ES","FI","FO","FR","GB","GI","GL","GR",
			"HR","HU","IE","IS","IT","LI","LT","LU","LV","MC","MK","MT","NL","NO","PL","PT","RO","SE","SI","SK",
			"SM","TN","TR",
			 24,  20,  20,  16,  22,  21,  22,  28,  24,  22,  18,  20,  24,  18,  18,  27,  22,  23,  18,  27,
			 21,  28,  22,  26,  27,  21,  20,  20,  21,  27,  19,  31,  18,  15,  28,  25,  24,  24,  19,  24,
			 27,  24,  26,
			"n", "y", "n", "y", "n", "n", "n", "y", "y", "y", "y", "y", "y", "y", "n", "y", "y", "y", "n", "y",
			"n", "y", "y", "y", "y", "y", "y", "y", "y", "n", "n", "y", "y", "y", "y", "y", "n", "y", "y", "y",
			"n", "n", "n",
			"AD1200012030200359100100","AT611904300234573201","BA391290079401028494","BE68539007547034",
			"BG33AAAA12311012345678","CH9300762011623852957","CS73260005601001611379","CY17002001280000001200527600",
			"CZ6508000000192000145399","DE89370400440532013000","DK5000400440116243","EE382200221020145685",
			"ES9121000418450200051332","FI2112345600000785","FO7630004440960235","FR1420041010050500013M02606",
			"GB29NWBK60161331926819","GI75NWBK000000007099453","GL4330003330229543","GR1601101250000000012300695",
			
			"HR1210010051863000160","HU42117730161111101800000000","IE29AIBK93115212345678","IS140159260076545510730339",
			"IT60X0542811101000000123456","LI21088100002324013AA","LT121000011101001000","LU280019400644750000",
			"LV80BANK0000435195001","MC...","MK07300000000042425","MT84MALT011000012345MTLCAST001S",
			"NL91ABNA0417164300","NO9386011117947","PL27114020040000300201355387","PT50000201231234567890154",
			"RO49AAAA1B31007593840000","SE3550000000054910000003","SI56191000000123438","SK3112000000198742637541",
			
			"SM59Z0322509800000001400123","TN5914207207100707129648","TR330006100519786457841326");

// we have currently # countries
ctcnt = ilbc.length/4;

// we have currently # alert texts
atcnt = 11;

// gets the country name 
function rcty(tnum) { return ctynm[tnum+ctcnt*(lngg-1)]; }

//gets the error text
function ralt(tnum) { return altxt[tnum+atcnt*(lngg-1)]; }

// the magic core routine
function checkibancore(iban) {
	illegal = /\W|_/; // contains chars other than (a-zA-Z0-9) 
	if (illegal.test(iban)) {
		displayResult(ralt(0)); // yes, alert and exit
	} else { // no, continue
		illegal = /^\D\D\d\d.+/; // first chars are letter letter digit digit
		if (illegal.test(iban) == false) {
			displayResult(ralt(1)); // no, alert and exit
		} else { // yes, continue
			illegal = /^\D\D00.+|^\D\D01.+|^\D\D99.+/; // check digit are 00 or 01 or 99
			if (illegal.test(iban)) {
				displayResult(ralt(2)); // yes, alert and exit
			} else { // no, continue
				iban = iban.toUpperCase(); // uppercase, to ease
				cntry = iban.substr(0,2); // fetch country
				lofi = 6; // "default" length of IBAN
				for (i = 0; i < ctcnt; i++) {	if (cntry == ilbc[i]) { lofi = ilbc[ctcnt+i]; ctck=i; }}  // yes, country respected
				if (lofi == 6) { // no, alert
					displayResult(ralt(3)+cntry+ralt(4)); 
					lofi = iban.length;
				} else {
					if ((iban.length-lofi) != 0) { // fits length to country
						displayResult(ralt(5)+rcty(ctck)+ralt(6)+ilbc[ctck+ctcnt]+ralt(7)); // no, alert and exit
					} else { // yes, continue
						iban = iban.substr(4,lofi-4) + iban.substr(0,4); // country and check digits to the end
						for (i = 0; i <= 25; i++) { // replace letters with digits
							while (iban.search(repl[i])!= -1) { iban = iban.replace(repl[i],repl[i+26]); } // all of them
						}
						coss = Math.ceil(iban.length/7); // calc count of substrings
						rmndr = ""; // remainer starts empty and always preceeds the current substring
						for (i = 1; i <= coss; i++) { // step by step
							rmndr = String(parseFloat(rmndr+iban.substr((i-1)*7,7))%97); // modulo division 97
						}
						return rmndr;
					}
				}
			}
		}
	} // return the remainer
	return "-1";
}

// perform the check
function checkiban(iban) {
	if (iban == '') { displayResult(ralt(10)); return; }
	iban = iban.split(' ').join('');
	var rmndr = checkibancore(iban);
	if (rmndr == "1") displayResult(ralt(8), true);
	else if (rmndr != "-1") displayResult(ralt(9));
}


// latvian ++++++++++++++++++++++++++++++++++++++++
// country names
ctynm = 		new Array  (	"Andoras","Austrijas","Bosnijas un Hercegovinas","Beļģijas","Bulgārijas","Šveices","Serbijas un Melnkalnes",
					"Kipras","Čehijas","Vācijas","Dānijas","Igaunijas","Spānijas","Somijas",
					"Ferēru salu","Francijas","Lielbritānijas","Gibraltāra","Grenlandes","Grieķijas","Horvātijas",
					"Ungārijas","Īrijas","Islandes","Itālijas","Lihtenšteinas","Lietuvas","Luksemburgas","Latvijas",
					"Monako","Maķedonijas","Maltas","Holandes","Norvēģijas","Polijas","Portugāles","Rumānijas",
					"Zviedrijas","Slovēnijas","Slovākijas","San Marino","Tunisijas","Turcijas");
// error messages
altxt = 		new Array  (	"Norādītais konta numurs satur nepareizus simbolus",
					"Norādītā konta struktūra nav pareiza",
					"Kontrolciparu kombinācija, kas atbilst konta individuālajam numuram, nav pareiza",
					"Konta pareizību nav iespējams pārbaudīt, jo valsts, kuras kods ir ", ", nav pārgājusi uz ES dalībvalstu vienoto kontu numerācijas sistēmu",
					"Nepareizs konta numura garums. Pirmie divi simboli norāda uz to, ka šis konts ir atvērts ", " bankā. Šajā gadījumā numura simbolu skaitam ir jābūt vienādam ar ", ".",
					"Norādītais IBAN ir pareizs",
					"Norādītais IBAN nav pareizs",
					"IBAN nav norādīts");


// latvian ++++++++++++++++++++++++++++++++++++++++

// russian ++++++++++++++++++++++++++++++++++++++++
// country names
ctynm = ctynm.concat	( new Array (	"андорском", "австрийском", "боснийском", "бельгийском", "болгарском", "швейцарском", "сербском",
					"кипрском", "чешском", "немецком", "датском", "эстонском", "испанском", "финском",
					"фарерском", "французском", "великобританском", "гибралтарском", "гренландском", "греческом", "хорватском",
					"венгерском", "ирландском", "исландском", "итальянском", "лихтенштейнском", "литовском", "люксембургском", "латвийском",
					"монакском", "македонском", "мальтийском", "нидерландском", "норвежском", "польском", "португальском", "румынском",
					"шведском", "словенском", "словацком", "сан-маринском", "тунисском", "турецком"));
// error messages
altxt = altxt.concat	( new Array ( "Указанный номер счета содержит некорректные символы",
					"Cтруктура указанного счета некорректна",
					"Контрольная комбинация цифр, соответствующая индивидуальному номеру счета, неверна",
					"Невозможно проверить корректность счета, так как государство с кодом ", " не перешло на единую систему нумерации счетов для стран ЕС.",
					"Неправильная длина номера счета. Согласно первым двум символам данный счет открыт в ", " банке. В этом случае количество символов в номере должно быть ровно ", ".",
					"Указанный IBAN корректен",
					"Указанный IBAN некорректен",
					"IBAN не указан"));

// russian ++++++++++++++++++++++++++++++++++++++++

// english ++++++++++++++++++++++++++++++++++++++++
// country names
ctynm =  ctynm.concat	( new Array (	"Andorra","Austria","Bosnia and Herzegovina","Belgium","Bulgaria","Switzerland","Serbia and Montenegro",
					"Cyprus","Czech Republic","Germany","Denmark","Estonia","Spain","Finland",
					"Faroe Islands","France","Great Britain","Gibraltar","Greenland","Greece","Croatia",
					"Hungary","Ireland","Iceland","Italy","Liechtenstein","Lithuania","Luxemburg","Latvia",
					"Monaco","Macedonia","Malta","Netherlands","Norway","Poland","Portugal","Romania",
					"Sweden","Slovenia","Slovak Republic","San Marino","Tunisia","Turkey"));
// error messages
altxt =  altxt.concat	( new Array (	"The IBAN contains illegal characters.",
					"The structure of IBAN is wrong.",
					"The check digits of IBAN are wrong.",
					"Can not check correct length of IBAN because "," is currently not respected.",
					"The length of IBAN is wrong. The IBAN of "," needs to be "," characters long.",
					"The IBAN seems to be correct.",
					"The IBAN is incorrect.",
					"The IBAN is not entered"));
// english ++++++++++++++++++++++++++++++++++++++++
// script end


function displayResult(msgText, isNotError) {
	var resultDiv = null;
	if ( document.createTextNode ) {
		resultDiv = document.getElementById('result');
	}
	if ( resultDiv ) {
		var formIBAN = document.forms['ibanChecker'].elements['iban'].value;
		if ( formIBAN ) {
			formIBAN = formIBAN.toUpperCase();
			document.forms['ibanChecker'].elements['iban'].value = formIBAN;
		}
		resultDiv.className = (isNotError)? 'ok' : 'error';
		resultDiv.innerHTML = msgText;
		var resultTableDiv = document.getElementById('resultTable');
		if ( resultTableDiv ) resultTableDiv.style.display = 'block';
	} else {
		alert( msgText );
	}
}

function changeIBAN(IBANinput, evt) {
	IBANinput.form.elements['checkBtn'].disabled = (IBANinput.value == '')
	keyCode = (evt && evt.keyCode)? evt.keyCode : 0;
	if ( document.createTextNode && keyCode != 13 ) {
		var resultTableDiv = document.getElementById('resultTable');
		if ( resultTableDiv ) resultTableDiv.style.display = 'none';
	}
}

function initForm() {
	changeIBAN(document.forms['ibanChecker'].elements['iban']);
}

window.onload = initForm;