<html>
<head>
	<title>webpartform</title>
	<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 PostToken = function(idobject, url){
	CallAction("bah_requestserviceticketaction",
		[{
			key: "identifier",
			type: "c:string",
			value: JSON.stringify(idobject)
		}],
		function (params) {
			// Success
			for (var i = 0; i < params.length; i++) {
				//alert(params[i].key + "=" + params[i].value);
				if(params[i].key=='serviceticket') {
					var postdata = {};
					postdata.token = params[i].value;
					$('form').attr('action',url);
					$('#token').attr('value',postdata.token);

					//submit the form
					$('form').submit();
				}
			}
		},
		function (e) {
			// Error
			alert(e);
		}
	);
}
	
var CallAction = function(actionName, inputParams, successCallback, errorCallback, url) {
    if (url == null) {
        url = Xrm.Page.context.getClientUrl();
    }

    var requestXml = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>" +
          "<s:Body>" +
            "<Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>" +
              "<request xmlns:a='http://schemas.microsoft.com/xrm/2011/Contracts'>" +
                "<a:Parameters xmlns:b='http://schemas.datacontract.org/2004/07/System.Collections.Generic'>";

    if (inputParams) {
        // Add each input param
        for (var i = 0; i < inputParams.length; i++) {
            var param = inputParams[i];

            var value = "";
            var displayXmlns = false;

            // Check the param type to determine how the value is formed
            switch (param.type) {
                case "c:boolean":
                case "c:int":
                case "c:string":
                    value = param.value;
                    displayXmlns = true;
                    break;
                case "c:dateTime":
                    value = param.value.toISOString();
                    displayXmlns = true;
                    break;
                case "a:EntityReference":
                    value = "<a:Id>" + param.value.id + "</a:Id>" +
                      "<a:LogicalName>" + param.value.entityType + "</a:LogicalName>" +
                      "<a:Name i:nil='true' />";
                    break;
                case "a:OptionSetValue":
                case "a:Money":
                    value = "<a:Value>" + param.value + "</a:Value>";
                    break;
                default:
                    if (errorCallback) {
                        errorCallback("Type of input parameter " + (i + 1) + " '" + param.type + "' is invalid or unsupported");
                    }
                    return;
                    break;
            }

            requestXml += "<a:KeyValuePairOfstringanyType>" +
                    "<b:key>" + param.key + "</b:key>" +
                    "<b:value i:type='" + param.type + "' " + (displayXmlns ? "xmlns:c='http://www.w3.org/2001/XMLSchema'" : "") + ">" + value + "</b:value>" +
                  "</a:KeyValuePairOfstringanyType>";
        }
    }

    requestXml += "</a:Parameters>" +
                "<a:RequestId i:nil='true' />" +
                "<a:RequestName>" + actionName + "</a:RequestName>" +
              "</request>" +
            "</Execute>" +
          "</s:Body>" +
        "</s:Envelope>";

    var req = new XMLHttpRequest();
    req.open("POST", url + "/XRMServices/2011/Organization.svc/web", true);
    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) {
            if (req.status == 200) {
                // Action completed successfully - get output params
                var responseParams = req.responseXML.getElementsByTagName("a:KeyValuePairOfstringanyType"); // IE
                if (responseParams.length == 0) {
                    responseParams = req.responseXML.getElementsByTagName("KeyValuePairOfstringanyType"); // FireFox and Chrome
                }

                var outputParams = [];
                for (i = 0; i < responseParams.length; i++) {

                    var attrNameNode = responseParams[i].childNodes[0].firstChild;
                    var attributeName = attrNameNode.textContent || attrNameNode.nodeValue || attrNameNode.data || attrNameNode.text;

                    var attributeValue = "";
                    if (responseParams[i].childNodes[1].firstChild != null) {
                        var attrValueNode = responseParams[i].childNodes[1].firstChild;
                        attributeValue = attrValueNode.textContent || attrValueNode.nodeValue || attrValueNode.data || attrValueNode.text;
                    }

                    // Values will be string, figure out the types yourself
                    outputParams.push({ key: attributeName, value: attributeValue });

                    /*
                    DateTime = "2015-06-23T21:00:00Z" (AS UTC STRING)
                    bool = "true" (AS STRING)
                    OptionSet, int, etc = "1" (AS STRING)
                    */
                }

                if (successCallback) {
                    // Make sure the callback accepts exactly 1 argument - use dynamic function if you want more
                    successCallback(outputParams);
                }
            }
            else {
                // Error has occured, action failed
                if (errorCallback) {
                    var error = null;
                    try { error = req.responseXML.getElementsByTagName("Message")[0].firstChild.nodeValue; } catch (e) { }
                    errorCallback(error);
                }
            }
        }
    };
    req.send(requestXml);
}

var receiveMessage = function (event){
	var originarr = Xrm.Page.context.getClientUrl().split('/');
	originarr.pop();
	var origin = originarr.join('/');
	if (event.origin !== origin)
		return;
	
	if(event.data[_iframeid]){
		_frameobj = event.data[_iframeid];
	}
}
	</script>

</head>
<body>
Loading . . .
<script>
var _iframeid = window.frameElement.id;
var _frameobj = null;
$(function(){
//register the message listener
window.addEventListener("message", receiveMessage, false);
var checkinterval = null;
var waittime = 100; //check every X ms
checkinterval = setInterval(
	function(){
		//ask the parent for tokens
		var originarr = Xrm.Page.context.getClientUrl().split('/');
		originarr.pop();
		var origin = originarr.join('/');
		parent.postMessage('gettokens', origin);
		if(_frameobj){
			clearInterval(checkinterval);
			
			SDK.REST.retrieveMultipleRecords("bah_keyvaluepair", "$select=*&$filter=bah_name_text eq '"+_frameobj.endpointname+"'", 
				function(data){
					if(data.length>0) {
						var url = data[0].bah_stringvalue_text;
						PostToken(_frameobj.tokenobj, url);
					}
				},
				function(error){
					//do nothing
				},
				function(){
					//do nothing on completion
				}
			);
		}
	}, waittime
);
});
</script>
<form id="webpartform" method="POST" action="">
<input type="hidden" name="token" id="token" value="" />
</form>
</body>
</html>