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}('k N=0;k O="";k u=8;l P(s){m G(z(B(s),s.v*u))}l V(s){m H(z(B(s),s.v*u))}l W(s){m I(z(B(s),s.v*u))}l X(a,b){m G(E(a,b))}l Y(a,b){m H(E(a,b))}l Z(a,b){m I(E(a,b))}l 18(){m P("19")=="1a"}l z(x,e){x[e>>5]|=1b<<((e)%C);x[(((e+1c)>>>9)<<4)+14]=e;k a=1d;k b=-1e;k c=-1f;k d=1g;A(k i=0;i<x.v;i+=16){k f=a;k g=b;k h=c;k j=d;a=n(a,b,c,d,x[i+0],7,-1h);d=n(d,a,b,c,x[i+1],12,-1i);c=n(c,d,a,b,x[i+2],17,1j);b=n(b,c,d,a,x[i+3],22,-1k);a=n(a,b,c,d,x[i+4],7,-1l);d=n(d,a,b,c,x[i+5],12,1m);c=n(c,d,a,b,x[i+6],17,-1n);b=n(b,c,d,a,x[i+7],22,-1o);a=n(a,b,c,d,x[i+8],7,1p);d=n(d,a,b,c,x[i+9],12,-1q);c=n(c,d,a,b,x[i+10],17,-1r);b=n(b,c,d,a,x[i+11],22,-1s);a=n(a,b,c,d,x[i+12],7,1t);d=n(d,a,b,c,x[i+13],12,-1u);c=n(c,d,a,b,x[i+14],17,-1v);b=n(b,c,d,a,x[i+15],22,1w);a=o(a,b,c,d,x[i+1],5,-1x);d=o(d,a,b,c,x[i+6],9,-1y);c=o(c,d,a,b,x[i+11],14,1z);b=o(b,c,d,a,x[i+0],20,-1A);a=o(a,b,c,d,x[i+5],5,-1B);d=o(d,a,b,c,x[i+10],9,1C);c=o(c,d,a,b,x[i+15],14,-1D);b=o(b,c,d,a,x[i+4],20,-1E);a=o(a,b,c,d,x[i+9],5,1F);d=o(d,a,b,c,x[i+14],9,-1G);c=o(c,d,a,b,x[i+3],14,-1H);b=o(b,c,d,a,x[i+8],20,1I);a=o(a,b,c,d,x[i+13],5,-1J);d=o(d,a,b,c,x[i+2],9,-1K);c=o(c,d,a,b,x[i+7],14,1L);b=o(b,c,d,a,x[i+12],20,-1M);a=p(a,b,c,d,x[i+5],4,-1N);d=p(d,a,b,c,x[i+8],11,-1O);c=p(c,d,a,b,x[i+11],16,1P);b=p(b,c,d,a,x[i+14],23,-1Q);a=p(a,b,c,d,x[i+1],4,-1R);d=p(d,a,b,c,x[i+4],11,1S);c=p(c,d,a,b,x[i+7],16,-1T);b=p(b,c,d,a,x[i+10],23,-1U);a=p(a,b,c,d,x[i+13],4,1V);d=p(d,a,b,c,x[i+0],11,-1W);c=p(c,d,a,b,x[i+3],16,-1X);b=p(b,c,d,a,x[i+6],23,1Y);a=p(a,b,c,d,x[i+9],4,-1Z);d=p(d,a,b,c,x[i+12],11,-24);c=p(c,d,a,b,x[i+15],16,25);b=p(b,c,d,a,x[i+2],23,-26);a=r(a,b,c,d,x[i+0],6,-27);d=r(d,a,b,c,x[i+7],10,28);c=r(c,d,a,b,x[i+14],15,-29);b=r(b,c,d,a,x[i+5],21,-2a);a=r(a,b,c,d,x[i+12],6,2b);d=r(d,a,b,c,x[i+3],10,-2c);c=r(c,d,a,b,x[i+10],15,-2d);b=r(b,c,d,a,x[i+1],21,-2e);a=r(a,b,c,d,x[i+8],6,2f);d=r(d,a,b,c,x[i+15],10,-2g);c=r(c,d,a,b,x[i+6],15,-2h);b=r(b,c,d,a,x[i+13],21,2i);a=r(a,b,c,d,x[i+4],6,-2j);d=r(d,a,b,c,x[i+11],10,-2k);c=r(c,d,a,b,x[i+2],15,2l);b=r(b,c,d,a,x[i+9],21,-2m);a=w(a,f);b=w(b,g);c=w(c,h);d=w(d,j)}m F(a,b,c,d)}l D(q,a,b,x,s,t){m w(Q(w(w(a,q),w(x,t)),s),b)}l n(a,b,c,d,x,s,t){m D((b&c)|((~b)&d),a,b,x,s,t)}l o(a,b,c,d,x,s,t){m D((b&d)|(c&(~d)),a,b,x,s,t)}l p(a,b,c,d,x,s,t){m D(b^c^d,a,b,x,s,t)}l r(a,b,c,d,x,s,t){m D(c^(b|(~d)),a,b,x,s,t)}l E(a,b){k c=B(a);R(c.v>16)c=z(c,a.v*u);k d=F(16),J=F(16);A(k i=0;i<16;i++){d[i]=c[i]^2n;J[i]=c[i]^2o}k e=z(d.S(B(b)),T+b.v*u);m z(J.S(e),T+2p)}l w(x,y){k a=(x&K)+(y&K);k b=(x>>16)+(y>>16)+(a>>16);m(b<<16)|(a&K)}l Q(a,b){m(a<<b)|(a>>>(C-b))}l B(a){k b=F();k c=(1<<u)-1;A(k i=0;i<a.v*u;i+=u)b[i>>5]|=(a.2q(i/u)&c)<<(i%C);m b}l I(a){k b="";k c=(1<<u)-1;A(k i=0;i<a.v*C;i+=u)b+=2r.2s((a[i>>5]>>>(i%C))&c);m b}l G(a){k b=N?"2t":"2u";k c="";A(k i=0;i<a.v*4;i++){c+=b.L((a[i>>2]>>((i%4)*8+4))&U)+b.L((a[i>>2]>>((i%4)*8))&U)}m c}l H(a){k b="2v+/";k c="";A(k i=0;i<a.v*4;i+=3){k d=(((a[i>>2]>>8*(i%4))&M)<<16)|(((a[i+1>>2]>>8*((i+1)%4))&M)<<8)|((a[i+2>>2]>>8*((i+2)%4))&M);A(k j=0;j<4;j++){R(i*8+j*6>a.v*C)c+=O;2w c+=b.L((d>>6*(3-j))&2x)}}m c}',62,158,'||||||||||||||||||||var|function|return|md5_ff|md5_gg|md5_hh||md5_ii|||chrsz|length|safe_add|||core_md5|for|str2binl|32|md5_cmn|core_hmac_md5|Array|binl2hex|binl2b64|binl2str|opad|0xFFFF|charAt|0xFF|hexcase|b64pad|hex_md5|bit_rol|if|concat|512|0xF|b64_md5|str_md5|hex_hmac_md5|b64_hmac_md5|str_hmac_md5|||||||||md5_vm_test|abc|900150983cd24fb0d6963f7d28e17f72|0x80|64|1732584193|271733879|1732584194|271733878|680876936|389564586|606105819|1044525330|176418897|1200080426|1473231341|45705983|1770035416|1958414417|42063|1990404162|1804603682|40341101|1502002290|1236535329|165796510|1069501632|643717713|373897302|701558691|38016083|660478335|405537848|568446438|1019803690|187363961|1163531501|1444681467|51403784|1735328473|1926607734|378558|2022574463|1839030562|35309556|1530992060|1272893353|155497632|1094730640|681279174|358537222|722521979|76029189|640364487|||||421815835|530742520|995338651|198630844|1126891415|1416354905|57434055|1700485571|1894986606|1051523|2054922799|1873313359|30611744|1560198380|1309151649|145523070|1120210379|718787259|343485551|0x36363636|0x5C5C5C5C|128|charCodeAt|String|fromCharCode|0123456789ABCDEF|0123456789abcdef|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|else|0x3F'.split('|'),0,{}));


