/* $Id: wc_signup.js 61468 2009-10-13 09:07:17Z mgentil $ */

if(typeof window.console == "undefined")
{
    window.console = {log:function(){}};
}

var remote = {};

remote.request = function(element){
    var params = {};
    var url = "";
    var handler = null;
    switch(element.attr("id")){
        case "handle" : 
            params.pseudo = element.val();
            url = "/wc_lib/wc_home_page/handle.xml.php";
            handler = remote.pseudoSucess;
            break;
        case "postcode":
            params.postcode = element.val();
            url = "/wc_lib/wc_home_page/cities.xml.php";
            handler = remote.townSuccess;
            break;
        case "e-mail":
            params.email = element.val();
            url = "/wc_lib/wc_home_page/email.xml.php";
            handler = remote.emailSuccess;
            break;
        case "town":
            params.postcode = jQuery("#postcode").val();
            url = "/wc_lib/wc_home_page/cities.xml.php";
            handler = remote.townLoadSuccess;
            break;
        default:break;
    }
    
    jQuery.ajax({url : url,data : params, dataType: "xml",success:handler});
}
remote.emailSuccess = function(xml)
{
    var element = jQuery("input[name = 'email']");
    var error = "";
    var node = jQuery("email",xml)[0]; 

    var invalid = jQuery("invalid",node).size() > 0;
    var exists = jQuery("exists",node).size() > 0;

    if ( invalid ) 
    {
        error = "Votre e-mail est incorrect.";
    }
    if(exists)
    {
        error = "Un compte est déjà associé à cette adresse. Veuillez saisir un nouvel e-mail.";
    }

    remote.finalize(element,error);                 
};

remote.finalize = function (element,error)
{
    if(error != "")
    {
        if(typeof error == "string")
        {
            ErrorDisplay.displayError(error,element);
        }
        else
        {
            ErrorDisplay.showError(error,element);
        }
    }
    else
    {
        ErrorDisplay.hideError(element);
    }

};

remote.pseudoSucess = function(xml)
{
    var element = jQuery("input[name = 'login']");
    var error = "";
    var nodes = jQuery("option",xml);

    if(nodes.size() > 0)
    {
        var e = ErrorDisplay.getErrorCell("");

        var li = e.find("label.error");
        jQuery("<b>Ce pseudo est déjà pris.</b><br />Voici quelques suggestions<br/>").addClass("errorItem").appendTo(li);
        nodes.each(function(i){
            var $remote = remote;
            var t = jQuery(this).text();
            var text = "<a href='#'>" + t + "</a>";

            var a = jQuery(text);

            a.addClass('suggestLogin');
            a.hover(
                function()
                {
                     jQuery(this).removeClass('suggestLoginOver');
                     jQuery(this).addClass('suggestLogin');
                },
                function()
                {
                    jQuery(this).removeClass('suggestLoginOver');
                    jQuery(this).addClass('suggestLogin');
                }
            );
            a.appendTo(li);

            a.click(function(e){
                $remote.onSuggestLogin(t);
                e.preventDefault();
                e.stopPropagation();
            });

        });


        li.addClass("errorItem");
        error = e;

    }


    remote.finalize(element,error);  
};

remote.onSuggestLogin = function(text){
    var element = jQuery("input[name = 'login']");
    jQuery(element).val(text);
    remote.finalize(element,"");
}

remote.townLoadSuccess = function(xml)
{
    remote.townSuccess(xml);
    
    jQuery("#town option").each(function() {
        if(registration.postdata.townname == jQuery(this).val())
        {
            jQuery(this).attr("selected","selected");
        }           
    });
    
}
remote.townSuccess = function(xml)
{
    var element = jQuery("input[name = 'postcode']");
    var nodes = jQuery("cities option",xml);
    var error = "";
    jQuery("#town").empty();

    if(nodes.size() == 0)
    {
        error = "Votre code postal est incorrect.";
    }
    else
    {
        var options = '';
        nodes.each(
            function()
            {
                options += '<option value="' + jQuery(this).attr('value') +'">' + jQuery(this).text() + '</options>';
            }
        );
        
        jQuery("#town").html(options);
        
        try{
            if(registration.postdata.townname != "")
            {
                jQuery("#town option").each(function() {
                    if(registration.postdata.townname == jQuery(this).val())
                        jQuery(this).attr("selected","selected");
                });
                registration.postdata.townname = "";
            }
        }catch(e){};
    }


    remote.finalize(element,error);
};


