/// <reference path="jquery-1.5.1.js" />
$(function() {
    function hide_general_error(){
        $("#header_summary_general_error").hide();
        $("#page_content input").unbind( "change", hide_general_error );
        }
    $("#page_content :input[type=text], #page_content :password")
        .change( hide_general_error )
        //.attr( "autocomplete", "off" )//to escape xhtml valid problem
        ;
   
    //header summary control
    window.header_summary = {
        show_genereal_error : function( error ){
            $("#header_summary_general_error").text( error ).show();
            $("#page_content input").change( hide_general_error );
            }
        }
});

$(function() {
    function hide_dialog() { $("#tip_dialog").dialog( 'close' ); }
    
    $("#tip_dialog").dialog( {
        autoOpen: false,
        modal: true, 
        width: 600, 
        minWidth: 300, 
        height: 450, 
        show: 'blind', 
        hide: 'blind',
        beforeclose: function(event, ui) { $(".ui-widget-overlay").unbind( 'click', hide_dialog); }
        });

    function show_content( html ) {
        $("#tip_dialog").html( html ).dialog( 'open' );
        $(".ui-widget-overlay").click(hide_dialog);
        }
    
    var xhr = null;
    function show_content_ajax( url ) {
        if ( xhr != null ) xhr.abort();
        xhr = $.ajax({
            url: url,
            type: "POST",
            data: $("#page_content form").serialize(),
            dataType: "html",
            complete: function()
                {
                xhr = null;
                },
            success: function( content )
                {
                show_content( content );
                },
            error: function( xhr, textStatus, errorThrown)
                {
                var data;
                try { window["eval"]("data = (" + xhr.responseText+ ")" ); } catch ( e ) { debug_mode && alert([e, xhr.responseText]); }
                if ( data && data.error ) { $("#tip_dialog").html( data.error ).dialog( 'open' ); }
                }
            });
        }
    
    $('a.info_tip').click( function(e) 
        {  
        show_content_ajax($(this).metadata().tip_content);
        e.preventDefault();
        return false;
        });  
    
    $('a.info_details').click( function(e) 
        {
        show_content( $(this).siblings("#details_html").html() );
        e.preventDefault();
        return false;
        });  
});

(function($) {
    function update_bounds( container, command ) { 
        var active = container.hasClass("input_info_active");
        var info = $(".input_info_block", container);
        var icon = $(".input_icon", container);
        var descr = info.children(".input_description");

        var has_validation_error = info.parents("td").prev("td").children("input").hasClass("input-validation-error");
        if ( active ) descr.show();
        else descr.hide();
        var has_visible_text = !has_validation_error && (( active && descr.size() ) || container.hasClass("input_info_invalid") );
        if ( has_visible_text ){
            info.css( "width", "30em" ).show();
            //var prev_top = info[0].offsetTop;
            var input = container.data("input");
            var w = 0;
            info.children().each( function() {
                var cw = $(this).width();
                if ( cw > w ) w = cw;
                });
            if ( w ) info.width( w );
            var middle = input.parent().outerHeight() - (
                ( input.position().top - input.parent().position().top )//topmargin
                + input.outerHeight()/2
                );
            icon.css( "top", "-"+(middle+7)+"px" );
            info.css( "top", "-"+(middle+info.outerHeight()/2)+"px" )
                .css( "border", active ? "solid 1px #CCCCCC" : "solid 1px transparent" );
            /*if ( prev_top != info[0].offsetTop || command == "activate" )
                info.fadeTo( 0, 0.1 ).fadeTo( "fast", 1 );*/
            }
        else {
            info.hide();
            }
        }

    $.extend({
        validation_config: {
                            ignoreTitle: true,
                            onkeyup: false,
                            errorClass: "input-validation-error",
                            errorPlacement: function( error_label, element ) {
                                error_label.appendTo( $(".input_info_block", element.input_info("get") ) );
                                },
                            showErrors: function(errorMap, errorList) {
                                this.defaultShowErrors();
                                $.each( this.successList, function(){ 
                                    $(this).input_info("valid");
                                    });
                                $.each( this.errorList, function(){ 
                                    $(this.element).input_info("invalid");
                                    });
                                }
                            }
        });

    $.fn.extend({ 
        input_info: function( command ) { 
            var container = this.parent("td").next("td").children(".input_info_container").data("input", this);
            if (command){
			    switch(command) {
			        case "get":
			            return container;
				        break;
			        case "activate":
    			        container.addClass("input_info_active");
    			        update_bounds(container, command);
				        break;
			        case "deactivate":
    			        container.removeClass("input_info_active");
    			        update_bounds(container, command);
				        break;
			        case "valid":
    			        container.removeClass("input_info_invalid")
    			            .removeClass("input_info_valid")
    			            .filter( function(){//don't set valid class
    			                var input = $(this).data("input");
    			                //when input isn't really validated
    			                if ( ! input.data("show_validmark") ) return false;
    			                
    			                var val = $.trim( input.val() );
    			                //when input is empty
    			                if ( val == "" ) return false;
    			                //when contain initial value
    			                if ( val == input.data("initial_val") ) return false;
    			                return true;
    			                })
    			            .addClass("input_info_valid");
    			        update_bounds(container, command);
				        break;
			        case "invalid":
    			        container.removeClass("input_info_valid").addClass("input_info_invalid");
    			        update_bounds(container, command);
				        break;
                    }
                }
            return this;
            }
        });
})(jQuery);

$(function() {
    var _validation_timeout = null;
    function clear_postponed() {
        if ( _validation_timeout != null ) { clearTimeout( _validation_timeout ); _validation_timeout = null; }
        }

    function postpone(validator, element) {
        _validation_timeout = setTimeout( function(){ validator.element(element) }, 3000 );
        }

    function ensure_validator(element) {
        return $.data(element.attr("form"), 'validator');
        }

    $(".validation_input_cell :input[type=text], .validation_input_cell :password")
        .focus( function(){ 
            $(this).input_info("activate").addClass("input_active"); 
            })
        .blur( function(){ 
            clear_postponed();
            $(this).input_info("deactivate").removeClass("input_active");
            })
        .keyup( function(){ 
            clear_postponed();
            var element = $(this);
            var validator = ensure_validator(element);
            var was_invalid = element.input_info("get").hasClass("input_info_invalid");
            if ( !was_invalid && ( element.data("initial_val") == element.val() ) ) return;
            
            var tmp = $.validator.methods.remote;
            $.validator.methods.remote = function() { return; }
            var check_result;
                if (!validator)
                    return;
            try{
                check_result = validator.check(element);
                }
            finally{
                $.validator.methods.remote = tmp;
                }
                if (check_result === undefined) return;
            
            if ( was_invalid ) validator.element(element );
            else postpone(validator, element);
            })
        .each( function(){
            $("label.input-validation-error", $(this).input_info("get") ).attr("generated", "true");
            $(this).data( "initial_val", $(this).val() );
            })
        .filter(function(){return ! $.browser.safari;}).filter(":first").focus()//prevent ie to restore focus on F5
        //.end().end()
});
