<html><head>
	<script src="../../ClientGlobalContext.js.aspx" type="text/javascript"></script>
	<script src="../../bah_jquery1.4.1.min.js" type="text/javascript"></script>
	<script src="../../bah_SDK.REST.js" type="text/javascript"></script>
	<script>
	var _queueid = ''; //f82fc672-6b0d-e611-811e-127b25dcbde7';
	var _userid = Xrm.Page.context.getUserId(); //'165C2C6A-5C9C-E611-8124-127B25DCBDE7';
	
function getParameterByName(name, url) {
	if (!url) url = window.location.href;
	name = name.replace(/[\[\]]/g, "\\$&");
	var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
		results = regex.exec(url);
	if (!results) return null;
	if (!results[2]) return '';
	return decodeURIComponent(results[2].replace(/\+/g, " "));
}

function loadParams() {
	var datavalue = getParameterByName('data');
	if(datavalue != null){
		var params = decodeURIComponent(datavalue).split("&");
		for (var i in params) {
			params[i] = params[i].replace(/\+/g, " ").split("=");
			if (params[i][0] == "queueid") {
				_queueid = params[i][1];
			}
		}
	}
}
	
function getNextCase(userid, queueid){
	var priorities = [];
	//start by getting user's team and position
	SDK.REST.retrieveMultipleRecords("SystemUser", 
		"$filter=SystemUserId eq (guid'"+userid+"')&$select=vhacrm_teamtouserId, PositionId", 
		function(data){
			if(data.length>0) {
				var teamid = data[0].vhacrm_teamtouserId.Id;
				var positionid = data[0].PositionId.Id;
				SDK.REST.retrieveMultipleRecords("vhacrm_teampriority", 
					"$select=vhacrm_priority_num, vhacrm_typeintersectionid, CreatedOn, vhacrm_teamid&$orderby=vhacrm_priority_num, ModifiedOn desc&$filter=vhacrm_teamid/Id eq (guid'"+teamid+"')", 
					function(data){
						//next we get the team priorities
						if(data.length>0) {
							//add priorities to list
							for(var i=0;i<data.length;i++){
								priorities[i] = data[i].vhacrm_typeintersectionid.Id;
							}
						}
						else{
							alert('Could not find team priorities for team with id "' + teamid + '"');
							return;
						}
					},
					function(error){
						alert('Error querying team priorities for team with id "' + teamid + '"');
						return;
					},
					function(){
						//next we get the position exclusions
						SDK.REST.retrieveMultipleRecords("vhacrm_positionexclusion", 
							"$select=vhacrm_typeintersectionid&$filter=vhacrm_positionid/Id eq (guid'"+positionid+"')", 
							function(data){
								//remove excluded priorities from list
								for(var i=0;i<data.length;i++){
									var priorityindex = priorities.indexOf(data[i].vhacrm_typeintersectionid);
									if (priorityindex > -1) {
										priorities.splice(priorityindex, 1);
									}
								}
							},
							function(error){
								alert('Error querying priority exclusions for position with id "' + positionid + '"');
								return;
							},
							function(){
								//next we get cases from queue
								var odataquerystring = "$expand=Incident_QueueItem&$select=ObjectId,Incident_QueueItem/Title,Incident_QueueItem/IncidentId,Incident_QueueItem/CreatedOn,Incident_QueueItem/StatusCode,Incident_QueueItem/StateCode,Incident_QueueItem/vhacrm_typeintersectionid,QueueId,QueueItemId&orderby=Incident_QueueItem/CreatedOn asc&$filter=QueueId/Id eq (guid'"+queueid+"') and WorkerId eq null";
								var cases = [];
								SDK.REST.retrieveMultipleRecords("QueueItem",odataquerystring, 
									function(data){
										for(var i=0;i<data.length;i++){
											if(data[i].ObjectId.LogicalName=='incident'){
												cases.push(data[i]);
											}
										}
									},
									function(error){
										alert('Error finding cases.');
										return;
									},
									function(){
										//look through the returned cases to find a match on priority type
										var caseid = null;
										var queueitemid = null;
										for(var i=0;i<priorities.length;i++){
											var priority = priorities[i];
											var filtered = cases.filter(function(item){return item.Incident_QueueItem.vhacrm_typeintersectionid.Id == priority &&item.Incident_QueueItem.StateCode.Value == 0;});
											if(filtered.length>0){
												caseid = filtered[0].ObjectId.Id;
												queueitemid = filtered[0].QueueItemId;
											}
											if(caseid && queueitemid){
												break;
											}
										}
										if(caseid && queueitemid){
											handleFoundCase(caseid, queueitemid);
											return;
										}
										else{
											alert('No cases available for automatic assignment.');
											return;
										}
									}
								);							
							}
						);
					}
				);
			}
			else{
				alert('Could not find user with id "' + userid + '"');
				return;
			}
		},
		function(error){
			alert('Error querying user with id "' + userid + '"');
			return;
		},
		function(){
			//do nothing on completion
		}
	);
}