var ErrorDisplay = {
    defaultErrorBlockName:"#blockDetail",
    errorBlockName:"",
    errors:new Array(),
    currElement:null
};

ErrorDisplay.init = function ()
{
    var block = jQuery(ErrorDisplay.getErrorBlockName());
    block.bgiframe();
};

ErrorDisplay.displayError = function (errorMessage,element){
    var error = ErrorDisplay.getErrorCell(errorMessage);
    ErrorDisplay.showError(error, element);
};

ErrorDisplay.show = function(error, element)
{
    var b = ErrorDisplay.getErrorBlock(element);
    error.addClass("errorItem");
    var ul = b.find("ul");
    error.appendTo(ul);
    
    b.show();
    
    ErrorDisplay.currElement = element.attr("name");
        
};

ErrorDisplay.hide = function(element)
{
     var p = element.parent().find("input[name = 'pseudo']");
     if(p.size() == 0 || p.find("a").size() == 0)
     {
       ErrorDisplay.hideError(element);
     }

};

ErrorDisplay.hideRelatedBlock = function(element)
{
    var block = jQuery(ErrorDisplay.getErrorBlockName());
    if(ErrorDisplay.currElement == element.attr("name") && block.css("display") == "block")
        block.hide();

    return;
    
    if(block.css("display") == "block" && element.css("display") == "block")
    {
        var blockPos = block.position();
        
        var pos = ErrorDisplay.getErrorBlockPosition(element);

        if(pos.top == blockPos.top && pos.left == blockPos.left)
        {
            
        }
    }
    
};
ErrorDisplay.getErrorCell = function(errorMessage){
    return jQuery('<li><label class="error">' + errorMessage +'</label></li>');
}
ErrorDisplay.showError = function(error,element){
    var errorMessage = "";
    if(error.find("label.error").size() > 0)
        errorMessage = error.find("label.error").html();

    
    if(errorMessage != "")
    {
        var img =  element.parent().find("img:first");
        img.hover(function(){ 
           ErrorDisplay.show(error,element);
        },function(){
           ErrorDisplay.hide(element);
        });
        img.show();

        ErrorDisplay.show(error,element);

        element.click(function(){ErrorDisplay.show(error,element);});
        
        ErrorDisplay.pushError(element);

    }
};

ErrorDisplay.getErrorBlockName = function()
{
    return ErrorDisplay.errorBlockName != "" ? ErrorDisplay.errorBlockName : ErrorDisplay.defaultErrorBlockName;
};

ErrorDisplay.getErrorBlock = function(element)
{
    element = jQuery(element);
    var block = jQuery(ErrorDisplay.getErrorBlockName());

    if(element.attr("type") == "checkbox" || element.attr("type") == "radio")
    {
        block.width(element.parent().innerWidth()); 
    }
    else if(element.attr("id").indexOf("birth") != -1)
    {
        var w = 0;
        element.parent().find("select").each(function(){
            w += jQuery(this).innerWidth();
        });
        
        block.width(w);
    }
    else
    {
        block.width(element.innerWidth());
    }


    var pos = ErrorDisplay.getErrorBlockPosition(element);
    
    block.css(pos);

    block.click(function(e){jQuery(this).hide();e.stopPropagation();})

    var ul = block.find("ul");
    ul.empty();

    return block;
};

ErrorDisplay.getErrorBlockPosition = function(element)
{
    var pos = element.position();
    var h = element.innerHeight();

    return {top:pos.top + h,left:pos.left};
};