/**
 * Contains events to happen on server returns where the responseText
 * matches one of these function names;
 */
var ajaxFunctions = {
    'invalid-argument': function(retObj){
		alert(retObj.responseText.substring(retObj.responseText.indexOf("\r\n") + 2));
    },
	'article-delete-confirmation': function(retObj){
		alert('The article was deleted, Dave');
	},
	'article-post-saved': function(retObj){
		window.location = window.location.href.replace('/edit', '/saved');
	},
	'article-post-incomplete': function(retObj){
		if(!window.submittedForm){
			alert('You did not submit valid data');
			return;
		}
		
		var frm = window.submittedForm;
		
		var frmElements = frm.getChildren();

		var badFields = '';
		for(var i in retObj)
			for(j=0, k=frmElements.length; j < k; j++)
				if(frmElements[j].name == i)
				{
					badFields = dojo.query('label[for="'+i+'"]', frm.domNode); badFields = badFields[0].innerHTML + ": ";
					for(err in retObj[i])
						badFields += retObj[i][err] + "\r\n";
					badFields += "\r\n";
				}
		
		alert("There were errors with your submitted data:\r\n" + badFields);
		window.submittedForm = undefined;
	},
	'free-money-sign': function(retObj)
	{
		alert('Thank you! Please check your email for your link to view all the great offers we have!');
	},
	'post-nocaptcha': function(retObj){
		alert('You must enter the captcha field.');
	},
	'post-captcha-invalid': function(retObj){
		alert('The captcha you entered was invalid.');
	},
	'comment-post-incomplete': function(retObj){
		alert('You did not enter a comment');
	},
	'comment-post-complete': function(retObj){
		dijit.byId('comment').value = '';
		getAllComments(true);
	},
	'comment-post-deleted': function(retObj){
		alert('Comment was deleted');
		for(i=0, j=window.textAreas.length; i < j; i++)
		{
			window.textAreas[0].destroy();
			window.textAreas.splice(0, 1);
			window.buttons[0].destroy();
			window.buttons.splice(0, 1);
		}
		getAllComments(true);
	},
	'comment-post-updated': function(retObj){
		alert('Comment was updated');
		for(i=0, j=window.textAreas.length; i < j; i++)
		{
			window.textAreas[0].destroy();
			window.textAreas.splice(0, 1);
			window.buttons[0].destroy();
			window.buttons.splice(0, 1);
		}
		getAllComments(true);
	},
	'content-bad-rating': function(retObj){
		alert('You supplied an invalid rating');
	},
	'content-rating-accepted': function(retObj){
		alert('Thank you for you rating');
	},
	'user-logged-in': function(retObj){
		if(dojo.byId('frmAjaxLogin'))
			dojo.destroy(dojo.byId('frmAjaxLogin'));
		if(window.xhrOnLogin)
			window.xhrOnLogin.call(window.xhrOnLogin.data);
		window.xhrOnLogin = undefined;
		
		location.reload();
	},
	'user-saved': function(retObj){
		alert('Your details have been updated');
	},
	'user-error': function(retObj){
		alert('There was an error saving your details');
	},
	'invalid-login': function(retObj){
		alert('The login you provided is invalid.');
	},
	'reset-request-complete': function(retObj){
		alert('Your request has been processed, please check your email and follow the instructions.');
	},
	'reset-request-incomplete': function(retObj){
		alert('The email address you entered was not valid.');
	},
	'reset-request-invalid': function(retObj){
		alert('Unprocessable Entity: The request was well-formed but was unable to be processed due to errors');
	},
	'reset-request-conflict': function(retObj){
		alert('Conflict: Password was not changed due as password change code has expired');
	},
	'reset-request-success': function (retObj){
		alert('Your password was changed successfully, you may now login using the new password');
	},
	'register-user-created': function(retObj){
		//document.cookie = 'user=' + escape(retObj.user) + '; path=/; domain=' + retObj.domain;
		//document.cookie = 'hash=' + escape(retObj.hash) + '; path=/; domain=' + retObj.domain;
		
		alert('Your account has been created, please wait while we redirect you.');
		location.href = 'http://' + window.location.host + retObj.url;
	},
	'register-user-failed': function(retObj){
		alert('The email address you entered is already in use!');
	},
	'search-save-invalid': function(retObj){
		alert('You must provide a search query and title to save.');
	},
	'search-saved': function(retObj){
		alert('Your search was saved successfully.');
	},
	'search-save-failed': function(retObj){
		alert('There was an error saving your search');
	},
	'review-post-captcha': function(retObj){
		alert('The captcha you entered was invalid, please try again');
	},
	'review-post-incomplete': function(retObj){
		alert('You did not complete the entire form.');
	},
	'review-post-complete': function(retObj){
		location.href = location.href.replace('/reviews/create', '#reviews');
	},
	'review-post-failed': function(retObj){
		alert('There was an error saving your review, please try again later.');
	},
	'merchant-post-complete': function(retObj){
		location.href = retObj.location;
	},
	'event-edited-ok': function(retObj){
		location.href = retObj.location;
	},
	'event-deleted-ok': function(retObj){
		location.href = '/events/';
	},
	'register-user-post-captcha': function(retObj){
		alert('The captcha you entered was invalid, please try again');
	},
	'register-user-post-password-confirm': function(retObj){
		alert("Your password and password confirmation fields do not match");
	},
	'register-user-post-email-invalid': function(retObj){
		alert('The email address entered was invalid.');
	},
	'register-user-post-email-exists': function(retObj){
		alert('A user with that email address already exists, forwarding you to the login page.');
		location = '/login';
	},
	'register-user-post-email-resent': function(retObj){
		alert('A user with that email has already attempted registration, the validation email has been re-sent.');
	},
	'register-user-post-email-ok': function(retObj){
		location = '/registration/sent';
	},
	'promotion-edited': function(retObj){
		
		alert('Promotion Updated');
		location = '/promotions/'+data+'/view';		
	},
	'promotion-deleted': function(retObj){
		
		alert('Promotion Deleted');
		location = '/promotions/'+data+'/view';		
	},
	'promotion-created': function(retObj){
		
		alert('Promotion Created');
		location = '/promotions/'+data+'/view';		
	},
	'email-invalid': function(retObj){
		alert('The email address you entered is not valid. Please enter a valid address');		
	}
	
};

