
window.notify = (function() {

    //
    
    var inMessage = function() {
    	var title = "";
    	var description = "";
    	var date = "";
    	var link = "";
    	var image = "";
    }
    
    //
    
    var REFRESH_PERIOD = 60000;
    var url = "notify.php";
    
    var oHttp = false;
    
    var thisTimerID;
    var pollStarted = false;    
    
    var thisMessage = new inMessage();
    var oldMessage = new inMessage();
    
    //
    
    safeAddEvent(window, 'load', startPoll);
    
    //
    
    function startPoll() {
    	if (initHttp()) {
    		thisTimerID = setInterval(pollNotification, REFRESH_PERIOD);
    		pollNotification();
    	}
    }
    
    function stopPoll() {
        Log('HALTING');
        clearInterval(thisTimerID);
    }
    
    //
    
    function initHttp()
    {
    	getHttp();
        
    	if (!oHttp) {
             Log('FAILED: Cannot create XMLHTTP object');
             return false;
    	}
        
    	Log('http object success');
    	oHttp.onreadystatechange = OnNotification;
    
    	return true;
    }
    
    //
    
    function pollNotification() {
    
    	if (window.ActiveXObject) initHttp();
    
        var _t = convertOldTime();
        if (isNaN(_t)) _t = 0;
        var _u = url + "?t=" + _t;
    
        if (!pollStarted) {
            pollStarted = true;
            _u = url; 
        }
        
     	Log('polling: ' + _u);
        
    	oHttp.open('GET', _u, true);
    	oHttp.send(null);
    }
    

    function OnNotification() {
        
        if (oHttp.readyState != 4) return;
    
        switch (oHttp.status)
        {
            case 304:
                Log('304: not a new notification');
                return;
                break;
                
            case 200:
    			Log('notification received');

    			// notification contains no data
    			if (oHttp.responseText.length == 0) {
    				Log('no data');
    				return;
    			}

    			Log('-----data-------');
    			Log(oHttp.responseText);
    			Log('-----end--------');
    
    			// localize the message
    			var _tmp = oHttp.responseText.split("\n");
        		
                // bad data
    			if (_tmp.length < 4) {
    				Log('invalid data');
    				return;			 
                }
                
    			thisMessage.title = _tmp[0];
    			thisMessage.description = _tmp[1];
    			thisMessage.link = _tmp[2];
    			thisMessage.date = _tmp[3];
                
    			Log('-----parsed-----');
    			Log('title: ' + thisMessage.title);
    			Log('description: ' + thisMessage.description);
    			Log('link: ' + thisMessage.link);
    			Log('date: ' + thisMessage.date);
    			Log('-----end--------');
                
                // remote kill command
                if (thisMessage.title == "!X") {
                    Log('remote kill command received');
                    stopPoll();
                    return;
                }
                
    			if (thisMessage.date == oldMessage.date) {
    				Log('not a new notification');
    				// if the message has been displayed for 24 hours
    				// gmtDate=new Date(thisMessage.date)
    				// if (hoursDisplayed > 24) {
    				    // Log('24 hour display limit reached');
    					// 	clearNotification();
    				// }
    				return;
    			} 
                
    			// update oldmessage
    			oldMessage.title = thisMessage.title;
    			oldMessage.description = thisMessage.description;
    			oldMessage.link = thisMessage.link;
    			oldMessage.date = thisMessage.date;
    
    			// allclear
    			if (thisMessage.description == "ALL CLEAR") {
    				Log('all clear received');
    				clearNotification();
    				return;
    			}
                
    			Log('new notification');
    			setNotification();
                
                break;
                
            default:
                Log('unanticipated status: ' + oHttp.status);
                break;   
        }
    }
    
    //
    
    function setNotification() {
    
    	changeTextById("alert-title", thisMessage.title);
    	changeTextById("alert-message", thisMessage.description);
    	changeTextById("alert-date", thisMessage.date);
    	//changeTextById("alert-link", thisMessage.link);
    	//changeTextById("alert-image", thisMessage.image);

        setDisplay(true, "SPalert");

    }
    
    function clearNotification() {
    
    	changeTextById("alert-title", "");
    	changeTextById("alert-message", "");
    	changeTextById("alert-date", "");
    	changeTextById("alert-link", "");
    	// changeTextById("alert-image", "");
        
        setDisplay(false, "SPalert");
    }
    
    function convertOldTime() {
       	var _d = new Date(oldMessage.date);
       	return _d.getTime()/1000.0;
    }    
    
    // util
    
    function setDisplay(display, divid)
    {
    	var _el = document.getElementById(divid);
        if (_el == null) return;
    	_el.style.display = display ? "block" : "none";
    }
    
    function changeTextById(elm, value) {
    
    	elm = document.getElementById(elm);
    
    	if (!document.all) {
    		elm.textContent = value;
    	} else {
    		elm.innerText = value;
    	}
    }
    
    //
    
    function getHttp() {
    	Log('getting http object...');
    	oHttp = false;
    
    	if (window.XMLHttpRequest) { // Mozilla, Safari,...
    		oHttp = new XMLHttpRequest();
    		if (oHttp.overrideMimeType) oHttp.overrideMimeType('text/xml');
            return true;
    	}

        if (window.ActiveXObject) { // IE
            var versions = [
                "Msxml2.XMLHTTP.7.0", 
                "Msxml2.XMLHTTP.6.0", 
                "Msxml2.XMLHTTP.5.0", 
                "Msxml2.XMLHTTP.4.0", 
                "MSXML2.XMLHTTP.3.0", 
                "MSXML2.XMLHTTP",
                "Microsoft.XMLHTTP"];        
                        
            for (var i = 0; i < versions.length; i++) {
                Log('http: trying ' + versions[i] + '...');
                try {
                    oHttp = new ActiveXObject(versions[i]);
                    break;
                }
                catch (e) { /* next */ }
            }         
            if (!oHttp) return true;

    	}
        
        return false;
    }
    
    /*	    
    function getParser() {

		Log('attempting to create parser');
		if (window.DOMParser)
		{
			parser=new DOMParser();
			xmlDoc=parser.parseFromString(oHttp.responseXML,"text/xml");
			Log('success - window.DOMParser');
		}
		else // Internet Explorer
		{
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(oHttp.responseXML); 
			Log('success - MSXMLDOM');
		} 
    }
   */
    //
    
    function safeAddEvent(obj, evType, fn) {
        if (obj.addEventListener) { 
            obj.addEventListener(evType, fn, false); 
            return true; 
        }
        if (obj.attachEvent) { 
            var r = obj.attachEvent("on"+evType, fn); 
            return r;
        } 
        return false; 
    }
    
    //
    
    function Log(context) {	
    	var html = getHMS() + " : " + context + "<br />";
        
    	if(window.console) { console.log(html); }
        
    	var _el = document.getElementById("logOutput");
    	if (_el == null) return;
        
    	var elem = document.createElement("span");        
    	if (elem == null) return;
        
    	elem.innerHTML = html;
    	_el.appendChild(elem);
    	elem.scrollIntoView();
    }
    
    function getHMS() {
    	var d = new Date();
    	return pad(d.getHours(), 2) + ":" + pad(d.getMinutes(), 2)+ ":" + pad(d.getSeconds(), 2);
    }
    
    function pad(n, totalDigits) { 
    	n = n.toString(); 
    	var pd = ''; 
    	if (totalDigits > n.length) { 
    		for (i=0; i < (totalDigits-n.length); i++) { 
    			pd += '0'; 
    		} 
    	} 
    	return pd + n.toString(); 
    } 
    
    function createTimestamp() {
    	var _d = new Date();
    	return _d.getTime();
    }
    
    
    return {
        setDisplay:setDisplay
    }    
    // end util
    
}());
    
    