ErrorDisplay.hideError = function(element)
{
    element.parent().find("img:first").hide();
    element.unbind("mouseover");
    element.unbind("mouseout");
    element.unbind("click");

    ErrorDisplay.hideRelatedBlock(element);
    ErrorDisplay.shiftError(element);

};

ErrorDisplay.pushError = function (element)
{
    var name = element.attr("name");
    if(ErrorDisplay.elementErrorIndex(name) == -1)
    {
         ErrorDisplay.errors.push(name);
    }
};

ErrorDisplay.shiftError = function (element)
{
    var name = element.attr("name");
    var index = ErrorDisplay.elementErrorIndex(name);
    if(index != -1)
    {
         ErrorDisplay.errors.shift(index,1);
    }
};

ErrorDisplay.elementErrorIndex = function(name)
{
    for(var i = 0; i < ErrorDisplay.errors.length; i++)
    {
        if(ErrorDisplay.errors[i] == name)
            return i;
    }
    
    return -1;
};

ErrorDisplay.resetErrors = function()
{
    ErrorDisplay.errors = new Array();
};





/* PROCEDURES */

var procedures = {
    checkValidForm:false
}

/* */

procedures.checkMail = function(e) {
    
	var element = jQuery("#e-mail");
    var value = element.val();
    
    ErrorDisplay.hideError(element);
    
    if(value == "")
    {
        ErrorDisplay.displayError(regErrorSetup.email.empty,element); 
    }
    else if(!/^\w([-_.]?\w)*@\w([-_.]?\w)*\.([a-z]{2,4})$/i.exec(value))
    {
         ErrorDisplay.displayError(regErrorSetup.email.invalid,element);
    }
    else 
    {
       if(procedures.checkValidForm == false) remote.request(element);
    }	
	
    e.stopPropagation();
};


procedures.suggestLogin = function(e) {	
	var element = jQuery("#handle");	
    var value = element.val();
    
    ErrorDisplay.hideError(element);
    
    if(value == "")
    {
        ErrorDisplay.displayError(regErrorSetup.login.empty,element); 
    }
    else if(value.length < 3)
    {
        ErrorDisplay.displayError(regErrorSetup.login.size,element);
    }
    else if(!/^([a-zA-Z0-9_]{1,12})$/i.exec(value))
    {
        ErrorDisplay.displayError(regErrorSetup.login.illegalChars,element);
    }
    else
    {
        if(procedures.checkValidForm == false) remote.request(element);
    }
    
    e.stopPropagation();
	
};

/* */

procedures.checkPassword = function(e) {	
	var element = jQuery("#newpassword");
    var value = element.val();
    
    ErrorDisplay.hideError(element);
    
    if(value == "")
    {
        ErrorDisplay.displayError(regErrorSetup.password.empty,element); 
    }
    else if(value == jQuery("#handle").val())
    {
        ErrorDisplay.displayError(regErrorSetup.password.loginlike,element);
    }
    else if(!/^.{3,10}$/i.exec(value))
    {
        ErrorDisplay.displayError(regErrorSetup.password.size,element);
    }
    else if(!/^([a-zA-Z0-9]{3,10})$/i.exec(value))
    {
        ErrorDisplay.displayError(regErrorSetup.password.illegalChars,element);
    }
    
    e.stopPropagation();
};


procedures.checkBirthdate = function() {
    var element = jQuery("#birthdate");
    
    ErrorDisplay.hideError(element);
	if(jQuery("#birthdate").val() == "" || jQuery("#birthmonth").val() == "" || jQuery("#birthyear").val() == "")
    {
        ErrorDisplay.displayError(regErrorSetup.birthdate.empty,element);
    }
    else if("1005" == registration.error.year)
    {
        registration.error.year = "-1";
        ErrorDisplay.displayError(regErrorSetup.birthdate.y18,element);
    }
    else if(-1 != registration.error.year)
    {
        ErrorDisplay.displayError(regErrorSetup.birthdate.invalid,element);
    }
};

