///////////////////////////////////////////////////////////////////////////////
$(document).ready(function() {
	
	$( '<img>' ).attr( 'src', '/data/gfx/indicator.gif' ); // Bild preloaden ...

	$x = $( 'input[name=form_register_alias]' ).focus( get_alias );
	//$( 'input[name=form_register_firstname], input[name=form_register_lastname], , input[name=form_register_name]' ).blur( get_alias );
	
	init_form();
	
	
});

var forms = new Array();

///////////////////////////////////////////////////////////////////////////////
function load_form( obj ) {

	var actions = $(obj).parents('div.actions');
	var form = actions.attr('rel');
	
	$( '.edit', actions ).hide();
	$( '.loading', actions ).show();
	
	$( '#' + form ).slideUp( 'medium', function() {

		forms[ form ] = $( '#' + form ).html();
		
		try {
			$.ajax({
				type: 'POST',
				url: '?load=' + form,
				data: 'form=' + form,
				dataType: 'html',
				timeout: 10000,
				success: function( txt ) {
					
					$( '#' + form ).html( txt ).slideDown();
				},
				complete: function() {
					$( '.loading', actions ).hide();
					$( '.cancel', actions ).show();
				},
				error: function() {
					throw 'jQuery ajax errorhandler was called';
				}
			});
		} catch ( e ) {
			ajax_error( e );
		}
	});
}

///////////////////////////////////////////////////////////////////////////////
function close_form( obj ) {

	var actions = $(obj).parents('div.actions');
	var form = actions.attr('rel');	
	
	$( '.loading', actions ).show();
	$( '.cancel', actions ).hide();
	
	$( '#'+ form ).slideUp( 'medium', function() {
	
		try {
			$.ajax({ // AJAX Request auslösen
				type: 'POST',
				url: window.location.href,
				data: 'force_reload=1&form=' + form,
				dataType: 'html',
				timeout: 10000,
				success: function( txt ) {
					$( '#'+ form ).html( txt );
				},
				complete: function() {
				
					$( '#'+ form ).slideDown();
					$( '.edit', actions ).show();
					$( '.loading', actions ).hide();
				},
				error: function() {
					throw 'jQuery ajax errorhandler was called';
				}
			});
		} catch ( e ) {
			ajax_error( e );
		}
	});
}

///////////////////////////////////////////////////////////////////////////////
function form_submit( form ) {
	
	var $form = $( form );
	
	// validierungen prüfen ...
	if ( $form.find( '.error' ).length ) {
		alert( 'Bitte prüfen Sie Ihre Eingaben' );
		return;
	}
	
	// submit button deaktivieren ...
	$form.find( '[@type=submit]' ).attr( 'disabled', 'disabled' );
	
	// inhalt abschicken und neuen inhalt laden
	var data = new Object();
	data.form = $form.attr('name');
	
	$form.find('input,select,textarea').each( function() {
		var $element = $( this );
		data[ $element.attr( 'name' ) ] = $element.val(); // TODO: was ist wenn zeichen & enthält?!
	} );
	
	
	$( '#' + $form.attr('name') ).slideUp( 'medium', function() {
	
		var $dst = $( 'div.actions[rel='+ $form.attr('name') +']' );
		if( $dst.length ) {
			$( '.cancel', $dst ).hide();
			$( '.loading', $dst ).show();
		}
		
		var action = $form.attr('action');
		if ( !action ) action = '';
		if ( action.indexOf( '?' ) < 0 ) {
			action += '?';
		} else {
			action += '&';
		}
		action += 'save=' + data.form;
		
		try {
			$.ajax({ // AJAX Request auslösen
				type: 'POST',
				url: action,
				data: data,
				dataType: 'html',
				timeout: 10000,
				success: function( txt ) {
					
					if ( txt == 'ERROR' ) {
						alert( 'Leider ist ein unvorhergesehener Fehler aufgetreten!' );
						return;
					}
					
					// if( $(txt).find('span.error').length )

					var actions = $('div.actions[rel='+ $form.attr('name') +']');
					
					if( $( 'span#error', $(txt) ).length == 0 ) {
					
						$( '.cancel', actions ).hide();
						$( '.edit', actions ).show();
					
					} else {
						
						$( '.cancel', actions ).show();
					}
					
					$( '.loading', actions ).hide();
				
					$( '#' + $form.attr('name') ).html( txt ).slideDown();
				},
				complete: function() {
					$('#wait').remove();
				},
				error: function() {
					throw 'jQuery ajax errorhandler was called';
				}
			});
		} catch ( e ) {
			ajax_error( e );
		}
	});
}

