diff --git a/.gitignore b/.gitignore index e69de29..b576eb2 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +src/.metadata/* diff --git a/1411750669 b/1411750669 new file mode 100755 index 0000000..3c94620 --- /dev/null +++ b/1411750669 @@ -0,0 +1 @@ +Started Session on: Friday, 26-Sep-2014 18:57:49 CEST diff --git a/1412284658 b/1412284658 new file mode 100755 index 0000000..54c9a93 --- /dev/null +++ b/1412284658 @@ -0,0 +1 @@ +Started Session on: Thursday, 02-Oct-2014 23:17:38 CEST diff --git a/1412882134 b/1412882134 new file mode 100755 index 0000000..9704387 --- /dev/null +++ b/1412882134 @@ -0,0 +1 @@ +Started Session on: Thursday, 09-Oct-2014 21:15:34 CEST diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/config.properties b/config.properties old mode 100644 new mode 100755 diff --git a/consent/consent.css b/consent/consent.css old mode 100644 new mode 100755 diff --git a/consent/consent.html b/consent/consent.html old mode 100644 new mode 100755 diff --git a/consent/consent.php b/consent/consent.php old mode 100644 new mode 100755 index 132e1df..8d7737a --- a/consent/consent.php +++ b/consent/consent.php @@ -11,9 +11,9 @@ $start_date = date(DATE_COOKIE); $_SESSION['log'] = "Started Session on: ".$start_date."\n"; - $signatures_file= '/afs/cs.unc.edu/home/bartel/emailUI_tracking/private_data/signatures.txt'; + // $signatures_file= '/afs/cs.unc.edu/home/bartel/emailUI_tracking/private_data/signatures.txt'; file_put_contents($signatures_file, "".$signature.", ".$date."=>".$id."\n" , FILE_APPEND | LOCK_EX); - header( 'Location: https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/' ) ; + header( 'Location: ../index.php' ) ; ?> diff --git a/css/consent.css b/css/consent.css old mode 100644 new mode 100755 diff --git a/css/style.css b/css/style.css old mode 100644 new mode 100755 index abc8c4e..88f5b74 --- a/css/style.css +++ b/css/style.css @@ -26,8 +26,17 @@ width: 99%; margin-left: 20px; } +#poke{ + margin-top: 5px; +} + +#reply{ + margin-top: 5px; +} + #navigation { - margin: 0px 40px 0px 10px; + margin: 0px auto 0px 10px; + min-width: 100px; } #new_message_editor { @@ -55,11 +64,20 @@ color: #FFFF80; } #predictions { - display: none; width: 100%; padding-bottom:10px; } +.longResponse{ + color:red; + padding-right: 5px; +} +.fastResponse{ + color:green; + padding-right: 5px; + +} + #prediction_menu_options { margin:0px 0px 10px 20px; } @@ -155,7 +173,53 @@ input#to_field:focus { background-color: #DAEDF5; } +.contact{ + background-color: #FF9900; +} + +.contact:hover { + cursor: pointer; + background-color: #993300; +} + textarea { resize: none; } +#replayMenu{ +position: absolute; +top: 20px; +left: 310px; +} + +#title{ + float: left; +} + +.replay{ + float: left; + display: inline-block; + margin-left: 20px; + text-align: center; +} + +.replay:hover, .replayHover{ +color: red; +} + +#time{ + width: 20px; +} + +#stats{ + position: absolute; + top: 30px; + left: 620px; +} + +.btn-select{ +margin: 0px auto 0px auto; +background-color: #3690ce; +color: white; +min-width: 60px; +} diff --git a/html/consent.css b/html/consent.css old mode 100644 new mode 100755 diff --git a/html/consent.html b/html/consent.html old mode 100644 new mode 100755 diff --git a/html/login.html b/html/login.html old mode 100644 new mode 100755 diff --git a/html/quit.html b/html/quit.html old mode 100644 new mode 100755 diff --git a/html/thankyou.html b/html/thankyou.html old mode 100644 new mode 100755 diff --git a/index.php b/index.php old mode 100644 new mode 100755 index 4181dca..4f24d69 --- a/index.php +++ b/index.php @@ -1,7 +1,7 @@ + +
@@ -115,21 +155,20 @@
New Message
- - - - - - - -

-
+ + + + + + +

+
-
- +
+
- +
@@ -144,8 +183,9 @@ - + + diff --git a/index.php~ b/index.php~ new file mode 100755 index 0000000..2935052 --- /dev/null +++ b/index.php~ @@ -0,0 +1,151 @@ + + + + + + + + + + Sample Email + + + + + + + + + + +
+ + +
+ + +
+
+
    +
    +
    + +
    +
    +

    +
    +
    +
    +
    + +
    +
    +
    New Message
    +
    + + + + + + + +

    +
    +
    +
    +
    + +
    + +
    + + + +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/js/main.js b/js/main.js old mode 100644 new mode 100755 index bd9c862..2ccee74 --- a/js/main.js +++ b/js/main.js @@ -4,18 +4,56 @@ $(document).ready(function() { var testData = jQuery.parseJSON(data); console.log(testData); var emails = testData.inbox; - - var save_session_url = 'https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/php/save_session_log.php'; - var end_session_url = 'https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/php/end_session.php'; - var submit_test_url = 'https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/php/submit_test.php'; - var session_log = "\n"; + var startRecording = false; + var save_session_url = '../php/save_session_log.php'; + var end_session_url = '../php/end_session.php'; + var submit_test_url = '../php/submit_test.php'; + var session_log = ""; + var url_base = 'http://localhost:8888/'; var already_predicted = false; var first_click = true; - var flat_interface = (testData.predictionInterface === "flat")? true: false; + var ToFieldNum = 0; + //var flat_interface = (testData.predictionInterface === "flat")? true: false; + var interface_select; var predictionGroup = new PredictionGroup(testData.predictionGroup); var email_editor_open = false; var maxSubjectAndPreviewLength = 150; //I calculated this number after testing the layout + var colors = new Array("#4D4D4D","#9933FF","#FF0000", "#00CC66", "#CC9900"); + + var log_message = function(message) { + if (startRecording) { + console.log(message); + session_log += (message + '\n'); + } + } + + document.onmousemove = getCoords; + + function getCoords(e) { + if (startRecording) { + var mouseX = e.pageX + var mouseY = e.pageY + recordToLog(mouseX,mouseY); + } + } + + function recordToLog(x,y) { + if (startRecording) { + var timeStamp = get_timestamp(); + session_log +="Mouse Coordinates " +x + " " + y + "; timestamp: " + timeStamp + "\n" + console.log( "Mouse Coordinates " +x + " " + y + "; timestamp: " + timeStamp + "\n"); + } + } + + function logContacts(people){ + var list = ""; + for(var i =0 ; i < people.length; i++){ + list = list + people[i] + ";"; + } + log_message('Contacts: ' + list); + } + /* Display test scenario instructions */ $('#instructions').find('p').text(testData.instructions); @@ -57,6 +95,21 @@ $(document).ready(function() { append_emails(testData.inbox); var session_start = new Date(); log_message('Started Test '+current_test+' on: ' + session_start); + + var append_contacts = function(contacts) { + $('.list-group').empty(); + for (var i = 0; i < contacts.length; i++) { + var contact = contacts[i]; + var name = contact.name; + //var previewSize = (subject.length + 1 >= maxSubjectAndPreviewLength) ? 0: maxSubjectAndPreviewLength - subject.length - 2; + //var preview = email.content.substring(0, previewSize); + + $('ul.list-group').append('
  • '); + $('#contact'+i).append('' + name + ''); +// $('#email'+i).append('  – ' + preview + ''); +// $('#email'+i).append('' + formattedDate(email) + ''); + } + } /* Returns a timestamp of the exact second since the sessions started For example, if session started at 3:00, this function will return @@ -67,7 +120,13 @@ $(document).ready(function() { /* Attach prediction to 'To' field when selected */ var attachPrediction = function(contact) { - wrap_contact(contact) //append email to contents of to_field + if((interface_select=="time"||interface_select=="timeNparen")&&contact.indexOf("[")>-1){ + wrap_contact(contact.substring(0,contact.indexOf("[")-1 )); + } + else{ + wrap_contact(contact); + } + //append email to contents of to_field first_click = false; } @@ -112,6 +171,11 @@ $(document).ready(function() { $('#email_expanded_col').show(); $('#email_list').hide(); }); + + $(document).on('click', '.contact', function() { + var contactname = $(this).text(); + wrap_contact(contactname); + }); //Open New Message editor $('#nav_new_message').click(function() { @@ -154,42 +218,95 @@ $(document).ready(function() { append_emails(testData.inbox); $('#email_list').show(); }); + + $('#nav_contacts').click(function() { + $('#email_expanded > .panel-heading > .panel-title').empty(); + $('#email_expanded > .panel-body').empty(); + $('#email_expanded_col').hide(); + + if (email_editor_open) + $('#email_list').attr('class','col-md-4') + else + $('#email_list').attr('class','col-md-10') + + append_contacts(testData.contacts); + $('#email_list').show(); + }); + + $('#nav_instructions').click(function() { + $('#popup_instr').find('.modal-body').append(testData.instructions); + $('#popup_instr').modal('toggle'); + }); /* Tracking functions */ $(document).on('mouseenter', '.tracked', function() { + if (startRecording) { log_message('Entered element ' + $(this).prop('id')+'; timestamp: ' + get_timestamp()); + } }); $(document).on('mouseleave', '.tracked', function() { + if (startRecording) { log_message('Left element ' + $(this).prop('id')+'; timestamp: ' + get_timestamp()); + } }); $(document).on('click', '.click', function() { + if (startRecording && $(this).prop('id') != "timeNparen" && $(this).prop('id') != "paren" && $(this).prop('id') !='time' && $(this).prop('id') !='flat'){ log_message('Clicked element ' + $(this).prop('id')+'; timestamp: ' + get_timestamp()); + } + }); + + $(document).on('click', '.btn-select', function() { + interface_select = $(this).prop('id'); + + var contacts = []; + if(interface_select == "flat" || interface_select == "paren"){ + for (var i = 0; i < testData.contacts.length; i++) { + contacts.push(testData.contacts[i].name); + }} + else{ + for (var i = 0; i < testData.contacts.length; i++) { + contacts.push(testData.contacts[i].name + " ["+testData.contacts[i].time+"]"); + }} + + logContacts(contacts); + + $('#to_field').autocomplete({ + source:contacts + }); + }); $(document).on('change keyup paste','.text', function() { + if (startRecording) { log_message('Changed content of ' + $(this).prop('id') + ' to ' + $(this).val() + ';timestamp: ' + get_timestamp()); + } }); /* Autocomplete contacts */ - $(function() { - var contacts = []; - for (var i = 0; i < testData.contacts.length; i++) { - contacts.push(testData.contacts[i].name); - } - - $('#to_field').autocomplete({ - source:contacts - }); - }); - + //$(function() { + //var contacts = []; + //if(interface_select == "flat" || interface_select == "paren"){ + // for (var i = 0; i < testData.contacts.length; i++) { + // contacts.push(testData.contacts[i].name); + // }} + //else{ + // for (var i = 0; i < testData.contacts.length; i++) { + // contacts.push(testData.contacts[i].name + " ["+testData.contacts[i].time+"]"); + // }} + // + //$('#to_field').autocomplete({ + // source:contacts + //}); + //}); /* Wrap autocompleted contacts in the panel */ $(document).on('click','.ui-corner-all', function() { var content = $('#to_field').val(); if (content !== '') { - wrap_contact(content); + //wrap_contact(content); + attachPrediction(content); } $('#to_field').val(''); @@ -199,57 +316,104 @@ $(document).ready(function() { /* Trigger hover effect on input */ $('#to_field').on('focus', function() { $('#to_field_outer').trigger('focus'); - }) + }); var wrap_contact = function(content) { - var sb = new StringBuilder(); - sb.append(''); + var duplicateInToField = false; + //for loop checks if any of the same email you are adding is already in the tofield. + //if it is, email isnt added. + for(var i = 0; i'); sb.append(''); - sb.append(''+ content +''); + //gives a unique ID to each contact in the ToField + sb.append(''+ content +''); + ToFieldNum++; sb.append(''); sb.append(''); sb.append(''); - $('#to_field_outer div').append(sb.toString()); - $('#to_field').val(''); - log_message('Added ' + content + ' to to_field;timestamp: ' + get_timestamp()); - /* Attach predictions */ - if (!already_predicted) { - already_predicted = true; - - $('#predictions').append(' Consider including: '); - if (flat_interface) - $('#predictions').append(predictionGroup.buildFlatInterface()); - else - $('#predictions').append(predictionGroup.buildHierarchicalInterface()); - - log_message('Suggested contacts: ' + contactsToString(predictionGroup.contacts)); - $('#predictions').show(); - } - } + $('#to_field_outer div').append(sb.toString()); + $('#to_field').val(''); + log_message('Added ' + content + ' to to_field;timestamp: ' + get_timestamp()); + if(!already_predicted) { + already_predicted = true; + $('#predictions').append(' Consider including: '); + if (interface_select=="flat"){ + $('#predictions').append(predictionGroup.buildFlatInterface());} + else if(interface_select=="paren"){ + $('#predictions').append(predictionGroup.buildHierarchicalInterface(-1));} + else if(interface_select=="time"){ + $('#predictions').append(predictionGroup.buildTimeInterface());} + else{ + $('#predictions').append(predictionGroup.buildHierachTimeInterface(-1));} + + log_message('Suggested contacts: ' + contactsToString(predictionGroup.contacts)); + $('#predictions').show(); + } + } + } $(document).on('click', '.contact_wrapper span.remove', function() { $(this).parents('.contact_wrapper').remove(); - }) + }); //Attach predictions +// $('#to_field').on('change keyup paste', function() { +// var content = $(this).val(); +// if (interface_select == "flat" || interface_select == "paren"){ +// wrap_contact(content); +// } +// else{ +// wrap_contact(content.substring(0,content.length - 1)); +// } +// }); + + //Attach predictions $('#to_field').on('change keyup paste',function() { var content = $(this).val(); if (content.indexOf(",") != -1) { - wrap_contact(content.substring(0,content.length - 1)); + attachPrediction(content.substring(0,content.length - 1)); + //attachPrediction(content.substring(0,content.length - 1)); } }); $(document).on('mouseenter','.prediction_group', function() { var id = $(this).data('group_id'); - $('.group'+id).css('color','#FF9966'); + var index = parseInt(id); + //$('.group'+id).css('color','#FF9966'); + //$('*[data-group_id="'+id+'"]').css('color','#FF9966'); + //var a = PredictionGroup.all[index] + //a.css('color','#FF9966'); + //$("#predictions").find + //$("a:visible[data-group_id"*=" + index + "]").css("color",'#FF9966'); + //$("a:visible[id*=" + index + "]").css("color","#FF9966"); + $("a." + index).css("color", "#FF9966"); }); $(document).on('mouseleave','.prediction_group', function() { var id = $(this).data('group_id'); - $('.group'+id).css('color','#428bca'); + var index = parseInt(id); + //$('.group'+id).css('color','#428bca'); + $('.group'+id).css('color',''+colors[id]+''); + //$("a:visible[id*=" + index + "]").css("color","#428BCA"); + $("a." + index).css("color","#428BCA"); + }); + + $(document).on('mouseenter','.prediction', function() { + $(this).css("color",'#FF9966'); + }); + + $(document).on('mouseleave','.prediction', function() { + $(this).css("color","#428BCA"); }); - $(document).on('click','.prediction', function() { var name = $(this).text(); @@ -259,6 +423,7 @@ $(document).ready(function() { $(document).on('click','.prediction_group', function() { var index = parseInt($(this).data('group_id')); attachPredictionGroup(PredictionGroup.all[index]); + //attachPrediction($("p:visible[id*=" + index + "]")); }); $(document).on('click','prediction_wrapper span.remove', function() { @@ -286,8 +451,19 @@ $(document).ready(function() { $('#send').on('click', function() { log_message('Ended Test ' + current_test + ' on: ' + new Date()); + $.ajax(url_base + "play/save_log.php", + {type: "POST", + dataType: "json", + data: {log: session_log}, + success: function(result, status, jqXHR) { + alert(result); + }, + error: function(jqXHR, status, error) { + alert('hello'); + alert(jqXHR.responseText); + }}); /* Collect the values on the to_field */ - var contacts_selected = [] + var contacts_selected = []; $('span.to_field_contact_name').each(function() { var contact = Contact.all[$(this).text()]; //get the contact object using the name as a key @@ -297,12 +473,12 @@ $(document).ready(function() { contacts_selected.push(contact); }); - $.ajax({ - type:'POST', - async:false, - url:submit_test_url, - data: {'data':session_log}, - success: function(data) { +// $.ajax({ +// type:'POST', +// async:false, +// url:submit_test_url, +// data: {'data':session_log}, +// success: function(data) { var selected = new StringBuilder(); var comma = " "; @@ -313,8 +489,8 @@ $(document).ready(function() { $('#results').find('.modal-body').append("Selected: " + selected); $('#results').find('.modal-body').append("
    Expected: " + expected); $('#results').modal('toggle'); - } - }); + //} + //}); }); @@ -362,4 +538,23 @@ $(document).ready(function() { } }); }); + + $("#timeNparen,#paren,#time,#flat").click(function(){ + startRecording = true; + }); + + + }); + +function save(data, filename){ + var blob = new Blob([data], {type: 'text/json'}), + e = document.createEvent('MouseEvents'), + a = document.createElement('a') + + a.download = filename; + a.href = window.URL.createObjectURL(blob); + a.dataset.downloadurl = ['text/json', a.download, a.href].join(':'); + e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); + a.dispatchEvent(e); +} \ No newline at end of file diff --git a/js/objects.js b/js/objects.js old mode 100644 new mode 100755 index 31980fe..03e0429 --- a/js/objects.js +++ b/js/objects.js @@ -32,11 +32,13 @@ Contact.all = {}; /* Global index value assigned to every prediction group so it can * be easily indexed out of the 'all' array */ -var index = 0; +//var colors = new Array(); +var index = 0; +var colors = new Array("#4D4D4D","#9933FF","#FF0000", "#00CC66", "#CC9900"); var PredictionGroup = function(json) { this.contacts = json.contacts; - this.subgroups = new Array(); + this.subgroups = json.subgroups; var deleted = false; //a flag used to do lazy deletion this.index = index; @@ -55,7 +57,9 @@ var PredictionGroup = function(json) { this.buildFlatInterface = function() { var sb = new StringBuilder(); for (var i = 0; i < this.subgroups.length; i++) { - sb.append(this.subgroups[i].buildFlatInterface()); + var sg = new PredictionGroup(this.subgroups[i]); + var sgstr = sg.buildFlatInterface(); + sb.append(sgstr); } for (var i = 0; i < this.contacts.length; i++) { @@ -66,29 +70,103 @@ var PredictionGroup = function(json) { return sb.toString(); } - this.buildHierarchicalInterface = function() { + this.buildHierarchicalInterface = function(recur) { var sb = new StringBuilder(); + var parencolor = colors[this.index]; //Each parenthesis will have a class name group for easy selection on jQuery - sb.append(' ( '); + sb.append(' [ '); for (var i = 0; i < this.subgroups.length; i++) { - sb.append(this.subgroups[i].buildHierarchicalInterface()); + var sg = new PredictionGroup(this.subgroups[i]); + //sb.append(this.subgroups[i].buildHierarchicalInterface()); + var sgstr = sg.buildHierarchicalInterface(this.index); + sb.append(sgstr); } for (var j = 0; j < this.contacts.length; j++) { var c = this.contacts[j]; - sb.append('') - sb.append(''); - sb.append(''+c.name+''); - sb.append(''); - sb.append(''); - sb.append(' '); + sb.append(''+c.name+' '); } - sb.append(' ) '); + sb.append(' ] '); return sb.toString(); } + this.buildTimeInterface = function() { + var sb = new StringBuilder(); + for (var i = 0; i < this.subgroups.length; i++) { + var sg = new PredictionGroup(this.subgroups[i]); + var sgstr = sg.buildTimeInterface(); + sb.append(sgstr); + } + + for (var i = 0; i < this.contacts.length; i++) { + var c = this.contacts[i]; + var split = c.time.split(" "); + // time is split into two parts, value of time and the unit of time. split[1] is the days, minutes hours, ect. + if(split[1]=="Days" || split[1]=="days" || split[1] =="mo" || split[1] == "day" || split[1] == "Day"){ + sb.append('' + c.name +''+ " [" + c.time + "]" + " " +''); + }else{ + sb.append('' + c.name +''+ " [" + c.time + "]" +" " +''); + } + } + return sb.toString(); + } + + this.buildHierachTimeInterface = function(recur) { + var sb = new StringBuilder(); + var parencolor = colors[this.index]; + //Each parenthesis will have a class name group for easy selection on jQuery + sb.append(' [ '); + for (var i = 0; i < this.subgroups.length; i++) { + var sg = new PredictionGroup(this.subgroups[i]); + var sgstr = sg.buildHierachTimeInterface(); + sb.append(sgstr); + } + for (var i = 0; i < this.contacts.length; i++) { + var c = this.contacts[i]; + var split = c.time.split(" "); + sb.append(''); + } + else if(recur == 0){ + sb.append('class="prediction tracked click 0 '+this.index+'">'); + } + else{ + sb.append('class="prediction tracked click 0 '+this.index+' '+recur+'">'); + } + // time is split into two parts, value of time and the unit of time. split[1] is the days, minutes hours, ect. + if(split[1]=="Days" || split[1]=="days" || split[1] =="mo" || split[1] == "day" || split[1] == "Day"){ + sb.append('' + c.name +''+ " [" + c.time + "]" + " " +''); + }else{ + sb.append('' + c.name +''+ " [" + c.time + "]" +" " +''); + } + } + sb.append('] '); + + return sb.toString(); + } + PredictionGroup.all.push(this); index++; } diff --git a/libs/Bootstrap/css/bootstrap-theme.css b/libs/Bootstrap/css/bootstrap-theme.css old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/css/bootstrap-theme.min.css b/libs/Bootstrap/css/bootstrap-theme.min.css old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/css/bootstrap.css b/libs/Bootstrap/css/bootstrap.css old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/css/bootstrap.min.css b/libs/Bootstrap/css/bootstrap.min.css old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/css/styles.css b/libs/Bootstrap/css/styles.css old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/fonts/glyphicons-halflings-regular.eot b/libs/Bootstrap/fonts/glyphicons-halflings-regular.eot old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/fonts/glyphicons-halflings-regular.svg b/libs/Bootstrap/fonts/glyphicons-halflings-regular.svg old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/fonts/glyphicons-halflings-regular.ttf b/libs/Bootstrap/fonts/glyphicons-halflings-regular.ttf old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/fonts/glyphicons-halflings-regular.woff b/libs/Bootstrap/fonts/glyphicons-halflings-regular.woff old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/js/bootstrap.js b/libs/Bootstrap/js/bootstrap.js old mode 100644 new mode 100755 diff --git a/libs/Bootstrap/js/bootstrap.min.js b/libs/Bootstrap/js/bootstrap.min.js old mode 100644 new mode 100755 diff --git a/libs/google-gson-2.2.4/LICENSE b/libs/google-gson-2.2.4/LICENSE old mode 100644 new mode 100755 index 892eaed..8763058 --- a/libs/google-gson-2.2.4/LICENSE +++ b/libs/google-gson-2.2.4/LICENSE @@ -1,203 +1,203 @@ -Google Gson - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2008-2011 Google Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Google Gson + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2008-2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/libs/google-gson-2.2.4/README b/libs/google-gson-2.2.4/README old mode 100644 new mode 100755 diff --git a/libs/google-gson-2.2.4/gson-2.2.4-javadoc.jar b/libs/google-gson-2.2.4/gson-2.2.4-javadoc.jar old mode 100644 new mode 100755 diff --git a/libs/google-gson-2.2.4/gson-2.2.4-sources.jar b/libs/google-gson-2.2.4/gson-2.2.4-sources.jar old mode 100644 new mode 100755 diff --git a/libs/google-gson-2.2.4/gson-2.2.4.jar b/libs/google-gson-2.2.4/gson-2.2.4.jar old mode 100644 new mode 100755 diff --git a/libs/jquery.min.js b/libs/jquery.min.js old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/animated-overlay.gif b/libs/jqueryui/1.10.4/images/animated-overlay.gif old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/libs/jqueryui/1.10.4/images/ui-bg_diagonals-thick_18_b81900_40x40.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_diagonals-thick_20_666666_40x40.png b/libs/jqueryui/1.10.4/images/ui-bg_diagonals-thick_20_666666_40x40.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_flat_10_000000_40x100.png b/libs/jqueryui/1.10.4/images/ui-bg_flat_10_000000_40x100.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_glass_100_f6f6f6_1x400.png b/libs/jqueryui/1.10.4/images/ui-bg_glass_100_f6f6f6_1x400.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_glass_100_fdf5ce_1x400.png b/libs/jqueryui/1.10.4/images/ui-bg_glass_100_fdf5ce_1x400.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_glass_65_ffffff_1x400.png b/libs/jqueryui/1.10.4/images/ui-bg_glass_65_ffffff_1x400.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/libs/jqueryui/1.10.4/images/ui-bg_gloss-wave_35_f6a828_500x100.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/libs/jqueryui/1.10.4/images/ui-bg_highlight-soft_100_eeeeee_1x100.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/libs/jqueryui/1.10.4/images/ui-bg_highlight-soft_75_ffe45c_1x100.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-icons_222222_256x240.png b/libs/jqueryui/1.10.4/images/ui-icons_222222_256x240.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-icons_228ef1_256x240.png b/libs/jqueryui/1.10.4/images/ui-icons_228ef1_256x240.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-icons_ef8c08_256x240.png b/libs/jqueryui/1.10.4/images/ui-icons_ef8c08_256x240.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-icons_ffd27a_256x240.png b/libs/jqueryui/1.10.4/images/ui-icons_ffd27a_256x240.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/images/ui-icons_ffffff_256x240.png b/libs/jqueryui/1.10.4/images/ui-icons_ffffff_256x240.png old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/jquery-ui.css b/libs/jqueryui/1.10.4/jquery-ui.css old mode 100644 new mode 100755 diff --git a/libs/jqueryui/1.10.4/jquery-ui.min.js b/libs/jqueryui/1.10.4/jquery-ui.min.js old mode 100644 new mode 100755 diff --git a/outputdirect.txt b/outputdirect.txt new file mode 100755 index 0000000..cbe62f0 --- /dev/null +++ b/outputdirect.txt @@ -0,0 +1 @@ +{"inbox":[{"sender":{"name":"LeBron James","emailAddress":"goat@heat.com"},"receivers":[{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey, I\u0027d love to but I have to get ready for the postseason!","subject":"RE: Wanna play basketball today?"},{"sender":{"name":"Kevin Durant","emailAddress":"kd@ock.com"},"receivers":[{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey man, I\u0027ll be flying to Memphis for the playoffs, sorry!","subject":"RE: Wanna play basketball today?"}],"sent":[{"sender":{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"},"receivers":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey guys, Just wanted to see if any of you were up for a pickup game today. Let me know if you\u0027re available","subject":"Wanna play basketball today?"}],"contacts":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}],"predictionGroup":{"contacts":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}]},"predictionInterface":"flat","instructions":"For this first test, email your friends that have made it into the NBA playoffs and wish them good luck! Make sure you message all of them, but careful about including someone who did not make it to the postseason","correctSet":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"}]};{"inbox":[{"sender":{"name":"LeBron James","emailAddress":"goat@heat.com"},"receivers":[{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey, I\u0027d love to but I have to get ready for the postseason!","subject":"RE: Wanna play basketball today?"},{"sender":{"name":"Kevin Durant","emailAddress":"kd@ock.com"},"receivers":[{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey man, I\u0027ll be flying to Memphis for the playoffs, sorry!","subject":"RE: Wanna play basketball today?"}],"sent":[{"sender":{"name":"Eliezer Encarnacion","emailAddress":"encarnae@live.unc.edu"},"receivers":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}],"dateSent":"May 7, 2014 11:05:33 PM","content":"Hey guys, Just wanted to see if any of you were up for a pickup game today. Let me know if you\u0027re available","subject":"Wanna play basketball today?"}],"contacts":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}],"predictionGroup":{"contacts":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"},{"name":"Carmelo Anthony","emailAddress":"melo@nyk.com"}]},"predictionInterface":"flat","instructions":"This is the 2nd test","correctSet":[{"name":"LeBron James","emailAddress":"goat@heat.com"},{"name":"Kevin Durant","emailAddress":"kd@ock.com"}]}; \ No newline at end of file diff --git a/php/ConfigFileDriver.jar b/php/ConfigFileDriver.jar old mode 100644 new mode 100755 diff --git a/php/ConfigFileDriver/META-INF/MANIFEST.MF b/php/ConfigFileDriver/META-INF/MANIFEST.MF new file mode 100755 index 0000000..44c7c94 --- /dev/null +++ b/php/ConfigFileDriver/META-INF/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Rsrc-Class-Path: ./ gson-2.2.4-sources.jar gson-2.2.4-javadoc.jar gson + -2.2.4.jar +Class-Path: . +Rsrc-Main-Class: testInterface.Driver +Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader + diff --git a/php/ConfigFileDriver/gson-2.2.4-javadoc.jar b/php/ConfigFileDriver/gson-2.2.4-javadoc.jar new file mode 100755 index 0000000..ce8fa7d Binary files /dev/null and b/php/ConfigFileDriver/gson-2.2.4-javadoc.jar differ diff --git a/php/ConfigFileDriver/gson-2.2.4-sources.jar b/php/ConfigFileDriver/gson-2.2.4-sources.jar new file mode 100755 index 0000000..30b13f6 Binary files /dev/null and b/php/ConfigFileDriver/gson-2.2.4-sources.jar differ diff --git a/php/ConfigFileDriver/gson-2.2.4.jar b/php/ConfigFileDriver/gson-2.2.4.jar new file mode 100755 index 0000000..9478253 Binary files /dev/null and b/php/ConfigFileDriver/gson-2.2.4.jar differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JIJConstants.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JIJConstants.class new file mode 100755 index 0000000..b087259 Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JIJConstants.class differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader$ManifestInfo.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader$ManifestInfo.class new file mode 100755 index 0000000..d548980 Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader$ManifestInfo.class differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader.class new file mode 100755 index 0000000..d3b7c8a Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/JarRsrcLoader.class differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLConnection.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLConnection.class new file mode 100755 index 0000000..3343bf3 Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLConnection.class differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandler.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandler.class new file mode 100755 index 0000000..2857910 Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandler.class differ diff --git a/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandlerFactory.class b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandlerFactory.class new file mode 100755 index 0000000..1027771 Binary files /dev/null and b/php/ConfigFileDriver/org/eclipse/jdt/internal/jarinjarloader/RsrcURLStreamHandlerFactory.class differ diff --git a/php/ConfigFileDriver/testInterface/Contact.class b/php/ConfigFileDriver/testInterface/Contact.class new file mode 100755 index 0000000..e7ff300 Binary files /dev/null and b/php/ConfigFileDriver/testInterface/Contact.class differ diff --git a/php/ConfigFileDriver/testInterface/Driver.class b/php/ConfigFileDriver/testInterface/Driver.class new file mode 100755 index 0000000..6579c18 Binary files /dev/null and b/php/ConfigFileDriver/testInterface/Driver.class differ diff --git a/php/ConfigFileDriver/testInterface/Email.class b/php/ConfigFileDriver/testInterface/Email.class new file mode 100755 index 0000000..3a4b3dc Binary files /dev/null and b/php/ConfigFileDriver/testInterface/Email.class differ diff --git a/php/ConfigFileDriver/testInterface/PredictionGroup.class b/php/ConfigFileDriver/testInterface/PredictionGroup.class new file mode 100755 index 0000000..c82bc8e Binary files /dev/null and b/php/ConfigFileDriver/testInterface/PredictionGroup.class differ diff --git a/php/ConfigFileDriver/testInterface/TestCase.class b/php/ConfigFileDriver/testInterface/TestCase.class new file mode 100755 index 0000000..237f599 Binary files /dev/null and b/php/ConfigFileDriver/testInterface/TestCase.class differ diff --git a/php/ConfigFileDriver2.jar b/php/ConfigFileDriver2.jar new file mode 100755 index 0000000..645d91f Binary files /dev/null and b/php/ConfigFileDriver2.jar differ diff --git a/php/consent.php b/php/consent.php index 3586cd5..c8f9cbf 100755 --- a/php/consent.php +++ b/php/consent.php @@ -6,14 +6,14 @@ $id = time(); $_SESSION['id'] = $id; - $private_folder= '/afs/cs.unc.edu/home/bartel/emailUI_tracking/private_data/'.$id; + //$private_folder= '/afs/cs.unc.edu/home/bartel/emailUI_tracking/private_data/'.$id; if (!file_exists ($private_folder)) { mkdir($private_folder); } - $signatures_file= '/afs/cs.unc.edu/home/bartel/email_threads/private_data/signatures.txt'; + //$signatures_file= '/afs/cs.unc.edu/home/bartel/email_threads/private_data/signatures.txt'; file_put_contents($signatures_file, "".$signature.", ".$date."=>".$id."\n" , FILE_APPEND | LOCK_EX); - header( 'Location: https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/' ) ; + header( 'Location: ../index.php' ) ; ?> diff --git a/php/end_session.php b/php/end_session.php index 46c8438..26185f7 100755 --- a/php/end_session.php +++ b/php/end_session.php @@ -1,5 +1,5 @@ diff --git a/php/login.php b/php/login.php index 0ddb265..57c645e 100755 --- a/php/login.php +++ b/php/login.php @@ -12,6 +12,6 @@ //$signatures_file= '/afs/cs.unc.edu/home/bartel/emailUI_tracking/private_data/signatures.txt'; //file_put_contents($signatures_file, "".$signature.", ".$date."=>".$id."\n" , FILE_APPEND | LOCK_EX); - header( 'Location: https://wwwp.cs.unc.edu/~bartel/cgi-bin/emailUI/EmailUI/' ) ; + header( 'Location: ../index.php' ) ; ?> diff --git a/php/read_config.php b/php/read_config.php index 1303ced..d911617 100755 --- a/php/read_config.php +++ b/php/read_config.php @@ -1,6 +1,6 @@ \ +\ +2): include a button to execute the main() function.\ +\ +\ +3) the log file must be present within the play folder. \ +\ +\ +4) done.} \ No newline at end of file diff --git a/play/cursor.png b/play/cursor.png new file mode 100644 index 0000000..7c7750f Binary files /dev/null and b/play/cursor.png differ diff --git a/play/replay.js b/play/replay.js new file mode 100644 index 0000000..3b73b02 --- /dev/null +++ b/play/replay.js @@ -0,0 +1,600 @@ + var delay = 500; + var input = ""; + var formattedLog = []; + var timer; + var current = 1; + var isPaused = false; + var description = "Replaying Log"; + var isFirstMC = true; + var fileName = ""; + var browserHeight = $(document).height(), + browswerWidth = $(document).height(); + var standardHeight = 1286, + standardWidth = 677; + var usingAuto = false; + var btnClicks = 0, keyStrokes = 0, mouseDistance = 0, time = 0; + var first = true; + var predictionIDs = ['group0', 'group1', 'nprasad@cs.unc.edu', 'cphamlet@cs.unc.edu', 'galagali@cs.unc.edu', 'siedleck@cs.unc.edu']; + var navigationIDs = ['nav_new_message','nav_inbox','nav_sent','play','nav_contacts', 'nav_trash', 'nav_instructions', 'save_session', 'end_session']; + + $(document).ready(function() { + $('#replayMenu').hide(); + $('#stats').hide(); + if (![].contains) { + try { + Object.defineProperty(Array.prototype, 'contains', { + enumerable: false, + configurable: true, + writable: true, + value: function(searchElement /*, fromIndex*/ ) { + if (this === undefined || this === null) { + throw new TypeError('Cannot convert this value to object'); + } + var O = Object(this); + var len = parseInt(O.length) || 0; + if (len === 0) { + return false; + } + var n = parseInt(arguments[1]) || 0; + if (n >= len) { + return false; + } + var k; + if (n >= 0) { + k = n; + } else { + k = len + n; + if (k < 0) k = 0; + } + while (k < len) { + var currentElement = O[k]; + if (searchElement === currentElement || + searchElement !== searchElement && currentElement !== currentElement + ) { + return true; + } + k++; + } + return false; + } + }); + } catch (e) { + // IE 8 : catch "Object doesn't support this property or method" error + Array.prototype.contains = function(searchElement /*, fromIndex*/ ) { + if (this === undefined || this === null) { + throw new TypeError('Cannot convert this value to object'); + } + var O = Object(this); + var len = parseInt(O.length) || 0; + if (len === 0) { + return false; + } + var n = parseInt(arguments[1]) || 0; + if (n >= len) { + return false; + } + var k; + if (n >= 0) { + k = n; + } else { + k = len + n; + if (k < 0) k = 0; + } + while (k < len) { + var currentElement = O[k]; + if (searchElement === currentElement || + searchElement !== searchElement && currentElement !== currentElement + ) { + return true; + } + k++; + } + return false; + } + } + } + }); + + function showReplay() { + $('#replayMenu').fadeIn(300); + $('#stats').fadeIn(300); + } + + function hide(){ + $('#replayMenu').fadeOut(300); + $('#stats').fadeOut(300); + } + + function startReplay(){ + fileName = prompt('Enter the name of the file.'); + if (!fileName.match(/.txt$/)) { + fileName += '.txt'; + } + loadData(); + var mouseCoord = getFirstMouseCoordinates(); // start coordiantes of the mouse pointer + setUpCursor(mouseCoord.x, mouseCoord.y); + executeTimer(); + } + + function setUpCursor(x, y) { + $("body").append("
    "); + $("#box").css("width", "20px"); + $("#box").css("height", "20px"); + $("#box").css("position", "absolute"); + $("#box").css("background-image", "url('play/cursor.png')"); + $("#box").css("background-size", "20px 20px"); + $("#box").css("z-index", "999"); + + } + + function executeTimer() { + if (!timer) { + timer = setTimeout(function() { + replay(); + }, delay); + } + } + + function replay() { + if (current < formattedLog.length - 1) { + if (!isNaN(formattedLog[current].delay)) { + updateStat('time', formattedLog[current].delay); + } + var type = formattedLog[current].type; + if (type == "mc") { + moveMouse(); + } + if (type == "enter") { + startHover(); + } + if (type == "click") { + clickById(); + } + if (type == "change") { + typeText(); + } + if (type == "leave") { + stopHover(); + } + if (type == 'add') { + add(); + } + delay = formattedLog[current].delay; + current++; + setTimeout(function() { + replay(); + }, delay); + } else { + setTimeout(function() { + $("#box").hide(); + $("*").css("cursor", "default"); + alert("End of Replay"); + }, 1000); + return; + } + } + + function loadData() { + + var file = "play/" + fileName; + + jQuery.get(file, function(data) { + var oReq = new XMLHttpRequest(); + oReq.open("GET", file, true); + oReq.onload = function(e) { + data = oReq.responseText; + var lines = splitLines(data); + formattedLog = toArray(lines); + }; + oReq.send(); + return false; + }); + + function splitLines(args) { + var data = args; + var result = data.toString().split("\n"); + return result; + } + + function toArray(lines) { + var completeLog = []; + for (var i = 0; i < lines.length - 1; i++) { + var individualInsturction = parseString(lines[i - 1], lines[i], lines[i + 1]); + completeLog[i] = individualInsturction; + } + return completeLog; + } + } + + function parseString(before, currentline, next) { + var time2 = parseFloat(next.match(/(\d+.\d+)$/)); + var action = String(currentline.match(/^\w+/)); + var parsedText = []; + switch (action) { + case "Started": + $("*").css("cursor", "none"); + break; + case "Entered": + parsedText = enterArea(currentline); + break; + case "Left": + parsedText = leaveArea(currentline); + break; + case "Clicked": + parsedText = clickArea(currentline); + break; + case "Added": + parsedText = addPerson(currentline); + break; + case "Suggested": + break; + case "Changed": + parsedText = typing(before, currentline, next); + break; + case "Mouse": + parsedText = mouseMovement(currentline); + break; + case "Ended": + break; + case 'Contacts': + addtoAutoComplete(currentline); + break; + default: + break; + } + + parsedText.delay = (time2 - parsedText.delay) * 500; + + if (!isNaN(parsedText) && !first) { + time = parsedText.delay; + first = false; + } + + return parsedText; + + } + + function startHover() { +//alert($("[id*='" + formattedLog[current].id + "']").attr('class')); + if (predictionIDs.contains(formattedLog[current].id)) { + console.log("#"+formattedLog[current].id); + $("[id*='" + formattedLog[current].id + "']").css('color','#F0AD4E'); + } else if (navigationIDs.contains(formattedLog[current].id)) { + $("[id*='" + formattedLog[current].id + "']").css('background-color','#D3D3D3'); + } else if ($("[id*='" + formattedLog[current].id + "']").attr('class').indexOf('email') > -1) { + $("[id*='" + formattedLog[current].id + "']").css('background-color','#CEE7FF'); + } + + } + + function stopHover() { + if (predictionIDs.contains(formattedLog[current].id)) { + console.log("#"+formattedLog[current].id); + $("[id*='" + formattedLog[current].id + "']").css('color','#428BCA'); + } else if (navigationIDs.contains(formattedLog[current].id)) { + $("[id*='" + formattedLog[current].id + "']").css('background-color','#FFF'); + } else if ($("[id*='" + formattedLog[current].id + "']").attr('class').indexOf('email') > -1) { + $("[id*='" + formattedLog[current].id + "']").css('background-color','#CADCE3'); + } + } + + + function add() { + + console.log('Current Person: ' + formattedLog[current].text); + + $('#' + formattedLog[current].id).text(""); + $('#' + formattedLog[current].id).val(""); + $('.ui-corner-all').each(function(index) { + console.log($(this).text()); + + if ($(this).text().contains(formattedLog[current].text)) { + + var id = $(this).attr('id'); + $('#'+id).css('background-color', '#ffff7f'); + $('#' + id).trigger("click"); + $('#'+id).css('background-color', '#333333'); + + } + }); + + + } + + function addPerson(line) { + + var re = /(\w*.)(\w+.\w+)(.\w*.)(\w+)(;\w*:.)(\d*.\d*)/; + var result = line.match(re); + + //(type, delay, id, text, x, y) + + //alert(esult[6] + " " + result[4] + " " + result[2] ); + return new instuction('add', result[6], result[4], result[6], result[2], null, null); + } + + function addtoAutoComplete(line) { + var contacts = line.substring(10, line.length); + contacts = contacts.split(';'); + contacts.pop(); + $("#to_field").autocomplete(contacts); + + + } + + function enterArea(line) { + console.log(line); + var re = /(\w*\s\w*\s)((.*(?=;)))(.\s\w*.\s)(\d+.\d+)/; + var result = line.match(re); + console.log(result); + var hover = null; + + + //(type, delay, id, text, x, y) + return new instuction('enter', result[5], result[2], result[4], null, null, null); + } + + function clickArea(line) { + var re = /(\w*\s\w*\s)((.*(?=;)))(.\s\w*.\s)(\d+.\d+)/; + var result = line.match(re); + console.log(result); + //(type, delay, id, text, x, y) + + + + + return new instuction('click', result[5], result[2], result[4], null, null, null); + } + + function leaveArea(line) { + var re = /(\w*\s\w*\s)((.*(?=;)))(.\s\w*.\s)(\d+.\d+)/; + var result = line.match(re); + console.log(result); + //(type, delay, id, text, x, y) + var hover = null; + + return new instuction('leave', result[5], result[2], result[5], null, null, null); + + } + + function typing(before, line, next) { + var re = /(\w*)\s\w*(.{4})(\w*)(.{4})(.*(?=;))(.\w*.\s)(\d*.\d*)/; + var result = line.match(re); + console.log(result); + var text = ""; + var firstChange = false, + lastChange = false; + // console.log("** " +before + " " + line); + // console.log("***" + result[4] + " " + String(before.match(re)[4])); + if (String(before.match(/^\w+/)) != "Changed") { + firstChange = true; + } else if (result[3] != String(before.match(re)[3])) { + firstChange = true; + + } + + if (String(next.match(/^\w+/)) != "Changed") { + lastChange = true; + } + + if (String(next.match(/^\w+/)) != "Changed") { + lastChange = true; + } + + if ((firstChange && lastChange)) { + text = result[5]; + + } else { + var characters; + if (firstChange && !lastChange) { + characters = next.match(re); + if (characters[3] == result[3]) { + text = getCharFragments(result[5], characters[5], true, false); + } + + } else if (!lastChange && !firstChange) { + characters = next.match(re); + if (characters[3] == result[3]) { + text = getCharFragments(result[5], characters[5], false, false); + } + + } else if (lastChange && !firstChange) { + characters = before.match(re); + if (characters[3] != null && characters[3] == result[3]) { + text = getCharFragments(characters[5], result[5], false, true); + } + } + } + //(type, delay, id, text, x, y) + return new instuction('change', result[7], result[3], result[8], text, null, null); + } + + function getCharFragments(currentLine, next, isFirst, isLast) { + var charsTyped = ""; + + console.log("here: " + currentLine + " " + next + " " + isFirst); + + if (isFirst) { + + return next; + } + + if (isLast) { + var secondToLast = currentLine; + var last = next; + if (last.length > secondToLast) { + charsTyped = next.substring(secondToLast.length, last.length); + } else if (last.length < secondToLast) { + charsTyped = "\\-" + (secondToLast.length - last.length); + } + return charsTyped; + } + + if (currentLine.length <= next.length) { + charsTyped = next.substring(currentLine.length, next.length); + + } else if (currentLine.length > next.length && !isLast) { + charsTyped = "\\-" + (currentLine.length - next.length); // '\\-#' indicates backspace + } + + return charsTyped; + } + + function mouseMovement(line) { + var re = /(^Mouse Coordinates\s)(\d*)\s(\d*)(.\s\w*.\s)(\d*.\d*)/; + var result = line.match(re); + console.log(result); + + if (isFirstMC) { + setXY(result[2], result[3]); + isFirstMC = false; + } + //(type, delay, id, text, x, y) + return new instuction('mc', result[5], null, result[6], null, result[2], result[3]); + } + + function setXY(x, y) { + $("#box").css("left", x + "px"); + $("#box").css("top", y + "px"); + } + + + + function typeText() { + + $('#'+formattedLog[current].id).focus(); + + var id = "#" + formattedLog[current].id; + var e = jQuery.Event("keyup"); + + var typed = String(formattedLog[current].text); + var length = typed.length; + var previousText; + if ((/\\-\d/).test(typed)) { + length = typed.match(/(\d)$/); + for (var i = 0; i < length[1]; i++) { + previousText = $(id).text().substring(0, $(id).text().length - 1); + $(id).text(previousText); + $(id).val(previousText); + updateStat('key'); + } + } else { + if ($(id).text() == typed) { + return; + } + for (var i = 0; i < length; i++) { + previousText = $(id).text(); + $(id).text(previousText + typed.charAt(i)); + if (id == '#to_field') { + $("#to_field").autocomplete('search', previousText+typed.charAt(i)); + usingAuto = true; + + } + updateStat('key'); + console.log(previousText); + $(id).val(previousText + typed.charAt(i)); + } + } + } + + function moveMouse() { + var x = formattedLog[current].x + "px"; + var y = formattedLog[current].y + "px"; + box.style.left = x; + box.style.top = y; + } + + function clickById() { + var id = '#' + formattedLog[current].id; + $("[id*='" + formattedLog[current].id + "']").focus(); + $("[id*='" + formattedLog[current].id + "']").trigger("click"); + updateStat('click'); + } + + function getFirstMouseCoordinates() { + for (var i = 1; i < formattedLog.length; i++) { + if (formattedLog[i].type == 'mc') { + return { + x: formattedLog[i].x, + y: formattedLog[i].y + }; + } + } + return { + x: 0, + y: 0 + }; + } + + function resetCurrent() { + timer = null; + delay = 500; + current = 1; + } + + function pause() { + pauseMarker = current; + isPaused = true; + clearInterval(timer); + } + + + function instuction(type, delay, id, timeStamp, text, x, y) { + this.type = type; + this.delay = delay; + this.id = id; + this.timeStamp = timeStamp; + this.text = text; + this.x = x; + this.y = y; + } + + function addContact() { + + } + + function stop() { + //if (isPaused) { + // executeTimer(); + // isPaused = false; + //} else{ + // clearInterval(timer); + // isPaused = true; + //} + + + } + + function restart(){ + + $("#nav_inbox").trigger('click'); + $('.preview').show(); + $('#email_expanded_col').attr('class', 'col-md-10'); + $('#email_list').attr('class','col-md-10'); + $('#new_message_editor').hide(); + resetCurrent(); + } + + function updateStat(type, data){ + switch (type) { + case "time": + data = data/1000; + time = time + parseFloat(data); + $("#time").html(time.toFixed(2)); + break; + case 'click': + btnClicks++; + $("#btn_clicks").html(String(btnClicks)); + break; + case 'key': + keyStrokes++; + $("#key_stokes").html(String(keyStrokes)); + case 'distance': + break; + } + } + +$(document).on('keydown', function(e) { + +console.log(e.createEventObject); + +}, true); \ No newline at end of file diff --git a/play/save_log.php b/play/save_log.php new file mode 100644 index 0000000..72493e0 --- /dev/null +++ b/play/save_log.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/src/testInterface/Contact.java b/src/testInterface/Contact.java old mode 100644 new mode 100755 diff --git a/src/testInterface/Driver.java b/src/testInterface/Driver.java old mode 100644 new mode 100755 index 17ab3be..24cbf50 --- a/src/testInterface/Driver.java +++ b/src/testInterface/Driver.java @@ -133,8 +133,8 @@ public static TestCase generateTest() { content = "Hey man, I'll be flying to Memphis for the playoffs, sorry!"; inbox[1] = new Email(c[1], self, dateSent, subject, content); - TestCase t = new TestCase(inbox, sentMessages, c,group, "flat", instructions, correctSet); - + //TestCase t = new TestCase(inbox, sentMessages, c,group, "flat", instructions, correctSet); + TestCase t = new TestCase(inbox, sentMessages, c,group, "paren", instructions, correctSet); return t; diff --git a/src/testInterface/Email.java b/src/testInterface/Email.java old mode 100644 new mode 100755 diff --git a/src/testInterface/PredictionGroup.java b/src/testInterface/PredictionGroup.java old mode 100644 new mode 100755 diff --git a/src/testInterface/TestCase.java b/src/testInterface/TestCase.java old mode 100644 new mode 100755 diff --git a/tests/config.properties b/tests/config.properties old mode 100644 new mode 100755 index 59b17e2..6d3b11b --- a/tests/config.properties +++ b/tests/config.properties @@ -1,2 +1,2 @@ -testFolder = /afs/cs.unc.edu/home/bartel/public_html/cgi-bin/emailUI/EmailUI/tests +testFolder = tests testFiles=test1,test2 diff --git a/tests/config.properties~ b/tests/config.properties~ new file mode 100755 index 0000000..6d3b11b --- /dev/null +++ b/tests/config.properties~ @@ -0,0 +1,2 @@ +testFolder = tests +testFiles=test1,test2 diff --git a/tests/test1 b/tests/test1 index 8be8a6f..7ee2d93 100644 --- a/tests/test1 +++ b/tests/test1 @@ -1,2 +1,2 @@ #Wed May 07 23:05:33 EDT 2014 -json={"inbox"\:[{"sender"\:{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},"receivers"\:[{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey, I\\u0027d love to but I have to get ready for the postseason\!","subject"\:"RE\: Wanna play basketball today?"},{"sender"\:{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},"receivers"\:[{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey man, I\\u0027ll be flying to Memphis for the playoffs, sorry\!","subject"\:"RE\: Wanna play basketball today?"}],"sent"\:[{"sender"\:{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"},"receivers"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey guys, Just wanted to see if any of you were up for a pickup game today. Let me know if you\\u0027re available","subject"\:"Wanna play basketball today?"}],"contacts"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}],"predictionGroup"\:{"contacts"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}]},"predictionInterface"\:"flat","instructions"\:"For this first test, email your friends that have made it into the NBA playoffs and wish them good luck\! Make sure you message all of them, but careful about including someone who did not make it to the postseason","correctSet"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"}]} +json={"inbox":[{"sender":{"name":"Nikhil Prasad","emailAddress":"nprasad@cs.unc.edu","time":"1 day"},"receivers":[{"name":"Daniel Korn","emailAddress":"dkorn@cs.unc.edu","time":"0"}],"dateSent":"Dec 7, 2014 5:02:04 PM","content":"I\\u0027m pretty sure the Knicks are gonna win","subject":"RE:NBA Playoffs"},{"sender":{"name":"Connor Hamlet","emailAddress":"cphamlet@cs.unc.edu","time":"6 hr"},"receivers":[{"name":"Daniel Korn","emailAddress":"dkorn@cs.unc.edu","time":"0"}],"dateSent":"Dec 7, 2014 5:02:04 PM","content":"I\\u0027ve always been a fan of the Mavericks","subject":"RE:NBA Playoffs"},{"sender":{"name":"Navaneet Galagali","emailAddress":"galagali@cs.unc.edu","time":"5 min"},"receivers":[{"name":"Daniel Korn","emailAddress":"dkorn@cs.unc.edu","time":"0"}],"dateSent":"Dec 7, 2014 5:02:04 PM","content":"I\\u0027ve always been a fan of the Mavericks","subject":"RE:NBA Playoffs"}],"sent":[{"sender":{"name":"Daniel Korn","emailAddress":"dkorn@cs.unc.edu","time":"0"},"receivers":[{"name":"Nikhil","emailAddress":"nprasad@cs.unc.edu","time":"1 day"},{"name":"Connor Hamlet","emailAddress":"cphamlet@cs.unc.edu","time":"6 hr"},{"name":"Navaneet Galagali","emailAddress":"galagali@cs.unc.edu","time":"5 min"},{"name":"Vlad Siedlecki","emailAddress":"siedleck@cs.unc.edu","time":"1 mo"}],"dateSent":"Dec 7, 2014 5:02:04 PM","content":"So who do you think is gonna win the finals this year?","subject":"NBA Playoffs"}],"contacts":[{"name":"Nikhil Prasad","emailAddress":"nprasad@cs.unc.edu","time":"1 day"},{"name":"Connor Hamlet","emailAddress":"cphamlet@cs.unc.edu","time":"6 hr"},{"name":"Navaneet Galagali","emailAddress":"galagali@cs.unc.edu","time":"5 min"},{"name":"Vlad Siedlecki","emailAddress":"siedleck@cs.unc.edu","time":"1 mo"}],"predictionGroup":{"contacts":[{"name":"Vlad Siedlecki","emailAddress":"siedleck@cs.unc.edu","time":"1 mo"}],"subgroups":[{"contacts":[{"name":"Nikhil Prasad","emailAddress":"nprasad@cs.unc.edu","time":"1 day"},{"name":"Connor Hamlet","emailAddress":"cphamlet@cs.unc.edu","time":"6 hr"},{"name":"Navaneet Galagali","emailAddress":"galagali@cs.unc.edu","time":"5 min"}],"subgroups":[]}]},"predictionInterface":"paren","instructions":"Your friends are all talking about their NBA final predictions, email them and let them know your pick. Try not to email anyone who hasn\\u0027t gotten back to you.","correctSet":[{"name":"Nikhil Prasad","emailAddress":"nprasad@cs.unc.edu","time":"1 day"},{"name":"Connor Hamlet","emailAddress":"cphamlet@cs.unc.edu","time":"6 hr"},{"name":"Navaneet Galagali","emailAddress":"galagali@cs.unc.edu","time":"5 min"}]} \ No newline at end of file diff --git a/tests/test2 b/tests/test2 old mode 100644 new mode 100755 index 3b8ce6f..be690b8 --- a/tests/test2 +++ b/tests/test2 @@ -1,2 +1 @@ -#Wed May 07 23:05:33 EDT 2014 -json={"inbox"\:[{"sender"\:{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},"receivers"\:[{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey, I\\u0027d love to but I have to get ready for the postseason\!","subject"\:"RE\: Wanna play basketball today?"},{"sender"\:{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},"receivers"\:[{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey man, I\\u0027ll be flying to Memphis for the playoffs, sorry\!","subject"\:"RE\: Wanna play basketball today?"}],"sent"\:[{"sender"\:{"name"\:"Eliezer Encarnacion","emailAddress"\:"encarnae@live.unc.edu"},"receivers"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}],"dateSent"\:"May 7, 2014 11\:05\:33 PM","content"\:"Hey guys, Just wanted to see if any of you were up for a pickup game today. Let me know if you\\u0027re available","subject"\:"Wanna play basketball today?"}],"contacts"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}],"predictionGroup"\:{"contacts"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"},{"name"\:"Carmelo Anthony","emailAddress"\:"melo@nyk.com"}]},"predictionInterface"\:"flat","instructions"\:"This is the 2nd test","correctSet"\:[{"name"\:"LeBron James","emailAddress"\:"goat@heat.com"},{"name"\:"Kevin Durant","emailAddress"\:"kd@ock.com"}]} +testcase=null \ No newline at end of file diff --git a/yo.file b/yo.file new file mode 100755 index 0000000..e69de29