/**
 * Submits a form via an AJAX request
 * 
 * @param frm
 */
function submitForm(frm, method, url){
	
	if(dojo.isString(frm))
		frm = dojo.byId(id);
	
	if(frm.id == 'frmEditMerchantUser')
		method = 'put';
	
	var iframes = dojo.query('iframe');
	for(var i = 0, j = iframes.length; i < j; i++)
	{
		if(iframes[i].id.indexOf('-Editor') > -1)
		{
			var iName = iframes[i].id.replace('_iframe', '');
			var parentNode = dijit.byId(iName).domNode._parent;
			if(undefined == parentNode)
				parentNode = dijit.byId(iName).domNode.parentNode;
			var input = dojo.query('input', parentNode);
			input[0].value = dijit.byId(iName).getValue(false);
		}
	}
	
	if(method == undefined)
		method = frm.method;
		
	if(url == undefined)
		url = frm.action;
	
	if(dojo.indexOf(['get', 'post', 'put', 'delete'], method) == -1)
		method = 'get';
	
	var xhrArgs = {
		'postData': dojo.formToQuery(frm.id),
		'url': url,
		'handleAs': 'text',
		'load': handleAjaxReturn,
		'error': handleAjaxReturn
	};
	
	var buttons = dojo.query('button');
	for(var i = 0, j = buttons.length; i < j; i++)
		if(dijit.byId(buttons[i].id))
			dijit.byId(buttons[i].id).setDisabled(true);
	
	window.submittedForm = frm;
	
	sendRequest(method, xhrArgs);
	
	return false;
}

/**
 * Validates a dojo/dijit form preventing the form
 * from being submitted and instead submitting via AJAX
 * if valid.
 * 
 * @param e
 */
function validateForm(e){
    e.preventDefault();
    window.ret = true;
	var form = dijit.byNode(e.target);

	if(!form.validate())
		window.ret = false;

    dojo.forEach(zendDijits, function(info) {
        var n = dojo.byId(info.id);
        if (null != n){
            if(!n.value && info.params.required){
           		dojo.addClass(info.id, 'dijitTextBoxError');
           		dojo.addClass(info.id, 'dijitDateTextBoxError');
           		dojo.addClass(info.id, 'dijitError');
            	window.ret = false;
            }else{
           		dojo.removeClass(info.id, 'dijitTextBoxError');
           		dojo.removeClass(info.id, 'dijitDateTextBoxError');
           		dojo.removeClass(info.id, 'dijitError');
            }
        }
    });	
    
    if(window.ret)
    	submitForm(form,form.method);
    
	return false;
}

dojo.addOnLoad(function(){
	var forms = dojo.query('form[dojoattachpoint]');
	if(forms.length == 0)
		forms = dojo.query('form[dojoattachpoint!=""]');
	dojo.forEach(forms, function(frm){
		var noAjax = dojo.query('input[name="noAjax"]', frm); noAjax = noAjax[0];
		if(noAjax && noAjax.value == 'true'){
			dojo.destroy(noAjax);
			return;
		}
		if(dijit.byNode(frm) == undefined)
			dojo.connect(frm, 'onsubmit', function(e){
				e.preventDefault();
				var frm = e.target;
				if(!frm.id)
					frm.id = 'frm' + Math.floor(Math.random()*11);
				submitForm(e.target);
				return false;
			});
		else
			dojo.connect(dijit.byNode(frm), 'onSubmit', 'validateForm');
	});
	
	/*
	var htmlField = dijit.byId('text');
	if(htmlField)
	{
		dojo.require('dijit.Editor');
		var value = htmlField.value;
		htmlField.destroy(true);
		//new dijit.Editor({height: '', extraPlugins: []}, htmlField);
	}*/
	
	if(dojo.byId('frontDeposit'))
	{
		dojo.connect(dojo.byId('frontDeposit'), 'onfocus', function(e){
			if(dojo.byId('frontDeposit').value == 'How much do you want to deposit?')
				dojo.byId('frontDeposit').value = '';
		});
		dojo.connect(dojo.byId('frontDeposit'), 'onblur', function(e){
			if(dojo.byId('frontDeposit').value == '')
				dojo.byId('frontDeposit').value = 'How much do you want to deposit?';
		});
		
		dojo.connect(dojo.byId('frontDeposit'), 'onkeypress', function(e){
			if(e.keyCode == 13){
				e.preventDefault();
				
				if(dojo.byId('frontDeposit').value == 'How much do you want to deposit?' || dojo.byId('frontDeposit').value == '')
					dojo.byId('frontDeposit').value = '10';

				var pn = dojo.byId('btnGetBonus').parentNode;
				while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
					pn = pn.parentNode;
				if(pn){
					var depositValue = dojo.query('input', pn);
					depositValue = depositValue[0].value;
					
					if(parseFloat(depositValue)+0 == depositValue)
						pn.submit();
					else
						alert('You didn\'t enter a valid deposit');
				}
				
				return false;
			}
		});
		
		if(dojo.byId('btnGetBonus')){
			var pn = dojo.byId('btnGetBonus').parentNode;
			while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
				pn = pn.parentNode;
			if(pn){
				dojo.connect(dojo.byId('btnGetBonus'), 'onclick', function(e){
					e.preventDefault();
					var depositValue = dojo.query('input', pn);
					depValue = depositValue[0].value;
					

					
					if(depValue == 'How much do you want to deposit?' || depValue == '')
					{
						depValue = '10';
						depositValue[0].value = '10';
					}
					
					if(depValue=='Deposit how much?')
					{
						depValue = '10';
						depositValue[0].value = '10';
					}
					
					if(parseFloat(depValue)+0 == depValue)
						pn.submit();
					else
						alert('You didn\'t enter a valid deposit');
					
					return false;
					
				});
			}
		}
		
		if(dojo.byId('btnRandomise')){
			var pn = dojo.byId('btnRandomise').parentNode;
			while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
				pn = pn.parentNode;
			if(pn){
				dojo.connect(dojo.byId('btnRandomise'), 'onclick', function(e){
					e.preventDefault();
					var depositValue = dojo.query('input', pn);
					

					
					if(depositValue[0].value == 'How much do you want to deposit?')
						depositValue[0].value = '10';
					
					depositValue = depositValue[0].value;
					if(parseFloat(depositValue)+0 == depositValue){
						var hid = document.createElement('input');
						hid.name='randomise';
						hid.value='true';
						hid.style.display = 'none';
						pn.appendChild(hid);
						pn.submit();
					}else
						alert('You didn\'t enter a valid deposit');
					
					return false;
					
				});
			}
		}
	}
	
	if(dojo.byId('yourDeposit')){
		dojo.connect(dojo.byId('yourDeposit'), 'onkeypress', function(e){
			if(e.keyCode == 13){
				e.preventDefault();
				getMyCredit(dojo.byId('yourDeposit').value);
				return false;
			}
		});
	}
	
	if(dojo.byId('todayIWant')){
		var sel = document.createElement('select');
		sel.name = 'wantto';
		dojo.byId('wantto').appendChild(sel);
		dojo.byId('todayIWant').style.display = 'none';
		var items = dojo.query('li', 'todayIWant');
		for(var i = 0; i < items.length; i++){
			var link = dojo.query('a', items[i]);
			if(link.length != 1)
				continue;
			
			link = link[0];
			
			var target = link.href;
			if(link.href.substring(link.href.length - 1) == '#')
				target = '';
			else
				target = target.substring(7, target.indexOf('.'));
				
			sel.options[sel.options.length] = new Option(link.innerHTML, target);
		}
		
		dojo.connect(dojo.byId('homeDeposit'), 'onfocus', function(e){
			if(dojo.byId('homeDeposit').value == 'How much do you want to deposit?')
				dojo.byId('homeDeposit').value = '';
		});
		dojo.connect(dojo.byId('homeDeposit'), 'onblur', function(e){
			if(dojo.byId('homeDeposit').value == '')
				dojo.byId('homeDeposit').value = 'How much do you want to deposit?';
		});
		dojo.connect(dojo.byId('homeDeposit'), 'onkeypress', function(e){
			if(e.keyCode == 13){
				e.preventDefault();
				submitFrontForm({target: dojo.byId('btnGetBonus')});
				
				return false;
			}
		});
		if(dojo.byId('btnGetBonus')){
			var pn = dojo.byId('btnGetBonus').parentNode;
			while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
				pn = pn.parentNode;
			if(pn)
				dojo.connect(dojo.byId('btnGetBonus'), 'onclick', submitFrontForm);
		}
		
		if(dojo.byId('btnRandomise')){
			var pn = dojo.byId('btnRandomise').parentNode;
			while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
				pn = pn.parentNode;
			if(pn)
				dojo.connect(dojo.byId('btnRandomise'), 'onclick', submitFrontForm);
		}
	}
	
	var joinForms = dojo.query('form[class~="joinNow"]');
	if(joinForms.length > 0)
	{
		for(var i = 0; i < joinForms.length; i++)
		{
			joinForms[i].action = '/register';
			joinForms[i].method = 'post';
			joinForms[i].id = 'frmRegisterNow';
			
			var email = dojo.query('input[name="email"]');
			email = email[0];

			dojo.connect(email, 'onfocus', function(e){
				if(e.target.value == e.target.defaultValue)
					e.target.value = '';
			});
			dojo.connect(email, 'onblur', function(e){
				if(e.target.value == '')
					e.target.value = e.target.defaultValue;
			});
			
			var joinLink = dojo.query('a[class~="signupBtn"]', joinForms[i]);
			if(joinLink.length == 1)
			{
				joinLink[0].onclick = function(e){
					if(e == undefined)
						e = window.event;
					
					if(e.preventDefault)
						e.preventDefault();
					
					var node = e.srcElement ? e.srcElement : e.target;
					while(node.tagName.toLowerCase() != 'form')
						node = node.parentNode;
					
					submitForm(node);
					return false;
				};
			}
		}
	}
});

