/*
what:		Captures form value and sends it transparently during submit for coregistration.
requirement:	Paste generated JS code, use wrapper function in onSubmit or onClick function as in: onsubmit="return AdFeverCoRegJSObj.submitWrapper('formValidation()');"
		where formValidation() is the client side form validation javascript function (the name is not important)
author: AdFever
comment: This code works in conjonction with the  JS code generated on the adfever platform. The generated code is to be pasted in the client HTML headers. Modification to the client form tag is required only if the client form has an onsubmit event handler to perform form validation.  In the latter case, wrap your validation function as in the example below. Note that the code below is provided as an example only.

	<form id="mng" name="register_form" onsubmit="return formValidation()">

	becomes

	<form id="mng" name="register_form" onsubmit="return AdFeverCoRegJSObj.submitWrapper('formValidation()')">

*/

////////////////////////////////////// GENERATE UNIQYUE KEY

function adfeverMakeUUID () {
	var adfever_UUID = {
		 id:"" ,
		createUUID: function(){
			  var dg = this.timeInMs(new Date(1582, 10, 15, 0, 0, 0, 0));
			  var dc = this.timeInMs(new Date());
			  var t = dc - dg;
			  var h = '-';
			  var tl = this.getIntegerBits(t,0,31);
			  var tm = this.getIntegerBits(t,32,47);
			  var thv = this.getIntegerBits(t,48,59) + '1'; // version 1, security version is 2
			  var csar = this.getIntegerBits(this.randrange(0,4095),0,7);
			  var csl = this.getIntegerBits(this.randrange(0,4095),0,7);
			  var n = this.getIntegerBits(this.randrange(0,8191),0,7) +
			          this.getIntegerBits(this.randrange(0,8191),8,15) +
			          this.getIntegerBits(this.randrange(0,8191),0,7) +
			          this.getIntegerBits(this.randrange(0,8191),8,15) +
			          this.getIntegerBits(this.randrange(0,8191),0,15); // this last number is two octets long
			  this.id = tl + h + tm + h + thv + h + csar + csl + h + n;
			  return this.id;
		},
		valueOf: function(){ return this.id; },
		toString: function(){ return this.id; },
		getIntegerBits: function(val,start,end){
			  var base16 = this.returnBase(val,16);
			  var quadArray = new Array();
			  var quadString = '';
			  var i = 0;
			  for(i=0;i<base16.length;i++){
			      quadArray.push(base16.substring(i,i+1));       }
			  for(i=Math.floor(start/4);i<=Math.floor(end/4);i++){
			      if(!quadArray[i] || quadArray[i] == '') quadString += '0';
			      else quadString += quadArray[i];
			  }
			  return quadString;
		},
		returnBase: function(number, base) {
			  var convert = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
			  if (number < base) var output = convert[number];
			  else {
			      var MSD = '' + Math.floor(number / base);
			      var LSD = number - MSD*base;
			      if (MSD >= base) var output = this.returnBase(MSD,base) + convert[LSD];
			      else var output = convert[MSD] + convert[LSD];
			  }
			  return output;
		},
		timeInMs: function(d){
			  var ms_per_second = 100; // constant
			  var ms_per_minute = 6000; // ms_per second * 60;
			  var ms_per_hour   = 360000; // ms_per_minute * 60;
			  var ms_per_day    = 8640000; // ms_per_hour * 24;
			  var ms_per_month  = 207360000; // ms_per_day * 30;
			  var ms_per_year   = 75686400000; // ms_per_day * 365;
			  return Math.abs((d.getUTCFullYear() * ms_per_year) + (d.getUTCMonth() * ms_per_month) + (d.getUTCDate() * ms_per_day) + (d.getUTCHours() * ms_per_hour) + (d.getUTCMinutes() * ms_per_minute) + (d.getUTCSeconds() * ms_per_second) + d.getUTCMilliseconds());
		},
		randrange: function(min,max){
			  var num = Math.round(Math.random() * max);
			  if(num < min){
			      num = min;
			  } else if (num > max) {
			      num = max;
			  }
			  return num;
		}
	}
	adfever_UUID.createUUID();
	return adfever_UUID;
}
////////////////////////// registration stuff //////////////////////
function AdFeverReg(filterBool) {

var AdfeverSession = new adfeverMakeUUID();

var filterB = (filterBool == undefined)?false:filterBool;
var Af={
	cookieName:"adfever_coreg_session_id",
	trackerCookieName: "adfevertracker",
	actionCookieScript: "http://www.adfever.com/editor/coregistration/onpageloadfirsttime",
	regForm:{},
	filterOn: filterB,
	currentAdFeverField:"",
	fid:"",
	phpscript:"",
	adfeverScript: "http://www.adfever.com/editor/coregistration/coregister",
	GetCheckBoxRadioQstr: function (ele) {
		if (ele.checked) {
			var eName = (this.filterOn)?this.currentAdFeverField:ele.name;
			var str=eName+"="+encodeURIComponent(ele.value)
		}
		return str
	},
	GetSelectQstr: function (ele) {
		var arr=new Array()
		with (ele) {
			for (var i=0;i<options.length;i++) {
				if (options[i].selected==true) {
					var eName = (this.filterOn)?this.currentAdFeverField:ele.name;
					var str=eName+"="+encodeURIComponent(options[i].value)
					arr.push(str)
				}
			}
		}
		return arr.join('&')
	},
	GetTextQstr: function (ele) {
		with (ele) {
			var eName = (this.filterOn)?this.currentAdFeverField:name;
			var str=eName+"="+encodeURIComponent(value)
		}
		return str
	},
	makePostQstr: function (theForm) {
		var arr=new Array()
		with (theForm) {
			for (var i=0; i < elements.length; i++) {
				//alert(elements[i].type)
				if ( (this.noField(elements[i].name)) && (this.filterOn) ) {
					continue;
				}

				switch (elements[i].type) {
					case 'checkbox':
						if (elements[i].checked) {
							arr.push(this.GetCheckBoxRadioQstr(elements[i]))
						}
						break;
					case 'radio':
						if (elements[i].checked) {
							arr.push(this.GetCheckBoxRadioQstr(elements[i]))
						}
						break;
					case 'select-one':
						arr.push(this.GetSelectQstr(elements[i]))
						break;
					case 'select-multiple':
						arr.push(this.GetSelectQstr(elements[i]))
						break;
					case 'text':
						arr.push(this.GetTextQstr(elements[i]))
						break;
					case 'textarea':
						arr.push(this.GetTextQstr(elements[i]))
						break;
					case 'password':
						arr.push(this.GetTextQstr(elements[i]))
						break;
					case 'hidden':
						arr.push(this.GetTextQstr(elements[i]))
						break;
					case 'button':
						arr.push(this.GetTextQstr(elements[i]))
						break;
					default:
						//arr.push(this.GetTextQstr(elements[i]))
				}
			}
		}
		return arr.join('&')
	},
	send2AdFeverByName: function (n, fid) {
		var e=document.getElementsByName(n);
		var qstr = this.makePostQstr(e[0]);
		this.callImg(qstr + "&" + this.formatPair("fid",fid));
		return true;

	},
	send2AdFeverById: function (i, fid) {
		var qstr = this.makePostQstr(document.getElementById(i));
		this.callImg(qstr + "&" + this.formatPair("fid",fid));
	},
	callImg: function (qstr) {
		this.phpscript = this.adfeverScript + "?" + qstr;
		var objImage = new Image();
		objImage.src=this.phpscript;
		objImage.onLoad=this.imagesLoaded();
	},
	formatPair: function (k, v) {
		return k + "=" + encodeURIComponent(v);

	},
	imagesLoaded: function (s) {    
		this.resetVal();
	},
	resetVal: function () {
		this.phpscript="";
	},
	noField: function (eleName) { // check if it's a value to send
		for (n in adfever_field_match) {
			if (adfever_field_match[n] == eleName) {
				this.currentAdFeverField = n;
				return false;
			}
		}
		return true;
	},
	init: function () {
		this.setCookie(this.trackerCookieName, "1", 0);
		////////////////////// Dean Edwards////////////////
		// quit if this function has already been called
		if (arguments.callee.done) return;
		// flag this function so we don't do the same thing twice
		arguments.callee.done = true;
		//////////////////////////////////////////////////////
		var e=document.getElementsByName(adfever_param_fr_name);
		this.regForm = e[0];
		var old_submit =this.regForm.onsubmit;
		if (typeof(this.regForm.onsubmit) != "function" ) {
			this.regForm.onsubmit = function () {
				Af.send2AdFeverByName(adfever_param_fr_name, adfever_param_fid);
				//setTimeout(function() {Af.regForm.submit()}, 500);
				return false;
			}
		}
	},
	submitWrapper: function (fxname) {
		var e=document.getElementsByName(adfever_param_fr_name);
		this.regForm = e[0];
		if (  ( (fxname != undefined) && eval(fxname) ) || ((fxname == undefined)) ) {
			Af.send2AdFeverByName(adfever_param_fr_name, adfever_param_fid);
			setTimeout(function() {Af.regForm.submit()}, 1000);
		}
		return false; // 3cases: so the form is not submitted onsubmit or on button click, but programmatically after a short delay: leaves time for adfever request
	},
	ask4Cookie: function () {
		var objImage = new Image();
		objImage.src= this.actionCookieScript;
	},
	setCookie: function (cookieName, cookieValue, nDays) {
		if (this.getCookie(cookieName)) {
			return 0; // do not set cookie again if already set
		}
		var today = new Date();
		var expire = new Date();
		if (nDays==null || nDays==0) nDays=1;
		expire.setTime(today.getTime() + 3600000*24*nDays);
		document.cookie = cookieName+"="+escape(cookieValue) + "; expires="+expire.toGMTString();
		this.ask4Cookie(); // Get server cookie
	},
	getCookie: function (cookieName) {
		var cookie = " " + document.cookie;
		var search = " " + escape(cookieName) + "=";
		var setStr = null;
		var offset = 0;
		var end = 0;
		if (cookie.length > 0) {
			offset = cookie.indexOf(search);
			if (offset!= -1) {
				offset += search.length;
				end = cookie.indexOf(";", offset)
				if (end == -1) {
					end = cookie.length;
				}
				setStr = unescape(cookie.substring(offset, end));
			}
		}
		return(setStr);
	}
	} // JSON
	return Af;
}// class
//////////////////////////////////////
var AdFeverCoRegJSObj = new AdFeverReg(true); // has filter turned on
// For Mozilla
function AdFeverCoRegJSObjInitWrapper() {
	AdFeverCoRegJSObj.init();
}
/* for Mozilla */
if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", AdFeverCoRegJSObjInitWrapper, false);
}
// for Internet Explorer (using conditional comments)
/*@cc_on @*/
/*@if (@_win32)
document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
	if (this.readyState == "complete") {
		AdFeverCoRegJSObj.init(); // call the onload handler
	}
};
/*@end @*/
if (/WebKit/i.test(navigator.userAgent)) { // sniff
	var _timer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
			clearInterval(_timer);
			AdFeverCoRegJSObj.init(); // call the onload handler
		}
	}, 10);
}
/* GENERATED JS eg.:
<script type="text/javascript">
	var adfever_param_fr_name = "adfever_form";
	var adfever_param_fid = "058dhmnoqsuxEIKMNOSV";
	var adfever_field_match = {
			first_name: "fname",
			last_name: "lname",
			email: "em",
			login: "username"
		}
</script>
<script type="text/javascript" src="/js/jm/collect_form_val.js"></script>
*/
