$(document).ready(function()
{
    $(".validate :text, .validate textarea, .validate select")
        .bind("change", function() { validation(this); });

    $(".validate :text, .validate textarea, .validate select")
        .bind("blur", function() { validation(this); });

    $(".validate :text, .validate textarea")
        .bind("focus", function() { textFocus(this); })
        .bind("blur", function() { textBlur(this); });

    // if returning back to this page, show fields that were unhidden
    var unHiddenDivs = $get("unHiddenDivs").value;
    if (unHiddenDivs != "")
        jQuery.each(unHiddenDivs.split(','), function() { $("#" + this).show(); });

    // show content
    //$("#maincontentwrapper").fadeIn("slow");

    $(".primaryAction").bind("click", function() { return submitClick(this); });
});

function textFocus(elem)
{
    $(elem).addClass("focus");

    var parentElem = elem.parentElement;
    $(parentElem).removeClass("validValue");
    $(parentElem).removeClass("invalidValue");
}

function textBlur(elem)
{
    $(elem).removeClass("focus");
}

function validation(elem)
{
    var container = $(elem).parents("div.validate:first");
    var containerValid = isValidInput(elem);
        
    // Highlight the containing div depending upon whether value is valid or not
    if (containerValid == true)
    {
        $(container).addClass("validValue");
        $(container).removeClass("invalidValue");
    }
    else
    {
        $(container).addClass("invalidValue");
        $(container).removeClass("validValue");
    }
}

function emailIsValid(eml) 
{
	var emailRgx = new RegExp("^\\w+([-+.\\']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
	return emailRgx.test(eml);
}

function validateEmail(source, args) 
{
	args.IsValid = emailIsValid(args.Value);
}

function isValidInput(elem)
{
    var isValid = false;
    var type = elem.type;

    if (type == "text" || type == "textarea") 
    {
    	if ($(elem).hasClass("email"))
    		isValid = emailIsValid(elem.value);
    	else 
    	{
    		var reqdRgx = new RegExp("\\S+");
    		isValid = reqdRgx.test(elem.value);
    	}
    }
    else if (type == "select-one")
    {
        if (elem.selectedIndex > 0)
            isValid = true;
    }

    return isValid;
}

function showIfLast(elemSel, jqElemOther)
{
    elemSel.selectedIndex == elemSel.options.length-1 ? show(jqElemOther) : hide(jqElemOther);
}

function addToList(elem, str) 
{
    if (elem.value.indexOf(str) == -1)
    {
        if (elem.value != "")
            elem.value += ",";
        elem.value += str;
    }
}

function removeFromList(elem, str)
{
    if (elem.value.indexOf(str) != -1)
    {
        if (elem.value == str)
            elem.value = "";
        else
            elem.value = elem.value.replace("," + str, "");
    }
}

function show(jqElem)
{
	addToList($get("unHiddenDivs"), jqElem[0].id);
    jqElem.fadeIn("slow");
    if ($get("submitClicked").value)
        validatorIsEnabled(jqElem, true);
}

function hide(jqElem) 
{
    removeFromList($get("unHiddenDivs"), jqElem[0].id);
    jqElem.hide();
    if ($get("submitClicked").value)
        validatorIsEnabled(jqElem, false);
}

function toggle(jqElem)
{
    jqElem.is(":hidden") ? show(jqElem) : hide(jqElem);
}

function validatorIsEnabled(jqElem, isEnabled)
{
    jqElem.find(":text, textarea, select, :checkbox, :radio").each(function()
    {
        var validators = this.attributes["Validators"];
        if (validators)
            ValidatorEnable($get(validators.nodeValue[0].id), isEnabled);
    });
}

function submitClick(elem)
{
    $(elem).unbind("click");
    $(elem).bind("click", function() { return false; });
    
    $get("submitClicked").value == "true";
    $(".validate :text, .validate textarea, .validate select").each(function() { validation(this); });

    // Enable Validators for all non-hidden fields
    for (var i = 0; i < Page_Validators.length; i++) 
    {
        var validator = Page_Validators[i];
        var targetCtl = validator.controltovalidate;
        var container = $("#" + targetCtl).parents("div.validate:first");
        ValidatorEnable(validator, ! $(container).is(":hidden"));
    }
    
    Page_ClientValidate();
    
    // Set focus to first control that failed validation
    if (! Page_IsValid)
    {
        for (var j = 0; j < Page_Validators.length; j++)
        {
            validator = Page_Validators[j];
            if (! validator.isvalid)
            {
                $get(validator.controltovalidate).focus();
                $(elem).unbind("click");
                $(elem).bind("click", function() { return submitClick(this); });
                return false;
            }
        }
    }

    return true;
}

