Index: .gitignore
===================================================================
--- .gitignore	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
+++ .gitignore	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -0,0 +1,1 @@
+config.php
Index: accounts.php
===================================================================
--- accounts.php	(revision 76cb6041d6d56e8deeba1ee13f26029c5b1db271)
+++ accounts.php	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -49,11 +49,22 @@
 	
 function page_admins_by_org() {	?>
-		<div class="admins_by_org" id="admins_by_org">
+		<div class="meraki_admins_by_org" id="meraki_admins_by_org">
 			<h2>List of Administrators by Organisation</h2>
-			<div id="adminsOutput"></div>
+
+			<div id="meraki_status"><pre>Current status: Awaiting user input</pre></div>
+
+			<div class="meraki_container meraki_form">
+				<?php ro_key_fields(); ?>
+				<div class="meraki_row">
+					<div class="meraki_left">
+						<input type="button" class="meraki_button" name="meraki_go" id="meraki_go" value="Fetch Administrators" onclick="get_admins_by_org();">
+					</div>
+				</div>
+			</div>
+			
+			<div id="meraki_admins_output"></div>
 		</div>
-		
 		<script>
-			get_admins_by_org();
+			var admin_sort_by = "org";
 		</script>
 
@@ -61,13 +72,23 @@
 
 function page_orgs_by_admin() {	?>
-		<div class="orgs_by_admin" id="orgs_by_admin">
+		<div class="meraki_orgs_by_admin" id="meraki_orgs_by_admin">
 			<h2>List of Organisations by Administrator</h2>
-			<div id="adminsOutput"></div>
+
+			<div id="meraki_status"><pre>Current status: Awaiting user input</pre></div>
+
+			<div class="meraki_container meraki_form">
+				<?php ro_key_fields(); ?>
+				<div class="meraki_row">
+					<div class="meraki_left">
+						<input type="button" class="meraki_button" name="meraki_go" id="meraki_go" value="Fetch Administrators" onclick="get_admins_by_org();">
+					</div>
+				</div>
+			</div>
+			
+			<div id="meraki_admins_output"></div>
 		</div>
-		
 		<script>
-			get_orgs_by_admin();
+			var admin_sort_by = "admin";
 		</script>
-
 <?php }
 
Index: include.css
===================================================================
--- include.css	(revision 76cb6041d6d56e8deeba1ee13f26029c5b1db271)
+++ include.css	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -18,2 +18,24 @@
 	margin: 1px 1px;
 }
+
+.meraki_output_group {
+	border: 1px solid;
+	border-color: black;
+}
+
+.meraki_output_header{
+}
+
+.meraki_output_header_group {
+	border: 1px solid;
+	border-color: black;
+}
+
+.meraki_output_table tr {
+	border: 1px solid;
+	border-color: black;
+}
+
+.meraki_key {
+	display:none;
+}
Index: include.js
===================================================================
--- include.js	(revision 76cb6041d6d56e8deeba1ee13f26029c5b1db271)
+++ include.js	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -1,53 +1,182 @@
 var orgs;
 var number_of_orgs;
+var orgs_completed=0;
 var current_org=-1;
