// ==UserScript==
// @name           OWA Search
// @namespace      http://kode.lurtgjort.no/
// @description    Adds search functionality to Outlook Web Access
// @author         havard@gulldahl.no
// @include        https://*/exchange/*,DanaInfo=*
// @include        https://*/exchange/*/,DanaInfo=*?cmd=Contents*
// ==/UserScript==

var buttonbar, contentpane;

// Add Search box UI to FRAMES['name'] == 'navbar'


var _search_ui_img = 'data:';
var _search_href = '.';

var _search_ui = '<TD class="nbButton"><FORM action="." STYLE="height:26px;" TARGET="top" OnSubmit="return false;"><IMG src="' +
_search_ui_img +
'" width="24" height="24" alt="" border="0"><INPUT type="text" id="GM_OWA_SEARCH" name="GM_OWA_SEARCH" size="10" value="Search..." OnFocus="if(this.value==this.defaultValue)this.value=String();" OnBlur="if(this.value==String())this.value=this.defaultValue;"><INPUT type="button" value="Go" OnClick="top.viewer.location=\'%s&amp;GM_OWA_SEARCH=\'+this.form[\'GM_OWA_SEARCH\'].value;"></FORM></TD>';

// Search results page UI at FRAMES['name'] == 'viewer'

function parse_search(search_url)
{
    var urlObj = new Object();

    window.location.search.replace(
        new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
        function( $0, $1, $2, $3 ){
            urlObj[$1.toLowerCase()] = $3;
        }
    );
    return urlObj['gm_owa_search']; // ? urlObj['gm_owa_search'] : false;
}

function first_inner_text(node)
{
    if(! node.hasChildren && node.nodeType == node.TEXT_NODE)
        return node.nodeValue;
    return first_inner_text(node.firstChild);
}

window.addEventListener(
    'load',
    function() {

        // is this the top frameset? if so, there's no ?Cmd=... in the url
        if(document.location.search.indexOf('?Cmd') == -1) {
          try {
            var _frames = document.getElementsByTagName('frame');
            buttonbar = _frames[0].contentDocument;
            contentpane = _frames[1].contentDocument;
            // Add Search box UI to FRAMES['name'] == 'navbar'
            // Get the href of inbox, which is the first button
            _search_href = buttonbar.body.firstChild.getElementsByTagName('a')[0]['href']
            var row = buttonbar.body.firstChild.insertRow(-1);
            row.innerHTML = _search_ui.replace('%s', _search_href);
          } catch(e) {alert(e)}; // not the frameset document
        } else if(document.location.search.toUpperCase().indexOf('GM_OWA_SEARCH') != -1) {
          // do search
            var owa_search = parse_search(document.location.search);
            //get header bar
            xp_headerbar = document.evaluate(
                "//table[@class='tblFolderBar']",
                document,
                null,
                XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                null);
//             alert(headerbar);
            table = xp_headerbar.snapshotItem(0);
            table.rows[0].deleteCell(1); // delete page flipper
            // write nice text in header
            var headcell = table.rows[0].cells[0];
            headcell.getElementsByTagName('b')[1].innerHTML = " : Searching for %s...".replace('%s', owa_search);
            var stopbutn = document.createElement('span');
            stopbutn.innerHTML = '<INPUT type="button" id="GM_OWA_STOPBUTTON" value="Stop search" OnClick="top.do_search = false;">';
            headcell.appendChild(stopbutn);
            // get all mails
            allmails = document.evaluate(
                "//table//table[not(@class)]//tr",
                document,
                null,
                XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
                null);
            // for each one, look for the regexp `owa_search'
            var re = new RegExp(owa_search, 'i');
            for (var i = 1; i < allmails.snapshotLength; i++) {
                thismail = allmails.snapshotItem(i);
                _from = first_inner_text(thismail.cells[5]);
//                 alert(_from);
                _subject = first_inner_text(thismail.cells[6]);
                if((_from.search(re) == -1) && (_subject.search(re) == -1)) {
                    // not a hit, hiding row
                    thismail.style.display = 'none';
                }
            }

        }

    },
    true);


