public ActionResult Sample44()
        {
            // Check is data posted
            if (Request.HttpMethod == "POST")
            {
                //### Set variables and get POST data
                System.Collections.Hashtable result = new System.Collections.Hashtable();
                string message = null;
                //Get post data
                String clientId = Request.Form["clientId"];
                String privateKey = Request.Form["privateKey"];
                String firstEmail = Request.Form["firstEmail"];
                String firstName = Request.Form["firstName"];
                String lastName = Request.Form["lastName"];
                String secondEmail = Request.Form["secondEmail"];
                String basePath = Request.Form["basePath"];
                //Set second signer name. Can be obtained in the same manner as first signer name.
                String secondName = firstName + "2";
                String gender = Request.Form["gender"];
                var file = Request.Files["file"];
                String uploadedGuid = "";
                String iframe = "";
                String secondIframe = "";
                // Check is all requered fields are entered
                if (String.IsNullOrEmpty(clientId) || String.IsNullOrEmpty(privateKey) || String.IsNullOrEmpty(firstEmail) || String.IsNullOrEmpty(secondEmail) ||
                    String.IsNullOrEmpty(firstName) || String.IsNullOrEmpty(secondName))
                {
                    // If not all fields entered send error message
                    message = "Please enter all parameters";
                    result.Add("error", message);
                    return View("Sample44", null, result);
                }
                else
                {
                    if (basePath.Equals(""))
                    {
                        basePath = "https://api.groupdocs.com/v2.0";
                    }
                    // Create service for Groupdocs account
                    GroupdocsService service = new GroupdocsService(basePath, clientId, privateKey);
                    //Upload local file
                    Groupdocs.Api.Contract.UploadRequestResult upload = service.UploadFile(file.FileName, String.Empty, file.InputStream);
                    if (upload.Guid != null)
                    {
                        //If file uploaded return it's guid
                        uploadedGuid = upload.Guid;
                        //Check is file uploaded
                        if (!uploadedGuid.Equals(""))
                        {
                            //Created array with data for merging
                            System.Collections.Hashtable enteredData = new System.Collections.Hashtable();
                            enteredData.Add("gender", gender);
                            enteredData.Add("name", firstName);
                            //Set fields counter
                            Int32 count = enteredData.Count;
                            //Create Datasource object
                            Groupdocs.Assembly.Data.Datasource dataSource = new Groupdocs.Assembly.Data.Datasource();
                            //Create array of DatasourceField objects
                            Groupdocs.Assembly.Data.DatasourceField[] fieldArray = new Groupdocs.Assembly.Data.DatasourceField[count];
                            //Set DatasourceFiled data
                            Int32 counter = 0;
                            foreach (System.Collections.DictionaryEntry fields in enteredData)
                            {
                                //Set object array content
                                string[] values = new string[1];
                                values.SetValue(System.Convert.ToString(fields.Value), 0);
                                Groupdocs.Assembly.Data.DatasourceField field = new Groupdocs.Assembly.Data.DatasourceField();
                                Groupdocs.Assembly.Data.DatasourceFieldType type = new Groupdocs.Assembly.Data.DatasourceFieldType();
                                type = 0;
                                field.Name = System.Convert.ToString(fields.Key);
                                field.Type = type;
                                field.Values = values;
                                //Push DatasourceField to array of DatasourceField objects
                                fieldArray.SetValue(field, counter);
                                counter++;
                            }
                            //Set fields array to the Datasource
                            dataSource.Fields = fieldArray;
                            //Add new Datasource to GroupDocs
                            decimal addDataSource = service.AddDataSource(dataSource);
                            //Check is not empty addDataSource
                            if (!addDataSource.Equals(""))
                            {
                                //If status ok merge Datasource to new pdf file
                                decimal job = service.MergeTemplate(uploadedGuid, addDataSource, "pdf", false);
                                if (!job.Equals(""))
                                {
                                    //Delay necessary that the inquiry would manage to be processed
                                    System.Threading.Thread.Sleep(5000);
                                    //Create Job info object
                                    Groupdocs.Api.Contract.GetJobDocumentsResult jobInfo = new Groupdocs.Api.Contract.GetJobDocumentsResult();
                                    //Make request to api for get document info by job id
                                    jobInfo = service.GetJobDocuments(job);
                                    //Get guid
                                    String guid = jobInfo.Inputs[0].Outputs[0].Guid;
                                    //Get name
                                    String fileName = jobInfo.Inputs[0].Outputs[0].Name;
                                    //Create envelope
                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeResponse envelop = service.CreateEnvelope("", "", fileName, guid, false);
                                    if (envelop.Status.Equals("Ok"))
                                    {
                                        decimal dec = new decimal();
                                        //Get role list for curent user
                                        Groupdocs.Api.Contract.Signature.SignatureRolesResponse roles = service.GetSignatureRoles("");
                                        String roleId = "";
                                        //Get id of role which can sign
                                        for (int i = 0; i < roles.Result.Roles.Length; i++)
                                        {
                                            if (roles.Result.Roles[i].Name.Equals("Signer"))
                                            {
                                                roleId = roles.Result.Roles[i].Id;
                                                break;
                                            }
                                        }
                                        if (String.IsNullOrEmpty(lastName))
                                        {
                                            lastName = "Empty Last Name";
                                        }
                                        //Add recipient to envelope
                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientResponse addFirstRecipient = service.AddEnvelopeRecipient(envelop.Result.Envelope.Id, firstEmail, firstName, lastName, roleId, dec);
                                        if (addFirstRecipient.Status.Equals("Ok"))
                                        {
                                            //Add second recipient to envelope
                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientResponse addSecondRecipient = service.AddEnvelopeRecipient(envelop.Result.Envelope.Id, secondEmail, secondName, lastName + "2", roleId, dec);
                                            if (addSecondRecipient.Status.Equals("Ok"))
                                            {
                                                //Get document from envelop
                                                Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentsResponse getDocuments = service.GetEnvelopeDocuments(envelop.Result.Envelope.Id);
                                                if (getDocuments.Status.Equals("Ok"))
                                                {
                                                    System.Random rand = new System.Random();
                                                    String fieldName = "singlIndex1" + rand.Next(0, 1000);
                                                    //Create envelop field settings object (LocationsX,Y max value can bee 1.0)
                                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo envelopFieldSettings = new Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo();
                                                    envelopFieldSettings.LocationX = new decimal(0.15);
                                                    envelopFieldSettings.LocationY = new decimal(0.23);
                                                    envelopFieldSettings.LocationWidth = 150;
                                                    envelopFieldSettings.LocationHeight = 50;
                                                    envelopFieldSettings.Name = fieldName;
                                                    envelopFieldSettings.ForceNewField = true;
                                                    envelopFieldSettings.Page = 1;
                                                    //Add envelop field to the document
                                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldResponse addFirstField = service.AddEnvelopeField(envelop.Result.Envelope.Id, getDocuments.Result.Documents[0].DocumentId, addFirstRecipient.Result.Recipient.Id, "0545e589fb3e27c9bb7a1f59d0e3fcb9", envelopFieldSettings);
                                                    //Updated field settings for the second signer
                                                    fieldName = "singlIndex2" + rand.Next(0, 1000);
                                                    envelopFieldSettings.LocationX = new decimal(0.35);
                                                    envelopFieldSettings.LocationY = new decimal(0.23);
                                                    envelopFieldSettings.LocationWidth = 150;
                                                    envelopFieldSettings.LocationHeight = 50;
                                                    envelopFieldSettings.Name = fieldName;
                                                    envelopFieldSettings.ForceNewField = true;
                                                    envelopFieldSettings.Page = 1;
                                                    //Add envelop field for the second signer
                                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldResponse addSecondField = service.AddEnvelopeField(envelop.Result.Envelope.Id, getDocuments.Result.Documents[0].DocumentId, addSecondRecipient.Result.Recipient.Id, "0545e589fb3e27c9bb7a1f59d0e3fcb9", envelopFieldSettings);
                                                    //Send envelop
                                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeSendResponse send = service.SendEnvelope(envelop.Result.Envelope.Id, String.Empty);
                                                    //Check envelope send status
                                                    if (send.Status.Equals("Ok"))
                                                    {
                                                        // Generate Embed viewer url with entered file id
                                                        iframe = "https://apps.groupdocs.com/signature2/signembed/" + envelop.Result.Envelope.Id + "/" + addFirstRecipient.Result.Recipient.Id;
                                                        iframe = Groupdocs.Security.UrlSignature.Sign(iframe, privateKey);
                                                        // Generate Embed viewer url for second signer
                                                        secondIframe = "https://apps.groupdocs.com/signature2/signembed/" + envelop.Result.Envelope.Id + "/" + addSecondRecipient.Result.Recipient.Id;
                                                        secondIframe = Groupdocs.Security.UrlSignature.Sign(secondIframe, privateKey);
                                                        result.Add("iframe1", iframe);
                                                        result.Add("iframe2", secondIframe);
                                                        return View("Sample44", null, result);
                                                    }
                                                    //If status failed set error for template
                                                    else
                                                    {
                                                        message = send.ErrorMessage;
                                                        result.Add("error", message);
                                                        return View("Sample44", null, result);
                                                    }
                                                }
                                                //If get document from envelop is failed return error
                                                else
                                                {
                                                    message = getDocuments.ErrorMessage;
                                                    result.Add("error", message);
                                                    return View("Sample44", null, result);
                                                }
                                            }
                                            //If add recipient is failed return error
                                            else
                                            {
                                                message = addSecondRecipient.ErrorMessage;
                                                result.Add("error", message);
                                                return View("Sample44", null, result);
                                            }
                                        }
                                        //If add recipient is failed return error
                                        else
                                        {
                                            message = addFirstRecipient.ErrorMessage;
                                            result.Add("error", message);
                                            return View("Sample44", null, result);
                                        }

                                    }
                                    //If envelope wasn't created send error
                                    else
                                    {
                                        message = envelop.ErrorMessage;
                                        result.Add("error", message);
                                        return View("Sample44", null, result);
                                    }
                                }
                                else
                                {
                                    result.Add("error", "MargeTemplate is fail");
                                    return View("Sample44", null, result);
                                }
                            }
                            else
                            {
                                result.Add("error", "AddDataSource returned empty job id");
                                return View("Sample44", null, result);
                            }
                        }
                        // If request return's null return error to the template
                        else
                        {
                            message = "Upload is failed";
                            result.Add("error", message);
                            return View("Sample44", null, result);
                        }
                    }
                    else
                    {
                        //If file wasn't uploaded return error
                        message = "Something wrong with upload";
                        result.Add("error", message);
                        return View("Sample44", null, result);
                    }
                }

            }
            // If data not posted return to template for filling of necessary fields
            else
            {
                return View("Sample44");
            }
        }
        public ActionResult Sample37()
        {
            // Check is data posted
            if (Request.HttpMethod == "POST")
            {
                //### Set variables and get POST data
                System.Collections.Hashtable result = new System.Collections.Hashtable();
                String clientId = Request.Form["clientId"];
                String privateKey = Request.Form["privateKey"];
                String email = Request.Form["email"];
                String name = Request.Form["name"];
                String lastName = Request.Form["lastName"];
                String callbackUrl = Request.Form["callbackUrl"];
                String fileId = Request.Form["fileId"];
                String url = Request.Form["url"];
                var file = Request.Files["file"];
                String fileName = "";
                String guid = "";
                String basePath = Request.Form["basePath"];
                String iframe = "";
                // Set entered data to the results list
                result.Add("clientId", clientId);
                result.Add("privateKey", privateKey);
                result.Add("email", email);
                result.Add("firstName", name);
                result.Add("lastName", lastName);
                // Check if callbackUrl is not empty
                if (!String.IsNullOrEmpty(callbackUrl))
                {
                    result.Add("callbackUrl", callbackUrl);
                }
                String message = null;
                // Check is all needed fields are entered
                if (String.IsNullOrEmpty(clientId) || String.IsNullOrEmpty(privateKey) || String.IsNullOrEmpty(email)
                    || String.IsNullOrEmpty(lastName) || String.IsNullOrEmpty(name))
                {
                    // If not all fields entered send error message
                    message = "Please enter all parameters";
                    result.Add("error", message);
                    return View("Sample37", null, result);
                }
                else
                {
                    //path to settings file - temporary save clientId and apiKey like to property file
                    create_info_file(clientId, privateKey, "");
                    if (basePath.Equals(""))
                    {
                        basePath = "https://api.groupdocs.com/v2.0";
                    }
                    result.Add("basePath", basePath);
                    // Create service for Groupdocs account
                    GroupdocsService service = new GroupdocsService(basePath, clientId, privateKey);
                    //if URL to web file was provided - upload the file from Web and get it's GUID
                    if (!url.Equals(""))
                    {
                        //Make request to upload file from entered Url
                        String uploadWeb = service.UploadUrl(url);
                        if (uploadWeb != null)
                        {
                            //If file uploaded return his GuId
                            guid = uploadWeb;
                            //Get all files from GroupDocs account
                            Groupdocs.Api.Contract.ListEntitiesResult storageInfo = service.GetFileSystemEntities("My Web Documents", 0, -1, null, false, null, null, true);
                            if (storageInfo.Files.Length > 0)
                            {
                                // Get file id by uploaded file GuId
                                for (int i = 0; i < storageInfo.Files.Length; i++)
                                {
                                    if (storageInfo.Files[i].Guid == guid)
                                    {
                                        fileName = storageInfo.Files[i].Name;
                                    }
                                }
                            }
                            else
                            {
                                message = "Get files list is failed";
                                result.Add("error", message);
                                return View("Sample37", null, result);
                            }
                        }
                        //If file wasn't uploaded return error
                        else
                        {
                            result.Add("error", "Something wrong with entered data");
                            return View("Sample37", null, result);
                        }
                    }
                    //if file was uploaded locally - upload the file and get it's GUID
                    if (!file.FileName.Equals(""))
                    {
                        //Upload local file
                        Groupdocs.Api.Contract.UploadRequestResult upload = service.UploadFile(file.FileName, String.Empty, file.InputStream);
                        if (upload.Guid != null)
                        {
                            //If file uploaded return his guid
                            guid = upload.Guid;
                            fileName = upload.AdjustedName;
                        }
                        else
                        {
                            //If file wasn't uploaded return error
                            result.Add("error", "Something wrong with entered data");
                            return View("Sample37", null, result);
                        }
                    }
                    if (!fileId.Equals(""))
                    {
                        guid = fileId;
                        //Get all files from GroupDocs account
                        Groupdocs.Api.Contract.ListEntitiesResult storageInfo = service.GetFileSystemEntities("", 0, -1, null, false, null, null, true);
                        if (storageInfo.Files.Length > 0)
                        {
                            // Get file id by uploaded file GuId
                            for (int i = 0; i < storageInfo.Files.Length; i++)
                            {
                                if (storageInfo.Files[i].Guid == guid)
                                {
                                    fileName = storageInfo.Files[i].Name;
                                }

                            }
                        }
                        else
                        {
                            message = "Get files list is failed";
                            result.Add("error", message);
                            return View("Sample37", null, result);
                        }

                    }
                    //Check is file uploaded
                    if (!guid.Equals("") && !fileName.Equals(""))
                    {
                        //Create envilope using user id and entered by user name
                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeResponse envelop = service.CreateEnvelope("", "", fileName, guid, false);
                        if (envelop.Status.Equals("Ok"))
                        {
                            decimal order = new decimal();
                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentResponse addDocument = service.AddEnvelopeDocument(envelop.Result.Envelope.Id, guid, order, true);
                            if (addDocument.Status.Equals("Ok"))
                            {
                                decimal dec = new decimal();
                                //Get role list for curent user
                                Groupdocs.Api.Contract.Signature.SignatureRolesResponse roles = service.GetSignatureRoles("");
                                String roleId = "";
                                //Get id of role which can sign
                                for (int i = 0; i < roles.Result.Roles.Length; i++)
                                {
                                    if (roles.Result.Roles[i].Name.Equals("Signer"))
                                    {
                                        roleId = roles.Result.Roles[i].Id;
                                        break;
                                    }
                                }
                                //Add recipient to envelope
                                Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientResponse addRecipient = service.AddEnvelopeRecipient(envelop.Result.Envelope.Id, email, name, lastName, roleId, dec);
                                if (addRecipient.Status.Equals("Ok"))
                                {
                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentsResponse getDocuments = service.GetEnvelopeDocuments(envelop.Result.Envelope.Id);
                                    if (getDocuments.Status.Equals("Ok"))
                                    {
                                        System.Random rand = new System.Random();
                                        String fieldName = "singlSample" + rand.Next(0, 1000);
                                        //Create envelop field settings object (LocationsX,Y max value can bee 1.0)
                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo envelopFieldSettings = new Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo();
                                        envelopFieldSettings.LocationX = new decimal(0.15);
                                        envelopFieldSettings.LocationY = new decimal(0.73);
                                        envelopFieldSettings.LocationWidth = 150;
                                        envelopFieldSettings.LocationHeight = 50;
                                        envelopFieldSettings.Name = fieldName;
                                        envelopFieldSettings.ForceNewField = true;
                                        envelopFieldSettings.Page = 1;
                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldResponse addFields = service.AddEnvelopeField(envelop.Result.Envelope.Id, getDocuments.Result.Documents[0].DocumentId, addRecipient.Result.Recipient.Id, "0545e589fb3e27c9bb7a1f59d0e3fcb9", envelopFieldSettings);
                                        //Send envelop with callbackUrl url
                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeSendResponse send = service.SendEnvelope(envelop.Result.Envelope.Id, callbackUrl);
                                        //Check is envelope send status
                                        if (send.Status.Equals("Ok"))
                                        {
                                            // Generate Embed viewer url with entered file id
                                            if (basePath.Equals("https://api.groupdocs.com/v2.0"))
                                            {
                                                iframe = "https://apps.groupdocs.com/signature2/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                            }
                                            if (basePath.Equals("https://dev-api-groupdocs.dynabic.com/v2.0"))
                                            {
                                                iframe = "https://dev-apps-groupdocs.dynabic.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                            }
                                            if (basePath.Equals("https://stage-api-groupdocs.dynabic.com/v2.0"))
                                            {
                                                iframe = "https://stage-apps-groupdocs.dynabic.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                            }
                                            if (basePath.Equals("https://realtime-api.groupdocs.com/v2.0"))
                                            {
                                                iframe = "https://realtime-apps.groupdocs.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                            }
                                            iframe = Groupdocs.Security.UrlSignature.Sign(iframe, privateKey);
                                            result.Add("iframe", iframe);
                                            //Set data for template
                                            result.Add("envelop", envelop.Result.Envelope.Id);
                                            result.Add("recipient", addRecipient.Result.Recipient.Id);
                                            return View("Sample37", null, result);
                                        }
                                        //If status failed set error for template
                                        else
                                        {
                                            result.Add("error", send.ErrorMessage);
                                            return View("Sample37", null, result);
                                        }
                                    }
                                    else
                                    {
                                        result.Add("error", getDocuments.ErrorMessage);
                                        return View("Sample37", null, result);
                                    }
                                }
                                else
                                {
                                    result.Add("error", addRecipient.ErrorMessage);
                                    return View("Sample37", null, result);
                                }
                            }
                            else
                            {
                                result.Add("error", addDocument.ErrorMessage);
                                return View("Sample37", null, result);
                            }
                        }
                        //If envelope wasn't created send error
                        else
                        {
                            result.Add("error", envelop.ErrorMessage);
                            return View("Sample37", null, result);
                        }
                    }
                    // If request return's null return error to the template
                    else
                    {
                        result.Add("error", "Upload is failed");
                        return View("Sample37", null, result);
                    }

                }

            }
            // If data not posted return to template for filling of necessary fields
            else
            {
                return View("Sample37");
            }
        }
        public ActionResult Sample39()
        {
            // Check is data posted
            if (Request.HttpMethod == "POST")
            {
                //### Set variables and get POST data
                System.Collections.Hashtable result = new System.Collections.Hashtable();
                string message = null;
                System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                //Chekck is email entered, if not sign document with widget
                if (String.IsNullOrEmpty(Request.Form["email"]))
                {
                    //Get data from ajax
                    System.IO.Stream inputStream = Request.InputStream;
                    System.Text.Encoding encoding = Request.ContentEncoding;
                    System.IO.StreamReader reader = new System.IO.StreamReader(inputStream, encoding);
                    string jsonString = reader.ReadToEnd();
                    //Parse json data from ajax
                    var postData = Newtonsoft.Json.Linq.JObject.Parse(jsonString);
                    //Get data from parsed object
                    String clientId = postData["userId"].ToString();
                    String privateKey = postData["privateKey"].ToString();
                    var document = postData["documents"];
                    var signers = postData["signers"];
                    string guid = null;
                    // Check is all needed fields are entered
                    if (String.IsNullOrEmpty(clientId) || String.IsNullOrEmpty(privateKey))
                    {
                        // If not all fields entered send error message
                        message = "Please enter all parameters";
                    }
                    else
                    {
                        //Create GroupDocs service
                        GroupdocsService service = new GroupdocsService("https://api.groupdocs.com/v2.0", clientId, privateKey);
                        //Create document for signing object
                        Groupdocs.Api.Contract.Signature.SignatureSignDocumentDocumentSettingsInfo[] documentSettings = new Groupdocs.Api.Contract.Signature.SignatureSignDocumentDocumentSettingsInfo[1];
                        documentSettings[0] = new Groupdocs.Api.Contract.Signature.SignatureSignDocumentDocumentSettingsInfo();
                        documentSettings[0].Name = document[0]["name"].ToString();
                        documentSettings[0].Data = document[0]["data"].ToString();
                        //Create signature object
                        Groupdocs.Api.Contract.Signature.SignatureSignDocumentSignerSettingsInfo[] signatureSettings = new Groupdocs.Api.Contract.Signature.SignatureSignDocumentSignerSettingsInfo[1];
                        signatureSettings[0] = new Groupdocs.Api.Contract.Signature.SignatureSignDocumentSignerSettingsInfo();
                        signatureSettings[0].Name = signers[0]["name"].ToString();
                        signatureSettings[0].Data = signers[0]["data"].ToString();
                        //Create sign settings info object
                        Groupdocs.Api.Contract.Signature.SignatureSignDocumentSettingsInfo settings = new Groupdocs.Api.Contract.Signature.SignatureSignDocumentSettingsInfo();
                        settings.Documents = documentSettings;
                        settings.Signers = signatureSettings;
                        //Make request to sign document
                        Groupdocs.Api.Contract.Signature.SignatureSignDocumentResponse sign = service.SignDocument(settings);
                        if (sign.Status.Equals("Ok"))
                        {
                            //Get job GUID
                            string jobGuid = sign.Result.JobId;
                            int counter = 5;
                            //Check signed document status and get signed document GUID
                            for (int i = 0; i < counter; i++)
                            {
                                System.Threading.Thread.Sleep(5000);
                                Groupdocs.Api.Contract.Signature.SignatureSignDocumentStatusResponse getSignDocumentStatus = service.GetSignDocumentStatus(jobGuid);
                                if (getSignDocumentStatus.Status.Equals("Ok"))
                                {
                                    if (getSignDocumentStatus.Result.Documents[0].Status.ToString() == "Completed")
                                    {
                                        guid = getSignDocumentStatus.Result.Documents[0].DocumentId;
                                        break;
                                    }
                                }
                                else
                                {
                                    message = getSignDocumentStatus.ErrorMessage;
                                }
                            }
                        }
                        else
                        {
                            message = sign.ErrorMessage;
                        }
                    }
                    //Add data to responce json
                    result.Add("error", message);
                    result.Add("guid", guid);
                    result.Add("clientId", clientId);
                    result.Add("privateKey", privateKey);
                    //Create json string and return it to ajax request
                    return Json(serializer.Serialize(result));
                }
                //Check if email entered if so sign document with out widget
                else if (!String.IsNullOrEmpty(Request.Form["email"]))
                {
                    //Get post data
                    String clientId = Request.Form["clientId"];
                    String privateKey = Request.Form["privateKey"];
                    String email = Request.Form["email"];
                    String name = Request.Form["name"];
                    String lastName = Request.Form["lastName"];
                    String callbackUrl = Request.Form["callbackUrl"];
                    var file = Request.Files["file"];
                    String fileName = "";
                    String guid = "";
                    String iframe = "";
                    // Set entered data to the results list
                    result.Add("clientId", clientId);
                    result.Add("privateKey", privateKey);
                    result.Add("email", email);
                    result.Add("firstName", name);
                    result.Add("lastName", lastName);
                    // Check if callbackUrl is not empty
                    if (!String.IsNullOrEmpty(callbackUrl))
                    {
                        result.Add("callbackUrl", callbackUrl);
                    }
                    // Check is all needed fields are entered
                    if (String.IsNullOrEmpty(clientId) || String.IsNullOrEmpty(privateKey) || String.IsNullOrEmpty(email)
                        || String.IsNullOrEmpty(lastName) || String.IsNullOrEmpty(name))
                    {
                        // If not all fields entered send error message
                        message = "Please enter all parameters";
                        result.Add("error", message);
                        return View("Sample39", null, result);
                    }
                    else
                    {
                        //path to settings file - temporary save clientId and apiKey like to property file
                        create_info_file(clientId, privateKey, "");
                        String callbackInfo = AppDomain.CurrentDomain.BaseDirectory + "callback_info.txt";
                        if (System.IO.File.Exists(callbackInfo))
                        {
                            System.IO.File.Delete(callbackInfo);
                        }
                        // Create service for Groupdocs account
                        GroupdocsService service = new GroupdocsService("https://api.groupdocs.com/v2.0", clientId, privateKey);
                        //Upload local file
                        Groupdocs.Api.Contract.UploadRequestResult upload = service.UploadFile(file.FileName, String.Empty, file.InputStream);
                        if (upload.Guid != null)
                        {
                            //If file uploaded return his guid
                            guid = upload.Guid;
                            fileName = upload.AdjustedName;
                            //Check is file uploaded
                            if (!guid.Equals("") && !fileName.Equals(""))
                            {
                                //Create envelope using user id and entered by user name
                                Groupdocs.Api.Contract.Signature.SignatureEnvelopeResponse envelop = service.CreateEnvelope("", "", fileName, guid, false);
                                if (envelop.Status.Equals("Ok"))
                                {
                                    decimal order = new decimal();
                                    decimal dec = new decimal();
                                    //Get role list for curent user
                                    Groupdocs.Api.Contract.Signature.SignatureRolesResponse roles = service.GetSignatureRoles("");
                                    String roleId = "";
                                    //Get id of role which can sign
                                    for (int i = 0; i < roles.Result.Roles.Length; i++)
                                    {
                                        if (roles.Result.Roles[i].Name.Equals("Signer"))
                                        {
                                            roleId = roles.Result.Roles[i].Id;
                                            break;
                                        }
                                    }
                                    //Add recipient to envelope
                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientResponse addRecipient = service.AddEnvelopeRecipient(envelop.Result.Envelope.Id, email, name, lastName, roleId, dec);
                                    if (addRecipient.Status.Equals("Ok"))
                                    {
                                        //Get document from envelop
                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentsResponse getDocuments = service.GetEnvelopeDocuments(envelop.Result.Envelope.Id);
                                        if (getDocuments.Status.Equals("Ok"))
                                        {
                                            System.Random rand = new System.Random();
                                            String fieldName = "singlSample" + rand.Next(0, 1000);
                                            //Create envelop field settings object (LocationsX,Y max value can bee 1.0)
                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo envelopFieldSettings = new Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo();
                                            envelopFieldSettings.LocationX = new decimal(0.15);
                                            envelopFieldSettings.LocationY = new decimal(0.73);
                                            envelopFieldSettings.LocationWidth = 150;
                                            envelopFieldSettings.LocationHeight = 50;
                                            envelopFieldSettings.Name = fieldName;
                                            envelopFieldSettings.ForceNewField = true;
                                            envelopFieldSettings.Page = 1;
                                            //Add envelop field to the document
                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldResponse addFields = service.AddEnvelopeField(envelop.Result.Envelope.Id, getDocuments.Result.Documents[0].DocumentId, addRecipient.Result.Recipient.Id, "0545e589fb3e27c9bb7a1f59d0e3fcb9", envelopFieldSettings);
                                            //Send envelop with callbackUrl url
                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeSendResponse send = service.SendEnvelope(envelop.Result.Envelope.Id, callbackUrl);
                                            //Check is envelope send status
                                            if (send.Status.Equals("Ok"))
                                            {
                                                // Generate Embed viewer url with entered file id
                                                iframe = "https://apps.groupdocs.com/signature2/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                                iframe = Groupdocs.Security.UrlSignature.Sign(iframe, privateKey);
                                                result.Add("iframe", iframe);
                                                return View("Sample39", null, result);
                                            }
                                            //If status failed set error for template
                                            else
                                            {
                                                message = send.ErrorMessage;
                                                result.Add("error", message);
                                                return View("Sample39", null, result);
                                            }
                                        }
                                        //If get document from envelop is failed return error
                                        else
                                        {
                                            message = getDocuments.ErrorMessage;
                                            result.Add("error", message);
                                            return View("Sample39", null, result);
                                        }
                                    }
                                    //If add recipient is failed return error
                                    else
                                    {
                                        message = addRecipient.ErrorMessage;
                                        result.Add("error", message);
                                        return View("Sample39", null, result);
                                    }
                                }
                                //If envelope wasn't created send error
                                else
                                {
                                    message = envelop.ErrorMessage;
                                    result.Add("error", message);
                                    return View("Sample39", null, result);
                                }
                            }
                            // If request return's null return error to the template
                            else
                            {
                                message = "Upload is failed";
                                result.Add("error", message);
                                return View("Sample39", null, result);
                            }
                        }
                        else
                        {
                            //If file wasn't uploaded return error
                            message = "Something wrong with upload";
                            result.Add("error", message);
                            return View("Sample39", null, result);
                        }
                    }

                }
                return View("Sample39");
            }
            // If data not posted return to template for filling of necessary fields
            else
            {
                return View("Sample39");
            }
        }
        public ActionResult Sample31()
        {
            // Check is data posted
            if (Request.HttpMethod == "POST")
            {
                //### Set variables and get POST data
                System.Collections.Hashtable result = new System.Collections.Hashtable();
                String clientId = Request.Form["clientId"];
                String privateKey = Request.Form["privateKey"];
                String email = Request.Form["email"];
                String name = Request.Form["name"];
                String country = Request.Form["country"];
                String callbackUrl = Request.Form["callbackUrl"];
                String templateGuid = Request.Form["templateGuid"];
                String city = Request.Form["city"];
                String street = Request.Form["street"];
                String guid = "";
                String iframe = "";
                String basePath = Request.Form["basePath"];
                // Set entered data to the results list
                result.Add("clientId", clientId);
                result.Add("privateKey", privateKey);
                result.Add("email", email);
                result.Add("name", name);
                result.Add("street", street);
                result.Add("country", country);
                result.Add("city", city);

                // Check if callbackUrl is not empty
                if (!String.IsNullOrEmpty(callbackUrl))
                {
                    result.Add("callbackUrl", callbackUrl);
                }

                String message = null;
                // Check is all needed fields are entered
                if (String.IsNullOrEmpty(clientId) || String.IsNullOrEmpty(privateKey))
                {
                    // If not all fields entered send error message
                    message = "Please enter all parameters";
                    result.Add("error", message);
                    return View("Sample31", null, result);
                }
                else
                {

                    //path to settings file - temporary save clientId and apiKey like to property file
                    create_info_file(clientId, privateKey, "");
                    if (basePath.Equals(""))
                    {
                        basePath = "https://api.groupdocs.com/v2.0";
                    }
                    result.Add("basePath", basePath);
                    // Create service for Groupdocs account
                    GroupdocsService service = new GroupdocsService(basePath, clientId, privateKey);
                    if (!templateGuid.Equals(""))
                    {
                        guid = templateGuid;

                    }
                    //Create Hashtable with entere data
                    if (!guid.Equals(""))
                    {
                        System.Collections.Hashtable enteredData = new System.Collections.Hashtable();
                        enteredData.Add("street", street);
                        enteredData.Add("city", city);
                        enteredData.Add("country", country);
                        enteredData.Add("name", name);
                        enteredData.Add("email", email);

                        //Create Datasource object
                        Groupdocs.Assembly.Data.Datasource dataSource = new Groupdocs.Assembly.Data.Datasource();
                        //Create array of DatasourceField objects
                        Groupdocs.Assembly.Data.DatasourceField[] fieldArray = new Groupdocs.Assembly.Data.DatasourceField[5];
                        //Filing DataSource object with user data
                        int index = 0;
                        foreach (System.Collections.DictionaryEntry value in enteredData)
                        {
                            //Create object with value
                            string[] values = new string[1];
                            values.SetValue(value.Value.ToString(), 0);
                            //Create DataSourceField object
                            Groupdocs.Assembly.Data.DatasourceField field = new Groupdocs.Assembly.Data.DatasourceField();
                            //Create DataSource Field type
                            Groupdocs.Assembly.Data.DatasourceFieldType type = new Groupdocs.Assembly.Data.DatasourceFieldType();
                            //Set field type to "text"
                            type = 0;
                            field.Name = value.Key.ToString();
                            field.Type = type;
                            field.Values = values;
                            //Push DatasourceField to array of DatasourceField objects
                            fieldArray.SetValue(field, index);
                            index = index + 1;

                        }
                        //Set feilds array to the Datasource
                        dataSource.Fields = fieldArray;
                        //Add new Datasource to GroupDocs
                        decimal addDataSource = service.AddDataSource(dataSource);
                        //Check is not empty addDataSource
                        if (!addDataSource.Equals(""))
                        {
                            //If status ok merge Datasource to new pdf file
                            decimal job = service.MergeTemplate(guid, addDataSource, "pdf", false);
                            if (!job.Equals(""))
                            {
                                Groupdocs.Api.Contract.GetJobDocumentsResult jobInfo = new Groupdocs.Api.Contract.GetJobDocumentsResult();
                                //### Check job status
                                for (int n = 0; n <= 5; n++)
                                {
                                    //Delay necessary that the inquiry would manage to be processed
                                    System.Threading.Thread.Sleep(5000);
                                    //Make request to api for get document info by job id
                                    jobInfo = service.GetJobDocuments(job);
                                    //Check job status, if status is Completed or Archived exit from cycle
                                    if (jobInfo.JobStatus.Equals("Completed") || jobInfo.JobStatus.Equals("Archived"))
                                    {
                                        break;
                                        //If job status Postponed throw exception with error
                                    }
                                    else if (jobInfo.JobStatus.Equals("Postponed"))
                                    {
                                        result.Add("error", "Job is fail");
                                        return View("Sample31", null, result);

                                    }
                                }
                                //Create envilope using entered by user name
                                Groupdocs.Api.Contract.Signature.SignatureEnvelopeResponse envelop = service.CreateEnvelope("", "", name, "", false);
                                if (envelop.Status.Equals("Ok"))
                                {
                                    //Add selected document to the envelop
                                    decimal order = new decimal();
                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentResponse addDocument = service.AddEnvelopeDocument(envelop.Result.Envelope.Id, guid, order, true);
                                    if (addDocument.Status.Equals("Ok"))
                                    {
                                        decimal dec = new decimal();
                                        //Get role list for curent user
                                        Groupdocs.Api.Contract.Signature.SignatureRolesResponse roles = service.GetSignatureRoles("");
                                        String roleId = "";
                                        //Get id of role which can sign
                                        for (int i = 0; i < roles.Result.Roles.Length; i++)
                                        {
                                            if (roles.Result.Roles[i].Name.Equals("Signer"))
                                            {
                                                roleId = roles.Result.Roles[i].Id;
                                                break;
                                            }
                                        }
                                        //Create Field settings object and set field name (which must be unique)
                                        Groupdocs.Api.Contract.Signature.SignatureFieldSettingsInfo fieldSettings = new Groupdocs.Api.Contract.Signature.SignatureFieldSettingsInfo();
                                        System.Random rand = new System.Random();
                                        String fieldName = "singlSample" + rand.Next(0, 1000);
                                        fieldSettings.Name = fieldName;
                                        //Add created field to the Gd account
                                        Groupdocs.Api.Contract.Signature.SignatureFieldResponse createField = service.AddSignatureField(fieldSettings);
                                        if (createField.Status.Equals("Ok"))
                                        {
                                            //Add recipient to envelope
                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientResponse addRecipient = service.AddEnvelopeRecipient(envelop.Result.Envelope.Id, email, name, "Last", roleId, dec);
                                            if (addRecipient.Status.Equals("Ok"))
                                            {
                                                //Get recipients from envelop
                                                Groupdocs.Api.Contract.Signature.SignatureEnvelopeRecipientsResponse getRecipient = service.GetEnvelopeRecipients(envelop.Result.Envelope.Id);
                                                if (getRecipient.Status.Equals("Ok"))
                                                {
                                                    //Get recipient id
                                                    String recipientId = getRecipient.Result.Recipients[0].Id;
                                                    //Get documents from envelop
                                                    Groupdocs.Api.Contract.Signature.SignatureEnvelopeDocumentsResponse getDocuments = service.GetEnvelopeDocuments(envelop.Result.Envelope.Id);
                                                    if (getDocuments.Status.Equals("Ok"))
                                                    {
                                                        //Create envelop field settings object (LocationsX,Y max value can bee 1.0)
                                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo envelopFieldSettings = new Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldSettingsInfo();
                                                        envelopFieldSettings.LocationX = new decimal(0.15);
                                                        envelopFieldSettings.LocationY = new decimal(0.73);
                                                        envelopFieldSettings.LocationWidth = 150;
                                                        envelopFieldSettings.LocationHeight = 50;
                                                        envelopFieldSettings.Name = fieldName;
                                                        envelopFieldSettings.ForceNewField = true;
                                                        envelopFieldSettings.Page = 1;
                                                        //Add created field to the envelop
                                                        Groupdocs.Api.Contract.Signature.SignatureEnvelopeFieldResponse addField = service.AddEnvelopeField(envelop.Result.Envelope.Id, getDocuments.Result.Documents[0].DocumentId, recipientId, "0545e589fb3e27c9bb7a1f59d0e3fcb9", envelopFieldSettings);
                                                        if (addField.Status.Equals("Ok"))
                                                        {
                                                            //Send envelop with callbackUrl url
                                                            Groupdocs.Api.Contract.Signature.SignatureEnvelopeSendResponse send = service.SendEnvelope(envelop.Result.Envelope.Id, callbackUrl);
                                                            //Check is envelope send status
                                                            if (send.Status.Equals("Ok"))
                                                            {
                                                                // Generate Embed viewer url with entered file id
                                                                if (basePath.Equals("https://api.groupdocs.com/v2.0"))
                                                                {
                                                                    iframe = "https://apps.groupdocs.com/signature2/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                                                }
                                                                if (basePath.Equals("https://dev-api-groupdocs.dynabic.com/v2.0"))
                                                                {
                                                                    iframe = "https://dev-apps-groupdocs.dynabic.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                                                }
                                                                if (basePath.Equals("https://stage-api-groupdocs.dynabic.com/v2.0"))
                                                                {
                                                                    iframe = "https://stage-api-groupdocs.dynabic.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                                                }
                                                                if (basePath.Equals("https://realtime-api.groupdocs.com/v2.0"))
                                                                {
                                                                    iframe = "https://realtime-apps.groupdocs.com/signature/signembed/" + envelop.Result.Envelope.Id + "/" + addRecipient.Result.Recipient.Id;
                                                                }
                                                                iframe = Groupdocs.Security.UrlSignature.Sign(iframe, privateKey);
                                                                result.Add("iframe", iframe);
                                                                //Set data for template
                                                                result.Add("envelop", envelop.Result.Envelope.Id);
                                                                result.Add("recipient", addRecipient.Result.Recipient.Id);
                                                                return View("Sample31", null, result);
                                                            }
                                                            //If status failed set error for template
                                                            else
                                                            {
                                                                result.Add("error", send.ErrorMessage);
                                                                return View("Sample31", null, result);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            result.Add("error", addField.ErrorMessage);
                                                            return View("Sample31", null, result);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        result.Add("error", getDocuments.ErrorMessage);
                                                        return View("Sample31", null, result);
                                                    }
                                                }
                                                else
                                                {
                                                    result.Add("error", getRecipient.ErrorMessage);
                                                    return View("Sample31", null, result);
                                                }
                                            }
                                            else
                                            {
                                                result.Add("error", addRecipient.ErrorMessage);
                                                return View("Sample31", null, result);
                                            }
                                        }
                                        else
                                        {
                                            result.Add("error", createField.ErrorMessage);
                                            return View("Sample31", null, result);
                                        }
                                    }
                                    else
                                    {
                                        result.Add("error", addDocument.ErrorMessage);
                                        return View("Sample31", null, result);
                                    }
                                }
                                //If envelope wasn't created send error
                                else
                                {
                                    result.Add("error", envelop.ErrorMessage);
                                    return View("Sample31", null, result);
                                }
                            }
                            // If request return's null return error to the template
                            else
                            {
                                result.Add("error", "mergeTemplate is failed");
                                return View("Sample31", null, result);
                            }
                        }
                        // If request return's null return error to the template
                        else
                        {
                            result.Add("error", "addDataSource is failed");
                            return View("Sample31", null, result);
                        }
                    }
                    else
                    {
                        result.Add("error", "GUID is empty");
                        return View("Sample31", null, result);
                    }

                }

            }
            // If data not posted return to template for filling of necessary fields
            else
            {
                return View("Sample31");
            }
        }