<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta charset="utf-8"> 
<script src="../../resources/js-test-pre.js"></script>
</head>
<body id="body">

<div id="text1" tabindex="0">
This i<span>s a sen</span>tence,
right? Yes!
</div>

<div id="text2">
test audio <audio controls><source src="test.mp3" type="audio/mpeg"></audio>file.
</div>

<div id="text3">
巧克力
是食物吗? 是的。
</div>

<div id="text3a">
كيف حالك؟
</div>

<pre id="text4">
both   spaces
line breaks. Right?
</pre>

<div id="text5">
This is my first sentence. <br><br>
This is my second sentence. This is my third sentence.
This is my fourth sentence.
</div>

<p id="description"></p>
<div id="console"></div>

<script>

    description("This tests that sentence navigation is working correctly.");
    
    if (window.accessibilityController) {
    
        // Check that we can get the paragraph range with span tag.
        var text = accessibilityController.accessibleElementById("text1");
        var textMarkerRange = text.textMarkerRangeForElement(text);
        var startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        var currentMarker = advanceAndVerify(startMarker, 1, text);
        
        // Audio tag.
        text = accessibilityController.accessibleElementById("text2");
        textMarkerRange = text.textMarkerRangeForElement(text);
        startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(startMarker, 1, text);
        
        // Multi-languages.
        text = accessibilityController.accessibleElementById("text3");
        textMarkerRange = text.textMarkerRangeForElement(text);
        startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(startMarker, 1, text);
        
        text = accessibilityController.accessibleElementById("text3a");
        textMarkerRange = text.textMarkerRangeForElement(text);
        startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(startMarker, 1, text);
        
        // Check the case with pre tag.
        text = accessibilityController.accessibleElementById("text4");
        textMarkerRange = text.textMarkerRangeForElement(text);
        startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        currentMarker = advanceAndVerify(startMarker, 1, text);
        currentMarker = advanceAndVerify(currentMarker, 15, text);
        
        // Check getting the correct sentences.
        text = accessibilityController.accessibleElementById("text5");
        textMarkerRange = text.textMarkerRangeForElement(text);
        startMarker = text.startTextMarkerForTextMarkerRange(textMarkerRange);
        verifySentences(text, startMarker, 5);
        
        function advanceAndVerify(currentMarker, offset, obj) {
            var previousMarker = currentMarker;
            for (var i = 0; i < offset; i++) {
                previousMarker = currentMarker;
                currentMarker = obj.nextTextMarker(previousMarker);
            }
            verifySentenceRangeForTextMarker(previousMarker, currentMarker, obj);
            return currentMarker;
        }
        
        function replaceAttachmentInString(str) {
            str =  str.replace(String.fromCharCode(65532), "[ATTACHMENT]");
            return str;
        }
        
        function verifySentenceRangeForTextMarker(preMarker, textMarker, obj) {
            var markerRange = obj.textMarkerRangeForMarkers(preMarker, textMarker);
            var currentCharacter = replaceAttachmentInString(obj.stringForTextMarkerRange(markerRange));
            debug("Current character is: " + currentCharacter);
            
            var range = obj.sentenceTextMarkerRangeForTextMarker(textMarker);
            var sentence = replaceAttachmentInString(obj.stringForTextMarkerRange(range));
            debug("Current sentence is: " + sentence);
            
            var preStart = obj.previousSentenceStartTextMarkerForTextMarker(textMarker);
            var nextEnd = obj.nextSentenceEndTextMarkerForTextMarker(textMarker);
            var preAndNextSentenceRange = obj.textMarkerRangeForMarkers(preStart, nextEnd);
            var preAndNextSentence = replaceAttachmentInString(obj.stringForTextMarkerRange(preAndNextSentenceRange));
            debug("Pre sentence start to next sentence end: " + preAndNextSentence + "\n");
        }
        
        function verifySentences(obj, startMarker, sentenceCount) {
            var current = startMarker;
            var i = 0;
            while(i < sentenceCount) {
                current = obj.nextSentenceEndTextMarkerForTextMarker(current);
                var currRange = obj.sentenceTextMarkerRangeForTextMarker(current);
                var currSentence = obj.stringForTextMarkerRange(currRange);
                debug("Sentence: " + currSentence);
                i++;
            }
            
            // Backwards.
            i = 0;
            while(i < sentenceCount) {
                current = obj.previousSentenceStartTextMarkerForTextMarker(current);
                var next = obj.nextTextMarker(current);
                var currRange = obj.sentenceTextMarkerRangeForTextMarker(next);
                var currSentence = obj.stringForTextMarkerRange(currRange);
                debug("Sentence: " + currSentence);
                i++;
            }
        }    
    }
</script>

<script src="../../resources/js-test-post.js"></script>
</body>
</html>