index.js 8.46 KB
Newer Older
1
// Object which stores all the user selected/entered values
2
let inputObj = {
3
4
    textChoice: 'manual',           // choice of text entry initially set as manual. Can have values manual, calculated
    text: '',                       // User entered text in case of manual  
5
    numberOfCharacters: '',         // number of characters in text. Either from user entered text or user entered number
6
7
    schoolLevel: '',                // Value of school level selected from dropdown
    category: ''                    // Value of category selected from dropdown
8
};
9

10
11

// function handleTextRadioClick: responsible for showing or hiding text input / text length input based on selected option
12
function handleTextRadioClick() {
13
14
    let textChoice = document.querySelector('input[name="text-input-option"]:checked').value;
    inputObj.textChoice = textChoice;
15
16
17
18
    toggleElement('character-calculation-wrapper');
    toggleElement('manual-character-input');
}

19
20
21

// function toggleElement: hides/shows the html element based on current visibility. 
// accepts value of id attribute of element as parameter
22
function toggleElement(id) {
23
24
25
    let element = document.getElementById(id);
    if (element.style.display === "none") {
        element.style.display = "block";
26
    } else {
27
        element.style.display = "none";
28
29
30
    }
}

31
32

// function handleTextAreaChange: captures the changes as user enters the text and gets the length
33
// and sets number of characters to property numberOfCharacters on inputObj
34
35
function handleTextAreaChange() {
    let value = document.getElementById("manual-text-entry").value;
36
    inputObj.text = value;
37
38
    value = removeSpecialCharacters(value);
    let characters = value.length;
39
    setCharacterLength(characters);
40
41
42
43
44
45
46
47
    document.getElementById("calculatedTextCharacters").setAttribute('value', characters);
}

// function removeSpecialCharacters: removes punctuation marks and other special characters
// but allows numbers and alphabets along with language specific characters German: äöüÄÖÜß and French: ùûüÿàâæéèêëïîôœÙÛÜŸÀÂÆÉÈÊËÏÎÔŒ
function removeSpecialCharacters(str) {
    return str.replace(/(?!\w|||||||||||\ÿ|||||||||||||||||||||||||\Œ)./g, '')  // regex to remove special characters 
        .replace(/^(\s*)([\W\w]*)(\b\s*$)/g, '$2');   // regex to trim the string to remove any whitespace at the beginning or the end
48
49
}

50
51

// function handleCharacterInputChange: captures changes in number of characters input field
52
// and sets number of characters to property numberOfCharacters on inputObj
53
54
55
56
57
function handleCharacterInputChange() {
    let value = document.getElementById("inputTextCharacters").value;
    setCharacterLength(value);
}

58
// function setCharacterLength: sets number of characters to property numberOfCharacters on inputObj
59
function setCharacterLength(characters) {
60
    inputObj.numberOfCharacters = parseInt(characters);
61
62
63
}


64
65
66
// function isFormValid: checks for mandatory input fields and validates te form 
// returns true if all values are filled else returns false
// also shows error messages for respective inputs fields
67
function isFormValid() {
68
69
70
71
72
73
74
75
    let invalidFields = 0;
    if (inputObj.textChoice === 'manual' && inputObj.text === '') {
        invalidFields++;
        document.getElementById('textarea-validation').style.display = 'block';
    } else {
        document.getElementById('textarea-validation').style.display = 'none';
    }

76
77
78
    if (inputObj.textChoice === 'calculated' &&
        (inputObj.textLenumberOfCharactersngth === '' || inputObj.numberOfCharacters === 0)) {

79
80
81
82
83
84
        invalidFields++;
        document.getElementById('textCharacters-validation').style.display = 'block';
    } else {
        document.getElementById('textCharacters-validation').style.display = 'none';
    }

85
    if (inputObj.schoolLevel === '' || inputObj.schoolLevel === 0) {
86
        invalidFields++;
87
        document.getElementById('schoolLevel-validation').style.display = 'block';
88
    } else {
89
        document.getElementById('schoolLevel-validation').style.display = 'none';
90
91
    }

Ratnadeep Rajendra Kharade's avatar
Ratnadeep Rajendra Kharade committed
92
    if (inputObj.category === '' || inputObj.category === 0) {
93
        invalidFields++;
94
        document.getElementById('category-validation').style.display = 'block';
95
    } else {
96
        document.getElementById('category-validation').style.display = 'none';
97
    }
98
99

    return invalidFields < 1
100
101
}

