/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var xhrobj;
var blockHide = 0;
var currentOver = '';

function nocasesort(a, b) {
	var al = a.toLowerCase();
	var bl = b.toLowerCase();
	if(al < bl)
		return -1;
	if(bl < al)
		return 1;
	return 0;
}

function getGroupInfo(groupid) {
	var cont = dojo.byId('jsongroupinfocont').value;
	var domid = 'listicon' + groupid;
	currentOver = domid;
	dojo.byId(domid).onmouseover = '';
	xhrobj = dojo.xhrPost({
		url: 'index.php',
		load: showGroupInfo,
		handleAs: "json",
		error: errorHandler,
		content: {continuation: cont,
		          groupid: groupid},
		timeout: 15000
	});
}

function mouseoverHelp() {
	currentOver = 'listicon0';
	var obj = dijit.byId('listicon0tt');
	if(! obj) {
		var tt = new dijit.Tooltip({
		   id: 'listicon0tt',
		   connectId: ['listicon0'],
		   label: 'mouse over icon to<br>display a group&#146;s<br>resources'
		});
		tt.open(dojo.byId('listicon0'));
	}
	else
		obj.open(dojo.byId('listicon0'));
}

function showGroupInfoCancel(groupid) {
	currentOver = '';
	dojo.byId('listicon' + groupid).onmouseout = '';
}

function showGroupInfo(data, ioArgs) {
	var members = data.items.members;
	var domid = 'listicon' + data.items.groupid;
	var tt = new dijit.Tooltip({
		connectId: [domid],
		label: members
	});
	if(currentOver == domid)
		tt.open(dojo.byId(domid));
}

function fmtUserGroupDeleteBtn(groupid, rowIndex) {
	var rowdata = this.grid.getItem(rowIndex);
	if(rowdata.deletable == 0)
		return '';
	var btn = new dijit.form.Button({
		label: 'Delete',
		onClick: function() {
			confirmDeleteUserGroup(groupid);
		}
	});
	btn._destroyOnRemove = true;
	return btn;
}

function confirmDeleteUserGroup(groupid) {
	var data = {continuation: dojo.byId('deletegroupcont').value,
	            groupid: groupid};
	RPCwrapper(data, confirmDeleteGroupCB, 1);
}

function confirmDeleteGroupCB(data, ioArgs) {
	if(data.items.status == 'nogroup' ||
	   data.items.status == 'noaccess' ||
	   data.items.status == 'inuse') {
		dojo.byId('confirmDeleteHeading').innerHTML = data.items.title;
		dojo.byId('confirmDeleteQuestion').innerHTML = '';
		dojo.byId('confdelcontent').innerHTML = data.items.msg;
		hideDijitButton('deleteBtn');
	}
	else {
		showDijitButton('deleteBtn');
		dojo.byId('confirmDeleteHeading').innerHTML = data.items.title;
		dojo.byId('confirmDeleteQuestion').innerHTML = data.items.question;
		dojo.byId('confdelcontent').innerHTML = data.items.content;
		dojo.byId('submitdeletecont').value = data.items.cont;
	}
	dijit.byId('confirmDeleteDialog').show();
}

function clearHideConfirmDelete() {
	dijit.byId('confirmDeleteDialog').hide();
	dojo.removeClass('deleteBtn', 'hidden');
	dojo.byId('confirmDeleteHeading').innerHTML = '';
	dojo.byId('confirmDeleteQuestion').innerHTML = '';
	dojo.byId('confdelcontent').innerHTML = '';
}

function submitDeleteGroup() {
	var data = {continuation: dojo.byId('submitdeletecont').value};
	RPCwrapper(data, submitDeleteGroupCB, 1);
}

function submitDeleteGroupCB(data, ioArgs) {
	clearHideConfirmDelete();
	if(data.items.type == 'user') {
		usergroupstore.fetchItemByIdentity({
			'identity': data.items.id,
			'onItem': function(item) {
				usergroupstore.deleteItem(item);
			}
		});
	}
	else {
		resourcegroupstore.fetchItemByIdentity({
			'identity': data.items.id,
			'onItem': function(item) {
				resourcegroupstore.deleteItem(item);
			}
		});
	}
}

function fmtUserGroupEditBtn(groupid, rowIndex) {
	var btn = new dijit.form.Button({
		label: 'Edit',
		onClick: function() {
			editUserGroup(groupid);
		}
	});
	btn._destroyOnRemove = true;
	return btn;
}

function editUserGroup(groupid) {
	// call url with continuation, groupid
	var cont = dojo.byId('editgroupcont').value;
	window.location.href = 'index.php?continuation=' + cont + '&groupid=' + groupid;
}

