/////////////////////////////////////////////////////////////
////////////////////////// COMMON ///////////////////////////
/////////////////////////////////////////////////////////////

var DHTML = (document.getElementById || document.all || document.layers);

function getObj(name)
{
    if (document.getElementById)
    {
        return document.getElementById(name);
    }
    else if (document.all)
    {
        return document.all[name];
    }
    else if (document.layers)
    {
        return document.layers[name];
    }
}

function getParentWin()
{
    return window.parent;
}

/////////////////////////////////////////////////////////////
/////////////////////////// MAIN ////////////////////////////
/////////////////////////////////////////////////////////////

var toolbarLoginDivName = "remembered";
var toolbarPasswordDivName = "forgot";

function isValidEmail(email) 
{
	var regexp = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

	if (email.length < 5 || !email.match(regexp)) 
    { 
        return false; 
    }
	
	return true;
}

function isValidUsername(name) 
{
	var regexp = /^[\w \-]{5,20}$/

	if (name.length < 5 || !name.match(regexp)) 
    { 
        return false; 
    }
	
    return true;
}

function acctCreateVerify()
{
    if (getObj('registerVerify').checked==false)
    {
        alert('Please verify that you agree to our terms of service.');
        return false;
    }
    else if (isValidUsername(getObj('registerUsername').value)==false)
    {
        alert('Your username should be 5 to 20 characters long and use only letters, numbers, spaces, dashes and underscores.');
        return false;
    }
    else if (isValidEmail(getObj('registerEmail').value)==false)
    {
        alert('Please enter a valid email address.');
        return false;
    }
    else if (getObj('registerPass').value=="" || getObj('registerPass').value!=getObj('registePass2').value)
    {
        alert('Please enter the same password twice.');
        return false;
    }
    else if (getObj('registerCaptcha').value.length!=4)
    {
        alert('Please enter the 4-digit number you see in the image.');
        return false;
    }

    return true;
}


function acctEditVerify(form)
{
    if(isValidEmail(form.e.value)==false)
    {
        alert('Please enter a valid email address.');
        return false;
    }
           
    if(!form.pr.value=='')
    {
    	form.pr.value = scrubMultiByte(form.pr.value);
    }

    return true;
}

function earnVerify(form)
{
    if(isValidEmail(form.paypal_email.value)==false)
    {
        alert('Please enter a valid email address.');
        return false;
    }
    else if(form.firstname.value=="")
    {
        alert('Firstname is required.');
        return false;
    }
    else if(form.lastname.value=="")
    {
        alert('Lastname is required.');
        return false;
    }
    else if(form.address1.value=="")
    {
        alert('Address is required.');
        return false;
    }
    else if(form.city.value=="")
    {
        alert('City is required.');
        return false;
    }
    else if(form.state.value=="")
    {
        alert('State is required.');
        return false;
    }
    else if(form.zipcode.value=="")
    {
        alert('Zip Code is required.');
        return false;
    }
    else if(form.terms.checked<1 || form.guidelines.checked<1)
    {
        alert("You MUST agree to the Terms of Use, Privacy Policy, and the Article Submission Guidelines");
        return false;
    }

    return true;
}


function acctPasswordVerify(form)
{
    if(!form.op.value=="")
    {
        if (form.np.value=="" || form.np.value!=form.np2.value)
        {
	    alert('Please enter the same password twice.');
	    return false;
        }
    }

    return true;
}

function acctNameVerify()
{
    if (isValidUsername(getObj('registerUsername').value)==false)
    {
        alert('Your username should be 5 to 20 characters long and use only letters, numbers, spaces, dashes and underscores.');
        return false;
    }

    return true;
}


