/*
 * jQuery validation plug-in 1.5.2
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2006 - 2008 Jörn Zaefferer
 *
 * $Id: jquery.validate.js 6243 2009-02-19 11:40:49Z joern.zaefferer $
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */

(function($) {

$.extend($.fn, {
	// http://docs.jquery.com/Plugins/Validation/validate
	validate: function( options ) {
		
		// if nothing is selected, return nothing; can't chain anyway
		if (!this.length) {
			options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
			return;
		}
		
		// check if a validator for this form was already created
		var validator = $.data(this[0], 'validator');
		if ( validator ) {
			return validator;
		}
		
		validator = new $.validator( options, this[0] );
		$.data(this[0], 'validator', validator); 
		
		if ( validator.settings.onsubmit ) {
		
			// allow suppresing validation by adding a cancel class to the submit button
			this.find("input, button").filter(".cancel").click(function() {
				validator.cancelSubmit = true;
			});
		
			// validate the form on submit
			this.submit( function( event ) {
				if ( validator.settings.debug )
					// prevent form submit to be able to see console output
					event.preventDefault();
					
				function handle() {
					if ( validator.settings.submitHandler ) {
						validator.settings.submitHandler.call( validator, validator.currentForm );
						return false;
					}
					return true;
				}
					
				// prevent submit for invalid forms or custom submit handlers
				if ( validator.cancelSubmit ) {
					validator.cancelSubmit = false;
					return handle();
				}
				if ( validator.form() ) {
					if ( validator.pendingRequest ) {
						validator.formSubmitted = true;
						return false;
					}
					return handle();
				} else {
					validator.focusInvalid();
					return false;
				}
			});
		}
		
		return validator;
	},
	// http://docs.jquery.com/Plugins/Validation/valid
	valid: function() {
        if ( $(this[0]).is('form')) {
            return this.validate().form();
        } else {
            var valid = false;
            var validator = $(this[0].form).validate();
            this.each(function() {
				valid |= validator.element(this);
            });
            return valid;
        }
    },
	// attributes: space seperated list of attributes to retrieve and remove
	removeAttrs: function(attributes) {
		var result = {},
			$element = this;
		$.each(attributes.split(/\s/), function(index, value) {
			result[value] = $element.attr(value);
			$element.removeAttr(value);
		});
		return result;
	},
	// http://docs.jquery.com/Plugins/Validation/rules
	rules: function(command, argument) {
		var element = this[0];
		
		if (command) {
			var settings = $.data(element.form, 'validator').settings;
			var staticRules = settings.rules;
			var existingRules = $.validator.staticRules(element);
			switch(command) {
			case "add":
				$.extend(existingRules, $.validator.normalizeRule(argument));
				staticRules[element.name] = existingRules;
				if (argument.messages)
					settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
				break;
			case "remove":
				if (!argument) {
					delete staticRules[element.name];
					return existingRules;
				}
				var filtered = {};
				$.each(argument.split(/\s/), function(index, method) {
					filtered[method] = existingRules[method];
					delete existingRules[method];
				});
				return filtered;
			}
		}
		
		var data = $.validator.normalizeRules(
		$.extend(
			{},
			$.validator.metadataRules(element),
			$.validator.classRules(element),
			$.validator.attributeRules(element),
			$.validator.staticRules(element)
		), element);
		
		// make sure required is at front
		if (data.required) {
			var param = data.required;
			delete data.required;
			data = $.extend({required: param}, data);
		}
		
		return data;
	}
});

// Custom selectors
$.extend($.expr[":"], {
	// http://docs.jquery.com/Plugins/Validation/blank
	blank: function(a) {return !$.trim(a.value);},
	// http://docs.jquery.com/Plugins/Validation/filled
	filled: function(a) {return !!$.trim(a.value);},
	// http://docs.jquery.com/Plugins/Validation/unchecked
	unchecked: function(a) {return !a.checked;}
});


$.format = function(source, params) {
	if ( arguments.length == 1 ) 
		return function() {
			var args = $.makeArray(arguments);
			args.unshift(source);
			return $.format.apply( this, args );
		};
	if ( arguments.length > 2 && params.constructor != Array  ) {
		params = $.makeArray(arguments).slice(1);
	}
	if ( params.constructor != Array ) {
		params = [ params ];
	}
	$.each(params, function(i, n) {
		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
	});
	return source;
};

// constructor for validator
$.validator = function( options, form ) {
	this.settings = $.extend( {}, $.validator.defaults, options );
	this.currentForm = form;
	this.init();
};

$.extend($.validator, {

	defaults: {
		messages: {},
		groups: {},
		rules: {},
		errorClass: "error",
		errorElement: "label",
		focusInvalid: true,
		errorContainer: $( [] ),
		errorLabelContainer: $( [] ),
		onsubmit: true,
		ignore: [],
		ignoreTitle: false,
		onfocusin: function(element) {
			this.lastActive = element;
				
			// hide error label and remove error class on focus if enabled
			if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
				this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass );
				this.errorsFor(element).hide();
			}
		},
		onfocusout: function(element) {
			if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
				this.element(element);
			}
		},
		onkeyup: function(element) {
			if ( element.name in this.submitted || element == this.lastElement ) {
				this.element(element);
			}
		},
		onclick: function(element) {
			if ( element.name in this.submitted )
				this.element(element);
		},
		highlight: function( element, errorClass ) {
			$( element ).addClass( errorClass );
		},
		unhighlight: function( element, errorClass ) {
			$( element ).removeClass( errorClass );
		}
	},

	// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
	setDefaults: function(settings) {
		$.extend( $.validator.defaults, settings );
	},

	messages: {
		required: "This field is required.",
		remote: "Please fix this field.",
		email: "Please enter a valid email address.",
		url: "Please enter a valid URL.",
		date: "Please enter a valid date.",
		dateISO: "Please enter a valid date (ISO).",
		dateDE: "Bitte geben Sie ein gültiges Datum ein.",
		number: "Please enter a valid number.",
		numberDE: "Bitte geben Sie eine Nummer ein.",
		digits: "Please enter only digits",
		creditcard: "Please enter a valid credit card number.",
		equalTo: "Please enter the same value again.",
		accept: "Please enter a value with a valid extension.",
		maxlength: $.format("Please enter no more than {0} characters."),
		minlength: $.format("Please enter at least {0} characters."),
		rangelength: $.format("Please enter a value between {0} and {1} characters long."),
		range: $.format("Please enter a value between {0} and {1}."),
		max: $.format("Please enter a value less than or equal to {0}."),
		min: $.format("Please enter a value greater than or equal to {0}.")
	},
	
	autoCreateRanges: false,
	
	prototype: {
		
		init: function() {
			this.labelContainer = $(this.settings.errorLabelContainer);
			this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
			this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
			this.submitted = {};
			this.valueCache = {};
			this.pendingRequest = 0;
			this.pending = {};
			this.invalid = {};
			this.reset();
			
			var groups = (this.groups = {});
			$.each(this.settings.groups, function(key, value) {
				$.each(value.split(/\s/), function(index, name) {
					groups[name] = key;
				});
			});
			var rules = this.settings.rules;
			$.each(rules, function(key, value) {
				rules[key] = $.validator.normalizeRule(value);
			});
			
			function delegate(event) {
				var validator = $.data(this[0].form, "validator");
				validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );
			}
			$(this.currentForm)
				.delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
				.delegate("click", ":radio, :checkbox", delegate);

			if (this.settings.invalidHandler)
				$(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/form
		form: function() {
			this.checkForm();
			$.extend(this.submitted, this.errorMap);
			this.invalid = $.extend({}, this.errorMap);
			if (!this.valid())
				$(this.currentForm).triggerHandler("invalid-form", [this]);
			this.showErrors();
			return this.valid();
		},
		
		checkForm: function() {
			this.prepareForm();
			for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
				this.check( elements[i] );
			}
			return this.valid(); 
		},
		
		// http://docs.jquery.com/Plugins/Validation/Validator/element
		element: function( element ) {
			element = this.clean( element );
			this.lastElement = element;
			this.prepareElement( element );
			this.currentElements = $(element);
			var result = this.check( element );
			if ( result ) {
				delete this.invalid[element.name];
			} else {
				this.invalid[element.name] = true;
			}
			if ( !this.numberOfInvalids() ) {
				// Hide error containers on last error
				this.toHide = this.toHide.add( this.containers );
			}
			this.showErrors();
			return result;
		},

		// http://docs.jquery.com/Plugins/Validation/Validator/showErrors
		showErrors: function(errors) {
			if(errors) {
				// add items to error list and map
				$.extend( this.errorMap, errors );
				this.errorList = [];
				for ( var name in errors ) {
					this.errorList.push({
						message: errors[name],
						element: this.findByName(name)[0]
					});
				}
				// remove items from success list
				this.successList = $.grep( this.successList, function(element) {
					return !(element.name in errors);
				});
			}
			this.settings.showErrors
				? this.settings.showErrors.call( this, this.errorMap, this.errorList )
				: this.defaultShowErrors();
		},
		
		// http://docs.jquery.com/Plugins/Validation/Validator/resetForm
		resetForm: function() {
			if ( $.fn.resetForm )
				$( this.currentForm ).resetForm();
			this.submitted = {};
			this.prepareForm();
			this.hideErrors();
			this.elements().removeClass( this.settings.errorClass );
		},
		
		numberOfInvalids: function() {
			return this.objectLength(this.invalid);
		},
		
		objectLength: function( obj ) {
			var count = 0;
			for ( var i in obj )
				count++;
			return count;
		},
		
		hideErrors: function() {
			this.addWrapper( this.toHide ).hide();
		},
		
		valid: function() {
			return this.size() == 0;
		},
		
		size: function() {
			return this.errorList.length;
		},
		
		focusInvalid: function() {
			if( this.settings.focusInvalid ) {
				try {
					$(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus();
				} catch(e) {
					// ignore IE throwing errors when focusing hidden elements
				}
			}
		},
		
		findLastActive: function() {
			var lastActive = this.lastActive;
			return lastActive && $.grep(this.errorList, function(n) {
				return n.element.name == lastActive.name;
			}).length == 1 && lastActive;
		},
		
		elements: function() {
			var validator = this,
				rulesCache = {};
			
			// select all valid inputs inside the form (no submit or reset buttons)
			// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
			return $([]).add(this.currentForm.elements)
			.filter(":input")
			.not(":submit, :reset, :image, [disabled]")
			.not( this.settings.ignore )
			.filter(function() {
				!this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
			
				// select only the first element for each name, and only those with rules specified
				if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
					return false;
				
				rulesCache[this.name] = true;
				return true;
			});
		},
		
		clean: function( selector ) {
			return $( selector )[0];
		},
		
		errors: function() {
			return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
		},
		
		reset: function() {
			this.successList = [];
			this.errorList = [];
			this.errorMap = {};
			this.toShow = $([]);
			this.toHide = $([]);
			this.formSubmitted = false;
			this.currentElements = $([]);
		},
		
		prepareForm: function() {
			this.reset();
			this.toHide = this.errors().add( this.containers );
		},
		
		prepareElement: function( element ) {
			this.reset();
			this.toHide = this.errorsFor(element);
		},
	
		check: function( element ) {
			element = this.clean( element );
			
			// if radio/checkbox, validate first element in group instead
			if (this.checkable(element)) {
				element = this.findByName( element.name )[0];
			}
			
			var rules = $(element).rules();
			var dependencyMismatch = false;
			for( method in rules ) {
				var rule = { method: method, parameters: rules[method] };
				try {
					var result = $.validator.methods[method].call( this, element.value.replace(/\r/g, ""), element, rule.parameters );
					
					// if a method indicates that the field is optional and therefore valid,
					// don't mark it as valid when there are no other rules
					if ( result == "dependency-mismatch" ) {
						dependencyMismatch = true;
						continue;
					}
					dependencyMismatch = false;
					
					if ( result == "pending" ) {
						this.toHide = this.toHide.not( this.errorsFor(element) );
						return;
					}
					
					if( !result ) {
						this.formatAndAdd( element, rule );
						return false;
					}
				} catch(e) {
					this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
						 + ", check the '" + rule.method + "' method");
					throw e;
				}
			}
			if (dependencyMismatch)
				return;
			if ( this.objectLength(rules) )
				this.successList.push(element);
			return true;
		},
		
		// return the custom message for the given element and validation method
		// specified in the element's "messages" metadata
		customMetaMessage: function(element, method) {
			if (!$.metadata)
				return;
			
			var meta = this.settings.meta
				? $(element).metadata()[this.settings.meta]
				: $(element).metadata();
			
			return meta && meta.messages && meta.messages[method];
		},
		
		// return the custom message for the given element name and validation method
		customMessage: function( name, method ) {
			var m = this.settings.messages[name];
			return m && (m.constructor == String
				? m
				: m[method]);
		},
		
		// return the first defined argument, allowing empty strings
		findDefined: function() {
			for(var i = 0; i < arguments.length; i++) {
				if (arguments[i] !== undefined)
					return arguments[i];
			}
			return undefined;
		},
		
		defaultMessage: function( element, method) {
			return this.findDefined(
				this.customMessage( element.name, method ),
				this.customMetaMessage( element, method ),
				// title is never undefined, so handle empty string as undefined
				!this.settings.ignoreTitle && element.title || undefined,
				$.validator.messages[method],
				"<strong>Warning: No message defined for " + element.name + "</strong>"
			);
		},
		
		formatAndAdd: function( element, rule ) {
			var message = this.defaultMessage( element, rule.method );
			if ( typeof message == "function" ) 
				message = message.call(this, rule.parameters, element);
			this.errorList.push({
				message: message,
				element: element
			});
			this.errorMap[element.name] = message;
			this.submitted[element.name] = message;
		},
		
		addWrapper: function(toToggle) {
			if ( this.settings.wrapper )
				toToggle = toToggle.add( toToggle.parents( this.settings.wrapper ) );
			return toToggle;
		},
		
		defaultShowErrors: function() {
			for ( var i = 0; this.errorList[i]; i++ ) {
				var error = this.errorList[i];
				this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass );
				this.showLabel( error.element, error.message );
			}
			if( this.errorList.length ) {
				this.toShow = this.toShow.add( this.containers );
			}
			if (this.settings.success) {
				for ( var i = 0; this.successList[i]; i++ ) {
					this.showLabel( this.successList[i] );
				}
			}
			if (this.settings.unhighlight) {
				for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
					this.settings.unhighlight.call( this, elements[i], this.settings.errorClass );
				}
			}
			this.toHide = this.toHide.not( this.toShow );
			this.hideErrors();
			this.addWrapper( this.toShow ).show();
		},
		
		validElements: function() {
			return this.currentElements.not(this.invalidElements());
		},
		
		invalidElements: function() {
			return $(this.errorList).map(function() {
				return this.element;
			});
		},
		
		showLabel: function(element, message) {
			var label = this.errorsFor( element );
			if ( label.length ) {
				// refresh error/success class
				label.removeClass().addClass( this.settings.errorClass );
			
				// check if we have a generated label, replace the message then
				label.attr("generated") && label.html(message);
			} else {
				// create label
				label = $("<" + this.settings.errorElement + "/>")
					.attr({"for":  this.idOrName(element), generated: true})
					.addClass(this.settings.errorClass)
					.html(message || "");
				if ( this.settings.wrapper ) {
					// make sure the element is visible, even in IE
					// actually showing the wrapped element is handled elsewhere
					label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
				}
				if ( !this.labelContainer.append(label).length )
					this.settings.errorPlacement
						? this.settings.errorPlacement(label, $(element) )
						: label.insertAfter(element);
			}
			if ( !message && this.settings.success ) {
				label.text("");
				typeof this.settings.success == "string"
					? label.addClass( this.settings.success )
					: this.settings.success( label );
			}
			this.toShow = this.toShow.add(label);
		},
		
		errorsFor: function(element) {
			return this.errors().filter("[for='" + this.idOrName(element) + "']");
		},
		
		idOrName: function(element) {
			return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
		},

		checkable: function( element ) {
			return /radio|checkbox/i.test(element.type);
		},
		
		findByName: function( name ) {
			// select by name and filter by form for performance over form.find("[name=...]")
			var form = this.currentForm;
			return $(document.getElementsByName(name)).map(function(index, element) {
				return element.form == form && element.name == name && element  || null;
			});
		},
		
		getLength: function(value, element) {
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				return $("option:selected", element).length;
			case 'input':
				if( this.checkable( element) )
					return this.findByName(element.name).filter(':checked').length;
			}
			return value.length;
		},
	
		depend: function(param, element) {
			return this.dependTypes[typeof param]
				? this.dependTypes[typeof param](param, element)
				: true;
		},
	
		dependTypes: {
			"boolean": function(param, element) {
				return param;
			},
			"string": function(param, element) {
				return !!$(param, element.form).length;
			},
			"function": function(param, element) {
				return param(element);
			}
		},
		
		optional: function(element) {
			return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
		},
		
		startRequest: function(element) {
			if (!this.pending[element.name]) {
				this.pendingRequest++;
				this.pending[element.name] = true;
			}
		},
		
		stopRequest: function(element, valid) {
			this.pendingRequest--;
			// sometimes synchronization fails, make sure pendingRequest is never < 0
			if (this.pendingRequest < 0)
				this.pendingRequest = 0;
			delete this.pending[element.name];
			if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
				$(this.currentForm).submit();
			} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
				$(this.currentForm).triggerHandler("invalid-form", [this]);
			}
		},
		
		previousValue: function(element) {
			return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {
				old: null,
				valid: true,
				message: this.defaultMessage( element, "remote" )
			});
		}
		
	},
	
	classRuleSettings: {
		required: {required: true},
		email: {email: true},
		url: {url: true},
		date: {date: true},
		dateISO: {dateISO: true},
		dateDE: {dateDE: true},
		number: {number: true},
		numberDE: {numberDE: true},
		digits: {digits: true},
		creditcard: {creditcard: true}
	},
	
	addClassRules: function(className, rules) {
		className.constructor == String ?
			this.classRuleSettings[className] = rules :
			$.extend(this.classRuleSettings, className);
	},
	
	classRules: function(element) {
		var rules = {};
		var classes = $(element).attr('class');
		classes && $.each(classes.split(' '), function() {
			if (this in $.validator.classRuleSettings) {
				$.extend(rules, $.validator.classRuleSettings[this]);
			}
		});
		return rules;
	},
	
	attributeRules: function(element) {
		var rules = {};
		var $element = $(element);
		
		for (method in $.validator.methods) {
			var value = $element.attr(method);
			if (value) {
				rules[method] = value;
			}
		}
		
		// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
		if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
			delete rules.maxlength;
		}
		
		return rules;
	},
	
	metadataRules: function(element) {
		if (!$.metadata) return {};
		
		var meta = $.data(element.form, 'validator').settings.meta;
		return meta ?
			$(element).metadata()[meta] :
			$(element).metadata();
	},
	
	staticRules: function(element) {
		var rules = {};
		var validator = $.data(element.form, 'validator');
		if (validator.settings.rules) {
			rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
		}
		return rules;
	},
	
	normalizeRules: function(rules, element) {
		// handle dependency check
		$.each(rules, function(prop, val) {
			// ignore rule when param is explicitly false, eg. required:false
			if (val === false) {
				delete rules[prop];
				return;
			}
			if (val.param || val.depends) {
				var keepRule = true;
				switch (typeof val.depends) {
					case "string":
						keepRule = !!$(val.depends, element.form).length;
						break;
					case "function":
						keepRule = val.depends.call(element, element);
						break;
				}
				if (keepRule) {
					rules[prop] = val.param !== undefined ? val.param : true;
				} else {
					delete rules[prop];
				}
			}
		});
		
		// evaluate parameters
		$.each(rules, function(rule, parameter) {
			rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
		});
		
		// clean number parameters
		$.each(['minlength', 'maxlength', 'min', 'max'], function() {
			if (rules[this]) {
				rules[this] = Number(rules[this]);
			}
		});
		$.each(['rangelength', 'range'], function() {
			if (rules[this]) {
				rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
			}
		});
		
		if ($.validator.autoCreateRanges) {
			// auto-create ranges
			if (rules.min && rules.max) {
				rules.range = [rules.min, rules.max];
				delete rules.min;
				delete rules.max;
			}
			if (rules.minlength && rules.maxlength) {
				rules.rangelength = [rules.minlength, rules.maxlength];
				delete rules.minlength;
				delete rules.maxlength;
			}
		}
		
		// To support custom messages in metadata ignore rule methods titled "messages"
		if (rules.messages) {
			delete rules.messages
		}
		
		return rules;
	},
	
	// Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
	normalizeRule: function(data) {
		if( typeof data == "string" ) {
			var transformed = {};
			$.each(data.split(/\s/), function() {
				transformed[this] = true;
			});
			data = transformed;
		}
		return data;
	},
	
	// http://docs.jquery.com/Plugins/Validation/Validator/addMethod
	addMethod: function(name, method, message) {
		$.validator.methods[name] = method;
		$.validator.messages[name] = message;
		if (method.length < 3) {
			$.validator.addClassRules(name, $.validator.normalizeRule(name));
		}
	},

	methods: {

		// http://docs.jquery.com/Plugins/Validation/Methods/required
		required: function(value, element, param) {
			// check if dependency is met
			if ( !this.depend(param, element) )
				return "dependency-mismatch";
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				var options = $("option:selected", element);
				return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
			case 'input':
				if ( this.checkable(element) )
					return this.getLength(value, element) > 0;
			default:
				return $.trim(value).length > 0;
			}
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/remote
		remote: function(value, element, param) {
			if ( this.optional(element) )
				return "dependency-mismatch";
			
			var previous = this.previousValue(element);
			
			if (!this.settings.messages[element.name] )
				this.settings.messages[element.name] = {};
			this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
			
			param = typeof param == "string" && {url:param} || param; 
			
			if ( previous.old !== value ) {
				previous.old = value;
				var validator = this;
				this.startRequest(element);
				var data = {};
				data[element.name] = value;
				$.ajax($.extend(true, {
					url: param,
					mode: "abort",
					port: "validate" + element.name,
					dataType: "json",
					data: data,
					success: function(response) {
						if ( response ) {
							var submitted = validator.formSubmitted;
							validator.prepareElement(element);
							validator.formSubmitted = submitted;
							validator.successList.push(element);
							validator.showErrors();
						} else {
							var errors = {};
							errors[element.name] =  response || validator.defaultMessage( element, "remote" );
							validator.showErrors(errors);
						}
						previous.valid = response;
						validator.stopRequest(element, response);
					}
				}, param));
				return "pending";
			} else if( this.pending[element.name] ) {
				return "pending";
			}
			return previous.valid;
		},

		// http://docs.jquery.com/Plugins/Validation/Methods/minlength
		minlength: function(value, element, param) {
			return this.optional(element) || this.getLength($.trim(value), element) >= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
		maxlength: function(value, element, param) {
			return this.optional(element) || this.getLength($.trim(value), element) <= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
		rangelength: function(value, element, param) {
			var length = this.getLength($.trim(value), element);
			return this.optional(element) || ( length >= param[0] && length <= param[1] );
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/min
		min: function( value, element, param ) {
			return this.optional(element) || value >= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/max
		max: function( value, element, param ) {
			return this.optional(element) || value <= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/range
		range: function( value, element, param ) {
			return this.optional(element) || ( value >= param[0] && value <= param[1] );
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/email
		email: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
			return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
		},
	
		// http://docs.jquery.com/Plugins/Validation/Methods/url
		url: function(value, element) {
			// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
			return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
		},
        
		// http://docs.jquery.com/Plugins/Validation/Methods/date
		date: function(value, element) {
			return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
		},
	
		// http://docs.jquery.com/Plugins/Validation/Methods/dateISO
		dateISO: function(value, element) {
			return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
		},
	
		// http://docs.jquery.com/Plugins/Validation/Methods/dateDE
		dateDE: function(value, element) {
			return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
		},
	
		// http://docs.jquery.com/Plugins/Validation/Methods/number
		number: function(value, element) {
			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
		},
	
		// http://docs.jquery.com/Plugins/Validation/Methods/numberDE
		numberDE: function(value, element) {
			return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/digits
		digits: function(value, element) {
			return this.optional(element) || /^\d+$/.test(value);
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/creditcard
		// based on http://en.wikipedia.org/wiki/Luhn
		creditcard: function(value, element) {
			if ( this.optional(element) )
				return "dependency-mismatch";
			// accept only digits and dashes
			if (/[^0-9-]+/.test(value))
				return false;
			var nCheck = 0,
				nDigit = 0,
				bEven = false;

			value = value.replace(/\D/g, "");

			for (n = value.length - 1; n >= 0; n--) {
				var cDigit = value.charAt(n);
				var nDigit = parseInt(cDigit, 10);
				if (bEven) {
					if ((nDigit *= 2) > 9)
						nDigit -= 9;
				}
				nCheck += nDigit;
				bEven = !bEven;
			}

			return (nCheck % 10) == 0;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/accept
		accept: function(value, element, param) {
			param = typeof param == "string" ? param : "png|jpe?g|gif";
			return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); 
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/equalTo
		equalTo: function(value, element, param) {
			return value == $(param).val();
		}
		
	}
	
});

})(jQuery);

// ajax mode: abort
// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 
;(function($) {
	var ajax = $.ajax;
	var pendingRequests = {};
	$.ajax = function(settings) {
		// create settings for compatibility with ajaxSetup
		settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
		var port = settings.port;
		if (settings.mode == "abort") {
			if ( pendingRequests[port] ) {
				pendingRequests[port].abort();
			}
			return (pendingRequests[port] = ajax.apply(this, arguments));
		}
		return ajax.apply(this, arguments);
	};
})(jQuery);

// provides cross-browser focusin and focusout events
// IE has native support, in other browsers, use event caputuring (neither bubbles)

// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target 

// provides triggerEvent(type: String, target: Element) to trigger delegated events
;(function($) {
	$.each({
		focus: 'focusin',
		blur: 'focusout'	
	}, function( original, fix ){
		$.event.special[fix] = {
			setup:function() {
				if ( $.browser.msie ) return false;
				this.addEventListener( original, $.event.special[fix].handler, true );
			},
			teardown:function() {
				if ( $.browser.msie ) return false;
				this.removeEventListener( original,
				$.event.special[fix].handler, true );
			},
			handler: function(e) {
				arguments[0] = $.event.fix(e);
				arguments[0].type = fix;
				return $.event.handle.apply(this, arguments);
			}
		};
	});
	$.extend($.fn, {
		delegate: function(type, delegate, handler) {
			return this.bind(type, function(event) {
				var target = $(event.target);
				if (target.is(delegate)) {
					return handler.apply(target, arguments);
				}
			});
		},
		triggerEvent: function(type, target) {
			return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]);
		}
	})
})(jQuery);

(function($) {
	var opts = {}, 
		imgPreloader = new Image, imgTypes = ['png', 'jpg', 'jpeg', 'gif'], 
		loadingTimer, loadingFrame = 1;

   $.fn.fancybox = function(settings) {
		opts.settings = $.extend({}, $.fn.fancybox.defaults, settings);

		$.fn.fancybox.init();

		return this.each(function() {
			var $this = $(this);
			var o = $.metadata ? $.extend({}, opts.settings, $this.metadata()) : opts.settings;

			$this.unbind('click').click(function() {
				$.fn.fancybox.start(this, o); return false;
			});
		});
	};

	$.fn.fancybox.start = function(el, o) {
		if (opts.animating) return false;

		if (o.overlayShow) {
			$("#fancy_wrap").prepend('<div id="fancy_overlay"></div>');
			$("#fancy_overlay").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': o.overlayOpacity});

			if ($.browser.msie) {
				$("#fancy_wrap").prepend('<iframe id="fancy_bigIframe" scrolling="no" frameborder="0"></iframe>');
				$("#fancy_bigIframe").css({'width': $(window).width(), 'height': $(document).height(), 'opacity': 0});
			}

			$("#fancy_overlay").click($.fn.fancybox.close);
		}

		opts.itemArray	= [];
		opts.itemNum	= 0;

		if (jQuery.isFunction(o.itemLoadCallback)) {
		   o.itemLoadCallback.apply(this, [opts]);

			var c	= $(el).children("img:first").length ? $(el).children("img:first") : $(el);
			var tmp	= {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)};

		   for (var i = 0; i < opts.itemArray.length; i++) {
				opts.itemArray[i].o = $.extend({}, o, opts.itemArray[i].o);
				
				if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) {
					opts.itemArray[i].orig = tmp;
				}
		   }

		} else {
			if (!el.rel || el.rel == '') {
				var item = {url: el.href, title: el.title, o: o};

				if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) {
					var c = $(el).children("img:first").length ? $(el).children("img:first") : $(el);
					item.orig = {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)}
				}

				opts.itemArray.push(item);

			} else {
				var arr	= $("a[rel=" + el.rel + "]").get();

				for (var i = 0; i < arr.length; i++) {
					var tmp		= $.metadata ? $.extend({}, o, $(arr[i]).metadata()) : o;
   					var item	= {url: arr[i].href, title: arr[i].title, o: tmp};

   					if (o.zoomSpeedIn > 0 || o.zoomSpeedOut > 0) {
						var c = $(arr[i]).children("img:first").length ? $(arr[i]).children("img:first") : $(el);

						item.orig = {'width': c.width(), 'height': c.height(), 'pos': $.fn.fancybox.getPosition(c)}
					}

					if (arr[i].href == el.href) opts.itemNum = i;

					opts.itemArray.push(item);
				}
			}
		}

		$.fn.fancybox.changeItem(opts.itemNum);
	};

	$.fn.fancybox.changeItem = function(n) {
		$.fn.fancybox.showLoading();

		opts.itemNum = n;

		$("#fancy_nav").empty();
		$("#fancy_outer").stop();
		$("#fancy_title").hide();
		$(document).unbind("keydown");

		imgRegExp = imgTypes.join('|');
    	imgRegExp = new RegExp('\.' + imgRegExp + '$', 'i');

		var url = opts.itemArray[n].url;

		if (url.match(/#/)) {
			var target = window.location.href.split('#')[0]; target = url.replace(target,'');

	        $.fn.fancybox.showItem('<div id="fancy_div">' + $(target).html() + '</div>');

	        $("#fancy_loading").hide();

		} else if (url.match(imgRegExp)) {
			$(imgPreloader).unbind('load').bind('load', function() {
				$("#fancy_loading").hide();

				opts.itemArray[n].o.frameWidth	= imgPreloader.width;
				opts.itemArray[n].o.frameHeight	= imgPreloader.height;

				$.fn.fancybox.showItem('<img id="fancy_img" src="' + imgPreloader.src + '" />');

			}).attr('src', url  );
			/*+ '?rand=' + Math.floor(Math.random() * 999999999)*/
		} else {
			$.fn.fancybox.showItem('<iframe id="fancy_frame" onload="$.fn.fancybox.showIframe()" name="fancy_iframe' + Math.round(Math.random()*1000) + '" frameborder="0" hspace="0" src="' + url + '"></iframe>');
		}
	};

	$.fn.fancybox.showIframe = function() {
		$("#fancy_loading").hide();
		$("#fancy_frame").show();
	};

	$.fn.fancybox.showItem = function(val) {
		$.fn.fancybox.preloadNeighborImages();

		var viewportPos	= $.fn.fancybox.getViewport();
		var itemSize	= $.fn.fancybox.getMaxSize(viewportPos[0] - 50, viewportPos[1] - 100, opts.itemArray[opts.itemNum].o.frameWidth, opts.itemArray[opts.itemNum].o.frameHeight);

		var itemLeft	= viewportPos[2] + Math.round((viewportPos[0] - itemSize[0]) / 2) - 20;
		var itemTop		= viewportPos[3] + Math.round((viewportPos[1] - itemSize[1]) / 2) - 40;

		var itemOpts = {
			'left':		itemLeft, 
			'top':		itemTop, 
			'width':	itemSize[0] + 'px', 
			'height':	itemSize[1] + 'px'	
		};

		if (opts.active) {
			$('#fancy_content').fadeOut("normal", function() {
				$("#fancy_content").empty();
				
				$("#fancy_outer").animate(itemOpts, "normal", function() {
					$("#fancy_content").append($(val)).fadeIn("normal");
					$.fn.fancybox.updateDetails();
				});
			});

		} else {
			opts.active = true;

			$("#fancy_content").empty();

			if ($("#fancy_content").is(":animated")) {
				console.info('animated!');
			}

			if (opts.itemArray[opts.itemNum].o.zoomSpeedIn > 0) {
				opts.animating		= true;
				itemOpts.opacity	= "show";

				$("#fancy_outer").css({
					'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
					'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
					'height':	opts.itemArray[opts.itemNum].orig.height,
					'width':	opts.itemArray[opts.itemNum].orig.width
				});

				$("#fancy_content").append($(val)).show();

				$("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedIn, function() {
					opts.animating = false;
					$.fn.fancybox.updateDetails();
				});

			} else {
				$("#fancy_content").append($(val)).show();
				$("#fancy_outer").css(itemOpts).show();
				$.fn.fancybox.updateDetails();
			}
		 }
	};

	$.fn.fancybox.updateDetails = function() {
		$("#fancy_bg,#fancy_close").show();

		if (opts.itemArray[opts.itemNum].title !== undefined && opts.itemArray[opts.itemNum].title !== '') {
			$('#fancy_title div').html(opts.itemArray[opts.itemNum].title);
			$('#fancy_title').show();
		}

		if (opts.itemArray[opts.itemNum].o.hideOnContentClick) {
			$("#fancy_content").click($.fn.fancybox.close);
		} else {
			$("#fancy_content").unbind('click');
		}

		if (opts.itemNum != 0) {
			$("#fancy_nav").append('<a id="fancy_left" href="javascript:;"></a>');

			$('#fancy_left').click(function() {
				$.fn.fancybox.changeItem(opts.itemNum - 1); return false;
			});
		}

		if (opts.itemNum != (opts.itemArray.length - 1)) {
			$("#fancy_nav").append('<a id="fancy_right" href="javascript:;"></a>');
			
			$('#fancy_right').click(function(){
				$.fn.fancybox.changeItem(opts.itemNum + 1); return false;
			});
		}

		$(document).keydown(function(event) {
			if (event.keyCode == 27) {
            	$.fn.fancybox.close();

			} else if(event.keyCode == 37 && opts.itemNum != 0) {
            	$.fn.fancybox.changeItem(opts.itemNum - 1);

			} else if(event.keyCode == 39 && opts.itemNum != (opts.itemArray.length - 1)) {
            	$.fn.fancybox.changeItem(opts.itemNum + 1);
			}
		});
	};

	$.fn.fancybox.preloadNeighborImages = function() {
		if ((opts.itemArray.length - 1) > opts.itemNum) {
			preloadNextImage = new Image();
			preloadNextImage.src = opts.itemArray[opts.itemNum + 1].url;
		}

		if (opts.itemNum > 0) {
			preloadPrevImage = new Image();
			preloadPrevImage.src = opts.itemArray[opts.itemNum - 1].url;
		}
	};

	$.fn.fancybox.close = function() {
		if (opts.animating) return false;

		$(imgPreloader).unbind('load');
		$(document).unbind("keydown");

		$("#fancy_loading,#fancy_title,#fancy_close,#fancy_bg").hide();

		$("#fancy_nav").empty();

		opts.active	= false;

		if (opts.itemArray[opts.itemNum].o.zoomSpeedOut > 0) {
			var itemOpts = {
				'top':		opts.itemArray[opts.itemNum].orig.pos.top - 18,
				'left':		opts.itemArray[opts.itemNum].orig.pos.left - 18,
				'height':	opts.itemArray[opts.itemNum].orig.height,
				'width':	opts.itemArray[opts.itemNum].orig.width,
				'opacity':	'hide'
			};

			opts.animating = true;

			$("#fancy_outer").animate(itemOpts, opts.itemArray[opts.itemNum].o.zoomSpeedOut, function() {
				$("#fancy_content").hide().empty();
				$("#fancy_overlay,#fancy_bigIframe").remove();
				opts.animating = false;
			});
		} else {
			$("#fancy_outer").hide();
			$("#fancy_content").hide().empty();
			$("#fancy_overlay,#fancy_bigIframe").fadeOut("fast").remove();
		}
	};

	$.fn.fancybox.showLoading = function() {
		clearInterval(loadingTimer);

		var pos = $.fn.fancybox.getViewport();

		$("#fancy_loading").css({'left': ((pos[0] - 40) / 2 + pos[2]), 'top': ((pos[1] - 40) / 2 + pos[3])}).show();
		$("#fancy_loading").bind('click', $.fn.fancybox.close);
		
		loadingTimer = setInterval($.fn.fancybox.animateLoading, 66);
	};

	$.fn.fancybox.animateLoading = function(el, o) {
		if (!$("#fancy_loading").is(':visible')){
			clearInterval(loadingTimer);
			return;
		}

		$("#fancy_loading > div").css('top', (loadingFrame * -40) + 'px');

		loadingFrame = (loadingFrame + 1) % 12;
	};

	$.fn.fancybox.init = function() {
		if (!$('#fancy_wrap').length) {
			$('<div id="fancy_wrap"><div id="fancy_loading"><div></div></div><div id="fancy_outer"><div id="fancy_inner"><div id="fancy_nav"></div><div id="fancy_close"></div><div id="fancy_content"></div><div id="fancy_title"></div></div></div></div>').appendTo("body");
			$('<div id="fancy_bg"><div class="fancy_bg fancy_bg_n"></div><div class="fancy_bg fancy_bg_ne"></div><div class="fancy_bg fancy_bg_e"></div><div class="fancy_bg fancy_bg_se"></div><div class="fancy_bg fancy_bg_s"></div><div class="fancy_bg fancy_bg_sw"></div><div class="fancy_bg fancy_bg_w"></div><div class="fancy_bg fancy_bg_nw"></div></div>').prependTo("#fancy_inner");
			
			$('<table cellspacing="0" cellpadding="0" border="0"><tr><td id="fancy_title_left"></td><td id="fancy_title_main"><div></div></td><td id="fancy_title_right"></td></tr></table>').appendTo('#fancy_title');
		}

		if ($.browser.msie) {
			$("#fancy_inner").prepend('<iframe id="fancy_freeIframe" scrolling="no" frameborder="0"></iframe>');
		}

		if (jQuery.fn.pngFix) $(document).pngFix();

    	$("#fancy_close").click($.fn.fancybox.close);
	};

	$.fn.fancybox.getPosition = function(el) {
		var pos = el.offset();

		pos.top	+= $.fn.fancybox.num(el, 'paddingTop');
		pos.top	+= $.fn.fancybox.num(el, 'borderTopWidth');

 		pos.left += $.fn.fancybox.num(el, 'paddingLeft');
		pos.left += $.fn.fancybox.num(el, 'borderLeftWidth');

		return pos;
	};

	$.fn.fancybox.num = function (el, prop) {
		return parseInt($.curCSS(el.jquery?el[0]:el,prop,true))||0;
	};

	$.fn.fancybox.getPageScroll = function() {
		var xScroll, yScroll;

		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;	
		}

		return [xScroll, yScroll]; 
	};

	$.fn.fancybox.getViewport = function() {
		var scroll = $.fn.fancybox.getPageScroll();

		return [$(window).width(), $(window).height(), scroll[0], scroll[1]];
	};

	$.fn.fancybox.getMaxSize = function(maxWidth, maxHeight, imageWidth, imageHeight) {
		var r = Math.min(Math.min(maxWidth, imageWidth) / imageWidth, Math.min(maxHeight, imageHeight) / imageHeight);

		return [Math.round(r * imageWidth), Math.round(r * imageHeight)];
	};

	$.fn.fancybox.defaults = {
		hideOnContentClick:	false,
		zoomSpeedIn:		500,
		zoomSpeedOut:		500,
		frameWidth:			600,
		frameHeight:		400,
		overlayShow:		false,
		overlayOpacity:		0.4,
		itemLoadCallback:	null
	};
})(jQuery);
/**
 * jQuery.ScrollTo - Easy element scrolling using jQuery.
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 2/19/2008
 * @author Ariel Flesler
 * @version 1.3.3
 *
 * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
 */
