// see http://www.quirksmode.org/js/detect.html for more info
var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
            || this.searchVersion(navigator.appVersion)
            || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i=0;i<data.length;i++)	{
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
    },
    dataBrowser: [
    {
        string: navigator.userAgent,
        subString: "Chrome",
        identity: "Chrome"
    },
    { 	string: navigator.userAgent,
        subString: "OmniWeb",
        versionSearch: "OmniWeb/",
        identity: "OmniWeb"
    },
    {
        string: navigator.vendor,
        subString: "Apple",
        identity: "Safari"
    },
    {
        prop: window.opera,
        identity: "Opera"
    },
    {
        string: navigator.vendor,
        subString: "iCab",
        identity: "iCab"
    },
    {
        string: navigator.vendor,
        subString: "KDE",
        identity: "Konqueror"
    },
    {
        string: navigator.userAgent,
        subString: "Firefox",
        identity: "Firefox"
    },
    {
        string: navigator.vendor,
        subString: "Camino",
        identity: "Camino"
    },
    {		// for newer Netscapes (6+)
        string: navigator.userAgent,
        subString: "Netscape",
        identity: "Netscape"
    },
    {
        string: navigator.userAgent,
        subString: "MSIE",
        identity: "Explorer",
        versionSearch: "MSIE"
    },
    {
        string: navigator.userAgent,
        subString: "Gecko",
        identity: "Mozilla",
        versionSearch: "rv"
    },
    { 		// for older Netscapes (4-)
        string: navigator.userAgent,
        subString: "Mozilla",
        identity: "Netscape",
        versionSearch: "Mozilla"
    }
        ],
    dataOS : [
    {
        string: navigator.platform,
        subString: "Win",
        identity: "Windows"
    },
    {
        string: navigator.platform,
        subString: "Mac",
        identity: "Mac"
    },
    {
        string: navigator.platform,
        subString: "Linux",
        identity: "Linux"
    }
        ]
};
BrowserDetect.init();

/**
 * Function for finding the specific versions of the OS.
 * http://msdn.microsoft.com/en-us/library/ms537503.aspx
 */
function getOSDescription()
{
    var os = BrowserDetect.OS;
    if(os == "Windows")
    {
        var agent = navigator.userAgent.toLowerCase();
        if (agent.indexOf("windows nt 6.0") != -1)
            os = "Windows Vista; Windows Server 2008";
        else if (agent.indexOf("windows nt 5.2") != -1)
            os = "Windows XP x64; Windows Server 2003";
        else if (agent.indexOf("windows nt 5.1") != -1)
            os = "Windows XP";
        else if (agent.indexOf("windows nt 5.01") != -1)
            os = "Windows 2000 SP1";
        else if (agent.indexOf("windows nt 5.0") != -1)
            os = "Windows 2000";
        else if (agent.indexOf("windows nt 4.0") != -1)
            os = "Windows NT 4.0";
        else if (agent.indexOf("win 9x 4.90") != -1)
            os = "Windows ME";
        else if (agent.indexOf("windows 98") != -1)
            os = "Windows 98";
        else if (agent.indexOf("windows 95") != -1)
            os = "Windows 95";
        else if (agent.indexOf("windows ce") != -1)
            os = "Windows CE";
    }
  
    return os;
}

function isExplorer() {
    return BrowserDetect.browser == "Explorer";
}

function isOpera() {
    return BrowserDetect.browser == "Opera";
}

function isSafari() {
    return BrowserDetect.browser == "Safari";
}

function isFirefox() {
    return BrowserDetect.browser == "Firefox";
}

/**
 * Safari does not support onchange event in radio buttons for v1 and v2, it is
 * fixed in v3 .  A fix for this is to call this method from within the onclick
 * event.  NOTE when checking a version of Safari the webkit version is returned.
 * You will need to check here to see what version of Safari it correlates to.
 * http://developer.apple.com/internet/safari/uamatrix.html
 */
function safariFireOnChange(radio) {
    if(BrowserDetect.browser == "Safari" && BrowserDetect.version < 500) {
        radio.onchange();
    }
}