function addComment(statusCode, articleId, commentId)
{
    if (statusCode == 0)
    {   
        document.location="/article.jsp?id="+articleId;
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function addRequestComment(statusCode, requestId, requestCommentId)
{
    if (statusCode == 0)
    {   
        document.location="/request.jsp?id="+requestId;
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function addArticle(statusCode, articleId)
{
    if (statusCode == 0)
    {
        document.location="/article.jsp?id="+articleId;
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else if (statusCode & 1)
    {
        alert("Error");
    }
    else if (statusCode & 4)
    {
        alert("Error: Missing article title");
    }
    else if (statusCode & 8)
    {
        alert("The file you are trying to upload exceeds the maximum size of 300KB. Please upload a smaller image.");
    }
    else if (statusCode & 16)
    {
        alert("Advice.com only supports the jpg, gif, and png image types.");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function addRequest(statusCode, requestId)
{
    if (statusCode == 0)
    {
        document.location="/request.jsp?id="+requestId;
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else if (statusCode & 1)
    {
        alert("Error");
    }
    else if (statusCode & 4)
    {
        alert("Error: Missing request title");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function addFavorite(statusCode, articleId)
{
    if (statusCode == 0)
    {   
        alert("This article was saved in your personal file.\nYou can find it under My Saved Advice.");
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function addUserImage(statusCode, error)
{
    if (statusCode == 0)
    {
        document.location="/editprofile";
    }
    else
    {
        alert("An Error occured while uploading your image. " + error );
    }
}

function rate(statusCode, articleId, rating)
{
    if (statusCode == 0)
    {
        for (var i = 1; i < 6; i++) 
        {
            var star = getObj("star"+i);
            if (i <= rating) 
            {
                star.src="/images/content/stars/s1.gif";
            }
            else
            {
                star.src="/images/content/stars/s0.gif";
            }
            star.setAttribute("onmouseout","starCount("+rating+")");
        }
        ajaxFrame.document.location="/ajax/clearCache.jsp?o=Article&id="+articleId;
    }
    else if (statusCode & 2)
    {
        logout("You need to log in");
    }
    else
    {
        alert("Error "+statusCode);
    }
}

function makeAccount(statusCode, name, inPopup)
{
    if (statusCode == 0)
    {
        document.location="/";
    }
    else
    {
        var message = "";
        if (statusCode & 1)
        {
            message = "Error creating account.  Please try again later.";
        }
        else if (statusCode & 2)
        {
            message = "Please enter your email.";
        }
        else if (statusCode & 4)
        {
            message = "Please enter a password.";
        }
        else if (statusCode & 8)
        {
            message = "Please verify the password.";
        }
        else if (statusCode & 16)
        {
            message = "You already have an account.";
        }
        else if (statusCode & 32)
        {
            message = "Please enter the number you see in the image.";
        }
        else if (statusCode & 128)
        {
            message = "Please choose a user name.";
        }
        else if (statusCode & 256)
        {
            message = "Sorry, the name '"+name+"' is already taken.";
        }
        else if (statusCode & 512)
	{
	    message = "Your original password is incorrect.";
        }
        
        alert(message);
    }
}


function editAccount(statusCode, name, inPopup)
{
    if (statusCode == 0)
    {
        document.location="/latest/author/"+ name +"/";
    }
    else
    {
        var message = "";
        if (statusCode & 1)
        {
            message = "Error creating account.  Please try again later.";
        }
        else if (statusCode & 2)
        {
            message = "Please enter your email.";
        }

        alert(message);
    }
}



function editEarn(statusCode, name, inPopup)
{
    if (statusCode == 0)
    {
        document.location="/earnfinal.jsp";
    }
    else
    {
        var message = "";
        if (statusCode & 1)
        {
            message = "An Error occured while applying for the EARN program.  Please try again later.";
        }
        else if (statusCode & 2)
        {
            message = "Please enter your email.";
        }

        alert(message);
    }
}

function editUsername(statusCode, name)
{
    if (statusCode == 0)
    {
        document.location="/";
    }
    else
    {
        var message = "";
        if (statusCode & 128)
        {
            message = "Please enter a username.";
        }
        else if (statusCode & 256)
        {
            message = "That username already exists.  Please choose a different username.";
        }

        alert(message);
    }
}



function login(statusCode, name, inPopup)
{
    if (statusCode == 0)
    {
        document.location=document.location; // reload page
    }
    else
    {
        var message = "Error.";
        if (statusCode & 1)
        {
            message = "Error logging in.  Please try again later.";
        }
        else if (statusCode & 2)
        {
            message = "Please enter your email.";
        }
        else if (statusCode & 4)
        {
            message = "Please enter your password.";
        }
        else if (statusCode & 64)
        {
            message = "Invalid login.";
        }
        
        alert(message);
    }
}

function facebookLogin(statusCode, name, firstTime)
{
    if (statusCode == 0)
    {
        if (firstTime)
        {
            document.location="/username.jsp";
        }
        else
        {
            document.location=document.location; // reload page
        }
    }
    else
    {
        var message = "Error.";
        if (statusCode & 1)
        {
            message = "Error logging in.  Please try again later.";
        }
        else if (statusCode & 2)
        {
            message = "Please enter your email.";
        }
        else if (statusCode & 4)
        {
            message = "Please enter your password.";
        }
        else if (statusCode & 64)
        {
            message = "Invalid login.";
        }
        
        alert(message);
    }
}

function logout(message)
{
    document.location = "/";
}

function facebookLogout(message)
{
    FB.Connect.logout(logout);
}

function forgotPassword()
{
    var toolbarLoginDiv = getObj(toolbarLoginDivName);
    var toolbarPasswordDiv = getObj(toolbarPasswordDivName);   
    if (toolbarLoginDiv && toolbarPasswordDiv)
    {
        toolbarLoginDiv.style.display="none";
        toolbarPasswordDiv.style.display="block";
    }
}

function rememberedPassword()
{
    var toolbarLoginDiv = getObj(toolbarLoginDivName);
    var toolbarPasswordDiv = getObj(toolbarPasswordDivName);
    if (toolbarLoginDiv && toolbarPasswordDiv)
    {
        toolbarPasswordDiv.style.display="none";
        toolbarLoginDiv.style.display="block";
    }
}

function starCount(count)
{
    for (var i = 1; i < 6; i++) 
    {
        var star = getObj("star"+i);
        if (i <= count) 
        {
            star.src="/images/content/stars/s1.gif";
        }
        else
        {
            star.src="/images/content/stars/s0.gif";
        }
    }
}

function showEmailForm()
{
    var emailForm = getObj("actionEmailForm");
    if (emailForm)
    {
        actionEmailForm.style.display="block";
    }
}

function fbLoginCallback()
{
    var api = FB.Facebook.apiClient;
    var uid = FB.Facebook.apiClient.get_session().uid ;
    var sql = "SELECT proxied_email, first_name, last_name, hometown_location, about_me, profile_url, pic_big FROM user WHERE uid ="+uid;
    FB.Facebook.apiClient.fql_query(sql, function(result, ex) {
        ajaxFrame.document.location="/ajax/fbLogin.jsp?uid="+urlencode(uid)+
                                                      "&e="+urlencode(result[0]['proxied_email'])+
                                                      "&f="+urlencode(result[0]['first_name'])+
                                                      "&l="+urlencode(result[0]['last_name'])+
                                                      "&c="+urlencode(result[0]['hometown_location']['city'])+
                                                      "&s="+urlencode(result[0]['hometown_location']['state'])+
                                                      "&z="+urlencode(result[0]['hometown_location']['zip'])+
                                                      "&i="+urlencode(result[0]['about_me'])+
                                                      "&u="+urlencode(result[0]['profile_url'])+
                                                      "&p="+urlencode(result[0]['pic_big']);
    });
}

/////////////////////////////////////////////////////////////
/////////////////////////// AJAX ////////////////////////////
/////////////////////////////////////////////////////////////

function ajaxLogin(statusCode, name, inPopup)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.login(statusCode, name, inPopup);
    }
}

function ajaxFacebookLogin(statusCode, name, firstTime)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.facebookLogin(statusCode, name, firstTime);
    }
}

function ajaxLogout(message)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.logout(message);
    }
}

function ajaxFacebookLogout(message)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.facebookLogout(message);
    }
}

function ajaxMakeAccount(statusCode, name, inPopup)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.makeAccount(statusCode, name, inPopup);
    }
}

function ajaxEditAccount(statusCode, name, inPopup)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.editAccount(statusCode, name, inPopup);
    }
}