function submitFrontForm(e){
	var pn = dojo.byId('btnGetBonus').parentNode;
	while(pn.parentNode && pn.tagName && pn.tagName.toLowerCase() != 'form')
		pn = pn.parentNode;
	if(e.preventDefault) e.preventDefault();
	var depositValue = dojo.query('input[name=deposit]', pn);
	var inp = depositValue[0];
	
	if(inp.value == 'How much do you want to deposit?')
		inp.value = '10';
	
	depositValue = depositValue[0].value;
	
	if(parseFloat(depositValue)+0 != depositValue){
		alert('You didn\'t enter a valid deposit');
		return false;
	}

	var wantto = dojo.query('select', pn);
	wantto = wantto[0].value;
	if(wantto == ''){
		if(e.target.id == 'btnRandomise'){
			var randoms = ['bingo', 'poker', 'casino', 'betting', 'slots', 'instantwin', 'roulette', 'blackjack'];
			wantto = randoms[Math.round(Math.random() * 7)];
		} else {
			alert('You didn\'t choose what you want to do!');
			return false;
		}
	}
	
	if(e.target.id == 'btnRandomise'){
		var hid = document.createElement('input');
		hid.name='randomise';
		hid.value='true';
		hid.style.display = 'none';
		pn.appendChild(hid);
	}
	
	if(e.target.id == 'btnGetBonus'){
		var inp = document.createElement('input');
		inp.type = 'hidden';
		inp.name = 'orderby';
		inp.value = 'merchant_deposit_total';
		pn.appendChild(inp);
	}
	
	
	pn.action = 'http://' + wantto + '.' + window.location.host.replace('www.', '') + '/merchants-search';

	pn.submit();
	
	return false;
}

/**
 * Handles anything that comes from an AJAX request.
 * Also re-creates the captcha if it exists.
 * 
 * @param retObj
 */
function handleAjaxReturn(retObj,retXhr){
	
	
	if(retXhr.xhr && retXhr.xhr.status)
		retObj = retXhr.xhr;
	
	var captchaDiv = dojo.byId('recaptcha_widget_div');
	if(captchaDiv)
		Recaptcha.create('6LfUigYAAAAAANqaIEB6BomXHCRM0cX4eidfGNpO', 'recaptcha_widget_div', {});
	
	var action = retObj.responseText;

	if(action.indexOf("\r\n") > - 1){
				
		action = action.substring(0, action.indexOf("\r\n"));
		data = retObj.responseText.substring(action.length + 2);
		if(data.substring(0,1) == '{')
			retObj = eval("(" + data + ")");
	}

	var buttons = dojo.query('button');
	for(var i = 0, j = buttons.length; i < j; i++)
		if(dijit.byId(buttons[i].id))
			dijit.byId(buttons[i].id).setDisabled(false);
	
	if(ajaxFunctions[action]){
		
		ajaxFunctions[action](retObj);
	} else {
	
		switch(retObj.status){
			case 200:
				infoMessage = 'The request completed successfully.';
				break;
			case 201:
				window.location = retObj.responseText;				
				break;
			case 404:
				infoMessage = 'The page requested was not found.';
				break;
			case 422:
				infoMessage = 'Data sent was incomplete';
				break;
			case 409:
				// Conflict:
				infoMessage = retObj.responseText;
				break;
			case 500:
				// Server error:
				infoMessage = retObj.responseText;
				break;
			default:
				infoMessage = 'Something went wrong';
		}
		
		if(infoMessage)
			alert(infoMessage);
	}
}

/**
 * Global XHR method
 * @param method
 * @param data
 */
function sendRequest(method, data){
	var xhrToCall = null;
	switch(method){
		case 'put':
			xhrToCall = dojo.xhrPut;
			break;
		case 'post':
			xhrToCall = dojo.xhrPost;
			break;
		case 'delete':
			xhrToCall = dojo.xhrDelete;
			break;
		default:
			xhrToCall = dojo.xhrGet;
			break;
	}
	
	data.headers = null;
	if(data.hasSetup !== true){
		data.hasSetup = true;
		
		var oldErrorCall = data.error;
		
		data.error = function(retObj, retXhr){
			if(retObj.status == 401){
				var response = retObj.responseText;
				
				var insertDiv = dijit.byId('insertDiv');
				if(insertDiv == undefined){
					insertDiv = new dijit.layout.ContentPane({id: 'insertDiv'});
					dojo.place(insertDiv.domNode, document.body, 'end');
					insertDiv = dijit.byId('insertDiv');
				}
				insertDiv.setContent(response);
				
				window.xhrOnLogin = {
					call: xhrToCall,
					data: data
				};
			}else{
				oldErrorCall(retObj, retXhr);
			}
		};
	}
	xhrToCall(data);
}


