// sql.js
// The local db sql'er, parse sql and return the vars from db.js
// with this we can create the database effect from a cd

function _split(string, exp, times) {
	var splitted_array = new Array();
	for (var i = 0; i < times; i++) {
		splitted_array[i] = string.substr(0,string.indexOf(exp));
		string = string.substr(string.indexOf(exp)+exp.length); 
	}
	splitted_array[times] = string;
	return splitted_array;
}

function verify_table(what_table) {
	var tablenr = -1
	for (i = 0; i < db.length; i++) {
		if (db[i][0] == what_table) {
			tablenr = i;
		}
	}
	return tablenr;
}

function get_colnr(tablenr, what_col) {
	var colnr = -1;
	for (var i = 1; i < db[tablenr].length-1; i++) { // kijk of deze kolom ook voorkomt in de tabel waar wat van gevraagt wordt
		if (what_col == db[tablenr][i][0]) {
			colnr = i;
		}
	}
	return colnr -1;
}
	

function verify_cols(tablenr, what_cols) {
	var colnrs = new Array();
	for(var i = 0; i < what_cols.length; i++) { // kijk voor elke kolom of hij bestaat
		for (var j = 1; j < db[tablenr].length-1; j++) { // kijk of deze kolom ook voorkomt in de tabel waar wat van gevraagt wordt
			if (what_cols[i] == db[tablenr][j][0]) {
				colnrs[colnrs.length] = j-1;
			}
		}
	}
	return colnrs; 
}

function sql_query(sql_query) {
	// eerst moeten we weten wat hij gaat doen
	// dit kan zijn select, etc, alleen de select behandelen we
	if (sql_query.split(" ", 2)[0].toLowerCase() == "select") {
		// yeah we hebben een select query zonder de select
		var select_query = _split(sql_query.toLowerCase(), ' ', 1)[1];

		// nu moeten we weten wat hij allemaal moet hebben
		var what_cols, what_table, what_conditions, what_sort;
		what_cols = _split(select_query, " from ", 1)[0];
		
		if (select_query.indexOf(" where ") != -1) {
			what_table		= _split(_split(select_query, " from ", 1)[1], " where ", 1)[0];
			if (select_query.indexOf(" sort by ") != -1) {
				what_conditions	= _split(_split(_split(select_query, " from ", 1)[1]," where ", 1)[1], " sort by ", 1)[0];
				what_sort = _split(select_query, " sort by ", 1)[1];
			} else {
				what_conditions	= _split(_split(select_query, " from ", 1)[1]," where ", 1)[1];
				what_sort = false;
			}
		} else {
			if (select_query.indexOf(" sort by ") != -1) {
				what_table = _split(_split(select_query, " from ", 1)[1], " sort by ", 1)[0];
				what_sort = _split(select_query, " sort by ", 1)[1];
			} else {
				what_table	= _split(select_query, " from ", 1)[1];
				what_sort = false;
			}
			what_conditions = false;
		}

		var tablenr = verify_table(what_table); // hier staat nu in welk nummer de tabel heeft
		var colnrs = new Array(); // hier komen de kolom nummers in te staan
		var what_conditionnrs, what_sortnrs;
				
		if (tablenr == -1) return "ERROR: table not found."; //controle of de tabel bestaat

		what_cols = what_cols.replace(/ /g, "");
		if (what_cols != "*") { // we hoeven niet alles te returnen dus moeten we kijken wat er allemaal terug moet
			what_cols = what_cols.split(","); // what_cols is een array geworden met alle kolomnamen
			colnrs = verify_cols(tablenr, what_cols); // kijken of de colommen bestaan
			if (colnrs.length != what_cols.length) return "ERROR: one or more colums not found.";
		}
		
		// nu moeten we kijken of er goede argumenten (conditions) gegeven zijn
		if (what_conditions) {
			// als er ergens op gefilterd moet worden
			// er is in deze versie gelimit op 1 voorwaarde
			// what_conditions = what_conditions.replace(/  /g, " "); // spaties weghalen
			what_conditionnrs = get_colnr(tablenr, _split(what_conditions, "=", 1)[0]);
			if (what_conditionnrs == -1) return "ERROR: referred colum at WHERE doesn't exsists";
		}
		
		if (what_sort) {
			// als er gesorteerd moet worden
			what_sort = what_sort.replace(/ /g, "");
			
			what_sortnrs = get_colnr(tablenr, what_sort);

			if (what_sortnrs == -1) return "ERROR: referred column at SORT BY  doesn't exsists";
		}
		//alert("table: " + what_table + "\ncols: " + what_cols + "\nconditions: " + what_conditions + "\nsort by: " + what_sort );
		var result = new Array();
		for (i = 0; i < db[tablenr][db[tablenr].length-1].length; i++) {
			if (what_conditions) {
				if(db[tablenr][db[tablenr].length-1][i][what_conditionnrs] == _split(what_conditions, "=", 1)[1]) {
					result[result.length] = new Array();
					if (what_cols != "*") {
						for(var j = 0; j < colnrs.length; j++) {
							result[result.length - 1][j] = db[tablenr][db[tablenr].length-1][i][colnrs[j]];
						}
					} else {
						// alle kolommen moeten worden teruggestuurd
						result[result.length-1] = db[tablenr][db[tablenr].length-1][i];
					}
				}
			} else {
				result[i] = new Array();
				// er zijn geen condities dus elke rij moet worden geprocessed
				if (what_cols != "*") {
					for(var j = 0; j < colnrs.length; j++) {
						result[result.length - 1][j] = db[tablenr][db[tablenr].length-1][i][colnrs[j]];
					}
				} else {
					// alle kolommen moeten worden teruggestuurd
					result[result.length-1] = db[tablenr][db[tablenr].length-1][i];
				}
			}
			//alert(db[tablenr][db[tablenr].length-1][i]);
		}

		// zo we hebben alle informatie, tijd om de opgevraagde shizzle te gaan verzamelen en terug te geven.
		return result;
	}
	return 0;
}
// je krijgt alleen resultaat wanneer er aan een vaste volgorde wordt gehouden
// deze volgorde is: SELECT, FROM, WHERE, SORT BY. SELECT en FROM zijn verplicht, de rest niet

// var result = sql_query("select * from nieuws");
// alert("sql result: " + result);