function ajaxEditEarn(statusCode, name, inPopup)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.editEarn(statusCode, name, inPopup);
    }
}

function ajaxEditUsername(statusCode, name)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.editUsername(statusCode, name);
    }
}

function ajaxRate(statusCode, articleId, rating)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.rate(statusCode, articleId, rating);
    }
}

function ajaxAddComment(statusCode, articleId, commentId)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addComment(statusCode, articleId, commentId);
    }
}

function ajaxAddRequestComment(statusCode, requestId, requestCommentId)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addRequestComment(statusCode, requestId, requestCommentId);
    }
}

function ajaxAddArticle(statusCode, articleId)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addArticle(statusCode, articleId);
    }
}

function ajaxAddRequest(statusCode, articleId)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addRequest(statusCode, articleId);
    }
}

function ajaxAddFavorite(statusCode, articleId)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addFavorite(statusCode, articleId);
    }
}

function ajaxAddUserImage(statusCode)
{
    var parent = getParentWin();
    if (parent)
    {
        parent.addUserImage(statusCode);
    }
}

function ajaxEmailedPassword(statusCode)
{
    if (statusCode == 0)
    {
        alert("Your password was emailed to you.  Please check your email and try logging in.");
    }
    else
    {
        alert("We were unable to send you your password.");
    }
}

