var regex = /^([a-zA-Z0-9_\.\-\+'])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var visit = 0;
var OA_conversion_code;
var EA_conversion_code;
var	tabRegExp = new RegExp('\\-\\d(.[a-z]{3})$');

var MSIE6 = false;
if (/MSIE 4/.test(navigator.userAgent) || /MSIE 5/.test(navigator.userAgent) || /MSIE 6/.test(navigator.userAgent)) {
	MSIE6 = true;
}

$(document).ready(function() {
	
	var reg_email;
	var tab_result;
	var service_result;
	var tracking_registration;
	
	if (readCookie("mypwn_login")=="1") {
		$('#mypwn_login').hide();
		$('#mypwn_logged_in').show();
	}

	if (navigator.platform.substring(0,3) != 'Win') {
		$('.tabs-middle-bg').find('p').css('font-weight','normal');
		$('.tabs-middle-bg2').find('p').css('font-weight','normal');
	}

	$('a.external').attr('target', '_blank'); 
	
	$("img").each( function(index) { $(this).click( function () { if (this.blur) { this.blur(); }})});  //  because we don't like focus indicators
	  $("a").each( function(index) { $(this).click( function () { if (this.blur) { this.blur(); }})});
	
	$('#generate-pin-EB').submit(function() {
		$(this).ajaxSubmit({
						   beforeSubmit:function()	{ 	if ($('#generate-pin-img').blur) {
															$('#generate-pin-img').blur();
														}
														return OAregFormCheckEB(highlight=false,submitted=true);
													},
						   success:OAregFormReceiveEB
						   });
		return false;
	});
	
	$('#regEnhancedEB').submit(function() {
		$(this).ajaxSubmit({
						   beforeSubmit:function()	{ 	return EAregFormCheckEB(highlight=false,submitted=true); },
						   success:EAregFormReceiveEB
						   });
		return false;
	});

	
	$('#contactUsEB').submit(function() {
		$(this).ajaxSubmit({
						   beforeSubmit:function() { return contactUsFormCheckEB(highlight=false,submitted=true); },
						   success:contactUsReceiveEB
						   });
		return false;
	});
	
	$('#myLoginForm').submit(function(){
		$(this).ajaxSubmit({
							//beforeSubmit:  preLogin, 
							success:  loginCheck
							});
		return false;
	});
	
	$('#mypowwownow-form').submit(function(){
		$(this).ajaxSubmit({
						   beforeSubmit:function() { return myPWNFormCheckEB(highlight=false,submitted=true); },
						   success:myPWNReceiveEB
						   });
		return false;
	});
	
	$('#pin-reminderEB').submit(function() {
		$(this).ajaxSubmit({
						   beforeSubmit:function() { return PinRemindCheckEB(highlight=false,submitted=true); },
						   success:PinRemindReceiveEB
						   });
		return false;
	});
	$('#tellafriendformEB').submit(function() {
		$(this).ajaxSubmit({
					   beforeSubmit:function() { return tellafriendFormCheckEB(highlight=false,submitted=true); },
					   success:tellafriendFormReceiveEB
					   });
		return false;
	});
	
	$('#downloadShowtimeEB').submit(function() {
		$(this).ajaxSubmit({
				 beforeSubmit:function() { return (LOGIN?true:downloadShowtimeEB(highlight=false,submitted=true)); },
				 success:downloadShowtimeReceiveEB
				 });
		return false;
	});

	$('#deactivateForm').submit(function() {
		$(this).ajaxSubmit({
				 beforeSubmit:function() { return deactivateFormCheck(highlight=false,submitted=true); },
				 success:deactivateFormReceive
				 });
		return false;
	});
	$('#unsubscribeForm').submit(function() {
		$(this).ajaxSubmit({
				 beforeSubmit:function() { return unsubscribeFormCheck(highlight=false,submitted=true); },
				 success:unsubscribeFormReceive
				 });
		return false;
	});


});

function shiftRegTabOpen()
{
	$("#openreg").show();
	$("#openreginner").show();
	$("#openreginnerbase").show();
	$("#yourpinis-wrap").show();
	
	$("#open-first-left").hide();
	$("#tabs-middle-btn-generate").hide();
	popErrorBox('','');
	return false;
}

function hideRegOpen()
{
	$("#yourpinis-wrap").hide();
	$("#tabs-middle-btn-open").hide();
	$("#open-first-left").show();
	$("#tabs-middle-btn-generate").show();

	popErrorBox('','');
	setTimeout('$("#openreg").hide();',10); // IE doesn't hide the background images unless it's on timeout.  Don't ask me why.  FFX not bothered either way.
	return false;
}

function shiftRegTabEnhanced()
{
	$("#enhancedreg").show();
	$("#enhancedreginner").show();
	$("#enhancedreginnerbase").show();
	$("#tabs-middle-btn").hide();
	
	$("#enhanced-first-left").hide();
	$("#tabs-middle-btn-register").hide();
	popErrorBox('','');
	return false;
}

function hideRegEnhanced()
{
	$("#enhanced-first-left").show();
	$("#tabs-middle-btn-register").show();

	popErrorBox('','');
	setTimeout('$("#enhancedreg").hide();',10); // IE doesn't hide the background images unless it's on timeout.  Don't ask me why.  FFX not bothered either way.
	return false;
}

function dialinShow(tab)
{
	var toshow;
	for (i=1;i<5;i++) 
	{
		if (i==tab) 
		{
			toshow = "#dialin-" + tab;
		} 
		else 
		{
			tohide = "#dialin-" + i;
			$(tohide).hide();
		}
	}
	if (toshow) 
	{
		$(toshow).show();
		$("#intl-dial-tabs").attr('src',$("#intl-dial-tabs").attr('src').replace(tabRegExp,'-' + tab + '$1'));
	}
	Google_tracker('/' + tab + '-dialin');
	popErrorBox('','');
	return false;
}

function howHeardSelection(sel)
{
	var count = sel.options.length;
	if (sel.selectedIndex == count-1)
	{
		$("#how-do-you-heard-other").show();
	}
	else
	{
		$("#how-do-you-heard-other").hide();
	}
	return false;
}

function locateObject(obj) {
	var myleft = 0;
	var mytop = 0;
	if (obj.id) {
		if (obj.offsetParent) {
			do {
				myleft += obj.offsetLeft;
				mytop += obj.offsetTop;
//				document.getElementById('sub-main-bottom').innerHTML += obj.id + ' - ';
			} while (obj = obj.offsetParent);
		}
	}
	return new Array(myleft,mytop);
}

function popErrorBox(id,error,withold) { // withold=true stops the balloon appearing

	if (id.length) {
		if (obj = document.getElementById(id)) {
			var pos = locateObject(obj);
			if (error) {
				if (!withold) {
					if (!(errbox = document.getElementById('errbox'))) { // create an errorbox if it doesn't exist
						var errbox = document.createElement('div');
						errbox.setAttribute('id','errbox');
						document.body.appendChild(errbox);
						errbox.onclick = function() { $(this).hide(); } ;
						errbox.style.position = 'absolute';
						errbox.style.width='220px';
						errbox.style.padding = '0px';
						errbox.style.zIndex = '1000000';
						errbox.style.cursor = 'pointer';
						errbox.style.display = 'none';
						errbox.innerHTML = '<div style="padding: 10px 5px 10px 35px; background: transparent url(/images/errorbox.' + (MSIE6?'gif':'png') + ') 0% 0% no-repeat;" id="errboxmsg"></div>'
										 + '<div style="height: 10px; background: transparent url(/images/errorbox.' + (MSIE6?'gif':'png') + ') 0% 100% no-repeat;">&nbsp;</div>';
			
					}
					
					document.getElementById('errboxmsg').innerHTML = error;
	
					var left = parseInt(pos[0]) + parseInt(obj.offsetWidth);
					var top  = parseInt(pos[1]) - 10; 
					
					errbox.style.left = left + 'px';
					errbox.style.top = top + 'px';
	
					if (errbox.style.display == 'none') {
						errbox.style.display = 'block';			
					}
				}
		
				if (obj.parentNode.className.substr(0,5) == 'input') {
					f = obj.parentNode.className.split(' ');
					obj.parentNode.className = f[0] + ' input-error';
				} else {
					obj.style.border = '1px solid red';
				}
				
			} else {
				if (obj.parentNode.className.substr(0,5) == 'input') {
					f = obj.parentNode.className.split(' ');
					obj.parentNode.className = f[0];
				} else {
					obj.style.borderWidth = '0px';
				}
			}
			
		} else if (errbox = document.getElementById('errbox')) {
			errbox.style.display="none"; // invalid call? Hide error box just in case
		}
	} else if (errbox = document.getElementById('errbox')) {
		errbox.style.display="none"; // invalid call? Hide error box just in case
	}

}

function scanPopErrorBox(fields,errors,highlight) {

	if (!document.getElementById(highlight)) {
			highlight = '';
	}

	if (errbox = document.getElementById('errbox')) {
		errbox.style.display="none"; // zap error box in case the current one has changed to be valid
	}
	var c = fields.length;		
	for (i=0;i<c;i++) {
		if (!highlight && errors[i]) {
			highlight = fields[i];
		}
		withold = (highlight?(fields[i]==highlight?false:true):true);
		popErrorBox(fields[i],errors[i],withold);
	}
}

function processPhoneNum(id) {
	if (e = document.getElementById(id)) {
		e.value = e.value.replace(/[^0-9\.\(\)\+ ]+/g,'');
		return ( e.value.replace(/[^0-9]+/g,'').length < 6 ? true : false );
	} else {
		return false;
	}
}

function Google_tracker(page_name)
{
	setTimeout("Google_track('"+page_name+"')", 1000);		//delay to wait the footer to load: the footer initializes Google analytics
}

function Google_track(page_name)
{
	try{	pageTracker._trackPageview(page_name);	}
	catch(e){	}
}

fadenewsstatus = 0;

function fadenews() {
	types = new Array('news','blog'); // you shouldn't have to do any more than add to this array and make sure the corresponding anchors exist

	fadenewsstatus = (fadenewsstatus>=types.length-1 ? 0 : fadenewsstatus + 1);
	type = types[fadenewsstatus];
	i = 0;
	while (l = document.getElementById('news-'+type+'-'+i)) {
		if (l.style.display!='none') {
			$('#news-'+type+'-'+i).fadeOut(500);
			j = i + 1;
			setTimeout('$("#news-'+type+'-'+ (document.getElementById('news-'+type+'-'+j)?j:0) +'").fadeIn(500)',600);
			break;
		}
		i ++;
	}
	setTimeout('fadenews()',5000);
}

function setMyPwnState(p) {
	p = (p>0&&p<6 ? p : 1);
	for (i=1;i<6;i++) {
		if (p==i) {
			$('#my-pwn-box-'+p).show();
		} else {
			$('#my-pwn-box-'+i).hide();
		}
	}
	if (p==4) {
		loadPlayer();
	}
	$('#tabs-mypowwownow').css('backgroundImage',$('#tabs-mypowwownow').css('backgroundImage').replace(/-[0-9]\./,'-'+p+'.'));
	return false;
}

function toggleTab2(tabno, version) {

	current_tab = tabno;
	tabcontentid = 'tab'+tabno+'-content';
	
	for (i=1;i<=3;i++) {
		if ($('#tab'+i+'-content')) {
			$('#tab'+i+'-content').hide();
		}
	}
	$('#lp'+version+'-tabs-top').attr('src',$('#lp'+version+'-tabs-top').attr('src').replace(tabRegExp,'-' + tabno + '$1'));
	$('#'+tabcontentid).show();

	switch(tabno)
	{
		case 1: 	
			$("#costsaving_enhanced").hide();
			$("#costsaving_open").show();
			page_name = '/Land_OpenAccess/';			
		break;
		
		case 2: 
			$("#costsaving_enhanced").show();
			$("#costsaving_open").hide();
			page_name = '/Land_EnhancedAccess/';		
		break;
	}
	popErrorBox('','');
	Google_tracker(page_name);
}

function changePressPage(page)
{
	var url = "/News/changepage/";
			
		$.get(url + "format/html/", { page : page},
	    	function(data)
	    	{
	    		$('#news_list').html(data);
	    	}
	    );
}

function setrecfield(field,c) {
	if ($('#'+field+'_set_'+c).attr('checked')) {
		$('#'+field+'_div_'+c).show();
		if (field == 'publish') {
			$('#password_check_'+c).show();
			$('#password_div_'+c).hide();
			$('#password_set_'+c).attr('checked',false);
		}
	} else {
		$('#'+field+'_'+c).val('');
		$('#'+field+'_div_'+c).hide();
		if (field == 'publish') {
			$('#password_check_'+c).hide();
			$('#password_div_'+c).hide();
		}
	}
	popErrorBox('','');
}

function showFaq(k) 
{
	if(document.getElementById("faq-answer-"+k).style.display == 'none')
	{
		$(".faq-answer").each(function( intIndex ){$("#faq-answer-"+(intIndex)).hide();});
		document.getElementById("faq-answer-"+k).style.display = 'block';
	}
	else
	{
		document.getElementById("faq-answer-"+k).style.display = 'none';
	}
	i=0;
	while (q = document.getElementById('faq-question-' + i)) {
		q.className = 'faq-question' +  (i==k ? ' faq-on':'');
		i++;
	}
	popErrorBox('','');
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Mouse out effects -> try to retrieve relative images for effects
function mo(state,id) {
	el = document.getElementById(id);
	src = el.src;
	var re = new RegExp("_.*\\.","g");
	if (state == 'over') {imgState = "_over.";}
	else if (state == 'out'){imgState = "_off.";}
	else if (state == 'down') {imgState = "_down.";}
	else if (state == 'up') {imgState = "_over.";}
	src = src.replace(re, imgState);
	el.src = src;
}

function moTop(state,id,imageSrc) {
	el = document.getElementById(id);
	src = el.src;
	var re = new RegExp("_.*\\.","g");
	if (state == 'over') {imgState = "_over.";src = src.replace(re, imgState);}
	else if (state == 'out'){src = imageSrc;}
	else if (state == 'down') {imgState = "_down.";src = src.replace(re, imgState);}
	else if (state == 'up') {imgState = "_over.";src = src.replace(re, imgState);}
	
	el.src = src;
}

var cancelhide = 'false';
function cancelHide(val,state) {
	cancelhide = val;
	//fireDebug('mo: '+state,'cancelHide: '+val);
}

function countryHide(id) {
	//fireDebug('countryHide: '+id);
	expr = "mo2('out','"+id+"')";
	//fireDebug(expr);
	setTimeout(expr,200);
}

function changeImg(id,img)
{
	$('#'+id).css("background","url(/images/"+img+") no-repeat");
	
	/*
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
	{ //test for MSIE x.x;
 		var ieversion=new Number(RegExp.$1) // capture x.x portion and store as a number
 		if (ieversion==6)
 		{
 			$('#'+id).css('filter:progid:','DXImageTransform.Microsoft.AlphaImageLoader(src="/images/'+img+'", sizingMethod="scale"');
 			document.getElementById(id).style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/images/'+img+'", sizingMethod="scale")';
 		}
 		else
 		{
 			$('#'+id).css("background","url(/images/"+img+") no-repeat");
 		}
	}
	else
	{
		$('#'+id).css("background","url(/images/"+img+") no-repeat");
	}
	*/
}

function showCountries()
{
	divid = "topnav-country-img-rollover";
	rolloverdiv = $('#' + divid);
	if (rolloverdiv.css('display') == "none") 
	{
		showFooterDiv(divid);
		changeImg('topnav-country-img','country_over.gif');
		Google_tracker('/show_countries');
	}
	else
	{
		rolloverdiv.hide();
		changeImg('topnav-country-img','country_off.gif');
	}
	popErrorBox('','');
}

function bounceDiv(state,id) {
	if (state == 'in')
		$("#"+id).show();
	if (state == 'out') 
		$("#"+id).hide();
	return false;
}

function tickBox(id) {
	imgid = id+'-img';
	el = $('#' + id);
	img = document.getElementById(imgid);
	src = img.src;
	if (src.indexOf('off') > 0) {
		src = src.replace("_off","_on");
		el.val(2);
	} else {
		src = src.replace("_on","_off");
		el.val(1);
	}
	img.src = src;
}

function toggleTab(tabno,service) {

	var sname = (service==1 ? 'home' : 'show');
	
	current_tab = tabno;
	tabcontentid = 'tab' + tabno + '-content';
	
	for (i=1;i<=4;i++) {
		if ($('#tab'+i+'-content')) {
			$('#tab'+i+'-content').hide();
		}
	}

	$('#' + sname + '-tabs-top').attr('src',$('#' + sname + '-tabs-top').attr('src').replace(tabRegExp,'-' + tabno + '$1'));
	$('#' + tabcontentid).show();

	var mix = tabno+(service*10);
	switch(mix)
	{
		case 11: page_name = '/OpenAccess/';			break;
		case 12: page_name = '/EnhancedAccess/';		break;
		case 13: page_name = '/PremiumAccess/';			break;
		case 14: page_name = '/CompareServices/';		break;
		case 21: page_name = '/Showtime/';				break;
		case 22: page_name = '/SeeDemo/';				break;
		case 23: page_name = '/GetStarted/';			break;
	}
	popErrorBox('','');
	Google_tracker(page_name);
}

function topRightAction(id,no,state) {
	
	to_move = id+no;
	var toFade = new Array();
	a = 0;
	if($("#"+id+no+"-content").css('display') == 'none')
	{
		$('#loginEmail').attr('disabled','disabled');
		$('#loginPassword').attr('disabled','disabled');
		if ($("#"+id+no+"-content").html().replace(/\s+/,'') == '') {
			$("#"+id+no+"-content").html($('#' + id + no + "_content").html());
			$("#"+id+no+"_content").html('');
		}
		for (i=5;i>=1;i--) {
			if (i != no) {
				elid = id+i;
				toFade[a] = elid;
				a++;
			}
		}
		tmp = serialize(toFade);
		fadeOutGroup(tmp,0,to_move);
				
		var page_name;
		switch(no)
		{
			case 1: page_name = '/International_Dial-in_numbers';	break;
			case 2: page_name = '/In-conference_Controls';			break;
			case 3:	page_name = '/PIN_Reminder';					break;
			case 4:	page_name = '/FAQ';								break;
			case 5:	page_name = '/Tell_a_Friend';					break;
		}
		Google_tracker(page_name);
	}
	else
	{
		$('#loginEmail').attr('disabled',false);
		$('#loginPassword').attr('disabled',false);
		$("#"+id+no+"-content").fadeOut(150);
		for (i=1;i<=5;i++) {
			if (i != no) {
				elid = id+i;
				toFade[a] = elid;
				a++;
			}
		}
		tmp = serialize(toFade);
		fadeInGroup(tmp,0,to_move);
	}
	resetTellAFriendForm();
	resetPinRemindForm();
	popErrorBox('','');
}

var myCount = 1;
var myCount2 = 4;

function doFadeOut(id) {
	$("#"+id).fadeOut(600);
}

function doFadeIn(id) {
	$("#"+id).fadeIn(500);
}
	
function fadeOutGroup(ids_serialized,i,to_move) {
	ids = unserialize(ids_serialized);
	doFadeOut(ids[i]);
	tmp = serialize(ids);
	if (i==0) {
		myTop = $("#"+to_move).css("top");
		origTop = myTop;
		$("#"+to_move).animate({top:"0px"},700);
	}
	if (i==ids.length) {
		setTimeout("showContent('"+to_move+"')",300);
	}
	if (i < ids.length) {
		i++;
		setTimeout("fadeOutGroup('"+ids_serialized+"',"+i+",'"+to_move+"')",100);
	}
}
	
function showContent(to_move) {
	$("#"+to_move+'-content').show();
}

function showFooterDiv(id) {
	if ($('#' + id).length > 0 && $('#' + id + '_content').length > 0) {
		$('#' + id).html($('#' + id + '_content').html());
		$('#' + id).show();
	}
}
	
var origTop = '';
function fadeInGroup(ids_serialized,i,to_move) {
	ids = unserialize(ids_serialized);
	doFadeIn(ids[i]);
	tmp = serialize(ids);
	if (i==0) {
		$("#"+to_move).animate({top: origTop},1000);
	}
	
	if (i < ids.length) {
		i++;
		setTimeout("fadeInGroup('"+ids_serialized+"',"+i+",'"+to_move+"')",100);
	}
}

// {{{ serialize
function serialize( inp ) {
    // Generates a storable representation of a value
    //
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_serialize/
    // +       version: 804.1712
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'

    var getType = function( inp ) {
        var type = typeof inp, match;
        if(type == 'object' && !inp)
        {
            return 'null';
        }
        if (type == "object") {
            if(!inp.constructor)
            {
                return 'object';
            }
            var cons = inp.constructor.toString();
            if (match = cons.match(/(\w+)\(/)) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };

    var type = getType(inp);
    var val;
    switch (type) {
        case "undefined":
            val = "N";
            break;
        case "boolean":
            val = "b:" + (inp ? "1" : "0");
            break;
        case "number":
            val = (Math.round(inp) == inp ? "i" : "d") + ":" + inp;
            break;
        case "string":
            val = "s:" + inp.length + ":\"" + inp + "\"";
            break;
        case "array":
            val = "a";
        case "object":
            if (type == "object") {
                var objname = inp.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            var count = 0;
            var vals = "";
            var okey;
            for (key in inp) {
                okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
                vals += serialize(okey) +
                        serialize(inp[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    if (type != "object" && type != "array") val += ";";
    return val;
}// }}}

// {{{ unserialize
function unserialize ( inp ) {
    // Creates a PHP value from a stored representation
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_unserialize/
    // +       version: 807.2220
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Pedro Tainha (http://www.pedrotainha.com)
    // +   bugfixed by: dptr1988
    // *     example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
    // *     returns 1: ['Kevin', 'van', 'Zonneveld']

    var error = 0;
    if (inp == "" || inp.length < 2) {
        errormsg = "input is too short";
        return;
    }
    var val, kret, vret, cval;
    var type = inp.charAt(0);
    var cont = inp.substring(2);
    var size = 0, divpos = 0, endcont = 0, rest = "", next = "";

    switch (type) {
    case "N": // null
        if (inp.charAt(1) != ";") {
            errormsg = "missing ; for null";
        }
        // leave val undefined
        rest = cont;
        break;
    case "b": // boolean
        if (!/[01];/.test(cont.substring(0,2))) {
            errormsg = "value not 0 or 1, or missing ; for boolean";
        }
        val = (cont.charAt(0) == "1");
        rest = cont.substring(2);  //changed...
        break;
    case "s": // string
        val = "";
        divpos = cont.indexOf(":");
        if (divpos == -1) {
            errormsg = "missing : for string";
            break;
        }
        size = parseInt(cont.substring(0, divpos));
        if (size == 0) {
            if (cont.length - divpos < 4) {
                errormsg = "string is too short";
                break;
            }
            rest = cont.substring(divpos + 4);
            break;
        }
        if ((cont.length - divpos - size) < 4) {
            errormsg = "string is too short";
            break;
        }
        if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
            errormsg = "string is too long, or missing \";";
        }
        val = cont.substring(divpos + 2, divpos + 2 + size);
        rest = cont.substring(divpos + 4 + size);
        break;
    case "i": // integer
    case "d": // float
        var dotfound = 0;
        for (var i = 0; i < cont.length; i++) {
            cval = cont.charAt(i);
            if (isNaN(parseInt(cval)) && !(type == "d" && cval == "." && !dotfound++)) {
                endcont = i;
                break;
            }
        }
        if (!endcont || cont.charAt(endcont) != ";") {
            errormsg = "missing or invalid value, or missing ; for int/float";
        }
        val = cont.substring(0, endcont);
        val = (type == "i" ? parseInt(val) : parseFloat(val));
        rest = cont.substring(endcont + 1);
        break;
    case "a": // array
        if (cont.length < 4) {
            errormsg = "array is too short";
            return;
        }
        divpos = cont.indexOf(":", 1);
        if (divpos == -1) {
            errormsg = "missing : for array";
            return;
        }
        size = parseInt(cont.substring(1*divpos, 0));  //changed...
        cont = cont.substring(divpos + 2);
        val = new Array();
        if (cont.length < 1) {
            errormsg = "array is too short";
            return;
        }
        for (var i = 0; i + 1 < size * 2; i += 2) {
            kret = unserialize(cont, 1);
            if (error || kret[0] == undefined || kret[1] == "") {
                errormsg = "missing or invalid key, or missing value for array";
                return;
            }
            vret = unserialize(kret[1], 1);
            if (error) {
                errormsg = "invalid value for array";
                return;
            }
            val[kret[0]] = vret[0];
            cont = vret[1];
        }
        if (cont.charAt(0) != "}") {
            errormsg = "missing ending }, or too many values for array";
            return;
        }
        rest = cont.substring(1);
        break;
    case "O": // object
        divpos = cont.indexOf(":");
        if (divpos == -1) {
            errormsg = "missing : for object";
            return;
        }
        size = parseInt(cont.substring(0, divpos));
        var objname = cont.substring(divpos + 2, divpos + 2 + size);
        if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
            errormsg = "object name is too long, or missing \":";
            return;
        }
        var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
        if (error) {
            errormsg = "invalid object properties";
            return;
        }
        rest = objprops[1];
        var objout = "function " + objname + "(){";
        for (key in objprops[0]) {
            objout += "this['" + key + "']=objprops[0]['" + key + "'];";
        }
        objout += "}val=new " + objname + "();";
        eval(objout);
        break;
    default:
        errormsg = "invalid input type";
    }
    return (arguments.length == 1 ? val : [val, rest]);
}// }}}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

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;
}