102
103

// function showFeedbackForm: displays feedback form when calculation is done
104
function showFeedbackForm() {
105
106
    let element = document.getElementById('feedback-form');
    element.style.display = "block";
107
}
108

109

110
111
112
// function schoolLevelChangeEvent: listens for change in school level dropdown
// and sets selected value to property schoolLevel on inputObj
function schoolLevelChangeEvent(event) {
113
    inputObj.schoolLevel = event.target.value;
114
115
}

116
117
118
// function categoryChangeEvent: listens for change in category dropdown
// and sets selected value to property category on inputObj
function categoryChangeEvent(event) {
119
    inputObj.category = event.target.value;
120
}
121
122
123
124
125
126
127
128
129
130
131


// function calculateReadingTime: This function is responsible for calculating reading time
// reading time can be calculated if all inputs are valid
function calculateReadingTime() {

    if (isFormValid()) {

        //variable x which holds final reading time in minutes
        let x = 0;

132
        // logic or algorithm for calculating reading time goes here
133
        // inputObj.numberOfCharacters has number of characters (number data type)
134
135
        // inputObj.schoolLevel has level of school (string data type)
        // inputObj.category has category of reader (string data type)
136

137

138
        // example calculation
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
        //x = (inputObj.numberOfCharacters * inputObj.schoolLevel * inputObj.category);

        let combination = inputObj.schoolLevel + '' + inputObj.category;
        console.log(combination);
        
        let C = inputObj.numberOfCharacters;

        switch (combination) {
            case '11':
                x = (0.7165 * C) + (172.8332 * 0.690) - 125.9143;
                break;
            case '12':
                x = (0.3463 * C) + (185.4177 * 0.249) - 62.0577;
                break;
            case '13':
                x = (0.4967 * C) + (223.3422 * 0.386) - 101.3559;
                break;
            case '14':
                x = (0.6489 * C) + (195.7637 * 0.528) - 120.8358;
                break;
            case '15':
                x = (0.7165 * C) + (172.8332 * 0.690) - 125.9143;
                break;
            case '21':
                x = (0.5007 * C) + (703.686 * 0.505) - 358.5641;
                break;
            case '22':
                x = (0.3135 * C) + (902.8845 * 0.30) - 285.855;
                break;
            case '23':
                x = (0.3396 * C) + (956.5228 * 0.329) - 326.4739;
                break;
            case '24':
                x = (0.3797 * C) + (857.5144 * 0.378) - 328.6899;
                break;
            case '25':
                x = (0.5007 * C) + (703.686 * 0.505) - 358.5641;
                break;
            case '31':
                x = (0.3524 * C) + (563.8412 * 0.42) - 196.8003;
                break;
            case '32':
                x = (0.1941 * C) + (671.9616 * 0.204) - 131.0749;
                break;
            case '33':
                x = (0.2432 * C) + (712.2978 * 0.263) - 177.29;
                break;
            case '34':
                x = (0.2965 * C) + (628.5916 * 0.34) - 189.2485;
                break;
            case '35':
                x = (0.3524 * C) + (563.8412 * 0.42) - 196.8003;
                break;
            case '41':
                x = (0.3445 * C) + (1315.1448 * 0.357) - 459.0464;
                break;
            case '42':
                x = (0.2003 * C) + (51421.0975 * 0.206) - 290.0477;
                break;
            case '43':
                x = (0.2289 * C) + (1389.9964 * 0.24) - 325.0492;
                break;
            case '44':
                x = (0.2842 * C) + (1471.1005 * 0.298) - 431.9652;
                break;
            case '45':
                x = (0.3445 * C) + (1315.1448 * 0.357) - 459.0464;
                break;
            default:
                x = 'error';
                break;
        }
211

212
        // set value to html element
213
        var s = document.getElementById('reading-time-element');
214
        s.innerHTML = x;
215
216
217
218
219
        // display html element which shows time
        let element = document.getElementById('calculate-time-element');
        element.style.display = "block";
    }
}