var WebAppVersion = "1.0.0";

var Books = []
Books["JavaScript"] = [];
Books["JavaScript"][0] = {};
Books["JavaScript"][0].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0596517742?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596517742\"><img border=\"0\" src=\"./images/books/41bum-QsrNL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0596517742\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["JavaScript"][0].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0596517742?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596517742\">JavaScript: The Good Parts</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0596517742\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";

Books["JavaScript"][1] = {};
Books["JavaScript"][1].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0596101996?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596101996\"><img border=\"0\" src=\"./images/books/41YPzsSLzSL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0596101996\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["JavaScript"][1].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0596101996?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0596101996\">JavaScript: The Definitive Guide</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0596101996\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />"

Books["JavaScript"][2] = {};
Books["JavaScript"][2].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/159059908X?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=159059908X\"><img border=\"0\" src=\"./images/books/512I-oLmZJL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=159059908X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["JavaScript"][2].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/159059908X?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=159059908X\">Pro JavaScript Design Patterns</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=159059908X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";

Books["Tcl"] = [];
Books["Tcl"][0] = {};
Books["Tcl"][0].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0130385603?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0130385603\"><img border=\"0\" src=\"./images/books/51o%2Bs7otZyL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0130385603\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["Tcl"][0].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0130385603?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0130385603\">Practical Programming in Tcl and Tk (4th Edition)</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0130385603\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";

Books["Tcl"][1] = {};
Books["Tcl"][1].imgLink = "<a href=\"http://www.amazon.com/gp/product/032133633X?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=032133633X\"><img border=\"0\" src=\"./images/books/413lq9orsaL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=032133633X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["Tcl"][1].txtLink = "";


Books["Algorithms"] = [];
Books["Algorithms"][0] = {};
Books["Algorithms"][0].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/059651624X?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=059651624X\"><img border=\"0\" src=\"./images/books/413jhafy4xL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=059651624X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["Algorithms"][0].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/059651624X?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=059651624X\">Algorithms in a Nutshell</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=059651624X\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";

Books["Algorithms"][1] = {};
Books["Algorithms"][1].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0470121688?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470121688\"><img border=\"0\" src=\"./images/books/41YozBmGytL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0470121688\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["Algorithms"][1].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0470121688?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0470121688\">Puzzles for Programmers and Pros</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0470121688\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";

Books["Algorithms"][2] = {};
Books["Algorithms"][2].imgLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0201914654?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0201914654\"><img border=\"0\" src=\"./images/books/41RS8MFS0EL._SL160_.jpg\"></a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0201914654\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";
Books["Algorithms"][2].txtLink = "<a target=\"_blank\" href=\"http://www.amazon.com/gp/product/0201914654?ie=UTF8&tag=patorjkcom-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=0201914654\">Hacker's Delight</a><img src=\"http://www.assoc-amazon.com/e/ir?t=patorjkcom-20&l=as2&o=1&a=0201914654\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\" />";


function generateBookPanel(categories) {
	
	var htmlStr = "<center><div style=\"padding:10px\">";
	
	if (categories.length === 0) {
		for (var c in Books) {
			if (Books.hasOwnProperty(c)) {
				categories[categories.length] = c;
			}
		}
	}
	
	var bookList = [];
	var displayBooks = [];
	
	for (var i = 0; i < categories.length; i++) {
		var cat = categories[i];
		if (Books[cat] && Books.hasOwnProperty(cat)) {
			for (var j = 0; j < Books[cat].length; j++) {
				bookList.push(Books[cat][j]);
			}
		}
	}
	
	var len = Math.min(3, bookList.length);
	for (var i = 0; i < len; i++) {
		var randomIndex = Math.floor(Math.random()*bookList.length);
		displayBooks.push(bookList.splice(randomIndex,1)[0]);
	}
	
	for (var i = 0; i < displayBooks.length; i++) {
		htmlStr += displayBooks[i].imgLink + "<br/>" + displayBooks[i].txtLink;
		
		if (i !== (displayBooks.length-1)) {
			htmlStr += "<br/><br/>";
		}
	}
	
	htmlStr = htmlStr + "</div></center>";
	return htmlStr;
}

