//NOTES:
//use escape() and unescape() when loading/saving cookies

//document.write("Old cookie: " + document.cookie + "<br>");



quadbase = {};
quadbase.ws = {};

quadbase.ws.qb_imgPath = "http://204.69.218.154:8080/qbcounter/qbcounter?";

//search engine list
quadbase.ws.qb_se = new Array("google", "yahoo", "msn", "aol", "aol", 
					"lycos", "ask", "altavista", "netscape", "cnn", 
					"looksmart", "about", "mamma", "alltheweb", "gigablast", 
					"voila", "virgilio", "live", "baidu", "alice", 
					"yandex", "najdi", "aol", "club-internet", "mama", 
					"seznam", "search", "szukaj", "szukaj", "netsprint", 
					"google.interia", "szukacz", "yam", "pchome");

//search engine query parameter name
quadbase.ws.qb_sekw = new Array("q","p", "q", "query", "encquery", 
						"query", "q", "q","query", "query", 
						"qt", "terms", "query", "q", "q",
						"rdata", "qs", "q", "wd", "qs",
						"text", "q", "q", "q", "query", 
						"q", "q", "szukaj", "qt", "q",
						"q", "q", "k", "q");

quadbase.ws.qb_cookieTimeout = 1800000;	//the life length for the cookie. Default: 1800000 (30 minutes)

quadbase.ws.qb_accountID = "22071";


/**
 * set expire date to be 1 year
 */
quadbase.ws.getExpireDate = function() {
//document.write("getexpiredate<br>"); 
 return (new Date((new Date()).getTime()+31536000000)).toGMTString();
};

quadbase.ws.trim = function(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
};


/**
 * get one attribute from the cookie
 *
 * this function can also be used to obtain a parameter value from the URL.
 *
 * @param cookieStr the cookie in string representation: format: key=value;
 * @param key: the name of the cookie attribute
 * @param delim: the deliminator for the cookie attribute string (ususally it is ";")
 *
 * @return the value for the key or null if the key is not found from the cookie
 */
quadbase.ws.getCookieAttr = function(cookieStr, key, delim) {
	////document.write("Looking for cookie: " + key + " in " + cookieStr + " with " + delim + " as delimiter<br>");
	if (!cookieStr || cookieStr==="" || !key || key==="" || !delim || delim==="") {
		return null;
	}
	
	////document.write("Inputs look valid<br>");
	var cookies = cookieStr.split(";"); // break into cookies
	for (var j = 0; j < cookies.length; j++) {
		var cs = cookies[j].split(delim);
		for (var i = 0; i < cs.length; i++) {
			var pair = cs[i].split("=");
			////document.write("cookie: " + cs[i]+" : '" + pair[0] + "' -- '" + pair[1] + "'<br>");	
			if (quadbase.ws.trim(pair[0]) == quadbase.ws.trim(key)) {
				////document.write("Found: "+ pair[1] + "<br>");
				return pair[1];
			}
		}
	}
	////document.write("WARNING: getCookieAttr - cookie value not found!<br>");
	return null;
};

/**
 * Create visit user's unique ID (java maxInt * random)
 */
quadbase.ws.createUID = function() {
	//var ms = (new Date()).getTime();
	var uid = Math.round(2147483647 * Math.random());
	return uid;
};

/**
 * Obtain visit user's ID from cookie
 */
quadbase.ws.getUID = function() {
	var uid = quadbase.ws.getCookieAttr(document.cookie, "randomID", "~");
	if (uid === null) {
		uid = quadbase.ws.createUID();
	}
	return uid;
};


quadbase.ws.randomID = quadbase.ws.getUID();

quadbase.ws.qb_Stats =function(userAccount) {
	return;
};


/**
 * Get user's brower's settings
 * @param toCookie: true: return a string for setting the cookie
 *                  false: return a string for sending to the server
 */