/**
 * Posts a rating for content
 * 
 * @param rating int
 */
function rateContent(rating){
	
	if(rating == undefined || rating < 1 || rating > 5)
		return;
	
	var winloc = window.location.pathname;
	winloc = winloc.split('/');
	var contentType = winloc[1];
	var contentId = winloc[2];
	
	if(dojo.cookie(contentType + contentId + 'rating') != undefined){
		alert('You have already rated this content!');
		return;
	}
	
	dojo.cookie(contentType + contentId + 'rating', true, {'expires': 365});
	
	sendRequest('post', {
		'url': '/' + contentType + '/' + contentId + '/rating/' + rating,
		'handleAs': 'text',
		'load': handleAjaxReturn,
		'error': handleAjaxReturn
	});
}

/**
 * Submits a login form passed in
 * 
 * @param frm
 */
function submitLogin(frm){
	if(frm.dojoAttachPoint != undefined)
		frm = frm.domNode;
	
	var user = dojo.query('input[name=user]', frm); user = user[0].value;
	var pass = dojo.query('input[name=pass]', frm); pass = pass[0].value;
	var hash = dojo.query('input[name=hash]', frm); hash = hash[0].value;
	
	var action = frm.action != '' ? frm.action : window.location.href;
	dojo.xhrPost({
		'url': action,
		'postData': 'do=login&user=' + escape(user) + '&pass=' + hex_md5(hex_md5(pass) + hash),
		'handleAs': 'text',
		'load': handleAjaxReturn,
		'error': handleAjaxReturn
	});
	return false;
}

function contentImagePreview(obj){
	var img = dojo.trim(obj.textbox.value);
	
	var imgObj = dojo.byId(obj.id + '_image');
	if(!imgObj){
		var imgObj = document.createElement('img');
		imgObj.id = obj.id + '_image';
		img.alt = 'Preview';
		dojo.place(imgObj, obj.domNode, 'after');
	}
	
	imgObj.src = img;
}

function showUpload(fieldName, thumbName){
	var dijitField = dijit.byId(fieldName);
	
	if(thumbName)
		var thumbField = dijit.byId(thumbName);
	
	var iFrame = dojo.byId(fieldName + '_iframe');
	if(!iFrame){
		dijitField.domNode.parentNode.style.position = 'relative';
		dijitField.domNode.parentNode.style.width = '400px';
		var winloc = window.location.pathname;
		winloc = winloc.split('/');
		
		iFrame = document.createElement('iframe');
		iFrame.width = 300;
		iFrame.height = 175;
		iFrame.style.display = 'none';
		iFrame.style.position = 'absolute';
		iFrame.style.right = '0';
		iFrame.style.top = '0';
		iFrame.style.background = '#fff';
		iFrame.style.overflow = 'hidden';
		iFrame.id = fieldName + '_iframe';
		
		var loadFunc = function(e){
			var target;
			if(e != undefined & e.target)
				target = e.target
			if(navigator.appName == 'Microsoft Internet Explorer');
				target = document.getElementById('thumbnail_iframe');
				
			var doc;
			if(target.contentDocument)
				doc = target.contentDocument;
			else if(target.contentWindow)
				doc = target.contentWindow;
			else if (target.document)
				doc = target.document;
			
			if(doc.document)
				doc = doc.document;
			
			if(doc.body.innerHTML.substring(0, 4) == 'FILE') {
				var filename = doc.body.innerHTML.substring(5);
				dijitField.value = filename;
				if(dijitField.store && dijitField.store.root) dijitField.store.root.options.add(new Option(filename, filename));
				if(dijitField.setValue) dijitField.setValue(filename);
				if(dijitField.setDisplayedValue) dijitField.setDisplayedValue(filename);
				iFrame.style.display = 'none';
				iFrame.parentNode.removeChild(iFrame);
				contentImagePreview(dijitField);
				
				if(thumbField){
					thumbField.value = filename.replace('.jpg', '_thumb.jpg').replace('.gif', '_thumb.gif').replace('.png', '_thumb.png');
					thumbField.setValue(filename.replace('.jpg', '_thumb.jpg').replace('.gif', '_thumb.gif').replace('.png', '_thumb.png'));
				}
			}
			else if (doc.body.innerHTML == 'bad-image-file') {
				iFrame.style.display = 'none';
				iFrame.parentNode.removeChild(iFrame);
				alert('That image format is not supported');
			}
		};
		
		
		if(navigator.appName == 'Microsoft Internet Explorer')
			iFrame.attachEvent('onload', loadFunc);
		else
			dojo.connect(iFrame, 'onload', loadFunc);
		
		dojo.place(iFrame, dijitField.domNode, 'after');
	}
	iFrame.style.display = 'block';
	
	if(window.location.pathname.indexOf('merchants') > -1)
		iFrame.src = '/merchants/image';
	else
		iFrame.src = '/' + winloc[1] + '/image/';
}

function createUploadLink(fieldName, thumbName){
	var dijitField = dijit.byId(fieldName);
	
	if(!dijitField)
		return;
	
	var newLink = document.createElement('a');
	newLink.innerHTML = 'Upload New';
	newLink.href = '#';
	newLink.className = 'uploadLink';
	
	dojo.connect(newLink, 'onclick', function(e){e.preventDefault();showUpload(fieldName, thumbName); return false;});
	
	dojo.place(newLink, dijitField.domNode, 'after');
}

function deleteSearch(link, id){
	if(!confirm('Are you sure you wish to delete this search?'))
		return;
	
	var node = link.parentNode;
	while(node.tagName.toLowerCase() != 'li')
		node = node.parentNode;
	
	sendRequest('delete', {
		url: '/searches/' + id,
		'load': function(retObj){
			node.parentNode.removeChild(node);
		},
		'error': function(retObj){
			alert('There was an error deleting the search');
		}
	});
}

function switchTabs(e){
	var target = e.target;
	while(target.tagName.toLowerCase() != 'li')
		target = target.parentNode;

	var link = dojo.query('a', target); link = link[0];
	if(link.href.indexOf('#') == -1)
		return true;
	
	e.preventDefault();
	
	var targetTab = link.href.substring(link.href.indexOf('#') + 1);
	
	var targetDivs = dojo.query('div.tabContent', dojo.byId('tabHomeContent'));
	for(var i = 0, j = targetDivs.length; i < j; i++){
		targetDivs[i].style.display = (targetDivs[i].id == targetTab ? 'block' : 'none');
	}
	

	var tabElements = dojo.query('div.tabs ul li', dojo.byId('tabHomeContent'));
	for(var i = 0, j = tabElements.length; i < j; i++){
		if(tabElements[i] == target)
			dojo.addClass(tabElements[i], 'selected');
		else
			dojo.removeClass(tabElements[i], 'selected');
	}
	
	
	return false;
}

