function doLogout(){
	$.getJSON("api.php?method=logout", function(data){
		if(!parseResponse(data)){
			document.location.href = "login.php";
		}
	});
}

function initTests(){
	$("#testsListSearch").defaultValue(L("app.testsList.toolbar.search"));
	$("#createNewTest").click(function() {
		createTestCreationWindow({
			windowTitle: L("app.crudTest.addTitle"),
			submitButtonTitle: L('app.crudTest.createButton'),
			formAction: 'api.php?method=create-test', 
			bHideImplementation: false,
			allowCancel: true, 
			callbackFunction: 'window.parent.processResponseOnTestSave'
		});
	});

	$("#editTest").click(function() {
		var testsToBeEdited = getSelectedRowsId($("#testsListGridContainer"), 'testId');

		if (testsToBeEdited.length > 1) {
			showInfo(L("app.crudTest.editMax1TestWarning"));
		} else if (testsToBeEdited.length < 1) {
			showInfo(L("app.crudTest.editMin1TestWarning"));
		} else {
			editTest(testsToBeEdited[0]);
		}
	});

	$("#deleteTest").click(function() {
		var buttons = {};
		var gridEl = $("#testsListGridContainer");
		var testsToBeDeleted = getSelectedRowsId(gridEl, 'testId');

		if (testsToBeDeleted.length < 1) {
			showInfo(L("app.testsList.deleteMin1TestWarning"));
			return;
		}

		buttons[L("app.testsList.deleteDialog.button")] = function() {
			var deleteTestButton = this;
			$.post(
				"api.php?method=delete-test",
				"testId=" + testsToBeDeleted.join(","),
				function(data, textStatus) {
					if (!parseResponse(data)) {
						$(deleteTestButton).dialog("destroy");

						Integrity.Tests.data = $.merge([], data.tests);

						$("#testsListGridContainer").jqGrid('clearGridData');
						$("#testsListGridContainer").jqGrid(
							'setGridParam',
							{data: Integrity.Tests.extendArray(data.tests)}
						);
						$("#testsListGridContainer").trigger('reloadGrid');
						showInfo(L("app.testsList.deletionSuccessfull"));
					}
				}
			);
		};

		$.tmpl('deleteTests', {"total": testsToBeDeleted.length }).i18n().dialog({
			title: L("app.testsList.deleteDialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	$('#testsListSearch, div.filters input, div.filters select')
	.bind('keyup change', function(event) {
		if (this.type === 'text' && event.type !== 'keyup') {
			return;
		} else if (this.type !== 'text' && event.type !== 'change') {
			return;
		}

		var aFilteredTests = Integrity.Tests.data;

		// 1st stage of filtering. by summary
		aFilteredTests = Integrity.Tests.filterBySummary(aFilteredTests);
		// 2nd stage of filtering. by platform
		aFilteredTests = Integrity.Tests.filterByPlatform(aFilteredTests);
		// 3rd stage of filtering. by test type
		aFilteredTests = Integrity.Tests.filterByTestType(aFilteredTests);
		// 4th stage of filtering. by tags
		aFilteredTests = Integrity.Tests.filterByTags(aFilteredTests);

		// create custom props that we miss in original rows
		aFilteredTests = Integrity.Tests.extendArray(aFilteredTests);

		$("#testsListGridContainer").jqGrid('clearGridData');
		$("#testsListGridContainer").jqGrid('setGridParam', {data: aFilteredTests});
		$("#testsListGridContainer").trigger('reloadGrid');
	});

	displayGrid({
		url2Load: "api.php?method=get-tests",
		gridContainerId: "#testsListGridContainer",
		pagerContainerId: "#testsListGridPager",
		gridWidthMultiplier: 0.84,
		gridOptions: {
			caption: L("app.testsList.grid.caption"),
			sortname: "summary",
			colModel:[
				{name:'testId', hidden: true, key: true},
				{name:'platform', label: L("app.testsList.grid.platform"), width: "10%"},
				{name:'summary', label: L("app.testsList.grid.summary"), width: "70%"},
				{name:'type', label: L("app.testsList.grid.type"), width: "10%"}
			],
			ondblClickRow: function(rowId, iRow, iCol, e) {
				editTest(rowId);
			},
			gridComplete: function() {
				$('#testsListGridContainer').jqGrid('setGridParam',{datatype:"local"});
				setPinnerHeight();
			}
		},
		convertCallback: Integrity.Tests.convertCallback
	});
}

function initOrganizations(){
	$("#createNewOrganization").click(function() {
		var buttons = {};
		buttons[L("app.organizations.add.dialog.create")] = function() {
			var orgId = null;
			var addOrgButton = this;
			var parentEl = $(this).parent();
			var orgName = $(parentEl).find("input[name='orgname']").val();
			var params = {
				"username": $(parentEl).find("input[name='username']").val(),
				"password": $(parentEl).find("input[name='password']").val(),
				"email": $(parentEl).find("input[name='email']").val(),
				"role": $(parentEl).find("select[name='role']").val()
			};

			if (!orgName || !params.username || !params.email || !params.role) {
				alert(L("app.organizations.add.emptyFields"));
				return;
			}

			$.when((function() {
				var deferredObj = new jQuery.Deferred();

				$.post(
					"api.php?method=create-organization",
					"data=" + JSON.stringify({name: orgName}),
					function(data, textStatus) {
						if (!parseResponse(data)) {
							params.organizationId = data.organizationId;
							params.organizationName = data.name;
							params.organizationStatus = data.active;
							params.organizationBy = Integrity.userData.username;
							deferredObj.resolve();
						} else {
							deferredObj.reject();
						}
					}
				);

				return deferredObj.promise();
			})()).done(function() {
				$.post(
					"api.php?method=create-user",
					"data=" + JSON.stringify(params),
					function(data, textStatus) {
						if (!parseResponse(data)) {
							$(addOrgButton).dialog("destroy");

							var companiesGridEl = $('#organiztionsList');
							var objCompany = {
								organizationId: params.organizationId,
								name: params.organizationName,
								active: params.organizationStatus,
								createdBy: params.organizationBy
							};
							Integrity.Companies.data.push(objCompany);

							companiesGridEl.jqGrid(
								'addRowData',
								1,
								Integrity.Companies.extendRow($.extend({}, objCompany))
							);

							companiesGridEl.trigger("reloadGrid");
							showInfo(L("app.organizations.add.additionSuccessfull"));

							var timeout = 20;
							var buttons = {};
							buttons[L("app.organizations.orgAdded.ok", timeout)] = function() {
								$(this).dialog("destroy");
								delete window.timeout;
								delete window.updateButtonTitle;
							};
							var updateButtonTitle = function(timeout) {
								var button = $(".ui-dialog-buttonpane span.ui-button-text");

								if (typeof timeout === "undefined" || --timeout < 1) {
									$(button).click();
								} else {
									$(button).text(L("app.organizations.orgAdded.ok", timeout));
									setTimeout(function() {updateButtonTitle(timeout)}, 1000);
								}
							};

							$.tmpl("newOrganizationAddedInfo", {
								"text1": L("app.organizations.orgAdded.text1", orgName),
								"text2": L("app.organizations.orgAdded.text2", document.location.href.replace(/(.*)\/.*/, "$1/login.php") + "?organizationId=" + params.organizationId)
							}).dialog({
								buttons: buttons,
								title: L("app.organizations.orgAdded.title")
							});

							updateButtonTitle(timeout);
						}
					}
				)
			});
		};

		$.tmpl('createNewUser', {companyCreation: true}).i18n().dialog({
			title: L("app.organizations.add.dialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	displayGrid({
		url2Load: "api.php?method=get-organizations",
		gridContainerId: "#organiztionsList",
		pagerContainerId: "#organizationsListPager",
		gridOptions: {
			caption: L("app.organizations.grid.caption"),
			sortname: "name",
			colModel:[
				{name:'organizationId', hidden: true, key: true},
				{name:'name', label: L("app.organizations.grid.name"), width: "44%"},
				{name:'activeStr', label: L("app.organizations.grid.status"), width: "8%"},
				{name:'createdBy', label: L("app.organizations.grid.createdBy"), width: "16%"}
			]
		},
		convertCallback: Integrity.Companies.convertCallback
	});
}

function initUsers(){
	$("#createNewUser").click(function() {
		var buttons = {};
		buttons[L("app.company.add.dialog.create")] = function() {
			var addUserButton = this;
			var parentEl = $(this).parent();
			var params = {
				"username": $(parentEl).find("input[name='username']").val(),
				"password": $(parentEl).find("input[name='password']").val(),
				"email": $(parentEl).find("input[name='email']").val(),
				"role": $(parentEl).find("select[name='role']").val()
			};

			if (!params.username || !params.email || !params.role) {
				// TODO password is not mandatory, but we say 'fill all fields'
				alert(L("app.organizations.add.emptyFields"));
				return;
			}

			$.post(
				"api.php?method=create-user",
				"data=" + JSON.stringify(params),
				function(data, textStatus) {
					if (!parseResponse(data)) {
						$(addUserButton).dialog("destroy");

						var objUser = $.extend({}, data);
						Integrity.Users.data.push(objUser);

						$('#employeesList').jqGrid(
							'addRowData',
							1,
							Integrity.Users.extendRow($.extend({}, objUser))
						);

						$('#employeesList').trigger("reloadGrid");
						showInfo(L('app.company.add.additionSuccessfull'));
					}
				}
			);
		};

		$.tmpl('createNewUser', {companyCreation: false}).i18n().dialog({
			title: L("app.company.add.dialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	$("#enableUser").click(function() {
		var userIdsdArray = getSelectedRowsId($('#employeesList'), 'userId');

		if (userIdsdArray.length < 1) {
			showInfo(L("app.company.enableMin1UserWarning"));
			return;
		}

		$.post(
			"api.php?method=edit-users-batch",
			"userId=" + userIdsdArray.join(",") + "&data=" + JSON.stringify({"active": true}),
			function(data, textStatus) {
				if (!parseResponse(data)) {
					for (var ii = 0; ii < data.users.length; ii++) {
						Integrity.Users.updateUser(data.users[ii]);

						$('#employeesList').jqGrid(
							'setRowData',
							data.users[ii].userId,
							Integrity.Users.extendRow($.extend({}, data.users[ii]))
						);
					}

					showInfo(L("app.company.enableSuccessful"));
				}
			}
		);
	});

	$("#disableUser").click(function() {
		var userIdsdArray = getSelectedRowsId($('#employeesList'), 'userId');

		if (userIdsdArray.length < 1) {
			showInfo(L("app.company.disableMin1UserWarning"));
			return;
		}

		$.post(
			"api.php?method=edit-users-batch",
			"userId=" + userIdsdArray.join(",") + "&data=" + JSON.stringify({"active": false}),
			function(data, textStatus) {
				if (!parseResponse(data)) {
					for (var ii = 0; ii < data.users.length; ii++) {
						Integrity.Users.updateUser(data.users[ii]);

						$('#employeesList').jqGrid(
							'setRowData',
							data.users[ii].userId,
							Integrity.Users.extendRow($.extend({}, data.users[ii]))
						);
					}

					showInfo(L("app.company.disableSuccessful"));
				}
			}
		);
	});

	displayGrid({
		url2Load: "api.php?method=get-users",
		gridContainerId: "#employeesList",
		pagerContainerId: "#employeesListPager",
		gridOptions: {
			caption: L("app.company.grid.caption"),
			sortname: "username",
			colModel: [
				{name: "userId", hidden: true, key: true},
				{name: "username", label: L("app.company.grid.username"), width: "35%"},
				{name: "email", label: L("app.company.grid.email"), width: "35%"},
				{name: "role_i18n", label: L("app.company.grid.role"), width: "15%"},
				{name: "activeStr", label: L("app.company.grid.status"), width: "15%"}
			]
		},
		convertCallback: Integrity.Users.convertCallback
	});
}

function initSuites() {
	$("#addTo").click(function() {
		var addToButton = this;
		$(this).button("disable").poshytip({
			content: $.tmpl('addTest2Suite', {suites: Integrity.Suites.data}).i18n(),
			showOn: 'none',
			alignTo: 'target',
			alignX: 'center',
			alignY: 'bottom',
			offsetY: 5,
			className: 'tip-yellowsimple'
		}).poshytip('show');

		var container = $(".addTest2SuiteContainer");
		var onClick = function(event) {
			if (
				addToButton !== event.target &&
				!$(event.target).closest("div[class='tip-yellowsimple']").length
			) {
				$("#addTo").button("enable").poshytip('hide');
				$('body').unbind('click', onClick);
			}
		};
		$("body").click(onClick);

		container.find("input[name='add']").click(function() {
			var testsIdArray = getSelectedRowsId($("#testsListGridContainer"), 'testId');
			var suitesIdArray = container.find(":checked").map(function(){return this.value;}).toArray();

			if (testsIdArray.length == 0 || suitesIdArray.length == 0) {
				alert(L("app.testsList.addTo.noData"));
				return;
			}

			$.post(
				"api.php?method=suite-add-test",
				"suiteId=" + suitesIdArray.join(",") + "&testId=" + testsIdArray.join(","),
				function(data, textStatus) {
					if(!parseResponse(data)){
						$("#addTo").button("enable").poshytip('hide');
						var gridEl = $("#testSuitesListGridContainer");
						var objNewSuite = null;

						for (var ii = data.suites.length - 1; ii >= 0; ii--) {
							objNewSuite = data.suites[ii];
							Integrity.Suites.updateSuite(objNewSuite);

							gridEl.jqGrid('setRowData', objNewSuite.suiteId, objNewSuite);
						}

						showInfo(L("app.testsList.addTo.additionSuccessfull"));
					}
				}
			).error(function(jqXHR, textStatus, errorThrown) {
				alert(textStatus);
			});
		});

		container.find("span.clickable").click(function() {
			var suiteName = prompt(L('app.testsList.addTo.newSuiteNamePrompt'));

			if (suiteName.length > 0) {
				$.post(
					"api.php?method=create-suite",
					"data=" + JSON.stringify({'suiteName': suiteName}),
					function(data, textStatus) {
						if (!parseResponse(data)) {
							var objSuite = $.extend({}, data.suites[0]);
							Integrity.Suites.data.push(objSuite);

							$('#testSuitesListGridContainer').jqGrid('addRowData', 1, objSuite);
							$('#testSuitesListGridContainer').trigger('reloadGrid');
							showInfo(L("app.suites.add.additionSuccessfull"));

							container.find("ul").prepend(
								$('#suiteItem4AddTest2SuiteTemplate').tmpl(
									$.extend({'checked': true}, objSuite)
								)
							);

							container.find('input[name="add"]').attr('disabled', false);
						}
					}
				);
			}
		});

		container.find("input[name='autocomplete']")
		.defaultValue(L("app.testsList.addTo.search"))
		.keyup(function() {
			var value = this.value.toLowerCase();
			container.find("li").each(function() {
				var el = $(this);
				if (el.text().toLowerCase().indexOf(value) > -1) {
					el.show();
				} else {
					el.hide();
				}
			});

			container.find('input[name="add"]').attr(
				'disabled',
				container.find('li:visible').length < 1
			);
		});
	});

	$("#createTestSuite").click(function() {
		var buttons = {};
		buttons[L("app.suites.add.dialog.create")] = function() {
			var addSuiteButton = this;
			var parentEl = $(this).closest(".createNewSuiteContainer");
			var params = {
				"suiteName": $(parentEl).find("input[name='name']").val(),
				"suiteDescription": $(parentEl).find("input[name='description']").val()
			};

			if (!params.suiteName.length) {
				alert(L("app.suites.add.noName"));
				return;
			}

			$.post(
				"api.php?method=create-suite",
				"data=" + JSON.stringify(params),
				function(data, textStatus) {
					if (!parseResponse(data)) {
						$(addSuiteButton).dialog("destroy");

						var objSuite = $.extend({}, data.suites[0]);
						Integrity.Suites.data.push(objSuite);

						$('#testSuitesListGridContainer').jqGrid('addRowData', 1, data.suites[0]);
						$('#testSuitesListGridContainer').trigger("reloadGrid");
						showInfo(L("app.suites.add.additionSuccessfull"));
					}
				}
			);
		};

		$.tmpl('createSuite').i18n().dialog({
			title: L("app.suites.add.dialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	$("#deleteTestSuite").click(function() {
		var buttons = {};
		var gridEl = $("#testSuitesListGridContainer");
		var suitesTo2Deleted = getSelectedRowsId(gridEl, "suiteId");

		if (suitesTo2Deleted.length < 1) {
			showInfo(L("app.suites.delete.processMin1SuiteWarning"));
			return;
		}

		buttons[L("app.suites.delete.dialog.delete")] = function() {
			var deleteSuiteButton = this;
			$.post(
				"api.php?method=delete-suite",
				"suiteId=" + suitesTo2Deleted.join(","),
				function(data, textStatus) {
					if (!parseResponse(data)) {
						$(deleteSuiteButton).dialog("destroy");

						Integrity.Suites.data = data.suites;

						for (var ii = 0; ii < suitesTo2Deleted.length; ii++) {
							gridEl.jqGrid('delRowData', suitesTo2Deleted[ii]);
						}

						showInfo(L("app.suites.delete.deletionSuccessfull"));
					}
				}
			);
		};

		$.tmpl('deleteSuite', {"total": suitesTo2Deleted.length }).i18n().dialog({
			title: L("app.suites.delete.dialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	$("#editTestSuite").click(function() {
		var buttons = {};
		var gridEl = $("#testSuitesListGridContainer");
		var suitesTo2Edited = getSelectedRowsId(gridEl, "suiteId");

		if (suitesTo2Edited.length > 1) {
			showInfo(L("app.suites.update.editMax1SuiteWarning"));
			return;
		} else if (suitesTo2Edited.length < 1) {
			showInfo(L("app.suites.update.processMin1SuiteWarning"));
			return;
		}

		buttons[L("app.suites.update.dialog.update")] = function() {
			var updateSuiteButton = this;
			var parentEl = $(this).parent();
			var params = {
				name: $(parentEl).find("input[name='name']").val(),
				description: $(parentEl).find("input[name='description']").val(),
				suiteId: suitesTo2Edited[0]
			};

			if (!params.name.length) {
				alert(L("app.suites.update.noName"));
				return;
			}

			$.post(
				"api.php?method=edit-suite",
				"data=" + JSON.stringify(params),
				function(data, textStatus) {
					if (!parseResponse(data)) {
						$(updateSuiteButton).dialog("destroy");
						showInfo(L("app.suites.update.updateSuccessfull"));

						var objSuite = $.extend({}, data.suites[0]);
						var objOldSuite = Integrity.Suites.getSuiteById(objSuite.suiteId);
						var oldName = objOldSuite.name;
						Integrity.Suites.updateSuite(objSuite);

						gridEl.jqGrid('setRowData', objSuite.suiteId, $.extend({}, objSuite));
						if (oldName !== objSuite.name) {
							gridEl.trigger("reloadGrid");
						}
					}
				}
			);
		};

		$.tmpl('createSuite', {
			"oldName": $("#testSuitesListGridContainer").jqGrid("getCell", suitesTo2Edited[0], "name"),
			"oldDescription": $("#testSuitesListGridContainer").jqGrid("getCell", suitesTo2Edited[0], "description")
		}).i18n().dialog({
			title: L("app.suites.update.dialog.title"),
			modal: true,
			buttons: buttons
		});
	});

	$("#assignTestSuite").click(function() {
		var assignButton = this;

		$(this).button("disable").poshytip({
			content: $.tmpl('assignSuite', {testers: Integrity.Users.data}).i18n(),
			showOn: 'none',
			alignTo: 'target',
			alignX: 'center',
			alignY: 'bottom',
			offsetY: 5,
			className: 'tip-yellowsimple'
		}).poshytip('show');

		var container = $(".assignSuiteContainer");
		var onClick = function(event) {
			if (
				assignButton !== event.target &&
				!$(event.target).closest("div[class='tip-yellowsimple']").length
			) {
				$("#assignTestSuite").button("enable").poshytip('hide');
				$('body').unbind('click', onClick);
			}
		};
		$("body").click(onClick);

		container.find("input[name='assign']").click(function() {
			var grid = $("#testSuitesListGridContainer");
			var suitesIdArray = _.reduce(grid.jqGrid("getGridParam", "selarrrow"), function(memo, row){
				var val = grid.jqGrid("getCell", row, "suiteId");
				// avoid storing empty checkboxes - for example select all
				if(val !== ""){
					memo.push(val);
				}
				return memo;
			}, []);

			var testerId = container.find("input:checked");

			if (suitesIdArray.length == 0){
				alert(L("app.suites.assignTo.noSuitesData"));
				return;
			} else if(testerId.length == 0) {
				alert(L("app.suites.assignTo.noUserData"));
				return;
			}
			testerId = testerId.val();
			var notes = container.find('input[name="notes"]').val();
			$.post(
				"api.php?method=suite-assign-users",
				"userId=" + testerId + "&suiteId=" + suitesIdArray.join(",") + "&notes=" + encodeURIComponent(notes),
				function(data, textStatus) {
					if(!parseResponse(data)){
						$("#assignTestSuite").button("enable").poshytip('hide');
						showInfo(L("app.suites.assignTo.assignSuccessfull"));
					}
				}
			).error(function(jqXHR, textStatus, errorThrown) {
				alert(textStatus);
			});
		});

		container.find(".addNotes").click(function(){
			$(this).hide();
			container.find(".addNotesContainer").show();
		});
		
		container.find(".noItems").hide();
		container.find("input[name='autocomplete']").defaultValue(L("app.suites.assignTo.search")).keyup(function() {
			var value = this.value.toLowerCase();
			container.find("li").each(function() {
				var el = $(this);
				if (el.text().toLowerCase().indexOf(value) > -1) {
					el.show();
				} else {
					el.hide();
				}
			});

			if(container.find("li:visible").length === 0){
				// nothing found
				container.find(".noItems").show();
			} else {
				container.find(".noItems").hide();
			}
		});
	});

	displayGrid({
		url2Load: "api.php?method=get-suites",
		gridContainerId: "#testSuitesListGridContainer",
		pagerContainerId: "#testSuitesListGridPager",
		gridOptions: {
			caption: L("app.suites.grid.caption"),
			sortname: "name",
			subGrid: true,
			gridview: false,
			colModel:[
				{name:'suiteId', hidden: true, key: true},
				{name:'name', label: L("app.suites.grid.name"), width: "20%"},
				{name:'description', label: L("app.suites.grid.description"), width: "80%"},
				{name:'testsList', hidden: true}
			],
			ondblClickRow: function(rowId, iRow, iCol, e) {
				$("#testSuitesListGridContainer").jqGrid('setSelection', rowId, true);
				$("#editTestSuite").click();
			},
			subGridRowExpanded: function(subgridId, rowId) {
				$.tmpl('subGridContainer', {'subgridId': subgridId}).i18n().appendTo('#' + subgridId);

				displayGrid({
					gridContainerId: '#' + subgridId + 'SubGridTableContainer',
					pagerContainerId: '#' + subgridId + 'SubGridPagerContainer',
					gridWidthMultiplier: 0.8,
					gridOptions: {
						caption: L(
							"app.testsList.subGrid.title",
							$('#testSuitesListGridContainer').jqGrid("getCell", rowId, "name")
						),
						sortname: "summary",
						colModel: [
							{name:'testId', hidden: true, key: true},
							{name:'platform', label: L("app.testsList.grid.platform"), width: "10%"},
							{name:'summary', label: L("app.testsList.grid.summary"), width: "70%"},
							{name:'type', label: L("app.testsList.grid.type"), width: "10%"}
						],
						datatype: function() {
							// TODO: try to rewrite this code
							// (more use of already written code)
							var nTests = Integrity.Tests.data.length;
							var gridDataObj = [];
							var testIdsArray = $($('#testSuitesListGridContainer')
								.jqGrid("getCell", rowId, "testsList").split(",")).get();

							for (var ii = 0; ii < nTests; ii++) {
								if ($.inArray(Integrity.Tests.data[ii].testId, testIdsArray) > -1) {
									gridDataObj.push($.extend({}, Integrity.Tests.data[ii]));

									Integrity.Tests.extendRow(gridDataObj[gridDataObj.length - 1]);
								}
							}

							this.addJSONData(createGenericData4Grid(gridDataObj));
						}
					}
				});

				$('div[id$="' + subgridId + 'SubGridTableContainer"]').css('float', 'left');
				$('div.subGridControlsContainer input').button().click(function() {
					var deletedTests = getSelectedRowsId($('#' + subgridId + 'SubGridTableContainer') , "testId");

					var testIdsArray = $($('#testSuitesListGridContainer')
						.jqGrid("getCell", rowId, "testsList").split(","))
						.map(function(item, ii) {
							if ($.inArray(ii, deletedTests) < 0) {
								return parseInt(ii);
							}
						}).get();

					var params = {
						suiteId: rowId,
						testsList: testIdsArray
					};

					$.post(
						"api.php?method=edit-suite",
						"data=" + JSON.stringify(params),
						function(data, textStatus) {
							if (!parseResponse(data)) {
								var gridEl = $('#' + subgridId + 'SubGridTableContainer');
								var nRows = data.suites[0].testsList ? data.suites[0].testsList.length : 0;

								if (nRows + testIdsArray.length !== testIdsArray.length) {
									for (var ii = 0; ii < deletedTests.length; ii++) {
										gridEl.jqGrid('delRowData', deletedTests[ii]);
									}
								} else {
									gridEl.jqGrid('GridDestroy');
									$("#testSuitesListGridContainer").jqGrid('toggleSubGridRow', rowId);
								}

								showInfo(L("app.suites.update.updateSuccessfull"));
							}
						}
					);
				});
			}
		},
		convertCallback: Integrity.Suites.convertCallback
	});

	$.getJSON("api.php?method=get-users", function(data){
		if(!parseResponse(data)){
			Integrity.Users.data = data.users;
		}
	});
}

function initAssignedSuites(){
	$("#executeSuiteRun").click(function() {
		var gridEl = $("#assignedSuitesListGridContainer");
		var suites2Execute = getSelectedRowsId(gridEl, "suiteRunId");

		if (suites2Execute.length < 1) {
			showInfo(L("app.assignedSuites.processMin1SuiteRunWarning"));
			return;
		} else if(suites2Execute.length > 1){
			showInfo(L("app.assignedSuites.singleSuiteRunOnlyWarning"));
			return;
		}

		window.open("tester.php?suiteRunId=" + suites2Execute[0]);
	});

	displayGrid({
		url2Load: "api.php?method=get-assigned-suites",
		gridContainerId: "#assignedSuitesListGridContainer",
		pagerContainerId: "#assignedSuitesListGridPager",
		gridOptions: {
			caption: L("app.assignedSuites.grid.caption"),
			sortname: "whenRaw",
			colModel: [
				{name: "suiteRunId", hidden: true, key: true},
				{name: "suiteName", label: L("app.assignedSuites.grid.suite"), width: "20%"},
				{name: "whenRaw", hidden: true},
				{name: "when", label: L("app.assignedSuites.grid.when"), width: "10%"},
				{name: "assigner", label: L("app.assignedSuites.grid.assigner"), width: "10%"},
				{name: "notes", label: L("app.assignedSuites.grid.notes"), width: "60%"}
			]
		},
		convertCallback: Integrity.AssignedSuites.convertCallback
	});
}

function initCompletedSuiteRuns() {
	displayGrid({
		url2Load: "api.php?method=get-completed-suites",
		gridContainerId: "#testRunsList",
		pagerContainerId: "#testRunsListPager",
		gridOptions: {
			caption: L("app.completedSuites.grid.caption"),
			sortname: "whenRaw",
			altRows: false,
			gridview: false,
			subGrid: true,
			multiselect: false,
			colModel: [
				{name: "suiteRunId", hidden: true, key: true},
				{name: "suiteName", label: L("app.completedSuites.grid.suite"), width: "20%"},
				{name: "whenRaw", hidden: true},
				{name: "when", label: L("app.completedSuites.grid.when"), width: "10%"},
				{name: "assigner", label: L("app.completedSuites.grid.assigner"), width: "10%"},
				{name: "notes", label: L("app.completedSuites.grid.notes"), width: "60%"},
				{name: "success", hidden: true}
			],
			gridComplete: function() {
				var nGridContainer = $('#testRunsList');
				var rowData = nGridContainer.jqGrid('getGridParam', 'data');
				nGridContainer.jqGrid('setGridParam',{datatype:"local"});

				for (var ii = 0; ii < rowData.length; ii++) {
					nGridContainer.jqGrid(
						'setRowData',
						rowData[ii].suiteRunId,
						false,
						{
							'background-image': 'url("")',
							'background-color': rowData[ii].success ?
								'#aae3a4' : '#f3acac'
						}
					);
				}
			},
			subGridRowExpanded: function(subgridId, rowId) {
				var oSuite = Integrity.CompletedSuites.getSuiteById(rowId);

				if (typeof oSuite !== 'object') {
					return;
				}

				var oTest = null;
				var bTestFailed = null;
				var bTestNotes = null;
				var passedTests = 0;
				var passedTestsNotes = 0;
				var failedTests = 0;
				var passedCommands = 0;
				var passedCommandsNotes = 0;
				var failedCommands = 0;

				for (var ii = oSuite.tests.length - 1; ii >= 0; ii--) {
					oTest = oSuite.tests[ii];
					bTestFailed = false;
					bTestNotes = false;

					for (var jj = oTest.steps.length - 1; jj >= 0; jj--) {

						if (oTest.steps[jj].success) {
							if (oTest.steps[jj].notes) {
								passedCommandsNotes++;
								bTestNotes = true;
							} else {
								passedCommands++;
							}
						} else {
							failedCommands++;
							bTestFailed = true;
						}
					}

					if (bTestFailed) {
						failedTests++;
					} else {
						if (bTestNotes) {
							passedTestsNotes++;
						} else {
							passedTests++;
						}
					}
				}

				$.tmpl(
					'completedSuitesSubGrid',
					{
						'subgridId': subgridId,
						'passedTests': passedTests,
						'passedTestsNotes': passedTestsNotes,
						'failedTests': failedTests,
						'passedCommands': passedCommands,
						'passedCommandsNotes': passedCommandsNotes,
						'failedCommands': failedCommands
					}
				).i18n().appendTo('#' + subgridId);

				var nGridContainer = displayGrid({
					gridContainerId: '#' + subgridId + 'completedSuitesSubGridTableContainer',
					pagerContainerId: '#' + subgridId + 'completedSuitesSubGridPagerContainer',
					gridWidthMultiplier: 0.8,
					gridOptions: {
						caption: L(
							"app.completedSuites.subGrid.title",
							$('#testRunsList').jqGrid("getCell", rowId, "suiteName"),
							$('#testRunsList').jqGrid("getCell", rowId, "suiteRunId")
						),
						sortname: "summary",
						multiselect: false,
						hiddengrid: true,
						colModel: [
							{name:'testId', hidden: true, key: true},
							{name:'quality', label: L("app.testsList.grid.quality"), width: "6%"},
							{name:'state', hidden: true},
							{name:'platform', label: L("app.testsList.grid.platform"), width: "10%"},
							{name:'summary', label: L("app.testsList.grid.summary"), width: "70%"},
							{name:'type', label: L("app.testsList.grid.type"), width: "10%"}
						],
						gridComplete: function() {
							var nGridContainer = $('#' + subgridId + 'completedSuitesSubGridTableContainer');
							var rowData = nGridContainer.jqGrid('getGridParam', 'data');
							nGridContainer.jqGrid('setGridParam',{datatype:"local"});

							for (var ii = 0; ii < rowData.length; ii++) {
								nGridContainer.jqGrid(
									'setRowData',
									rowData[ii].testId,
									false,
									{
										'background-image': 'url("")',
										'background-color': rowData[ii].state
									}
								);
							}
						},
						datatype: function() {
							var oGridData = this.addJSONData(
								Integrity.CompletedSuites.convertSubgridCallback(oSuite)
							);
						},
						onCellSelect: function(subGridRowId, subGridICol, cellcontent, e) {
							// 2nd column is column with our stats for selected test
							if (subGridICol === 2) {
								for (var ii = oSuite.tests.length - 1; ii >= 0; ii--) {
									if (oSuite.tests[ii].testId == subGridRowId) {
										var nDialogContent = $.tmpl(
											'testResultsDetails',
											{ test: oSuite.tests[ii] }
										);

										nDialogContent.i18n();
										nDialogContent.dialog({
											title: L("app.completedSuites.testResultsDialog.title"),
											buttons: {
												'OK': function() {
													$(this).dialog("close");
												}
											}
										});

										break;
									}
								}
							}
						}
					}
				});

				var nHeaderButton = nGridContainer.
					closest('div[id$="completedSuitesSubGridTableContainer"][class*="ui-widget"]').
					find('a[class="ui-jqgrid-titlebar-close HeaderButton"]');

				$('div.completedSuitesSubGridInfoContainer span[data-l$="showAll"]').click(function() {
					var filterCallback = function(oTest) {
						return true;
					};

					if (nHeaderButton.find('span').attr('class').indexOf('triangle-s') > 0) {
						nHeaderButton.click();
					}
					nGridContainer.jqGrid('clearGridData');
					nGridContainer.jqGrid(
						'setGridParam',
						{
							data: Integrity.CompletedSuites.convertSubgridCallback(
								oSuite,
								filterCallback
							)
						}
					);

					nGridContainer.trigger("reloadGrid");
				});

				$('div.completedSuitesSubGridInfoContainer')
					.find('span[data-l$="passedTests"] + span, span[data-l$="passedCommands"] + span')
					.click(function() {
						var filterCallback = function(oTest) {
							return _.reduce(
								oTest.steps,
								function(memo, oStep) {
									return memo && !oStep.notes && oStep.success;
								},
								true
							);
						};

						if (nHeaderButton.find('span').attr('class').indexOf('triangle-s') > 0) {
							nHeaderButton.click();
						}
						nGridContainer.jqGrid('clearGridData');
						nGridContainer.jqGrid(
							'setGridParam',
							{
								data: Integrity.CompletedSuites.convertSubgridCallback(
									oSuite,
									filterCallback
								)
							}
						);

						nGridContainer.trigger("reloadGrid");
					});

				$('div.completedSuitesSubGridInfoContainer')
					.find('span[data-l$="passedTestsNotes"] + span, span[data-l$="passedCommandsNotes"] + span')
					.click(function() {
						var filterCallback = function(oTest) {
							return _.reduce(
								oTest.steps,
								function(memo, oStep) {
									return memo && oStep.notes && oStep.success
								},
								true
							);
						};

						if (nHeaderButton.find('span').attr('class').indexOf('triangle-s') > 0) {
							nHeaderButton.click();
						}
						nGridContainer.jqGrid('clearGridData');
						nGridContainer.jqGrid(
							'setGridParam',
							{
								data: Integrity.CompletedSuites.convertSubgridCallback(
									oSuite,
									filterCallback
								)
							}
						);

						nGridContainer.trigger("reloadGrid");
					});

				$('div.completedSuitesSubGridInfoContainer')
					.find('span[data-l$="failedTests"] + span, span[data-l$="failedCommands"] + span')
					.click(function() {
						var filterCallback = function(oTest) {
							return _.reduce(
								oTest.steps,
								function(memo, oStep) {
									return memo && oStep.success === false
								},
								true
							);
						};

						if (nHeaderButton.find('span').attr('class').indexOf('triangle-s') > 0) {
							nHeaderButton.click();
						}
						nGridContainer.jqGrid('clearGridData');
						nGridContainer.jqGrid(
							'setGridParam',
							{
								data: Integrity.CompletedSuites.convertSubgridCallback(
									oSuite,
									filterCallback
								)
							}
						);

						nGridContainer.trigger("reloadGrid");
					});
			}
		},
		convertCallback: Integrity.CompletedSuites.convertCallback
	});
}

function initApp(userData){
	Integrity.userData = userData;

	$.tmpl("indexMain", {user: userData}).appendTo(document.body).i18n().find('input[type="button"], input[type="submit"]').button();

	$("#logoutButton").click(doLogout);

	if (_.include(userData.roles, "superadmin")) {
		initOrganizations();
	}

	if (_.include(userData.roles, "groupadmin")) {
		initUsers();
	}

	if (
		_.include(userData.roles, "testwriter") ||
		_.include(userData.roles, "testmanager")
	) {
		initTests();
	}

	if (_.include(userData.roles, "testmanager")) {
		initSuites();
	}

	if (
		_.include(userData.roles, "tester") ||
		_.include(userData.roles, "testmanager")
	) {
		initCompletedSuiteRuns();
	}

	if (_.include(userData.roles, "tester")) {
		initAssignedSuites();
	}

	$("#switcherTabs").tabs();
}

function displayGrid(objGridParams) {
	var gridOptions = {
		datatype: function() {
			var grid = this;
			$.getJSON(objGridParams.url2Load, function(data) {
				if (!parseResponse(data)) {
					grid.addJSONData(objGridParams.convertCallback(data));
					$(objGridParams.gridContainerId).trigger("reloadGrid");
				}
			});
		},
		width: Math.round($(window).width() *
			(objGridParams.gridWidthMultiplier || 0.96)),
		height: "74%",
		jsonReader: { repeatitems: false },
		rowList: [10, 20, 30, 50, 100],
		pager: objGridParams.pagerContainerId,
		altRows: true,
		rownumbers: true,
		loadonce: true,
		multiselect: true,
		sortable: true,
		viewrecords: true,
		gridview: true,
		gridComplete: function() {
			$(objGridParams.gridContainerId).jqGrid('setGridParam',{datatype:"local"});
		}
	};

	$.extend(true, gridOptions, objGridParams.gridOptions);
	return $(objGridParams.gridContainerId).jqGrid(gridOptions);
}

$(function(){
	initTemplates();
	jQuery.ajaxSetup({error: handleErrorResponse});

	$.getJSON("api.php?method=check", function(data, status){
		if (data.errorCode === "AUTH-008") {
			// not logged in
			document.location.href = "login.php";
		} else if(!parseResponse(data)){
			if(data == null || data.userId == null){
				// not logged in
				document.location.href = "login.php";
			} else {
				initApp(data);
			}
		}
	});
});


