/*  Copyright Alvin Cheah, 2006  |  http://www.kokweng.net/
 * --------------------------------------------------------
 *
 * The Notifier, version 0.1.1
 *
 * Note: This script required "DHTML library" from DHTMLCentral.com in order to work properly
 *
 * This script is distributed under the GNU Lesser General Public License.
 * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
 */

var messageReq = getXmlHttpRequestObject();
var delMesgReq = getXmlHttpRequestObject();
var inter      = setInterval('getMessageText()', 10000);
var imIndexPg  = _absolutePath+'/ajax.lnk.php?option=com_messenger&';
var mesgId     = '';
var playSound  = true;
var failRetry  = 0;
var maxRetry   = 10;

function killNotifier () {

        obj.hideIt();

        if (objTimer) {
           window.clearInterval(objTimer);
        }
} // killNotifier


function getMessageText () {
        if (messageReq.readyState == 4 || messageReq.readyState == 0) {
           requestURL = _root_url+'/cache/msg/notify_'+_uid+'.xml';

           messageReq.open('GET', requestURL, true);
           messageReq.setRequestHeader('Content-Type', 'text/xml');
           messageReq.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
           messageReq.setRequestHeader('Cache-Control', 'no-cache');
           messageReq.onreadystatechange = handleReceiveMessage;
           messageReq.send(null);
        }
} // getMessageText

function handleReceiveMessage () {

        if (messageReq.readyState == 4) {
            if (messageReq.status == 404) {
               // no new message for user at the moment //
               return;
            }
            if (!resultStatus(messageReq.responseText, 'xml', false)) {
               failRetryNow();
               return;
            }

            var xmldoc    = messageReq.responseXML;
            var msg_nodes = xmldoc.getElementsByTagName('message');
            var n_msgs    = msg_nodes.length;

            for (i=0; i<n_msgs; i++) {
                if (msg_nodes[i].getAttribute('id') == mesgId) {
                   continue;
                } else {
                   mesgId = msg_nodes[i].getAttribute('id');
                }

                var type_node  = msg_nodes[i].getElementsByTagName('type');
                var room_node  = msg_nodes[i].getElementsByTagName('roomid');
                var title_node = msg_nodes[i].getElementsByTagName('title');
                var photo_node = msg_nodes[i].getElementsByTagName('photo');
                var text_node  = msg_nodes[i].getElementsByTagName('text');
                var url_node   = msg_nodes[i].getElementsByTagName('url');

                //var title_nodeValue = (title_node) ? title_node[0].firstChild.nodeValue : "";

                initNotifier(type_node[0].firstChild.nodeValue,
                             room_node[0].firstChild.nodeValue,
                             title_node[0].firstChild.nodeValue,
                             photo_node[0].firstChild.nodeValue,
                             text_node[0].firstChild.nodeValue,
                             url_node[0].firstChild.nodeValue);
			} // END for loop
        }
} // handleReceiveMessage

function initNotifier (type, roomId, title, photo, text, url) {
        var notifier = document.getElementById('div_notifier');
        var newWin;
        var url; //TODO// url to open window and delete current message? //

        switch (type) {
           case 'CHAT_REQUEST':
              newWin = "openBrWindow('"+url+"', '"+roomId+"', 'width=450,height=330')";
              break;
           default:
              newWin = "openBrWindow('"+url+"', 'notice', 'width=450,height=330')";
        }

        if (title) {
           document.getElementById('div_notifyTitle').innerHTML = title;
        }
        if (photo && photo != '-') {
           document.getElementById('div_imPhoto').style.display      = 'block';
           document.getElementById('div_imPhoto').style.background   = 'url('+photo+') no-repeat center';
           document.getElementById('div_imMessage').style.width      = '130px';
           document.getElementById('div_imMessage').style.textAlign  = 'left';
        } else {
           document.getElementById('div_imPhoto').style.display      = 'none';
           document.getElementById('div_imMessage').style.width      = '165px';
           document.getElementById('div_imMessage').style.textAlign  = 'center';
        }

        text = '<span onclick="'+newWin+'">'+text+'</span>';
        document.getElementById('div_imMessage').innerHTML = text;

        // play a sound alert? //
        if (playSound) {
           var sound_div = document.getElementById('div_sound');
           //alert('play sound at '+_root_url);
           sound_div.innerHTML = '<embed src="'+_root_url+'/images/type.wav" type=application/x-mplayer2' +
                                 ' autostart=true hidden=true volume=100 loop=false></embed>';
        }

        showNotifier();
        window.focus();
        sendDeleteNotify();
        window.setTimeout('hideNotifier()', 8000);
} // initNotifier


