/* ################################################################# */
/*                                                                   */
/*  TITLE:        CN.JS                                              */
/*  SITE:         style.com                                          */
/*  AUTHOR:       Brian Maniere                                      */
/*  VERSION:      0.04                                               */
/*  LAST UPDATED: 2008/06/17                                         */
/*                                                                   */
/*  NAMESPACE: CN                                                    */
/*                                                                   */
/*  PUBLIC FUNCTIONS:                                                */
/*    isDomBrowser()                                                 */
/*    $()                                                            */
/*    addEvent()                                                     */
/*    removeEvent()                                                  */
/*    getElementsByClassName()                                       */ 
/*    toggleDisplay()                                                */
/*    toggleDisplay2()                                               */
/*    preloadImage()                                                 */
/*    toggleClass()                                                  */
/*    swapClass()                                                    */
/*    insertAfter()                                                  */
/*    removeChildren()                                               */
/*    prependChild()                                                 */
/*    randomizeArray()                                               */
/*    isOpera()                                                      */
/*    isSafari()                                                     */
/*    isKDE()                                                        */
/*    isGecko()                                                      */
/*    isNN4()                                                        */
/*    isWinIE()                                                      */
/*    isMac()                                                        */
/*    getQueryParam()                                                */
/*                                                                   */
/*  PRIVATE OBJECTS:                                                 */
/*    Navigator                                                      */
/*                                                                   */
/* ################################################################# */

/* Many of these functions were derived and adapted from the books:
 * Advanced DOM Scripting, Copyright 2007 Friends of Ed
 * JavaScript: The Definitive Guide, 5th Edition, by David Flanagan. Copyright 2006 O'Reilly Media, Inc.
 * Others are home-baked
 */