function save_callback( form ) {

	var dst = $( 'div.actions[rel='+ form +']' );
	if( dst.length ) {
	
		$( '.cancel', dst ).hide();
		$( '.edit', dst ).show();
	}
}

///////////////////////////////////////////////////////////////////////////////
function init_form() {

	$('table.form, table.forum_form').each( function() {
		var obj = $( this ).find( 'span#error' );
		var wert = obj.text();
		if ( wert && wert != 'OK' ) {
			$( this ).addClass( 'error' );
			obj.parent().find( 'span#description' ).hide();
		} else {
			obj.hide();
		}
	});	
	
	/*
	//Datepicker
	$( '.form .date' ).not( '.done' ).each( function( i ) {
	
		$( this ).addClass( 'done' );
		
		var d = $( '.month', this ).val() +'/'+ $( '.day', this ).val() +'/'+ $( '.year', this ).val();
		
		if( d == '//') d = '';
		
		var name = $( '.year', this ).attr( 'name' ).replace( /_year$/, '' );		
		
		$( '.year', this ).hide();
		$( '.month', this ).hide();
		$( '.day', this ).hide();
	
		$( this ).append( '<input name="'+ name +'" class="js_datepicker" value="'+ d +'">' ); // readonly
		
		$( '.js_datepicker', this ).datepicker();

		//$( '.js_datepicker', this ).datepicker({ dateFormat: 'mm/dd/yy' }); // , defaultDate: new Date( d ) 
		
	} );
	*/

	//Datepicker
	$( '.form .datetime', this ).not( '.done' ).each( function( i ) {
	
		$( this ).addClass( 'done' );
		
		var d = $( '.year', this ).val() +'-'+ $( '.month', this ).val() +'-'+ $( '.day', this ).val();
		
		if( d == '--') d = '';
		
		var name = $( '.year', this ).attr( 'name' ).replace( /_year$/, '' );		
		
		$( '.year', this ).hide();
		$( '.month', this ).hide();
		$( '.day', this ).hide();
	
		$( this ).prepend( '<input name="'+ name +'" class="js_datepicker_with_time" value="'+ d +'" readonly>' );
				
		$( '.js_datepicker_with_time', this ).attachDatepicker({ dateFormat: 'yy-mm-dd' }); // , defaultDate: new Date( d ) 
		
	} );
}

///////////////////////////////////////////////////////////////////////////////
function get_alias() {
		
	$('#wait').remove();
	
	switch ( $( 'input[name=form_register_account_type]' ).val() ) {
		case 'member':
			var alias = $( 'input[name=form_register_firstname]' ).val() + $( 'input[name=form_register_lastname]' ).val();
			break;
		case 'index':
		case 'fair':
		case 'conference':
			var alias = $( 'input[name=form_register_name]' ).val();
			break;
		default:
			var alias = 'user';
			return;
	}
	
	$( this ).after( '<div id="wait" style="display: inline; margin: 7px 0 0 -20px; position: absolute; z-index: 2;"><img src="/data/gfx/indicator.gif" alt="..."></div>' );
	try {
		$.ajax({ // AJAX Request auslösen
			type: 'POST',
			url: '/register/alias/',
			data: 'name=' + alias,
			dataType: 'html',
			timeout: 10000,
			success: function( txt ) {
				$( 'input[name=form_register_alias]' ).val( txt );
			},
			complete: function() {
				$('#wait').remove();
			},
			error: function() {
				throw 'jQuery ajax errorhandler was called';
			}
		});
	} catch( e ) {
		ajax_error( e );
	}
}
		
///////////////////////////////////////////////////////////////////////////////
function show_curlen( obj, limit ) {

	if( !obj.name ) obj.name = obj.id;

	var span						= $( 'span#description', $( '#' + obj.name ) );
	var content_length	= obj.value.length;


	span.text( content_length.toString() + ' of ' + limit.toString() );
}

///////////////////////////////////////////////////////////////////////////////
function select_submit( obj ) {
	obj.form.submit();
}

///////////////////////////////////////////////////////////////////////////////
function validate_clear( obj ) {

	if( !obj.name ) obj.name = obj.id;

	$( 'span#description', $( '#'+ obj.name ) ).show();
	$( 'span#error', $( '#'+ obj.name ) ).hide();

	// hack used for trainchamp
	if( $( '#'+ obj.name ).attr("errgoup") == 'true' ) $( '#'+ obj.name ).parents('table.form').removeClass( 'error' );
	else $( '#'+ obj.name ).removeClass( 'error' );
}


