document.write("<object classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" codebase=\"http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\" width=\"1\" height=\"1\" id=\"proxy\" align=\"middle\"> <param name=\"allowScriptAccess\" value=\"always\" /> <param name=\"movie\" value=\"http://log.dubulog.com/proxy.swf\" /><param name=\"quality\" value=\"high\" /><param name=\"bgcolor\" value=\"#666666\" /><embed src=\"http://log.dubulog.com/proxy.swf\" quality=\"high\" bgcolor=\"#666666\" width=\"1\" height=\"1\" name=\"proxy\" align=\"middle\" allowScriptAccess=\"always\" type=\"application/x-shockwave-flash\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /> </object>");

var ID_ORDER = "dubuOrderProduct";
var ID_VIEW = "dubuViewProduct";
var KEY_ADS = "dubuAds";

var MODE_SWITCH = 1; // Mode for order product :1 = keep value of para, 2 = parse value of para

function getCookie(name) {
	var start = document.cookie.indexOf(name + "=");
	var len = start + name.length + 1;
	
	if ((!start) && (name != document.cookie.substring(0, name.length)))	{
		return null;
	}
	
	if (start == -1) {
		return null;
	}
	
	var end = document.cookie.indexOf(";", len);
	
	if (end == -1) {
		end = document.cookie.length;
	}
	
	return unescape(document.cookie.substring(len, end));
}

function setCookie(name, value, expires,path, domain, secure) {
	var cookieString = name + "=" + escape(value) +
		( (expires) ? ";expires=" + expires : "") +
		( (path) ? ";path=" + path : "") +
		( (domain) ? ";domain=" + domain : "") +
		( (secure) ? ";secure" : "");
		
	document.cookie = cookieString;
}