;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
jQuery.validator.addMethod("postcode", function(value, element) {
	return this.optional(element) || /^[0-9]{2}\-[0-9]{3}$/.test(value);
}, "Kod pocztowy proszę podać w formacie XX-XXX");

jQuery.validator.addMethod("required", function(value, element, param) {
	// check if dependency is met
	if ( !this.depend(param, element) )
		return "dependency-mismatch";
	switch( element.nodeName.toLowerCase() ) {
		case 'select':
			var options = $("option:selected", element);
			return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
		case 'input':
			if ( this.checkable(element) ) {
				if ($(element).attr('default') == value){ return false; }
				return this.getLength(value, element) > 0;
			}
		default:
			if ($(element).attr('default') == value){ return false; }
			return $.trim(value).length > 0;
	}
}, "This field is required."); 
var Tertium = {

	logged : false,
	Basket : [],

	initContactForm : function() {

		$(document).ready(function(){
			var validator = $('#contact_form').validate({
				rules : {
					firstname: "required",
					lastname: "required",
					email: {
						required: true,
						email: true
					},
					message: "required"
				}, messages: {
					firstname: "Proszę podać imię",
		            lastname: "Proszę podać nazwisko",
		            email: {
		                required: "Proszę podać poprawny adres e-mail",
		                email: "Proszę podać poprawny adres e-mail"
		            },
		            message: "Proszę napisać wiadomość"
				},
				errorPlacement: Tertium.errorPlacement,
				success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
			});
		});

		return false;
	},

	initOrderForm : function() {
		$(document).ready(function() {
			$('.inpsubhid').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td').html($('.submit_td').html()+'<a href="#" onclick="$(\'#frm_rm_1\').submit(); return false;" class="submit"></a>');

			var validator = $("#frm_rm_1").validate({
				rules : {
					firstname: "required",
					lastname: "required",
					email: {
						required: true,
						email: true
					},
					address: "required",
					city: "required",
					postcode: "required",
					accept_giodo: "required"
				}, messages: {
					firstname: "Proszę podać imię",
		            lastname: "Proszę podać nazwisko",
		            email: {
		                required: "Podanie adresu e-mail jest wymagane, będzie on używany do logowania się w serwisie",
		                email: "Proszę podać poprawny adres e-mail"
		            },
		            address: "Proszę podać adres",
		            city: "Proszę podać miasto",
		            postcode: "Proszę podać kod pocztowy",
		            accept_giodo: "Proszę wyrazić zgodę na przetwarzanie danych osobowych"
				},
				// the errorPlacement has to take the table layout into account
		        errorPlacement: Tertium.errorPlacement,
		        // usuwanie defaultowych wartości formularza
		        submitHandler: function(form) {
		        	$('#frm_rm_1 .dvc').each(function(){
		        		if ($(this).attr('default') == $(this).val()) {
		        			this.value = '';
		        		}
		        	});
		            form.submit();
		        },
		        // set this class to error-labels to indicate valid fields
		        success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
			});
		});

		return true;
	},

	initSignupForm : function() {
		$(document).ready(function() {

			//zamiana standardowego pola submit na a...
			$('.inpsubhid').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td').html($('.submit_td').html()+'<a href="#" onclick="$(\'#frm_rm_1\').submit(); return false;" class="submit"></a>');

			if ($("#prenum_tertium").val() == '0') {
				$('#prenum_tertium_cnt').hide();
				$('#prenum_tertium_cnt').val('1');
			}
			if ($("#prenum_others").val() == '0') {
				$('#prenum_others_cnt').hide();
				$('#prenum_others_cnt').val('1');
			}

			$("#prenum_tertium").bind('change',function(){
				if (this.value == 1) {
					$('#prenum_tertium_cnt').show();
				} else {
					$('#prenum_tertium_cnt').hide();
					$('#prenum_tertium_cnt_v').val('1');
				}
			});

			$("#prenum_others").bind('change',function(){
				if (this.value == 1) {
					$('#prenum_others_cnt').show();
				} else {
					$('#prenum_others_cnt').hide();
					$('#prenum_others_cnt_v').val('1');
				}
			});

			var validator = $("#frm_rm_1").validate({
		        rules: {
		        	prenum_tertium_cnt: {
		        		required: "#prenum_tertium_cnt:visible",
		        		min: 1
		        	},
					prenum_others_cnt: {
						required: "#prenum_others_cnt:visible",
						min: 1
					},
		            firstname: "required",
		            lastname: "required",
		            email: {
		                required: true,
		                email: true,
		                remote: {
				        	url: "rejestracja-email.html",
				        	type: "post",
				        	data: {
				          		email: function() {
				            		return $("#email").val();
				          		}
				          	}
				        }
		            },
		            email_confirm: {
		            	required: true,
		            	equalTo: "#email"
		            },
		            password: {
		                required: true,
		                minlength: 5
		            },
		            password_confirm: {
		                required: true,
		                minlength: 5,
		                equalTo: "#password"
		            },
		            accept_terms: "required",
		            accept_giodo: "required",
		            address: "required",
		            city: "required",
		            postcode: "required",
		            phone: "required"

		        },
		        messages: {
		        	prenum_tertium_cnt: "Proszę podać ilość",
		        	prenum_others_cnt: "Proszę podać ilość",
		            firstname: "Proszę podać imię",
		            lastname: "Proszę podać nazwisko",
		            password: {
		                required: "Proszę podać hasło",
		                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków")
		            },
		            password_confirm: {
		                required: "Proszę powtórzyć hasło",
		                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków"),
		                equalTo: "Hasło i potwierdzenie muszą być identyczne"
		            },
		            email: {
		                required: "Podanie adresu e-mail jest wymagane, będzie on używany do logowania się w serwisie",
		                email: "Proszę podać poprawny adres e-mail",
		                remote: jQuery.format("E-mail: {0} znajduje się już w naszej bazie danych. <br /><a href=\"/zapomnialem-hasla.html\">Jeśli nie pamiętasz hasła, kliknij.</a>")
		            },
		            email_confirm: {
		                required: "Proszę powtórnie podać adres e-mail",
		                equalTo: "Email i potwierdzenie muszą być identyczne"
		            },
		            accept_terms: "Proszę zaakceptować Statut Towarzystwa i obowiązki członków Towarzystwa." ,
		            accept_giodo: "Proszę wyrazić zgodę na przetwarzanie danych osobowych" ,
		            address: "Proszę podać adres",
		            city: "Proszę podać miasto",
		            postcode: "Proszę podać kod pocztowy",
		            phone: "Proszę podać numer telefonu"
		        },
		        // the errorPlacement has to take the table layout into account
		        errorPlacement: Tertium.errorPlacement,
		        // usuwanie defaultowych wartości formularza
		        submitHandler: function(form) {
		        	$('#frm_rm_1 .dvc').each(function(){
		        		if ($(this).attr('default') == $(this).val()) {
		        			this.value = '';
		        		}
		        	});
		            form.submit();
		        },
		        // set this class to error-labels to indicate valid fields
		        success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
		    });

		});
	},

	initEditForm : function() {
		$(document).ready(function() {

			//zamiana standardowego pola submit na a...
			$('.inpsubhid').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td').html($('.submit_td').html()+'<a href="#" onclick="$(\'#frm_rm_1\').submit(); return false;" class="submit"></a>');

			if ($("#prenum_tertium").val() == '0') {
				$('#prenum_tertium_cnt').hide();
				$('#prenum_tertium_cnt').val('1');
			}
			if ($("#prenum_others").val() == '0') {
				$('#prenum_others_cnt').hide();
				$('#prenum_others_cnt').val('1');
			}

			$("#prenum_tertium").bind('change',function(){
				if (this.value == 1) {
					$('#prenum_tertium_cnt').show();
				} else {
					$('#prenum_tertium_cnt').hide();
					$('#prenum_tertium_cnt_v').val('1');
				}
			});

			$("#prenum_others").bind('change',function(){
				if (this.value == 1) {
					$('#prenum_others_cnt').show();
				} else {
					$('#prenum_others_cnt').hide();
					$('#prenum_others_cnt_v').val('1');
				}
			});

			/**
			 * Validation rules for main signup form...
			 */
			var validator = $("#frm_rm_1").validate({
		        rules: {
		        	prenum_tertium_cnt: {
		        		required: "#prenum_tertium_cnt:visible", //function(element) { return $("#prenum_tertium").val() != '0'; },
		        		min: 1
		        	},
					prenum_others_cnt: {
						required: "#prenum_others_cnt:visible", //function(element) { return $("#prenum_others").val() != '0'; },
						min: 1
					},
		            firstname: "required",
		            lastname: "required",
		            address: "required",
		            city: "required",
		            postcode: "required",
		            phone: "required"

		        },
		        messages: {
		        	prenum_tertium_cnt: "Proszę podać ilość",
		        	prenum_others_cnt: "Proszę podać ilość",
		            firstname: "Proszę podać imię",
		            lastname: "Proszę podać nazwisko",
		            address: "Proszę podać adres",
		            city: "Proszę podać miasto",
		            postcode: "Proszę podać kod pocztowy",
		            phone: "Proszę podać numer telefonu"
		        },
		        // the errorPlacement has to take the table layout into account
		        errorPlacement: Tertium.errorPlacement,
		        // usuwanie defaultowych wartości formularza
		        submitHandler: function(form) {
		        	$('#frm_rm_1 .dvc').each(function(){
		        		if ($(this).attr('default') == $(this).val()) {
		        			this.value = '';
		        		}
		        	});
		            form.submit();
		        },
		        // set this class to error-labels to indicate valid fields
		        success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
		    });

		});
	},

	initEditPasswordForm : function() {
		$(document).ready(function() {

			//zamiana standardowego pola submit na a...
			$('.inpsubhid').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td').html($('.submit_td').html()+'<a href="#" onclick="$(\'#frm_rm_1\').submit(); return false;" class="submit"></a>');

			var validator = $("#frm_rm_1").validate({
		        rules: {
		        	cur_password: {
		                required: true
		            },
		            password: {
		                required: true,
		                minlength: 5
		            },
		            password_confirm: {
		                required: true,
		                minlength: 5,
		                equalTo: "#password"
		            }
		        },
		        messages: {
		        	cur_password: {
		                required: "Proszę podać obecne hasło"
		            },
		            password: {
		                required: "Proszę podać nowe hasło",
		                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków")
		            },
		            password_confirm: {
		                required: "Proszę powtórzyć nowe hasło",
		                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków"),
		                equalTo: "Hasło i potwierdzenie muszą być identyczne"
		            }
		      	},
		      	// the errorPlacement has to take the table layout into account
		        errorPlacement: Tertium.errorPlacement,
		        // usuwanie defaultowych wartości formularza
		        submitHandler: function(form) {
		        	$('#frm_rm_1 .dvc').each(function(){
		        		if ($(this).attr('default') == $(this).val()) {
		        			this.value = '';
		        		}
		        	});
		            form.submit();
		        },
		        // set this class to error-labels to indicate valid fields
		        success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
		    });
		});
	},

	initForgottenPassForm : function() {
		$(document).ready(function() {
			$('.inpsubhid_fp').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td_fp').html($('.submit_td_fp').html()+'<a href="#" onclick="$(\'#frm_fp\').submit(); return false;" class="submit"></a>');
		});

		var validator = $("#frm_fp").validate({
			rules: {
				email: {
					required: function(element) {
				        return $("#fp_box_number").val() == '';
				    },
				    email: true
				},
				id: {
					required: function(element) {
				        return $("#fp_box_email").val() == '';
				    }
				}
			},
			messages: {
				email: {
					required: "Adres e-mail lub numer członkowski jest wymagany.",
					email: "Adres e-mail jest nieprawidłowy"
				},
				id: "Adres e-mail lub numer członkowski jest wymagany."
			},
			errorPlacement: Tertium.errorPlacement
		});

	},

	initSecondLoginForm : function() {
		$(document).ready(function() {
			$('.inpsubhid_lg_2').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td_lg_2').html($('.submit_td_lg_2').html()+'<a href="#" onclick="$(\'#frm_lg_2\').submit(); return false;" class="submit"></a>');
		});

		var validator = $("#frm_lg_2").validate({
			rules: {
				email: {
					required: function(element) {
				        return $("#login_box_number").val() == '';
				    }//,
				    //email: true
				},
				id: {
					required: function(element) {
				        return $("#login_box_email").val() == '';
				    }
				},
				password: {
		            required: true
				}
			},
			messages: {
				email: {
					required: "Adres e-mail lub numer członkowski jest wymagany"//,
					//email: "Adres e-mail jest nieprawidłowy"
				},
				id: "Adres e-mail lub numer członkowski jest wymagany",
				password: "Proszę podać hasło."
			},
			errorPlacement: Tertium.errorPlacement
		});
	},

	initRestorePassForm : function() {
		$(document).ready(function() {
			$('.inpsubhid_fp_2').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td_fp_2').html($('.submit_td_fp_2').html()+'<a href="#" onclick="$(\'#frm_fp_2\').submit(); return false;" class="submit"></a>');
		});

		var validator = $("#frm_fp_2").validate({
			rules: {
				actemail: {
					required: true,
				    email: true
				},
				new_pass: {
	                required: true,
	                minlength: 5
	            },
	            new_pass_confirm: {
	                required: true,
	                minlength: 5,
	                equalTo: "#login_box_password"
	            }
			},
			messages: {
				actemail: {
					required: "Proszę podać adres e-mail",
					email: "Podany adres e-mail jest nieprawidłowy"
				},
				new_pass: {
	                required: "Proszę podać nowe hasło",
	                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków")
	            },
	            new_pass_confirm: {
	                required: "Proszę powtórzyć hasło",
	                minlength: jQuery.format("Hasło musi zawierać conajmniej {0} znaków"),
	                equalTo: "Hasło i potwierdzenie muszą być identyczne"
	            }
			},
			errorPlacement: Tertium.errorPlacement
		});
	},

	submitLoginForm : function() {
		if ($('#login_email').val() == '') {
			alert('Proszę podać email lub numer członkowski.');
			return false;
		}
		if ($('#login_password').val() == '') {
			alert('Proszę podać hasło.');
			return false;
		}

		$('#login_frm').submit();
		return false;
	},

	submitLogoutForm : function() {
		$('#logout_frm').submit();
		return false;
	},

	errorPlacement: function(error, element) {
        if ( element.is(":radio") ) {
            error.appendTo( element.parent().next().next() );
        } else if ( element.is(":checkbox") ) {
            error.appendTo ( element.next() );
        } else {
            error.appendTo( element.parent() );
    	}
    },

    addToBasket : function(id,a) {
    	a.blur();
    	$.post('/koszyk/zmien.html',{ dodaj: id, json: true }, function(data) {

    		if (data == null || data.result == 0 || data.length == null || data.length == 0) {
    			alert('Nie udało się dodać pozycji do koszyka.');
    			return false;
    		}

    		Tertium.Basket = data;
    		Tertium.updateBasketContent();
    		Tertium.toggleBasket();

    	}, 'json');


    	return false;
    },

    removeFromBasket : function(id,a) {
    	a.blur();
    	$.post('/koszyk/zmien.html',{ usun: id, json: true }, function(data) {
    		Tertium.Basket = data;
    		Tertium.updateBasketContent();
    		Tertium.toggleBasket();
    	}, 'json');

    	return false;
    },

    clearBasket : function() {
    	if (confirm('Czy na pewno usunąć wszystkie pozycje z koszyka ?')) {
    		$.post('/koszyk/zmien.html', { clean: true, json: true }, function(data) {
    			Tertium.Basket = [];
    			Tertium.updateBasketContent();
    			Tertium.toggleBasket();
    		}, 'json');
    	}
    },

    minimizeBasket : function() {
    	$('.box.basket').addClass('basketMin');
    	$('.basket_min').css({ display:'block' });
    	Tertium.setCookie('basket-mode','min');
    },

    memberBasketAdd : function(id,a) {
    	a.blur();
    	$('table.baskettbl').load('/konto/koszyk.html', { dodaj:id, ajax:1 } );
    	return false;
    },

    memberBasketRemove : function(id,a) {
    	a.blur();
    	$('table.baskettbl').load('/konto/koszyk.html', { usun:id, ajax:1 } );
    	return false;
    },

    memberBasketDelete : function(id,a) {
    	a.blur();
    	$('table.baskettbl').load('/konto/koszyk.html', { wyczysc:id, ajax:1 } );
    	return false;
    },

    orderOptionsChanged : function() {
    	var shp = $("input[name='shipment']:checked").val();
    	var py = $("input[name='payment']:checked").val();
    	var py_mb = null;
    	if ($('#py_mb:checked').length > 0) {
    		var py_mb = 1;
    	} else {
    		var py_mb = 0;
    	}

    	$('table.baskettbl').load('/konto/koszyk.html', { ajax:1, settings:1, shipment:shp, payment:py, py_mb:py_mb });
    },

    maximizeBasket : function() {
    	$('.box.basket').removeClass('basketMin');
    	$('.basket_min').css({ display:'none' });
    	Tertium.setCookie('basket-mode','max');
    },

    updateBasketContent : function() {
    	var html = '';
    	var sum = 0;
    	var sum_member = 0;

    	for (i in Tertium.Basket) {
    		sum += Tertium.Basket[i].PBL_PRICE_REGULAR*1.0*+Tertium.Basket[i].COUNT*1;
    		sum_member += Tertium.Basket[i].PBL_PRICE_MEMBER*1.0*+Tertium.Basket[i].COUNT*1;
    		if (!Tertium.logged) {
	    		html += '<li><a href="'+Tertium.Basket[i].ELM_URL+'" class="tit">'+Tertium.Basket[i].ELM_NAME+'</a><div class="bask_cnt"><span>Ilość szt.: </span><span><strong>'+Tertium.Basket[i].COUNT+'</strong></span><a class="more" href="#" onclick="return Tertium.addToBasket('+Tertium.Basket[i].PBL_ID+', this);">+</a><a class="less" href="#" onclick="return Tertium.removeFromBasket('+Tertium.Basket[i].PBL_ID+', this);">-</a><span>Cena: </span><span class="price"><strong>'+Tertium.Basket[i].PBL_PRICE_REGULAR+'</strong> PLN</span></div></li>';
    		} else {
	    		html += '<li><a href="'+Tertium.Basket[i].ELM_URL+'" class="tit">'+Tertium.Basket[i].ELM_NAME+'</a><div class="bask_cnt"><span>Ilość szt.: </span><span><strong>'+Tertium.Basket[i].COUNT+'</strong></span><a class="more" href="#" onclick="return Tertium.addToBasket('+Tertium.Basket[i].PBL_ID+', this);">+</a><a class="less" href="#" onclick="return Tertium.removeFromBasket('+Tertium.Basket[i].PBL_ID+', this);">-</a><span>Cena: </span><span class="price"><strong>'+Tertium.Basket[i].PBL_PRICE_MEMBER+'</strong> PLN</span></div></li>';
    		}
    	}

    	if (!Tertium.logged) {
    		$('#basket_sum').html('suma: <strong>'+sum.toFixed(2)+'</strong> PLN');
    		var diff = sum.toFixed(2)-sum_member.toFixed(2);
    		if (diff > 0) {
    			$('#price_for_member').html('<strong>Zaloguj się a zaoszczędzisz '+(sum.toFixed(2)-sum_member.toFixed(2))+' PLN</strong>');
    		}
    	} else {
    		$('#basket_sum').html('suma: <strong>'+sum_member.toFixed(2)+'</strong> PLN');
    	}
    	$('#basket_pos').html(html);

    	var basket_mode = Tertium.getCookie('basket-mode');
    	if (basket_mode == 'max') {
    		Tertium.maximizeBasket();
    	} else if (basket_mode == 'min') {
    		Tertium.minimizeBasket();
    	}
    },

    toggleBasket : function() {
    	if (Tertium.Basket.length == 0) {
    		$('.basket').removeClass('basketShow');
    		$('.basket').addClass('basketHide');
    	} else {
    		$('.basket').removeClass('basketHide');
    		$('.basket').addClass('basketShow');
    	}
    },

    setCookie: function(c_name,value,expiredays) {
		var exdate=new Date();
		exdate.setDate(exdate.getDate()+expiredays);
		document.cookie=c_name+ "=" +escape(value)+
		((expiredays==null) ? "" : ";expires="+exdate.toGMTString()) + '; path=/';
	},

	getCookie: function(c_name) {
		if (document.cookie.length>0)
		  {
		  c_start=document.cookie.indexOf(c_name + "=");
		  if (c_start!=-1)
		    {
		    c_start=c_start + c_name.length+1;
		    c_end=document.cookie.indexOf(";",c_start);
		    if (c_end==-1) c_end=document.cookie.length;
		    return unescape(document.cookie.substring(c_start,c_end));
		    }
		  }
		return "";
	},

	toggleOrderDetails: function(id) {
		if ($('#ord_'+id).attr('act') == '1') {
			$('.order_details').attr('act','0');
			$('.order_details').hide();
			$('.order_details_sw').html('rozwiń&nbsp;&raquo;');
			return false;
		}
		$('.order_details').hide();
		$('.order_details').attr('act','0');
		$('.order_details_sw').html('rozwiń&nbsp;&raquo;');
		$('#ord_'+id).show();
		$('#ord_'+id).attr('act','1');
		$('#ord_sw_'+id).html('zwiń&nbsp;&laquo;')

		return false;
	}
};
$.fn.defaultValueCleaner = function() {
	
	this.each(function(){
		if ($(this).attr('default') == null) {
			$(this).attr('default',this.value);
		} else {
			if ($(this).val() == "") {
				$(this).val($(this).attr('default'));
			}
		}
		
		if ($(this).attr('default') != this.value && $(this).val() != "") {
			$(this).addClass('valueSet');	
		}
				
		$(this).bind('focus',function(){ 
			if (this.value == $(this).attr('default')) {
				this.value = '';
				$(this).addClass('valueSet');
			}
		});
		$(this).bind('blur', function(){ 
			if (this.value == '') { 
				this.value = $(this).attr('default'); 
				$(this).removeClass('valueSet');
			} 
		});
	});
	
};
var TertiumConf = {

	map : null,
    gdir : null,
    geocoder : null,
    addressMarker : null,
    retry : false,
    toAddress : '',
	landmarks : [],
	photos : [],
	mapInited : false,
	icons : [],
	curLdmkIdx : null,
	submitting : false,

	init : function() {
		$('ul.ctab li').each(function(){
			var id = this.id.split('_')[1];
			$(this).bind('click',function(e){
				TertiumConf.switch_tab(this,id);
			});
		});

		var mh = $('ul.ctab').height();
		$('.ctab-content').each(function(){
			$(this).css('min-height',mh+'px');
		});
	},

	switch_tab : function(e,ctc_id) {

		$('.ctab li').removeClass('act').removeClass('first-act');
		if ($(e).hasClass('first')) {
			$(e).addClass('first-act');
		} else {
			$(e).addClass('act');
		}

		var tabid = null;
		var idp = $(e).attr('id').split('_');
		if (idp != null && idp.length == 2) {
			var tabid = idp[1];
		}

		$('.ctab-content').hide();
		if ($(e).hasClass('map-tab')) {
			$('#map_over_cnt').html($('#ctc_'+ctc_id).html());
			$('#map_hidden').show();
			$('#map_zoom').attr('href',$(e).find('a').attr('href')+',pokaz,mape');
		} else {
			$('#ctc_'+ctc_id).show();
		}

		if ($(e).hasClass('galery-tab') && $(e).attr('inited') != '1') {
			$(e).attr('inited','1');
			this.photoInit(tabid);
		}

		if ($(e).hasClass('map-tab') && !TertiumConf.mapInited) {
			this.mapInit(tabid);
		}
		if ($(e).hasClass('map-tab') && TertiumConf.mapInited) {
			this.filterMarkers(tabid);
		}
		return false;
	},

	photoInit : function(tabId) {
		$(this.photos).each(function(){
			if (this.tab == tabId) {
				var sep = '';
				if (this.author != '' && this.description != '') sep = ': '
				$('#confgal_'+tabId).append('<a href="'+this.image+'" class="fancybox" rel="gal_'+this.tab+'" onclick="return false;" title="'+this.author+sep+this.description+'"><img src="'+this.miniature+'" alt="'+this.author+sep+this.description+'" title="'+this.author+sep+this.description+'"/></a>');
			}
		});
		$("a.fancybox").fancybox({overlayShow:true});
	},

	showMap : function(id) {
		$('#map_hidden').show();
	},

	showRoute : function() {
		$('.route-tab').click();
		return false;
	},

	mapInit : function(tabId) {
		if (GBrowserIsCompatible()) {
      		setTimeout(function(){
      			TertiumConf.mapInited = true;
	        	TertiumConf.map = new GMap2(document.getElementById("map_canvas"));
	        	TertiumConf.gdir = new GDirections(TertiumConf.map, document.getElementById("directions"));
	        	TertiumConf.map.addControl(new GSmallMapControl());
	        	TertiumConf.map.addControl(new GMapTypeControl());
	        	GEvent.addListener(TertiumConf.gdir, "error", TertiumConf.handleMapErrors);
	        	TertiumConf.initIcons();
	        	TertiumConf.mapInitMarkers();
	        	if (tabId != null) {
	        		TertiumConf.filterMarkers(tabId);
	        	}
        	},100);
      	}
	},

	mapInitMarkers : function() {
		var Poly = new Array();
		$(this.landmarks).each(function(){
			if (this.type == '' || this.type == '0') this.type == '8';
			this.point = new GLatLng(this.x,this.y);
			this.marker = new GMarker(this.point,{icon:TertiumConf.icons[this.type*1]});
			Poly[Poly.length] = this.point;
			if (this.description != null && this.description != '') {
				var html = '<strong>'+this.name+'</strong><br />'+this.description;
				var pt = this.point;
				var pid = this.id;
				GEvent.addListener(this.marker, "click", function() {
    				TertiumConf.map.openInfoWindowHtml(pt, html);
    				$('#toTarget :selected').attr('selected','');
    				$('#toTarget option[value=\''+pid+'\']').attr('selected','selected');
  				});
			} else {
				var pid = this.id;
				GEvent.addListener(this.marker, "click", function() {
					TertiumConf.map.closeInfoWindow();
					$('#toTarget :selected').attr('selected','');
    				$('#toTarget option[value=\''+pid+'\']').attr('selected','selected');
				});
			}
			TertiumConf.map.addOverlay(this.marker);
		});
		var area = new GPolygon(Poly);
		var bounds = area.getBounds();
		if (bounds != null) {
			var center = bounds.getCenter();
			var zoom = TertiumConf.map.getBoundsZoomLevel(bounds);
			if (zoom > 13) zoom = 13;
			TertiumConf.map.setCenter(center,zoom);
			$('#toTarget').bind('change',function(e){
				TertiumConf.toTargetChanged(this.value);
			});
		}
	},

	setDirections : function(retry) {
	  var from = $('#fromTarget').val();
	  var toId = $('#toTarget').val();

	  if(from == '') {
      	alert('Proszę podać miejsce wyjazdu.');
      	return false;
      }

      if(toId == '' || toId == 0) {
      	alert('Proszę podać miejsce przyjazdu.');
      	return false;
      }

	  $(this.landmarks).each(function(i){
	  	 if (this.id == toId) {
	  	 	TertiumConf.curLdmkIdx = i;
	  	 	if (typeof(this.address) == 'undefined' || this.address == null) {
	  	 		gc = new GClientGeocoder();
	        	gc.getLocations(this.point, TertiumConf.handleEndPtAddress);
	  	 	} else if (this.address != false) {
	  	 		TertiumConf.loadDirections();
	  	 	} else {
	  	 		alert('Nie można odnaleźć trasy dojazdu.')
	  	 	}
	  	 }
	  });

	  return false;
	},

    handleEndPtAddress: function(ret) {
    	if (typeof(ret.Placemark) != 'undefined' && ret.Placemark[0] != null) {
    	 	TertiumConf.landmarks[TertiumConf.curLdmkIdx].address = ret.Placemark[0].address;
    	 	TertiumConf.loadDirections();
    	}
    },

    loadDirections: function() {
    	 var from = $('#fromTarget').val();
    	 var to = TertiumConf.landmarks[TertiumConf.curLdmkIdx].address;
    	 TertiumConf.gdir.load("from: " + from + " to: " + to);
    },

	handleMapErrors : function(){
    	if (!retry) {
    		retry = true;
    		return this.setDirections($('#fromAddress').val() +', Polska', true);
    	}
	   if (TertiumConf.gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("Nie udało sie odnaleźć lokalizacji początkowej, proszę podać inny adres.");
	   else
	   	 alert("Wystąpił błąd w wyszukiwaniu trasy, prosimy spróbować później.");

	},

	filterMarkers : function(tab) {
		this.map.closeInfoWindow();
		$('#toTarget').find('option').remove();
		$('#toTarget').append('<option value="0">-- wybierz --</option>');
		$(this.landmarks).each(function(){
			if (this.tab == tab) {
				this.marker.show();
				$('#toTarget').append('<option value="'+this.id+'">'+this.name+'</option>');
			} else {
				this.marker.hide();
			}
		});
	},

	toTargetChanged : function(id) {
		var id = id;
		this.map.closeInfoWindow();
		$(this.landmarks).each(function(){
			if (this.id == id) {
				if (this.description != null && this.description != '') {
					var html = '<strong>'+this.name+'</strong><br />'+this.description;
					TertiumConf.map.openInfoWindowHtml(this.point, html);
				} else {
					TertiumConf.map.panTo(this.point);
				}
			}
		});
	},

	initIcons : function() {

		TertiumConf.icons[1] = new GIcon();
		TertiumConf.icons[1].image = '/i/map/hot/image.png';
		TertiumConf.icons[1].shadow = '/i/map/hot/shadow.png';
		TertiumConf.icons[1].iconSize = new GSize(20,34);
		TertiumConf.icons[1].shadowSize = new GSize(37,34);
		TertiumConf.icons[1].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[1].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[1].printImage = '/i/map/hot/printImage.gif';
		TertiumConf.icons[1].mozPrintImage = '/i/map/hot/mozPrintImage.gif';
		TertiumConf.icons[1].printShadow = '/i/map/hot/printShadow.gif';
		TertiumConf.icons[1].transparent = '/i/map/hot/transparent.png';
		TertiumConf.icons[1].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[2] = new GIcon();
		TertiumConf.icons[2].image = '/i/map/pen/image.png';
		TertiumConf.icons[2].shadow = '/i/map/pen/shadow.png';
		TertiumConf.icons[2].iconSize = new GSize(20,34);
		TertiumConf.icons[2].shadowSize = new GSize(37,34);
		TertiumConf.icons[2].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[2].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[2].printImage = '/i/map/pen/printImage.gif';
		TertiumConf.icons[2].mozPrintImage = '/i/map/pen/mozPrintImage.gif';
		TertiumConf.icons[2].printShadow = '/i/map/pen/printShadow.gif';
		TertiumConf.icons[2].transparent = '/i/map/pen/transparent.png';
		TertiumConf.icons[2].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[3] = new GIcon();
		TertiumConf.icons[3].image = '/i/map/apt/image.png';
		TertiumConf.icons[3].shadow = '/i/map/apt/shadow.png';
		TertiumConf.icons[3].iconSize = new GSize(20,34);
		TertiumConf.icons[3].shadowSize = new GSize(37,34);
		TertiumConf.icons[3].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[3].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[3].printImage = '/i/map/apt/printImage.gif';
		TertiumConf.icons[3].mozPrintImage = '/i/map/apt/mozPrintImage.gif';
		TertiumConf.icons[3].printShadow = '/i/map/apt/printShadow.gif';
		TertiumConf.icons[3].transparent = '/i/map/apt/transparent.png';
		TertiumConf.icons[3].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[4] = new GIcon();
		TertiumConf.icons[4].image = '/i/map/bar/image.png';
		TertiumConf.icons[4].shadow = '/i/map/bar/shadow.png';
		TertiumConf.icons[4].iconSize = new GSize(20,34);
		TertiumConf.icons[4].shadowSize = new GSize(37,34);
		TertiumConf.icons[4].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[4].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[4].printImage = '/i/map/bar/printImage.gif';
		TertiumConf.icons[4].mozPrintImage = '/i/map/bar/mozPrintImage.gif';
		TertiumConf.icons[4].printShadow = '/i/map/bar/printShadow.gif';
		TertiumConf.icons[4].transparent = '/i/map/bar/transparent.png';
		TertiumConf.icons[4].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[5] = new GIcon();
		TertiumConf.icons[5].image = '/i/map/cof/image.png';
		TertiumConf.icons[5].shadow = '/i/map/cof/shadow.png';
		TertiumConf.icons[5].iconSize = new GSize(20,34);
		TertiumConf.icons[5].shadowSize = new GSize(37,34);
		TertiumConf.icons[5].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[5].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[5].printImage = '/i/map/cof/printImage.gif';
		TertiumConf.icons[5].mozPrintImage = '/i/map/cof/mozPrintImage.gif';
		TertiumConf.icons[5].printShadow = '/i/map/cof/printShadow.gif';
		TertiumConf.icons[5].transparent = '/i/map/cof/transparent.png';
		TertiumConf.icons[5].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[6] = new GIcon();
		TertiumConf.icons[6].image = '/i/map/res/image.png';
		TertiumConf.icons[6].shadow = '/i/map/res/shadow.png';
		TertiumConf.icons[6].iconSize = new GSize(20,34);
		TertiumConf.icons[6].shadowSize = new GSize(37,34);
		TertiumConf.icons[6].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[6].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[6].printImage = '/i/map/res/printImage.gif';
		TertiumConf.icons[6].mozPrintImage = '/i/map/res/mozPrintImage.gif';
		TertiumConf.icons[6].printShadow = '/i/map/res/printShadow.gif';
		TertiumConf.icons[6].transparent = '/i/map/res/transparent.png';
		TertiumConf.icons[6].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[7] = new GIcon();
		TertiumConf.icons[7].image = '/i/map/pub/image.png';
		TertiumConf.icons[7].shadow = '/i/map/pub/shadow.png';
		TertiumConf.icons[7].iconSize = new GSize(20,34);
		TertiumConf.icons[7].shadowSize = new GSize(37,34);
		TertiumConf.icons[7].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[7].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[7].printImage = '/i/map/pub/printImage.gif';
		TertiumConf.icons[7].mozPrintImage = '/i/map/pub/mozPrintImage.gif';
		TertiumConf.icons[7].printShadow = '/i/map/pub/printShadow.gif';
		TertiumConf.icons[7].transparent = '/i/map/pub/transparent.png';
		TertiumConf.icons[7].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[8] = new GIcon();
		TertiumConf.icons[8].image = '/i/map/oth/image.png';
		TertiumConf.icons[8].shadow = '/i/map/oth/shadow.png';
		TertiumConf.icons[8].iconSize = new GSize(20,34);
		TertiumConf.icons[8].shadowSize = new GSize(37,34);
		TertiumConf.icons[8].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[8].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[8].printImage = '/i/map/oth/printImage.gif';
		TertiumConf.icons[8].mozPrintImage = '/i/map/oth/mozPrintImage.gif';
		TertiumConf.icons[8].printShadow = '/i/map/oth/printShadow.gif';
		TertiumConf.icons[8].transparent = '/i/map/oth/transparent.png';
		TertiumConf.icons[8].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

		TertiumConf.icons[9] = new GIcon();
		TertiumConf.icons[9].image = '/i/map/cnf/image.png';
		TertiumConf.icons[9].shadow = '/i/map/cnf/shadow.png';
		TertiumConf.icons[9].iconSize = new GSize(20,34);
		TertiumConf.icons[9].shadowSize = new GSize(37,34);
		TertiumConf.icons[9].iconAnchor = new GPoint(10,34);
		TertiumConf.icons[9].infoWindowAnchor = new GPoint(10,0);
		TertiumConf.icons[9].printImage = '/i/map/cnf/printImage.gif';
		TertiumConf.icons[9].mozPrintImage = '/i/map/cnf/mozPrintImage.gif';
		TertiumConf.icons[9].printShadow = '/i/map/cnf/printShadow.gif';
		TertiumConf.icons[9].transparent = '/i/map/cnf/transparent.png';
		TertiumConf.icons[9].imageMap = [13,0,15,1,16,2,17,3,18,4,18,5,19,6,19,7,19,8,19,9,19,10,19,11,19,12,19,13,18,14,18,15,17,16,16,17,15,18,14,19,14,20,13,21,13,22,12,23,12,24,12,25,12,26,11,27,11,28,11,29,11,30,11,31,11,32,11,33,8,33,8,32,8,31,8,30,8,29,8,28,8,27,8,26,7,25,7,24,7,23,6,22,6,21,5,20,5,19,4,18,3,17,2,16,1,15,1,14,0,13,0,12,0,11,0,10,0,9,0,8,0,7,0,6,1,5,1,4,2,3,3,2,4,1,6,0];

	},

	initRegisterForm : function() {
		$(document).ready(function() {
			$('input.dvc, textarea.dvc').defaultValueCleaner();
			$('.inpsubhid').css({ width:0, height:0, overflow:'hidden', visibility:'hidden' });
			$('.submit_td').html($('.submit_td').html()+'<a href="#" onclick="$(\'#frm_rm_1\').submit(); return false;" class="submit"></a>');

			var validator = $("#frm_rm_1").validate({
				rules : {
					firstname: "required",
					lastname: "required",
					email: {
						required: true,
						email: true
					},
					institution: "required",
					division: "required",
					address: "required",
					city: "required",
					postcode: "required",
					accept_payment: "required"
				}, messages: {
					firstname: "Proszę podać imię",
		            lastname: "Proszę podać nazwisko",
		            email: {
		                required: "Podanie adresu e-mail jest wymagane, będzie on używany do logowania się w serwisie",
		                email: "Proszę podać poprawny adres e-mail"
		            },
		            institution: "Proszę podać nazwę instytucji",
		            division: "Proszę podać nazwę jednostki organizacyjnej",
		            address: "Proszę podać adres",
		            city: "Proszę podać miasto",
		            postcode: "Proszę podać kod pocztowy",
		            accept_payment: "Proszę wyrazić zgodę na przetwarzanie danych osobowych"
				},
				// the errorPlacement has to take the table layout into account
		        errorPlacement: Tertium.errorPlacement,
		        // usuwanie defaultowych wartości formularza
		        submitHandler: function(form) {
		        	$('#frm_rm_1 .dvc').each(function(){
		        		if ($(this).attr('default') == $(this).val()) {
		        			this.value = '';
		        		}
		        	});
		            TertiumConf.registerFormSubmit();
		        },
		        // set this class to error-labels to indicate valid fields
		        success: function(label) {
		            // set   as text for IE
		            label.html(" ").addClass("valid");
		        }
			});

			$('.choosePresentation input').bind('click', function(e) {
			    if ((this.value == 1 && this.checked) || (this.value == 0 && !this.checked)) {
					$('.researchReport').hide();
			    } else {
					$('.researchReport').show();
			    }
			});

			//alert('x');
			if ($('#research_report').attr('checked')){
				$('.researchReport').show();
			}
			if ($('#paper_poster').attr('checked')){
				$('.researchReport').hide();
			}

		});

		return true;
	},

	registerFormSubmit : function() {
		if (!this.submitting) {
			TertiumConf.submitting = true;
		} else {
			return false;
		}

		var params = $("#frm_rm_1").serialize();
		var url = $("#frm_rm_1").attr('action');
		$.ajax({
			type: 'post',
			url: url,
			data: params,
			success: function(html) {
				$('#confreg_container').html(html);
				TertiumConf.submitting = false;
				$.scrollTo('#confreg_container');
			}
		});
	},

	reg_confirm : function(elm) {
		url = $(elm).attr('href');
		$.ajax({
			url: url,
			success: function(html) {
				$('#confreg_container').html(html);
				$.scrollTo('#confreg_container');
			}
		});

		return false;
	},

	reg_back : function(elm) {
		url = $(elm).attr('href');
		$.ajax({
			url: url,
			success: function(html) {
				$('#confreg_container').html(html);

			}
		});

		return false;
	}
};

