/*
  Knowmax Browser features

    Provides support for determining browser features.
    Relies on following libraries:
    - Prototype JavaScript library;
    - SWFObject;
    - Knowmax Measurement Utility Unit for JavaScript.

  version 1.3.3 - june 18 2007
    - Added "k_eventid: 'user.browser.features'" in addition to "k_event" because some 
      applications/queries use "eventid" instead of "event"
  version 1.3.2 - june 13 2007
    - Changed definition for 'p_window_offscreenBuffering' to return string values instead of -1 when undefined
    - Now uses "typeof != 'undefined'" for compatMode, xmlEncoding and xmlVersion too
  version 1.3.1 - june 6 2007
    - Set REQUIRED_PROTOTYPE to '1.5.0' (was '1.5.1').
  version 1.3.0 - june 6 2007
    - Added function 'buildversion'
    - Changed function 'version' to include 'buildversion'
    - changed return value to -1 instead of 'undefined' for features that return numeric value
    - changed return value to 'undefined' instead of ''
  version 1.2 - may 23 2007
    - added Flash Player detection with SWFObject
    - detect window dimensions with Knowmax Measurement Utility
  version 1.1 - may 22 2007
    - added browser specific (IE) features for script engine
    - commented out 'not client specific' features, leave in code
  version 1.0 - april 11 2007
    - initial version

  Todo:
    - iets met REQUIRED_SWFOBJECT vgl prototype (maar zit niet in de library, zelf uitbreiden of verzoeken)
    - implement Media Player detection?
    - implement Acrobat Reader detection?

  Notes:
    - mimetypes and plugins array cannot be questioned in IE

  (c) 2007 Knowmax
*/