function isBrowserSupported() {
    var browserOk = true;
    var browser = BrowserDetect.browser;
    var version = BrowserDetect.version;

    if (browser == "Chrome" && version < 1.0) {
        browserOk = false;
    }

    // verify the firefox revision
    else if (browser == "Firefox" && version < 1.5) {
        browserOk = false;
    }

    // verify the IE revision
    else if (browser == "Explorer" && version < 6) {
        browserOk = false;
    }

    // verify the Safari revision
    else if (browser == "Safari" && version < 125) {
        browserOk = false;
    }

    // verify the Opera revision
    else if (browser == "Opera" && version < 9) {
        browserOk = false;
    }

    return browserOk;
}

function isDayLightSavings() {

    var objDate_now = new Date();
	var intTimezone_now	= objDate_now.getTimezoneOffset();
	var intFullYear_now	= objDate_now.getFullYear();

	var intTimezone_now_tzstring = getTimezoneString(objDate_now, false);

	var objDate_month1	= new Date("1 Jan " + intFullYear_now + " 00:00:00 " + getTimezoneString(objDate_now, true));
	var objDate_month7	= new Date("1 Jul " + intFullYear_now + " 00:00:00 " + getTimezoneString(objDate_now, true));
	var objDate_month12	= new Date("1 Dec " + intFullYear_now + " 00:00:00 " + getTimezoneString(objDate_now, true));

	var intTimezone_month1	= objDate_month1.getTimezoneOffset();
	var intTimezone_month7	= objDate_month7.getTimezoneOffset();
	var intNSHemisphere		= null;
	var blnDaylightSaving	= false;


	if (intTimezone_month1 != intTimezone_month7) {
		intNSHemisphere = intTimezone_month1 > intTimezone_month7 ? 1 : 2;

		// Calculate boths dates at which clocks change
		var objDaylightStart = intNSHemisphere == 1 ?
                                  getDaylightSavingDay(objDate_month1, objDate_month7) :
                                  getDaylightSavingDay(objDate_month7, objDate_month12);
		var objDaylightEnd = intNSHemisphere == 1 ?
                                    getDaylightSavingDay(objDate_month7, objDate_month12) :
                                    getDaylightSavingDay(objDate_month1, objDate_month7);

        blnDaylightSaving = objDaylightStart.getTimezoneOffset() == objDate_now.getTimezoneOffset();
    }

    return blnDaylightSaving;
}

function getDaylightSavingDay(objIterationMin, objIterationMax) {
	var objTestDateOld	= new Date(objIterationMin);
	var objTestDate		= new Date(objIterationMax);

	while(Math.abs(objTestDate.valueOf() - objTestDateOld.valueOf()) > 0) {

        objTestDateOld = objTestDate;
		objTestDate = new Date(objIterationMin.valueOf() +
                               Math.round((objIterationMax.valueOf() - objIterationMin.valueOf()) / 2));

        if (objTestDate.getTimezoneOffset() == objIterationMin.getTimezoneOffset()) {
			objIterationMin = objTestDate;
		} else {
			objIterationMax = objTestDate;
		}
	}
    
    return objTestDate;
}

function getTimezoneString(objInputDate, blnJsDateCompat) {
	var objDate = new Date(objInputDate);

	var intDateTZ				= objDate.getTimezoneOffset();
	var strDateTZ_sign			= (intDateTZ > 0 ? "-" : "+")
	var intDateTZ_hours			= Math.floor(Math.abs(intDateTZ) / 60);
	var intDateTZ_minutes		= Math.abs(intDateTZ_hours - (Math.abs(intDateTZ) / 60)) * 60;
	var strDateTZ_normalised	= (blnJsDateCompat ? "UTC" : "GMT") + strDateTZ_sign +
                                  getPrefixChar(intDateTZ_hours, "0", 2) +
                                  (blnJsDateCompat ? "" : ":") +
                                  getPrefixChar(intDateTZ_minutes, "0", 2);

	return strDateTZ_normalised;
}

function getPrefixChar(strValue, strCharPrefix, intLength) {
	var intStrValue_length = String(strValue).length;
	if (intStrValue_length < intLength) {
		for (var intI=0; intI<(intLength-intStrValue_length); ++intI) {
			strValue = strCharPrefix + strValue;
		}
	}
	return strValue;
}