///////////////////////////////////////////////////////////////////////////////
function validate_cleararray( obj ) {

	if( !obj.name ) obj.name = obj.id;

	var name = obj.name.replace( /\[\]/, '' ); // al: remove brackets of array-fields
	
	$( 'span#description', $( '#'+ name ) ).show();
	$( 'span#error', $( '#'+ name ) ).hide();

	// hack used for trainchamp
	if( $( '#'+ name ).attr("errgoup") == 'true' ) $( '#'+ name ).parents('table.form').removeClass( 'error' );
	else $( '#'+ name ).removeClass( 'error' );
}

///////////////////////////////////////////////////////////////////////////////
function validate_date( obj ) {

	var dest;
	var a = 0;
	var b = 0;
	if( obj.name.match( /^(.+)(day|month|year)$/ ) ) {
		dest = RegExp.$1;

		if( RegExp.$2 == 'day' ) {

			a = document.getElementById( dest+'month' ).value;
			b = document.getElementById( dest+'year' ).value;
		} else if( RegExp.$2 == 'month' ) {

			a = document.getElementById( dest+'day' ).value;
			b = document.getElementById( dest+'year' ).value;
		} else if( RegExp.$2 == 'year' ) {

			a = document.getElementById( dest+'month' ).value;
			b = document.getElementById( dest+'day' ).value;
		}
	}

	if( a != 0 && b != 0 ) {

		$( '#'+ dest ).removeClass( 'error' );
		$( 'span#description', $( '#'+ dest ) ).show();
		$( 'span#error', $( '#'+ dest ) ).hide();
	}
}

///////////////////////////////////////////////////////////////////////////////
function validate_geo( obj, dest ) {

	var a = "";
	var b = "";
	var c = "";
	if( obj.name.match( /(city|country_id|postal_id)$/ ) ) {

			a = document.getElementById( 'city' ).value;
			b = document.getElementById( 'country' ).value;
			c = document.getElementById( 'postal' ).value;
	}

	if( a != "" && b != "" && c != "" ) {

		$( '#'+ dest ).removeClass( 'error' );
		$( 'span#description', $( '#'+ dest ) ).show();
		$( 'span#error', $( '#'+ dest ) ).hide();
	}
}

///////////////////////////////////////////////////////////////////////////////
function validate_input( obj, validate_context ) {

	$( obj ).after( '<div id="wait" style="display: inline; margin: 7px 0 0 -20px; position: absolute; z-index: 2;"><img src="/data/gfx/indicator.gif" alt="..."></div>' );

	var data = 'form='+ $(obj).parents('form').attr('name') +'&name='+ obj.name +'&'+ obj.name +'='+ obj.value;
	
	// if context validation is given
	if( $(obj).attr('rel') ) {
		
		var context_name = $(obj).attr('rel');
		var context_elem = $('#'+ context_name + ' *[name='+ context_name +']' );
		
		if (context_elem.length) {
	
			if (typeof validate_context == 'undefined' && context_elem.val() && $(obj).val()) {
				
				data += '&context_field=' + context_name + '&context_val='+ context_elem.val();
	  		//context_elem.focus().blur();
	  	}
		}
	}
	
	validate_request( obj, data );
}

Array.prototype.in_array = function (value)
// Returns true if the passed value is found in the
// array.  Returns false if it is not.
{
    var i;
    for (i=0; i < this.length; i++) {
        // Matches identical (===), not just similar (==).
        if (this[i] === value) {
            return true;
        }
    }
    return false;
};

/*
///////////////////////////////////////////////////////////////////////////////
function validate_inputarray( obj ) {

	$( obj ).after( '<div id="wait" style="display: inline; margin: 7px 0 0 -20px; position: absolute; z-index: 2;"><img src="/data/gfx/indicator.gif" alt="..."></div>' );

	var name = obj.name.replace( /\[\]/, '' ); // al: remove brackets of array-fields
	var values = new Array();
	
	$( 'input[name^='+ name +']' ).each( function() {
	
		if( values.in_array( $(this).val() ) ) {
		
			$( '#'+ name ).addClass( 'error' );
			$( 'span#description', $( '#'+ name ) ).hide();
			$( 'span#error', $( '#'+ name ) ).html( 'Schlüsseloptionen müssen pro Komponente einzigartig sein!' ).show();
			$('#wait').remove();
			return;
		}
		values.push( $(this).val() );
	});
	$('#wait').remove();
}
*/

///////////////////////////////////////////////////////////////////////////////
function validate_inputarray( obj ) {

	$( obj ).after( '<div id="wait" style="display: inline; margin: 7px 0 0 -20px; position: absolute; z-index: 2;"><img src="/data/gfx/indicator.gif" alt="..."></div>' );

	var name = obj.name.replace( /\[\]/, '' ); // al: remove brackets of array-fields
	var prt = $(obj).parents('table.form');
	var data = '&name='+ name;
	var n = 0;
	$( 'input.key', prt ).each( function() {
		data += '&'+ name +'[]='+ $(this).val();
	});
	validatearray_request( obj, data );
}