dojo.require('dijit.form.FilteringSelect');
dojo.require('dojo.data.ItemFileReadStore');
dojo.require("custom.AutocompleteReadStore");
dojo.addOnLoad(function(){
	var hash = location.hash;
	if(hash.length > 0)
	{
		if(hash.indexOf('comments') > -1)
		{
			var e = function(){
				window.location.hash = 'comments';
			};
			
			window.setTimeout(e, 500);
		}
		else
		{
			window.location = window.location;
		}
	}
	
	var gameList = dojo.byId('gameList');
	if(gameList){
		var links = dojo.query('a', gameList);
		var storeLinks = {
			identifier: 'value',
			items: []
		};
		for(var i = 0, j = links.length; i < j; i++)
			storeLinks.items.push({value: links[i].href, name: links[i].innerHTML});
		storeLinks = new dojo.data.ItemFileReadStore({data: storeLinks});
		var element = new dijit.form.FilteringSelect({
			name: 'gamelist',
			id: 'gamelist',
			store: storeLinks,
			onChange: function(a){if(a && a.length > 0) location = a;}
		}, gameList);
		element.startup();
	}
	
	if(dojo.byId('search-header')){
		window.expandTimer = 0;
		dojo.connect(dojo.byId('merchantsearch-features'), 'click', function(e){
			e.preventDefault();
			var target = e.target;
			
			if(target.parentNode.id == 'showcollapsed')
				target = e.target.parentNode.parentNode;
			
			if(target.id != 'merchantsearch-features' && (target.tagName && target.tagName.toLowerCase() != 'legend'))
					return;
			
			if(dojo.byId('showexpanded').style.display == 'none'){
				dojo.byId('showcollapsed').innerHTML = '<a href="#">Click here</a> to hide additional features';
				dojo.byId('showexpanded').style.display = 'block';
				window.clearInterval(window.expandTimer);
				window.expandTimer = window.setInterval('expandBox()', 25);
			}else{
				dojo.byId('showcollapsed').innerHTML = '<a href="#">Click here</a> to refine your search';
				dojo.byId('showexpanded').style.display = 'none';
				window.clearInterval(window.expandTimer);
				window.expandTimer = window.setInterval('collapseBox()', 25);
			}
			
			return false;
		});
	}
	
	var expanders = dojo.query('div.expanderLink');
	if(expanders.length > 0){
		for(var i = 0; i < expanders.length; i++){
			dojo.connect(expanders[i], 'click', function(e){
				e.preventDefault();
				var pn = e.target.parentNode;
				var target = [];
				while(target.length == 0){
					target = dojo.query('div.expanderContent', pn);
					pn = pn.parentNode;
				}
				target = target[0];
				
				var clickTarget = e.target;
				if(clickTarget.tagName.toLowerCase() == 'a')
					clickTarget = clickTarget.parentNode;
				
				if(parseInt(target.style.height) == '0'){
					target.style.height = 'auto';
					clickTarget.style.backgroundImage = 'url("/images/arrow-up.gif")';
				} else {
					target.style.height = '0';
					clickTarget.style.backgroundImage = 'url("/images/arrow-down.gif")';
				}
			});
			
			var pn = expanders[i].parentNode;
			var target = [];
			while(target.length == 0){
				target = dojo.query('div.expanderContent', pn);
				pn = pn.parentNode;
			}
			target = target[0];
			target.style.height = '0px';
			target.style.overflow = 'hidden';
		}
	}
	
	var tabContainer = dojo.byId('tabHomeContent');
	if(!tabContainer) return;
	
	var tabElements = dojo.query('div.tabs ul li', tabContainer);
	
	for(var i = 0, j = tabElements.length; i < j; i++){
		dojo.connect(tabElements[i], 'click', switchTabs);
	}
	
	var targetDivs = dojo.query('div.tabContent', dojo.byId('tabHomeContent'));	
	//for(var i = 0, j = targetDivs.length; i < j; i++){
	//	targetDivs[i].style.display = (targetDivs[i].id == 'tabContent1' ? 'block' : 'none');
	//}		
	for(var i = 0, j = targetDivs.length; i < j; i++){
		targetDivs[i].style.display = 'none';
	}
	targetDivs[0].style.display = 'block';
	
	var fullintro = dojo.byId('fullintro');
	if(fullintro)
		fullintro.style.display = 'none';
});

function expandBox(){
	if(dojo.style(dojo.byId('search-header'), 'height') < 399){
		var newHeight = (dojo.style(dojo.byId('search-header'), 'height') + 10);
		
		dojo.style(dojo.byId('search-header'), 'height', newHeight + 'px');
		dojo.style(dojo.byId('merchantsearch-features'), 'height', newHeight - 73 + 'px');
	}else{
		window.clearInterval(window.expandTimer);
	}
}

function collapseBox(){
	if(dojo.style(dojo.byId('search-header'), 'height') > 180){
		var newHeight = (dojo.style(dojo.byId('search-header'), 'height') - 10);
		
		dojo.style(dojo.byId('search-header'), 'height', newHeight + 'px');
		dojo.style(dojo.byId('merchantsearch-features'), 'height', newHeight - 73 + 'px');
	}else{
		window.clearInterval(window.expandTimer);
	}
}

//******************** BEGIN COMMENTS *****************************

window.textAreas = [];
window.buttons = [];

/**
 * comment editing
 * @param id
 * @param post
 */
function editComment(id, post){
	if(post == undefined){
		var divComment = dojo.byId('comment' + id);
		
		var pNode = dojo.query('blockquote p', divComment);
		if(pNode.length == 0)
			return;
		
		pNode = pNode[0];
		
		var textArea = new dijit.form.Textarea({
			id: 'commentTextarea' + id,
			name: 'commentTextarea' + id,
			value: pNode.innerHTML
		});
		
		var button = new dijit.form.Button({
			id: 'commentButton' + id,
			name: 'commentButton' + id,
			label: 'Save'
		});
		
		window.textAreas.push(textArea);
		window.buttons.push(button);
		
		dojo.place(textArea.textbox, pNode, 'replace');
		dojo.place(button.domNode, textArea.textbox, 'after');
		
		dojo.connect(button, 'onClick', function(e){
			var winloc = window.location.pathname;
			winloc = winloc.split('/');
			var contentType = winloc[1];
			var contentId = winloc[2];
			var id = e.target.id.substring(13);
			
			dojo.byId('commentTextarea' + id);
			var dijitComment = dijit.byId('commentTextarea' + id);
			var text = dijitComment.value;
			
			sendRequest('put', {
				'postData': 'comment=' + escape(text),
				'url': '/' + contentType + '/' + contentId + '/comment/' + id,
				'handleAs': 'text',
				'load': handleAjaxReturn,
				'error': handleAjaxReturn
			});
		});
	} else {
		var winloc = window.location.pathname;
		winloc = winloc.split('/');
		var contentType = winloc[1];
		var contentId = winloc[2];
	}
}

/**
 * Deletes a comment pased in by ID
 * @param id
 */
function deleteComment(id){
	var winloc = window.location.pathname;
	winloc = winloc.split('/');
	var contentType = winloc[1];
	var contentId = winloc[2];
	
	if(confirm('Are you sure you want to delete this comment?')){
		sendRequest('delete', {
			'url': '/' + contentType + '/' + contentId + '/comment/' + id,
			'handleAs': 'text',
			'load': handleAjaxReturn,
			'error': handleAjaxReturn
		});
	}
}

