// known validation methods
var formValidationMethods = [];

// required field
formValidationMethods["required"] = function( element ) {
	return $.trim( element.val() ).length;
}

// required textfield
formValidationMethods["required-text"] = function( element ) {
	return $.trim( element.val() ).length > 14;
}

// required email address
formValidationMethods["required-email"] = function( element ) {
	return /^[\w\.-]+@\w+[\w\.-]*?\.\w{2,6}$/.test( element.val() );
}

// start JS-stuff here
$( document ).ready( function() {
	// auto fill forms
	autoFormFiller();

	// load auto form validator
	autoFormValidator();

	// initialize check_all box
	$( "#check_all" ).click( function() {
		$( "input:checkbox.check_all", this.form ).attr( "checked", $( this ).attr( "checked" ) );
	} );

	// initialize datepickers
	$( "input.datepicker" ).datepicker( {
		dateFormat: "dd.mm.yy"
	} );

	// override highslide settings
	if (typeof hs != "undefined") {
		hs.graphicsDir = 'img/highslide/';
		hs.showCredits = false;
		hs.wrapperClassName = 'wide-border';

		// initialize highslide
		$( "img[src*=/thumb_]" ).each( function() {
			$( this ).wrap( "<a href=\"" + $( this ).attr( "src" ).replace( /\/thumb_/, "/" ) + "\" onclick=\"return hs.expand( this );\"></a>" );
		} );
	}
} );

// automatically fills document forms
function autoFormFiller() {
	// auto fill forms
	if (typeof formsData != "undefined" && formsData.length) {
		// process every form
		for (var i in formsData) {
			// and specified element
			for (var field in formsData[i].data) {
				// get it
				var elements = $( "#" + formsData[i].id ).find( "[name=" + field + "], [name='" + field + "[]']" );

				// check elements existence
				if (!elements.length) {
					continue;
				}

				// switch it's type
				switch (elements.get( 0 ).type) {
					// checkbox
					case "checkbox":
					// radio
					case "radio":
						// find needed by value
						elements.each( function() {
							if ($( this ).val() == formsData[i].data[field] || $.inArray( $( this ).val(), formsData[i].data[field] ) != -1) {
								// then check it
								$( this ).attr( "checked", "checked" );
							}
						} );
						break;

					// others
					default:
						// many elements
						if (elements.length > 1) {
							elements.each( function( index, element ) {
								// set value
								$( element ).val( formsData[i].data[field][index] );
							} );
						// or one element
						} else {
							// set value
							elements.val( formsData[i].data[field] );
						}
						break;
				}
			}
		}
	}
}

// loads auto form validator
function autoFormValidator() {
	// process every form
	$( "form" ).submit( function() {
		var errors = 0;

		// find required fields
		$.each( this.elements, function() {
			var isOk = true, element = $( this );

			// apply all required validation methods
			$.each( element.attr( "class" ).split( " " ), function() {
				if ($.isFunction( formValidationMethods[this] )) {
					// get result
					isOk = formValidationMethods[this]( element );

					// is invalid?
					if (!isOk) {
						errors++;
						return;
					}
				}
			} );

			// handle field state
			formFieldValidationStateHandler( element, isOk );
		} );

		return errors == 0;
	} );
}

// handles form fields state
function formFieldValidationStateHandler( element, isOk ) {
	// filed if ok?
	if (isOk) {
		// remove invalid CSS class
		element.removeClass( "invalid" );
	// of no
	} else {
		// add invalid CSS class
		element.addClass( "invalid" );
	}
}