(function() {

if(!window.CN) {
  window['CN'] = {};
}

function isDomBrowser(other) {
  if(other === false
    || !Array.prototype.push
    || !Object.hasOwnProperty
    || !document.createElement
    || !document.getElementsByTagName
    ) {
    return false;
  }
  return true;
}
window['CN']['isDomBrowser'] = isDomBrowser;

function $() {
  var elements = new Array();
  for (var i=0; i< arguments.length; i++) {
    var element = arguments[i];
    if(typeof element == 'string') {
      element = document.getElementById(element);
    }
    if(arguments.length == 1) {
      return element;
    }
    elements.push(element);
  }
  return elements;
};
window['CN']['$'] = $;

function addEvent(node, type, listener) {
  if(!isDomBrowser()) { return false; }
  if(!(node == $(node))) { return false; }
    // try it via the W3C standard
  if(node.addEventListener) {
    node.addEventListener(type, listener, false);
    return true;
  }
    // otherwise try the IE method
  else if(node.attachEvent) {
    node['e'+type+listener] = listener;
    node[type+listener] = function() {
      node['e'+type+listener](window.event);
    }
    node.attachEvent('on'+type, node[type+listener]);
    return true;
  }
    // if both fail
  return false;
};
window['CN']['addEvent'] = addEvent;

function removeEvent(node, type, listener) {
  if(!(node == $(node))) { return false; }
    // try it via the W3C standard
  if(node.removeEventListener) {
    node.removeEventListener(type,listener,false);
    return true;
  }
    // otherwise try the IE method
  else if (node.detachEvent) {
    node.detachEvent('on'+type, node[type+listener]);
    node[type+listener] = null;
    return true;
  }
    // if both fail
  return false;
};
window['CN']['removeEvent'] = removeEvent;

function getElementsByClassName(className, tag, parent) {
  parent == parent || document;
  if(!(parent = $(parent))) { return false; }
    // locate all matching tags
  var allTags = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag);
  var matchingElements = new Array();
  className = className.replace(/\-/g, "\\-");
  var regex = new RegExp("(^|\\s)" + className + "(\\s|$)");
  var element;
  for(var i=0; i<allTags.length; i++) {
    element = allTags[i];
    if(regex.test(element.className)) {
      matchingElements.push(element);
    }
  }
  return matchingElements;
};
window['CN']['getElementsByClassName'] = getElementsByClassName;

function preloadImage(imgSrc) {
  if (!preloadImage.preloads) {
    preloadImage.preloads = new Array();
  }
  (preloadImage.preloads[preloadImage.preloads.length] = new Image()).src = imgSrc;
}
window['CN']['preloadImage'] = preloadImage;

function toggleDisplay(node, value) {
  if(!(node == $(node))) { return false; }
  if(node.style.display != 'none') {
    node.style.display = 'none';
  }
  else {
    node.style.display = value || "";
  }
  return true;
};
window['CN']['toggleDisplay'] = toggleDisplay;

function toggleDisplay2(node) {
  if(node.style.display != 'none') {
    node.style.display = 'none';
  }
  else {
    node.style.display = 'block';
  }
  return true;
};
window['CN']['toggleDisplay2'] = toggleDisplay2;

function toggleClass(node, nodeClass, forceOff) {
   // forceOff is optional and expects a boolean value indicating whether to force toggling the class Off
   // this is necessary in case the function is called before the page is fully prepped for the script
  var currClass = node.className;
  if (currClass.length > 0) {
    if (currClass.match(nodeClass)) {
      if (currClass.match(" ")) {
        currClass.charAt(currClass.indexOf(nodeClass)-1)==" " ? nodeClass = " " + nodeClass : nodeClass += " ";
      }
      var substrings = currClass.split(nodeClass);
      var newClass = ""
      for (var i=0; i<substrings.length; i++) {
        newClass += substrings[i];
      }
      node.className = newClass;
    }
    else {
      if(!forceOff) {
        node.className = currClass + " " + nodeClass;
      }
    }
  }
  else {
    node.className = nodeClass;
  }
//  alert(node.ClassName);
  return true;
};
window['CN']['toggleClass'] = toggleClass;

function swapClass(nodeID, oldclass, newclass) {
  if(!isDomBrowser()) { return false; }
  if(!(node == $(node))) { return false; }
  var node = $(nodeID);
  toggleClass(node,oldclass);
  toggleClass(node,newclass);
}
window['CN']['swapClass'] = swapClass;

function insertAfter(node, referenceNode) {
  if(!(node == $(node))) { return false; }
  if(!(referenceNode = $(referenceNode))) { return false; }
  return referenceNode.parentNode.insertBefore(node, referenceNode.nextSibling);
};
window['CN']['insertAfter'] = insertAfter;

function removeChildren(parent) {
  if(!(parent == $(parent))) { return false; }
  while(parent.firstChild) {
    parent.firstChild.parentNode.removeChild(parent.firstChild);
  }
  return parent;
};
window['CN']['removeChildren'] = removeChildren;

function prependChild(parent, newChild) {
  if(!(parent == $(parent))) { return false; }
  if(!(newChild == $(newChild))) { return false; }
  if(parent.firstChild) {
    parent.insertBefore(newChild,parent.firstChild);
  }
  else {
    parent.appendChild(newChild);
  }
    // return the parent again so you can chain the methods
  return parent;
};
window['CN']['prependChild'] = prependChild;

function randomizeArray(array_in) {
  var i = array_in.length;
  if (i == 0) return false;
  while (--i) {
     var j = Math.floor(Math.random()*(i+1));
     var temp_i  = array_in[i];
     var temp_j  = array_in[j];
     array_in[i] = temp_j;
     array_in[j] = temp_i;
   }
};
window['CN']['randomizeArray'] = randomizeArray;

var Navigator = {
  _getVersion: function (a, b) {
    var t = navigator.userAgent.split(a)[1];
    return (t) ? t.split(b)[0] : false;
  },
  isOpera: function () {
    return (
      (window.opera) ?
        (document.createElementNS) ?
          (document.createCDATASection) ?
            (document.styleSheets) ? 9 : 8
          : 7
        : 6
      : false
    );
  },
  isSafari: function () {
    return (document.createCDATASection && document.createElementNS) ? Navigator._getVersion('AppleWebKit/', '(') : false;
  },
  isKDE: function () {
    return (document.createCDATASection && document.createElementNS) ? Navigator._getVersion('Konqueror/', ';') : false;
  },
  isGecko: function () {
    return (document.createCDATASection && document.createElementNS) ? Navigator._getVersion('Gecko/', ' ') : false;
  },
  isNN4: function () {
    return (document.layers && typeof document.layers == 'object') ? true : false;
  },
  isWinIE: function () {
    return (
      /*@cc_on @if (@_win64 || @_win32 || @_win16)
      (document.getElementsByTagName) ?
        (@_jscript_version > 5.6) ? 7 :
        (@_jscript_version == 5.6) ? 6 :
        (@_jscript_version == 5.5) ? 5.5 :
        5
      : 4
      @else@*/false/*@end @*/
    );
  },
  isMac: function () {
    var av = navigator.appVersion.toLowerCase();
    return ( av.indexOf( 'mac' ) != -1 );
  }
};
window['CN']['isOpera']  = Navigator.isOpera();
window['CN']['isSafari'] = Navigator.isSafari();
window['CN']['isKDE']    = Navigator.isKDE();
window['CN']['isGecko']  = Navigator.isGecko();
window['CN']['isNN4']    = Navigator.isNN4();
window['CN']['isWinIE']  = Navigator.isWinIE();
window['CN']['isMac']    = Navigator.isMac();

function getQueryParam(param) {
  var q = document.location.search || document.location.hash;
  if(q) {
    var pairs = q.substring(1).split("&");
    for (var i=0; i < pairs.length; i++) {
      if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
        return pairs[i].substring((pairs[i].indexOf("=")+1));
      }
    }
  }
}
window['CN']['getQueryParam']  = getQueryParam;

})();