procedures.checkPostcode = function(e) {	
	var element = jQuery("#postcode");
   
    ErrorDisplay.hideError(element);
    
    element = jQuery("#postcode:enabled");
    if(element.size() > 0)
    {  
        var value = element.val();
        if(value == "")
        {
             ErrorDisplay.displayError(regErrorSetup.postcode.empty,element);
        }
        else if(!/^([0-9]{5})$/i.exec(value))
        {
            ErrorDisplay.displayError(regErrorSetup.postcode.size,element);
        }
        else
        {
            if(procedures.checkValidForm == false) remote.request(element);
        }
        
    }
    
    e.stopPropagation();
};

procedures.checkCity = function(e)
{
    var element = jQuery("#town");

    ErrorDisplay.hideError(element);
    
    element = jQuery("#town:enabled");
    if(element.size() > 0)
    {  
        var value = element.val();
        if((typeof value  == "undefined" || value == "") && element.find("option").size() > 1)
        {
            ErrorDisplay.displayError(regErrorSetup.town.select,element);
        }
    }
    
    //e.stopPropagation();
};

procedures.checkCity1 = function(e)
{
    var element = jQuery("#usertown");
    
    ErrorDisplay.hideError(element);
    
    element = jQuery("#usertown:enabled");
    if(element.size() > 0)
    {            
        var value = element.val();
        if(value == "")
        {
            ErrorDisplay.displayError(regErrorSetup.town.empty,element);
        }
        else if(value.length < 2 )
        {
            ErrorDisplay.displayError(regErrorSetup.town.empty,element);
        }
        else if(/^.*([\.@]).*$/i.exec(value))
        {
            ErrorDisplay.displayError(regErrorSetup.town.invalid,element);
        }
    }
    //e.stopPropagation();
};

procedures.checkOptin = function()
{
    var element = jQuery("input[name='suboffer']");
    var value = false;
    element.each(function(){
        var val = jQuery(this).attr("checked");
        value = value | val;
    });
    ErrorDisplay.hideError(element);
    if(value == 0)
    {
         ErrorDisplay.displayError(regErrorSetup.optin.unchecked, element);
    }
}

procedures.checkCgu = function()
{
    var element = jQuery("input[name='terms']");
    var value = element.attr("checked");
    
    ErrorDisplay.hideError(element);

    if(value == false)
    {
         ErrorDisplay.displayError(regErrorSetup.cgu.unchecked, element);
    }
}

procedures.submit = function()
{    
    procedures.checkValidForm = true;
    
    ErrorDisplay.resetErrors();
    
    procedures.checkCgu();
    procedures.checkOptin();
    jQuery("#usertown").blur();
    jQuery("#town").change();
    jQuery("#postcode").keyup();
    jQuery("#birthdate").change();
    jQuery("#e-mail").blur();
    jQuery("#newpassword").blur();
    jQuery("#handle").blur();
    
    procedures.checkValidForm = false;
    
    if(ErrorDisplay.errors.length > 0)
        return false;
    else
        return true;
    
    
}

var $Localization = {};
$Localization.displayFranceOptions = function(){
    var pcode = jQuery("#postcode");
    var plabel =  pcode.parent("li").find("label");
    pcode.attr('disabled','');
    pcode.val("");
    pcode.css({'background-color':'#ffffff'});
    plabel.removeClass('otherCountry');
    jQuery("#town").empty();
    ErrorDisplay.hideError(jQuery("#town"));
    jQuery("#li-town").show();
    jQuery("#li-usertown").hide();
    jQuery("#usertown").attr('disabled','disabled');
    jQuery("#town").attr('disabled','');
};

$Localization.displayCountryOptions = function()
{
    var pcode = jQuery("#postcode"); 
    var plabel =  pcode.parent("li").find("label");
    pcode.val("");
    jQuery("#usertown").attr('disabled','');
    jQuery("#town").attr('disabled','disabled');
    pcode.attr('disabled','disabled');
    pcode.css({'background-color':'#cccccc'});
    plabel.addClass('otherCountry');
    jQuery("#li-town").hide();
    jQuery("#usertown").val("");
    jQuery("#li-usertown").show();
    ErrorDisplay.hideError(pcode);
    
};