function ajaxEmailedRequest(statusCode)
{
    if (statusCode == 0)
    {
        alert("We successfully sent a link to this request to the email address you specified.");
    }
    else
    {
        alert("Unfortunately we were unable to send the email.");
    }
}

function ajaxEmailedArticle(statusCode)
{
    if (statusCode == 0)
    {
        alert("We successfully sent a link to this article to the email address you specified.");
    }
    else
    {
        alert("Unfortunately we were unable to send the email.");
    }
}

function fileUpload(statusCode)
{
    if (statusCode == "profile")
    {
        parent.location="/editprofile.jsp";
    }
    else if (statusCode == "article")
    {
        parent.location="/";
    }
    else
    {
        alert("Error "+ statusCode);
    }
}

function scrubMultiByte(formatted_text)
{
	var formatted_formatted_text = formatted_text;	
	
	formatted_text = formatted_text.replace(/\u2026/g,"&#133;"); // ...
	formatted_text = formatted_text.replace(/\u2018/g,"'");	// '
	formatted_text = formatted_text.replace(/\u2019/g,"'");	// '
	formatted_text = formatted_text.replace(/\u201C/g,"&quot;"); // "
	formatted_text = formatted_text.replace(/\u201D/g,"&quot;"); // "
	formatted_text = formatted_text.replace(/\u2014/g,"-");	// - 
	formatted_text = formatted_text.replace(/\u2013/g,"-");	// - 
	formatted_text = formatted_text.replace(/\u00BC/g,"&#188;"); // 1/4
	formatted_text = formatted_text.replace(/\u00BD/g,"&#189;"); // 1/2
	formatted_text = formatted_text.replace(/\u00BE/g,"&#190;"); // 3/4
	formatted_text = formatted_text.replace(/\u00E9/g,"&#233;"); // e'
	formatted_text = formatted_text.replace(/\u2022/g,"&#149;"); // bullet
	formatted_text = formatted_text.replace(/\u25E6/g,"&#149;"); // bullet
	formatted_text = formatted_text.replace(/\u00A9/g,"&copy;"); 
	formatted_text = formatted_text.replace(/\u00AE/g,"&reg;");
	formatted_text = formatted_text.replace(/\u00A3/g,"&pound;");
    formatted_text = formatted_text.replace(/\u00E7/g,"&#231;"); 
	formatted_text = formatted_text.replace(/\u2122/g,"&trade;");
	formatted_text = formatted_text.replace(/\u20AC/g,"&euro;");
	
	return formatted_text;	
}

function urlencode(str) 
{
    var ret = (str+'').toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    var replacements = [
        ["'", '%27'],
        ['(', '%28'],
        [')', '%29'],
        ['*', '%2A'],
        ['~', '%7E'],
        ['!', '%21'],
        ['%20', '+'],
        ['\u20AC', '%80'],
        ['\u0081', '%81'],
        ['\u201A', '%82'],
        ['\u0192', '%83'],
        ['\u201E', '%84'],
        ['\u2026', '%85'],
        ['\u2020', '%86'],
        ['\u2021', '%87'],
        ['\u02C6', '%88'],
        ['\u2030', '%89'],
        ['\u0160', '%8A'],
        ['\u2039', '%8B'],
        ['\u0152', '%8C'],
        ['\u008D', '%8D'],
        ['\u017D', '%8E'],
        ['\u008F', '%8F'],
        ['\u0090', '%90'],
        ['\u2018', '%91'],
        ['\u2019', '%92'],
        ['\u201C', '%93'],
        ['\u201D', '%94'],
        ['\u2022', '%95'],
        ['\u2013', '%96'],
        ['\u2014', '%97'],
        ['\u02DC', '%98'],
        ['\u2122', '%99'],
        ['\u0161', '%9A'],
        ['\u203A', '%9B'],
        ['\u0153', '%9C'],
        ['\u009D', '%9D'],
        ['\u017E', '%9E'],
        ['\u0178', '%9F']];
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (var i = 0; i < replacements.length; i++) {
        ret = replacer(replacements[0], replacements[1], ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}