function setupQuizGuide() {

	var quizStore = new Ext.data.Store({
		"url": "./" + WebAppVersion + "/scripts/quizList.json",
		reader: new Ext.data.JsonReader({
			root: "rows",
			idProperty: "id",
			fields: [
				{name:"id"},
				{name:"title"},
				{name:"avatar"},
				{name:"avatar-alt"},
				{name:"author"},
				{name:"categories"},
				{name:"description"},
				{name:"created", type: "date", dateFormat: "Y-m-d"},
				{name:"last-updated", type:"date", dateFormat: "Y-m-d"},
				{name:"approved", type: "bool"},
				{name:"url"},
				{name:"quiz-data-location"},
				{name:"times-taken"},
				{name:"thumbs-up"},
				{name:"thumbs-down"}
			]
		})
	});

	quizStore.load();

	var categoryRenderer = function(val, cell, store) {
		return val.join(", ");
	};
	
	var titleRenderer = function(val, cell, store) {
		var imgStr = "<img src=\"" + store.data.avatar + "\" style=\"padding-right:8px;\" alt=\"" + store.data["avatar-alt"] + "\" align=\"left\"/>";
		var txtStr = "<div style=\"white-space:normal;\"><b>" + store.data.title + "</b><br/>" + store.data.description + "</div>";
		return imgStr + txtStr;
	};
	
	var quizGrid = new Ext.grid.GridPanel({
				title: "Choose Wisely...",
				store: quizStore,
				autoExpandColumn: "quizCol",
				colModel: new Ext.grid.ColumnModel({
	        defaults: {
	            width: 120,
	            sortable: true
	        },
					columns: [
						{id:"quizCol",header:"Quiz", dataIndex:"title",renderer:titleRenderer},
						{header:"Author", dataIndex:"author"},
						{header:"Categories", dataIndex:"categories", renderer: categoryRenderer},
						{header:"Last Updated", dataIndex:"last-updated", renderer: Ext.util.Format.dateRenderer('m/d/Y')},
						{header:"Created", dataIndex:"created", renderer:Ext.util.Format.dateRenderer('m/d/Y') }
					]
				}),
				tbar: {
					items: [{ 
										xtype: "tbbutton",
										text: "Take Quiz",
										handler: function() {
											
											Ext.Msg.show({
												title:":(",
												msg: "Sorry, this feature isn't implemented yet.",
												buttons: Ext.Msg.OK,
												icon: Ext.MessageBox.INFO
											});

										}
									}]
							}
			});

	var myData = [
			[0, "Algorithms"],
			[1, "C"],
			[2, "C++"],
			[3, "C#"],
			[4, "Java"],
			[5, "JavaScript"],
			[6, "PHP"],
			[7, "Python"],
			[8, "Tcl"],
			[9, "Visual Basic 6.0"]
		]

	var categoryStore = new Ext.data.Store({
		data: myData,
		reader: new Ext.data.ArrayReader({id:"id"}, [
			"id",
			"category"
		])
	});

	var sm = new Ext.grid.CheckboxSelectionModel({singleSelect:false});

	var categoryList = new Ext.grid.GridPanel({
				title: "Quiz Categories",
				height: 200,
				hideHeaders: true,
				store: categoryStore,
				autoExpandColumn: "categoryCol",
				colModel: new Ext.grid.ColumnModel({
	        defaults: {
	            sortable: true
	        },
					columns: [
						sm,
						{id:"categoryCol",header:"Category", dataIndex:"category"}
					]
				}),
				sm: sm,
				tbar: {
					items: [{
										xtype: "tbfill"
									},{ 
										xtype: "tbbutton",
										text: "Select All",
										handler: function() {
											categoryList.getSelectionModel().selectAll();
										}
									},{
										xtype: "tbspacer"	
									},{ 
										xtype: "tbbutton",
										text: "Update Quiz List",
										handler: function() {						

											var selectedRecords = categoryList.getSelectionModel().getSelections();
											var setIntersection = [];
											var bookCategories = [];
											
											Ext.each(selectedRecords, function(record) {
												setIntersection[record.get("category")] = 1;
												bookCategories.push(record.get("category"));
									    });

											quizStore.filterBy(function(record, id) {
												var itemFound = false;
												var possibleCats = record.data["categories"];
												
												for (var i = 0; i < possibleCats.length; i++) {
													if ( setIntersection[ possibleCats[i] ] ) {
														return true;
													}
												}
												return false;
											});
											
											// update the lower panel

											Ext.each(selectedRecords, function(record) {
												
									    });

											Ext.getCmp("bookPanel").update(generateBookPanel(bookCategories));
										}
									}]
							}
	});

	var myLayout = new Ext.Viewport({
			layout: "border",
			renderTo: Ext.getBody(),
			items: [{
				region: "north",
				xtype: "box",
				applyTo: "header",
				height: 54
			},{
	      region:"west",
	      border: false,
	      split:true,
	      width: 200,
	      layout: "border",
				layoutConfig: {
				    align : 'stretch',
				    pack  : 'start'
				},
	      minSize: 200,
	      maxSize: 300,
				defaults: {autoScroll: true},

				items: [
					{
						region: "north",
						height:200,
						layout: "fit",
						border: false,
						items: categoryList
					},{
						region: "center",
						xtype: "panel",
						id: "bookPanel",
						title: "Related Reading",
						autoScroll: true,
						tbar: {
							items: [{
												xtype: "tbfill"
											},{ 
												xtype: "tbbutton",
												text: "Re-Suggest",
												handler: function() {
													
													var selectedRecords = categoryList.getSelectionModel().getSelections();
													var bookCategories = [];
													
													Ext.each(selectedRecords, function(record) {
														bookCategories.push(record.get("category"));
											    });

													Ext.getCmp("bookPanel").update(generateBookPanel(bookCategories));
		
												}
											}]
									},
						html: generateBookPanel([])
					}]
			},{
				region: "center",
				xtype: "panel",
				border:false,
				layout:"fit",
				items: quizGrid
			}]
		});
		
		var selectAllCategories = function() {
			if (categoryList.getSelectionModel().isLocked()) {
				setTimeout(this, 100);
			} else {
				categoryList.getSelectionModel().selectAll();
			}
		}
		
		setTimeout(selectAllCategories, 100);
}