﻿
var MSIE        = 0;
var SAFARI      = 1;
var OPERA       = 2;
var MOZ         = 3;
var FOX         = 4;
var BLACKBERRY  = 5;
var CHROME = 6;
var ANDROID = 7;

function clsBrowser() {
    var me = this;

    this.ua = null;
    
    this.type = null;
    this.version = null;
    this.strMode = null;
    this.compatMode = false;
    this.documentMode = null;

    this.e = null;
    this.html = new clsHTML();
    this.keys = new clsKeyCapture();
    me.keys.enabled = true;

    this.arrVersions = new Array("IE", "Safari", "Opera", "Mozilla", "Firefox", "BlackBerry", "Chrome", "Android");

    this.isIE = false;
    this.isOpera = false;
    this.isMoz = false;
    this.isSafari = false;
    this.isIPhone = false;
    this.isBlackBerry = false;
    this.isChrome = false;
    this.isAndroid = false;

    this.rClickCoords = { x: 0, y: 0 };

    this.arrOnload = new Array();

    //--------------------------
    this.cookies = new clsCookie();

    this.init = function() {
        var s, i;
        me.ua = navigator.userAgent;
        
        if ((i = me.ua.indexOf("MSIE")) >= 0) {
            me.isIE = true;
            me.type = MSIE;
            var Explorer = IEVersion();
            me.version = parseFloat(Explorer.Version);
            me.strMode = Explorer.BrowserMode;
            me.documentMode = parseFloat(Explorer.DocMode);

            if (me.strMode.toLocaleLowerCase() == "compat mode") {
                me.compatMode = true;
            }
        }
        else if ((i = me.ua.indexOf("Android")) >= 0) {
            me.isAndroid = true;
            me.type = ANDROID;
            me.version = me.trim(me.ua.substr(i + 7));
        }
        else if ((i = me.ua.indexOf("Chrome/")) >= 0) {
            me.isChrome = true;
            me.type = CHROME;
            me.version = me.trim(me.ua.substr(i + 7));
        }
        else if ((i = me.ua.indexOf("Safari/")) >= 0) {
            me.isSafari = true;
            me.type = SAFARI;
            s = "Version/";
            i = me.ua.indexOf(s);
            me.version = me.trim(me.ua.substr(i + 8));

            s = "iPhone";
            if ((i = me.ua.indexOf(s)) >= 0) {
                me.isIPhone = true;
            }
        }
        else if ((i = me.ua.indexOf("Opera/")) >= 0) {
            me.isOpera = true;
            me.type = OPERA;
            me.version = me.trim(me.ua.substr(i + 6));
        }
        else if (((i = me.ua.indexOf("Gecko")) >= 0) && !me.isSafari) {
            me.isMoz = true;
            me.type = MOZ;
            me.version = me.trim(me.ua.substr(i + 6));

            s = "Firefox/";
            if ((i = me.ua.indexOf(s)) >= 0) {
                me.type = FOX;
                me.version = me.trim(me.ua.substr(i + s.length));
            }
        }
        else if ((i = me.ua.indexOf("BlackBerry")) >= 0) {
            me.isBlackBerry = true;
            me.type = BLACKBERRY;
            me.version = me.trim(me.ua.substr(i + 10));
        }

        return;
    };

    this.info = function() {
        log.write("11");
        log.write(navigator.userAgent + "<br>\r\n");
        var s = "";

        log.write("22");
        s += "      Browser : " + me.arrVersions[me.type] + "<br>\r\n";
        s += "      Version : " + me.version + "<br>\r\n";

        log.write("33");
        switch (me.type) {

            case MSIE:
                s += " Browser Mode : " + me.strMode + "<br>\r\n";
                s += "Document Mode : " + me.documentMode + "<br>\r\n";
                break;

            case SAFARI:
                break;

            case OPERA:
                break;

            case MOZ:
                break;

            case FOX:
                break;

            case BLACKBERRY:
                break;

            case ANDROID:
                break;

            default:
                break;
        }
        log.write("44");
        log.write(s);
        log.write("55");
        return;
    };

    this.mouseDown = function(event) {
        me.rClickCoords = me.coords(event);
    };

    this.trim = function(strTrim) {
        str = "";
        for (c = 0; c < strTrim.length; c++) {
            s = strTrim.substr(c, 1);
            if ((s != '.') && isNaN(s)) { break; }
            str += s;
        }
        return (str);
    };


    this.block = function(event) {
        if (!event) { return (false); }
        if (!me.e) {
            event = me.getEvent(event);
        }
        switch (me.type) {
            case MSIE:
                me.e.cancelBubble = true;
                me.e.returnValue = false;
                break;

            case FOX:
            case BLACKBERRY:
            case SAFARI:
            case CHROME:
            case ANDROID:
            case OPERA:
                me.e.stopPropagation();
                me.e.preventDefault();
                break;
        }
       //log.write("browser.block");
        return (false);
    };

    this.strType = function() {
        return (me.arrVersions[me.type] + " " + me.version);
    };

    this.coords = function(event) {
        if (!(event = me.getEvent(event))) {
            return (me.rClickCoords);
        }
        me.rClickCoords.x = event.clientX;
        me.rClickCoords.y = event.clientY;
        return { x: event.clientX, y: event.clientY };
    };

    this.scroll = function(event) {
        var xVal = 0;
        var yVal = 0;
        switch (me.type) {
            case MSIE:
                xVal = document.documentElement.scrollLeft + document.body.scrollLeft;
                yVal = document.documentElement.scrollTop + document.body.scrollTop;
                break;

            case FOX:
            case SAFARI:
            case OPERA:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                xVal = window.scrollX;
                yVal = window.scrollY;
                break;
        }
        return { x: xVal, y: yVal };
    };

    this.target = function(event) {
        if (!(event = me.getEvent(event))) { return (null); }
        switch (me.type) {
            case MSIE:
                return (event.srcElement);
                break;

            case FOX:
            case OPERA:
            case SAFARI:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                return (event.target);
                break;
        }
        return (null);
    };

    this.getEvent = function(event) {
        switch (me.type) {
            case MSIE:
                me.e = window.event;
                return (window.event);
                break;

            case FOX:
            case SAFARI:
            case OPERA:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                me.e = event;
                return (event);
                break;
        }
        return (null);
    };

    this.navigate = function(strURL) {
        switch (me.type) {
            case MSIE:
                window.location.href = strURL;
                break;

            case FOX:
            case SAFARI:
            case OPERA:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                window.location.href = strURL;
                break;
        }
    };

    this.navigateChild = function(childWindow, strURL) {
        switch (me.type) {
            case MSIE:
                childWindow.location.href = strURL;
                break;

            case FOX:
            case SAFARI:
            case OPERA:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                childWindow.location.href = strURL;
                break;
        }
    };

    this.open = function(strURL, name, features) {
        if (!name) { name = "new"; }
        if (!features) { features = ""; }
        var win = window.open(strURL, name, features);
        win.focus();
        return (win);
    };

    this.cursor = new clscursor();

    this.arrEvents = null;

    this.onEnable = function(callBackFunction, targetNode) {
        if (me.arrEvents == null) { me.arrEvents = new Array(); }

        var i = me.arrEvents.length;
        me.arrEvents[i] = { node: targetNode, callBack: callBackFunction, state: false };

        if (me.onEnableTimer) { return; }
        me.onEnableTimer = setTimeout(me.watchOnEnable, 100);
        return;
    };

    this.watchOnEnable = function() {
        // var me = this;
        var count = 0;
        for (var c = 0; c < me.arrEvents.length; c++) {
            if (me.arrEvents[c].node.disabled) {
                count++;
                me.arrEvents[c].state = false;
                continue;
            }
            if (me.arrEvents[c].state == true) { continue; }
            me.arrEvents[c].state = true;

            //alert(me.arrEvents[c].node.getAttribute("id") + " - ENABLED");
            me.arrEvents[c].callBack(me.arrEvents[c].node);
        }
        if (count == 0) { return; }
        me.onEnableTimer = setTimeout(me.watchOnEnable, 100);
    };

    this.onload = function(e) {

        if (me.arrOnload) {
            for (var c = 0; c < me.arrOnload.length; c++) {
                try { me.arrOnload[c](e) }
                catch (err) { log.write("Error:browser.onload(" + err + ")"); }
            }
        }
        return;
    };

    this.init();
    //alert(me.arrVersions[me.type] + " " + me.version);
}