+var key="";
+
+$( document ).ready(function() {
+	$("#meraki_ro_key").change(function(event) {
+		var checkbox = event.target;
+		if (checkbox.checked) {
+			$(".meraki_key").hide();
+		} else {
+			$(".meraki_key").css('display', 'table-row');
+		}
+	});
+});
+
+
+//GET ADMINS BY ORG
+
+function get_admins_by_org() {
+    status_update("Fetching organisations...");
+    get_organisations(on_get_organisations_success_admins, on_get_organisations_error);
+}
+
+
+function on_get_organisations_success_admins(data) {
+	orgs = data;
+	number_of_orgs = orgs.length;
+	status_update("Found " + number_of_orgs + " organisations - fetching admins...");
+    $.each(data, function(org) {
+
+        $.ajax({
+            dataType: "json",
+            url: "api.php?action=get_org_admins&orgid="+data[org].id+"&key=" + key,
+            success: function (r) {on_get_admin_sucess(r, org);},
+            error: function (x, s, e) {on_get_admin_error(e, org);}
+        });
+	});
+}
+
+function on_get_admin_sucess(administrator, org_index) {
+    orgs[org_index].administrator = administrator;
+	orgs_completed++;
+    if(check_orgs_complete()) {
+        print_admins_output();
+    }
+}
+
+function on_get_admin_error(error, org_index) {
+    orgs[org_index].administrator = [];
+	orgs[org_index].administrator[0] = "ERROR";
+	orgs_completed++;
+    if(check_orgs_complete()) {
+        print_admins_output();
+    }
+}
+
+function print_admins_output() {
+	if ( admin_sort_by == "admin" ){
+		print_admins_output_by_admin();
+	}
+	else {
+		print_admins_output_by_org();
+	}
+}
+
+function print_admins_output_by_org() {
+	status_update('Sorting and generating output...');
+	sorted = orgs.sort(function(a, b) { return a.name - b.name; });
+	$("#meraki_admins_output").html('<table class="meraki_output_table" id="meraki_admins_output_table">		<tr><td class="meraki_output_header_group"><b>Organisation</b></td><td class="meraki_output_header"><b>Name</b></td><td class="meraki_output_header"><b>Email Address</b></td><td class="meraki_output_header"><b>Access Level</b></td></tr></table>');
+	$.each(sorted, function(data) {
+		if ( sorted[data].administrator[0] != "ERROR" ) {
+			number_of_admins = sorted[data].administrator.length;
+			$("#meraki_admins_output_table").append('<tr><td rowspan="'+number_of_admins+'" class="meraki_output_group">' + sorted[data].name + '</td><td>' + sorted[data].administrator[0].name + '</td><td>' + sorted[data].administrator[0].email + '</td><td>' + sorted[data].administrator[0].orgAccess + '</td></tr>');
+			for (i=1; i<number_of_admins; i++) {
+				$("#meraki_admins_output_table").append('<tr><td>' + sorted[data].administrator[i].name + '</td><td>' + sorted[data].administrator[i].email + '</td><td>' + sorted[data].administrator[i].orgAccess + '</td></tr>');
+			}
+		}
+		else {
+			$("#meraki_admins_output_table").append('<tr><td class="meraki_output_group">' + sorted[data].name + '</td><td>ERROR</td><td>ERROR</td><td>ERROR</td></tr>');
+		}
+	});
+	status_update("Done...");
+}
+
+function print_admins_output_by_admin() {
+	status_update('Sorting and generating output...');
+	var admins = {};
+	
+	$.each (orgs, function(j) {
+		$.each (orgs[j].administrator, function (k) {
+			if (orgs[j].administrator[k] != "ERROR") {
+				if (!admins[orgs[j].administrator[k].email]) {
+
+					admins[orgs[j].administrator[k].email]=[];
+					
+					admins[orgs[j].administrator[k].email].name = orgs[j].administrator[k].name;
+
+				}
+				
+				var next_org = admins[orgs[j].administrator[k].email].length;
+				
+				admins[orgs[j].administrator[k].email][next_org] = orgs[j];
+
+				
+				admins[orgs[j].administrator[k].email][next_org].orgAccess = orgs[j].administrator[k].orgAccess;
+			}
+			
+			
+		});
+	});
+	
+	
+	
+	
+	
+	sorted = admins; //.sort(function(a, b) { return a.name - b.name; });
+	$("#meraki_admins_output").html('<table class="meraki_output_table" id="meraki_admins_output_table">		<tr><td class="meraki_output_header_group"><b>Email Address</b></td><td class="meraki_output_header_group"><b>Name</b></td><td class="meraki_output_header"><b>Organisation</b></td><td class="meraki_output_header"><b>Access Level</b></td></tr></table>');
+	$.each(sorted, function(j) {
+		number_of_admins = sorted[j].length;
+		$("#meraki_admins_output_table").append('<tr>			<td rowspan="'+number_of_admins+'" class="meraki_output_group">' + j + '</td>			<td rowspan="'+number_of_admins+'" class="meraki_output_group">' + sorted[j].name + '</td>			<td>' + sorted[j][0].name + '</td>			<td>' + sorted[j][0].orgAccess + '</td>			</tr>');
+		for (i=1; i<number_of_admins; i++) {
+			$("#meraki_admins_output_table").append('<tr>				<td>' + sorted[j][i].name + '</td>				<td>' + sorted[j][i].orgAccess + '</td></tr>');
+		}
+	});
+	status_update("Done...");
+}
+
+
+//GET LICENCES
 
 function get_licence_state() {
 	
-	$("#licenceOutput").append("<p>Fetching organisations...</p>");
-	get_orgs_licences();
-	return;
-	
-}
-
-function get_next_licence(data) {
-	if ( current_org == -1 ){
-		//First one to fetch
-		$("#licenceOutput").append('<p id="licenceOutputCounter">Getting organisation ' + 1 + '/' + number_of_orgs +  ' (' + orgs[0].name + ')....</p>');
-		current_org++;
-		get_org_licences(orgs[current_org].id);
-	}
-	else {
-		//We should be in a success clause, so parse data
-		lic = data;
-		if (typeof data == 'undefined') {
-			//This shouldn't happen now
-			orgs[current_org].licStatus = "ERROR";
-			orgs[current_org].licExpirationDate = "ERROR";
-			orgs[current_org].licLicensedDeviceCounts = "ERROR";
-		}
-		else {
-			orgs[current_org].licStatus = lic['status'];
-			orgs[current_org].licExpirationDate = Date.parse(lic['expirationDate']);
-			orgs[current_org].licLicensedDeviceCounts = lic['licensedDeviceCounts'];			
-		}
-		
-		if (current_org < number_of_orgs-1) {
-			//More stuff to get....
-			current_org++;
-			$("#licenceOutputCounter").text('Getting organisation ' + parseInt(parseInt(current_org)+1) + '/' + number_of_orgs +  ' (' + orgs[current_org].name + ')....');
-			get_org_licences(orgs[current_org].id);
-		}
-		else {
-			//All done - print output...
-			print_licence_output();
-		}
-	}
+	status_update("Fetching organisations...");
+	$(".meraki_form").hide();
+	set_key();
+	get_organisations(on_get_organisations_success_licences, on_get_organisations_error);	
+}
+
+
+function on_get_organisations_success_licences(data) {
+	orgs = data;
+	number_of_orgs = orgs.length;
+	status_update("Found " + number_of_orgs + " organisations - fetching licence states...");
+    $.each(data, function(org) {
+
+        $.ajax({
+            dataType: "json",
+            url: "api.php?action=get_org_licences&orgid="+data[org].id+"&key=" + key,
+            success: function (r) {on_get_licence_sucess(r, org);},
+            error: function (x, s, e) {on_get_licence_error(e, org);}
+        });
+	});
+}
+
+function on_get_licence_sucess(lic, org_index) {
+	orgs[org_index].licStatus = lic['status'];
+	orgs[org_index].licExpirationDate = Date.parse(lic['expirationDate']);
+	orgs[org_index].licLicensedDeviceCounts = lic['licensedDeviceCounts'];	
+	orgs_completed++;
+    if(check_orgs_complete()) {
+        print_licence_output();
+    }
+}
+
+function on_get_licence_error(error, org_index) {
+	orgs[org_index].licStatus = "ERROR";
+	orgs[org_index].licExpirationDate = "ERROR";
+	orgs[org_index].licLicensedDeviceCounts = "ERROR";
+	orgs_completed++;
+    if(check_orgs_complete()) {
+        print_licence_output();
+    }
 }
 
 function print_licence_output() {
-	$("#licenceOutput").append('<p>Sorting and generating output...</p>');
+	status_update('Sorting and generating output...');
 	sorted = orgs.sort(function(a, b) { return a.licExpirationDate - b.licExpirationDate; });
-	$("#licenceOutput").html('<table id="licenceOutputTable">		<tr><td><b>Organisation</b></td><td><b>Status</b></td><td><b>Expiration Date</b></td><td><b>Devices</b></td></tr></table>');
+	$("#meraki_licence_output").html('<table id="licenceOutputTable">		<tr><td><b>Organisation</b></td><td><b>Status</b></td><td><b>Expiration Date</b></td><td><b>Devices</b></td></tr></table>');
 	$.each(sorted, function(data) {
 		d = new Date(sorted[data].licExpirationDate);
@@ -55,4 +184,5 @@
 		$("#licenceOutputTable").append('<tr><td>' + sorted[data].name + '</td><td>' + sorted[data].licStatus + '</td><td>' + n + '</td><td>'+ dump_licenced_devices(sorted[data].licLicensedDeviceCounts) + '</td></tr>');		
 	});
+	status_update("Done...");
 }
 
