/* 
 * Cross-browser event handling, by Scott Andrew
  */
  function addEvent(element, eventType, lamdaFunction, useCapture) {
      if (element.addEventListener) {
              element.addEventListener(eventType, lamdaFunction, useCapture);
	              return true;
		          } else if (element.attachEvent) {
			          var r = element.attachEvent('on' + eventType, lamdaFunction);
				          return r;
					      } else {
					              return false;
						          }
							  }

							  /* 
							   * Kills an event's propagation and default action
							    */
							    function knackerEvent(eventObject) {
							        if (eventObject && eventObject.stopPropagation) {
								        eventObject.stopPropagation();
									    }
									        if (window.event && window.event.cancelBubble ) {
										        window.event.cancelBubble = true;
											    }
											        
												    if (eventObject && eventObject.preventDefault) {
												            eventObject.preventDefault();
													        }
														    if (window.event) {
														            window.event.returnValue = false;
															        }
																}

																/* 
																 * Safari doesn't support canceling events in the standard way, so we must
																  * hard-code a return of false for it to work.
																   */
																   function cancelEventSafari() {
																       return false;        
																       }

																       /* 
																        * Cross-browser style extraction, from the JavaScript & DHTML Cookbook
																	 * <http://www.oreillynet.com/pub/a/javascript/excerpt/JSDHTMLCkbk_chap5/index5.html>
																	  */
																	  function getElementStyle(elementID, CssStyleProperty) {
																	      var element = document.getElementById(elementID);
																	          if (element.currentStyle) {
																		          return element.currentStyle[toCamelCase(CssStyleProperty)];
																			      } else if (window.getComputedStyle) {
																			              var compStyle = window.getComputedStyle(element, '');
																				              return compStyle.getPropertyValue(CssStyleProperty);
																					          } else {
																						          return '';
																							      }
																							      }

																							      /* 
																							       * CamelCases CSS property names. Useful in conjunction with 'getElementStyle()'
																							        * From <http://dhtmlkitchen.com/learn/js/setstyle/index4.jsp>
																								 */
																								 function toCamelCase(CssProperty) {
																								     var stringArray = CssProperty.toLowerCase().split('-');
																								         if (stringArray.length == 1) {
																									         return stringArray[0];
																										     }
																										         var ret = (CssProperty.indexOf("-") == 0)
																											               ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1)
																												                     : stringArray[0];
																														         for (var i = 1; i < stringArray.length; i++) {
																															         var s = stringArray[i];
																																         ret += s.charAt(0).toUpperCase() + s.substring(1);
																																	     }
																																	         return ret;
																																		 }

																																		 /*
																																		  * Disables all 'test' links, that point to the href '#', by Ross Shannon
																																		   */
																																		   function disableTestLinks() {
																																		     var pageLinks = document.getElementsByTagName('a');
																																		       for (var i=0; i<pageLinks.length; i++) {
																																		           if (pageLinks[i].href.match(/[^#]#$/)) {
																																			         addEvent(pageLinks[i], 'click', knackerEvent, false);
																																				     }
																																				       }
																																				       }

																																				       /* 
																																				        * Cookie functions
																																					 */
																																					 function createCookie(name, value, days) {
																																					     var expires = '';
																																					         if (days) {
																																						         var date = new Date();
																																							         date.setTime(date.getTime() + (days*24*60*60*1000));
																																								         var expires = '; expires=' + date.toGMTString();
																																									     }
																																									         document.cookie = name + '=' + value + expires + '; path=/';
																																										 }

																																										 function readCookie(name) {
																																										     var cookieCrumbs = document.cookie.split(';');
																																										         var nameToFind = name + '=';
																																											     for (var i = 0; i < cookieCrumbs.length; i++) {
																																											             var crumb = cookieCrumbs[i];
																																												             while (crumb.charAt(0) == ' ') {
																																													                 crumb = crumb.substring(1, crumb.length); /* delete spaces */
																																															         }
																																																         if (crumb.indexOf(nameToFind) == 0) {
																																																	             return crumb.substring(nameToFind.length, crumb.length);
																																																		             }
																																																			         }
																																																				     return null;
																																																				     }

																																																				     function eraseCookie(name) {
																																																				         createCookie(name, '', -1);
																																																					 }