//var browser = new clsBrowser();



clsBrowser.prototype.attachEvent = function(strEvent, callBack, node) {

    strEvent = strEvent.toLowerCase();
    var me = this;

    var x = true;
    try {
        if (strEvent == "onenable") {
            me.onEnable(callBack, node);
            return;
        }
        if (strEvent == "onload") {
            me.arrOnload.push(callBack);
            return;
        }
        switch (me.type) {
            case MSIE:
                if (!node)
                    document.attachEvent(strEvent, callBack);
                else
                    node.attachEvent(strEvent, callBack);
                break;

            case FOX:
            case OPERA:
                //x = false;
            case SAFARI:
            case BLACKBERRY:
            case CHROME:
                strEvent = strEvent.replace('on', '');
                if (!node)
                    document.addEventListener(strEvent, callBack, x);
                else
                    node.addEventListener(strEvent, callBack, x);
                break;
        }
    }
    catch (err) {
        alert(err.message);
    }
    return;
}

clsBrowser.prototype.detachEvent = function(strEvent, callBack, node) {
    try {
        strEvent = strEvent.toLowerCase();
        var me = this;
        switch (me.type) {
            case MSIE:
                if (!node)
                    document.detachEvent(strEvent, callBack);
                else
                    node.detachEvent(strEvent, callBack);
                break;

            case FOX:
            case SAFARI:
            case OPERA:
            case BLACKBERRY:
            case CHROME:
            case ANDROID:
                strEvent = strEvent.replace('on', '');
                if (!node)
                    document.removeEventListener(strEvent, callBack, true);
                else
                    node.removeEventListener(strEvent, callBack, true);
                break;
        }
    }
    catch (err) {
        alert(err.message);
    }
    return;
}