@@ -75,50 +205,45 @@
 }
 
-function get_orgs_licences_success(data) {
-	orgs = data;
-	number_of_orgs = orgs.length;
-	$("#licenceOutput").append('<p>Got ' + number_of_orgs + ' organisations.  Fetching details....</p>');
-	get_next_licence(0);
-}
-
-function get_orgs_licences() {
-	var key = $('#api-key').val();
-	//Check if the user has entered anything
-	//if(key == ''){
-	//	key = 'rokey';
-	//}
-	$.ajax({
-		dataType: "json",
-		url: "licences.php?action=get_orgs&key=" + key,
-		success: function(data) {get_orgs_licences_success(data);} 
-	});
-}
-
-function get_org_licences(orgid) {
-	var key = $('#api-key').val();
-	//Check if the user has entered anything
-	//if(key == ''){
-	//	key = 'rokey';
-	//}
-	$.ajax({
-		dataType: "json",
-		url: "licences.php?action=get_org_licences&orgid=" + orgid + "&key=" + key,
-		success: function(data) { get_next_licence(data); },
-		error: function (jqXHR, textStatus, errorThrown ) {
-			console.log("Status: " + textStatus  + ", Error: " + errorThrown);
-			orgs[current_org].licStatus = "ERROR";
-			orgs[current_org].licExpirationDate = "ERROR";
-			orgs[current_org].licLicensedDeviceCounts = "ERROR";
-			if (current_org < number_of_orgs-1) {
-				//More stuff to get....
-				current_org++;
-				$("#licenceOutputCounter").text('Getting organisation ' + parseInt(parseInt(current_org)+1) + '/' + number_of_orgs +  ' (' + orgs[current_org].name + ')....');
-				get_org_licences(orgs[current_org].id);
-			}
-			else {
-				//All done - print output...
-				print_licence_output();
-			}
-		}
-	});
-}
+
+
+//GENERAL FUNCTIONS
+
+function check_orgs_complete() {
+    if( orgs_completed != number_of_orgs) { 
+		status_update("Retrieved data for " + orgs_completed + " / " + number_of_orgs + " organisations - waiting for more data...");
+        return false;
+    }
+    return true;
+}
+
+function do_this_when_all_loops_are_done() {
+	status_update("Done...");
+	//Output something?
+}
+
+function get_organisations(callback_success, callback_error) {
+        $.ajax({
+            dataType: "json",
+            url: "api.php?action=get_orgs&key=" + key,
+            success: function(r) {callback_success(r);},
+            error: function(x, s, e) {callback_error(e);}
+        });     
+}
+
+function on_get_organisations_error (jqXHR, textStatus, errorThrown) {
+	status_update("Error..." + errorThrown);
+}
+
+function status_update(t) {
+    $("#meraki_status").html("<pre>Current status: " + t + "</pre>");
+	return 1;
+}
+
+function set_key() {
+ 	if (!($("#meraki_ro_key").is(':checked'))) {
+		key = $("#meraki_api_key").val();
+	}
+	else{
+		key = "rokey";
+	}
+}
Index: include.php
===================================================================
--- include.php	(revision 76cb6041d6d56e8deeba1ee13f26029c5b1db271)
+++ include.php	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -5,4 +5,24 @@
 $page_header = file_get_contents ( "page_header.html" );
 $page_footer = file_get_contents ( "page_footer.html" );