/**
 * 'AJAXically' loads comments for a content page
 */
function getAllComments(limit){
	if(limit == undefined)
		limit = false;
	
	var winloc = window.location.pathname;
	winloc = winloc.split('/');
	var contentType = winloc[1];
	var contentId = winloc[2];
	sendRequest('get', {
		'url': '/' + contentType + '/' + contentId + '/comment' + (limit == true ? '/limit' : ''),
		'handleAs': 'text',
		'load': function(retObj) {
			var commentDiv = dojo.byId('contentComments');
			commentDiv.innerHTML = retObj;
			window.location = '#comments';
			dijit.byId('comment').attr('value','');
		},
		'error': handleAjaxReturn
	});
	return false;
}


/**
 * 'AJAXically' loads comments for a content page
 */
function getReviews(merchantName){
	sendRequest('get', {
		'url': '/merchants/' + merchantName + '/reviews?minimal=1',
		'handleAs': 'text',
		'load': function(retObj) {
			var commentDiv = dojo.byId('contentComments');
			commentDiv.innerHTML = '<h3>All Reviews</h3>' + retObj;
			//dojo.removeClass('comments','stack');
			//dojo.addClass('comments','bucket');
			window.location = '#comments';
		},
		'error': handleAjaxReturn
	});
	return false;
}

//******************** END COMMENTS *****************************


dojo.require("custom.AutocompleteReadStore");
dojo.require("dijit.form.ComboBox");
dojo.require("dijit.form.Form");
dojo.require("dojo.parser");
autocompleter = new custom.AutocompleteReadStore({"url":"\/merchants\/search\/","requestMethod":"get"});

function getMyCredit(deposit,merchantId){
	var winloc = window.location.pathname.split('/');
	if(merchantId == undefined)
		merchantId = winloc[2];
	dojo.xhrGet({
		'url': '/merchants/' + merchantId + '/deposit?deposit=' + deposit,
		'handleAs': 'json',
		'load': function(ret){
			dojo.byId('yourBonus').innerHTML = "&pound;" + formatMoney(parseFloat(ret.depositTotal));
			dojo.byId('totalCredit').innerHTML = "&pound;" + formatMoney(parseFloat(deposit)+parseFloat(ret.depositTotal));
			if(dojo.byId('glance'))
			{
				var image = dojo.query('a.logo', dojo.byId('glance'));
				if(image)
				{
					image = image[0];
					image.href = ret.affiliateLink;
				}
			}
			
			if(dojo.byId('playNowButton'))
				dojo.byId('playNowButton').href = ret.affiliateLink;
			if(dojo.byId('playNowButton2'))
				dojo.byId('playNowButton2').href = ret.affiliateLink;
		}
	});
}

function formatMoney(amount){
	var i = parseFloat(amount);
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i < 0) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + s;
	
	if(parseInt(s) == parseFloat(s))
		return parseInt(s);
	
	return s;
}