function handleFoundCase(caseid, queueitemid){
	var caseassignrequest = [];
	caseassignrequest.push("<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">");
	caseassignrequest.push("<s:Body>");
	caseassignrequest.push("<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\"");
	caseassignrequest.push(" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">");
	caseassignrequest.push("<request i:type=\"b:AssignRequest\"");
	caseassignrequest.push(" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\"");
	caseassignrequest.push(" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">");
	caseassignrequest.push("<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">");
	caseassignrequest.push("<a:KeyValuePairOfstringanyType>");
	caseassignrequest.push("<c:key>Target</c:key>");
	caseassignrequest.push("<c:value i:type=\"a:EntityReference\">");
	caseassignrequest.push("<a:Id>" + caseid + "</a:Id>");
	caseassignrequest.push("<a:LogicalName>incident</a:LogicalName>");
	caseassignrequest.push("<a:Name i:nil=\"true\" />");
	caseassignrequest.push("</c:value>");
	caseassignrequest.push("</a:KeyValuePairOfstringanyType>");
	caseassignrequest.push("<a:KeyValuePairOfstringanyType>");
	caseassignrequest.push("<c:key>Assignee</c:key>");
	caseassignrequest.push("<c:value i:type=\"a:EntityReference\">");
	caseassignrequest.push("<a:Id>" + _userid + "</a:Id>");
	caseassignrequest.push("<a:LogicalName>systemuser</a:LogicalName>");
	caseassignrequest.push("<a:Name i:nil=\"true\" />");
	caseassignrequest.push("</c:value>");
	caseassignrequest.push("</a:KeyValuePairOfstringanyType>");
	caseassignrequest.push("</a:Parameters>");
	caseassignrequest.push("<a:RequestId i:nil=\"true\" />");
	caseassignrequest.push("<a:RequestName>Assign</a:RequestName>");
	caseassignrequest.push("</request>");
	caseassignrequest.push("</Execute>");
	caseassignrequest.push("</s:Body>");
	caseassignrequest.push("</s:Envelope>");

	var req = new XMLHttpRequest();
	req.open("POST", Xrm.Page.context.getClientUrl()+'/XRMServices/2011/Organization.svc/web', true)
	// Responses will return XML. It isn't possible to return JSON.
	req.setRequestHeader("Accept", "application/xml, text/xml, */*");
	req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
	req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
	req.onreadystatechange = function () { 
		if (req.readyState == 4) {
			req.onreadystatechange = null; //avoids memory leaks
			if (req.status == 200) {
				//Xrm.Utility.openEntityForm('incident', caseid, null, {openInNewWindow:true});
				//Xrm.Utility.openEntityForm('queueitem', queueitemid, null, {openInNewWindow:true});
				//$("#getnextcasebutton").removeAttr("disabled");
				//$("#getnextcasebutton").text("Get next case");
				var queueitem = {}
				queueitem.WorkerId = {Id: _userid, LogicalName: 'systemuser'};
				SDK.REST.updateRecord(queueitemid, queueitem, "QueueItem", 
					//success
					function(){
						//need to set case ownership - action or soap?
						$("#getnextcasebutton").removeAttr("disabled");
						$("#getnextcasebutton").text("Get Next Request");
						Xrm.Utility.openEntityForm('incident', caseid, null, {openInNewWindow:true});
						//Xrm.Utility.openEntityForm('queueitem', queueitemid, null, {openInNewWindow:true});
					}, 
					//error
					function(error){
						alert("Error assigning queue item to user");
					}
				);
			}
			else {
				alert("Error assigning case to user");
			}
		}
	}
	req.send(caseassignrequest.join(""));
}

$(function() {
	loadParams();
	$('#getnextcasebutton').click(function(){
		$("#getnextcasebutton").text("Working . . .");
		$("#getnextcasebutton").attr("disabled", "disabled");
		getNextCase(_userid, _queueid);
	});
});
	</script>
</head>
<body>
<button id="getnextcasebutton">Get next case</button>

</body></html>