function hideNotifier () {
        var docWidth   = document.body.clientWidth;
        var docHeight  = document.body.clientHeight;
        var scrollTop  = document.body.scrollTop;
        var scrollLeft = document.body.scrollLeft;

        scrollTop = (isNS4) ? 0 : scrollTop;

        var end_x = docWidth + scrollLeft - obj.w;
        var end_y = docHeight + scrollTop;

        if (objTimer) {
           var start_y = end_y - obj.h;

           window.clearInterval(objTimer);
           obj.moveIt(end_x, start_y);
        }

        obj.slideIt(end_x, end_y, 4, 10);
        window.setTimeout('killNotifier()', 1000);
} // hideNotifier

function showNotifier () {
        var docWidth   = document.body.clientWidth;
        var docHeight  = document.body.clientHeight;
        var scrollTop  = document.body.scrollTop;
        var scrollLeft = document.body.scrollLeft;

        scrollTop = (isNS4) ? 0 : scrollTop;

        var start_x = docWidth + scrollLeft - obj.w;
        var start_y = docHeight + scrollTop;
        var end_y   = start_y - obj.h;

        obj.moveIt(start_x, start_y);
        obj.showIt();
        obj.slideIt(start_x, end_y, 4, 10);

        fixPosition();
        //TODO// close Notifier within 5 seconds //
} // showNotifier

function fixPosition () {
        if (isNS4) {
           objTimer = "";
           document.getElementById('div_notifier').style.position = 'fixed';
        } else {
           objTimer = window.setInterval('resizeDiv()', 20);
        }

        //alert(document.getElementById('div_notifier').style.top);
} // fixPosition

// SPECIALLY made for fuckin Internet Explorer 6.0 only //
function resizeDiv () {
        try {
           var el = document.getElementById('div_notifier');

           elWidth   = parseInt(el.offsetWidth, 10);
           elHeight  = parseInt(el.offsetHeight, 10);
           docWidth  = document.body.clientWidth;
           docHeight = document.body.clientHeight;

           el.style.top  = docHeight - elHeight + parseInt(document.body.scrollTop, 10);
           el.style.left = docWidth - elWidth + parseInt(document.body.scrollLeft, 10);
        } catch (e) {

        }
} // resizeDiv

function sendDeleteNotify () {

        if (delMesgReq.readyState == 4 || delMesgReq.readyState == 0) {
           requestURL = imIndexPg+'task=deleteNotice';

           delMesgReq.open('GET', requestURL, true);
           delMesgReq.onreadystatechange = handleDeleteNotify;
           delMesgReq.send(null);
        }
} // sendDeleteNotify

function handleDeleteNotify () {
        if (delMesgReq.readyState == 4) {
           if (delMesgReq.status == 404) {
              debugMessage('The requested URL [' + requestURL + '] was not found on this server.', 3);
           } else {
              resultStatus(delMesgReq.responseText, false);
           }
		}
} // handleDeleteNotify


function getDetails () {

    	str  = 'x: ' + obj.x + "\n";
    	str += 'y: ' + obj.y + "\n";
	    str += 'w: ' + obj.w + "\n";
    	str += 'h: ' + obj.h + "\n";
    	str += 'ct: ' + obj.ct + "\n";
    	str += 'cr: ' + obj.cr + "\n";
    	str += 'cb: ' + obj.cb + "\n";
    	str += 'cl: ' + obj.cl + "\n";
        str += 'scroll top: ' + document.body.scrollTop + "\n";
        str += 'scroll left: ' + document.body.scrollLeft + "\n";
        str += 'doc width: ' + document.body.clientWidth + "\n";
        str += 'doc height: ' + document.body.clientHeight + "\n";

        debugMessage(str, 2);
} // getDetails


function failRetryNow () {

        if (maxRetry < failRetry) {
           clearInterval(inter);
           debugMessage(maxRetry+' times fail retry had made', 2);

           return false;
        }

        failRetry++;
} // failRetryNow