var submitLink;
var ALERT_EMPTY_FIELDS = "Var god fyll i alla fält.";
var ALERT_INVALID_ID = "Personnumret måste ha korrekt format, tex 19850528-1234";
var ALERT_INVALID_EMAIL = "Var god ange en korrekt epostadress";

Event.observe( window, 'load', init );

function init()
{
    var form = $( "form" );
    form.addClassName( "dynamic" );

    ///////////////////////////////////
    // submit control

    var submitFieldsets = $$( "fieldset.submit" );
    if ( submitFieldsets ) {
        var submitFieldset = submitFieldsets[submitFieldsets.length-1];

        if ( submitFieldset ) {
            var submitButton = submitFieldset.getElementsBySelector( "input" )[0];

            if ( submitButton ) {
                submitLink = new Element('a', { href: '' }).update( submitButton.getValue() );
                submitLink.observe( "click", this.onClick_submitLink );
                submitFieldset.appendChild( submitLink );
            }
        }
    }
    
    form.observe( "submit", this.onSubmit_form );

    ///////////////////////////////////
    // confirm checkbox

    var confirmCheckbox = $( "confirm" );
    if ( confirmCheckbox ) {
        confirmCheckbox.observe( "click", this.onClick_confirm );
    
        onClick_confirm();
    }
  
  
    ///////////////////////////////////
    // prepare labels and text inputs

    var labels = $$( "label" );
    var inputs = $$( "input.text, textarea" );
    
    var length = labels.length;
    var label;
    var input;
    for ( var i = 0; i < length; i++ ) {
	    label = labels[i];

	    input = $( label.readAttribute( "for" ) );

	    if ( label && input ) {

            if ( label.hasClassName( "required" ) ) {
                // transfer required class to input
                input.addClassName( "required" );
            }

	        input.emptyValue = label.innerHTML;

	        input.observe( "blur", this.onBlur_input );
	        input.observe( "focus", this.onFocus_input );

	        input.isEmpty = function() {
		        var currentValue = this.getValue();

		        return ( currentValue == "" || currentValue == this.emptyValue );
	        }

	        input.updateValue = function() {
		        if ( this.isEmpty() ) {
		            this.value = this.emptyValue;
		            this.addClassName( "empty" );
		        }
	        }

	        input.updateValue();
	    }
    }
}

function makeInputEmpty( input )
{
    var currentValue = input.getValue();
    if ( currentValue == input.emptyValue ) {
	    input.value = "";
	    input.removeClassName( "empty" );
    }
}

function onBlur_input( event )
{
    var input = event.element();

    input.removeClassName( "error" );

    input.updateValue();
}

function onClick_confirm()
{
    var confirmCheckbox = $( "confirm" );

    if ( submitLink ) {
        if ( confirmCheckbox.getValue() == "1" ) {
            submitLink.removeClassName( "disabled" );
        }
        else {
            submitLink.addClassName( "disabled" );
        }
    }
}

function onClick_submitLink( event )
{
	Event.stop( event );

    var submitButton = $$( "fieldset.submit input" )[0];
    submitButton.click();
}

function onFocus_input( event )
{
    var input = event.element();
    input.removeClassName( "error" );
    makeInputEmpty( input );
}

function onSubmit_form( event )
{
    var hasEmptyField = false;

    var inputs = $$( "input.required, textarea.required" );

    var length = inputs.length;
    var input;
    for ( var i = 0; i < length; i++ ) {
	    input = inputs[i];
	    
	    if ( input.isEmpty() ) {
	        hasEmptyField = true;
	        input.addClassName( "error" );
	    }
    }

    if ( hasEmptyField ) {
	    alert( ALERT_EMPTY_FIELDS );
	    Event.stop( event );
    }
    else if ( !regexValidateInput( "idNumber", /^(\d{4})(\d{2})(\d{2})\-(\d{4})$/ ) ) {
	    alert( ALERT_INVALID_ID );
	    Event.stop( event );
    }
    else if ( !regexValidateInput( "email", /^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/ ) ) {
	    alert( ALERT_INVALID_EMAIL );
	    Event.stop( event );
    }
    else {
        var form = $( "form" );
	    if ( form.hasClassName( "confirm" ) ) {
            // step 2
            // disable submit until the form has been sent
            var submitButton = $$( "fieldset.submit input" )[0];
            submitButton.disable();
        }
        else {
            // reset all inputs so we don't send emptyValue
            inputs = $$( "input.text, textarea" );
            length = inputs.length;
            for ( i = 0; i < length; i++ ) {
	            input = inputs[i];
                makeInputEmpty( input );
            }
        }
    }
}

function regexValidateInput( $id, $regex )
{
    var input = $$( "input#" + $id )[0];
    if ( input ) { 
        var result = $regex.test( input.getValue() );

        if ( !result ) {
            input.addClassName( "error" );
        }
        return result;
    }
    
    return true;
}