   function isUndefined(a) {
      return typeof a == 'undefined';
   }

   function isNull(a) {
      return typeof a == 'object' && !a;
   }

   function isString(a) {
      return typeof a == 'string';
   }

   function isObject(a) {
      return (typeof a == 'object' && !!a) || isFunction(a);
   }

   function isArray(a) {
      return isObject(a) && a.constructor == Array;
   }

   var _WINDOW_DEFAULT_TARGET = "_blank";
   var _WINDOW_DEFAULT_FEATURES = new Array(
   	new Array( "width",	      undefined ),
   	new Array( "height",	      undefined ),
   	new Array( "location",	   "no" ),
   	new Array( "menubar",	   "no" ),
   	new Array( "resizable",	   "no" ),
   	new Array( "scrollbars",   "yes" ),
   	new Array( "status",	      "yes" ),
   	new Array( "toolbar",	   "no" )
   );

   function getWindowFeaturesFromArray(array) {
   	var output = new String;
   	if( !isArray(array) ) {
   		return false;
   	}
   	for(var i=0; i<array.length; i++) {
   		if( !isArray(array[i]) || array[i].length != 2 || isUndefined(array[i][1]) ) {
   			continue;
   		}
   		output += array[i][0] + "=" + array[i][1] + ",";
   	}
   	return output;
   }

   function rawWindow(url, target, features) {
   	if( isUndefined(url) || isNull(url) || !isString(url) ) {
   		return false;
   	}
   	if( isUndefined(features) || isNull(features) || !isString(features) ) {
   		features = getWindowFeaturesFromArray(_WINDOW_DEFAULT_FEATURES);
   	} else {
   		features = getWindowFeaturesFromArray(_WINDOW_DEFAULT_FEATURES) + "," + features;
   	}
   	if( isUndefined(target) || isNull(target) || !isString(target) ) {
   		target = _WINDOW_DEFAULT_TARGET;
   	}
   	var theWindow = window.open(url, target, features);
   	return theWindow;
   }

   function linkPopup(src, features) {
      // <a href="http://example.net/" onclick="return !linkPopup(this, 'width=800,height=600')" target="_blank">example.net</a>
   	return rawWindow(src.getAttribute("href"), src.getAttribute("target") || "_blank", features);
   }