function clscursor() {
    var me = this;
    var s = document.body.style.cursor;
    this.wait = function() { document.body.style.cursor = "wait"; };
    this.none = function() { document.body.style.cursor = "default"; };
    this.hand = function() { document.body.style.cursor = "pointer"; };
    this.move = function() { document.body.style.cursor = "move"; };
    this.nwResize = function() { document.body.style.cursor = "nw-resize"; };
    this.eResize = function() { document.body.style.cursor = "e-resize"; };
    this.nResize = function() { document.body.style.cursor = "n-resize"; };
    this.neResize = function() { document.body.style.cursor = "ne-resize"; };
    this.crosshair = function() { document.body.style.cursor = "crosshair"; };
}










//--------------------------------------------------------------------------------------------------------

var ONKEYUP = 1;
var ONKEYDOWN = 2;

var BKSP = 8;  //Backspace
var TAB  = 9;  //Tab
var ENTR = 13; //Enter
var SHFT = 16; //Shift
var CTRL = 17; //CTRL
var ALT  = 18; //ALT
var CAPS = 20; //CAPS
var ESC  = 27; //ESC
var PUP  = 33; //PAGE UP
var PDWN = 34; //PAGE DOWN
var END  = 35; //END
var HOME = 36; //HOME
var ALFT = 37; //ARROW LEFT
var AUP  = 38; //ARROW UP
var ART  = 39; //ARROW RIGHT
var ADWN = 40; //ARROW DOWN
var DEL  = 46; //DELETE

var F1 = 112; //F1

function clsKeyCapture() {
    var me = this;
    this.arrKeys = null;
    this.enabled = false;
    this.dataEntryMode = false;

    this.getKey = function(e) { return ((window.event) ? event.keyCode : e.keyCode); }
    this.init = function() {
        document.onkeydown = me.onKeyDown;
        document.onkeyup = me.onKeyUp;
    };

    this.add = function(keyID, eventID, callBackFunction, cancelEvent, dataEntryOverrideFlag) {
        if (!me.arrKeys) { me.arrKeys = new Array(); }

        if (parseInt(keyID) != keyID) {
            //must be a string so test to see which one they want
            strKey = keyID.toUpperCase();
            newKey = strKey.charCodeAt(0);

            if (strKey != String.fromCharCode(newKey)) {
                log.write("Error adding Key - keyID:" + keyID + ", strKey:" + strKey + ", newKey:" + newKey + ", k:" + String.fromCharCode(newKey));
                return;
            }
            keyID = newKey;
        }
        me.arrKeys[me.arrKeys.length] = { key: keyID, evt: eventID, callBack: callBackFunction, propagate: cancelEvent, dataEntryOverride: (!dataEntryOverrideFlag ? false : true) };

        me.print();
        return;
    };

    this.remove = function(keyID, eventID, callBack) {
        if (!me.arrKeys) { return (null); }
        var newArrKeys = me.arrKeys;
        me.arrKeys = null;

        for (var c = 0; c < newArrKeys.length; c++) {
            var k = newArrKeys[c];

            if ((k.evt != eventID) || (k.key != keyID))// || (k.callBack != callBack))
            {
                me.add(k.key, k.evt, k.callBack, k.propagate, k.dataEntryOverride);
            }
        }
        //me.print();
        return;
    };

    this.print = function() {
        var s = "";
        for (var c = 0; c < me.arrKeys.length; c++) {
            var k = me.arrKeys[c];
            s += "(" + k.key + "," + k.evt + "," + (k.propagate ? "T" : "F") + "," + (k.dataEntryOverride ? "T" : "F") + ")";
        }
        //log.write("count:" + me.arrKeys.length + "," + s);
        return;
    };

    this.hasKey = function(keyID, eventID) {
        if (!me.arrKeys) { return (null); }
        for (c = 0; c < me.arrKeys.length; c++) {
            var k = me.arrKeys[c];
            if (k.evt != eventID) { continue; }
            if (me.arrKeys[c].key != keyID) { continue; }
            return (k);
        }
        return (null);
    };

    this.onKeyUp = function(e) {

        if (!me.enabled) { return; }
        //window.status += "," + me.getKey(e);
        if (!(k = me.hasKey(me.getKey(e), ONKEYUP))) {
            //log.write("onKeyUp(" + me.getKey(e) + ")");
            return;
        }

        if (me.dataEntryMode) {
            if (!k.dataEntryOverride) { return; }
        }

        if (k.callBack) {
            k.callBack(e, k.key);
        }
        if (k.propagate) { return; }
        return (browser.block(e));
    };

    this.onKeyDown = function(e) {

        if (!me.enabled) { return; }
        //log.write("onKeyDown(" + me.getKey(e) + ")");
        if (!(k = me.hasKey(me.getKey(e), ONKEYDOWN))) {
            return;
        }

        if (me.dataEntryMode) {
            if (!k.dataEntryOverride) { return; }
        }
        
        if (k.callBack) {
            k.callBack(e, k.key);
        }

        if (k.propagate) { return; }
        return (browser.block(e));
    };
    me.init();
}


