var hex_chr = "0123456789abcdef";
function rhex(num)
{
  str = "";
  for(j = 0; j <= 3; j++)
    str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) + hex_chr.charAt((num >> (j * 8)) & 0x0F);
  return str;
}
function str2blks_MD5(str)
{
  nblk = ((str.length + 8) >> 6) + 1;
  blks = new Array(nblk * 16);
  for(i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++) blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * 8);
  blks[i >> 2] |= 0x80 << ((i % 4) * 8);
  blks[nblk * 16 - 2] = str.length * 8;
  return blks;
}
function add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}
function cmn(q, a, b, x, s, t)
{
  return add(rol(add(add(a, q), add(x, t)), s), b);
}
function ff(a, b, c, d, x, s, t)
{
  return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function gg(a, b, c, d, x, s, t)
{
  return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function hh(a, b, c, d, x, s, t)
{
  return cmn(b ^ c ^ d, a, b, x, s, t);
}
function ii(a, b, c, d, x, s, t)
{
  return cmn(c ^ (b | (~d)), a, b, x, s, t);
}
function calcMD5(str)
{
  x = str2blks_MD5(str);
  a =  1732584193;
  b = -271733879;
  c = -1732584194;
  d =  271733878;

  for(i = 0; i < x.length; i += 16)
  {
    olda = a; oldb = b;
    oldc = c; oldd = d;
    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = ff(c, d, a, b, x[i+10], 17, -42063);
    b = ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = ff(d, a, b, c, x[i+13], 12, -40341101);
    c = ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = ff(b, c, d, a, x[i+15], 22,  1236535329);    

    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = gg(c, d, a, b, x[i+11], 14,  643717713);
    b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = gg(c, d, a, b, x[i+15], 14, -660478335);
    b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = gg(b, c, d, a, x[i+12], 20, -1926607734);
    
    a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = hh(b, c, d, a, x[i+14], 23, -35309556);
    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = hh(d, a, b, c, x[i+12], 11, -421815835);
    c = hh(c, d, a, b, x[i+15], 16,  530742520);
    b = hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = ii(c, d, a, b, x[i+10], 15, -1051523);
    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = ii(d, a, b, c, x[i+15], 10, -30611744);
    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = add(a, olda);
    b = add(b, oldb);
    c = add(c, oldc);
    d = add(d, oldd);
  }
  return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}

//delay imposed between showing the confirmation that an action was requested and actually sending the request (AJAX)
//this delay will prevent the 'please hold' message from appearing and disappearing so fast that it looks like flicker?>
var flicker_delay = 300;

function showOverlay(show) {
	if(!show) {
		document.getElementById('login_overlay').style.display = 'none';
	}
	else {
		if (typeof window.opera == "undefined") {
			var height = DomUtils.getElementHeight(document.body);
			document.getElementById('login_overlay').style.height = height + 'px';
			document.getElementById('login_overlay').style.display = 'block';
		}
	}
}

function showLoginBubble() {
    showLoginOverlayBubble(1, 'login');
}

function showLoginOverlayBubble(show,type) {
	showOverlay(show);
	if(!show && !loginBubbleIsClosed()) {
		document.getElementById('loginoverlaybubble').style.left = '-1000px';
	}
	else if(show){
		if(document.getElementById('loginbubblemsg')) {
			document.getElementById('loginbubblemsg').style.display = (type=='msg' ? '' : 'none'); }
		if(document.getElementById('loginbubblecontainer')) {
            if(document.getElementById('loginbubbleform')) {
                document.getElementById('loginbubbleform').style.display = (type=='login' ? '' : 'none'); 
            }
            document.getElementById('loginbubblecontainer').style.display = (type=='login'? '' : 'none'); 
        }
		var width = DomUtils.getWindowWidth();
		var height = DomUtils.getWindowHeight();
		var scrollX = DomUtils.getWindowScrollX();
		var scrollY = DomUtils.getWindowScrollY();
		if(width==0 || height==0 || typeof window.opera!="undefined") {
			if(typeof window.opera=="undefined" && document.documentElement.clientWidth) {
				width = document.documentElement.clientWidth;
				height = document.documentElement.clientHeight;
			}
			else {
				width = document.body.clientWidth;
				height = document.body.clientHeight;
			}
		}
		if(scrollX==0 || scrollY==0) {
			scrollX = document.documentElement.scrollLeft;
			scrollY = document.documentElement.scrollTop;
		}
		var bwidth = DomUtils.getElementWidth(document.getElementById('loginoverlaybubble'));
		var bheight = DomUtils.getElementHeight(document.getElementById('loginoverlaybubble'));
		document.getElementById('loginoverlaybubble').style.top = (scrollY + (height/2) - (bheight/2)) + 'px';
		document.getElementById('loginoverlaybubble').style.left = (scrollX + (width/2) - (bwidth/2)) + 'px';
	}
}

function loginBubbleClose() {
	showLoginOverlayBubble(0,'');
}
function loginBubbleIsClosed() {
	return parseInt(document.getElementById('loginoverlaybubble').style.left)>0 ? false : true;
}

function submitOverlayLogin(type) {
    var errors = 0;
    var error_message = '';
    if( type == 'login' ) {
        if( document.login.login.value=='' ) {
            error_message = 'Please enter a username';
            document.login.login.focus();
            document.login.pass.value='';
            errors = 1;
        }
        if( errors==0 && document.login.pass.value=='' ) {
            error_message = 'Please enter a password';
            document.login.pass.focus();
            errors = 1;
        }
    }
    else if(type == 'signup') {
        if( document.login.signup_login.value=='' ) {
            error_message = 'Please enter a username';
            document.login.signup_login.focus();
        }
        if( document.login.signup_pass.value=='' ) {
            error_message = 'Please enter a password';
            document.login.signup_pass.focus();
        }

        if( document.login.signup_pass_confirm.value=='' ) {
            errors = 1;
            error_message = 'Please enter a username and password';
            document.login.signup_pass.value='';
            document.login.signup_login.focus();
        }
            
        else if ( document.login.signup_pass.value != document.login.signup_pass_confirm.value ) {
            error_message = 'The passwords that you provided do not match.';
            errors = 1;
        }
        if( !isValidEmail(document.login.signup_email.value) ) {
            error_message = 'The email address is invalid.';
            errors = 1;
        }

    }
    if(errors == 1) {
        if(type == 'login') {
            document.getElementById('loginbubble_login_error').innerHTML = error_message;
        }
        else if(type == 'signup') {
            document.getElementById('loginbubble_signup_error').innerHTML = error_message;
        }
    }
	if(errors == 0) {
		ShowLoginMessage('<img src="http://ai.pricegrabber.com/images/small_wait.gif" width=16 height=16>','Please hold while we process your request ...','#666666');
        if( type == 'login') {
            var password = document.login.pass.value;
            var username = document.login.login.value;
            ajax = new AjaxRequest('POST', '/login.php/login', true, 3000);
        }
        else if( type == 'signup' ) {
            var password = document.login.signup_pass.value;
            var username = document.login.signup_login.value;
            ajax = new AjaxRequest('POST', '/login.php/signup', true, 3000);
            
            ajax.setParameter('pass_confirm', calcMD5(document.login.signup_pass_confirm.value));
            ajax.setParameter('email', document.login.signup_email.value);
            
            if(document.login.captcha_value) {
                ajax.setParameter('captcha_value', document.login.captcha_value.value);
                ajax.setParameter('captcha_iv', document.login.captcha_iv.value);
                ajax.setParameter('captcha_response', document.login.captcha_response.value);
            }
        }
        var md5pass = calcMD5(password);
        var challenge = calcMD5(username) + '072aa6c68b890c455b60008dff9cc630df';
        ajax.setParameter('username', username);
        ajax.setParameter('pass', md5pass);
        ajax.setParameter('type', document.login.type.value);
        ajax.setCallback( callbackLogin );
        ajax.setParameter('challenge', challenge);
		setTimeout('ajax.send();',flicker_delay);
	}	
}

function ShowLoginMessage(img,txt,color) {
	document.getElementById('loginbubblemsgbody').style.color = color;
	document.getElementById('loginbubblemsgbody').innerHTML = txt;
	if(img == '') {
		document.getElementById('loginbubblemsgimage').style.display = 'none';
	}
	else {
		document.getElementById('loginbubblemsgimage').innerHTML = img;
		document.getElementById('loginbubblemsgimage').style.display = '';
	}
	showLoginOverlayBubble(1,'msg');
}

function callbackLogin(XmlResp) {
	if(!XmlResp) {
		ShowLoginMessage('','Error while processing your request, please try again','#CC3232');
	}
	else {
		var error = XmlResp.getElementsByTagName('error');
		var msgnb = XmlResp.getElementsByTagName("nb")[0].firstChild.nodeValue;
		var msgdesc = XmlResp.getElementsByTagName("desc")[0].firstChild.nodeValue;
		var act = XmlResp.getElementsByTagName("action")[0].firstChild.nodeValue;
		if(error.length > 0) {
			ShowLoginMessage('',msgdesc,'#CC3232');
		}
		else {
			if( act=='login' || act=='signup' ) {
				var loggedin = XmlResp.getElementsByTagName("logged-in")[0].firstChild.nodeValue;
                var loginSuccess = XmlResp.getElementsByTagName("login_success")[0].firstChild.nodeValue;
				if(loggedin < 1) {
                    if( act == 'login' ) {
                        var msg_elem = document.getElementById("loginbubble_login_error");
                        document.login.pass.value = '';
                    }
                    else if ( act == 'signup' ) {
                        var msg_elem = document.getElementById("loginbubble_signup_error");
                    }
                    
                    msg_elem.innerHTML = msgdesc;
					showLoginOverlayBubble(1,'login');
				}
				else {
                    loginBubbleClose();
				    var type = XmlResp.getElementsByTagName("type")[0].firstChild.nodeValue;
                    if( type == "potd_subscribe" ) {
                        getUserSubscriptions();
                        showPotdOverlayBubble(1, 'subscribe');
                    }
                    else if( type == "potd_purchase" ) {
                                                document.location = "/product_of_the_day.php/sf_start" + "";
                    }
                    else if( type == "potd_pricequery" ) {
                        document.location.reload();
                    }
                    else if( type == "no_seller_price_alert" ) {
                        addNoSellerPriceAlert();
                    }
				}
			}
		}
	}
}

function isValidEmail(emailStr) {
    var emailPat=/^(.+)@(.+)$/;
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
    var validChars="\[^\\s" + specialChars + "\]";
    var quotedUser="(\"[^\"]*\")";
    var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
    var atom=validChars + '+';
    var word="(" + atom + "|" + quotedUser + ")";
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
    var matchArray=emailStr.match(emailPat);
    if (matchArray==null) {
        return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];
    if (user.match(userPat)==null) {
        return false;
    }
    var IPArray=domain.match(ipDomainPat);
    if (IPArray!=null) {
        for (var i=1;i<=4;i++) {
            if (IPArray[i]>255) {
                return false;
            }
        }
        return true;
    }
    var domainArray=domain.match(domainPat);
    if (domainArray==null) {
        return false;
    }
    var atomPat=new RegExp(atom,"g");
    var domArr=domain.match(atomPat);
    var len=domArr.length;
    if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>4) {
        return false;
    }
    if (len<2) {
        return false;
    }
    return true;
}

window.login_js = 1;
