<script type="text/javascript" src="/teams/MySCForApps/Style Library/JS/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/teams/MySCForApps/Style Library/JS/jquery-ui.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"></script>
<script type="text/javascript" src="/_layouts/15/sp.js"></script>
<script type="text/javascript" src="/teams/MySCForApps/Style Library/JS/jquery.MultiFile.js"></script>
<link rel="Stylesheet" type="text/css" href="../CSS/App.css" />
<script language="javascript" type="text/jscript">
	$(function () {
		var fileCountCheck = 0;
		$("#btnSubmit").click(function () {
			var data = [];
            var fileArray = [];
            $("#attachFilesContainer input:file").each(function () {
                if ($(this)[0].files[0]) {                    
                	fileArray.push({ "Attachment": $(this)[0].files[0] });                    
                }
            });
            data.push({"FirstName": $("#txtFirstName").val().trim(), "LastName": $("#txtLastName").val().trim(), "Files": fileArray});            
            createItemWithAttachments("MyList", data).then(
            	function(){
            		alert('Item created with Multiple attachments');
            	},
            	function(sender, args){
            		console.log('Error occured' + args.get_message());
            	}
            )
	        
		});
		
		var createItemWithAttachments = function(listName, listValues){			
			var fileCountCheck = 0;
	        var fileNames;			
			var context = new SP.ClientContext.get_current();
	        var dfd = $.Deferred();
	        var targetList = context.get_web().get_lists().getByTitle(listName);
	        context.load(targetList);
	        var itemCreateInfo = new SP.ListItemCreationInformation();
	        var listItem = targetList.addItem(itemCreateInfo);	 
	        listItem.set_item("FirstName", listValues[0].FirstName);
	        listItem.set_item("LastName", listValues[0].LastName); 
	        listItem.update();
        	context.executeQueryAsync(
        		function () {
	        	    var id = listItem.get_id();
	        	    if (listValues[0].Files.length != 0) {
	        	    	if (fileCountCheck <= listValues[0].Files.length - 1) {
							loopFileUpload(listName, id, listValues, fileCountCheck).then(
	                            function () {
	                            },
	                       	    function (sender, args) {
	                       	        console.log("Error uploading");
	                       	        dfd.reject(sender, args);
	                       	    }
	                        );
	                	}
	        	    }
	        	    else {
        	        	dfd.resolve(fileCountCheck);
        	    	}
	        	},   
	        	function(sender, args){
					console.log('Error occured' + args.get_message());	        	
	        	}
	        );
	        return dfd.promise();			
		}
		
		function loopFileUpload(listName, id, listValues, fileCountCheck) {
        	var dfd = $.Deferred();
        	uploadFile(listName, id, listValues[0].Files[fileCountCheck].Attachment).then(
	            function (data) {	                   
	                var objcontext = new SP.ClientContext();
	                var targetList = objcontext.get_web().get_lists().getByTitle(listName);
	                var listItem = targetList.getItemById(id);
	                objcontext.load(listItem);
	                objcontext.executeQueryAsync(function () {
	                    console.log("Reload List Item- Success");	                                     
	                    fileCountCheck++;
	                    if (fileCountCheck <= listValues[0].Files.length - 1) {
	                        loopFileUpload(listName, id, listValues, fileCountCheck);
	                    } else {
	                        console.log(fileCountCheck + ": Files uploaded");
	                        alert('Item created with Multiple attachments');	                        
	                    }
	                },
	                function (sender, args) {
	                    console.log("Reload List Item- Fail" + args.get_message());
	                });	                 
	                
	            },
	            function (sender, args) {
	                console.log("Not uploaded");
	                dfd.reject(sender, args);
	            }
	       );
           return dfd.promise();
    	}
    	
    	function uploadFile(listName, id, file) {
	        var deferred = $.Deferred();
	        var fileName = file.name;
        	getFileBuffer(file).then(
	            function (buffer) {
	                var bytes = new Uint8Array(buffer);
	                var binary = '';
	                for (var b = 0; b < bytes.length; b++) {
	                    binary += String.fromCharCode(bytes[b]);
	                }
	                var scriptbase = _spPageContextInfo.webServerRelativeUrl + "/_layouts/15/";
	                console.log(' File size:' + bytes.length);
	                $.getScript(scriptbase + "SP.RequestExecutor.js", function () {
	                    var createitem = new SP.RequestExecutor(_spPageContextInfo.webServerRelativeUrl);
	                    createitem.executeAsync({
	                        url: _spPageContextInfo.webServerRelativeUrl + "/_api/web/lists/GetByTitle('" + listName + "')/items(" + id + ")/AttachmentFiles/add(FileName='" + file.name + "')",
	                        method: "POST",
	                        binaryStringRequestBody: true,
	                        body: binary,
	                        success: fsucc,
	                        error: ferr,
	                        state: "Update"
	                    });
	                    function fsucc(data) {
	                        console.log(data + ' uploaded successfully');
	                        deferred.resolve(data);
	                    }
	                    function ferr(data) {
	                        console.log(fileName + "not uploaded error");
	                        deferred.reject(data);
	                    }
	                });
	
	            },
	            function (err) {
	                deferred.reject(err);
	            }
	        );
        	return deferred.promise();
    	}
    	function getFileBuffer(file) {
	        var deferred = $.Deferred();
	        var reader = new FileReader();
	        reader.onload = function (e) {
	            deferred.resolve(e.target.result);
	        }
	        reader.onerror = function (e) {
	            deferred.reject(e.target.error);
	        }
	        reader.readAsArrayBuffer(file);
	        return deferred.promise();
	    }
	});	
</script>
<div class="fld">
	<div>
		<span>First Name</span>
		<span><input type="text" id="txtFirstName"></span>	
	</div>
	<div>
		<span>Last Name</span>
		<span><input type="text" id="txtLastName"></span>	
	</div>

  	Attach any relevant files
	<div class="files" id="attachFilesContainer">
	    <input id="infringementFiles" type="file" class="multi browsebtn" />
	</div>
</div>
<div class="fld">
    <input class="btn" id="btnSubmit" value="Submit" type="button" />
</div>