function usergroupGridFilter() {
	var name = '.*';
	if(dojo.byId('namefilter') && dojo.byId('namefilter').value.length)
		name += dojo.byId('namefilter').value + '.*';

	var affilid = dijit.byId('affiliationfilter').get('value');
	if(affilid == 0)
		affilid = '*';

	var owner = dijit.byId('ownerfilter').get('value');
	if(owner == 'all')
		owner = '*';

	var query = new Array();
	if(! dijit.byId('shownormal') &&
	   ! dijit.byId('showfederated') &&
	   ! dijit.byId('showcourseroll')) {
		query.push('.*');
	}
	else {
		if(dijit.byId('shownormal').get('value'))
			query.push('normal');
		if(dijit.byId('showfederated').get('value'))
			query.push('federated');
		if(dijit.byId('showcourseroll').get('value'))
			query.push('courseroll');
	}
	var type = query.join('|');
	var cookietype = query.join('_');
	if(query.length == 0)
		type = 'foo';

	var editid = dijit.byId('editgroupfilter').get('value');
	if(editid == 0)
		editid = '*';
	if(editid == -1)
		editid = 'NULL';

	var cookiedata = "type:" + cookietype + "|owner:" + owner + "|name:" + name + "|affilid:" + affilid + "|editgroupid:" + editid;
	dojo.cookie('GROUPFILTER', cookiedata, {expires: 15, path: '/', domain: cookiedomain});

	usergroupgrid.setQuery({type: new RegExp(type),
	                        owner: owner,
	                        name: new RegExp(name, 'i'),
	                        groupaffiliationid: affilid,
	                        editgroupid: editid});
}

function buildUserFilterStores() {
	if(typeof usergroupstore === 'undefined' ||
	   ! usergroupstore._loadFinished) {
		setTimeout(buildUserFilterStores, 500);
		return;
	}
	usergroupstore.affiliations = new Object();
	usergroupstore.owners = new Object();
	usergroupstore.editgroups = new Object();
	usergroupstore.fetch({query: {id: '*'},
		onItem: function(item) {
			var affilid = usergroupstore.getValue(item, 'groupaffiliationid');
			var affil = usergroupstore.getValue(item, 'groupaffiliation');
			usergroupstore.affiliations[affilid] = affil;
			var owner = usergroupstore.getValue(item, 'owner');
			usergroupstore.owners[owner] = owner;
			var editid = usergroupstore.getValue(item, 'editgroupid');
			var edit = usergroupstore.getValue(item, 'editgroup');
			if(edit != 'None')
				usergroupstore.editgroups[editid] = edit;
		},
		onComplete: function() {
			var cnt = 0;
			for(var p in usergroupstore.owners) {
				if(usergroupstore.owners.hasOwnProperty(p))
					cnt = 1;
					break;
			}
			if(cnt == 0) {
				dojo.byId('usergroupcontainer').innerHTML = "You do not have access to any user groups.";
				return;
			}
			var newitem = {};
			newitem = {'id': '0', 'name': ' Any'};
			affiliationstore.newItem(newitem);
			for(affilid in usergroupstore.affiliations) {
				newitem = {'id': affilid, 'name': usergroupstore.affiliations[affilid]};
				affiliationstore.newItem(newitem);
			}
			dijit.byId('affiliationfilter').setStore(affiliationstore, '', {query: {id: '*'}});
			delete usergroupstore.affiliations;

			var newitem = {};
			newitem = {'id': 'all', 'name': ' Any'};
			ownerstore.newItem(newitem);
			for(owner in usergroupstore.owners) {
				newitem = {'id': owner, 'name': owner};
				ownerstore.newItem(newitem);
			}
			dijit.byId('ownerfilter').setStore(ownerstore, '', {query: {id: '*'}});
			delete usergroupstore.owners;

			newitem = {'id': '0', 'name': ' Any'};
			editgroupstore.newItem(newitem);
			newitem = {'id': '-1', 'name': ' None'};
			editgroupstore.newItem(newitem);
			for(editid in usergroupstore.editgroups) {
				newitem = {'id': editid, 'name': usergroupstore.editgroups[editid]};
				editgroupstore.newItem(newitem);
			}
			dijit.byId('editgroupfilter').setStore(editgroupstore, '', {query: {id: '*'}});
			delete usergroupstore.editgroups;

			setFiltersFromCookie();
		}
	});
}

function setFiltersFromCookie() {
	var tmp = dojo.cookie('GROUPFILTER');
	if(typeof tmp == 'undefined') {
		return;
	}
	var data = tmp.split('|');
	dijit.byId('shownormal').set('value', 0);
	dijit.byId('showfederated').set('value', 0);
	dijit.byId('showcourseroll').set('value', 0);
	var regex = new RegExp('normal');
	if(data[0].match(regex)) {
		dijit.byId('shownormal').set('value', 1);
	}
	regex = new RegExp('federated');
	if(data[0].match(regex)) {
		dijit.byId('showfederated').set('value', 1);
	}
	regex = new RegExp('courseroll');
	if(data[0].match(regex)) {
		dijit.byId('showcourseroll').set('value', 1);
	}
	var owner = data[1].split(':');
	regex = new RegExp('^[-A-Za-z0-9_@\.]*$');
	if(owner[1] == '*') {
		dijit.byId('ownerfilter').set('value', 'all');
	}
	else if(owner[1].match(regex)) {
		dijit.byId('ownerfilter').set('value', owner[1]);
	}
	var name = data[2].split(':');
	regex = new RegExp('^\.\*[-A-Za-z0-9_@\.]*\.\*$');
	if(name[1].match(regex)) {
		var name2 = name[1].slice(2, -2);
		dijit.byId('namefilter').set('value', name2);
	}
	var affilid = data[3].split(':');
	regex = new RegExp('^[0-9]*$');
	if(affilid[1] == '*') {
		dijit.byId('affiliationfilter').set('value', 0);
	}
	else if(affilid[1].match(regex)) {
		dijit.byId('affiliationfilter').set('value', affilid[1]);
	}
	var editgroupid = data[4].split(':');
	regex = new RegExp('^[0-9]*$');
	if(editgroupid[1] == '*') {
		dijit.byId('editgroupfilter').set('value', 0);
	}
	else if(editgroupid[1] == 'NULL') {
		dijit.byId('editgroupfilter').set('value', -1);
	}
	else if(editgroupid[1].match(regex)) {
		dijit.byId('editgroupfilter').set('value', editgroupid[1]);
	}
}