+
+function ro_key_fields() { ?>
+				<div class="meraki_row">
+					<div class="meraki_left">
+							<label for="meraki_ro_key">Use Read Only Key: </label>
+					</div>
+					<div class="meraki_right">
+						<input type="checkbox" name="meraki_ro_key" id="meraki_ro_key" value="rokey" checked>
+					</div>
+				</div>
+				<div class="meraki_row meraki_key">
+					<div class="meraki_left">
+							<label for="merkai_api_key">Your API Key: </label>
+					</div>
+					<div class="meraki_right">
+						<input type="password" name="meraki_api_key" id="meraki_api_key" length="40" />
+					</div>
+				</div>
+<?php }
+
 
 
@@ -22,4 +42,7 @@
 			case "get_org_licences":
 				echo ( get_org_licences($_GET['orgid'], $key) );
+				break;
+			case "get_org_admins":
+				echo ( get_org_admins($_GET['orgid'], $key) );
 				break;
 			default:
@@ -56,5 +79,5 @@
 	//Get a list of admins in an organisation
 	function get_org_admins($orgid, $key) {
-		return get_request('/organizations/' . $org_id . '/admins', $key );
+		return get_request('/organizations/' . $orgid . '/admins', $key );
 	}
 	//SAMPLE RESPONSE
Index: licences.php
===================================================================
--- licences.php	(revision 76cb6041d6d56e8deeba1ee13f26029c5b1db271)
+++ licences.php	(revision c7c91bded5c7b8970a4ca74a3f5e06884d8bd41b)
@@ -16,16 +16,25 @@
 	function new_request() { ?>
 		
-		<div class="licenceState" id="divlicenceState">
+		<div class="meraki_licence_state" id="meraki_licence_state">
 			<h2>Licence State for Organisations</h2>
-			<div id="licenceOutput"></div>
+			<div id="meraki_status"><pre>Current status: Awaiting user input</pre></div>
+
+			<div class="meraki_container meraki_form">
+				<?php ro_key_fields(); ?>
+				<div class="meraki_row">
+					<div class="meraki_left">
+						<input type="button" class="meraki_button" name="meraki_go" id="meraki_go" value="Fetch Licence State" onclick="get_licence_state();">
+					</div>
+				</div>
+			</div>
+			
+			<div id="meraki_licence_output"></div>
 		</div>
-		
-		<div class="key" style="display:none">
-			<label for="api-key">Your API Key: </label>
-			<input type="password" name="api-key" id="api-key" length="40" />
-		</div>
+			
+
+
 		
 		<script>
-			get_licence_state();
+			
 		</script>
 		<?php