//--------------------------------------------------------------------------------------------------------



function clsCookie() {
    var me = this;
    this.enabled = true;
    this.expires = null;

    this.init = function() {
        var oD = new Date();
        me.expires = new Date(oD.addDate("d", 1));
        me.save("test", "none");

        if (me.get("test") != "none") {
            me.enabled = false;
        }
        me.clear("test");
        return;
    };

    this.save = function(name, value) {
        if (!me.enabled) { return (false); } //Cookies not enabled.
        document.cookie = name + "=" + value + ";";
        //document.cookie = name + "=" + value + ";expires=" + me.expires.toGMTString();
        return (true);
    };

    this.clear = function(name) {
        if (!me.enabled) { return (false); } //Cookies not enabled.
        document.cookie = name + "=;";
        //document.cookie = name + "=;expires=Thu, 01-Jan-1970 00:00:01 GMT";
        return (true);
    };

    this.get = function(name) {
        if (!me.enabled) { return (""); } //Cookies not enabled.
        if (document.cookie.length > 0) {
            var start = document.cookie.indexOf(name + "=");
            if (start == -1) { return (""); }

            start += name.length + 1;
            var end = document.cookie.indexOf(";", start);
            if (end == -1) {
                end = document.cookie.length;
            }
            return (unescape(document.cookie.substring(start, end)));
        }
        return ("");
    };
    this.init();
}


//--------------------------------------------------------------------------------------------------------



//--------------------------------------------------------------------------------------------------------



//--------------------------------------------------------------------------------------------------------


/*
* Author: Rob Reid
* CreateDate: 20-Mar-09
* Description: Little helper function to return details about IE 8 and its various compatibility settings either use as it is
* or incorporate into a browser object. Remember browser sniffing is not the best way to detect user-settings as spoofing is
* very common so use with caution.
*/
function IEVersion() {
    var _n = navigator, _w = window, _d = document;
    var version = "NA";
    var na = _n.userAgent;
    var ieDocMode = "NA";
    var ie8BrowserMode = "NA";
    // Look for msie and make sure its not opera in disguise
    if (/msie/i.test(na) && (!_w.opera)) {
        // also check for spoofers by checking known IE objects
        if (_w.attachEvent && _w.ActiveXObject) {
            // Get version displayed in UA although if its IE 8 running in 7 or compat mode it will appear as 7
            version = (na.match(/.+ie\s([\d.]+)/i) || [])[1];
            // Its IE 8 pretending to be IE 7 or in compat mode		
            if (parseInt(version) == 7) {
                // documentMode is only supported in IE 8 so we know if its here its really IE 8
                if (_d.documentMode) {
                    version = 8; //reset? change if you need to
                    // IE in Compat mode will mention Trident in the useragent
                    if (/trident\/\d/i.test(na)) {
                        ie8BrowserMode = "Compat Mode";
                        // if it doesn't then its running in IE 7 mode
                    } else {
                        ie8BrowserMode = "IE 7 Mode";
                    }
                }
            } else if (parseInt(version) == 8) {
                // IE 8 will always have documentMode available
                if (_d.documentMode) { ie8BrowserMode = "IE 8 Mode"; }
            }
            // If we are in IE 8 (any mode) or previous versions of IE we check for the documentMode or compatMode for pre 8 versions			
            ieDocMode = (_d.documentMode) ? _d.documentMode : (_d.compatMode && _d.compatMode == "CSS1Compat") ? 7 : 5; //default to quirks mode IE5				   			
        }
    }

    return {
        "UserAgent": na,
        "Version": version,
        "BrowserMode": ie8BrowserMode,
        "DocMode": ieDocMode
    }
}



document.onhelp = function() { return (false); }
window.onhelp = function() { return (false); }
