// JavaScript by Jeffrey Ouma. Copyright© 2008-2011 artkenya.net Ltd. All rights reserved.
// YAHOO GLOBAL VARIABLES
Connect = YAHOO.util.Connect;
Dom = YAHOO.util.Dom;
Easing = YAHOO.util.Easing;
Event = YAHOO.util.Event;
// BLEEZ NAMESPACE: The namespace that holds all common site functions.
BLEEZ = {};
// UTILITIES: Defines common utility functions that help with the deployment of the CMS sitewide.
BLEEZ.util = {};
// SCRUB LINKS: Removes the dotted border that appears around links after they have been clicked.
BLEEZ.util.Scrub = function(obj) {
  if(obj.blur) {
    obj.blur();
  }
};
// DIMENSIONS: An extension of YUI's getRegion Dom utility. Returns left, right, top and bottom coordinates as well as height and width dimensions.
BLEEZ.util.Dimensions = function(elm) {
  var d = new Array;
  var region = Dom.getRegion(elm);
  d["left"] = region.left;
  d["right"] = region.right;
  d["width"] = region.right - region.left;
  d["center"] = region.left + (region.right - region.left) / 2;
  d["top"] = region.top;
  d["bottom"] = region.bottom;
  d["height"] = region.bottom - region.top;
  d["middle"] = region.top + (region.bottom - region.top) / 2;
  return d;
};
// SCROLL: Set of functions to scroll the main window.
BLEEZ.util.scroll = {
  Vertical: function(scrollElm, t, y, e) {
    // Initialize variables
    if(!t)
      t = 1;
    if(!y)
      y = 0;
    if(!e)
      e = Easing.easeOut;
    if(!Dom.get(scrollElm))
      scrollElm = (!document.documentElement.scrollTop && document.body.scrollTop) ? document.body : document.documentElement;
    var anim = new YAHOO.util.Scroll(scrollElm, {
      scroll: {
        to: [ Dom.getDocumentScrollLeft(), y ]
      }
    }, t, e);
    anim.animate();
  },
  Horizontal: function(scrollElm, t, x, e) {
    // Initialize variables
    if(!t)
      t = 1;
    if(!x)
      x = 0;
    if(!e)
      e = Easing.easeOut;
    if(!Dom.get(scrollElm))
      scrollElm = (!document.documentElement.scrollTop && document.body.scrollTop) ? document.body : document.documentElement;
    var anim = new YAHOO.util.Scroll(scrollElm, {
      scroll: {
        to: [ x, Dom.getDocumentScrollTop() ]
      }
    }, t, e);
    anim.animate();
  }
};
// KeyCode: Checks keypress events for non-fuction characters. Returns true if a letter, number, space or special character was pressed.
BLEEZ.util.KeyCode = function(c) {
  if(c > 46 && c != 91 && c != 92 && c != 93 && c != 112 && c != 113 && c != 114 && c != 115 && c != 116 && c != 117 && c != 118
    && c != 119 && c != 120 && c != 121 && c != 122 && c != 123 && c != 144 && c != 145) {
    return true;
  } else {
    return false;
  }
};
// REGULAR EXPRESSIONS: These functions use a set of predefined regular expressions to validate common form fields. Used mainly in conjunction with the BLEEZ.form
BLEEZ.util.regX = {
  Name: function(str) {
    var re = /^([A-Za-z]([A-Za-z\-\']*[A-Za-z\',\.]\s?)?)+$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Surname: function(str) {
    var re = /^([A-Za-z]([A-Za-z\-\']*[A-Za-z\']\s?)?)+$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Password: function(str) {
    var re = /^[A-Za-z0-9\!\@\#\$\%\^\&\*]{4,32}$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Email: function(str) {
    var re = /^[A-Za-z0-9]([A-Za-z0-9_\-\.]*[A-Za-z0-9])?@[A-Za-z0-9]([A-Za-z0-9_\-\.\']*\.)+[A-Za-z0-9]+$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  URIDomain: function(str) {
    var re = new RegExp(
      "^(((ht|f)tp(s?))\\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\\-\\.]+\\.([A-Za-z]{2,3})(\\.[A-Za-z]{2})?(\\:[0-9]+)*(/($|[a-zA-Z0-9\\.\\,\\;\\?\\'\\\\\\+&amp;%\\$#\\=~_\\-()]+))*$");
    return re.test(BLEEZ.util.format.Trim(str));
  },
  URIScheme: function(str) {
    var re = new RegExp("^(((ht|f)tp(s?))\\://)");
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Filename: function(str, limit) {
    if(limit) {
      var re = /^\d{1," + limit + "}$/;
      if(!re.test(BLEEZ.util.format.Trim(str)))
        return false;
    }
    var re = /^([A-Z0-9_\-()]*[A-Z0-9)])+\.[A-Z0-9]{2,4}$/i;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Phone: function(str) {
    var re = /^(((\+?\d{2,3}(\s|(\s?\-\s?)))?((\(\d{1,4}\)\s*)|(\d{1,4}(\s|(\s?\-\s?)))))?\d{4,}(\-\d{1,4})?(\s([xX]|[eE][xX][tT])\.*\s(\d{1,7}))?((\s*,\s*)|(\s*\/\s*)|(\s*)))+$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Duration: function(str) {
    var re = /(\d{1,2}:)?\d{1,2}:\d{1,2}/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Integer: function(str, limit) {
    if(limit) {
      var re = /^\d{1," + limit + "}$/;
      if(!re.test(BLEEZ.util.format.Trim(str)))
        return false;
    }
    var re = /^\d$/;
    return re.test(BLEEZ.util.format.Trim(str));
  },
  Decimal: function(str) {
    str = BLEEZ.util.format.Trim(str);
    if(str) {
      var re = /^\d+(\.\d+)?$/;
      return re.test(str);
    }
    return true;
  },
  DefaultValue: function(str1, str2) {
    return (BLEEZ.util.format.DefaultValue(str1) == BLEEZ.util.format.DefaultValue(str2));
  },
  PasswordStrength: function(str) {
    var re, score;
    if(!str) {
      str = "";
    }
    // If the password is valid
    if(!BLEEZ.util.regX.Password(str)) {
      return 0;
    } else {
      str = BLEEZ.util.format.Trim(str);
      score = 1;
      // If the password is 7 or more chars, credit one score
      if(str.length > 6) {
        score += 1;
      }
      // If the password has a mix of upper and lower case letters
      re = /[a-z]+/;
      var result = re.test(str);
      re = /[A-Z]+/;
      var result2 = re.test(str);
      if(result && result2) {
        score += 1;
      }
      // If the password contains numbers
      re = /[0-9]+/;
      if(re.test(str)) {
        score += 1;
      }
      // If the password contains special chars
      re = /[\!\@\#\$\%\^\&\*]+/;
      if(re.test(str))
        score += 1;
      return score * 20 / 100;
    }
  },
  RegExp: function(str) {
    return str.replace(/([.?*+^$[\]\\(){}-])/g, "\\$1");
  }
// End of BLEEZ.util.regX
};
// TEXT FORMATTING: These functions apply special formatting to text e.g. title case and trim
BLEEZ.util.format = {
  Title: function(str) {
    var newStr, strArr = str.split(" ");
    for( var i = 0; i < strArr.length; i++) {
      var s = strArr[i].substr(0, 1);
      if(i == 0) {
        newStr = "";
      } else {
        newStr += " ";
      }
      newStr += s.toUpperCase() + strArr[i].substr(1, strArr[i].length - 1);
    }
    return newStr;
  },
  Trim: function(str) {
    if(str) {
      // Remove leading spaces
      str = str.replace(/^\s+/, "");
      // Remove multiple spaces in between
      // str = str.replace(/\s{2,}/g, " ");
      // Remove trailing spaces
      str = str.replace(/\s+$/, "");
    }
    return str;
  },
  DefaultValue: function(str) {
    if(str) {
      str = str.replace(/\-/g, "");
      str = BLEEZ.util.format.Trim(str);
      return str.toLowerCase();
    } else {
      return false;
    }
  }
// End of BLEEZ.util.format
};
BLEEZ.util.RemoveTag = function(str, startTag, endTag) {
  var startPos = str.indexOf(startTag);
  var endPos = str.indexOf(endTag, startPos) + endTag.length;
  // Remove all tags
  // alert("\"" + startTag + "\" (" + startPos + "), " + "\"" + endTag + "\" (" + endPos + ")");
  while(startPos > -1 && endPos > -1 && startPos > endPos) {
    var strSlice = str.slice(startPos, endPos);
    // alert(strSlice);
    str = str.replace(strSlice, "");
    startPos = str.indexOf(startTag);
    endPos = str.indexOf(endTag, startPos) + endTag.length;
    // alert("\"" + startTag + "\" (" + startPos + "), " + "\"" + endTag + "\" (" + endPos + ")");
  }
  return str;
};
// READ XML: These functions assist in reading results from XML
BLEEZ.util.readXML = {
  // Methods for reading xml documents returned by async requests
  Data: function(xmlResponse, tag) {
    // Retrieve the value of a node by referencing the tagname
    if(xmlResponse.getElementsByTagName(tag).length == 0) {
      return "";
    } else if(xmlResponse.getElementsByTagName(tag).item(0).firstChild == null) {
      return "";
    } else {
      return xmlResponse.getElementsByTagName(tag).item(0).firstChild.data;
    }
    // End of BLEEZ.util.readXML.Data
  },
  Array: function(xmlResponse, tag) {
    // Retrieve the value of a node by referencing the tagname
    switch(xmlResponse.getElementsByTagName(tag).length) {
      case 0:
        return false;
      case 1:
        var xmlParent = xmlResponse.getElementsByTagName(tag).item(0);
        var xmlArray = new Array();
        if(!xmlParent.childNodes) {
          return false;
        }
        for( var i = 0; i < xmlParent.childNodes.length; i++) {
          if(xmlParent.childNodes[i].childNodes.length) {
            xmlArray[xmlParent.childNodes[i].tagName] = xmlParent.childNodes[i].firstChild.data;
          }
        }
        return xmlArray;
      default:
        var xArr = new Array(), elArr = xmlResponse.getElementsByTagName(tag);
        for (var i = 0; i < elArr.length; i++) {
          if(elArr[i].childNodes) {
            var chArr = new Array();
            for(var x = 0; x < elArr[i].childNodes.length; x++) {
              if(elArr[i].childNodes[x].childNodes.length) {
                chArr[elArr[i].childNodes[x].tagName] = elArr[i].childNodes[x].firstChild.data;
              }
            }
            xArr.push(chArr);
          }
        }
        return xArr;
    }
  }
};
// SET DROPDOWN ITEM: Sets the selected property of a given dropdown (select) menu item.
BLEEZ.util.SetDropDownItem = function(target, x) {
  target = Dom.get(target);
  if(target.tagName.toLowerCase() != "select") {
    return false;
  }
  if(!target.options) {
    return;
  }
  for( var i = 0; i < target.options.length; i++) {
    if(target.options[i].value == x) {
      target.options[i].selected = true;
    }
  }
};
// FILE SIZE: Converts a raw file size into a more meningful number denoted by a byte unit. Arguments: fSize - the raw file size.
BLEEZ.util.FileSize = function(fSize) {
  var suffix = " bytes";
  if(fSize > 1023) {
    suffix = " KB";
    fSize = fSize / 1024;
  }
  if(fSize > 1023) {
    suffix = " MB";
    fSize = fSize / 1024;
  }
  if(fSize > 1023) {
    suffix = " GB";
    fSize = fSize / 1024;
  }
  if(fSize > 1023) {
    suffix = " TB";
    fSize = fSize / 1024;
  }
  fSize = fSize.toFixed(2);
  fSize = fSize + suffix;
  return fSize;
};
// COOKIE ENABLED: Checks the browser to see if cookies are enabled. No arguments
BLEEZ.util.cookieEnabled = function() {
  var cookiesOn = (navigator.cookieEnabled) ? true : false;
  // If not IE4+ nor NS6+
  if(typeof navigator.cookieEnabled == "undefined" && !cookiesOn) {
    document.cookie = "testcookie";
    cookiesOn = (document.cookie.indexOf("testcookie") != -1) ? true : false;
  }
  return cookiesOn;
};
// BROWSER DETECTION: NOTE: This script will only continue to work if you regularly check whether newer browsers still follow the rules set forth in the dataBrowser and dataOS arrays. The dataBrowser array is filled with objects that contain the properties that help the script detect your users' browser.
BLEEZ.util.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: "Google 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: "Internet 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"
  } ]
// End of BLEEZ.util.browserDetect
};

