if (typeof (Kore) == "undefined") { Kore = {}; }

Kore.Crm = {

    odataEndPoint: "/XRMServices/2011/OrganizationData.svc",
    SafeHideTab: function (tabName) {
        try {
            Xrm.Page.ui.tabs.get(tabName).setVisible(false);
        } catch (e) {
        }
    },
    SafeShowTab: function (tabName) {
        try {
            Xrm.Page.ui.tabs.get(tabName).setVisible(true);
        } catch (e) {
        }
    },
    UserHasRole: function (roleName) {
        var serverUrl = Xrm.Page.context.getClientUrl();
        var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/";
        oDataEndpointUrl += "RoleSet?$top=1&$filter=Name eq '" + roleName + "'";
        var service = Kore.Crm.GetRequestObject();
        if (service != null) {
            service.open("GET", oDataEndpointUrl, false);
            service.setRequestHeader("X-Requested-Width", "XMLHttpRequest");
            service.setRequestHeader("Accept", "application/json,text/javascript, */*");
            service.send(null);
            var requestResults = eval('(' + service.responseText + ')').d;
            if (requestResults != null && requestResults.results.length == 1) {
                var role = requestResults.results[0];
                var id = role.RoleId;
                //Get Current User Roles
                var currentUserRoles = Xrm.Page.context.getUserRoles();
                //Check whether current user roles has the role passed as argument
                for (var i = 0; i < currentUserRoles.length; i++) {
                    var userRole = currentUserRoles[i];
                    if (Kore.Crm.GuidsAreEqual(userRole, id)) {
                        return true;
                    }
                }
            }
        }
        return false;
    },
    GetSafeXRM: function () {
        if (!!Xrm && !!Xrm.Page && !!Xrm.Page.ui) {
            return Xrm;
        }
        if (!!window.parent.Xrm && !!window.parent.Xrm.Page && !!window.parent.Xrm.Page.ui) {
            return window.parent.Xrm;
        }
        if (!!window && !!window.opener && !!window.opener.Xrm && !!window.opener.Xrm.Page && !!window.opener.Xrm.Page.ui) {
            return window.opener.Xrm;
        }

    },
    GetRequestObject: function () {
        if (window.XMLHttpRequest) {
            return new window.XMLHttpRequest;
        }
        else {
            try {
                return new ActiveXObject("MSXML2.XMLHTTP.3.0");
            }
            catch (ex) {
                return null;
            }
        }
    },

    GuidsAreEqual: function (guid1, guid2) {
        var isEqual = false;
        if (guid1 == null || guid2 == null) {
            isEqual = false;
        }
        else {
            isEqual = (guid1.replace(/[{}]/g, "").toLowerCase() == guid2.replace(/[{}]/g, "").toLowerCase());
        }
        return isEqual;
    },

    getCRMServerlUrl: function () {

        var serverUrl = "";

        if (typeof GetGlobalContext == "function") {
            var context = GetGlobalContext();
            serverUrl = context.getClientUrl();
        }
        else {

            if (typeof Xrm.Page.context == "object") {

                if (!!Xrm.Page.context.getClientUrl) {
                    serverUrl = Xrm.Page.context.getClientUrl();
                } else {
                    serverUrl = Xrm.Page.context.getClientUrl();
                }

            }
            else {
                throw new Error("Unable to access the server URL");
            }
        }

        if (serverUrl.match(/\/$/)) {
            serverUrl = serverUrl.substring(0, serverUrl.length - 1);
        }

        return serverUrl
    },

    _koreSecurityToken: null,
    getKORESecurityToken: function () {

        if (Kore.Crm._koreSecurityToken == null) {

            Kore.Crm._koreSecurityToken = Kore.Crm.getKORESetting('KORE%20PSS%20Security%20Token');

            if (Kore.Crm._koreSecurityToken == null) {
                _koreSecurityToken = "@token";
            }
        }

        return Kore.Crm._koreSecurityToken;
    },

    _koreServerUrl: null,
    getKOREServerUrl: function () {

        if (Kore.Crm._koreServerUrl == null) {

            var crmServerUrl = Kore.Crm.getCRMServerlUrl();
            var internalDomain = Kore.Crm.getKOREInternalDomain();
            var externalDomain = Kore.Crm.getKOREExternalDomain();

            if (crmServerUrl.toLowerCase().indexOf(externalDomain) >= 0)
                Kore.Crm._koreServerUrl = Kore.Crm.getKOREExternalBaseUrl();
            else if (crmServerUrl.toLowerCase().indexOf(internalDomain) >= 0)
                Kore.Crm._koreServerUrl = Kore.Crm.getKOREInternalBaseUrl();
        }

        return Kore.Crm._koreServerUrl;
    },

    _koreExternalDomain: null,
    getKOREExternalDomain: function () {

        if (Kore.Crm._koreExternalDomain == null) {

            Kore.Crm._koreExternalDomain = Kore.Crm.getKORESetting('KORE%20Server%20External%20Domain');
        }

        return Kore.Crm._koreExternalDomain;
    },

    _koreExternalBaseUrl: null,
    getKOREExternalBaseUrl: function () {

        if (Kore.Crm._koreExternalBaseUrl == null) {

            Kore.Crm._koreExternalBaseUrl = Kore.Crm.getKORESetting('KORE%20Server%20External%20Base%20Url');
        }

        return Kore.Crm._koreExternalBaseUrl;
    },

    _koreInternalDomain: null,
    getKOREInternalDomain: function () {

        if (Kore.Crm._koreInternalDomain == null) {

            Kore.Crm._koreInternalDomain = Kore.Crm.getKORESetting('KORE%20Server%20Internal%20Domain');
        }

        return Kore.Crm._koreInternalDomain;
    },

    _koreInternalBaseUrl: null,
    getKOREInternalBaseUrl: function () {

        if (Kore.Crm._koreInternalBaseUrl == null) {

            Kore.Crm._koreInternalBaseUrl = Kore.Crm.getKORESetting('KORE%20Server%20Internal%20Base%20Url');
        }

        return Kore.Crm._koreInternalBaseUrl;
    },

    _koreServerOnlineBaseUrl: null,
    getKOREServerOnlineBaseUrl: function () {

        if (Kore.Crm._koreServerOnlineBaseUrl == null) {

            Kore.Crm._koreServerOnlineBaseUrl = Kore.Crm.getKORESetting('KORE%20Server%20Online%20Base%20URL');
        }

        return Kore.Crm._koreServerOnlineBaseUrl;
    },

    _koreServerOnlineOrganization: null,
    getKOREServerOnlineOrganization: function () {

        if (Kore.Crm._koreServerOnlineOrganization == null) {

            Kore.Crm._koreServerOnlineOrganization = Kore.Crm.getKORESetting('KORE%20Server%20Online%20Organization');
        }

        return Kore.Crm._koreServerOnlineOrganization;
    },

    getKORESetting: function (name) {

        var crmServerUrl = Kore.Crm.getCRMServerlUrl();
        var odataEntitySet = "/KORE_settingSet";
        var odataQuery = "?$select=KORE_Value&$filter=KORE_name%20eq%20'" + name + "'&$top=1";
        var odataUrl = crmServerUrl + Kore.Crm.odataEndPoint + odataEntitySet + odataQuery;
        var result = null;

        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            async: false,
            url: odataUrl,
            beforeSend: function (XMLHttpRequest) {
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                result = !!data.d.results[0] ? data.d.results[0].KORE_Value : null;
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });

        return result;
    },

    changeIFrame: function (iframeName, newUrl) {

        var iframe = Xrm.Page.getControl(iframeName);

        if (iframe != null) {

            var url = iframe.getSrc();
            var params = url.substr(url.indexOf("?"));

            newUrl = newUrl + params;

            iframe.setSrc(newUrl);
        }
    },


    getQueryParam: function (variable) {
        var query = window.location.search.substring(1);
        var vars = query.split("&");

        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split("=");

            if (pair[0] == variable) {
                return pair[1];
            }
        }
        return "";
    },

    createRecord: function (entityObject, odataSetName, successCallback, errorCallback) {

        //entityObject is required
        if (!entityObject) {
            alert("entityObject is required.");
            return;
        }

        //odataSetName is required, i.e. "AccountSet"
        if (!odataSetName) {
            alert("odataSetName is required.");
            return;
        }

        //Parse the entity object into JSON
        var jsonEntity = window.JSON.stringify(entityObject);

        //Asynchronous AJAX function to Create a CRM record using OData
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: Kore.Crm.getCRMServerlUrl() + Kore.Crm.odataEndPoint + "/" + odataSetName,
            data: jsonEntity,
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.             
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    successCallback(data.d, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    },

    retrieveRecord: function (id, odataSetName, successCallback, errorCallback) {

        //id is required
        if (!id) {
            alert("record id is required.");
            return;
        }

        //odataSetName is required, i.e. "AccountSet"
        if (!odataSetName) {
            alert("odataSetName is required.");
            return;
        }

        //Asynchronous AJAX function to Retrieve a CRM record using OData
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: Kore.Crm.getCRMServerlUrl() + Kore.Crm.odataEndPoint + "/" + odataSetName + "(guid'" + id + "')",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.             
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    successCallback(data.d, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    },

    retrieveMultiple: function (odataSetName, filter, successCallback, errorCallback) {

        //odataSetName is required, i.e. "AccountSet"
        if (!odataSetName) {
            alert("odataSetName is required.");
            return;
        }

        //Build the URI
        var odataUri = Kore.Crm.getCRMServerlUrl() + Kore.Crm.odataEndPoint + "/" + odataSetName + "()";

        //If a filter is supplied, append it to the OData URI
        if (filter) {
            odataUri += filter;
        }

        //Asynchronous AJAX function to Retrieve CRM records using OData
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataUri,
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.             
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    if (data && data.d && data.d.results) {
                        successCallback(data.d.results, textStatus, XmlHttpRequest);
                    }
                    else if (data && data.d) {
                        successCallback(data.d, textStatus, XmlHttpRequest);
                    }
                    else {
                        successCallback(data, textStatus, XmlHttpRequest);
                    }
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    },

    updateRecord: function (id, entityObject, odataSetName, successCallback, errorCallback) {

        //id is required
        if (!id) {
            alert("record id is required.");
            return;
        }

        //odataSetName is required, i.e. "AccountSet"
        if (!odataSetName) {
            alert("odataSetName is required.");
            return;
        }

        //Parse the entity object into JSON
        var jsonEntity = window.JSON.stringify(entityObject);

        //Asynchronous AJAX function to Update a CRM record using OData
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            data: jsonEntity,
            url: Kore.Crm.getCRMServerlUrl() + Kore.Crm.odataEndPoint + "/" + odataSetName + "(guid'" + id + "')",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.             
                XMLHttpRequest.setRequestHeader("Accept", "application/json");

                //Specify the HTTP method MERGE to update just the changes you are submitting.             
                XMLHttpRequest.setRequestHeader("X-HTTP-Method", "MERGE");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                //The MERGE does not return any data at all, so we'll add the id 
                //onto the data object so it can be leveraged in a Callback. When data 
                //is used in the callback function, the field will be named generically, "id"
                data = new Object();
                data.id = id;

                if (successCallback) {
                    successCallback(data, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    },

    deleteRecord: function (id, odataSetName, successCallback, errorCallback) {

        //id is required
        if (!id) {
            alert("record id is required.");
            return;
        }

        //odataSetName is required, i.e. "AccountSet"
        if (!odataSetName) {
            alert("odataSetName is required.");
            return;
        }

        //Asynchronous AJAX function to Delete a CRM record using OData
        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: Kore.Crm.getCRMServerlUrl() + Kore.Crm.odataEndPoint + "/" + odataSetName + "(guid'" + id + "')",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.                 
                XMLHttpRequest.setRequestHeader("Accept", "application/json");

                //Specify the HTTP method DELETE to perform a delete operation.                 
                XMLHttpRequest.setRequestHeader("X-HTTP-Method", "DELETE");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    successCallback(data.d, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    },

    errorHandler: function (xmlHttpRequest, textStatus, errorThrow) {
        alert("Error : " + textStatus + ": " + xmlHttpRequest.statusText);
    },

    getWindowFeatures: function (width, height) {

        var str = "toolbar=0,location=0,menubar=0,resizable=1,status=0,left=10,top=90";

        if (width != null)
            str += ",width=" + width;

        if (height != null)
            str += ",height=" + height;

        return str;
    }
}