function deleteCookie(name, path, domain) {
	if (getCookie(name)) { 
		document.cookie = name + "=" +
			( (path) ? ";path=" + path : "") +
			( (domain) ? ";domain=" + domain : "") +
			";expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}

function getExpDate(days, hours, minutes) {
	var expDate = new Date();
	
	if (typeof days == "number" && typeof hours == "number" && typeof hours == "number") {
		expDate.setDate(expDate.getDate( ) + parseInt(days));
		expDate.setHours(expDate.getHours( ) + parseInt(hours));
		expDate.setMinutes(expDate.getMinutes( ) + parseInt(minutes));
		
		return expDate.toGMTString( );
	}
}

function supportCookies() {
	return navigator.cookieEnabled;
}

function getVId() {
	if (!supportCookies()) {
		return -1;
	}
	
	var vId = getCookie('lavid');
	
	if (!vId) {
		// Set the expiration period for the cookies (visitor)
		var expireDate = getExpDate(365*20, 0, 0);
		var value = Math.random();
		
		setCookie('lavid', value, expireDate);
		
		return value;
		
	} else {
		return vId;	
	}
}

function getSId() {
	if (!supportCookies()) {	
		return -1;
	}
	
	var sId = getCookie('lasid');
	
	if (!sId) {				
		var value = Math.random();
		
		setCookie('lasid', value);
		
		return value;
		
	} else {
		return sId;	
	}
}

var isCrossDomain = false;
function getRefUrl() {
	var isSameDomain = true; // in frame structure and same domain or not in frame structure
	
	try {
		typeof(top.document.URL);			
	}
	catch(e) {
		//check if e ~ access denied
		//frame and diffenrent domain
		isSameDomain = false;
	} 

	if (isSameDomain == true) {
	//in frame structure and same domain or not in frame structure			
		if (top.document.URL == self.document.referrer) {
			//frame				
			return top.document.referrer;
		} 
		else {
			// not frame or in frame but link direct to it
			return document.referrer;
		}
	} 
	else {
	//frame and diffenrent domain
		isCrossDomain = true;
		
		if (typeof getRef != "function") {			
		//proxy_observer.js is not available
    		return ""; //invalid result (technical restriction)
    	} 
    	else {
    	//proxy_observer.js is available    	
    		if (getRef() == "") {
    			return document.referrer;
    		}
    		
    		var pageIndex = getRef().indexOf("&dubuPage=");
    		
    		return getRef().substring(9, pageIndex);
	    }
	}          
}

/**
 * get domain from url
 */
function extractDomain(url) {
    if (url == null) return "";
    
    var nDomPos  = url.indexOf('//');
    var page = url;
    
    if (nDomPos > 0) {
        page = url.substring(nDomPos + 2);
    }
    
    var endPos = page.indexOf("/");
    var domain = page;
    
    if (endPos > 0) {
        domain = page.substring(0, endPos);
    }
    
    return domain;
}

function getPageUrl() {	
    var page = document.URL;
    var indexRef = page.indexOf("#dubuRef=");

	// process in cross domain, split from #dubu= string    
    if (indexRef > 0) {
       page = page.substring(0, indexRef);
    }
    
	return page; 		
}

/**
function getDomainName() {
	var domain = document.domain;
	
	if (!domain)
		return "";
	else
		return domain;
}
*/

function getInfo() {
	var resultVal 	= "";
	var visitorId 	= "";	
	var sessionId 	= "";
	var osId 		= "";
	var browserId 	= "";
	var displayId 	= "";
	var langId 		= "";
	
	// GET VID	
	try {
		visitorId 	= getVId();		
	} catch (e) {
	}
	
	// GET SID	
	try {
		sessionId 	= getSId();
	} catch (e) {
	}
	
	// OS	
	try {
		osId 		= getOS();
	} catch (e) {
	}
		
	// Browser
	try {
		browserId 	= getBrowser();	// appname
	} catch (e) {
	}
	
	// Display
	try {
		displayId 	= screen.width + "x" + screen.height;
	} catch (e) {
	}
	
	// Lang
	try {
		if (navigator.appName == 'Netscape') {
			langId = navigator.language;
		} else {
			langId = navigator.browserLanguage;
		}
		
	} catch (e) {
	}
		
	resultVal = visitorId + "," + 
				sessionId + "," + 
				osId 	  + "," + 
				browserId + "," + 
				displayId + "," + 
				langId;			
	
	return resultVal;	
}

var key ;
function setKey(value) {
	key = value;
}

function getCusId() {	
	if (key == null || key == 'undefined') {
		return null;  // for test
	} else {
		return key;
	}
}

// Get the version number 
function navig_extVer(txt) {
	if (!txt) return "";
  
	var ver = "";
  
	for(var i = 0; i < txt.length; i++) {	  
		if ((isNaN(txt.charAt(i))) && (txt.charAt(i) != '.')) {
			if (ver.length > 0) 
	  			return (ver);      
		} else {
			ver += txt.charAt(i);      
		}
	}
	
	return ver;
}

function formatVersion(rv) {
	var index = rv.indexOf('.');
	rv = (index != -1) ? rv.substring(0, index + 2) : rv + '.0';
	 
	return rv;
}

function getBrowser() {

	var appname 	= navigator.appName;
	var useragent 	= navigator.userAgent;
	var appversion 	= navigator.appVersion;

	var browString = '';
	var browVersion = 0;

	var p1 = 0;
	var p2 = 0;
	var p3 = 0;
	var p4 = 0;
	var p5 = 0;
	var p6 = 0;
	var p7 = 0;
	var pg = 0;
	var s1 = '';
	
	var n = 0;
	
	// Get IE
	 if (navigator.appName == 'Microsoft Internet Explorer') {
		  var rv = -1; 
		  var ua = navigator.userAgent;
		  var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
		  var index;
		  
		  if (re.exec(ua) != null) {
			  rv = parseFloat( RegExp.$1 );	
			  rv = rv.toString();
			  
			  return 'Internet Explorer ' + formatVersion(rv);
		  }		   
	 }

	var navig_agt = navigator.userAgent.toLowerCase();
	var navig_fox = (navig_agt.indexOf('firefox') != -1);
	 
	// Get FF
	if (navig_fox) {
	    var tmp = navig_agt.indexOf('firefox/');
	    return "Firefox " + formatVersion(navig_extVer(navig_agt.substring(tmp + 8)));	    
	}
	 	
	//  IE
	if (appname.indexOf('Internet Explorer') != -1) {
		p1 = appversion.indexOf('MSIE') + 5;
		s1 = appversion.substring(p1, p1 + 8);
		p2 = s1.indexOf(';');
		
		if (p2 > 0) 
			browString = ' ' + s1.substring(0, p2);
		
		if (appname.indexOf('Microsoft Internet Explorer') != -1) 
			appname = 'Internet Explorer';	

		// Look for AOL browser (IE compatible)
		p3 = useragent.indexOf('America Online Browser');
		
		if (p3 != -1) {
			s1 = useragent.substring(p3, p3 + 30);
			p4 = s1.indexOf(';');
			appname = 'AOL Explorer';
		}

		// Look for AOL Explorer browser (IE compatible)
		p7 = useragent.indexOf('AOL Explorer');
	  	if (p7 != -1) {
	    	s1 = useragent.substring(p7, p7 + 30);
	    	p8 = s1.indexOf(';');
	    	appname = s1.substring(0, p8);
	  	}
	  	
	// Look for Netscape
	} else if (appname == 'Netscape') {
		p1 = appversion.indexOf('[') - 1;
		
		if (p1 < 0) {p1 = appversion.indexOf('(') - 1;}
		
		if (p1 > 0) {browString = ' ' + appversion.substring(0,p1);}

		// Look for Netscape 6 and greater
		p2 = useragent.indexOf('Netscape');
		if (p2 != -1) {
			s1 = useragent.substring(p2, p2 + 15);
			p1 = s1.indexOf('/');
			p3 = s1.indexOf(' ');
			if (p3 > 0) {
				browString = ' ' + s1.substring(p1 + 1, p3);
			} else if (p1 > 0) {
				browString = ' ' + s1.substring(p1 + 1, p1 + 6);
			}
		} else {
			p2 = useragent.indexOf('Navigator');
			if (p2 != -1) {
				browString = ' ' + useragent.substring(p2, p2 + 15);
			}
		}
		
	// Look for Opera
	} else if (appname == 'Opera') {
		p1 = useragent.indexOf('Opera') + 6;
		if (p1 != 6) {
			p2 = useragent.indexOf('[') + 1;
			if (p2 == 0) {p2 = p1 + 8;}

			s1 = useragent.substring(p1,p2);
			browString = ' ' + s1;
			p2 = s1.indexOf('[');

			if (p2 > 0) {browString = ' ' + s1.substring(0, p2 - 2);}

			p2 = browString.indexOf('\(');

			if (p2 > 0) {browString = browString.substring(0, p2 - 1);}
		} else {
			p2 = useragent.indexOf('(');
			browString = ' ' + useragent.substring(6, p2 - 1);
		}
	}
	
	if (browString == '') {browString = ' ' + appversion;}

	browVersion = parseFloat(browString.substring(1, browString.length));

	// Look for Mozilla, Firefox, and variants (Netscape 5)
	if (appname == 'Netscape' && browVersion >= 5) {
		appname = 'Mozilla';
		pg = useragent.indexOf('Gecko/');
		p4 = -1;
		p6 = useragent.indexOf('Firefox');

		if (p6 == -1) {p6 = useragent.indexOf('SeaMonkey');}
		
		if (p6 != -1) {
			appname = useragent.substring(p6, p6 + 20);
			p4 = 0;
			p5 = 100;
		} else if (useragent.indexOf('Fedora') == -1) {
			if (pg != -1) {
				if (useragent.charCodeAt(pg + 15) > 32) {
					appname = useragent.substring(pg + 15, pg + 35);
					p4 = pg + 15;
					p5 = 100;
				}
			}
		}
	  
		// Mozilla revision number (rv:)
		p1 = useragent.indexOf('rv:');
		if (p1 != -1 && appname.indexOf('Firefox') == -1) {
			p1 = p1 + 3;
			p2 = useragent.indexOf(')');
		
			if (p4 != -1) {
		  		browString = ' ' + useragent.substring(p5, p5 + 10);
			} else if (browVersion < 6) {
		  		if (p2 > p1) {
		    		browString = ' ' + useragent.substring(p1, p2);
					p3 = browString.indexOf(';');
					if (p3 != -1) {browString = browString.substring(0, p3);}
		  		} else {
		    		browString = '';
		  		}
			}
		} else {
			browString = '';
		}
	}

	// Look for Safari (Mac)
	p1 = useragent.indexOf('Safari');
	if (p1 != -1) {
		appname = 'Safari';
	  	p2 = useragent.indexOf('Version');
		
		if (p2 != -1) {
	    	p3 = useragent.substring(p2, p2 + 20).indexOf(' ');
	    	browString = ' ' + useragent.substring(p2 + 8, p2 + p3);
		}
	}

	// Look for Konqueror (Linux)
	p1 = useragent.indexOf('Konqueror');
	if (p1 != -1) {appname = 'Konqueror';}

	// Look for Galeon (Linux)
	p1 = useragent.indexOf('Galeon');
	if (p1 != -1) {appname = 'Galeon';}

	// Look for WebTV
	p1 = useragent.indexOf('WebTV');
	if (p1 != -1) {appname = 'WebTV';}
		
	// Report web browser version	
	var mozhelp = 0;
	var currBrowser = appname;
	
	if (appname.indexOf('Internet Explorer') != -1) {	
		currBrowser = appname + browString;
		
		if (currBrowser.indexOf('Microsoft Internet Explorer') != -1) {
			n = currBrowser.indexOf('Internet Explorer');
			
			if (n != -1) {
				currBrowser = currBrowser.substring(n, currBrowser.length);	
			}
		}
		
	} else if (appname.indexOf('Firefox') != -1) {
		currBrowser = appname + browString;

	} else if (appname.indexOf('SeaMonkey') != -1) {
	  	currBrowser = appname;

	} else if (appname.indexOf('Opera') != -1) {
	  	currBrowser = appname + browString;
	  	
	} else if (appname.indexOf('Safari') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('Camino') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('Konqueror') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('Galeon') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('WebTV') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('K-Meleon') != -1) {
	  	currBrowser = appname + browString;

	} else if (appname.indexOf('Epiphany') != -1) {
	  	currBrowser = appname;

	} else if (appname.indexOf('AOL Explorer') != -1) {
	  	currBrowser = appname;

	} else if (useragent.indexOf('Flock') != -1) {
		currBrowser = "Flock";

	} else if (appname.indexOf('Netscape') != -1) {
		currBrowser = appname + browString;
		
	} else if (appname.indexOf('Mozilla') != -1) {
		currBrowser = appname + browString;

	} else if (appname.indexOf('GranParadiso') != -1) {
		// 4 GranParadiso/3.0.2
		
		currBrowser = appname + browString;
		
		n = currBrowser.indexOf(' ');
		
		if (n != -1) {
			currBrowser = currBrowser.substring(n + 1, currBrowser.length);
		}

	} else if (appname.indexOf('Iceweasel') != -1) {
		// 8 Iceweasel/3.0.1 (D
		
		currBrowser = appname + browString;
		
		n = currBrowser.indexOf(' ');
		
		if (n != -1) {
			currBrowser = currBrowser.substring(n + 1, currBrowser.length);
		}

	} else if (appname.indexOf('Shiretoko') != -1) {
		// 0 Shiretoko/3.1a1
		
		currBrowser = appname + browString;		
		
		n = currBrowser.indexOf(' ');
		
		if (n != -1) {
			currBrowser = currBrowser.substring(n + 1, currBrowser.length);
		}
		
	} else if (appname.indexOf('Minefield') != -1) {
		// 64214 Minefield/3.1a
		
		currBrowser = appname + browString;		
		
		n = currBrowser.indexOf(' ');
		
		if (n != -1) {
			currBrowser = currBrowser.substring(n + 1, currBrowser.length);
		}
		
	} else {
		currBrowser = appname;
	}	

	n = currBrowser.indexOf('/');
	
	if (n != -1) {
		currBrowser = currBrowser.replace('/', ' ');	
	}
	
	var rv = currBrowser.split(".");
	
	if (rv[1] != null)		
		currBrowser = rv[0] + "." + rv[1].substring(0, 1);
	
	var searchStr = ";";
	var replaceStr = ".";
	var re = new RegExp(searchStr , "g");	

	return currBrowser.replace(re, replaceStr);
}

function getOS() {
	
	var info = navigator.userAgent;
	var currOS = '';	
	var n = info.length;
	var p1 = 0;
	
	if (info.indexOf('(Windows') != -1) {		
		p1	 	= info.indexOf(';') + 4;
		info 	= info.substring(p1, n);		
		p1	 	= info.indexOf(';');
		currOS 	= info.substring(1, p1);
		
	} else if (info.indexOf('(X11') != -1) {	
		if (info.indexOf('U;') != -1) {		
			p1	 = info.indexOf('(');			
			info = info.substring(p1, n);			
			n	 = info.length;
			
			if (info.indexOf('U;)') != -1) {				
				p1 	 	= info.indexOf(';') + 1;
				info 	= info.substring(p1, n);
				currOS 	= info.substring(1, info.indexOf(';'));														
			} else {
				p1 		= info.indexOf(';') + 4;
				currOS 	= info.substring(p1, n - 1);										
			}					
		} else {
			n	= info.length;
			p1	= info.indexOf(';') + 1;
			p2	= info.indexOf(')');			
			currOS = info.substring(p1, p2);
		}			
	} else if (info.indexOf('(Macintosh') != -1) {
		p1 = info.indexOf(';') + 4;
		info = info.substring(p1, n);
		p1 = info.indexOf(';');
		currOS = info.substring(1, p1);	
		
	} else if (info.indexOf('(IRIX') != -1) {
		currOS = 'Irix';	
		
	} else if (info.indexOf('OS/2') != -1) {
		p1 = info.indexOf(';') + 4;
		info = info.substring(p1, n);
		currOS = info.substring(0, info.indexOf(';'));
		
	} else if (info.indexOf('(compatible') != -1) {
		if (info.indexOf('WebTV') != -1)
			currOS = 'Unknown OS';
			
		else if (info.indexOf('America Online Browser') != -1) {
			do {	
				p1 = info.indexOf(';') + 1;
				if (p1 != 0){
					info = info.substring(p1, n);						
				}
			} while(p1 != 0)				
			
			currOS = info.substring(1, info.indexOf(')'));

		} else {		
			if (info.indexOf('Windows') != -1) {
				p1	 = info.indexOf(';') + 1;
				info = info.substring(p1, n);				
				p1	 = info.indexOf(';');
				if (p1 != -1){				
					info = info.substring(p1 + 1, info.length);				
					p1	 = info.indexOf(';');
					
					if (p1 == -1){
						p1 = info.indexOf(')');
					}
					
					currOS = info.substring(1, p1);			
				}												
			} else {											
				currOS = 'Unknown OS';											
			}
		}
	} else {			
		currOS = 'Unknown OS';
	}
						
	if (currOS == 'Windows NT 5.1')
		currOS = 'Windows XP';
	else if (currOS == 'Windows NT 6.0')
		currOS = 'Windows Vista';
	else if (currOS == 'Windows NT 5.0')
		currOS = 'Windows 2000';
	else if(currOS = 'Windows NT 5.2')
		currOS = 'Windows .NET Server';
	
	if (currOS == '') {		
		if (navigator.platform.indexOf('Win32') != -1)
			currOS = 'Win32';
		else if (navigator.platform.indexOf('Linux') != -1)
			currOS = 'Linux';
		else if (navigator.useragent.indexOf('Mac os X') != -1)
			currOS = 'Mac os X';
		else if (navigator.useragent.indexOf('MSIE 5.2') != -1)
			currOS = 'Mac os X';
		else if (navigator.platform.indexOf('Mac') != -1)
			currOS = 'Mac';
		else
			currOS = 'UnKnown OS';
	}
	
	// We disable these code to support map OS string to number.
	var searchStr 	= ";";
	var replaceStr 	= ".";
	var re 			= new RegExp(searchStr , "g");

	return  currOS.replace(re, replaceStr);
}

/**
 * Get list product that user order of one page of customer
 */
function getOrderProduct() {
    var orderElement = document.getElementById(ID_ORDER);
    
    // Get from hidden field
    if (orderElement) {
        return encodeURIComponent(orderElement.value);
    }    
    
    // Nothing
    return null;
}

/**
 * Get list product that user order of one page of customer
 */
function getViewProduct() {
    var viewElement = document.getElementById(ID_VIEW);
    
    // Get from hidden field
    if (viewElement) {
        return encodeURIComponent(viewElement.value);    
    }    
    
    // Nothing
    return null;
}

/**
 * Get adsvertisement indentify
 */
function getAdsPara() {
    var adsElement;
    var url;
    var paraStr;

	if ((typeof(isCrossDomain) == "undefined") || (isCrossDomain == false)) {
	//in frame structure and same domain or not in frame structure			
	    if (top.document.URL == self.document.referrer) {
	        // If frame included this page, find KEY_ADS at top url
	        
	        url = top.document.URL;
	        
	    } else {
	        // If page only be called directly, page url already include KEY_ADS para in its params
	        url = document.URL;
	        
	        return null;
	    }
	} 
	else {
	//frame and diffenrent domain			
		if (typeof getRef != "function") {			
		//proxy_observer.js is not available
    		return null; //invalid result (technical restriction)
    	} 
    	else {    		
    	//proxy_observer.js is available    	
    		if (getRef() == "") {
    			url = document.referrer;
    		}
    		
    		var pageIndex = getRef().indexOf("&dubuPage=");
  		
    		url = getRef().substring(pageIndex, getRef().length);
	    }
	}
   
    var nDomPos  = url.indexOf('//');
	var nPathPos = url.indexOf('/', nDomPos + 2);
    var nParaPos = url.indexOf('?', nPathPos);
    
    if (nParaPos != -1) {
    	paraStr = url.substring(nParaPos + 1);
    } else {
    	paraStr = "";		
    }
    
    var paraCom = paraStr.split("&");
   
    for (var i = 0; i < paraCom.length; i++) {
    	var pos = paraCom[i].indexOf('=');

    	if (pos > 0) {
    		var keyword = paraCom[i].substring(0, pos);

    		if (keyword == KEY_ADS) {
    			adsElement = paraCom[i];
    			
    			return adsElement;
    		}
    	}
    }    
    
    // nothing
    return null;
}

var rad ;
function setRandom(value) {
	rad = value;
}

function getCusRandom() {
	if (rad == null || rad == 'undefined') {
		return "0.000123456789";  // For test
	} else {
		return rad;
	}
}

function getJSRandom() {
	return Math.random();
}

function getClientRawInfo() {
	return null;
}

var TYPE_ENTER = 0;
var TYPE_LINK = 1;
var TYPE_BACK = 2;
var TYPE_FORWARD = 3;
var TYPE_REFRESH = 4;
var TYPE_CLIENT = 5;
var TYPE_EXTERNAL = 6;
var REF_ISEMPTY = "empty";

function doHistory() {
	var curBrowser = getBrowser().toLowerCase();
	var pageType = TYPE_LINK;
	
	if (curBrowser.indexOf('internet explorer') != -1) {
		try {
		//	pageType = getPageType();
			
		//	setHistoryPage(pageType);
		
			pageType = setHistoryPageIEEx();
		} catch (e) {
		}
		
	} else if (curBrowser.indexOf('firefox') != -1) {
		try {
			pageType = setHistoryPageFFEx();
		} catch (e) {
		}
		
	} else {	
		pageType = TYPE_LINK;
		
	} 
	
	return pageType;
}

function setHistoryPage(pageType) {
	if (!supportCookies()) {
		return -1;
	}
	
	var value = '';
    var refUrl = getRefUrl().toLowerCase();
    var pageUrl = getPageUrl().toLowerCase();
	var hisLength = window.history.length;	
	var his = getCookie('lahis');

    if (refUrl == "") {
    	refUrl = REF_ISEMPTY;
    }
    	
	if (his) {		
		if (pageType == TYPE_ENTER || pageType == TYPE_LINK || pageType == TYPE_CLIENT) {
			value = his + ";;" + refUrl + ";" + pageUrl + ";" + hisLength;
	
			setCookie('lahis', value);
		}
	} else {
		value = refUrl + ";" + pageUrl + ";" + hisLength;
	
		setCookie('lahis', value);
	}	
}

function getPageType() {
    var refUrl = getRefUrl().toLowerCase();
    var pageUrl = getPageUrl().toLowerCase();
    var hisLength = window.history.length;

	if (refUrl == "") {
		refUrl = REF_ISEMPTY;	
	}
	
    var data = readCookie('lahis');   
    
	if (!data) {
		return TYPE_LINK;
	}
	
	var curNumOfItem = getNumOfItem(data);
	var curItem = getItemAt(data, curNumOfItem - 1).split(';');
	var curLength = parseInt(curItem[2], 10);
	
	if (curItem == null) {
		// error ???
		return TYPE_LINK;
	}
	
	// R B->B
	if (refUrl == pageUrl)  {
		return TYPE_REFRESH;	
	}
	
	// R ENTER 100%
	if ((refUrl == REF_ISEMPTY) && (pageUrl == curItem[1])) {
		if ((curItem[0] != REF_ISEMPTY) || (hisLength - curLength < 2)) {
			return TYPE_REFRESH;
		} else { // (curItem[0] == REF_ISEMPTY) && (hisLength - curLength >= 2)
			return TYPE_CLIENT;	
		}
	}
	
	if (getPosOfRP(data, refUrl, pageUrl) < 0) {
		// (R,P) not in cookie
		// L/E		
		if (refUrl == REF_ISEMPTY) {			
			return TYPE_ENTER;
		} else {
			return TYPE_LINK;	
		}			
	} else {
		// Check history length increase or not		
		if (hisLength < curLength) {
			// L < Li
			
			if (refUrl == REF_ISEMPTY) {
				return TYPE_ENTER;	
			} else {
				return TYPE_LINK;	
			}
		} else if (hisLength == curLength) {
			// L = Li
			// B/F/R
			if ((refUrl == curItem[0]) && (pageUrl == curItem[1])) {
				return TYPE_REFRESH;	// Include E/L to seft current page
			} else {
				return TYPE_CLIENT;		// BF not need to distinguish	
			}
		} else {
			// L > Li -> B/L/E
			// Check visitor go out site or not
			if (hisLength - curLength == 1) {
				// Not go out side
				// (R,P) <> (Ri-1,Pi-1)
				var tmpItem = getItemAt(data, curNumOfItem - 2);
				var curItem1;
				
				if (tmpItem == REF_ISEMPTY || tmpItem == null) {
					if (refUrl == REF_ISEMPTY) {
						return TYPE_ENTER;
					} else {
						return TYPE_LINK;
					}
				}
				
				curItem1 = tmpItem.split(';');
				
				if (curItem1 == null || (refUrl != curItem1[0]) || (pageUrl != curItem1[1])) {
					if (refUrl == REF_ISEMPTY) {
						return TYPE_ENTER;
					} else {
						return TYPE_LINK;
					}
				} else {
					return TYPE_CLIENT; // B include 2 case of E/L: "->B->C->Enter(B); or C->B->C->Link(B);	
				}
			} else {
				// L - Li >= 2 -> go out side
				// (R,P) <> (Ri,Pi)
				if ((refUrl != curItem[0]) || (pageUrl != curItem[1])) {					
					if (refUrl == REF_ISEMPTY) {
						return TYPE_ENTER;
					} else {
						return TYPE_LINK;
					}
				} else {
					return TYPE_EXTERNAL;	// B include 2 case of E/L: "->B->X->Enter(B); or X->B->X->Link(B);	
				}
			}
		}
	}

    return TYPE_ENTER;
}

function setHistoryPageIEEx() {
	if (!supportCookies()) {
		return -1;
	}

	// client information
    var refUrl = getRefUrl().toLowerCase();
    var pageUrl = getPageUrl().toLowerCase();
    var hisLength = window.history.length;
    
    if (refUrl == "") {
    	refUrl = REF_ISEMPTY;
    }
    
    // process cookie
	var value = '';
	var pageType = TYPE_LINK;
   	
    var lahis = readCookie('lahis');   
    
	if (!lahis) {
		if (refUrl == REF_ISEMPTY) {
		//	pageType = TYPE_ENTER;
		
			// invalid result (technical restriction)
			if ((typeof(isCrossDomain) != "undefined") && (isCrossDomain)) {
				pageType = TYPE_LINK;
			} else {
				pageType = TYPE_ENTER;	
			}		
		} else {
			pageType = TYPE_LINK;	
		}		

		value = hisLength + ";;;" + pageType + ";;;" + 0 + ";;;" + -1 + ";;;" + refUrl + ";" + pageUrl + ";" + hisLength;
		
		setCookie('lahis', value);
		
		return pageType;
	}
	
	// process cookie
	var subHisCtrl = lahis.split(';;;');	
	
	// process cookie: info
	var lahisLength = parseInt(subHisCtrl[0], 10);
	var lahisPageType = parseInt(subHisCtrl[1], 10);
	var lahisIndexi = parseInt(subHisCtrl[2], 10);
	var lahisIndexj = parseInt(subHisCtrl[3], 10);
	
	// process cookie: data
    var dataHisItem = subHisCtrl[4].split(';;');    	
	var subDataItemi = dataHisItem[lahisIndexi].split(';');
	var itemiHisLength = parseInt(subDataItemi[2], 10);
	var subDataItemj;
	
	if (lahisIndexj == -1) {
		subDataItemj = null;
	} else {
		subDataItemj = dataHisItem[lahisIndexj].split(';');
	}
	
	// start here		
	
	if (refUrl == pageUrl)  {
		// R B->B
		subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
		
		pageType = TYPE_REFRESH;
		
	} else if ((refUrl == REF_ISEMPTY) && (pageUrl == subDataItemi[1])) {
		// R E100
		if (subDataItemi[0] != REF_ISEMPTY || (hisLength - lahisLength < 2)) {
			subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
			
			pageType = TYPE_REFRESH;
			
		} else { // (subDataItemj[0] == REF_ISEMPTY) && (hisLength - lahisLength >=2)
			pageType = TYPE_CLIENT;
			
		}
		
	} else {
		var posOfRP = getPosOfArrayRPEx(dataHisItem, refUrl, pageUrl);
		
		if (posOfRP < 0) {
			// (R,P) not in cookie, so add it into cookie
			// L/E		
			if (refUrl == REF_ISEMPTY) {			
				pageType = TYPE_ENTER;
			} else {
				pageType = TYPE_LINK;	
			}
			
		//	subHisCtrl[3] = subHisCtrl[2];				// Update Ri-1,Pi-1 {Rj,Pj} index
		//	subHisCtrl[2] = dataHisItem.length;			// Update Ri,Pi index
					
		//	value = ";;" + refUrl + ";" + pageUrl + ";" + hisLength;
					
		} else {
			// Check history length increase or not
			if (hisLength < itemiHisLength) {
				// L < Lo, B then L/E
				if (refUrl == REF_ISEMPTY) {
					pageType = TYPE_ENTER;	
				} else {
					pageType = TYPE_LINK;	
				}
				
			} else if (hisLength == itemiHisLength) {
				// L = Lo
				// B/F/R
				if ((refUrl == subDataItemi[0]) && (pageUrl == subDataItemi[1])) {
					subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
					
					pageType = TYPE_REFRESH;	// Include E/L to seft current page
					
				} else {
					pageType = TYPE_CLIENT;		// BF don't need to distinguish
				}
				
			} else {
				// L > Li -> B/L/E
				// Check visitor go out site or not
				if (hisLength - itemiHisLength == 1) {
					// Not go out site
					// (R,P) <> (Ri-1, Pi-1)
					if ((subDataItemj == null) || (refUrl != subDataItemj[0]) || (pageUrl != subDataItemj[1])) {
						if (refUrl == REF_ISEMPTY) {
							pageType = TYPE_ENTER;	
						} else {
							pageType = TYPE_LINK;	
						}	
					} else {
						pageType = TYPE_CLIENT;		// B include 2 case of E/L: "->B->C->Enter(B); or C->B->C->Link(B)"	
					}
					
				} else {
					// L - Li >= 2 -> go out side
					// (R,P) <> (Ri,Pi)
					if ((refUrl != subDataItemi[0]) || (pageUrl != subDataItemi[1])) {
						if (refUrl == REF_ISEMPTY) {
							pageType = TYPE_ENTER;	
						} else {
							pageType = TYPE_LINK;	
						}	
					} else {
						pageType = TYPE_EXTERNAL;	// B include 2 case of E/L: "->B->X->Enter(B); or X->B->X->Link(B)"	
					}
					
				}				
			}
			
		//	if (pageType != TYPE_REFRESH) {
		//		subHisCtrl[3] = subHisCtrl[2];	// Update Ri-1,Pi-1 {Rj,Pj} index
		//		subHisCtrl[2] = posOfRP;		// Update Ri,Pi index
		//	}
		} // Include cookie
	}
	
	subHisCtrl[0] = hisLength;			// Update history length
	subHisCtrl[1] = pageType;			// Update page type
	
	// Add to cookie all pages
	if (pageType == TYPE_ENTER || pageType == TYPE_LINK || pageType == TYPE_CLIENT) {
		subHisCtrl[3] = subHisCtrl[2];		// Update Ri-1,Pi-1 {Rj,Pj} index
		subHisCtrl[2] = dataHisItem.length;	// Update Ri,Pi index

		value = ";;" + refUrl + ";" + pageUrl + ";" + hisLength;
	}	

	value = subHisCtrl[0] + ";;;" + subHisCtrl[1] + ";;;" + subHisCtrl[2] + ";;;" + subHisCtrl[3] + ";;;" + subHisCtrl[4] + value;

	setCookie('lahis', value);
	
    return pageType;
}

function setHistoryPageFFEx() {
	if (!supportCookies()) {
		return -1;
	}

	// client information
    var refUrl = getRefUrl().toLowerCase();
    var pageUrl = getPageUrl().toLowerCase();
    var hisLength = window.history.length;
    
    if (refUrl == "") {
    	refUrl = REF_ISEMPTY;
    }    
    
    // process cookie
	var value = '';
	var pageType = TYPE_LINK;
   	
    var lahis = readCookie('lahis');   
    
	if (!lahis) {
		if (refUrl == REF_ISEMPTY) {			
			pageType = TYPE_ENTER;
		} else {
			pageType = TYPE_LINK;	
		}

		value = hisLength + ";;;" + pageType + ";;;" + 0 + ";;;" + -1 + ";;;" + refUrl + ";" + pageUrl + ";" + hisLength;
		
		setCookie('lahis', value);
		
		return pageType;
	}
	
	// process cookie
	var subHisCtrl = lahis.split(';;;');	
	
	// process cookie: info
	var lahisLength = parseInt(subHisCtrl[0], 10);
	var lahisPageType = parseInt(subHisCtrl[1], 10);
	var lahisIndexi = parseInt(subHisCtrl[2], 10);
	var lahisIndexj = parseInt(subHisCtrl[3], 10);
	
	// process cookie: data
    var dataHisItem = subHisCtrl[4].split(';;');    	
	var subDataItemi = dataHisItem[lahisIndexi].split(';');
	var subDataItemj;
	
	if (lahisIndexj == -1) {
		subDataItemj = null;
	} else {
		subDataItemj = dataHisItem[lahisIndexj].split(';');
	}
	
	// start here		
	
	if ((refUrl == pageUrl) && (pageUrl == subDataItemi[1]))  {
		// R B->B
		subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
		
		pageType = TYPE_REFRESH;
		
	} else if ((refUrl == REF_ISEMPTY) && (pageUrl == subDataItemi[1]) && (hisLength == lahisLength)) {
		// R E100
		subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
		
		pageType = TYPE_REFRESH;
		
	} else {	
		var posOfRP = getPosOfArrayRPEx(dataHisItem, refUrl, pageUrl);
		
		if (posOfRP < 0) {
			// (R,P) not in cookie, so add it into cookie
			// L/E		
			if (refUrl == REF_ISEMPTY) {			
				pageType = TYPE_ENTER;
			} else {
				pageType = TYPE_LINK;	
			}
			
			subHisCtrl[3] = subHisCtrl[2];				// Update Ri-1,Pi-1 {Rj,Pj} index
			subHisCtrl[2] = dataHisItem.length;			// Update Ri,Pi index
					
			value = ";;" + refUrl + ";" + pageUrl + ";" + hisLength;
					
		} else {
			// Check history length increase or not
			if (hisLength < lahisLength) {
				// L < Lo, B then L/E
				if (refUrl == REF_ISEMPTY) {
					pageType = TYPE_ENTER;	
				} else {
					pageType = TYPE_LINK;	
				}
				
			} else if (hisLength == lahisLength) {
				// L = Lo
				// BF/R/E100/L100
				if ((refUrl == subDataItemi[0]) && (pageUrl == subDataItemi[1]) && lahisPageType != TYPE_BACK) {
					subHisCtrl[4] = updateArrayDataAtPos(dataHisItem, refUrl, pageUrl, dataHisItem.length - 1);
					
					pageType = TYPE_REFRESH;
					
				} else {
					pageType = TYPE_CLIENT;
				}
			} else {
				// L > Li -> B/L/E
				if ((refUrl == subDataItemi[0]) && (pageUrl == subDataItemi[1])) {
					// BF
					pageType = TYPE_EXTERNAL;
					
				} else {
					if (refUrl == REF_ISEMPTY) {
						pageType = TYPE_ENTER;	
					} else {
						pageType = TYPE_LINK;	
					}
				}
			}
			
			if (pageType != TYPE_REFRESH) {
				subHisCtrl[3] = subHisCtrl[2];	// Update Ri-1,Pi-1 {Rj,Pj} index
				subHisCtrl[2] = posOfRP;		// Update Ri,Pi index
			}
		} // Include cookie
	}
	
	subHisCtrl[0] = hisLength;			// Update history length
	subHisCtrl[1] = pageType;			// Update page type

	value = subHisCtrl[0] + ";;;" + subHisCtrl[1] + ";;;" + subHisCtrl[2] + ";;;" + subHisCtrl[3] + ";;;" + subHisCtrl[4] + value;
	
	setCookie('lahis', value);
	
    return pageType;
}

function getNumOfItem(data) {
	if (data == null || data == "") {
		return 0;	
	}
	
    var value = data.split(';;');

	return value.length;	
}

function getItemAt(data, index) {
    var value = data.split(';;');

	if (index >= value.length) {
		return null;
	}
	
	return value[index];	
}

function getPosOfRP(data, refUrl, pageUrl) {
    var value = data.split(';;');
    var pos = 0;

	for (pos = 0; pos < value.length; pos++) {
    	var item = value[pos].split(';');
    	
	    if ((refUrl.toLowerCase() == item[0].toLowerCase()) && (pageUrl.toLowerCase() == item[1].toLowerCase())) {
	    	return pos;	
	    }   	
    }
    
    return -1;
}

function getPosOfArrayRPEx(data, refUrl, pageUrl) {	
	// data variable is already array items
	
    var index = 0;

	for (index = 0; index < data.length; index++) {
    	var item = data[index].split(';');
    	
	    if ((refUrl == item[0]) && (pageUrl == item[1])) {
	    	return index;	
	    }   	
    }
    
    return -1;
}

function updateArrayDataAtPos(data, refUrl, pageUrl, pos) {
	// data variable is already array items
	
    var index;	
	var newData = data;
	var item;
	
	if ((pos > -1) && (pos < data.length)) {
		item = data[pos].split(';');
		
		item[0] = refUrl;
		item[1] = pageUrl;
	}
	
	if (pos == 0) {
		newData = item[0] + ";" + item[1] + ";" + item[2];
	} else {
		newData = data[0];
	}
			
	for (index = 1; index < data.length; index++) {
		if (index == pos) {
			newData = newData + ";;" + item[0] + ";" + item[1] + ";" + item[2];
		} else {
			newData = newData + ";;" + data[index];
		}
	}
	    
    return newData;
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	
	for (var i = 0; i < ca.length; i++) {
		var c = ca[i];
		
		while (c.charAt(0) == ' ') c = c.substring(1, c.length);
		
		if (c.indexOf(nameEQ) == 0) 
			return unescape(c.substring(nameEQ.length, c.length));
	}
	
	return null;
}
