<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 _commandBar = 'no';
	var _userid = Xrm.Page.context.getUserId(); //'165C2C6A-5C9C-E611-8124-127B25DCBDE7';
	var _priorities = [];


function getParameterByName(name, url) {
    if (!url) url = window.location.href;
    name = name.replace(/[\[\]]/g, "\\$&");
	var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)", 'i'),
		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];
			}
			else if (params[i][0] == "commandbar")
			{
			    _commandBar = params[i][1];
			}
		}
	}

	if (_commandBar == 'yes')
	{
	    $("#getnextcasebutton").removeAttr("disabled");
	}
}

function getNextCase(userid, queueid){
	_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=statecode/Value eq 0 and 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 + '"');
							alert('Users Work Assignment Team does not have any active priorities.  Please contact a Supervisor.');
							$("#getnextcasebutton").removeAttr("disabled");
							$("#getnextcasebutton").text("Get Next Request");

							if (_commandBar) { window.close(); }
							return;
						}
					},
					function(error){
						//alert('Error querying team priorities for team with id "' + teamid + '"');
						alert('User is not assigned to a Work Assignment Team.  Please contact a Supervisor.');
						$("#getnextcasebutton").removeAttr("disabled");
						$("#getnextcasebutton").text("Get Next Request");

						if (_commandBar) { window.close(); }
						return;
					},
					function(){
						if(positionid){
							//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.Id);
										if (priorityindex > -1) {
											_priorities.splice(priorityindex, 1);
										}
									}
								},
								function(error){
									alert('Error querying priority exclusions for position with id "' + positionid + '"');
									$("#getnextcasebutton").removeAttr("disabled");
									$("#getnextcasebutton").text("Get Next Request");

									if (_commandBar) { window.close(); }
									return;
								},
								function(){
									getCasesFromQueue(queueid);
								}
							);
						}
						else{
							getCasesFromQueue(queueid);
						}
					}
				);
			}
			else{
				alert('Could not find user with id "' + userid + '"');
				$("#getnextcasebutton").removeAttr("disabled");
				$("#getnextcasebutton").text("Get Next Request");

				if (_commandBar) { window.close(); }
				return;
			}
		},
		function(error){
			alert('Error querying user with id "' + userid + '"');
			$("#getnextcasebutton").removeAttr("disabled");
			$("#getnextcasebutton").text("Get Next Request");

			if (_commandBar) { window.close(); }
			return;
		},
		function(){
			//do nothing on completion
		}
	);
}

function getCasesFromQueue(queueid){
	//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 Requests.');
			$("#getnextcasebutton").removeAttr("disabled");
			$("#getnextcasebutton").text("Get Next Request");

			if (_commandBar) { window.close(); }
			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 Requests are available for automatic assignment based on Team Priority.');
				$("#getnextcasebutton").removeAttr("disabled");
				$("#getnextcasebutton").text("Get Next Request");

				if (_commandBar) { window.close(); }
				return;
			}
		}
	);
}

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");
                        //SYH
						if (_commandBar) {
						    parent.Xrm.Utility.openEntityForm('incident', caseid, null, { openInNewWindow: true });
						    window.close();
						}
						else {
						    Xrm.Utility.openEntityForm('queueitem', queueitemid, null, {openInNewWindow:true});
						}
					},
					//error
					function(error){
						alert("Error assigning queue item to user");
						$("#getnextcasebutton").removeAttr("disabled");
						$("#getnextcasebutton").text("Get Next Request");

						if (_commandBar) { window.close(); }
					}
				);
			}
			else {
				alert("Error assigning Request to user");
				$("#getnextcasebutton").removeAttr("disabled");
				$("#getnextcasebutton").text("Get Next Request");

				if (_commandBar) { window.close(); }
			}
		}
	}
	req.send(caseassignrequest.join(""));
}

$(function() {
    loadParams();

    if (_commandBar == "yes")
    {
        $('#workingdiv').attr("style", "display:block;background-color:#ffffe6;height:100%;width=100%");
        $('#buttondiv').attr("style", "display:none");
        getNextCase(_userid, _queueid);
}    else {
        $('#workingdiv').attr("style", "display:none");
        $('#buttondiv').attr("style", "display:block");
	    $('#getnextcasebutton').click(function(){
		    $("#getnextcasebutton").text("Working . . .");
		    $("#getnextcasebutton").attr("disabled", "disabled");
		    getNextCase(_userid, _queueid);
	    });
    }

});
    </script>
    <meta charset="utf-8">
</head>
<body>
    <div id="workingdiv">
        <div vertical-align="middle" align="center"><strong><font color="#000099" face="Verdana">Working...</font></strong></div>
    </div>
    <div id="buttondiv"><button id="getnextcasebutton">Get Next Request</button></div>
</body>
</html>