///////////////////////////////////////////////////////////////////////////////
function validate_newpass( obj ) {

	err = false;

	if( obj.id.match(/^(.+)_validation$/) ) {

		id = RegExp.$1;
		other = document.getElementById( id + '_original' ).value;
		if( other != obj.value ) err = true;

	} else if( obj.id.match(/^(.+)_original$/) ) {

		id = RegExp.$1;
		other = document.getElementById( id + '_validation' ).value;
		if( other != obj.value && other != '' ) err = true;
	}

	if( err ) {

		$( 'table#'+ id ).addClass( 'error' );
		$( 'span#description', $( '#'+ id ) ).hide();
		$( 'span#error', $( 'table#'+ id ) ).html( 'The passwords do not match!' ).show();
	}
}

///////////////////////////////////////////////////////////////////////////////
function validate_checkbox( obj ) {

	if ( !obj.checked ) {

		$( obj ).after( '<div id="wait" style="display: inline; margin: 7px 0 0 5px; position: absolute; z-index: 2;"><img src="/data/gfx/indicator.gif" alt="..."></div>' );

		var val = obj.value;
		if ( obj.checked != true ) val = '';

		var data = 'name='+ obj.name +'&'+ obj.name +'='+ val;

		validate_request( obj, data );
	}
}

///////////////////////////////////////////////////////////////////////////////
function validate_request( obj, data ) {

	var url = '';
	
	if( $(obj).parents('form').attr('action') ) {
		url = $(obj).parents('form').attr('action');
	} else if ( typeof document.location.search != 'undefined' ) {
		url = document.location.search;
	}
	
	if ( url.match( /\?[\d\w]+=*/ ) ) {
		url += '&get=validation';
	} else {
		url += '?get=validation';
	}
	try {
		$.ajax({ // AJAX Request auslösen
			type: 'POST',
			url: url,
			data: data,
			dataType: 'html',
			timeout: 10000,
			success: function( txt ) {
				
				if ( txt != '<!-- OK -->' ) {
					
					$( '#'+ obj.name ).addClass( 'error' );
					$( 'span#description', $( '#'+ obj.name ) ).hide();
					$( 'span#error', $( '#'+ obj.name ) ).html( txt ).show();
				}
			},
			complete: function() {
				$('#wait').remove();
			},
			error: function() {
				throw 'jQuery ajax errorhandler was called';
			}
		});
	} catch ( e ) {
		ajax_error( e );
	}
}

///////////////////////////////////////////////////////////////////////////////
function validatearray_request( obj, data ) {

	var url = '';
	if ( typeof document.location.search != 'undefined' ) {
		url = document.location.search;
	}
	if ( url.length ) {
		url += '&get=validation';
	} else {
		url += '?get=validation';
	}

	try {
		$.ajax({ // AJAX Request auslösen
			type: 'POST',
			url: url,
			data: data,
			dataType: 'html',
			timeout: 10000,
			success: function( txt ) {
				
				if ( txt != '<!-- OK -->' ) {
				
					var name = obj.name.replace( /\[\]/, '' ); // al: remove brackets of array-fields
					$( '#'+ name ).addClass( 'error' );
					$( 'span#description', $( '#'+ name ) ).hide();
					$( 'span#error', $( '#'+ name ) ).html( txt ).show();
					$('#wait').remove();
				}
			},
			complete: function() {
				$('#wait').remove();
			},
			error: function() {				
				throw 'jQuery ajax errorhandler was called';
			}
		});
	} catch ( e ) {
		ajax_error( e );
	}
}

///////////////////////////////////////////////////////////////////////////////
function load_select_options( select_id, type, id, input_id, has_amount ) {

	var rand_num = rand(999);
	
	return; // rekursion!!

	try {
		$.ajax({
			type: 'GET',
			url: '?op=ajax',
			data: {
			template:	'plain',
			type:	type,
			id:	id,
			has_amount: has_amount,
			rand: rand_num
			},
			success: function( data ){

			 $( 'select#'+ select_id ).html( data );
			 serialize( select_id, input_id );

			 $( 'select[@multiple] option:selected' ).removeAttr( 'selected' );
			},
			error: function() {
				throw 'jQuery ajax errorhandler was called';
			}
		});
	} catch ( e ) {
		ajax_error( e );
	}
}

///////////////////////////////////////////////////////////////////////////////
rnd.today=new Date();
rnd.seed=rnd.today.getTime();

function rnd() {
        rnd.seed = (rnd.seed*9301+49297) % 233280;
        return rnd.seed/(233280.0);
};

function rand(number) {
        return Math.ceil(rnd()*number);
};