quadbase.ws.getBrowserInfo = function(toCookie) {
	////document.write("Find-a-browser.<br>");
	var n=navigator;
	var screenSize = "";
	var screenColor = "";
	var userLang = "";
	var isJavaEnabled = false;
	var flashVersion = "-";
	var charset = "";
	var osType = "";
	var osVersion = "";

	var bname;
	var bversion;
	
	var ua = navigator.userAgent; 
	
	if (/MSIE \d+\.\d+/.test(ua)){ //test for MSIE x.x;
		bname = "MSIE";
		bversion=new Number(RegExp.$1); // capture x.x portion and store as a number
 	} else if (/Netscape[\/\s](\d+\.\d+)/.test(ua)) { 
		//Note: Must be placed prior to Firefox for accurate detection.
		//The latest builds of Netscape are Firefox based.  
 		bname = "Netscape";
 		bversion = new Number(RegExp.$1);
 	} else if (/Firefox[\/\s](\d+\.\d+)/.test(ua)){ //test for Firefox/x.x or Firefox x.x (ignoring remaining digits);
 		bname = "FireFox";
 		bversion=new Number(RegExp.$1); // capture x.x portion and store as a number
 	} else if (/Chrome[\/\s](\d+\.\d+)/.test(ua)) {
 		//Safari-based. Must be placed before Safari for accurate detection. 
 		bname = "Chrome";
 		bversion = new Number(RegExp.$1);
 	} else if (/Safari[\/\s](\d+\.\d+)/.test(ua)) {
 		bname = "Safari";
 		bversion = new Number(RegExp.$1);
 	} else if (/Opera[\/\s](\d+\.\d+)/.test(ua)) {
 		bname = "Opera";
 		bversion = new Number(RegExp.$1);
 	} else if (/AOL[\/\s](\d+\.\d+)/.test(ua)) {
 		bname = "AOL";
 		bversion = new Number(RegExp.$1);
 	} else if (/Gecko[\/\s](\d+\.\d+)/.test(ua)) {
 		bname = "Gecko";
 		bversion = new Number(RegExp.$1);
 	} else if (/Mozilla[\/\s](\d+\.\d+)/.test(ua)) {
 		//All other Mozilla-based browsers.
 		//Most of the above are Mozilla-based/compatible, so this must be last.  
 		bname = "Other Mozilla";
 		bversion = new Number(RegExp.$1);
 	} else {
 		bname = "Other Non-Mozilla";
 		bversion = " ";
 	}
 	//reference URL: http://www.javascriptkit.com/jsref/navigator.shtml	
	
	if (/Win16/.test(ua)){ //test for Windows 3x
		osType = "Windows";
		osVersion="3.11";
 	} else if (/(Windows 95)|(Win95)|(Windows_95)/.test(ua)){ //test for Windows 95
		osType = "Windows";
		osVersion="95";
 	} else if (/(Windows 98)|(Win98)/.test(ua)){ //test for Windows 98
		osType = "Windows";
		osVersion="98";
 	}  else if (/(Windows NT 5.0)|(Windows 2000)/.test(ua)){ //test for Windows 2000
		osType = "Windows";
		osVersion= "2000";
 	}  else if (/(Windows NT 5.1)|(Windows XP)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="XP";
 	} else if (/(Windows NT 5.2)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="Server 2003";
 	} else if (/(Windows NT 6.0)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="Vista";
 	}   else if (/(Windows NT 7.0)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="7";
 	}  else if (/(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="NT 4.0";
 	}  else if (/(Windows ME)/.test(ua)){ //test for Windows XP
		osType = "Windows";
		osVersion="ME";
 	} else if (/(OpenBSD)/.test(ua)){ //test for OpenBSD
		osType = "OpenBSD";
		osVersion=" ";
 	} else if (/(SunOS)/.test(ua)){ //test for Sun OS
		osType = "Sun OS";
		osVersion=" ";
 	} else if (/(Linux)|(X11)/.test(ua)){ //test for Linux
		osType = "Linux";
		osVersion=" ";
 	} else if (/(Mac OS X)/.test(ua)){ //test for Mac OSX 
		osType = "Mac";
		osVersion="OSX";
 	} else if (/(Mac_PowerPC)|(Macintosh)/.test(ua)){ //test for Mac - other versions 
		osType = "Mac OS";
		osVersion=" ";
 	} else if (/(QNX)/.test(ua)){ //test for QNX 
		osType = "QNX";
		osVersion=" ";
 	} else if (/(BeOS)/.test(ua)){ //test for BeOS 
		osType = "BeOS";
		osVersion=" ";
 	} else if (/(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\/Teoma)|(ia_archiver)/.test(ua)){ //test for search engine 
		osType = "Search Engine";
		osVersion=" ";
 	} else {
 		osType = "Other";
		osVersion=" ";
 	}
	
 	

	if (n.language) { 
		userLang = n.language.toLowerCase(); 
	}
	else if (n.browserLanguage) { 
		userLang = n.browserLanguage.toLowerCase(); 
	}
	
	if (self.screen) {
		screenSize = screen.width + "x" + screen.height;
		////document.write("Found screensize: " + screenSize + "<br>");
		screenColor = screen.colorDepth + "-bit";
		////document.write("Found screencolor: " + screenColor + "<br>");
	} else if (self.java) {
		var j = java.awt.Toolkit.getDefaultToolkit();
		var sc = j.getScreenSize();
		screenSize = sc.width + "x" + sc.height;
		////document.write("Found screensize: " + screenSize + "<br>");
		////document.write("Cannot find screencolor<br>");
	}
	////document.write("Found-a-browser: " + bname+"<br>");
	isJavaEnabled = n.javaEnabled();
	//isJavaEnabled = false;
	////document.write("Does-a-browser have Java?" + isJavaEnabled +"<br>");
	flashVersion = quadbase.ws.getFlashVersion(); 

	
	if (document.characterSet) { 
		charset=document.characterSet;
	} else if (document.charset) { 
		charset = document.charset;
	}
	
	
	var s = "";
	if (toCookie) {
		//document.write("Baking a tasty cookie<br>");
		//construct the cookie string 
		//uses semicolin as delimiter 
		s = "screenSize=" + escape(screenSize); 
		s +="~screenColor=" + escape(screenColor);
		s +="~userLang="+ escape(userLang);
		s +="~isJavaEnabled="+escape(isJavaEnabled);
		s +="~flashVersion="+escape(flashVersion);
		s +="~charSet="+escape(charset);
		s +="~bName="+escape(bname);
		s +="~bVersion="+escape(bversion);
		s +="~osVersion="+escape(osVersion);
		s +="~osType="+escape(osType) + "<br>";
 		//document.write("Browser found: " + s+"<br>");
		return s;
	}
	else {
		//construct the URL request string (&name=value...)
		//document.write("This is too stringy to be a cookie, isn't it?<br>");
		
		////document.write("screensize=" + screenSize); 
		////document.write("&screencolor=" + screenColor);
		////document.write("&userLang="+ userLang);
		////document.write("&isJavaEnabled="+isJavaEnabled);
		////document.write("&flashversion="+flashVersion);
		////document.write("&charset="+encodeURIComponent(charset));
		////document.write("&bname="+encodeURIComponent(bname));
		////document.write("&bversion="+encodeURIComponent(bversion) + ";<br>");
		
		s = "screenSize=" + encodeURIComponent(screenSize); 
		s +="&screenColor=" + encodeURIComponent(screenColor);
		s +="&userLang="+ encodeURIComponent(userLang);
		s +="&isJavaEnabled="+encodeURIComponent(isJavaEnabled);
		s +="&flashVersion="+encodeURIComponent(flashVersion);
		s +="&charSet="+encodeURIComponent(charset);
		s +="&bName="+encodeURIComponent(bname);
		s +="&bVersion="+encodeURIComponent(bversion);
		s +="&osVersion="+escape(osVersion);
		s +="&osType="+escape(osType);
		//document.write("Browser found: " + s +"<br>");
		return s;
	}
};


/**
 * Get the webpage's URL
 */
quadbase.ws.getCurrentPageInfo = function(toCookie) {
	if (toCookie)
	{
		return "location="+escape(location.href) + ";";
	} else {
		return "&location="+encodeURIComponent(location.href);
	}
};



/**
 * Check if "Shockwave Flash" is installed in the browser
 *
 * @return "-" if not found in the plugin list
 *         Flash version number
 */
quadbase.ws.getFlashVersion = function() {
	////document.write("Find-a-flashversion<br>");
	var f="-",n=navigator;
	if (n.plugins && n.plugins.length) {
		////document.write("Going through the plugins");
		for (var i=0; i<n.plugins.length; i++) {
			if (n.plugins[i].name.match(/^Shockwave Flash/)) {
				//f=n.plugins[i].descrtion.replace(/^Shockwave Flash /, "");
				break;
			}
		}
	} else if (window.ActiveXObject) {
		////document.write("The window is activeX!<br>");
		for (var i = 10; i >= 2 ; i--) {
			try {
				var fl=eval("new ActiveXObject('ShockwaveFlash.ShockwaveFlash." + i + "');");
				if (fl) { 
					f = i + '.0'; 
					break; 
				}
			}
			catch(e) 
			{
				////document.write("Tried to catch a flashversion. Caught something else.<br>");
			}
		}
	}
	////document.write("Did we find-a-flashversion? " + f + "<br>");
	return f;
};

/**
 * obtain the domain name of current page
 */
quadbase.ws.getDomain = function() {
	var d = document.domain;
	if (d.substring(0,4)=="www.") {
		d=d.substring(4,d.length);
	}
	d = d.toLowerCase();
	return d;
};

/**
 * Obtain Referal page information
 *
 * @return 
 */
quadbase.ws.getRefInfo = function() {
	//for example: referral URL = "http://www.google.com?q=aaa	(/find key word from this url)
	//or referral URL = "http://www.hotmail.com?msgID=xxxxxx
	//URL formatted
	var ref = document.referrer;
	//document.write("Getting referer info: " + ref + " <br>");
	var seKeyWord = "";
	var foundKeyword = false;
	
	var loc = ref.indexOf("://");
	if (loc < 0) return "";
	
	var refURL = ref.substring(loc + 3);
	var loc2 = refURL.indexOf(":");
	loc = refURL.indexOf("/");

	if(loc2 < loc) loc =loc2;
	
	//document.write("refURL: " + refURL + "<br>");
	var refDomain;
	var referalStr;
	var loc2 = refURL.indexOf("?");
	////document.write("gotloc<br>");
	////document.write("loc: " + loc + " loc2: " + loc2 + "<br>");

	var prefix = 0;
	if (refURL.substring(0,4)=="www.") {
		prefix = 4;
	}
	////document.write("prefix: " + prefix + "<br>");
	if (loc2 > 0) {		
		refDomain = refURL.substring(prefix, loc2);
	}
	else {
		refDomain = refURL.substring(prefix, loc);
	}

	refDomain = refDomain.toLowerCase();
	////document.write("Houston, we have a domain: " +refDomain + "<br>");
	
	if(loc2 > 0) {
		var argStr = refURL.substring(loc2 + 1);
		////document.write("Arg! A string! " + argStr + "<br>");
		var args = argStr.split("&");
		////document.write("Split args<br>");
		//get the search engine domain query parameter name
		var keys = new Array();
		for (var i = 0; i < quadbase.ws.qb_se.length; i++) {
			if (refDomain.indexOf(quadbase.ws.qb_se) > 0) {
				////document.write("Adding key to array:" + qb_sekw[i] + "<br>");
				keys[keys.length] = quadbase.ws.qb_sekw[i];
				 
			}
		}
		////document.write("Set up keys<br>");
		for (var i = 0; i < args.length; i++) {
			var pair = args[i].split("=");
			

			for (var j = 0; j < keys.length; j++) {
				if (pair[0] == keys[j]) {
					seKeyword = pair[1];
					foundKeyword = true;
					break;
				}
			}
			if (foundKeyword) break;
		}
		////document.write("Done looking for args<br>");
	}	
	//document.write("Found refdomain: " + refDomain + "<br>");
	if (foundKeyword) {
		
		//need to return referral URL, 
		//if it is from search engine, also need to return
		//the search engine host name, and the keyword
		//document.write("The string: &refUrl="+encodeURIComponent(ref)+"&refDomain="+encodeURIComponent(refDomain)+"&keyword="+encodeURIComponent(seKeyword));
		referalStr = "&refUrl="+encodeURIComponent(ref)+"&refDomain="+encodeURIComponent(refDomain)+"&keyword="+encodeURIComponent(seKeyword);
		//TODO: set up the return string or object for easy access
		//the process result
	}
	else {
		//document.write("There are no args.<br>");
		referalStr = "&refUrl="+encodeURIComponent(ref)+"&refDomain="+encodeURIComponent(refDomain);
	}
	return referalStr;
};

/**
 *
 */
quadbase.ws.updateCookieInfo = function() {
	//if the user never visit the website, create a new cookie for the user's ID
	//and set the expire time to 1 years
	//document.write("UpdateCookuieInfo called</br>");
	var dc = unescape(document.cookie);
	var randomID = quadbase.ws.getCookieAttr(dc, "randomID", "~");
	if (randomID == null) {
		
		randomID = quadbase.ws.createUID();
		var ed = "expires=" + quadbase.ws.getExpireDate() + "~" ;
		var domainStr = "domain=" + escape(quadbase.ws.getDomain());
		document.cookie = "randomID=" + randomID + "~" + domainStr  + "~path=/; " + ed;
		//document.write("New cookie created: randomID=" + randomID + "~" + domainStr  + "~ path=/; " + ed);
	}
	//else
		//document.write("You already have a cookie! No more cookies for you!<br>");
};

/**
 * get the total user visit time during the cookie session
 *
 * If it is a first time visit user, the total time will be 0 and a cookie
 * whose key is "qbvtime" will be added, and the value is set to 0,currentTime
 * 
 * Otherwise, the cookie "qbvtime" will be updated to:
 *    totalVisitTime,currentTime
 * Also the expiration date will be modified to the next 1800 sec
 *
 */
quadbase.ws.getUserVisitTime = function() {
	//
	var dc = document.cookie;
	//total_visit_time(int seconds),last_visit_time(long millisec)
	var visitTime = quadbase.ws.getCookieAttr(dc, "qbvtime", "~");
	//document.write("found visitTime: " + visitTime +"<br>");
	var currTime = (new Date()).getTime();
	var ed = "expires=" + (new Date(currTime + quadbase.ws.qb_cookieTimeout)).toGMTString();
	
	var totalTime = 0;
	var cstring = "";
	var domainStr = "domain=" + escape(quadbase.ws.getDomain()) + "~";
	if (visitTime == null) {
		cstring = "0," + currTime;
	}
	else {
		var vtime = visitTime.split(","); 
		//document.write("Time: '" + vtime[0] + "' : '" + vtime[1] + "'<br>");
		totalTime = parseInt(vtime[0]);
		//document.write("found totalTime: " + totalTime +"<br>");
		var lastVisitTime = parseInt(vtime[1]);
		//document.write("found lastVisitTime: " + lastVisitTime +"<br>");
		
		totalTime += (currTime - lastVisitTime);
		
		cstring = totalTime + "," + currTime;
	}
	
	document.cookie = "qbvtime=" + cstring + "~" + domainStr + "path=/;" + ed;
	
	return totalTime;
};