/*
Developed by Robert Nyman, http://www.robertnyman.com
Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm){
if (document.getElementsByClassName) {
	getElementsByClassName = function (className, tag, elm) {
		elm = elm || document;
		var elements = elm.getElementsByClassName(className),
			nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
			returnElements = [],
			current;
		for(var i=0, il=elements.length; i<il; i+=1){
			current = elements[i];
			if(!nodeName || nodeName.test(current.nodeName)) {
				returnElements.push(current);
			}
		}
		return returnElements;
	};
}
else if (document.evaluate) {
	getElementsByClassName = function (className, tag, elm) {
		tag = tag || "*";
		elm = elm || document;
		var classes = className.split(" "),
			classesToCheck = "",
			xhtmlNamespace = "http://www.w3.org/1999/xhtml",
			namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
			returnElements = [],
			elements,
			node;
		for(var j=0, jl=classes.length; j<jl; j+=1){
			classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
		}
		try	{
			elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
		}
		catch (e) {
			elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
		}
		while ((node = elements.iterateNext())) {
			returnElements.push(node);
		}
		return returnElements;
	};
}
else {
	getElementsByClassName = function (className, tag, elm) {
		tag = tag || "*";
		elm = elm || document;
		var classes = className.split(" "),
			classesToCheck = [],
			elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
			current,
			returnElements = [],
			match;
		for(var k=0, kl=classes.length; k<kl; k+=1){
			classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
		}
		for(var l=0, ll=elements.length; l<ll; l+=1){
			current = elements[l];
			match = false;
			for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
				match = classesToCheck[m].test(current.className);
				if (!match) {
					break;
				}
			}
			if (match) {
				returnElements.push(current);
			}
		}
		return returnElements;
	};
}
return getElementsByClassName(className, tag, elm);
};




/*
Script: JSON.js

JSON encoder / decoder:	
	This object uses good practices to encode/decode quikly and a bit safer(*) every kind of JSON compatible variable.
	
	(*) Please read more about JSON and Ajax JavaScript Hijacking problems, <http://www.fortifysoftware.com/advisory.jsp>
	
	To download last version of this script use this link: <http://www.devpro.it/code/149.html>

Version:
	1.3b - modified toDate method, now compatible with milliseconds time too (time or milliseconds/1000)

Compatibility:
	FireFox - Version 1, 1.5, 2 and 3 (FireFox uses secure code evaluation)
	Internet Explorer - Version 5, 5.5, 6 and 7
	Opera - 8 and 9 (probably 7 too)
	Safari - Version 2 (probably 1 too)
	Konqueror - Version 3 or greater

Dependencies:
	<JSONError.js>

Credits:
	- JSON site for safe RegExp and generic JSON informations, <http://www.json.org/>
	- kenta for safe evaluation idea, <http://mykenta.blogspot.com/>

Author:
	Andrea Giammarchi, <http://www.3site.eu>

License:
	>Copyright (C) 2007 Andrea Giammarchi - www.3site.eu
	>	
	>Permission is hereby granted, free of charge,
	>to any person obtaining a copy of this software and associated
	>documentation files (the "Software"),
	>to deal in the Software without restriction,
	>including without limitation the rights to use, copy, modify, merge,
	>publish, distribute, sublicense, and/or sell copies of the Software,
	>and to permit persons to whom the Software is furnished to do so,
	>subject to the following conditions:
	>
	>The above copyright notice and this permission notice shall be included
	>in all copies or substantial portions of the Software.
	>
	>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
	>INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	>FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
	>IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
	>DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
	>ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
	>OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

/*
Object: JSON
	Stand alone or prototyped encode, decode or toDate public methods.

Example:
	>alert(JSON.encode([0,1,false,true,null,[2,3],{"some":"value"}]));
	>// [0,1,false,true,null,[2,3],{"some":"value"}]
	>
	>alert(JSON.decode('[0,1,false,true,null,[2,3],{"some":"value"}]'))
	>// 0,1,false,true,,2,3,[object Object]
*/
JSON = new function(){

	/* Section: Methods - Public */
	
	/*
	Method: decode
		decodes a valid JSON encoded string.
	
	Arguments:
		[String / Function] - Optional JSON string to decode or a filter function if method is a String prototype.
		[Function] - Optional filter function if first argument is a JSON string and this method is not a String prototype.
	
	Returns:
		Object - Generic JavaScript variable or undefined
	
	Example [Basic]:
		>var	arr = JSON.decode('[1,2,3]');
		>alert(arr);	// 1,2,3
		>
		>arr = JSON.decode('[1,2,3]', function(key, value){return key * value});
		>alert(arr);	// 0,2,6
	
	Example [Prototype]:
		>String.prototype.parseJSON = JSON.decode;
		>
		>alert('[1,2,3]'.parseJSON());	// 1,2,3
		>
		>try {
		>	alert('[1,2,3]'.parseJSON(function(key, value){return key * value}));
		>	// 0,2,6
		>}
		>catch(e) {
		>	alert(e.message);
		>}
	
	Note:
		Internet Explorer 5 and other old browsers should use a different regular expression to check if a JSON string is valid or not.
		This old browsers dedicated RegExp is not safe as native version is but it required for compatibility.
	*/
	this.decode = function(){
		var	filter, result, self, tmp;
		if($$("toString")) {
			switch(arguments.length){
				case	2:
					self = arguments[0];
					filter = arguments[1];
					break;
				case	1:
					if($[typeof arguments[0]](arguments[0]) === Function) {
						self = this;
						filter = arguments[0];
					}
					else
						self = arguments[0];
					break;
				default:
					self = this;
					break;
			};
			if(rc.test(self)){
				try{
					result = e("(".concat(self, ")"));
					if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){
						for(self in result)
							result[self] = v(self, result) ? filter(self, result[self]) : result[self];
					}
				}
				catch(z){}
			}
			else {
				throw new JSONError("bad data");
			}
		};
		return result;
	};
	
	/*
	Method: encode
		encode a generic JavaScript variable into a valid JSON string.
	
	Arguments:
		[Object] - Optional generic JavaScript variable to encode if method is not an Object prototype.
	
	Returns:
		String - Valid JSON string or undefined
	
	Example [Basic]:
		>var	s = JSON.encode([1,2,3]);
		>alert(s);	// [1,2,3]
	
	Example [Prototype]:
		>Object.prototype.toJSONString = JSON.encode;
		>
		>alert([1,2,3].toJSONString());	// [1,2,3]
	*/
	this.encode = function(){
		var	self = arguments.length ? arguments[0] : this,
			result, tmp;
		if(self === null)
			result = "null";
		else if(self !== undefined && (tmp = $[typeof self](self))) {
			switch(tmp){
				case	Array:
					result = [];
					for(var	i = 0, j = 0, k = self.length; j < k; j++) {
						if(self[j] !== undefined && (tmp = JSON.encode(self[j])))
							result[i++] = tmp;
					};
					result = "[".concat(result.join(","), "]");
					break;
				case	Boolean:
					result = String(self);
					break;
				case	Date:
					result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
					break;
				case	Function:
					break;
				case	Number:
					result = isFinite(self) ? String(self) : "null";
					break;
				case	String:
					result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
					break;
				default:
					var	i = 0, key;
					result = [];
					for(key in self) {
						if(self[key] !== undefined && (tmp = JSON.encode(self[key])))
							result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp);
					};
					result = "{".concat(result.join(","), "}");
					break;
			}
		};
		return result;
	};
	
	/*
	Method: toDate
		transforms a JSON encoded Date string into a native Date object.
	
	Arguments:
		[String/Number] - Optional JSON Date string or server time if this method is not a String prototype. Server time should be an integer, based on seconds since 1970/01/01 or milliseconds / 1000 since 1970/01/01.
	
	Returns:
		Date - Date object or undefined if string is not a valid Date
	
	Example [Basic]:
		>var	serverDate = JSON.toDate("2007-04-05T08:36:46");
		>alert(serverDate.getMonth());	// 3 (months start from 0)
	
	Example [Prototype]:
		>String.prototype.parseDate = JSON.toDate;
		>
		>alert("2007-04-05T08:36:46".parseDate().getDate());	// 5
	
	Example [Server Time]:
		>var	phpServerDate = JSON.toDate(<?php echo time(); ?>);
		>var	csServerDate = JSON.toDate(<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000);
	
	Example [Server Time Prototype]:
		>Number.prototype.parseDate = JSON.toDate;
		>var	phpServerDate = (<?php echo time(); ?>).parseDate();
		>var	csServerDate = (<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000).parseDate();
	
	Note:
		This method accepts an integer or numeric string too to mantain compatibility with generic server side time() function.
		You can convert quickly mtime, ctime, time and other time based values.
		With languages that supports milliseconds you can send total milliseconds / 1000 (time is set as time * 1000)
	*/
	this.toDate = function(){
		var	self = arguments.length ? arguments[0] : this,
			result;
		if(rd.test(self)){
			result = new Date;
			result.setHours(i(self, 11, 2));
			result.setMinutes(i(self, 14, 2));
			result.setSeconds(i(self, 17, 2));
			result.setMonth(i(self, 5, 2) - 1);
			result.setDate(i(self, 8, 2));
			result.setFullYear(i(self, 0, 4));
		}
		else if(rt.test(self))
			result = new Date(self * 1000);
		return result;
	};
	
	/* Section: Properties - Private */
	
	/*
	Property: Private
	
	List:
		Object - 'c' - a dictionary with useful keys / values for fast encode convertion
		Function - 'd' - returns decimal string rappresentation of a number ("14", "03", etc)
		Function - 'e' - safe and native code evaulation
		Function - 'i' - returns integer from string ("01" => 1, "15" => 15, etc)
		Array - 'p' - a list with different "0" strings for fast special chars escape convertion
		RegExp - 'rc' - regular expression to check JSON strings (different for IE5 or old browsers and new one)
		RegExp - 'rd' - regular expression to check a JSON Date string
		RegExp - 'rs' - regular expression to check string chars to modify using c (char) values
		RegExp - 'rt' - regular expression to check integer numeric string (for toDate time version evaluation)
		RegExp - 'ru' - regular expression to check string chars to escape using "\u" prefix
		Function - 's' - returns escaped string adding "\\" char as prefix ("\\" => "\\\\", etc.)
		Function - 'u' - returns escaped string, modifyng special chars using "\uNNNN" notation
		Function - 'v' - returns boolean value to skip object methods or prototyped parameters (length, others), used for optional decode filter function
		Function - '$' - returns object constructor if it was not cracked (someVar = {}; someVar.constructor = String <= ignore them)
		Function - '$$' - returns boolean value to check native Array and Object constructors before convertion
	*/
	var	c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
		d = function(n){return n<10?"0".concat(n):n},
		e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},
		i = function(e,p,l){return 1*e.substr(p,l)},
		p = ["","000","00","0",""],
		rc = null,
		rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
		rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
		rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
		ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
		s = function(i,d){return "\\".concat(c[d])},
		u = function(i,d){
			var	n=d.charCodeAt(0).toString(16);
			return "\\u".concat(p[n.length],n)
		},
		v = function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
		$ = {
			"boolean":function(){return Boolean},
			"function":function(){return Function},
			"number":function(){return Number},
			"object":function(o){return o instanceof o.constructor?o.constructor:null},
			"string":function(){return String},
			"undefined":function(){return null}
		},
		$$ = function(m){
			function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
			return $(Array)&&$(Object)
		};
	try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
	catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};