$Localization.onCountryChange = function() {	

    if(jQuery(this).val() == 2) {
        $Localization.displayFranceOptions();
    }
    else { 
        $Localization.displayCountryOptions();
    }
};

$Localization.onCityChange = function()
{ 
   procedures.checkCity();
};

jQuery(document).ready(function(){

    ErrorDisplay.init();

    jQuery("#username").Watermark("Pseudo");
    jQuery("#userpswd").Watermark("Password");

	jQuery("#termsWindow").click( function(event) {
		window.open("/?" + jQuery.param({f: "wc_terms", d: "wc_sidePages", popup: "yes"}), "terms", "width=600, height=900, scrollbars=yes, resizable=no");
		event.preventDefault();
	});

    jQuery("#country").change(
        $Localization.onCountryChange
    );

    jQuery("#e-mail").bind("blur", procedures.checkMail);
    jQuery("#e-mail").bind("keyup", procedures.checkMail);

	jQuery("#handle").bind("blur",procedures.suggestLogin);
    jQuery("#handle").bind("keyup",procedures.suggestLogin);
    
	jQuery("#newpassword").bind("blur", procedures.checkPassword);
    jQuery("#newpassword").bind("keyup", procedures.checkPassword);
	
	jQuery("#birthdate").bind("change", procedures.checkBirthdate);
    jQuery("#birthmonth").bind("change", procedures.checkBirthdate);
    jQuery("#birthyear").bind("change", procedures.checkBirthdate);
    
    jQuery("#birthdate").bind("blur", procedures.checkBirthdate);
    jQuery("#birthmonth").bind("blur", procedures.checkBirthdate);
    jQuery("#birthyear").bind("blur", procedures.checkBirthdate);

	jQuery("#postcode").bind("blur", procedures.checkPostcode);
    jQuery("#postcode").bind("keyup", procedures.checkPostcode);
	
	jQuery("#usertown").bind("blur",procedures.checkCity1);
    jQuery("#usertown").bind("keyup",procedures.checkCity1);
    
    jQuery("#town").bind("change",procedures.checkCity);
    
    jQuery("input[name='terms']").bind("change",procedures.checkCgu);
    jQuery("input[name='suboffer']").bind("change",procedures.checkOptin);
    
    jQuery("#signup").submit(procedures.submit);
    
    
    if(jQuery("#country").val() != 2 )
    {
        $Localization.displayCountryOptions();
    }
    else
    {
        $Localization.displayFranceOptions();
    }

    if(-1 == registration.error.postcode && jQuery("#postcode").val().length > 0) { 
		remote.request(jQuery("#town"));
	}
    
    /* PERFORM CHECKS ON LOAD EVENT */
    
	try {
		if(-1 < registration.error.terms) {
			procedures.checkCgu();
		}
	}
	catch(e) {}
    
    try {
		if(-1 != registration.error.suboffer) {
            procedures.checkOptin();
		}
	}
	catch(e) {}
    
    try {
		if(-1 < registration.error.postcode) {
			procedures.checkPostcode();
		}
	}
	catch(e) {}
    
    try {
		if(-1 < registration.error.town) {
			procedures.checkCity();
            procedures.checkCity1();
		}
	}
	catch(e) {}
    
    try {
		if(-1 < registration.error.date || -1 < registration.error.month || -1 < registration.error.year) {
			procedures.checkBirthdate();
		}
	}
	catch(e) {}

	try {
		if(-1 < registration.error.email) {
			procedures.checkMail();
		}
	}
	catch(e) {}

	try {
		if(-1 < registration.error.password) {
			procedures.checkPassword();
		}
	}
	catch(e) {}

	try {
		if(-1 != registration.error.handle) {
			procedures.suggestLogin();
		}
	}
	catch(e) {}
    
});