function fmtResourceGroupDeleteBtn(groupid, rowIndex) {
	var rowdata = this.grid.getItem(rowIndex);
	if(rowdata.deletable == 0)
		return '';
	var btn = new dijit.form.Button({
		label: 'Delete',
		onClick: function() {
			confirmDeleteResourceGroup(groupid);
		}
	});
	btn._destroyOnRemove = true;
	return btn;
}

function confirmDeleteResourceGroup(groupid) {
	var data = {continuation: dojo.byId('deleteresgroupcont').value,
	            groupid: groupid};
	RPCwrapper(data, confirmDeleteGroupCB, 1);
}

function fmtResourceGroupEditBtn(groupid, rowIndex) {
	var btn = new dijit.form.Button({
		label: 'Edit',
		onClick: function() {
			editResourceGroup(groupid);
		}
	});
	btn._destroyOnRemove = true;
	return btn;
}

function editResourceGroup(groupid) {
	// call url with continuation, groupid
	var cont = dojo.byId('editresgroupcont').value;
	window.location.href = 'index.php?continuation=' + cont + '&groupid=' + groupid;
}

function fmtGroupInfo(groupid, rowIndex) {
	var str = '<a onmouseover="getGroupInfo(' + groupid + ');" '
	        + 'onmouseout="showGroupInfoCancel(' + groupid + ');" '
	        + 'id=listicon' + groupid + '><img alt="mouseover for list of '
	        + 'resources in the group" title="" src="images/list.gif"></a>';
	return str;
}

function resourcegroupGridFilter() {
	var name = '.*';
	if(dojo.byId('resnamefilter') && dojo.byId('resnamefilter').value.length)
		name += dojo.byId('resnamefilter').value + '.*';

	var query = new Array();
	var nodes = dojo.query('label', dojo.byId('resourcetypes'));
	for(var i = 0; i < nodes.length; i++) {
		var showtype = 'show' + nodes[i].innerHTML;
		if(dijit.byId(showtype) && dijit.byId(showtype).get('value'))
			query.push(nodes[i].innerHTML);
	}
	var restype = query.join('|');
	if(query.length == 0)
		restype = 'foo';

	var owninggroupid = dijit.byId('owninggroupfilter').get('value');
	if(owninggroupid == 0)
		owninggroupid = '*';

	resourcegroupgrid.setQuery({type: new RegExp(restype),
	                            name: new RegExp(name, 'i'),
	                            owninggroupid: owninggroupid});
}

function buildResourceFilterStores() {
	if(typeof resourcegroupstore === 'undefined' ||
	   ! resourcegroupstore._loadFinished) {
		setTimeout(buildResourceFilterStores, 500);
		return;
	}
	resourcegroupstore.ownergroups = new Object();
	resourcegroupstore.fetch({
		query: {id: '*'},
		onItem: function(item) {
			var ownerid = resourcegroupstore.getValue(item, 'owninggroupid');
			var owner = resourcegroupstore.getValue(item, 'owninggroup');
			resourcegroupstore.ownergroups[ownerid] = owner;
		},
		onComplete: function() {
			var cnt = 0;
			for(var p in resourcegroupstore.ownergroups) {
				if(resourcegroupstore.ownergroups.hasOwnProperty(p))
					cnt = 1;
					break;
			}
			if(cnt == 0) {
				dojo.byId('resourcegroupcontainer').innerHTML = "You do not have access to any resource groups.";
				return;
			}
			var newitem = {};
			newitem = {'id': '0', 'name': ' Any'};
			owninggroupstore.newItem(newitem);
			for(ownerid in resourcegroupstore.ownergroups) {
				newitem = {'id': ownerid, 'name': resourcegroupstore.ownergroups[ownerid]};
				owninggroupstore.newItem(newitem);
				dijit.byId('owninggroupfilter').setStore(owninggroupstore, '', {query: {id: '*'}});
			}
		}
	});
}

function fmtDuration(len, rowIndex, cell) {
	var rowdata = this.grid.getItem(rowIndex);
	var field = cell.field + 'disp';
	return rowdata[field];
}
