Index: ext_link_page.info
===================================================================
RCS file: /cvs/drupal/contributions/modules/ext_link_page/ext_link_page.info,v
retrieving revision 1.1.4.1
diff -u -r1.1.4.1 ext_link_page.info
--- ext_link_page.info	7 Jan 2009 06:47:00 -0000	1.1.4.1
+++ ext_link_page.info	17 Oct 2009 06:45:34 -0000
@@ -2,4 +2,10 @@
 name = External Link Page
 description = "Any external links in a page will go to page that states the user is leaving the site."
 core = 6.x
-package = Filters
\ No newline at end of file
+package = Filters
+; Information added by drupal.org packaging script on 2009-10-17
+version = "6.x-1.1"
+core = "6.x"
+project = "ext_link_page"
+datestamp = "1255761933"
+
Index: ext_link_page.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/ext_link_page/ext_link_page.module,v
retrieving revision 1.1.4.3
diff -u -r1.1.4.3 ext_link_page.module
--- ext_link_page.module	17 Oct 2009 06:38:38 -0000	1.1.4.3
+++ ext_link_page.module	25 Apr 2010 11:10:24 -0000
@@ -109,12 +109,12 @@
   $base_url = url(NULL, array('absolute' => TRUE));
   $target = '';
 
-  // If the link is external (starts with http) and it's not an absolute link to the current site
-  if (strpos($match[1], 'http') === 0 && strpos($match[1], $base_url) === FALSE) {
+  // If the link is valid external URL and is not $base_url
+  if (valid_url($match[1], TRUE) && strpos($match[1], $base_url) === FALSE) {
     $url = url(
       variable_get('ext_link_page_link_page', $arr_defaults['ext_link_page_link_page']),
       array(
-        'query' => 'url=' . $match[1],
+        'query' => 'url=' . str_replace('%2F', '/', rawurlencode($match[1])),
       )
     );
   }
Index: includes/ext_link_page.admin.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/ext_link_page/includes/Attic/ext_link_page.admin.inc,v
retrieving revision 1.1.2.2
diff -u -r1.1.2.2 ext_link_page.admin.inc
--- includes/ext_link_page.admin.inc	17 Oct 2009 06:38:38 -0000	1.1.2.2
+++ includes/ext_link_page.admin.inc	24 Apr 2010 10:07:26 -0000
@@ -27,7 +27,7 @@
     '#title' => t('Link Page'),
     '#default_value' => variable_get('ext_link_page_link_page', $arr_defaults['ext_link_page_link_page']),
     '#maxlength' => 256,
-    '#description' => t('The page that external links will be directed to.  Example: !link',
+    '#description' => t('The page that external links will be directed to.  Example: !link. Don\'t forget to clear your chache (!perf_page) in order this value to take effect.',
       array(
         '!link' => url(
           variable_get('ext_link_page_link_page', $arr_defaults['ext_link_page_link_page']),
@@ -35,8 +35,9 @@
             'query' => array(
               'url' => 'http://example.com',
             ),
-          )
+          )        		  
         ),
+		'!perf_page' => l(t('Performance'), 'admin/settings/performance'),
       )
     ),
   );
@@ -45,7 +46,7 @@
     '#title' => t('Page Title'),
     '#maxlength' => 256,
     '#default_value' => variable_get('ext_link_page_page_title', $arr_defaults['ext_link_page_page_title']),
