/*
    ibob_reader.js
    -- NOT a class!
    version 1.0
    namespaced to 'iBOB'
    by Jim Gourgoutis 9/12/2008
  */

YOJIMG.iBOB = (function(){

    // Global vars
    var gCurrentList = 'internet-bob',
        gCurrentListEmail = 'internet-bob@bikelist.org',
        gCurrentListURL,
        gTime = 901,
        gTimer,
        gAuthor = '',
        gSubject = '',
        gBody = '',
        gLoadingImg = '<img class="loading" src="/images/loading.gif" width="18" height="18" alt="loading..."/>',
        gReverseSort = false,
        gSortBy = 'MsgDate[d]',
        msgReadEvent,
        quickSearchEvent,
        gLastRead,
        gDateSpan = '-1d',
        gMax = '1000',
        gTracker = new Object(),
        eMsgList,
        eMsgListAtags,
        msgListEvent,
        recordEvent,
        clockSpan,
        //read,
        //reply,

        // CSS classes
        THREADED_MSG_CLASS = "threadMsg",
        CURRENT_MSG_CLASS = "currentMsg",
        READ_MSG_CLASS = "readMsg";




    function initTracking() {
      if (typeof(gTracker[gCurrentList]) == 'undefined') {
    	gTracker[gCurrentList] = new Object();
      }
    }


    function setMsgListEventUrl(aUrl) {
      aUrl = (aUrl) ? aUrl : 'http://search.bikelist.org/index.asp?SearchString=&FMMod=' + gDateSpan + '&FMModDate=&SortBy=' + gSortBy + '&Scope=' + gCurrentList + '&RecordsPerPage=' + gMax;
      var base = '../ibob/data.php?type=list&url=' + escape(aUrl);

      if (YOJIMG.iBOB.msgListEvent) {
        YOJIMG.iBOB.msgListEvent.url = base;
      }
    }

    function setMsgReadEventUrl(msgNum) {
      var aUrl = 'http://search.bikelist.org/getmsg.asp?Filename=' + gCurrentList + '.' + msgNum + '.eml',
        base = '../ibob/data.php?type=msg&url=' + escape(aUrl);

      if (msgReadEvent) {
        msgReadEvent.url = base;
      }
    }


    function setListName(sel) {
      gCurrentList = sel.options[sel.options.selectedIndex].value;
      gCurrentListEmail = sel.options[sel.options.selectedIndex].getAttribute('addr');
      initTracking();
      if (sel.options[sel.options.selectedIndex].getAttribute('url')) {
        gCurrentListURL = sel.options[sel.options.selectedIndex].getAttribute('url');
        setMsgListEventUrl(gCurrentListURL);
        debugMsg(gCurrentListURL);
      }
      else {
        //setMsgListEventUrl('http://search.bikelist.org/index.asp?SearchString=&FMMod=' + gDateSpan +  '&FMModDate=&SortBy=MsgDate%5Bd%5D&Scope=' + gCurrentList + '&RecordsPerPage=' + gMax);
        setMsgListEventUrl();
        debugMsg(gCurrentListEmail);
      }

      YOJIMG.iBOB.msgListEvent.run();
      storeSelectedList();

    }

    function setDateSpan(sel) {
    	gDateSpan = sel.options[sel.options.selectedIndex].value;

    	debugMsg(gDateSpan);

    	//setMsgListEventUrl('http://search.bikelist.org/index.asp?SearchString=&FMMod=' + gDateSpan + '&FMModDate=&SortBy=MsgDate%5Bd%5D&Scope=' + gCurrentList + '&RecordsPerPage=' + gMax);
        setMsgListEventUrl();
    	YOJIMG.iBOB.msgListEvent.run();
    }


    function startClock()
    {

      if (debugCheck()) {
      	clockSpan.innerHTML = "DEBUG";
        return;
      }

      gTime = 901;
      gTimer = window.setInterval('YOJIMG.iBOB.updateClock()', 1000);
    }

    function stopClock()
    {
    	if (gTimer){
        window.clearInterval(gTimer);
        gTimer = null;
      }
    }

    function updateClock()
    {
    	gTime--;
    	clockSpan.innerHTML = "refresh in " + gTime;
    	if (gTime <= 0 && YOJIMG.iBOB.msgListEvent){
    		YOJIMG.iBOB.msgListEvent.run();
    		resetClock();
    	}
    }

    function resetClock() {
    	if (!gTimer) {
    		startClock();
    	}
    	else
    		gTime = 901;
    }

    function drawList() {
        var YiBOB = YOJIMG.iBOB;

        stopClock();
        clockSpan.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + gLoadingImg + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";

    	if (YiBOB.msgListEvent.isComplete()) {
    		var msgCount = GetElementText(YiBOB.msgListEvent.HTTPObject.responseXML, 'message_count'),
                entries = YiBOB.msgListEvent.HTTPObject.responseXML.getElementsByTagName('ibob_message'),
                s = [],
                entryArray = new Array(),
                lastDate;

    		// check for errors
    		if (entries.length == 0) {
    			popError(eMsgList, 'No messages available');
                startClock();
                return;
    		}

    		// convert from HTML collection to normal array
    		for (var i = 0; i < entries.length; i++) {
    			entryArray.push(entries[i]);
    		}
    		if (gReverseSort) {
                entryArray.reverse();
            }
        	var i = 0;
        	while (i < entryArray.length) {
                var bDrawMsgs = true,
                    date = GetElementText(entryArray[i], 'date');
        	  	s.push("<h4 onclick=\"toggle('list" + i + "')\" class=\"dateChange\">" + date + "</h4>");
        	  	s.push("<ul id=\"list" + i + "\">");

        	  	while(bDrawMsgs && i < entryArray.length) {
        		  	date = GetElementText(entryArray[i], 'date');
        		  	if(lastDate != null && lastDate != date) {
        		  		bDrawMsgs = false;
        		    }
        		    else {
                        var num = GetElementText(entryArray[i], 'number'),
                            link = GetElementText(entryArray[i], 'link'),
                            title = GetElementText(entryArray[i], 'title'),
                            author = GetElementText(entryArray[i], 'author');

                        // filter unwanted authors
                        if (/Starck|starck|Josephus|Luther Burbank|Harry Anno|Cary OKeejo|Ron Danner|Mark Pounders|John Laidlaw/.test(author)) {
                            i++; continue;
                        }

                        s.push("<li ");
                        s.push('id="' + link + '"');
                        s.push('class="');

                        if(checkCurrentMsg(link)) {
                            s.push(CURRENT_MSG_CLASS);
                            trackIt(link);
                        }
                        //else if (eval("gTracker._" + link.replace(/\./, '_')) == 1) s += 'readMsg';
                        else if (gTracker[gCurrentList][link] == 1) {
                            s.push(READ_MSG_CLASS);
                        }

                        s.push('"');
                        s.push("><a title=\"click to read msg\" href=\"?" + gCurrentList + '.' +
                        link + ".eml\" onClick=\"return YOJIMG.iBOB.readIt(event, '"+ link + "', this)\"><span class=\"title\">" + title + "</span> <span class=\"author\">" + author + "</span></a></li>");
                        i++;
                    }
        		    lastDate = date;
        		};
        	  	s.push('</ul>');
        	};

            s.push('<div id="msgCount">returned ' + msgCount + ' messages');
    		if (parseInt(msgCount) >= parseInt(gMax)) {
    			s.push(' (limit reached)');
            }
    		s.push('</div>');

    		eMsgList.innerHTML = s.join('');
    		gLastRead = $(gTracker[gCurrentList].last);
    		startClock();

            eMsgListAtags = eMsgList.getElementsByTagName('a');

    	}
    }

    function checkCurrentMsg(link) {
        if(getMetaCookie(gCurrentList, 'ir') == link) {
            return true;
        }

        return false;
    }

    function drawMsg() {

        var entries,
            s = '',
            r,
            body,
            author,
            emailPtn1 = /\(AT\)/gi,
            emailPtn2 = /([\w-\.]+@[\w-\.]+\.\w{2,3})/i;

        if (msgReadEvent.isComplete()) {

    	entries = msgReadEvent.HTTPObject.responseXML.getElementsByTagName('ibob_message');

        if (!entries[0]) {
            popError(read, 'Problem retrieving message');
            return;
        }
    
        gAuthor = GetElementText(entries[0], 'author');
        gSubject = GetElementText(entries[0], 'subject');
        gBody = GetElementText(entries[0], 'body');
    
        //hotlink URLs in message body
        body = gBody.replace(/(http\w*\:\/\/[\w\/\.#\-~\?=&%\:\(\)\+]+)\b/gi, '<a target="popnew" title="click to open link in new window" href="' + "$1" + '">' + "$1" + '</a>');
        body = body.replace(/><\/a>/, '</a>>'); // clean up trailing angle brackets
        body = body.replace(/>">/, '">'); // clean up trailing angle brackets
    
        // clean up line breaks in message body
        body = body.replace(/=\n/gi, '');
        body = body.replace(/\n|\r|=0A/gi, '<br />');
    
        // set global author value
        gAuthor = gAuthor.replace(emailPtn1, '@');
        gAuthor = gAuthor.replace(/&lt;/, '<');
    
        // hotlink email addresses
        author = gAuthor.replace( emailPtn2, "<A title=\"click to email\" HREF=\"mailto:$1\">$1</A>");
        body = body.replace(emailPtn1, '@');
        body = body.replace(emailPtn2 , "<A title=\"click to email\"HREF=\"mailto:$1\">$1</A>");
    
        s += '<div class="msgHeader">';
        s += '<div class="author">' + author + '</div>';
        //s += '<div class="subject"><a title="click to show msg thread" href="#" onclick="return YOJIMG.iBOB.showThread(\'' + encodeURI(gSubject) + '\')">' + gSubject + '</a></div>';//s += '<div id="subject"><a title="click to show msg thread" href="#" onclick="return YOJIMG.iBOB.showThread(\'' + encodeURI(gSubject) + '\')">' + gSubject + '</a></div>';
        s += '<div class="subject">' + gSubject + '</div>';
        s += '</div><div class="msgBody">' + body + '</div>'   
        s += '<div class="reply">';
        s += '<button onclick="YOJIMG.iBOB.doAction(\'EXTERNAL_SENDER\')">Reply to Sender</button>';
        s += '<button onclick="YOJIMG.iBOB.doAction(\'EXTERNAL\')">Reply to List</button>';
        s += '</div>';
    
        r = gLastRead.getElementsByTagName('div')[0];
    
        if (r) {
            r.innerHTML = s;
        }
      }
    }


/*
 * @param {Event} e
 * @param {String} msgNum - the message id number
 * @param {Object} obj - reference to the clicked anchor
 * @return
 * @method
 * @static
 */
    function readIt(e, msgNum, obj) {

        e = e || window.event;

        e.preventDefault();

    	var pObj = obj.parentNode;

    	hiLiteMsg(pObj);
        hiLiteSimMsgs(obj);


    	trackIt(msgNum);

	// open msg container if not already open
        if (!YOJIMG.utils.hasClass(pObj, 'expand')) {
          YOJIMG.utils.addClass(pObj, 'expand');
          if (pObj != gLastRead) {
      	    //dim last read msg
            dimReadMsg(gLastRead);
            if (gLastRead) {
              YOJIMG.utils.removeClass(gLastRead, 'expand');
            }
            gLastRead = pObj;
      	  }
          // get msg via XHR if it hasn't been retrieved yet
          if (!YOJIMG.utils.hasClass(pObj, 'loaded')) {

            var msgCtr = document.createElement('div');
            msgCtr.className = "msgCtr";
            msgCtr.innerHTML = gLoadingImg;
            pObj.appendChild(msgCtr);
            YOJIMG.utils.addClass(pObj, 'loaded');
            setMsgReadEventUrl(msgNum);
    	    msgReadEvent.run();

          }
          else {
            // BUG: if msg has already been loaded, update the last-read pointer to this msg
            // to allow the reply functionality to work correctly
            setMsgReadEventUrl(msgNum);
    	    msgReadEvent.run();            
          }
        }
        else {
          YOJIMG.utils.removeClass(pObj, 'expand');
        }


        scrollToLastReadMsg();

    	return false;
    }


    function updateListName(s) {
        //deactive for now
        return false;

        var ld = document.forms.listSelectorForm.list,
            ldo = ld.options,
            r = 0;

        for (var i=0; i < ldo.length; i++) {
            if (ldo[i].value == s) {
                r = i;
                break;
            }
        }
        ldo.selectedIndex = r;
        setListName(ld);
    }

    function loadExternalMsg() {
    	var q = document.location.search.split('?')[1],
            msgUrl,
            listName;

        if (debugCheck()) {
          return false;
        }

        if (q) {
            listName = q.split('.')[0];
            updateListName(listName);
            msgUrl = 'http://search.bikelist.org/getmsg.asp?Filename=' + q;
            msgReadEvent.url = '../ibob/data.php?type=msg&url=' + escape(msgUrl);
            msgReadEvent.run();
            debugMsg("msgReadEventUrl: " + msgUrl);
            return true;
        }

        return false;
    }


    function hiLiteMsg(obj) {
    	if (obj){
            YOJIMG.utils.removeClass(obj, 'readMsg');
            YOJIMG.utils.addClass(obj, 'currentMsg');
    	}
    }

    function dimReadMsg(obj) {
    	if (obj){
            YOJIMG.utils.removeClass(obj, 'currentMsg');
            YOJIMG.utils.addClass(obj, 'readMsg');
        }
    }


    function doAction(action) {
      var read = $('msgRead'),
	  reply = $('msgReply'),
	  mySubject = fixSubject(gSubject),
	  myBody = gBody ? encodeURIComponent(gAuthor + " wrote:\n\n>>\n" + gBody + "\n<<") : '',
	  s;

      switch (action) {
	case "EXTERNAL":
	  s = ['mailto:',
		gCurrentListEmail,
		'?subject=',
		mySubject,
		'&body=',
		myBody].join('');
	  break;

	case "EXTERNAL_SENDER":
	  s = ['mailto:',
		gAuthor,
		'?subject=',
		mySubject,
		'&body=',
		myBody].join('');
	  break;

	default:
	  //noop
      }

      debugMsg('ACTION: ' + action + ', s: ' + s);

      if (s) {
	window.location = s;
      }
    }


    function setSelectedListOption() {
    	var opts = document.forms.listSelectorForm.list.options;

    	for (var o = 0; o < opts.length; o++) {
    		if (opts[o].value ==  gCurrentList){
    			opts[o].selected = true;
    			return;
    		}
    	}
    }

    function fixSubject(subject) {
    	if (subject && !subject.match(/^RE:/i))
    		subject = "RE: " + subject;
    	return (subject);
    }

    function toggleReverse() {
    	if (gReverseSort)
    		gReverseSort = false;
    	else
    		gReverseSort = true;

    	YOJIMG.iBOB.msgListEvent.run();
    }

    function sortBy(sel) {

    	gSortBy = sel.options[sel.options.selectedIndex].value;

    	debugMsg(gSortBy);

    	setMsgListEventUrl();
    	YOJIMG.iBOB.msgListEvent.run();
    }




    function popError(target, msg) {
    	if (target)
    		target.innerHTML = '<span class="error">' + msg + '</span>';
    	else if (msg)
    		alert('ERROR: ' + msg);
    	else
    		alert('ERROR: Problem getting data from the server');

    	return true;
    }

    function init() {

        var YIBOB = YOJIMG.iBOB,
          utils = YOJIMG.utils,
          lastBtn = $('findLastRead');


      	clockSpan = utils.$('timer');
        eMsgList = utils.$('msgList');

    	setLastSelectedList();

        initTracking();

        YIBOB.msgListEvent = new AjaxEvent('list', '', drawList);
        msgReadEvent = new AjaxEvent('read', '', drawMsg);

        if (gCurrentListURL) {
            setMsgListEventUrl(gCurrentListURL);
        }
        else {
          //setMsgListEventUrl('http://search.bikelist.org/index.asp?SearchString=&FMMod=' + gDateSpan + '&FMModDate=&SortBy=MsgDate%5Bd%5D&Scope=' + gCurrentList + '&RecordsPerPage=' + gMax);
          setMsgListEventUrl();
        }

    	YIBOB.msgListEvent.run();

    	lastBtn.onclick = scrollToLastReadMsg;
	clockSpan.onclick = function(){
	    YIBOB.msgListEvent.run();
	    return false;
	};

    	window.setTimeout(function(){window.scrollTo(0, 1)}, 2000); // hides the location bar


    }
    addOnLoadEvent(init);


    function trackIt(num){
    	gTracker[gCurrentList][num] = 1;
    	gTracker[gCurrentList].last = num;
    	storeLastReadMsg(num);
    }


    function storeLastReadMsg(msgNum){
    	if (msgNum) {
    		setMetaCookie(gCurrentList, 'ir', msgNum);
        }
    }



    function recordLastReadMsg(list, msgNum) {
      if (list && msgNum) {
        recordEvent = new AjaxEvent('record','../ibob/store.php?list=' + list + '&num=' + msgNum, recordDebug);
        recordEvent.run();
      }

    }

    function recordDebug(){
        if (recordEvent.isComplete()) {
            alert(GetElementText(recordEvent.HTTPObject.responseXML, 'result'));
        }
    }



    function scrollToLastReadMsg() {
    	var lastnum = gTracker[gCurrentList].last;

    	if (lastnum && lastnum != 'undefined') {
    		window.location.href = '#' + lastnum;
    	}
	return false;

    }


    function hiLiteSimMsgs(obj) {
        if (obj){
            var ptn,
              titl = obj.getElementsByClassName('title')[0].innerHTML,
                eMsgListAtagsLen = eMsgListAtags.length,
                yutils = YOJIMG.utils;

            titl = titl.replace(/\[\S+?\]/ig, "");
            titl = titl.replace(/RE:\s*/ig, "");
            titl = titl.replace(/\s{2,}?/ig, " ");


            try{
                ptn = new RegExp(titl);
            }
            catch(e){
                ptn = null;
            }

            for (var i = 0; i < eMsgListAtagsLen; i=i+1) {
                if (ptn && ptn.test(eMsgListAtags[i].innerHTML)) {
                    yutils.addClass(eMsgListAtags[i].parentNode, THREADED_MSG_CLASS);
                }
                else {
                    debugMsg(eMsgListAtags[i].innerHTML);
                    yutils.removeClass(eMsgListAtags[i].parentNode, THREADED_MSG_CLASS);
                }
            }

            ptn = null;
    	}
    }


    function debugCheck() {
    	if(/debug=1/.test(document.location.href)){
        return true;
      }

    	return false;
    }

    function debugMsg(s) {
      //if(debugCheck() && console){
      //     console.log(s);
      // }
    }

    function storeSelectedList() {
    	if (gCurrentList) {
    		setMetaCookie('lastlist', 'ir', gCurrentList);
        }
    }

    function setLastSelectedList() {
        var lastList = getMetaCookie('lastlist', 'ir');
        if (lastList) {
            var options = document.listSelectorForm.list.options;
            var ol = options.length;
            for (var i=0; i < ol; i++) {
                if (options[i].value === lastList) {
                    options.selectedIndex = i;
                    break;
                }
            }

            gCurrentList = options[i].value;
            gCurrentListEmail = options[i].getAttribute('addr');
            gCurrentListURL = options[i].getAttribute('url');
        }
        else {
            setSelectedListOption();
        }


    }

    return({
      updateClock: updateClock,
      msgListEvent: msgListEvent,
      msgReadEvent: msgReadEvent,
      readIt: readIt,
      doAction: doAction,
      setListName: setListName,
      setDateSpan: setDateSpan,
      toggleReverse: toggleReverse,
      sortBy: sortBy
    });

})();
