function isClientSupportPoli() {
  return isOsSupportPoli() != 0 && isBrowserSupportPoli() != 0 && isDotNetSupportPoli() != 0;
}

function isBrowserSupportPoli() {
  if (isBrowserInWhitelist()) {
    return 1;
  } else if (isBrowserInBlacklist()) {
    return 0;
  } 
  return 2;
}

function isBrowserInWhitelist() {
  uas = navigator.userAgent;
  if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
    var ieversion = new Number(RegExp.$1) // capture x.x portion and store as a number
    if (ieversion > 6){
      return true;
    } else if (ieversion == 6 && (/SV1/.test(uas))){
      return true;
    }
  } else if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Firefox/x.x
    var ffversion = new Number(RegExp.$1) // capture x.x portion and store as a number
    if (ffversion >= 1.5){
      return true;
    }
  }
  return false;
}

function isBrowserInBlacklist() {
  uas = navigator.userAgent
  if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
    var ieversion = new Number(RegExp.$1) // capture x.x portion and store as a number
    if (ieversion < 6){
      return true;
    } else if (ieversion == 6 && !(/SV1/.test(uas))){
      return true;
    }
  } else if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Firefox/x.x
    var ffversion = new Number(RegExp.$1) // capture x.x portion and store as a number
    if (ffversion < 1.5){
      return true;
    }
  } else if (uas.indexOf("Chrome")>=0 ||
      uas.indexOf("AppleWebKit")>=0 || uas.indexOf("Safari")>=0 ||
      uas.indexOf("Opera")>=0) {
    return true;
  } 
  return false;
}

function isBrowserFirefox() {
  return (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent));
}

function isBrowserIE6() {
  return (/MSIE 6.0/.test(navigator.userAgent));
}

function isOsSupportPoli() {
  if (isOSInWhitelist()) {
    return 1;
  } else if (isOSInBlacklist()) {
    return 0;
  }
  return 2;
}

function isOSInWhitelist() {
  uas = navigator.userAgent;
  if (/Windows[\/\s]NT[\/\s](\d\.\d+)/.test(uas)){
    var osVersion = new Number(RegExp.$1)
    if (osVersion == 5.1 || osVersion == 6.0 || osVersion == 6.1) {
      return true;
    }
  } else if (/Windows[\/\s]XP/.test(uas)){
    return true;
  }
  return false;
} 

function isOSInBlacklist() {
  uas = navigator.userAgent;
  if (uas.indexOf("Win16")>=0 ||
    uas.indexOf("Windows 95")>=0 || uas.indexOf("Win95")>=0 || uas.indexOf("Windows_95")>=0 ||
    uas.indexOf("Windows 98")>=0 || uas.indexOf("Win98")>=0 || 
    uas.indexOf("Windows NT 5.0")>=0 || uas.indexOf("Windows 2000")>=0 || 
    uas.indexOf("Windows NT 4.0")>=0 || uas.indexOf("WinNT4.0")>=0 ||  uas.indexOf("WinNT")>=0 || 
    uas.indexOf("Windows ME")>=0 ||
    uas.indexOf("Windows CE")>=0 ||
    uas.indexOf("Win 9x 4.90")>=0 ||
    uas.indexOf("OpenBSD")>=0 ||
    uas.indexOf("SunOS")>=0 ||
    uas.indexOf("Linux")>=0 || uas.indexOf("X11")>=0 ||
    uas.indexOf("Mac_PowerPC")>=0 || uas.indexOf("Macintosh")>=0 || uas.indexOf("Mac")>=0) {
    return true;
  }
  return false;
} 

function isDotNetSupportPoli() {
  if (isDotNetInWhitelist()) {
    return 1;
  } else if (isDotNetInBlacklist()) {
    return 0;
  }
  return 2;
}

function isDotNetInWhitelist() {
  uas = navigator.userAgent; 
  arr = uas.split(/[(;)]/);
  for (i=0; i<arr.length; i++) {
    ss = arr[i];
    if (/\.NET\sCLR\s(\d+\.\d+)/.test(arr[i])){ //test for .NET x.x;
      curVersion = RegExp.$1;
      if (curVersion >= 2) {
        return true;
      }
    }   
  } 
  return false;
}

function isDotNetInBlacklist() {
  uas = navigator.userAgent; 
  arr = uas.split(/[(;)]/);
  dotNetName = '';
  version = -1;
  for (i=0; i<arr.length; i++) {
    ss = arr[i];
    if (/\.NET\sCLR\s(\d+\.\d+)/.test(arr[i])){ //test for .NET x.x;
      curVersion = RegExp.$1;

      if (curVersion > version) {
        dotNetName = RegExp.lastMatch; 
        version = curVersion;
        
      }
    }   
  }

  if (dotNetName.length == 0) {
    return true;
  } else if (version < 2) {
    return true;
  }
  return false;
}

function getBrowserName() {
  uas = navigator.userAgent;
  if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)){ //test for MSIE x.x;
    uas = RegExp.lastMatch;
  } else if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Firefox/x.x 
    uas = RegExp.lastMatch;
  } else if (/Chrome[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Chrome
    uas = RegExp.lastMatch;
  } else if (/Safari[\/\s](\d+\.\d+)/.test(navigator.userAgent)){ //test for Safari
    uas = RegExp.lastMatch;
  } else {
    uas = navigator.appName + "/" + navigator.appVersion 
  }
  return uas;
}

function getOsName() {
  platform = navigator.oscpu;
  if (typeof platform == 'undefined') {
    platform = navigator.platform;
  }

  uas = navigator.userAgent;
  
  if (findLongestToken(uas, 'Win')) {
    platform = findLongestToken(uas, 'Win');
    if (/Windows[\/\s]NT[\/\s](\d\.\d+)/.test(uas)){
      var osVersion = new Number(RegExp.$1)
      if (osVersion == 5.1 || osVersion == 5.2) {
        platform = "Windows XP";
      } else if (osVersion == 6.0) {
        platform = "Windows Vista";
      } 
    }

  } else if (findLongestToken(uas, 'Mac')) {
    platform = findLongestToken(uas, 'Mac');
  } else if (findLongestToken(uas, 'Linux')) {
    platform = findLongestToken(uas, 'Linux');
  } 
  return platform;
}

function getDotNetName() { 
  uas = navigator.userAgent;
  arr = uas.split(/[(;)]/);
  dotNetName = '';
  version = -1;
  for (i=0; i<arr.length; i++) {
    ss = arr[i];
    if (/\.NET\sCLR\s(\d+\.\d+)/.test(arr[i])){ //test for .NET x.x;
      curVersion = RegExp.$1
      if (curVersion > version) {
        dotNetName = RegExp.lastMatch; 
        version = curVersion;
      }   
    }   
  } 
  return dotNetName;   
}

function findLongestToken(source, token) {
  arr = source.split(/[(;)]/);
  longestToken = '';
  for (i=0; i<arr.length; i++) {
    if (arr[i].indexOf(token) >= 0) {   
      if (typeof longestToken == 'undefined' ) {
        longestToken = arr[i];
      } else if (arr[i].length > longestToken .length) {
        longestToken = arr[i];   
      }
    }
  }
  return longestToken ;
}