-    '#description' => t('The title of the external link page.'),
+    '#description' => t('The title of the external link page. Don\'t forget to clear your chache (!perf_page) in order this value to take effect.', array('!perf_page' => l(t('Performance'), 'admin/settings/performance'))),
   );
   $form['ext_link_page_page_message'] = array(
     '#type' => 'textarea',
Index: includes/ext_link_page.page.inc
===================================================================
RCS file: /cvs/drupal/contributions/modules/ext_link_page/includes/Attic/ext_link_page.page.inc,v
retrieving revision 1.1.2.1
diff -u -r1.1.2.1 ext_link_page.page.inc
--- includes/ext_link_page.page.inc	17 Oct 2009 06:27:29 -0000	1.1.2.1
+++ includes/ext_link_page.page.inc	26 Apr 2010 11:04:21 -0000
@@ -9,43 +9,61 @@
 
 /**
  * Link Page
- *
  * Handles page for external linking
- *
  * @return
  *   page output
  */
 function _ext_link_page_build_page() {
   // Get variables
-  $arr_defaults = _ext_link_page_get_defaults();
-  $str_delay = variable_get('ext_link_page_direct_delay', $arr_defaults['ext_link_page_direct_delay']);
-  $str_page_message = variable_get('ext_link_page_page_message', $arr_defaults['ext_link_page_page_message']);
-  $str_site_name = '<span class="ext_link_page-site_name">'. variable_get('site_name', 'site_name') .'</span>';
-  $str_link = l($str_url, $str_url, $attributes = array('class' => 'ext_link_page-link'));
-
-  // Sanitize url query
   $str_url = $_GET['url'];
-  $str_url_regex = "^(https?|ftp)\:\/\/([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*(\:[0-9]{2,5})?(\/([a-z0-9+\$_-]\.?)+)*\/?(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?(#[a-z_.-][a-z0-9+\$_.-]*)?\$";
-  if (!eregi($str_url_regex, $str_url)) {
-    $str_url = url(NULL, NULL, NULL, TRUE);
-  }
+  // Sanitize url
+  $str_url = filter_xss($str_url);
+  // reciving drupal_urlencode-ed URL, if not valid, display error message
+  if (valid_url($str_url, TRUE)) {
+    $str_url = str_replace("&amp;", "&", $str_url); 
+    $arr_defaults = _ext_link_page_get_defaults();
+    $str_delay = variable_get('ext_link_page_direct_delay', $arr_defaults['ext_link_page_direct_delay']);
+    $str_page_message = variable_get('ext_link_page_page_message', $arr_defaults['ext_link_page_page_message']);
+    $str_site_name = '<span class="ext_link_page-site_name">'. variable_get('site_name', 'site_name') .'</span>';
+    $str_link = l($str_url, $str_url, array('class' => 'ext_link_page-link'));
 
-  // Check delay.  If delay is zero, simply redirect
-  if ($str_delay == 0) {
-    drupal_goto($str_url);
+    // Check delay.  If delay is zero, simply redirect
+    if ($str_delay == 0) {
+      drupal_goto($str_url);
+    }
+    else {
+	  // add jquery.timers.js
+      drupal_add_js(drupal_get_path("module", "ext_link_page"). '/jquery.timers.js');
+      // jquery redirect
+      $str_redirect = '$(document).ready(function() {
+        // This will hold our timer
+        $(document).oneTime(' .($str_delay * 1000). ', "redir", function() {
+            	window.location = "' .str_replace("&amp;", "&", check_plain($str_url)). '";
+            });
+		$(".ext_link_page-delay").everyTime(1000, function(i) {
+				if(' .($str_delay+1). '-i>0)
+					$(this).html(' .($str_delay+1). '-i);
+				else
+					$(this).html(\'0\');
+			});			
+      });';
+      // This add inline JS to the head of the document
+      drupal_add_js($str_redirect, 'inline');
+  
+      // Replace values in message
+	  // Replace with t($str_page_message, array("!link"=>"value")) ?
+      $str_page_message = str_replace('[link]', $str_link, $str_page_message);
+      $str_page_message = str_replace('[url]', check_plain($str_url), $str_page_message);
+      $str_page_message = str_replace('[delay]', '<span class="ext_link_page-delay">' .$str_delay. '</span>', $str_page_message);
+	  $str_page_message = str_replace('[site_name]', $str_site_name, $str_page_message); 
+	  $output = $str_page_message;
+    }  
   }
   else {
-    // Make redirect and add to header
-    $str_redirect = '<meta http-equiv="refresh" content="' . $str_delay . '; url=' . $str_url . '">';
-    drupal_set_html_head($str_redirect);
-  
-    // Replace values in message
-    $str_page_message = str_replace('[link]', $str_link, $str_page_message);
-    $str_page_message = str_replace('[url]', $str_url, $str_page_message);
-    $str_page_message = str_replace('[delay]', $str_delay, $str_page_message);
-    $str_page_message = str_replace('[site_name]', $str_site_name, $str_page_message);
-  
-    // Call theme function
-    return theme('ext_link_page', $str_page_message);
+    // Not valid URL
+    $output = "Empty or invalid URL";
   }
+  // Call theme function
+  return theme('ext_link_page', $output);
 }
+?>
\ No newline at end of file
--- jquery.timers.js
+++ jquery.timers.js
@@ -0,0 +1,142 @@
+jQuery.fn.extend({
+	everyTime: function(interval, label, fn, times, belay) {
+		return this.each(function() {
+			jQuery.timer.add(this, interval, label, fn, times, belay);
+		});
+	},
+	oneTime: function(interval, label, fn) {
+		return this.each(function() {
+			jQuery.timer.add(this, interval, label, fn, 1);
+		});
+	},
+	stopTime: function(label, fn) {
+		return this.each(function() {
+			jQuery.timer.remove(this, label, fn);
+		});
+	}
+});
+
+jQuery.extend({
+	timer: {
+		guid: 1,
+		global: {},
+		regex: /^([0-9]+)\s*(.*s)?$/,
+		powers: {
+			// Yeah this is major overkill...
+			'ms': 1,
+			'cs': 10,
+			'ds': 100,
+			's': 1000,
+			'das': 10000,
+			'hs': 100000,
+			'ks': 1000000
+		},
+		timeParse: function(value) {
+			if (value == undefined || value == null)
+				return null;
+			var result = this.regex.exec(jQuery.trim(value.toString()));
+			if (result[2]) {
+				var num = parseInt(result[1], 10);
+				var mult = this.powers[result[2]] || 1;
+				return num * mult;
+			} else {
+				return value;
+			}
+		},
+		add: function(element, interval, label, fn, times, belay) {
+			var counter = 0;
+			
+			if (jQuery.isFunction(label)) {
+				if (!times) 
+					times = fn;
+				fn = label;
+				label = interval;
+			}
+			
+			interval = jQuery.timer.timeParse(interval);
+
+			if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
+				return;
+
+			if (times && times.constructor != Number) {
+				belay = !!times;
+				times = 0;
+			}
+			
+			times = times || 0;
+			belay = belay || false;
+			
+			if (!element.$timers) 
+				element.$timers = {};
+			
+			if (!element.$timers[label])
+				element.$timers[label] = {};
+			
+			fn.$timerID = fn.$timerID || this.guid++;
+			
+			var handler = function() {
+				if (belay && this.inProgress) 
+					return;
+				this.inProgress = true;
+				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
+					jQuery.timer.remove(element, label, fn);
+				this.inProgress = false;
+			};
+			
+			handler.$timerID = fn.$timerID;
+			
+			if (!element.$timers[label][fn.$timerID]) 
+				element.$timers[label][fn.$timerID] = window.setInterval(handler,interval);
+			
+			if ( !this.global[label] )
+				this.global[label] = [];
+			this.global[label].push( element );
+			
+		},
+		remove: function(element, label, fn) {
+			var timers = element.$timers, ret;
+			
+			if ( timers ) {
+				
+				if (!label) {
+					for ( label in timers )
+						this.remove(element, label, fn);
+				} else if ( timers[label] ) {
+					if ( fn ) {
+						if ( fn.$timerID ) {
+							window.clearInterval(timers[label][fn.$timerID]);
+							delete timers[label][fn.$timerID];
+						}
+					} else {
+						for ( var fn in timers[label] ) {
+							window.clearInterval(timers[label][fn]);
+							delete timers[label][fn];
+						}
+					}
+					
+					for ( ret in timers[label] ) break;
+					if ( !ret ) {
+						ret = null;
+						delete timers[label];
+					}
+				}
+				
+				for ( ret in timers ) break;
+				if ( !ret ) 
+					element.$timers = null;
+			}
+		}
+	}
+});
+
+if (jQuery.browser.msie)
+	jQuery(window).one("unload", function() {
+		var global = jQuery.timer.global;
+		for ( var label in global ) {
+			var els = global[label], i = els.length;
+			while ( --i )
+				jQuery.timer.remove(els[i], label);
+		}
+	});
+
+