var KMBrowserFeatures = {
  majorversion: function() {
    return 1;
  },

  minorversion: function() {
    return 3;
  },

  buildversion: function() {
    return 3;
  },

  version: function() {
    return this.majorversion() + "." + this.minorversion() + "." + this.buildversion();
  },

  // Internally called to set default values.
  _construct: function() {
    this._initialized = false;
    this._enabled = true;
    this._browserfeatures = null;
  },  	
	
	REQUIRED_PROTOTYPE: '1.5.0',
	REQUIRED_KMMEASUREMENT: '1.3.0',
	REQUIRED_SWFOBJECT: '1.5.0',
	
  initialize: function() {
    if (!this._initialized) {
      function convertVersionString(versionString){
        var r = versionString.split('.');
        return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
      }

      if ((typeof Prototype =='undefined') ||
          (typeof Element == 'undefined') ||
          (typeof Element.Methods=='undefined') ||
          (convertVersionString(Prototype.Version) < convertVersionString(KMBrowserFeatures.REQUIRED_PROTOTYPE))) {
        throw("KMBrowserFeatures requires the Prototype JavaScript framework >= " + KMBrowserFeatures.REQUIRED_PROTOTYPE);       	
      }
      else if (convertVersionString(KMMeasurement.version()) < convertVersionString(KMBrowserFeatures.REQUIRED_KMMEASUREMENT)) {
        throw("KMBrowserFeatures requires the Knowmax Measurement Utility Unit  >= " + KMBrowserFeatures.REQUIRED_KMMEASUREMENT);
      }  
      else {
        this.setBrowserFeatures();
        this._initialized = true;
        return true;
      }
    } else {
      return true;
    }
  },

  setBrowserFeatures: function() {
    // try to set cookie, needed for document_cookie
    try {
      document.cookie = "cookies=true";
    }
    catch(err) {
    }
    // collect browserfeatures in hash
	 	try {
	 	  var list = new Hash({
	 	    k_event: 'user.browser.features',
	 	    k_eventid: 'user.browser.features',
	 	    k_module: 'kmbrowserfeatures',
        p_document_all: (document.all) ? 'true' : 'false',
        p_document_anchors: (document.anchors) ? 'true' : 'false',
        p_document_applets: (document.applets) ? 'true' : 'false',
        //document_characterSet: (document.characterSet) ? document.characterSet : 'undefined',
        p_document_compatMode: (typeof document.compatMode != 'undefined') ? document.compatMode : 'undefined',
        //document_contentType: (document.contentType) ? document.contentType : 'undefined',
        p_document_cookie: (document.cookie) ? 'true' : 'false',
        //document_defaultCharset: (document.defaultCharset) ? document.defaultCharset : 'undefined',
        //document_defaultView: (document.defaultView) ? document.defaultView : 'undefined',
        //document_designMode: (document.designMode) ? document.designMode : 'undefined',
        //document_dir: (document.dir) ? document.dir : 'undefined',
        //document_doctype: (document.doctype) ? document.doctype : 'undefined',
        p_document_documentElement: (document.documentElement) ? 'true' : 'false',
        //document_domain: (document.domain) ? document.domain : 'undefined',
        p_document_forms: (document.forms) ? 'true' : 'false',
        p_document_getElementById: (document.getElementById) ? 'true' : 'false',
        p_document_getElementsByTagName: (document.getElementsByTagName) ? 'true' : 'false',
        p_document_images: (document.images) ? 'true' : 'false',
        //document_inputEncoding: (document.inputEncoding) ? document.inputEncoding : 'undefined',
        p_document_layers: (document.layers) ? 'true' : 'false',
        p_document_links: (document.links) ? 'true' : 'false',
        //document_media: (document.media) ? document.media : 'undefined',
        //document_protocol: (document.protocol) ? document.protocol : 'undefined',
        //document_readyState: (document.readyState) ? document.readyState : 'undefined',
        //document_security: (document.security) ? document.security : 'undefined',
        p_document_strictErrorChecking: (document.strictErrorChecking) ? 'true' : 'false',
        p_document_styleSheets: (document.styleSheets) ? 'true' : 'false',
        // BO:: DOM Level 3 XML declarations
        p_document_xmlEncoding: (typeof document.xmlEncoding != 'undefined') ? document.xmlEncoding: 'undefined',
        p_document_xmlStandalone: (document.xmlStandalone) ? 'true' : 'false',
        p_document_xmlVersion: (typeof document.xmlVersion != 'undefined') ? document.xmlVersion: 'undefined',
        // EO:: DOM Level 3 XML declarations
	 	    //navigator_appCodeName: navigator.appCodeName ? navigator.appCodeName : 'undefined',
	 	    //navigator_appMinorVersion: navigator.appMinorVersion ? navigator.appMinorVersion : 'undefined',
	 	    //navigator_appName: navigator.appName ? navigator.appName : 'undefined',
	 	    //navigator_appVersion: navigator.appVersion ? navigator.appVersion : 'undefined',
	 	    //navigator_buildID: navigator.buildID? navigator.buildID : 'undefined',
	 	    p_navigator_browserLanguage: (typeof navigator.browserLanguage != 'undefined') ? navigator.browserLanguage : 'undefined',
	 	    p_navigator_cookieEnabled: (typeof navigator.cookieEnabled != 'undefined') ? navigator.cookieEnabled : 'undefined',
	 	    p_navigator_cpuClass: (typeof navigator.cpuClass != 'undefined') ? navigator.cpuClass : 'undefined',
	 	    p_navigator_javaEnabled: navigator.javaEnabled(),
	 	    p_navigator_language: (typeof navigator.language != 'undefined') ? navigator.language : 'undefined',
	 	    //navigator_mimeTypes: navigator.mimeTypes ? this.flattenMimeTypesArray(navigator.mimeTypes) : 'undefined',
	 	    //navigator_onLine: navigator.onLine ? navigator.onLine : 'undefined',
	 	    p_navigator_oscpu: (typeof navigator.oscpu != 'undefined') ? navigator.oscpu : 'undefined',
	 	    //navigator_opsProfile: navigator.opsProfile ? navigator.opsProfile : 'undefined',
	 	    p_navigator_platform: (typeof navigator.platform != 'undefined') ? navigator.platform : 'undefined',
	 	    //navigator_plugins: navigator.plugins ? this.flattenPluginsArray(navigator.plugins) : 'undefined',
	 	    //navigator_product: navigator.product ? navigator.product : 'undefined',
	 	    //navigator_productSub: navigator.productSub ? navigator.productSub : 'undefined',
	 	    //navigator_securityPolicy: navigator.securityPolicy ? navigator.securityPolicy : 'undefined',
	 	    p_navigator_systemLanguage: (typeof navigator.systemLanguage != 'undefined') ? navigator.systemLanguage : 'undefined',
	 	    //navigator_taintEnabled: navigator.taintEnabled(),
	 	    //navigator_userAgent: navigator.userAgent ? navigator.userAgent : 'undefined',
	 	    p_navigator_userLanguage: (typeof navigator.userLanguage != 'undefined') ? navigator.userLanguage : 'undefined',
	 	    p_navigator_userProfile: (typeof navigator.userProfile != 'undefined') ? navigator.userProfile : 'undefined',
	 	    //navigator_vendor: navigator.vendor ? navigator.vendor : 'undefined',
	 	    //navigator_vendorSub: navigator.vendorSub ? navigator.vendorSub : 'undefined',
	 	    //plugins_acrobatreader: 'undefined',
	 	    p_plugins_flashplayer: this.getFPVersion(),
	 	    //plugins_mediaplayer: 'undefined',
        p_script_engine: (typeof ScriptEngine == 'function') ? ScriptEngine() : 'undefined',
        p_script_engine_version: this.getSEVersion(),
        //window_defaultStatus: (window.defaultStatus) ? window.defaultStatus : 'undefined',
        p_window_frames: (window.frames) ? 'true' : 'false',
        //window_fullScreen: (typeof window.fullScreen != 'undefined') ? window.fullScreen : 'undefined',
        p_window_innerrect_height: KMMeasurement.getInnerRect(self).height,
        p_window_innerrect_width: KMMeasurement.getInnerRect(self).width,
        p_window_offscreenBuffering: (typeof window.offscreenBuffering != 'undefined') ? window.offscreenBuffering.toString() : 'undefined',
      	p_window_option: (window.Option) ? 'true' : 'false',
      	p_window_outer_height: (typeof window.outerHeight != 'undefined') ? window.outerHeight : -1,
      	p_window_outer_width: (typeof window.outerWidth != 'undefined') ? window.outerWidth : -1,
      	p_window_regexp: (window.RegExp) ? 'true' : 'false',
	 	    //window_screen: window.screen ? 'true' : 'false',
	 	    p_window_screen_availHeight: (typeof window.screen.availHeight != 'undefined') ? window.screen.availHeight : -1,
	 	    //window_screen_availLeft: (typeof window.screen.availLeft != 'undefined') ? window.screen.availLeft : -1,
	 	    //window_screen_availTop: (typeof window.screen.availTop != 'undefined') ? window.screen.availTop : -1,
	 	    p_window_screen_availWidth: (typeof window.screen.availWidth != 'undefined') ? window.screen.availWidth : -1,
	 	    p_window_screen_bufferDepth: (typeof window.screen.bufferDepth != 'undefined') ? window.screen.bufferDepth : -1,
	 	    p_window_screen_colorDepth: (typeof window.screen.colorDepth != 'undefined') ? window.screen.colorDepth : -1,
	 	    p_window_screen_deviceXDPI: (typeof window.screen.deviceXDPI != 'undefined') ? window.screen.deviceXDPI : -1,
	 	    p_window_screen_deviceYDPI: (typeof window.screen.deviceYDPI != 'undefined') ? window.screen.deviceYDPI : -1,
	 	    p_window_screen_fontSmoothingEnabled: (typeof window.screen.fontSmoothingEnabled != 'undefined') ? 'true' : 'false',
	 	    p_window_screen_height: (typeof window.screen.height != 'undefined') ? window.screen.height : -1,
	 	    //window_screen_left: (typeof window.screen.left != 'undefined') ? window.screen.left : -1,
	 	    p_window_screen_logicalXDPI: (typeof window.screen.logicalXDPI != 'undefined') ? window.screen.logicalXDPI : -1,
	 	    p_window_screen_logicalYDPI: (typeof window.screen.logicalYDPI != 'undefined') ? window.screen.logicalYDPI : -1,
	 	    window_screen_pixelDepth: (typeof window.screen.pixelDepth != 'undefined') ? window.screen.pixelDepth : -1,
	 	    //window_screen_top: (typeof window.screen.top != 'undefined') ? window.screen.top : -1,
	 	    p_window_screen_updateinterval: (typeof window.screen.updateinterval != 'undefined') ? window.screen.updateinterval : -1,
	 	    p_window_screen_width: (typeof window.screen.width != 'undefined') ? window.screen.width : -1,
	 	    //window_screenLeft: (typeof window.screenLeft != 'undefined') ? window.screenLeft :-1,
	 	    //window_screenTop: (typeof window.screenTop != 'undefined') ? window.screenTop : -1,
	 	    //window_screenX: (typeof window.screenX != 'undefined') ? window.screenX : -1,
	 	    //window_screenY: (typeof window.screenY != 'undefined') ? window.screenY : -1,
        p_window_XMLHttpRequest: (window.XMLHttpRequest) ? 'true' : 'false'
	 		  });
	 		  this._browserfeatures = list;
	  } catch(err) {
	    //KMBrowserFeatures.disableBrowserFeatures();	
	  }
  },

  getBrowserFeatures: function() {
    // returns browserfeatures as hash
	 	try {
	 	  var list = this._browserfeatures;
	 	  return list;
	  } catch(err) {
	    KMBrowserFeatures.disableBrowserFeatures();	
	  }
  },

  flattenMimeTypesArray: function(mimeTypesArray) {
    // returns mimeTypesArray as {|, ||} seperated string
	 	try {
	 	  var mimeTypesString = '';
	 	  var i = 0;
      for (i = 0; i < mimeTypesArray.length; i++) {
  	 	  mimeTypesString += mimeTypesArray[i].type ? mimeTypesArray[i].type : '';
  	 	  mimeTypesString += mimeTypesArray[i].description ? '|' + mimeTypesArray[i].description : '';
  	 	  mimeTypesString += mimeTypesArray[i].suffixes ? '|' + mimeTypesArray[i].suffixes : '';
  	 	  mimeTypesString += mimeTypesArray[i].enabledPlugin ? '|' + mimeTypesArray[i].enabledPlugin.name : '';
  	 	  mimeTypesString += mimeTypesArray[i].type ? '||' : '';
    }
	 	  return mimeTypesString;
	  } catch(err) {
	    //KMBrowserFeatures.disableBrowserFeatures();	
	  }
  },

  flattenPluginsArray: function(pluginsArray) {
    // returns pluginsArray as {|, ||} seperated string
	 	try {
	 	  var pluginsString = '';
	 	  var i = 0;
      for (i = 0; i < pluginsArray.length; i++) {
  	 	  pluginsString += pluginsArray[i].name ? pluginsArray[i].name : '';
  	 	  pluginsString += pluginsArray[i].description ? '|' + pluginsArray[i].description : '';
  	 	  pluginsString += pluginsArray[i].fileName ? '|' + pluginsArray[i].fileName : '';
  	 	  pluginsString += pluginsArray[i].length ? '|' + pluginsArray[i].length : '';
  	 	  pluginsString += pluginsArray[i].name ? '||' : '';
      }
	 	  return pluginsString;
	  } catch(err) {
	    //KMBrowserFeatures.disableBrowserFeatures();	
	  }
  },
  
  getFPVersion: function() {
    // try to determine Flash Player version
    try {
      var flashplayerversion = '';
			var so = new SWFObject();
      flashplayerversion = so.installedVer.major + '.' + so.installedVer.minor + '.' + so.installedVer.rev;
      return flashplayerversion;
    }
    catch(err) {
	    //KMBrowserFeatures.disableBrowserFeatures();	
    }  
  },


  getSEVersion: function() {
    // try to determine Script Engine version (IE only)
    var scriptengineversion = 'undefined';
    try {
      var scriptenginemajorversion = (typeof ScriptEngineMajorVersion == 'function') ? ScriptEngineMajorVersion() : '';
      var scriptengineminorversion = (typeof ScriptEngineMinorVersion == 'function') ? ScriptEngineMinorVersion() : '';
      var scriptenginebuildversion = (typeof ScriptEngineBuildVersion == 'function') ? ScriptEngineBuildVersion() : '';
      scriptengineversion = scriptenginemajorversion + '.' + scriptengineminorversion + '.' + scriptenginebuildversion;
      if (scriptengineversion == '..') {
        scriptengineversion = 'undefined';
      }
      return scriptengineversion;
    }
    catch(err) {
      //KMBrowserFeatures.disableBrowserFeatures();	
    }  
  },

  // Checks whether this instance is initialized.
  initialized: function() {
    return this._initialized;
  },

  disableBrowserFeatures: function() {
  	this._enabled = false;
  }

}

KMBrowserFeatures._construct();

