(function(window) { 

	// public
	window.handshake = function(options) {
		var windowkey = options.windowkey;
		var pageviewkey = options.pageviewkey;
		var url = window.location;
		
		// authenticatewindow
		var windowid = private.urlparam( url, windowkey);
		var viewid = private.urlparam( url, pageviewkey);
		if (!window.name || window.name=='null' || window.name=='') {
			var params = private.urlparams( url );
			params[ windowkey ] = window.name = window.generatewindowid(); 
			params[ pageviewkey ] = window.generateviewid(); 
			var newlocation = private.makeurl(url,params);			
			//alert(newlocation);				
			window.location = newlocation;
		} 
		else if (window.name != windowid) {
			var params = private.urlparams( url );
			params[ windowkey ] = window.name; 
			params[ pageviewkey ] = window.generateviewid(); 
			var newlocation = private.makeurl(url,params);	
			//alert(newlocation);				
			window.location = newlocation; 
		}
	}
	window.generateviewid = function() {
		// Version: 2009 05 13
		return "V"+Math.floor(Math.random()*89998+10001);
	}
	window.generatewindowid = function() {
		// Version: 2009 05 13
		return "W"+Math.floor(Math.random()*89998+10001);
	}
	
	// private
	var private = {};
	private.urlparams = function(url) {
		// Version: 2009 05 13
		// qstring
		var qstring = (url+'').split('?').slice(1).join('?');
		// get params from url
		var paramstrs = qstring.split('&');
		var params = {};
		for(index in paramstrs) {
			if (paramstrs[index]=='') continue;
			var keyval = paramstrs[index].split('=');
			var key = keyval[0];
			var val = (typeof keyval[1] != 'undefined') ? keyval[1] : '';
			params[key] = val;
		}
		// return param associative array
		return params;
	}
	private.urlparam = function(url,paramkey) {
		// Version: 2009 05 13
		// qstring
		var qstring = (url+'').split('?').slice(1).join('?');
		// get params from url
		var paramstrs = qstring.split('&');
		var params = {};
		for(index in paramstrs) {
			if (paramstrs[index]=='') continue;
			var keyval = paramstrs[index].split('=');
			var key = keyval[0];
			var val = (typeof keyval[1] != 'undefined') ? keyval[1] : '';
			params[key] = val;
		}
		// return param associative array
		return params[paramkey];
	}
	private.makeurl = function(url,newparams) {
		// Version: 2009 05 13
		// url
		var urlparams = private.urlparams(url);
		var urlnoparams = (url+'').split('?').shift();		
		// array of strings
		var paramstrs = [];
		for(index in urlparams) {
			if (typeof urlparams[index] != "undefined") continue;			
			paramstrs.push(index+'='+urlparams[index]);
		}
		for(index in newparams) {
			paramstrs.push(index+'='+newparams[index]);
		}
		// return
		var paramstr = paramstrs.join('&');
		if (paramstr=='') {
			return urlnoparams;
		} else {
			return urlnoparams+'?'+paramstr;
		}
	}
	
})( window );