/* Cached at 06.09.2010 23:29:20 */
/*
 * jQuery validation plug-in 1.4
 *
 * 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 5788 2008-07-13 15:04:50Z 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() {
			result[this] = $element.attr(this);
			$element.removeAttr(this);
		});
		return result;
	},
	// http://docs.jquery.com/Plugins/Validation/rules
	rules: function(command, argument) {
		var element = this[0];
		
		if (command) {
			var staticRules = $.data(element.form, 'validator').settings.rules;
			var existingRules = $.validator.staticRules(element);
			switch(command) {
			case "add":
				$.extend(existingRules, $.validator.normalizeRule(argument));
				staticRules[element.name] = existingRules;
				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;
	},
	// destructive add
	push: function( t ) {
		return this.setArray( this.add(t).get() );
	}
});

// 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: [],
		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.",
		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);
		},

		// 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.validate", [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.push( 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().push( 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, $.trim(element.value), 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.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
				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.push( 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.push( 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.push(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 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();
			}
		},
		
		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 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;
			
			if ( previous.old !== value ) {
				previous.old = value;
				var validator = this;
				this.startRequest(element);
				var data = {};
				data[element.name] = value;
				$.ajax({
					url: param,
					mode: "abort",
					port: "validate" + element.name,
					dataType: "json",
					data: data,
					success: function(response) {
						if ( !response ) {
							var errors = {};
							errors[element.name] =  response || validator.defaultMessage( element, "remote" );
							validator.showErrors(errors);
						} else {
							var submitted = validator.formSubmitted;
							validator.prepareElement(element);
							validator.formSubmitted = submitted;
							validator.successList.push(element);
							validator.showErrors();
						}
						previous.valid = response;
						validator.stopRequest(element, response);
					}
				});
				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(value, element) >= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/maxlength
		maxlength: function(value, element, param) {
			return this.optional(element) || this.getLength(value, element) <= param;
		},
		
		// http://docs.jquery.com/Plugins/Validation/Methods/rangelength
		rangelength: function(value, element, param) {
			var length = this.getLength(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(element.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(element.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);

/**
 * jQuery.Listen
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 3/7/2008
 *
 * @projectDescription Light and fast event handling, using event delegation.
 * Homepage: http://flesler.blogspot.com/2007/10/jquerylisten.html
 * Requires jQuery 1.2.3 or higher. Tested on FF 2|IE 6/7|Safari 3|Opera 9, Windows XP.
 *
 * @author Ariel Flesler
 * @version 1.0.3
 *
 * @id jQuery.listen
 * @param {String} name Name of the event to listen (f.e: click, mouseover, etc).
 * @param {DOM Element} listener optional: The DOM element to listen from, the document element by default.
 * @param {String|Boolean} selector A simple selector in one of this formats: "#id", "tagname", ".class", or "tagname.class".
 * @param {Function} handler The event handler to register.
 *
 * Notes:
 *	-The selectors support is low in order to mantain scalability. You can use comma-separated selectors.
 *	  I consider these 4 options, the most useful and I believe they are enough for many cases.
 *	-This plugin can't handle non-bubbling events. It handles focus & blur thanks to the focusin/focusout approach.
 */
;(function( $ ){

	$.fn.indexer = function( name ){//allow public access to the indexers
		return this[0] && indexer( this[0], name ) || null;
	};
	$.indexer = function( name ){
		return indexer( document, name );	
	};

	var $event = $.event,
		$special = $event.special,
		$listen = $.listen = function( name, listener, selector, handler ){
			if( typeof listener != 'object' ){ //document is the default listener
				handler = selector;
				selector = listener;
				listener = document;
			}
			each( name.split(/\s+/), function( ev ){
				ev = $listen.fixes[ev] || ev;//try to use a fixed event.
				var idxer = indexer( listener, ev ) || indexer( listener, ev, new Indexer(ev,listener) );

				idxer.append( selector, handler );// register the handler.
				idxer.start();
			});
		},
		indexer = function( elem, name, val ){
			return $.data( elem, name+'.indexer', val );	
		};

	$.extend( $listen, {
		regex: /^((?:\w*?|\*))(?:([#.])([\w-]+))?$/, //matches "#id", "tag", ".class" or "tag.class", also "tag#id" but the tag is ignored.
		fixes: { //registry of replacement for non-bubbling events, you can add more ( please fix change for IE :) )
			focus:'focusin',
			blur:'focusout'	
		},
		cache:function( on ){
			this.caching = on;
		}
	});

	//taken and adapted from http://dev.jquery.com/browser/trunk/plugins/validate/lib/jquery.delegate.js?rev=4374	
	$.each( $listen.fixes, function( original, fix ){
		$special[fix] = {
			setup:function() { 
                if ( $.browser.msie ) return false; 
                this.addEventListener( original, $special[fix].handler, true );
            }, 
            teardown:function() { 
                if ( $.browser.msie ) return false; 
                this.removeEventListener( original, $special[fix].handler, true ); 
            }, 
            handler: function(e) { 
                arguments[0] = e = $event.fix(e);
                e.type = fix;
                return $event.handle.apply(this, arguments); 
            }
		};
	});

	$.fn.listen = function( name, selector, handler ){//listen using the prototype
		return this.each(function(){
			$listen( name, this, selector, handler );						  
		});
	};	

	function Indexer( name, listener ){
		$.extend( this, {
			ids: {},
			tags: {},
			listener: listener,
			event: name
		});
		this.id = Indexer.instances.push( this );//for cleaning up later
	};
	Indexer.instances = [ ];

	Indexer.prototype = {
		constructor: Indexer,
		handle:function( e ){
			var sp = e.stopPropagation;//intercept any call to stopPropagation
			e.stopPropagation = function(){
				e.stopped = true;
				sp.apply(this,arguments);	
			};
			indexer(this,e.type).parse( e );
			e.stopPropagation = sp;//revert
			sp = e.data = null;//cleanup			
		},
		on:false,
		bubbles:false,
		start:function(){//start listening (bind)
			if( !this.on ){ //avoid duplicates
				$event.add( this.listener, this.event, this.handle );
				this.on = true;
			}
		},
		stop:function(){//stop listening (unbind)
			if( this.on ){
				$event.remove( this.listener, this.event, this.handle );
				this.on = false;
			}
		},
		cache:function( node, handlers ){
			return $.data( node, 'listenCache_' + this.id, handlers );
		},
		parse:function( e ){
			var node = e.data || e.target,
				args = arguments, handlers;

			if( !$listen.caching || !( handlers = this.cache(node) ) ){//try to retrieve cached handlers
				handlers = [ ];			

				if( node.id && this.ids[node.id] )//if this node has an id and there are handlers registered to it..
					push( handlers, this.ids[node.id] );

				each([ node.nodeName, '*' ], function( tag ){//look for handlers registered by name.class.
					var klasses = this.tags[tag];
					if( klasses )
						each( (node.className + ' *').split(' '), function( klass ){
							if( klass && klasses[klass] )
								push( handlers, klasses[klass] );//append the handlers to the list.
						});
				}, this);
				
				if( $listen.caching )
					this.cache( node, handlers );
			}

			if( handlers[0] ){
				each( handlers, function( handler ){
					if( handler.apply(node, args) === false ){
						e.preventDefault();
						e.stopPropagation();	
					}
				});
			}

			if( !e.stopped && (node = node.parentNode) && (node.nodeName == 'A' || this.bubbles && node != this.listener) ){//go up ?
				e.data = node;//I rather not alter e.target, it might be used.
				this.parse( e );
			}
			handlers = args = node = null;//cleanup
		},
		append:function( selector, handler ){
			each( selector.split(/\s*,\s*/), function(selector){//support comma separated selectors
				var match = $listen.regex.exec( selector );
				if( !match )
					throw '$.listen > "' + selector + '" is not a supported selector.';
				var 
					id = match[2] == '#' && match[3],
					tag = match[1].toUpperCase() || '*',
					klass =	match[3] || '*';
				if( id )//we have an id, register the handler to it.
					(this.ids[id] || (this.ids[id] = [ ])).push( handler );
				else if( tag ){//we have an name and/or class
					tag = this.tags[tag] = this.tags[tag] || { };
					(tag[klass] || (tag[klass] = [ ])).push( handler );
				}
			}, this );
		}
	};

	function each( arr, fn, scope ){
		for(var i=0, l=arr.length; i < l; i++ )
			fn.call( scope, arr[i], i );
	};
	function push( arr, elems ){
		arr.push.apply( arr, elems );
		return arr;
	};

	$(window).unload(function(){// cleanup
		if( typeof Indexer == 'function' ) 
			each( Indexer.instances, function(idxer){
				idxer.stop();
				$.removeData( idxer.listener, idxer.event + '.indexer' );
				idxer.ids = idxer.names = idxer.listener = null;
			});
	});

})( jQuery );
/*
 * jQuery UI Effects 1.5.2
 *
 * Copyright (c) 2008 Aaron Eisenberger (aaronchi@gmail.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 * 
 * http://docs.jquery.com/UI/Effects/
 */
;(function($) {

$.effects = $.effects || {}; //Add the 'effects' scope

$.extend($.effects, {
	save: function(el, set) {
		for(var i=0;i<set.length;i++) {
			if(set[i] !== null) $.data(el[0], "ec.storage."+set[i], el[0].style[set[i]]);
		}
	},
	restore: function(el, set) {
		for(var i=0;i<set.length;i++) {
			if(set[i] !== null) el.css(set[i], $.data(el[0], "ec.storage."+set[i]));
		}
	},
	setMode: function(el, mode) {
		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
		return mode;
	},
	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
		// this should be a little more flexible in the future to handle a string & hash
		var y, x;
		switch (origin[0]) {
			case 'top': y = 0; break;
			case 'middle': y = 0.5; break;
			case 'bottom': y = 1; break;
			default: y = origin[0] / original.height;
		};
		switch (origin[1]) {
			case 'left': x = 0; break;
			case 'center': x = 0.5; break;
			case 'right': x = 1; break;
			default: x = origin[1] / original.width;
		};
		return {x: x, y: y};
	},
	createWrapper: function(el) {
		if (el.parent().attr('id') == 'fxWrapper')
			return el;
		var props = {width: el.outerWidth({margin:true}), height: el.outerHeight({margin:true}), 'float': el.css('float')};
		el.wrap('<div id="fxWrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');
		var wrapper = el.parent();
		if (el.css('position') == 'static'){
			wrapper.css({position: 'relative'});
			el.css({position: 'relative'});
		} else {
			var top = el.css('top'); if(isNaN(parseInt(top))) top = 'auto';
			var left = el.css('left'); if(isNaN(parseInt(left))) left = 'auto';
			wrapper.css({ position: el.css('position'), top: top, left: left, zIndex: el.css('z-index') }).show();
			el.css({position: 'relative', top:0, left:0});
		}
		wrapper.css(props);
		return wrapper;
	},
	removeWrapper: function(el) {
		if (el.parent().attr('id') == 'fxWrapper')
			return el.parent().replaceWith(el);
		return el;
	},
	setTransition: function(el, list, factor, val) {
		val = val || {};
		$.each(list,function(i, x){
			unit = el.cssUnit(x);
			if (unit[0] > 0) val[x] = unit[0] * factor + unit[1];
		});
		return val;
	},
	animateClass: function(value, duration, easing, callback) {

		var cb = (typeof easing == "function" ? easing : (callback ? callback : null));
		var ea = (typeof easing == "object" ? easing : null);

		return this.each(function() {

			var offset = {}; var that = $(this); var oldStyleAttr = that.attr("style") || '';
			if(typeof oldStyleAttr == 'object') oldStyleAttr = oldStyleAttr["cssText"]; /* Stupidly in IE, style is a object.. */
			if(value.toggle) { that.hasClass(value.toggle) ? value.remove = value.toggle : value.add = value.toggle; }

			//Let's get a style offset
			var oldStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
			if(value.add) that.addClass(value.add); if(value.remove) that.removeClass(value.remove);
			var newStyle = $.extend({}, (document.defaultView ? document.defaultView.getComputedStyle(this,null) : this.currentStyle));
			if(value.add) that.removeClass(value.add); if(value.remove) that.addClass(value.remove);

			// The main function to form the object for animation
			for(var n in newStyle) {
				if( typeof newStyle[n] != "function" && newStyle[n] /* No functions and null properties */
				&& n.indexOf("Moz") == -1 && n.indexOf("length") == -1 /* No mozilla spezific render properties. */
				&& newStyle[n] != oldStyle[n] /* Only values that have changed are used for the animation */
				&& (n.match(/color/i) || (!n.match(/color/i) && !isNaN(parseInt(newStyle[n],10)))) /* Only things that can be parsed to integers or colors */
				&& (oldStyle.position != "static" || (oldStyle.position == "static" && !n.match(/left|top|bottom|right/))) /* No need for positions when dealing with static positions */
				) offset[n] = newStyle[n];
			}

			that.animate(offset, duration, ea, function() { // Animate the newly constructed offset object
				// Change style attribute back to original. For stupid IE, we need to clear the damn object.
				if(typeof $(this).attr("style") == 'object') { $(this).attr("style")["cssText"] = ""; $(this).attr("style")["cssText"] = oldStyleAttr; } else $(this).attr("style", oldStyleAttr);
				if(value.add) $(this).addClass(value.add); if(value.remove) $(this).removeClass(value.remove);
				if(cb) cb.apply(this, arguments);
			});

		});
	}
});

//Extend the methods of jQuery
$.fn.extend({
	//Save old methods
	_show: $.fn.show,
	_hide: $.fn.hide,
	__toggle: $.fn.toggle,
	_addClass: $.fn.addClass,
	_removeClass: $.fn.removeClass,
	_toggleClass: $.fn.toggleClass,
	// New ec methods
	effect: function(fx,o,speed,callback) {
		return $.effects[fx] ? $.effects[fx].call(this, {method: fx, options: o || {}, duration: speed, callback: callback }) : null;
	},
	show: function() {
		if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
			return this._show.apply(this, arguments);
		else {
			var o = arguments[1] || {}; o['mode'] = 'show';
			return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
		}
	},
	hide: function() {
		if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])))
			return this._hide.apply(this, arguments);
		else {
			var o = arguments[1] || {}; o['mode'] = 'hide';
			return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
		}
	},
	toggle: function(){
		if(!arguments[0] || (arguments[0].constructor == Number || /(slow|normal|fast)/.test(arguments[0])) || (arguments[0].constructor == Function))
			return this.__toggle.apply(this, arguments);
		else {
			var o = arguments[1] || {}; o['mode'] = 'toggle';
			return this.effect.apply(this, [arguments[0], o, arguments[2] || o.duration, arguments[3] || o.callback]);
		}
	},
	addClass: function(classNames,speed,easing,callback) {
		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
	},
	removeClass: function(classNames,speed,easing,callback) {
		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
	},
	toggleClass: function(classNames,speed,easing,callback) {
		return speed ? $.effects.animateClass.apply(this, [{ toggle: classNames },speed,easing,callback]) : this._toggleClass(classNames);
	},
	morph: function(remove,add,speed,easing,callback) {
		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
	},
	switchClass: function() {
		return this.morph.apply(this, arguments);
	},
	// helper functions
	cssUnit: function(key) {
		var style = this.css(key), val = [];
		$.each( ['em','px','%','pt'], function(i, unit){
			if(style.indexOf(unit) > 0)
				val = [parseFloat(style), unit];
		});
		return val;
	}
});

/*
 * jQuery Color Animations
 * Copyright 2007 John Resig
 * Released under the MIT and GPL licenses.
 */

// We override the animation for all of these color styles
jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
		jQuery.fx.step[attr] = function(fx){
				if ( fx.state == 0 ) {
						fx.start = getColor( fx.elem, attr );
						fx.end = getRGB( fx.end );
				}

				fx.elem.style[attr] = "rgb(" + [
						Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
						Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
						Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
				].join(",") + ")";
		}
});

// Color Conversion functions from highlightFade
// By Blair Mitchelmore
// http://jquery.offput.ca/highlightFade/

// Parse strings looking for color tuples [255,255,255]
function getRGB(color) {
		var result;

		// Check if we're already dealing with an array of colors
		if ( color && color.constructor == Array && color.length == 3 )
				return color;

		// Look for rgb(num,num,num)
		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
				return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];

		// Look for rgb(num%,num%,num%)
		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

		// Look for #a0b1c2
		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

		// Look for #fff
		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
				return colors['transparent']

		// Otherwise, we're most likely dealing with a named color
		return colors[jQuery.trim(color).toLowerCase()];
}

function getColor(elem, attr) {
		var color;

		do {
				color = jQuery.curCSS(elem, attr);

				// Keep going until we find an element that has color, or we hit the body
				if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
						break;

				attr = "backgroundColor";
		} while ( elem = elem.parentNode );

		return getRGB(color);
};

// Some named colors to work with
// From Interface by Stefan Petre
// http://interface.eyecon.ro/

var colors = {
	aqua:[0,255,255],
	azure:[240,255,255],
	beige:[245,245,220],
	black:[0,0,0],
	blue:[0,0,255],
	brown:[165,42,42],
	cyan:[0,255,255],
	darkblue:[0,0,139],
	darkcyan:[0,139,139],
	darkgrey:[169,169,169],
	darkgreen:[0,100,0],
	darkkhaki:[189,183,107],
	darkmagenta:[139,0,139],
	darkolivegreen:[85,107,47],
	darkorange:[255,140,0],
	darkorchid:[153,50,204],
	darkred:[139,0,0],
	darksalmon:[233,150,122],
	darkviolet:[148,0,211],
	fuchsia:[255,0,255],
	gold:[255,215,0],
	green:[0,128,0],
	indigo:[75,0,130],
	khaki:[240,230,140],
	lightblue:[173,216,230],
	lightcyan:[224,255,255],
	lightgreen:[144,238,144],
	lightgrey:[211,211,211],
	lightpink:[255,182,193],
	lightyellow:[255,255,224],
	lime:[0,255,0],
	magenta:[255,0,255],
	maroon:[128,0,0],
	navy:[0,0,128],
	olive:[128,128,0],
	orange:[255,165,0],
	pink:[255,192,203],
	purple:[128,0,128],
	violet:[128,0,128],
	red:[255,0,0],
	silver:[192,192,192],
	white:[255,255,255],
	yellow:[255,255,0],
	transparent: [255,255,255]
};
	
/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
 *
 * Uses the built in easing capabilities added In jQuery 1.1
 * to offer multiple easing options
 *
 * TERMS OF USE - jQuery Easing
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2008 George McGinley Smith
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
*/

// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

/*
 *
 * TERMS OF USE - EASING EQUATIONS
 * 
 * Open source under the BSD License. 
 * 
 * Copyright © 2001 Robert Penner
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * Redistributions of source code must retain the above copyright notice, this list of 
 * conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright notice, this list 
 * of conditions and the following disclaimer in the documentation and/or other materials 
 * provided with the distribution.
 * 
 * Neither the name of the author nor the names of contributors may be used to endorse 
 * or promote products derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
 * OF THE POSSIBILITY OF SUCH DAMAGE. 
 *
 */

})(jQuery);

/* Copyright (c) 2007 Paul Bakaus (paul.bakaus@googlemail.com) and Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * $LastChangedDate: 2007-10-06 20:11:15 +0200 (Sa, 06 Okt 2007) $
 * $Rev: 3581 $
 *
 * Version: @VERSION
 *
 * Requires: jQuery 1.2+
 */

(function($){
	
$.dimensions = {
	version: '@VERSION'
};

// Create innerHeight, innerWidth, outerHeight and outerWidth methods
$.each( [ 'Height', 'Width' ], function(i, name){
	
	// innerHeight and innerWidth
	$.fn[ 'inner' + name ] = function() {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		return num( this, name.toLowerCase() ) + num(this, 'padding' + torl) + num(this, 'padding' + borr);
	};
	
	// outerHeight and outerWidth
	$.fn[ 'outer' + name ] = function(options) {
		if (!this[0]) return;
		
		var torl = name == 'Height' ? 'Top'    : 'Left',  // top or left
		    borr = name == 'Height' ? 'Bottom' : 'Right'; // bottom or right
		
		options = $.extend({ margin: false }, options || {});
		
		return num( this, name.toLowerCase() )
				+ num(this, 'border' + torl + 'Width') + num(this, 'border' + borr + 'Width')
				+ num(this, 'padding' + torl) + num(this, 'padding' + borr)
				+ (options.margin ? (num(this, 'margin' + torl) + num(this, 'margin' + borr)) : 0);
	};
});

// Create scrollLeft and scrollTop methods
$.each( ['Left', 'Top'], function(i, name) {
	$.fn[ 'scroll' + name ] = function(val) {
		if (!this[0]) return;
		
		return val != undefined ?
		
			// Set the scroll offset
			this.each(function() {
				this == window || this == document ?
					window.scrollTo( 
						name == 'Left' ? val : $(window)[ 'scrollLeft' ](),
						name == 'Top'  ? val : $(window)[ 'scrollTop'  ]()
					) :
					this[ 'scroll' + name ] = val;
			}) :
			
			// Return the scroll offset
			this[0] == window || this[0] == document ?
				self[ (name == 'Left' ? 'pageXOffset' : 'pageYOffset') ] ||
					$.boxModel && document.documentElement[ 'scroll' + name ] ||
					document.body[ 'scroll' + name ] :
				this[0][ 'scroll' + name ];
	};
});

$.fn.extend({
	position: function() {
		var left = 0, top = 0, elem = this[0], offset, parentOffset, offsetParent, results;
		
		if (elem) {
			// Get *real* offsetParent
			offsetParent = this.offsetParent();
			
			// Get correct offsets
			offset       = this.offset();
			parentOffset = offsetParent.offset();
			
			// Subtract element margins
			offset.top  -= num(elem, 'marginTop');
			offset.left -= num(elem, 'marginLeft');
			
			// Add offsetParent borders
			parentOffset.top  += num(offsetParent, 'borderTopWidth');
			parentOffset.left += num(offsetParent, 'borderLeftWidth');
			
			// Subtract the two offsets
			results = {
				top:  offset.top  - parentOffset.top,
				left: offset.left - parentOffset.left
			};
		}
		
		return results;
	},
	
	offsetParent: function() {
		var offsetParent = this[0].offsetParent;
		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && $.css(offsetParent, 'position') == 'static') )
			offsetParent = offsetParent.offsetParent;
		return $(offsetParent);
	}
});

function num(el, prop) {
	return parseInt($.css(el.jquery?el[0]:el,prop))||0;
};

})(jQuery);
/*
 * jQuery UI Accordion 1.6
 * 
 * Copyright (c) 2007 Jörn Zaefferer
 *
 * http://docs.jquery.com/UI/Accordion
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.accordion.js 4876 2008-03-08 11:49:04Z joern.zaefferer $
 *
 */

;(function($) {
	
// If the UI scope is not available, add it
$.ui = $.ui || {};

$.fn.extend({
	accordion: function(options, data) {
		var args = Array.prototype.slice.call(arguments, 1);

		return this.each(function() {
			if (typeof options == "string") {
				var accordion = $.data(this, "ui-accordion");
				accordion[options].apply(accordion, args);
			// INIT with optional options
			} else if (!$(this).is(".ui-accordion"))
				$.data(this, "ui-accordion", new $.ui.accordion(this, options));
		});
	},
	// deprecated, use accordion("activate", index) instead
	activate: function(index) {
		return this.accordion("activate", index);
	}
});

$.ui.accordion = function(container, options) {
	
	// setup configuration
	this.options = options = $.extend({}, $.ui.accordion.defaults, options);
	this.element = container;
	
	$(container).addClass("ui-accordion");
	
	if ( options.navigation ) {
		var current = $(container).find("a").filter(options.navigationFilter);
		if ( current.length ) {
			if ( current.filter(options.header).length ) {
				options.active = current;
			} else {
				options.active = current.parent().parent().prev();
				current.addClass("current");
			}
		}
	}
	
	// calculate active if not specified, using the first header
	options.headers = $(container).find(options.header);
	options.active = findActive(options.headers, options.active);

	if ( options.fillSpace ) {
		var maxHeight = $(container).parent().height();
		options.headers.each(function() {
			maxHeight -= $(this).outerHeight();
		});
		var maxPadding = 0;
		options.headers.next().each(function() {
			maxPadding = Math.max(maxPadding, $(this).innerHeight() - $(this).height());
		}).height(maxHeight - maxPadding);
	} else if ( options.autoheight ) {
		var maxHeight = 0;
		options.headers.next().each(function() {
			maxHeight = Math.max(maxHeight, $(this).outerHeight());
		}).height(maxHeight);
	}

	options.headers
		.not(options.active || "")
		.next()
		.hide();
	options.active.parent().andSelf().addClass(options.selectedClass);
	
	if (options.event)
		$(container).bind((options.event) + ".ui-accordion", clickHandler);
};

$.ui.accordion.prototype = {
	activate: function(index) {
		// call clickHandler with custom event
		clickHandler.call(this.element, {
			target: findActive( this.options.headers, index )[0]
		});
	},
	
	enable: function() {
		this.options.disabled = false;
	},
	disable: function() {
		this.options.disabled = true;
	},
	destroy: function() {
		this.options.headers.next().css("display", "");
		if ( this.options.fillSpace || this.options.autoheight ) {
			this.options.headers.next().css("height", "");
		}
		$.removeData(this.element, "ui-accordion");
		$(this.element).removeClass("ui-accordion").unbind(".ui-accordion");
	}
}

function scopeCallback(callback, scope) {
	return function() {
		return callback.apply(scope, arguments);
	};
}

function completed(cancel) {
	// if removed while animated data can be empty
	if (!$.data(this, "ui-accordion"))
		return;
	var instance = $.data(this, "ui-accordion");
	var options = instance.options;
	options.running = cancel ? 0 : --options.running;
	if ( options.running )
		return;
	if ( options.clearStyle ) {
		options.toShow.add(options.toHide).css({
			height: "",
			overflow: ""
		});
	}
	$(this).triggerHandler("change.ui-accordion", [options.data], options.change);
}

function toggle(toShow, toHide, data, clickedActive, down) {
	var options = $.data(this, "ui-accordion").options;
	options.toShow = toShow;
	options.toHide = toHide;
	options.data = data;
	var complete = scopeCallback(completed, this);
	
	// count elements to animate
	options.running = toHide.size() == 0 ? toShow.size() : toHide.size();
	
	if ( options.animated ) {
		if ( !options.alwaysOpen && clickedActive ) {
			$.ui.accordion.animations[options.animated]({
				toShow: jQuery([]),
				toHide: toHide,
				complete: complete,
				down: down,
				autoheight: options.autoheight
			});
		} else {
			$.ui.accordion.animations[options.animated]({
				toShow: toShow,
				toHide: toHide,
				complete: complete,
				down: down,
				autoheight: options.autoheight
			});
		}
	} else {
		if ( !options.alwaysOpen && clickedActive ) {
			toShow.toggle();
		} else {
			toHide.hide();
			toShow.show();
		}
		complete(true);
	}
}

function clickHandler(event) {
	var options = $.data(this, "ui-accordion").options;
	if (options.disabled)
		return false;
	
	// called only when using activate(false) to close all parts programmatically
	if ( !event.target && !options.alwaysOpen ) {
		options.active.parent().andSelf().toggleClass(options.selectedClass);
		var toHide = options.active.next(),
			data = {
				instance: this,
				options: options,
				newHeader: jQuery([]),
				oldHeader: options.active,
				newContent: jQuery([]),
				oldContent: toHide
			},
			toShow = options.active = $([]);
		toggle.call(this, toShow, toHide, data );
		return false;
	}
	// get the click target
	var clicked = $(event.target);
	
	// due to the event delegation model, we have to check if one
	// of the parent elements is our actual header, and find that
	if ( clicked.parents(options.header).length )
		while ( !clicked.is(options.header) )
			clicked = clicked.parent();
	
	var clickedActive = clicked[0] == options.active[0];
	
	// if animations are still active, or the active header is the target, ignore click
	if (options.running || (options.alwaysOpen && clickedActive))
		return false;
	if (!clicked.is(options.header))
		return;

	// switch classes
	options.active.parent().andSelf().toggleClass(options.selectedClass);
	if ( !clickedActive ) {
		clicked.parent().andSelf().addClass(options.selectedClass);
	}

	// find elements to show and hide
	var toShow = clicked.next(),
		toHide = options.active.next(),
		//data = [clicked, options.active, toShow, toHide],
		data = {
			instance: this,
			options: options,
			newHeader: clicked,
			oldHeader: options.active,
			newContent: toShow,
			oldContent: toHide
		},
		down = options.headers.index( options.active[0] ) > options.headers.index( clicked[0] );
	
	options.active = clickedActive ? $([]) : clicked;
	toggle.call(this, toShow, toHide, data, clickedActive, down );

	return false;
};

function findActive(headers, selector) {
	return selector != undefined
		? typeof selector == "number"
			? headers.filter(":eq(" + selector + ")")
			: headers.not(headers.not(selector))
		: selector === false
			? $([])
			: headers.filter(":eq(0)");
}

$.extend($.ui.accordion, {
	defaults: {
		selectedClass: "selected",
		alwaysOpen: true,
		animated: 'slide',
		event: "click",
		header: "a",
		autoheight: true,
		running: 0,
		navigationFilter: function() {
			return this.href.toLowerCase() == location.href.toLowerCase();
		}
	},
	animations: {
		slide: function(options, additions) {
			options = $.extend({
				easing: "swing",
				duration: 300
			}, options, additions);
			if ( !options.toHide.size() ) {
				options.toShow.animate({height: "show"}, options);
				return;
			}
			var hideHeight = options.toHide.height(),
				showHeight = options.toShow.height(),
				difference = showHeight / hideHeight;
			options.toShow.css({ height: 0, overflow: 'hidden' }).show();
			options.toHide.filter(":hidden").each(options.complete).end().filter(":visible").animate({height:"hide"},{
				step: function(now) {
					var current = (hideHeight - now) * difference;
					if ($.browser.msie || $.browser.opera) {
						current = Math.ceil(current);
					}
					options.toShow.height( current );
				},
				duration: options.duration,
				easing: options.easing,
				complete: function() {
					if ( !options.autoheight ) {
						options.toShow.css("height", "auto");
					}
					options.complete();
				}
			});
		},
		bounceslide: function(options) {
			this.slide(options, {
				easing: options.down ? "bounceout" : "swing",
				duration: options.down ? 1000 : 200
			});
		},
		easeslide: function(options) {
			this.slide(options, {
				easing: "easeinout",
				duration: 700
			})
		}
	}
});

})(jQuery);

/*
* hSlides (1.0) // 2008.02.25 // <http://plugins.jquery.com/project/hslides>
* 
* REQUIRES jQuery 1.2.3+ <http://jquery.com/>
* 
* Copyright (c) 2008 TrafficBroker <http://www.trafficbroker.co.uk>
* Licensed under GPL and MIT licenses
* 
* @author    Jesus Carrera <jesus.carrera@trafficbroker.co.uk>
*/
(function(A){A.fn.hSlides=function(B){B=A.extend({},A.fn.hSlides.defaults,B);return this.each(function(){var C=this;var J=0;var F=A(B.panelSelector,C);var D=1;if(B.panelPositioning!="top"){J=(A(B.panelSelector,C).length-1)*B.minPanelWidth;F=A(B.panelSelector,C).reverse();D=-1}A(this).css("position","relative").css("overflow","hidden").css("width",B.totalWidth).css("height",B.totalHeight);var G=0;F.each(function(){A(this).css("position","absolute").css("left",J).css("zIndex",G).css("height",B.totalHeight).css("width",B.maxPanelWidth);G++;if(A(this).hasClass(B.activeClass)){A.data(A(this)[0],"active",true);if(B.panelPositioning!="top"){J=(A(B.panelSelector,C).index(this)+1)*B.minPanelWidth-B.maxPanelWidth}else{J=J+B.maxPanelWidth}}else{if(B.midPanelWidth&&A(B.panelSelector,C).hasClass(B.activeClass)==false){J=J+B.midPanelWidth*D}else{J=J+B.minPanelWidth*D}}});var E=function(){var L=A(B.panelSelector,C).index(this);F.each(function(){if(A.data(A(this)[0],"active")==true){A.data(A(this)[0],"active",false);A(this).removeClass(B.activeClass).each(B.onLeave)}var M=A(B.panelSelector,C).index(this);J=B.minPanelWidth*M;if((M*D)>(L*D)){J=J+(B.maxPanelWidth-B.minPanelWidth)*D}A(this).animate({left:J},B.speed,B.easing)});A.data(A(this)[0],"active",true);A(this).addClass(B.activeClass).each(B.onEnter)};var I=function(){var L=0;if(B.panelPositioning!="top"){L=(A(B.panelSelector,C).length-1)*B.minPanelWidth}F.each(function(){A(this).removeClass(B.activeClass).animate({left:L},B.speed,B.easing);if(A.data(A(this)[0],"active")==true){A.data(A(this)[0],"active",false);A(this).each(B.onLeave)}L=L+B.midPanelWidth*D})};if(B.eventHandler=="click"){A(B.panelSelector,C).click(E)}else{var H={sensitivity:B.sensitivity,interval:B.interval,over:E,timeout:B.timeout,out:function(){}};var K={sensitivity:B.sensitivity,interval:B.interval,over:function(){},timeout:B.timeout,out:I};A(B.panelSelector,C).hoverIntent(H);if(B.midPanelWidth!=0){A(C).hoverIntent(K)}}})};A.fn.reverse=function(){return this.pushStack(this.get().reverse(),arguments)};A.fn.hSlides.defaults={totalWidth:0,totalHeight:0,minPanelWidth:0,maxPanelWidth:0,midPanelWidth:0,speed:1000,easing:"swing",sensitivity:3,interval:200,timeout:300,eventHandler:"click",panelSelector:"li",activeClass:false,panelPositioning:"top",onEnter:function(){},onLeave:function(){}}})(jQuery);
/*
 * jQuery blockUI plugin
 * Version 2.10 (10/22/2008)
 * @requires jQuery v1.2.3 or later
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007-2008 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
 */

;(function($) {

if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
    alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
    return;
}

// global $ methods for blocking/unblocking the entire page
$.blockUI   = function(opts) { install(window, opts); };
$.unblockUI = function(opts) { remove(window, opts); };

// plugin method for blocking element content
$.fn.block = function(opts) {
    return this.each(function() {
        if ($.css(this,'position') == 'static')
            this.style.position = 'relative';
        if ($.browser.msie) 
            this.style.zoom = 1; // force 'hasLayout'
        install(this, opts);
    });
};

// plugin method for unblocking element content
$.fn.unblock = function(opts) {
    return this.each(function() {
        remove(this, opts);
    });
};

$.blockUI.version = 2.09; // 2nd generation blocking at no extra cost!

// override these in your code to change the default behavior and style
$.blockUI.defaults = {
    // message displayed when blocking (use null for no message)
    message:  '<h1>Please wait...</h1>',
    
    // styles for the message when blocking; if you wish to disable
    // these and use an external stylesheet then do this in your code:
    // $.blockUI.defaults.css = {};
    css: { 
        padding:        0,
        margin:         0,
        width:          '30%', 
        top:            '40%', 
        left:           '35%', 
        textAlign:      'center', 
        color:          '#000', 
        border:         '3px solid #aaa',
        backgroundColor:'#fff',
        cursor:         'wait'
    },
    
    // styles for the overlay
    overlayCSS:  { 
        backgroundColor:'#000', 
        opacity:        '0.6' 
    },
    
    // z-index for the blocking overlay
    baseZ: 1000,
    
    // set these to true to have the message automatically centered
    centerX: true, // <-- only effects element blocking (page block controlled via css above)
    centerY: true,
    
    // allow body element to be stetched in ie6; this makes blocking look better
    // on "short" pages.  disable if you wish to prevent changes to the body height
    allowBodyStretch: true,
    
    // be default blockUI will supress tab navigation from leaving blocking content;
    constrainTabKey: true,
    
    // fadeOut time in millis; set to 0 to disable fadeout on unblock
    fadeOut:  400,
    
    // if true, focus will be placed in the first available input field when
    // page blocking
    focusInput: true,
    
    // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
    applyPlatformOpacityRules: true,
    
    // callback method invoked when unblocking has completed; the callback is
    // passed the element that has been unblocked (which is the window object for page
    // blocks) and the options that were passed to the unblock call:
    //     onUnblock(element, options)
    onUnblock: null,
    
    // don't ask (if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493)
    quirksmodeOffsetHack: 4
};

// private data and functions follow...

var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent);
var pageBlock = null;
var pageBlockEls = [];

function install(el, opts) {
    var full = (el == window);
    var msg = opts && opts.message !== undefined ? opts.message : undefined;
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
    var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
    msg = msg === undefined ? opts.message : msg;

    // remove the current block (if there is one)
    if (full && pageBlock) 
        remove(window, {fadeOut:0}); 
    
    // if an existing element is being used as the blocking content then we capture
    // its current place in the DOM (and current display style) so we can restore
    // it when we unblock
    if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
        var node = msg.jquery ? msg[0] : msg;
        var data = {};
        $(el).data('blockUI.history', data);
        data.el = node;
        data.parent = node.parentNode;
        data.display = node.style.display;
        data.position = node.style.position;
        data.parent.removeChild(node);
    }
    
    var z = opts.baseZ;
    
    // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
    // layer1 is the iframe layer which is used to supress bleed through of underlying content
    // layer2 is the overlay layer which has opacity and a wait cursor
    // layer3 is the message content that is displayed while blocking
    
    var lyr1 = ($.browser.msie) ? $('<iframe class="blockUI" style="z-index:'+ z++ +';border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="javascript:false;"></iframe>')
                                : $('<div class="blockUI" style="display:none"></div>');
    var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ z++ +';cursor:wait;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
    var lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';position:fixed"></div>')
                    : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>');

    // if we have a message, style it
    if (msg) 
        lyr3.css(css);

    // style the overlay
    if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform))) 
        lyr2.css(opts.overlayCSS);
    lyr2.css('position', full ? 'fixed' : 'absolute');
    
    // make iframe layer transparent in IE
    if ($.browser.msie) 
        lyr1.css('opacity','0.0');

    $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
    
    // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
    var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
    if (ie6 || expr) {
        // give body 100% height
        if (full && opts.allowBodyStretch && $.boxModel)
            $('html,body').css('height','100%');

        // fix ie6 issue when blocked element has a border width
        if ((ie6 || !$.boxModel) && !full) {
            var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
            var fixT = t ? '(0 - '+t+')' : 0;
            var fixL = l ? '(0 - '+l+')' : 0;
        }

        // simulate fixed position
        $.each([lyr1,lyr2,lyr3], function(i,o) {
            var s = o[0].style;
            s.position = 'absolute';
            if (i < 2) {
                full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
                     : s.setExpression('height','this.parentNode.offsetHeight + "px"');
                full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
                     : s.setExpression('width','this.parentNode.offsetWidth + "px"');
                if (fixL) s.setExpression('left', fixL);
                if (fixT) s.setExpression('top', fixT);
            }
            else if (opts.centerY) {
                if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
                s.marginTop = 0;
            }
        });
    }
    
    // show the message
    lyr3.append(msg).show();
    if (msg && (msg.jquery || msg.nodeType))
        $(msg).show();

    // bind key and mouse events
    bind(1, el, opts);
        
    if (full) {
        pageBlock = lyr3[0];
        pageBlockEls = $(':input:enabled:visible',pageBlock);
        if (opts.focusInput)
            setTimeout(focus, 20);
    }
    else
        center(lyr3[0], opts.centerX, opts.centerY);
};

// remove the block
function remove(el, opts) {
    var full = el == window;
    var data = $(el).data('blockUI.history');
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    bind(0, el, opts); // unbind events
    var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el);
    
    if (full) 
        pageBlock = pageBlockEls = null;

    if (opts.fadeOut) {
        els.fadeOut(opts.fadeOut);
        setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
    }
    else
        reset(els, data, opts, el);
};

// move blocking element back into the DOM where it started
function reset(els,data,opts,el) {
    els.each(function(i,o) {
        // remove via DOM calls so we don't lose event handlers
        if (this.parentNode) 
            this.parentNode.removeChild(this);
    });
    if (data && data.el) {
        data.el.style.display = data.display;
        data.el.style.position = data.position;
        data.parent.appendChild(data.el);
        $(data.el).removeData('blockUI.history');
    }
    if (typeof opts.onUnblock == 'function')
        opts.onUnblock(el,opts);
};

// bind/unbind the handler
function bind(b, el, opts) {
    var full = el == window, $el = $(el);
    
    // don't bother unbinding if there is nothing to unbind
    if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) 
        return;
    if (!full) 
        $el.data('blockUI.isBlocked', b);
        
    // bind anchors and inputs for mouse and key events
    var events = 'mousedown mouseup keydown keypress click';
    b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);

// former impl...
//    var $e = $('a,:input');
//    b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
};

// event handler to suppress keyboard/mouse events when blocking
function handler(e) {
    // allow tab navigation (conditionally)
    if (e.keyCode && e.keyCode == 9) {
        if (pageBlock && e.data.constrainTabKey) {
            var els = pageBlockEls;
            var fwd = !e.shiftKey && e.target == els[els.length-1];
            var back = e.shiftKey && e.target == els[0];
            if (fwd || back) {
                setTimeout(function(){focus(back)},10);
                return false;
            }
        }
    }
    // allow events within the message content
    if ($(e.target).parents('div.blockMsg').length > 0)
        return true;
        
    // allow events for content that is not being blocked
    return $(e.target).parents().children().filter('div.blockUI').length == 0;
};

function focus(back) {
    if (!pageBlockEls) 
        return;
    var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
    if (e) 
        e.focus();
};

function center(el, x, y) {
    var p = el.parentNode, s = el.style;
    var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
    var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
    if (x) s.left = l > 0 ? (l+'px') : '0';
    if (y) s.top  = t > 0 ? (t+'px') : '0';
};

function sz(el, p) { 
    return parseInt($.css(el,p))||0; 
};

})(jQuery);

/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Version: 1.1 (March 26, 2008)
 * Requires: jQuery 1.2+
 */
(function(C){var A=false;var B=true;C.fn.createDialog=function(E){var F=C.extend({},C.fn.createDialog.defaults,E);C(this).click(function(){B=F.center;if(!A){C("body").prepend('<div id="jDialogProgressBar"><img src="i/ajax-loader.gif" /></div><div id="jDialogOverlay"></div><div id="jDialogContainer"></div>');G(1);A=true}if(F.progress){C("#jDialogProgressBar").show()}C.ajax({type:F.method,data:F.data,url:F.addr,success:function(H){C("#jDialogContainer").html(H);if(B){D()}C("#jDialogProgressBar").fadeOut(900)}});if(C.browser.msie&&parseInt(C.browser.version)<7){C(window).scroll(function(){if(A==1){G();if(B){D()}}})}C(window).resize(function(){if(A==1){G();if(B){D()}}});C(window).unload(function(){if(A==1){C.closeDialog()}});C(window).keydown(function(H){if(H.keyCode==27){C.closeDialog()}})});function G(L){var K=0;var J=0;var I=C(window).width();var M=C(document).height();var H=C(window).height();if(C.browser.msie&&parseInt(C.browser.version)<7){C("#jDialogOverlay").css({top:0,left:0,width:I,height:M,position:"absolute",display:"block",color:F.bg,zIndex:F.index})}else{C("#jDialogOverlay").css({top:0,left:0,width:I,height:H,position:"fixed",display:"block",background:F.bg,zIndex:F.index}).show()}if(L==1){C("#jDialogOverlay").css("opacity",0);C("#jDialogOverlay").fadeTo(200,F.opacity)}}function D(){var H=0;var M=0;var I=C(window).width();var J=C(window).height();var N=C("#jDialogContainer").children().height();var K=C("#jDialogContainer").children().width();if(C.browser.msie){H=document.body.scrollLeft||document.documentElement.scrollLeft;M=document.body.scrollTop||document.documentElement.scrollTop}else{H=window.pageXOffset;M=window.pageYOffset}var Q=M+J/2-N/2;var O=H+I/2-K/2;var P=Q-M;var L=O-H;if(C.browser.msie&&parseInt(C.browser.version)<7){C("select").hide();C("#jDialogContainer select").show();C("#jDialogContainer").children().css({top:Q,left:O,position:"absolute",zIndex:(F.index+1)}).show()}else{C("#jDialogContainer").children().css({top:P,left:L,position:"fixed",zIndex:(F.index+1)}).show()}}};C.fn.createDialog.defaults={progress:true,center:true,method:"GET",data:"",opacity:0.85,bg:"#FFFFFF",index:2000};C.closeDialog=function(){A=false;if(C.browser.msie&&parseInt(C.browser.version)<7){C("select").show()}C("#jDialogOverlay").fadeTo(200,0,function(){C("#jDialogContainer, #jDialogOverlay, #jDialogProgressBar").remove()})}})(jQuery);
/// <reference path="jquery.intellisense.js"/>

// base.js (c) 2009 June AB, Matias Larsson
// v1.00 (080808) ML		First version
// v1.01 (080904) ML		Added really nice css-selector based ajax functionality
// v1.02 (080908) ML		Added event listener functionality (JUNE.addListener)
// v1.03 (081001) ML		Added initPreventDoubleClick()
// v1.04 (081017) EX-MW		Added accordion and hslide
// v1.05 (081020) ML		Modified getSelectorLink to support Anchors as parents. Added revealSelector to initAjax.
// v1.06 (081021) ML		Improved getSelectorLink
// v1.07 (081027) ML		Added JUNE clientTest
// v1.08 (081030) ML		We now trigger a custom juneAjaxStart event before we remove content to be replaced
// v1.09 (081105) ML		Added JUNE.bindEvent and JUNE.ajax.toggleLoading, JUNE.ajax.trackAnalytics, JUNE.preload and juneAjaxEnd event
// v1.10 (081112) ML		Modified initListener to prevent default events and send the href of the clicked element to the callback method
// v1.11 (081114) ML		Added JUNE.siteRegion and different loading anims depending on it.
// v1.12 (081117) ML		Added JUNE.cookie
// v1.13 (081126) ML		Added support for clicked element history
// v1.14 (081203) ML        JUNE.modal.loading now includes close link
// v1.15 (081204) ML        JUNE.ajax.trackAnalytics now supports custom text
// v1.16 (081205) ML        Rewrote some ajax handling.
// v1.17 (081208) ML        We now animate jXHRArea height to match the height of the new XHR data. Allows the user to stop PayExStatusCheck.
// v1.18 (090216) ML        Added JUNE.ajax.load and JUNE.ajaxReplace (to handle menu listeners)
// v1.19 (090217) ML        Rewrote JUNE.ajax, JUNE.ajaxFade, JUNE.ajaxReplace methods to use more intelligent callback functionality (TODO Make callback into a method)
// v1.20 (090218) ML        JUNE.getSelectorLink now steps upwards in the DOM until it encounters .jXHR or .item (Better code available if we switch to jQuery 1.3.1)
// v1.21 (090225) ML        We can now use ajax without the need for callbacks. Also, we don't set the clickedElement for "more games" clicks. GetSelectorLink fixes.
// v1.22 (090325) ML        Added JUNE.toggle, JUNE.initToggle (Makes all .jToggle elements toggle the next .jToggleTarget element with slide up/slide down.)
// v1.23 (090419) ML        JUNE.getSelectorLink now stops at class noLink.
// v1.24 (090826) RE        Added the global flag JUNE.ajaxAlreadyInProgress prevent double node insertion in JUNE.ajaxFade.


// Extend jQuery with YUI-like namespace functionality (Zach Leatherman - http://www.zachleat.com/web/2007/08/28/namespacing-outside-of-the-yahoo-namespace/)
jQuery.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=window;
        for (j=0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }
    return o;
};

// JUNE base functions
var JUNE = {
    siteRegion: "SE",
    clickedElement: undefined,
    previousElement: undefined,

    init: function() {
        this.extendLinks();
        this.initToggle(); // Makes all .jToggle elements toggle the next .jToggleTarget element with slide up/slide down.
        this.runCode(); // Runs the first jRun element code block
        JUNE.modal.init();
        this.initPreventDoubleClick();

        this.addTargets();
        this.applyImageWidth("figure");
        this.addIntelliFocus();

    },

    lan: function(key) {
        return JUNE.localization.getText(key);
    },

    setDocumentTitle: function(text) {
        document.title = text;
    },

    applyImageWidth: function(className) {
        $().ready(function() {
            var figures = $("div." + className), figure, image;
            var i = 0;
            var captions, caption;

            // Adjust all figure elements to the width of the containing image and make them visible
            figures.each(function() {
                $(this).children("div.figure").each(function() {
                    image = $(this).children("img:first");
                    $(this).width(image.width());
                    //$(this).css("visibility", "visible");
                });
            });

            // Make all figures visible
            figures.each(function() {
                $(this).css("visibility", "visible");

                // special fix for IE
                if ($.browser.msie) {
                    $(this).children("p").each(function() {
                        $(this).css("display", "inline-block");
                    });
                }
            });
        });
    },

    addTargets: function() {
        $().ready(function() {
            $("a.targetNew").click(function() {
                window.open(this.href);
                return false;
            });
        });
    },

    addIntelliFocus: function() {
        $().ready(function() {
            $("input.juneIntelliFocus").each(function() {
                $("this").attr("defaultValue", this.value);
            });

            $("input.juneIntelliFocus").focus(function() {
                if (this.className.indexOf("fake") >= 0) {
                    this.style.display = "none";
                    var pass = $("input.juneIntelliFocus.password");
                    pass.css("display", "inline");
                    pass[0].focus();
                }
                else if (this.value == this.defaultValue) {
                    this.value = "";
                }
            });

            $("input.juneIntelliFocus").blur(function() {
                if (this.className.indexOf("password") >= 0 && this.value == "") {
                    this.style.display = "none";
                    $("input.juneIntelliFocus.fake").css("display", "inline");
                }
                else if (this.value == "") {
                    this.type = "text";
                    this.value = this.defaultValue;
                }
            });
        });
    },

    blockEnterSubmit: function() {
        $(":input").keydown(function(event) {
            if (event.keyCode == 13) {
                event.preventDefault();
            }
            //if(event.keyCode == 13 && $(this).parents(".login").length==0) {
            //event.preventDefault();
            //}
        });
    },

    initToggle: function() {
        $(".jToggle").each(function() {
            var $link = $(this);
            $link.click(function(event) {
                event.preventDefault();
                JUNE.toggle($link, $link.nextAll(".jToggleTarget:first"));
            });
        });
    },

    toggle: function($link, $objectToExpand) {
        $objectToExpand.slideToggle("fast")
        //        $link[0].expanded = !$link[0].expanded;
        //        if ($link[0].expanded) {
        //            $objectToExpand.slideDown("fast");
        //            //link.text(" - " + JUNE.lan("SERVICEMESSAGE_CLOSE"));
        //        }
        //        else {
        //            $objectToExpand.slideUp("fast");
        //            //link.text(" - " + JUNE.lan("SERVICEMESSAGE_READMORE"));
        //        }
    },

    // TODO Move ajax stuff to JUNE.ajax
    // Consumes the first link and adds it as a child to the element with class .jLink
    extendLinks: function(selector, updateAreaSelector, callback, revealSelector) {
        var link;
        if (selector === undefined) {
            selector = ".jLink";
        }

        // Ajax update
        if (updateAreaSelector !== undefined && updateAreaSelector !== null) {  //&& !$.browser.msie
            $(selector).each(function() {

                // TODO maybe simplify using something like this
                //  $(".pane-list li").click(function() {
                //      window.location = $(this).find("a").attr("href"); return false;
                //  });

                $(this).click(function(event) {
                    event.preventDefault();
                    JUNE.previousElement = JUNE.clickedElement;
                    JUNE.clickedElement = $(this);

                    // Only refresh the page if we have a link to new content
                    if (link = JUNE.getSelectorLink(event.target, selector)) {
                        JUNE.initAjax(link.href, updateAreaSelector, "*", callback, false, revealSelector);
                    }
                });
            });
        }
        // Ajax replace linked node
        else if (updateAreaSelector === undefined && revealSelector === undefined) { // TODO This blocks usage of "ordinary" extendlinks (which has to recieve null as updateAreaSelector to get to the else statement)
            $(selector).each(function() {
                $(this).click(function(event) {
                    event.preventDefault();

                    // Only refresh the page if we have a link to new content
                    if (link = JUNE.getSelectorLink(event.target, selector)) {
                        JUNE.ajaxReplace(link.href, $(this), callback);
                    }
                });
            });
        }
        else {
            $(selector).each(function() {
                $(this).click(function(event) {
                    JUNE.previousElement = JUNE.clickedElement;
                    JUNE.clickedElement = $(this);

                    if (link = JUNE.getSelectorLink(event.target, selector)) {
                        document.location.href = link.href;
                    };
                });
            });
        }
    },

    initAjax: function(uri, updateAreaSelector, contentSelector, callback, useParent, revealSelector) {
        var $updateItems = $(updateAreaSelector);

        // IE is too slow, so we will not use fade
        if (false) { //$.browser.msie) {
            if (useParent) {
                $updateItems = $updateItems.parent();
            }
            JUNE.ajax(uri, $updateItems, contentSelector, callback, useParent);
        }
        else {
            // Reveal using slideDown
            if (revealSelector !== undefined) {
                var $revealItems = $(revealSelector);
                if ($revealItems.hasClass("hide")) {
                    $revealItems.slideDown("fast").removeClass("hide");
                }
            }

            var i = 1;
            var $updateChildren = $updateItems.children();
            // Remember the number of childs to execute ajax after the last one
            var numItems = $updateChildren.size();

            // Remeber item heights to prevent them from collapsing
            $updateItems.each(function() {
                $(this).height($(this).height());
                //$(this).css("min-height", $(this).height());
            });

            // Fade out the item contents
            if ($updateChildren.length > 0) { // Quick fix to handle strange responses messing up the DOM for the next XHR.
                $updateChildren.fadeOut("fast", function() {
                    // After the final item, load new content
                    if (i == numItems) {
                        JUNE.ajaxFade(uri, $updateItems, contentSelector, callback);
                    }
                    i++;
                });
            }
            else {
                JUNE.ajaxFade(uri, $updateItems, contentSelector, callback);
            }
        }
    },

    ajax: function(uri, $items, contentSelector, callBack, useParent) {
        var $dataPart, $updatePart = $items;

        // Do we need to update several areas at once?
        if (useParent) {
            $updatePart = $items.parent();
        }

        // Filter the data to get the matching content
        if (!JUNE.hasValue(contentSelector)) {
            if (useParent) {
                contentSelector = "#" + $items[0].id; // Requires an id on the parent element
            }
            else {
                contentSelector = "." + $items[0].className.replace(" ", ".") + " > *"; // Requires classes on the elements
            }
        }

        // Throw June ajax start event
        $(window).trigger("juneAjaxStart", [uri]);

        $updatePart.load(JUNE.addToQuerystring(uri, "ajax=1") + " " + contentSelector, null, function() {
            // Throw June ajax end event
            $(window).trigger("juneAjaxEnd", [uri]);

            // TODO Make this a method for re-use
            if (callBack !== undefined) {
                if (typeof callBack == "function") {
                    callBack(event);
                }
                else if (callBack.indexOf("()") >= 0) { // HACK Old way
                    eval(callBack);
                }
                else { // HACK New way
                    var callBackMethod;
                    if (JUNE.hasValue(this.href)) {
                        callBackMethod = callBack + "('" + this.href + "')";
                    }
                    else {
                        callBackMethod = callBack + "()";
                    }
                    eval(callBackMethod);
                }
            }
            //            
            //            if (JUNE.hasValue(callback)) {
            //                eval(callback);
            //            }
        });
    },

    // Replaces a node with ajax content
    ajaxReplace: function(uri, $replaceObject, callBack) {
        $.get(JUNE.addToQuerystring(uri, "ajax=1"), function(data) {
            $replaceObject.replaceWith($(data));

            // TODO Make this a method for re-use
            if (callBack !== undefined) {
                if (typeof callBack == "function") {
                    callBack(event);
                }
                else if (callBack.indexOf("()") >= 0) { // HACK Old way
                    eval(callBack);
                }
                else { // HACK New way
                    var callBackMethod;
                    if (JUNE.hasValue(this.href)) {
                        callBackMethod = callBack + "('" + this.href + "')";
                    }
                    else {
                        callBackMethod = callBack + "()";
                    }
                    eval(callBackMethod);
                }
            }

            //           if (JUNE.hasValue(callback)) {
            //               eval(callback);
            //           }
        });
    },
    ajaxAlreadyInProgress: false,
    ajaxFade: function(uri, $items, contentSelector, callBack) {

        // Check the in progress flag before we proceed
        if (JUNE.ajaxAlreadyInProgress) { return false; }
        JUNE.ajaxAlreadyInProgress = true;

        // Throw June ajax start event
        $(window).trigger("juneAjaxStart", [uri]);

        var $dataPart, useDynamicSelector = false;

        // Remove old nodes
        $items.children().remove();

        // Do we have a content filter selector?
        if (!JUNE.hasValue(contentSelector)) {
            useDynamicSelector = true;
        }

        $.get(JUNE.addToQuerystring(uri, "ajax=1"), function(data) {
            // For each ajax item update the matching parts with the new content
            $items.each(function() {
                // Filter the data to get the matching content
                if (useDynamicSelector) {
                    contentSelector = "." + $(this)[0].className.replace(/ /g, ".");
                    $dataPart = $(data).find(contentSelector).children();
                }
                else {
                    $dataPart = $(data);
                }

                // We need to hide the new content so we can fade it
                $dataPart.toggleClass("invisible");

                // Add the new content to the designated ajax item
                $(this).append($dataPart);

                // Match the height of the container with the height of the new data
                $(this).animate({
                    height: $dataPart.outerHeight() + "px"
                });

                //$(this).height($dataPart.height());
            });

            // Reset the in progress flag
            JUNE.ajaxAlreadyInProgress = false;

            // Throw June ajax end event
            $(window).trigger("juneAjaxEnd", [uri]);

            // Display the new data with a fade
            // TODO Här vill vi egentligen vänta på att alla externa assets har lästs in innan vi fadar tillbaka ***
            $items.children().fadeIn("fast").toggleClass("invisible");

            // TODO Make this a method for re-use
            if (callBack !== undefined) {
                if (typeof callBack == "function") {
                    callBack(event);
                }
                else if (callBack.indexOf("()") >= 0) { // HACK Old way
                    eval(callBack);
                }
                else { // HACK New way
                    var callBackMethod;
                    if (JUNE.hasValue(this.href)) {
                        callBackMethod = callBack + "('" + this.href + "')";
                    }
                    else {
                        callBackMethod = callBack + "()";
                    }
                    eval(callBackMethod);
                }
            }

            //            if (JUNE.hasValue(callback)) {
            //                eval(callback);
            //            }

        });
    },

    getSelectorLink: function(target, selector) {
        //get the parent jXHR or item element and then get the first anchor element
        // TODO Danger: if we use getSelectorLink on an element missing the class jXHR or item we end up in a never ending loop

        // We need to get the parent li.jXHR of the clicked element
        var $selectedElement = $(target);
        while (!($selectedElement.hasClass("jXHR") || $selectedElement.hasClass("jLink") || $selectedElement.hasClass("item") || $selectedElement.hasClass("noLink"))) {
            $selectedElement = $selectedElement.parent();
        }
        // TODO WHEN jQuery 1.31: var $selectedElement = $(target).closest(selector);

        if ($selectedElement.hasClass("noLink")) {
            return false;
        }

        if ($selectedElement[0].tagName != "A") {
            return $selectedElement.find("a")[0];
        }
        else {
            return $selectedElement[0];
        }

        //        if ($selectedElement[0].nodeName == "A") {
        //            return $selectedElement[0];
        //        }
        //        else if ($selectedElement.parents(selector)[0] !== undefined && $selectedElement.parents(selector)[0].nodeName == "A") {
        //            return $selectedElement.parents(selector)[0];
        //        }
        //        else {
        //            if ($selectedElement.find("a").length > 0) {
        //                return $selectedElement.find("a")[0];
        //            }
        //            else {
        //                return $selectedElement.parents(selector).find("a")[0];
        //            }
        //        }
    },

    // Add/Update value in querystsring
    // TODO Kan nog optimeras en del ***
    addToQuerystring: function(uri, string) {
        var key = string.split("=")[0];
        var value = string.split("=")[1];

        if (uri.length != 0) {
            if (uri.indexOf(key) == -1) {
                return uri + ((uri.indexOf('?') == -1) ? "?" : "&") + string;
            }
            else {
                var keyStart = uri.indexOf(key);
                var keyEnd = uri.indexOf("=", keyStart);
                var valueStart = keyEnd + 1;
                var valueEnd = uri.indexOf("&", valueStart);
                var newUri = uri.substr(0, valueStart) + value;
                if (valueEnd >= 0) {
                    newUri += uri.substr(valueEnd);
                }
                return newUri;
            }
        }
        else {
            return uri + "?" + string;
        }
    },

    // Requires jQuery.listen
    // Example: JUNE.initListener("click","a.playMovie", "CANALPLUS.player.load()","div#area1");
    // TODO Needs to be cleaned up a bit
    initListener: function(event, selector, callBack, object) {
        if (object !== undefined) {
            $(object).listen(event, selector, function(event) {
                event.preventDefault();
                // TODO Make this a method for re-use
                if (callBack !== undefined) {
                    if (typeof callBack == "function") {
                        callBack(event);
                    }
                    else if (callBack.indexOf("()") >= 0) { // HACK Old way
                        eval(callBack);
                    }
                    else { // HACK New way
                        var callBackMethod;
                        if (JUNE.hasValue(this.href)) {
                            callBackMethod = callBack + "('" + this.href + "')";
                        }
                        else {
                            callBackMethod = callBack + "()";
                        }
                        eval(callBackMethod);
                    }
                }
                return false;
            });
        }
        else {
            $.listen(event, selector, function(event) {
                event.preventDefault();
                //eval(callBack);
                if (callBack !== undefined) {
                    if (typeof callBack == "function") {
                        callBack(event);
                    }
                    else if (callBack.indexOf("()") >= 0) { // HACK Old way
                        eval(callBack);
                    }
                    else { // HACK New way
                        var callBackMethod;
                        if (JUNE.hasValue(this.href)) {
                            callBackMethod = callBack + "('" + this.href + "')";
                        }
                        else {
                            callBackMethod = callBack + "()";
                        }
                        eval(callBackMethod);
                    }
                }
                return false;
            });
        }
    },

    bindEvent: function(event, callBack, object) {
        if (object === undefined) {
            object = window;
        }
        $(object).bind(event, callBack);
    },

    test: function() {
        alert("test!");
    },

    hasValue: function(val) {
        return !(val === undefined || val === null);
    },

    // Runs javascript code enclosed in an HTML comment inside the selected element.
    runCode: function(selector) {
        var $codeRunner;
        if (this.hasValue(selector)) {
            $codeRunner = $(selector);
        }
        else {
            $codeRunner = $("#jRun");
        }

        if ($codeRunner.length > 0) {
            eval(this.getComment($codeRunner[0]));
        }
    },

    getComment: function(elem) {
        if (elem !== undefined) {
            var pos;
            if (pos = elem.firstChild) {
                while (pos.nodeType != 8) { // Requires an HTML comment!
                    pos = pos.nextSibling;
                }
                return pos.data;
            }
        }
        return false;
    },

    initPreventDoubleClick: function() {
        $("form").each(function() {
            var $theForm = $(this);
            // On form submit, disable buttons
            $theForm.submit(function() {
                if ($theForm.valid()) {
                    $theForm.find("button.next").click(function() {
                        $(this)[0].disabled = true;
                    });
                }
            });
        });
    },

    preload: function(images) {
        $.each(images, function(e) {
            $(new Image()).load(function() { }).attr('src', this);
        });
    },

    addJS: function(src, checkIfloaded, callback) {
        if (!checkIfloaded) {
            script = document.createElement('script');
            script.id = "dynJS" + JUNE.getUniqueId();
            script.type = 'text/javascript';
            script.src = src;
            $("head").append(script);
        }
        if (typeof callBack == "function") {
            callback();
        }
    },

    getUniqueId: (function() {
        var id = 0;
        return function() {
            if (arguments[0] == 0) id = 0;
            return id++;
        }
    })()
};

// JUNE ajax
jQuery.namespace("JUNE.ajax");
JUNE.ajax = {
    loadingAnim: false,

    // TODO No hard coded image link
    toggleLoading: function() {
        if (JUNE.ajax.loadingAnim) {
            var $loadingImage = $("div#area1a img.loading");
            $loadingImage.fadeOut("fast");
            $loadingImage.remove();
        }
        else {
            var loadingHTML;
            if (JUNE.siteRegion == "SE" || JUNE.siteRegion == "DK" || JUNE.siteRegion == "ASSYRISKA") {
                loadingHTML = "<img class=\"loading\" src=\"client/cs-img/ajax-loader.gif\" width=\"32\" height=\"32\" alt=\"Loading\" />";
            }
            else {
                loadingHTML = "<img class=\"loading\" src=\"client/img/ajax-loader.gif\" width=\"32\" height=\"32\" alt=\"Loading\" />";
            }
            // add element to DOM
            $("div#area1a").prepend(loadingHTML);

            // fade in element
            $("div#area1a img.loading").fadeIn("fast");
        }

        JUNE.ajax.loadingAnim = !JUNE.ajax.loadingAnim;
    },

    // Requires Google Analytics ga.js script on base page to track
    trackAnalytics: function(evt, uri, text) {
        if (pageTracker !== undefined) {
            if (text !== undefined) {
                pageTracker._trackPageview(text);
            }
            else {
                uri = uri.substr(uri.lastIndexOf("/"));
                pageTracker._trackPageview(uri);
            }
        }
    },

    // Executed with a listener, ajax loads content from the containing link and inserts it in the updateArea
    load: function(e, selector, updateAreaSelector, callback, revealSelector) {
        var link;
        var $listItem = $(e.target);

        /* HACK Ignore clicks on certain elements
        if ($listItem.hasClass("head") || $listItem.parent().parent().hasClass("groups")) {
            return;
        }*/

        // We need to get the parent li.jXHR of the clicked element
        while ($listItem.get(0).tagName != "LI") { // HACK Make this smarter
            $listItem = $listItem.parent();
        }

        // Don't set clicked elements for the More games link
        if (!$listItem.hasClass("more")) {
            JUNE.previousElement = JUNE.clickedElement;
            JUNE.clickedElement = $listItem;
        }

        // Ajax update
        if (updateAreaSelector !== undefined && updateAreaSelector !== null) {  //&& !$.browser.msie
            e.preventDefault();

            // Only refresh the page if we have a link to new content
            if (link = JUNE.getSelectorLink(e.target, selector)) {
                JUNE.initAjax(link.href, updateAreaSelector, "*", callback, false, revealSelector);
            }
        }
        // Ajax replace
        else if (updateAreaSelector === null && revealSelector === undefined) {
            e.preventDefault();

            // Only refresh the page if we have a link to new content
            if (link = JUNE.getSelectorLink(e.target, selector)) {
                JUNE.ajaxReplace(link.href, $listItem, callback);
            }
        }
        else {
            if (link = JUNE.getSelectorLink(e.target, selector)) {
                document.location.href = link.href;
            };
        }
    }
};

// JUNE.queryString (Chris - http://seattlesoftware.wordpress.com/2008/01/16/javascript-query-string/)
jQuery.namespace("JUNE.queryString");
JUNE.queryString = {
	uri: undefined,
	part: function(part) {
		var result = {};
		var querystring;
		var uri = JUNE.queryString.uri;
		uri = uri.substr(uri.indexOf("?"));
		if (uri !== undefined) {
			querystring = decodeURIComponent(uri);
		}
		else {
			querystring = decodeURIComponent(location.search);
		}
		if (!querystring) {
			return result;
		}
		var pairs = querystring.substring(1).split("&");
		var splitPair;
		for (var i = 0; i < pairs.length; i++) {

			splitPair = pairs[i].split("=");
			if (splitPair[0].indexOf("[]") < -1) {
				//pair is an array assignment
				var key = splitPair[0].substr(0, splitPair[0].length - 2);

				if (!result[key]) {
					//initialize the array
					result[key] = new Array();
				}
				result[key].push(splitPair[1]);

			} else {
				//pair is a string assignment
				result[splitPair[0]] = splitPair[1];
			}
		}
		return result[part];
	}
};

// JUNE cookie
jQuery.namespace("JUNE.cookie");
JUNE.cookie = {
	/*
	   name - name of the cookie
	   value - value of the cookie
	   [expires] - expiration date of the cookie
	     (defaults to end of current session)
	   [path] - path for which the cookie is valid
	     (defaults to path of calling document)
	   [domain] - domain for which the cookie is valid
	     (defaults to domain of calling document)
	   [secure] - Boolean value indicating if the cookie transmission requires
	     a secure transmission
	   * an argument defaults when it is assigned null as a placeholder
	   * a null placeholder is not required for trailing omitted arguments
	*/
	set: function(name, value, expires, path, domain, secure) {
		var curCookie = name + "=" + escape(value) +
			((expires) ? "; expires=" + expires.toUTCString() : "") +
			((path) ? "; path=" + path : "") +
			((domain) ? "; domain=" + domain : "") +
			((secure) ? "; secure" : "");
			document.cookie = curCookie;
	},
	
	/*
	  name - name of the desired cookie
	  return string containing value of specified cookie or null
	  if cookie does not exist
	*/
	get: function(name) {
		var dc = document.cookie;
		var prefix = name + "=";
		var begin = dc.indexOf("; " + prefix);
		if (begin == -1) {
			begin = dc.indexOf(prefix);
			if (begin != 0) return null;
		} 
		else
			begin += 2;
		var end = document.cookie.indexOf(";", begin);
		if (end == -1)
			end = dc.length;
		return unescape(dc.substring(begin + prefix.length, end));
	},

	/*
	   name - name of the cookie
	   [path] - path of the cookie (must be same as path used to create cookie)
	   [domain] - domain of the cookie (must be same as domain used to
	     create cookie)
	   path and domain default if assigned null or omitted if no explicit
	     argument proceeds
	*/
	del: function(name, path, domain) {
		if (this.getCookie(name)) {
			document.cookie = name + "=" +
			((path) ? "; path=" + path : "") +
			((domain) ? "; domain=" + domain : "") +
			"; expires=Thu, 01-Jan-70 00:00:01 GMT";
		}
	}
}

// JUNE clientTest
jQuery.namespace("JUNE.clientTest");
JUNE.clientTest = {
    getClientInfo: function(element) {
        var log;

        log = "User agent: " + navigator.userAgent + "|";
        log += "Operating System: " + navigator.platform + "|";
        log += "Sun Java supported: " + navigator.javaEnabled() + "|";
        log += "Screen: " + screen.width + "x" + screen.height + "|";

        if (navigator.userAgent.indexOf('MSIE') > 0) {
            log += JUNE.clientTest.IEGetFlashInfo() + "|";
            log += JUNE.clientTest.IEGetAdobeReaderInfo() + "|";
            log += JUNE.clientTest.IEGetQuicktimeInfo() + "|";
            log += JUNE.clientTest.IEGetRealPlayerInfo() + "|";
            log += JUNE.clientTest.IEGetWMPInfo() + "|";
        }
        else {
            // all other browsers
            for (i = 0; i < navigator.plugins.length - 1; i++) {
                log += navigator.plugins[i].name + "|";
            }
        }
       
        if (element !== undefined) {
            element.value += log;
        }
    },

    IEGetFlashInfo: function() {
        var isInstalled = false;
        var version = null;

        var control = null;
        try {
            control = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
        } catch (e) {
            return;
        }
        if (control) {
            isInstalled = true;
            version = control.GetVariable('$version').substring(4);
            version = version.split(',');
            version = parseFloat(version[0] + '.' + version[1]);
        }

        return this.languageFix('Flash', isInstalled, version);
    },

    IEGetAdobeReaderInfo: function() {
        var isInstalled = false;
        var version = null;

        var control = null;
        try {
            // AcroPDF.PDF is used by version 7 and later
            control = new ActiveXObject('AcroPDF.PDF');
        } catch (e) {
            // Do nothing
        }
        if (!control) {
            try {
                // PDF.PdfCtrl is used by version 6 and earlier
                control = new ActiveXObject('PDF.PdfCtrl');
            } catch (e) {
                return;
            }
        }
        if (control) {
            isInstalled = true;
            version = control.GetVersions().split(',');
            version = version[0].split('=');
            version = parseFloat(version[1]);
        }

        return this.languageFix('Adobe Reader', isInstalled, version);
    },

    IEGetQuicktimeInfo: function() {
        var isInstalled = false;
        var version = null;

        var control = null;
        try {
            control = new ActiveXObject('QuickTime.QuickTime');
        } catch (e) {
            // Do nothing
        }
        if (control) {
            // In case QuickTimeCheckObject.QuickTimeCheck does not exist
            isInstalled = true;
        }

        try {
            // This generates a user prompt in Internet Explorer 7
            control = new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck');
        } catch (e) {
            return;
        }
        if (control) {
            // In case QuickTime.QuickTime does not exist
            isInstalled = true;

            // Get version
            version = control.QuickTimeVersion.toString(16); // Convert to hex
            version = version.substring(0, 1) + '.' + version.substring(1, 3);
            version = parseFloat(version);
        }


        return this.languageFix('Quicktime', isInstalled, version);
    },

    IEGetRealPlayerInfo: function() {
        var isInstalled = false;
        var version = null;

        var definedControls = [
			'rmocx.RealPlayer G2 Control',
			'rmocx.RealPlayer G2 Control.1',
			'RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)',
			'RealVideo.RealVideo(tm) ActiveX Control (32-bit)',
			'RealPlayer'
		];

        var control = null;
        for (var i = 0; i < definedControls.length; i++) {
            try {
                control = new ActiveXObject(definedControls[i]);
            } catch (e) {
                continue;
            }
            if (control) {
                break;
            }
        }
        if (control) {
            isInstalled = true;
            version = control.GetVersionInfo();
            version = parseFloat(version);
        }

        return this.languageFix('Real Player', isInstalled, version);
    },

    IEGetWMPInfo: function() {
        var isInstalled = false;
        var version = null;

        var control = null;
        try {
            control = new ActiveXObject('WMPlayer.OCX');
        } catch (e) {
            return;
        }
        if (control) {
            isInstalled = true;
            version = parseFloat(control.versionInfo);
        }


        return this.languageFix('Windows Media Player', isInstalled, version);
    },

    languageFix: function(plugin, isInstalled, version) {
        if (isInstalled) {
            return plugin + ': Version ' + version;
        }
        else {
            return plugin + ' is not installed';
        }
    }
};

// JUNE validator
jQuery.namespace('JUNE.validator');
JUNE.validator = {
    init: function(namespace) {
        $().ready(function() {
            JUNE.validator.customRules();
            JUNE.validator.allowSubmit();
        });
    },

    customRules: function() {
        // Phone numbers (digits, + and -)
        $.validator.addMethod('phone', function(value) {
            return /^[\d \-\+)(\/]*$/.test(value);
        }, 'Please enter a valid phone number.');

        // Zip codes (digits and spaces)
        $.validator.addMethod('zip', function(value) {
            return /^[0-9 ]*$/.test(value);
        }, 'Please enter a valid zip code.');

        $.validator.addMethod('dependsOn', function(value, el, params) {
            //return !$(params.el).is(params.being) || $(el).is(':filled');
            return !$(params.el).is(params.being) || $(el).val() > 0;
        }, 'This field is required.');

        $.validator.addMethod('dependsOn2', function(value, el, params) {
            //return !$(params.el).is(params.being) || $(el).is(':filled');
            return !$(params.el).is(params.being) || $(el).val() > 0;
        }, 'This field is required.');

        // Value code (c+ webtv)
        $.validator.addMethod('cplusvaluecode', function(value) {
            return /^\W*(?:\d{4}-?\d{4}-?\d{4}|0)\W*$/.test(value);
        }, 'Please enter a valid value code.');

        // Usernames (letters, -, _, . and @)
        $.validator.addMethod('username', function(value) {
            return /^([\wåäöÅÄÖ][-\w_\.åäöÅÄÖ]+@\w[-\w_\.åäöÅÄÖ]+)|([\wåäöÅÄÖ][-_\.\wåäöÅÄÖ]{4,46})$/.test(value);
        }, 'Please enter a valid username.');
    },

    allowSubmit: function() {
        $("button.prev, button.default, button.noValidate").each(function() {
            $(this).click(function() {
                // remove all validation rules from input and select elements
                // *** kanske finns det ett bättre sätt att stänga av valideringen? ***
                JUNE.validator.clearRules();
            });
        });
    },

    clearRules: function() {
        $().ready(function() {
            $(":input").each(function() {
                try {
                    $(this).rules("remove");
                }
                catch (err) {
                }
            });
        });
    }

};

// JUNE accordion
jQuery.namespace('JUNE.accordion');
JUNE.accordion = {
	init: function(namespace) {
		$().ready(function() {
			$(".accordion").accordion({
				autoheight: false,
				active: ".selected",
				clearStyle: true,
				alwaysOpen: false,
				header: "a:not(.more)"
			});
		});
	}
};

// JUNE hslide
jQuery.namespace('JUNE.hslide');
JUNE.hslide = {
	init: function(namespace) {
		$().ready(function() {
			$('#hslide').hSlides({
				totalWidth: 639,
				totalHeight: 150,
				minPanelWidth: 24,
				maxPanelWidth: 613, // 541 för 5 panels, 613 för 2 panels
				activeClass: 'active',
				panelSelector: 'div.panel'
			});

		});
	}
};

// JUNE localization
jQuery.namespace('JUNE.localization');
JUNE.localization = {
    getText: function(key) {
        if (l[key] === undefined) {
            ucaseKey = key.toUpperCase();
            if (l[ucaseKey] == undefined) {
                // TODO Här lägger vi till ett Ajax anrop som lägger till nyckeln i short text dictionaryt
                return key;
            }
            else {
                return l[ucaseKey];
            }
        }
        else {
            return l[key];
        }
    }
};

// JUNE modal
jQuery.namespace("JUNE.modal");
JUNE.modal = {
    image: function(element, timeOut) {
        $.blockUI({
            message: $(element),
            css: {
                top: ($(window).height() - 500) / 2 + "px",
                left: ($(window).width() - 500) / 2 + "px",
                width: "500px",
                border: "none",
                backgroundColor: "transparent",
                cursor: "pointer"
            }
        });

        if (timeOut !== undefined && timeOut > 0) {
            setTimeout($.unblockUI, 2000);
        }

        $(element).click($.unblockUI);
    },

    loading: function(html, closeLink) {
        if (closeLink !== undefined) {
            html += "<a class=\"closeLoading link\">" + closeLink + "</a>";
        }
        $.blockUI({
            message: html,
            css: {
                border: "none",
                color: "white",
                backgroundColor: "black",
                padding: "10px 10px 10px 60px",
                backgroundImage: "url(client/img/ajax-loader.gif)",
                backgroundRepeat: "no-repeat",
                backgroundPosition: "1em center"
            }
        });

        $("a.closeLoading").click(function() {
            $.unblockUI({
                onUnblock: function() { CANALPLUS.stopPayExStatusCheck = true }
            });
        });
    },

    // Requires jDialog 1.1 plugin
    init: function() {
          
        $.fn.createDialog.defaults = {
            progress: false,
            center: true,
            opacity: 0.7,
            bg: '#000'
        }

        // for each ajax dialog link, add a dialog handler
        $("a.modal").each(function() {
            $(this).click(function(event) {
                event.preventDefault();
            });
            var url = $(this)[0].href;
            url = "templates/modal-iframe.aspx?url=" + escape(url);
            $(this).createDialog({
                addr: url,
                opacity: 0.75,
                width: 500,
                height: 450
            });
        });


    }
}

// JUNE time
jQuery.namespace('JUNE.time');
JUNE.time = {
	clock: function(seconds) {
		var minutes = Math.floor(seconds / 60);
		var seconds = seconds - minutes * 60;
		minutes = (minutes < 10 ? "0" : "") + minutes;
		seconds = (seconds < 10 ? "0" : "") + seconds;

		return minutes + ":" + seconds;
	},
	setTimeout: function(seconds, callback) {
		window.setTimeout(callback, seconds * 1000);
	}
};

jQuery.fn.countdown = function(options) {
	if (!options) options = '()';
	if (jQuery(this).length == 0) return false;
	var obj = this;

	// break out and execute callback (if any)
	if (options.seconds < 0 || options.seconds == 'undefined') {
		if (options.callback) eval(options.callback);
		return null;
	}

	clearTimeout(jQuery(obj).countdown.timer);
	jQuery(obj).countdown.timer = window.setTimeout(function() {
			jQuery(obj).html(String(JUNE.lan("COUNTDOWN_TIMETOSTART") + JUNE.time.clock(options.seconds)));
			--options.seconds;
			jQuery(obj).countdown(options);
		},
		1000
	);
	return this;
};
 
jQuery.fn.replace = function() {
	var stack = [];
	return this.domManip(arguments, true, 1, function(a){
		this.parentNode.replaceChild( a, this );
		stack.push(a);	
	}).pushStack( stack );
};

// Logging function (Dominic Mitchell - http://happygiraffe.net/blog/2007/09/26/jquery-logging/)
jQuery.fn.log = function (msg) {
	console.log("%s: %o", msg, this);
	return this;
};



/// <reference path="jquery.intellisense.js"/>

// canalplus.js (c) 2009 June AB, Matias Larsson

// CANALPLUS
var CANALPLUS;

// Init when DOM is ready
$().ready(function() {
	CANALPLUS.init();
});

CANALPLUS = {
    enableHDStreaming: false,
    facebookApiKey: "166cbf3d3a70ad1520ad07ec9ab35645",
    enableSilentClientTests: true,

    init: function() {
        JUNE.init();
        JUNE.validator.init();
        JUNE.accordion.init();
        JUNE.hslide.init();
        JUNE.blockEnterSubmit();

        JUNE.initListener("click", "a.playMovie", CANALPLUS.player.load, "div#area1");

        CANALPLUS.fixDotNetBugs(); // TODO Remove this when the cause is eliminated

        // We need to listen for clicks on a bunch of elements in the sub menu (TODO time to switch to LiveQuery?)
        JUNE.initListener("click", "li.jXHR,h2,p,div,img,a.more,em", function(e) {
            if (e.target.className == "jXHR more" || $(e.target).parent().get(0).className == "jXHR more") {
                JUNE.ajax.load(e, "li.jXHR", null); //HACK rewrite without string
            }
            else {
                JUNE.ajax.load(e, "li.jXHR", "#area1a .jXHRArea1", "JUNE.runCode"); //HACK rewrite without string
            }
        }, "ul.accordion");

        JUNE.initListener("click", "a.tab", "CANALPLUS.switchTabs", "div#subMenu");

        JUNE.bindEvent("juneAjaxStart", CANALPLUS.ajaxStart);
        JUNE.bindEvent("juneAjaxEnd", CANALPLUS.ajaxEnd);

        this.initWarningNotifications();

        // Preload ajax loading anim
        JUNE.preload(["client/cs-img/ajax-loader.gif", "client/img/ajax-loader.gif"]);

        CANALPLUS.initGroupIcons();

        // Facebook chat
        CANALPLUS.fb.init();

    },

    analyticsName: null,

    trackAnalytics: function(evt, uri) {
        // Do the tracking when we have set the analytics name, not before
        if (CANALPLUS.analyticsName !== null) {
            JUNE.ajax.trackAnalytics(evt, uri, CANALPLUS.analyticsName);
            CANALPLUS.analyticsName = null;
        }
        else {
            JUNE.time.setTimeout(0.5, function() {
                CANALPLUS.trackAnalytics(evt, uri);
            });
        }
    },

    initGroupIcons: function() {
        $("div#subMenu div.groups a img[src*='-sel']").addClass("sel");
        $("div#subMenu div.groups a").each(function() {
            $(this).hover(function() {
                CANALPLUS.swapIcon($(this).children("img"));
            }, function() {
                CANALPLUS.swapIcon($(this).children("img"));
            });
        });
    },

    /* fixDotNetBugs: function() {
    // Get all H2 anchors in the sub menu and remove them but keep the text.
    $("div#subMenu h2 a").each(function() {
    $(this).replaceWith($(this).text());
    });
    }, */

    fixDotNetBugs: function() {
        // Get all H2's in the sub menu and remove their anchors. Keep the text.
        $("div#subMenu h2").each(function() {
            var title = $(this).text();
            $(this).remove("a");
            $(this).text(title);
        });
    },

    swapIcon: function($image) {
        var src = $image[0].src;
        if (src !== undefined && !$image.hasClass("sel")) {
            if (src.indexOf("-sel") >= 0) {
                $image[0].src = src.replace(/-sel.png/i, ".png")
            }
            else {
                $image[0].src = src.replace(/.png/i, "-sel.png")
            }
        }
    },

    ajaxStart: function(evt, uri) {
        CANALPLUS.player.cleanUp(); // Destroy wmpobject
        JUNE.ajax.toggleLoading(); // Display loading anim
        CANALPLUS.highlightLink(JUNE.clickedElement, JUNE.previousElement);
    },

    ajaxEnd: function(evt, uri) {
        JUNE.ajax.toggleLoading(); // Hide loading anim
        // Google Analytics tracking
        CANALPLUS.trackAnalytics();
    },

    switchTabs: function(href) {
        // Get tabId from link
        JUNE.queryString.uri = href;
        var tabId = JUNE.queryString.part("tab");

        // Switch accordion ul:s using tabId
        $("div#subMenu ul.accordion").each(function() {
            if ($(this)[0].id == "content" + tabId) {
                $(this).removeClass("hide");
            }
            else {
                $(this).addClass("hide");
            }
        });

        // Switch tab HTML
        var i = 1, $tabLink;
        $("div#subMenu div.head li").each(function() {
            if ($(this)[0].id == "tab" + tabId) {
                $(this).addClass("sel");

                $tabLink = $(this).find("a");
                $tabLink.replaceWith("<strong>" + $tabLink.text() + "</strong>");
            }
            else {
                $(this).removeClass("sel");

                $tabLink = $(this).find("strong");
                $tabLink.replaceWith("<a href=\"" + JUNE.addToQuerystring(JUNE.queryString.uri, "tab=" + i) + "\" class=\"tab\">" + $tabLink.text() + "</a>");
            }
            i++;
        });
    },

    highlightLink: function(hlElem, oldElem) {
        // Make sure we have a jQuery element, so we can use addClass and removeClass
        if (hlElem !== undefined && hlElem.addClass === undefined) {
            hlElem = $(hlElem);
        }
        if (oldElem !== undefined && oldElem.addClass === undefined) {
            oldElem = $(oldElem);
        }

        if (hlElem !== undefined) {
            hlElem.addClass("sel");
        }
        if (oldElem !== undefined) {
            oldElem.removeClass("sel");
        }
    },

    initWarningNotifications: function() {
        /* var warnings = $('#message');
        if (warnings == null || warnings.length == 0) { return; }

        var checkCookie = JUNE.cookie.get('hasSeenWarning');
        if (checkCookie == null || checkCookie != '1') {
        warnings.find('.closeButton').click(function(sender) {
        warnings.slideUp('slow');
        });
        JUNE.cookie.set('hasSeenWarning', '1'); // Use session cookie
        this.showWarningNotifications();
        } */

        this.showWarningNotifications();
        this.showBrowserVersionNotifications();
    },

    showWarningNotifications: function() {
        var $readMoreLink = $("#message p.messageHeading a");
        if ($readMoreLink.length > 0) {
            $readMoreLink[0].expanded = false;

            $readMoreLink.click(function(event) {
                event.preventDefault();
                CANALPLUS.toggleMessage($readMoreLink, "#messageBody");
            });
        }
        $("#message").slideDown("normal");
    },

    showBrowserVersionNotifications: function() {
        var warnings = $('#browserMessage');
        if (warnings == null || warnings.length == 0) { return; }
        var checkCookie = JUNE.cookie.get('hasSeenBrowserWarning');

        if (checkCookie == null || checkCookie != '1') {
            warnings.find('.closeButton').click(function(sender) {
                warnings.slideUp('slow');
                JUNE.cookie.set('hasSeenBrowserWarning', '1'); // Use session cookie
            });

            var $readMoreLink = $("#browserMessage p.messageHeading a");
            if ($readMoreLink.length > 0) {
                $readMoreLink[0].expanded = false;
                $readMoreLink.click(function(event) {
                    event.preventDefault();
                    CANALPLUS.toggleMessage($readMoreLink, "#browserMessageBody");
                });
            }
            $("#browserMessage").slideDown("normal");
        }
    },

    hideWarningNotifications: function() {
        $("#message").slideUp("slow");
    },

    toggleMessage: function(linkElement, messageSelector) {
        linkElement[0].expanded = !linkElement[0].expanded;
        if (linkElement[0].expanded) {
            $(messageSelector).slideDown("fast");
            linkElement.text(" - " + JUNE.lan("SERVICEMESSAGE_CLOSE"));
        }
        else {
            $(messageSelector).slideUp("fast");
            linkElement.text(" - " + JUNE.lan("SERVICEMESSAGE_READMORE"));
        }
    },

    checkPayExStatus: function(checkUrl, successUrl, interval) {
        if (!CANALPLUS.stopPayExStatusCheck) {
            $.ajax({
                url: checkUrl,
                complete: function(xhr, statusText) {
                    // If processing not completed, do another request after 3 seconds
                    if (xhr.status == 202) {
                        JUNE.time.setTimeout(interval, function() {
                            // Remove init on following calls
                            //checkUrl = JUNE.addToQuerystring(checkUrl,"init=false");

                            // Check status
                            CANALPLUS.checkPayExStatus(checkUrl, successUrl, interval);
                        });
                    }
                    else {
                        if (statusText === "success") {
                            // get redirect URL from XML response
                            var redirectUrl = $("payex redirectUrl", xhr.responseXML).text();
                            //redirectUrl = successUrl;
                            if (redirectUrl !== null && redirectUrl !== "" && redirectUrl !== undefined)
                                document.location.href = redirectUrl;
                            else {
                                $.unblockUI({
                                    onUnblock: function() { CANALPLUS.stopPayExStatusCheck = true; }
                                });
                                var errorCode = $("payex error code", xhr.responseXML).text();
                                var errorDesc = $("payex error description", xhr.responseXML).text();
                                if (errorCode === null || errorCode === "" || errorCode === undefined) {
                                    $("div[id$='PurchaseCompleteMessage']").show();
                                } else {
                                    $("p[id$='PurchaseUnregMessage']").html(errorDesc);
                                    $("p[id$='PurchaseUnregMessage']").show();
                                }

                            }
                        }
                    }
                }
            });
        }
        else {
            CANALPLUS.stopPayExStatusCheck = false;
        }
    },

    initReminders: function() {

        // Toggles expand/collapse by the click event of a.toggle 
        $("div.reminder a.toggle").click(function() {
            var parent = $(this).parent().get(0);
            var collapser = $(parent).find("div.collapser").get(0);
            var status = $(this).parents().filter("div.email").find("span").get(0);
            if (status) {
                $(status).text(JUNE.lan("REMINDER_UC_HEADER_INFO"));
                if ($(status).hasClass("saved")) { $(status).removeClass("saved"); }
                if ($(status).hasClass("notsaved")) { $(status).removeClass("notsaved"); }
            }
            $(collapser).slideToggle("fast")
        });

        // Submits the selected teams to the server
        $("div.reminder button.ajaxsubmit").click(function() {

            var url = "/Services/SaveReminders.ashx";
            var parameters = "?SelectedTeams=";
            var status = $(this).parents().filter("div.email").find("span").get(0);
            var collapser = $(this).parent().get(0);
            var containers = $(collapser).find("ul li span");
            var teamId = null;
            var checkbox = null;

            $(containers).each(function(i) {
                checkbox = $(containers[i]).find("input[type='checkbox']").get(0);
                teamId = $(containers[i]).find("input[type='hidden']").get(0);
                if (checkbox.checked == true && teamId) {
                    parameters += teamId.value + "=1,";
                }
                else {
                    parameters += teamId.value + "=0,";
                }
            });

            if (parameters.substring((parameters.length - 1), parameters.length) == ",") {
                parameters = parameters.substring(0, (parameters.length - 1));
            }

            // AJAX request, the callback changes the status text
            $.get(url + parameters, function(data) {
                if (data == "true") {
                    $(status).text(JUNE.lan("REMINDER_UC_HEADER_SAVE_SUCCESS"));
                    $(status).addClass("saved");
                }
                else {
                    $(status).text(JUNE.lan("REMINDER_UC_HEADER_SAVE_FAILURE"));
                    $(status).addClass("notsaved");
                }
                $(collapser).slideUp("slow");
            });

        });
    },

    initCustomToggle: function(linkSelector, objectToExpandSelector) {
        $(linkSelector).click(function(event) {
            event.preventDefault();
            var $link = $(this);
            var $target = $(objectToExpandSelector);

            JUNE.toggle($link, $target);
        });
    },

    stopPayExStatusCheck: false,

    fixArticleHeight: function() { //HACK
        $("div#area1a div.jXHRArea1").css("visibility", "hidden");
        JUNE.ajax.toggleLoading();
        window.setTimeout(this.setArticleHeight, 1000);
    },

    setArticleHeight: function() { //HACK
        var newHeight = $("div#area1a div.article").height();
        newHeight += $("div#area1a div.end").height(); // Rounded corners, empty div below div.article
        $("div#area1a div.jXHRArea1").height(newHeight);
        JUNE.ajax.toggleLoading();
        $("div#area1a div.jXHRArea1").css("visibility", "visible");
    },

    setGamelistHeight: function() {
        var hasGames = false;
        $("div#subMenu > ul").each(function() {
            if ($(this).children("li").length > 0) {
                hasGames = true;
                return false;
            }
        });

        if (!hasGames) {
            var newHeight = $("div#subMenu div.groups").height();
            newHeight += $("div#subMenu div.head").height();
            newHeight += $("div#subMenu p.noBroadcasts").height();
            newHeight += $("div#subMenu div.end").height();
            $("div#subMenu").height(newHeight);
        }
    },
    initSportsMatrix: function() {
        var maxCount = 0;
        $("div.col").each(function() {
            var count = $(this).children("div.item").length;
            if (count > maxCount) { maxCount = count };
        });
        $("div.col").each(function() {
            var thisCount = $(this).children("div.item").length;
            var empties = (maxCount - thisCount);
            if (empties > 0) { $(this).append("<div class=\"empty r" + empties + "\"></div>"); }
        });
    }
};

// CANALPLUS player
var priceId;
var minBitrate;
var bitratetestlocation;
var playbackObject;  
var onTestComplete;  
var playerId;

var MediaObject = new Object();
MediaObject.firstRun = true;
MediaObject.isTestStream = false;
MediaObject.isPromo = false;
MediaObject.isHighlight = false;
MediaObject.playNext = false;
MediaObject.isExternal = false;
MediaObject.gameId = 0;
MediaObject.showMedia = function() {

    if (this.firstRun) {

        // Remove the testing text
        $("#testing").fadeOut("fast");

        // Show the info part below the player?
        if (this.isTestStream) {
            $("div.item.program").height(392);
            // Make the playerContainer smaller for the new C Sports layout
            if (JUNE.siteRegion == "SE" || JUNE.siteRegion == "NO" || JUNE.siteRegion == "DK") {
                $("div#playerContainer").width(630);
                $("div#playerContainer").height(354);
                $("div#playerContainer").css("margin-left","3px");
            }
        }
        else if (this.isPromo) {
            $("div.item.program").height(430);
            $("div#playerContainer").height(430);
            $("#info").remove();
        }
        else {
            $("div.item.program").height(430);
            $("#info").fadeIn("fast");

            if(CANALPLUS.enableHDStreaming) {
                CANALPLUS.player.initInfoBubble(JUNE.lan("PLAYER_INFOBUBBLE_TITLE"), JUNE.lan("PLAYER_INFOBUBBLE"), 30);
            }
        }

        this.firstRun = false;
    }
};

MediaObject.onFvpNsStatus = function(nsStatus) {
	switch (nsStatus) {
		case "Stop":
			if (this.playNext) {
				CANALPLUS.player.initPlaylist();
			}
			else if (!wmpobject.playNext(playerId)) {
				wmpobject.destroy(playerId);

				// Clean up and display image on highlights
				if (!this.isTestStream) {
					CANALPLUS.player.displayLogo();
				}
			}
			break;
	}
};

jQuery.namespace("CANALPLUS.player");
CANALPLUS.player = {
    initInfoBubble: function(title, message, delay) {
        var t = setTimeout(function() { CANALPLUS.player.displayInfoBubble(title, message); }, delay * 1000);
    },

    displayInfoBubble: function(title, message) {
        var coords = $("#playerContainer").offset();
        if ($("#bubble").length > 0) { $("#bubble").remove(); }

        $("<div id='bubble'><h2><span>" + title + "</span><a href='#'>" + JUNE.lan("STANDARD_CLOSE") + "</a></h2>" + message + "</div>").appendTo("body");
        $("#bubble").css("top", (coords.top + 460) + "px").css("left", (coords.left + 3) + "px").fadeIn("slow");
        $("#bubble h2 a").click(function(event) {
            event.preventDefault();
            $("#bubble").fadeOut("fast", function() {
                $("#bubble").remove();
            });
        });
    },

    initPlaylist: function() {
        // fade out and destroy player
        wmpobject.destroy(playerId);
        $("#info").fadeOut("fast").remove();

        // get the expanded group
        var $group = $("div#subMenu ul.accordion:not(.hide) li.selected");

        // find current clip item
        //        var $clip = $group.find("a[href*='game=" + MediaObject.gameId + "']").parents("li.jXHR");
        var $clip = JUNE.clickedElement;

        // initialize new player with next content
        var $nextClip = $clip.next();
        //if ($nextClip.length > 0) {
        //    $nextClip.click();
        //}

        // 
        if ($nextClip.length > 0 && !$nextClip.hasClass("more")) {
            var link;
            if (link = JUNE.getSelectorLink($nextClip, "li.jXHR")) {
                JUNE.previousElement = JUNE.clickedElement;
                JUNE.clickedElement = $nextClip;

                JUNE.initAjax(link.href, "#area1a .jXHRArea1", "*", "JUNE.runCode", false);
            }
            else {
                CANALPLUS.player.displayLogo();
            }
        }
        else {
            CANALPLUS.player.displayLogo();
        }
    },
    displayLogo: function() {
        $("#info").remove();
        $("div.item.program").prepend("<img src=\"client/img/movie-end.png\" width=\"640\" height=\"430\" alt=\"\" class=\"hide\" />");
        $("div.item.program img").fadeIn("slow");
    },

    playContentInit: function(_format, _minBitrate, _bitratetestlocation, _playbackObject, _movieType, _gameId) {
        MediaObject.gameId = _gameId;
        if (tl) { // MPS Toolbox loaded
            CANALPLUS.player.playContent(_format, _minBitrate, _bitratetestlocation, _playbackObject, _movieType);
        }
        else { // Bind to the canalplusMPStoolboxLoaded custom event and start playback then
            JUNE.bindEvent("canalplusMPStoolboxLoaded", function() {
                CANALPLUS.player.playContent(_format, _minBitrate, _bitratetestlocation, _playbackObject, _movieType);
            });
        }
    },

    playContent: function(_format, _minBitrate, _bitratetestlocation, _playbackObject, _movieType) {
        MediaObject.isTestStream = false;
        MediaObject.isPromo = false;
        MediaObject.isHighlight = false;
        MediaObject.playNext = false;
        MediaObject.isExternal = false;

        if (_playbackObject.mainContent[0].format == "smooth") { toolbox_settings.WmvPlugin = "smoothstreaming"; }
        else if (_playbackObject.mainContent[0].format == "wmv") { toolbox_settings.WmvPlugin = "wmp"; }
        else { toolbox_settings.WmvPlugin = "" };

        if (_movieType == 1 || _movieType == 2) {
            MediaObject.isTestStream = true;
        }
        else if (_movieType == 3) {
            MediaObject.isPromo = true;
        }
        else if (_movieType == 4) {
            MediaObject.isHighlight = true;
            MediaObject.playNext = true;
        }
        else if (_movieType == 5) { // External Clips from ESPN
            MediaObject.isHighlight = true;
            MediaObject.playNext = true;
            MediaObject.isExternal = true;
        }

        playbackObject = _playbackObject;

        //format = _format.toLowerCase();
        //bitratetestlocation = _bitratetestlocation;
        format = playbackObject.mainContent[0].format.toLowerCase();
        bitratetestlocation = playbackObject.mainContent[0].bitratetestlocation;

        minBitrate = _minBitrate;



        // Skip tests and play instantly
        if (MediaObject.isTestStream || MediaObject.isPromo || MediaObject.isHighlight) {
            // Move up the testing div over the playerContainer to increase visibility
            var $testing = $("div#testing");
            $("div.item.program p[id$='CtlTestClipInfo']").after($testing);
            if (MediaObject.isTestStream || MediaObject.isPromo) {
                $("div#info").remove();
            }
            CANALPLUS.player.playbackRedirect(0, true);
        }
        else if (CANALPLUS.enableSilentClientTests == false) {
            CANALPLUS.player.playbackRedirect(0, true);
        }
        else {
            onTestComplete = this.playbackRedirect;

            if (format == "flv" || format == "flvlive" || format == "f4v") {
                verify.setupTest("flash");
            }
            else if (format == "smooth") {
                verify.setupTest("silverlight", "false");
            }
            else {
                verify.setupTest("stream");
            }
            verify.checkSystem(this.checkSimpleResult);
        }

    },

    playbackRedirect: function(messuredBW, forceView) {
        var playContent;
        for (var i in playbackObject.mainContent) {
            var content = playbackObject.mainContent[i];
            if (content.bitrate <= messuredBW || forceView) {
                playContent = content;
                break;
            }
        }

        // Create new player if necessary
        if (playerId === undefined) {
            playerId = wmpobject.create("playerContainer", "100%", "100%");

            wmpobject.addParam(playerId, "licenseuri", playbackObject.mainContent[0].licenseuri); // NEW (Silverlight)
            wmpobject.addParam(playerId, "enableContextMenu", "false");  // NEW 
            wmpobject.addListener(playerId, "all", function(id, wmp, eventName, args) {  // NEW 
                eventName = eventName.toLowerCase();
                if (eventName == "playstatechange") {
                    if (wmp.playState == 3) {
                        MediaObject.showMedia();
                    }
                }
            }
            );
        }

        toolbox_settings.FLAPlayerUri = "flvplayer.swf";
        toolbox_settings.FLAControllerFullUri = "flvplayerskin.swf";

        wmpobject.resetURIs(playerId);

        //Add PreContent Spot
        if (playbackObject.preContentSpot) {
            var extraParamsPre = new Object();
            extraParamsPre["contentUrl"] = playbackObject.postContentSpot;
            extraParamsPre["contentName"] = "";
            wmpobject.adduri(playerId, playbackObject.preContentSpot, "", false, false, false, null, null, extraParamsPre);
        }

        var extraParams = new Object();
        //Add MainContent
        extraParams["contentUrl"] = playContent.uri;
        if (format == "flvlive") extraParams["contentName"] = "Live";
        if (format == "flvlive") extraParams["isLive"] = "true";
        if (playbackObject.sessionParams) {
            extraParams["sessionContext"] = playbackObject.sessionParams.sessionContext;
            extraParams["subscriberObjectId"] = playbackObject.sessionParams.subscriberObjectId;
            extraParams["serviceObjectId"] = playbackObject.sessionParams.serviceObjectId;
            extraParams["contentObjectId"] = playbackObject.sessionParams.contentObjectId;
            extraParams["aguid"] = playContent.guid;
        }
        wmpobject.adduri(playerId, playContent.uri, "", true, true, true, null, null, extraParams);

        //Add PostContent Spot
        if (playbackObject.postContentSpot) {
            var extraParamsPost = new Object();
            extraParamsPost["contentUrl"] = playbackObject.postContentSpot;
            extraParamsPost["contentName"] = "Live";
            wmpobject.adduri(playerId, playbackObject.postContentSpot, "", false, false, false, null, null, extraParamsPost);
        }

        MediaObject.firstRun = true;
        wmpobject.play(playerId);

        if (format == "smooth") {
            MediaObject.showMedia();
        }

        // Only register playback of MPP content
        if (!MediaObject.isExternal) {
            CANALPLUS.player.registerPlayback(playbackObject, playContent, messuredBW);
        }
    },
    registerPlayback: function(playbackObject, playContent, messuredBW) {
        http_request = false;
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {

                }
            }
        }
        var url = "/Services/MPP/RegisterPlayback.aspx";
        var parameters = "?";
        parameters += "subscriberObjectId=" + playbackObject.sessionParams.subscriberObjectId;
        parameters += "&contentObjectId=" + playbackObject.sessionParams.contentObjectId;
        parameters += "&assetObjectId=" + playContent.assetObjectId;
        parameters += "&sourceObjectId=" + playContent.sourceObjectId;
        parameters += "&bandwidth=" + messuredBW;

        http_request.open('GET', url + parameters, true);
        http_request.send(null);
    },
    load: function(event) {
        var href = $(event.target)[0].href;
        var uri, bitrateAttribute = "";
        // get the player uri and load it using ajax
        //if (uri = $("div#info a.playMovie, ul.actions a.playMovie")[0].href) {
        if (uri = $(event.target)[0].href) {
            // Set the correct format from radio buttons
            $selectedFormat = $("ul.actions li.formats input").filter(":checked");

            // We need to provide the bitrate for HD-streaming to work
            if (CANALPLUS.enableHDStreaming) {
                selectedFormatBitrateType = $("#bitrate-" + $selectedFormat.val()).val();
                bitrateAttribute = "&bitrate=" + selectedFormatBitrateType;
            }

            if ($selectedFormat[0] !== undefined) {
                uri += "&format=" + $selectedFormat[0].value + bitrateAttribute;
            }

            var callback = "CANALPLUS.player.showTesting();JUNE.runCode()";
            //JUNE.initAjax(JUNE.addToQuerystring(uri, "ajax=1"), "#area1a .program", null, callback);
            JUNE.initAjax(JUNE.addToQuerystring(uri, "ajax=1"), "#area1a .jXHRArea1", "*", callback);
        }
    },

    countdown: function(seconds, uri) {
        $("ul.actions em.playMovieDim").countdown({ seconds: seconds, callback: 'CANALPLUS.player.activatePlayButton("' + uri + '")' });
    },

    activatePlayButton: function(uri) {
        $("ul.actions em.playMovieDim").fadeOut("fast", function() {
            var playerLink = "<a href=\"" + uri + "\" class=\"playMovie hide\">" + JUNE.lan("PLAYER_BEGINWATCHING") + "</a>";
            $(this).replace(playerLink);
            $(this).fadeIn("fast").removeClass("hide");
        });
    },

    showTesting: function() {
        /* if(!($.browser.msie && $.browser.version.substr(0,1)<7)) {    
        $("#testing p").effect("pulsate", { times: 2 }, 1000);
        } */
    },

    renderSimpleResult: function(type) {
        return "<li id=\"" + type + "\">"
		+ "<strong>" + JUNE.lan("TEST_" + type.toUpperCase()) + "</strong>"
		+ "<span class=\"err\"><span>" + JUNE.lan("TEST_STATUS_FAIL") + "</span></span>"
		+ "<p>" + JUNE.lan(type + "_FAIL") + "</p>"
		+ "</li>";
    },

    checkSimpleResult: function(actionsArray, verified) {
        var resultHTML = "";
        var fail = false;

        for (var i = 0; i < actionsArray.length; i++) {
            var action = actionsArray[i];

            // Add the result errors to the test list
            if (action.result != 1) {
                resultHTML += CANALPLUS.player.renderSimpleResult(action.name);
                fail = true;
            }
        }

        // Display errors if any, else check BW and display player
        if (fail) {
            var errorHtml = "<div id=\"testResults\">";
            errorHtml += "<h1>" + JUNE.lan("TEST_RESULTS") + "</h1>";
            errorHtml += "<ul class=\"test\">";
            errorHtml += resultHTML;
            errorHtml += "</ul></div>";

            // Remove the testing text
            $("#testing").fadeOut("slow");
            $("#playerContainer").html(errorHtml).fadeIn("slow");
        }
        else if (minBitrate > 0) {
            CANALPLUS.player.displayFxWmpText(actionsArray);  // If we have firefox and wmp-plugin update the testing text
            verify.checkBandWidth(bitratetestlocation, CANALPLUS.player.checkSimpleBandWidthResult, false, minBitrate);
        }
        // Skip BW test for clips
        else {
            CANALPLUS.player.displayFxWmpText(actionsArray);  // If we have firefox and wmp-plugin update the testing text
            onTestComplete(0, true);
        }
    },

    displayFxWmpText: function(actionsArray) {
        if ($.browser.mozilla) {
            $.each(actionsArray, function(key, val) {
                if (val.name == "wmpplugin" || val.name == "wmp") {
                    $("#testing p").replaceWith("<p>" + JUNE.lan("SIMPLETEST_WMPPLUGIN_OLDVERSION") + "</p>");
                    return false;
                }
            });
        }
    },

    checkSimpleBandWidthResult: function(messuredBW) {
        //messuredBW = 900;
        if (messuredBW < minBitrate) {
            var errorHtml = "<div class=\"confirm\"><p class=\"message err\">" + JUNE.lan("PLAYER_BWTOOLOW") + "</p>"
			+ "<p><button class=\"next\" onclick=\"onTestComplete(" + messuredBW + ", true);return false;\">"
			+ "<span>" + JUNE.lan("PLAYER_TRYANYWAY") + "</span></button></p></div>";

            var mBit = messuredBW / 1024;
            var mBitRequired = minBitrate / 1024;
            if (mBit = mBit.toFixed(1)) {
                errorHtml = errorHtml.replace(/BW0/g, mBit + " Mbit/s");
                errorHtml = errorHtml.replace("BW1", mBitRequired.toFixed(1) + " Mbit/s");
            }
            else {
                errorHtml = errorHtml.replace(/BW0/g, messuredBW + " kbit/s");
                errorHtml = errorHtml.replace("BW1", minBitrate + " kbit/s");
            }

            $("#playerContainer").html(errorHtml).fadeIn("slow");

            // Remove the testing text
            $("#testing").fadeOut("fast");

            // Show the info text
            if (!MediaObject.isTestStream) {
                $("#info").fadeIn("fast");
            }
            else {
                $("div.item.program").height(365);
            }
        }
        else {
            onTestComplete(messuredBW, false);
        }
    },

    displayWrongRegion: function() {

        $("#testing").fadeOut("slow");

        var errorHtml = "<h1>" + JUNE.lan("PLAYER_WRONGREGION_HEAD") + "</h1>";
        errorHtml += "<p>" + JUNE.lan("PLAYER_WRONGREGION_INFO") + "</p>";

        $("#playerContainer").html(errorHtml).fadeIn("slow");
    },

    cleanUp: function() {
        if (playerId !== undefined) {
            if (document.getElementById(wmpobject.arWmp[playerId].target) != null) { // Temporary fix
                //wmpobject.stop(playerId);
                wmpobject.destroy(playerId);
                //alert("wmpobject.destroy(" + playerId + ")");
            }
        }
    }
};

// CANALPLUS clientTest
var tl = false;
var bl = false;
var isFlash = false;
var isWMP = false;
var isSilverlight = false;
var isMovie = false;

// To make onToolboxLoad accessible from the included MPS scripts
function onToolboxLoad() { CANALPLUS.clientTest.onToolboxLoad(); }

jQuery.namespace("CANALPLUS.clientTest");
CANALPLUS.clientTest = {
    isFaqTest: false,
    isTestRunning: false,
    isTestDone: false,

    init: function() {
        bl = true;
        if (tl && bl) this.initTest(); //Both body and toolbox loaded?
    },

    onToolboxLoad: function() {
        tl = true;

        // Throw custom event when MPS toolbox is loaded
        $(window).trigger("canalplusMPStoolboxLoaded");

        if (tl && bl) this.initTest(); //Both body and toolbox loaded?
    },

    initTest: function() {
        verify.language = "sv"; //Override Browser Language

        //Setup "Rest of the sports" and Elitserien tests
        verify.setupTest("stream"); // Adds win and wmp internally
        verify.addTest("flash", 2);
        verify.addTest("silverlight", 3);

        //		verify.addTest("wmp", 3);
        //		verify.addTest("firewall_mms", 7);

        //Add sports tests
        //		verify.addTest("flash", 2);

        //		//Add film tests
        //		verify.addTest("win", 0);
        //		verify.addTest("ie", 1); // Is this required for WMP & WMRM
        //		verify.addTest("wmp", 3);
        //		verify.addTest("wmrm", 4);
        //		verify.addTest("wmrmind", 5);
        //		verify.addTest("firewall_mms", 7);

        var callback = this.checkSystemResult;
        if (!this.isTestRunning && !this.isTestDone) {
            // Temp disable button with js
            $("button.next").addClass("disabled").attr("disabled", "disabled");

            // Force activate next button after 30 sec
            JUNE.time.setTimeout(30, CANALPLUS.clientTest.enableNextStep);

            CANALPLUS.clientTest.isTestRunning = true;
            verify.checkSystem(callback);
            CANALPLUS.clientTest.isTestRunning = false;
            CANALPLUS.clientTest.isTestDone = true;
        }
    },

    enableNextStep: function() {
        // Display re-test button
        $("button.invisible").fadeIn("slow").removeClass("invisible");

        //Activate next step button
        $("button.next").removeClass("disabled").removeAttr("disabled");

        // Hide text
        $("p#clientTestProceed").hide("slow");
    },

    checkSystemResult: function(actionsArray, verified) {
        isFlash = true;
        isWMP = true;
        isSilverlight = true;
        //		isMovie = true;

        for (var i = 0; i < actionsArray.length; i++) {
            var action = actionsArray[i];

            //			if ((action.name == 'win' 
            //			    || action.name == 'ie' 
            //			    || action.name == 'wmp' 
            //			    || action.name == 'wmrm' 
            //			    || action.name == 'firewall_mms') && action.result != 1) isMovie = false;

            if ((action.name == 'flash') && action.result != 1) isFlash = false;

            if ((action.name == 'win'
			    || action.name == 'wmp'
				|| action.name == 'wmpplugin'
			    || action.name == 'firewall_mms') && action.result != 1) isWMP = false;

            if ((action.name == 'silverlight') && action.result != 1) isSilverlight = false;
			   
            //isWMP = false;

            // Set the result status in the test list or faq element
            if (CANALPLUS.clientTest.isFaqTest) {
                CANALPLUS.clientTest.setFaqResult(action.name, action.result);
            }
            else {
                CANALPLUS.clientTest.setResult(action.name, action.result);
            }
        }

        // Set the bandwidth tester callback
        var callback;
        if (CANALPLUS.clientTest.isFaqTest) {
            callback = CANALPLUS.clientTest.checkFaqBandWidthResult;
        }
        else {
            callback = CANALPLUS.clientTest.checkBandWidthResult;
        }

        // *** TODO Ska det vara samma BW-test f�r Flash och WMA?
        if (isFlash || isWMP || isSilverlight) {
            verify.checkBandWidth("rtmp://fl0.c43493.cdn.qbrick.com/43493", callback, true);  // NEW 
            $("#verify_pb").css("display", "inline");
        }
        else {
            callback(0);
        }
    },

    checkBandWidthResult: function(messuredBW) {
        // Set the result status in the test list
        if (CANALPLUS.enableHDStreaming) {  // New test rules
            switch (true) {
                case (messuredBW >= 1400):
                    CANALPLUS.clientTest.setResult("speed", 3, messuredBW);
                    break;
                case (messuredBW >= 1200):
                    CANALPLUS.clientTest.setResult("speed", 2, messuredBW);
                    break;
                case (messuredBW >= 900):
                    CANALPLUS.clientTest.setResult("speed", 1, messuredBW);
                    break;
                case (messuredBW == 0):
                    CANALPLUS.clientTest.setResult("speed", -1);
                    break;
                default:
                    CANALPLUS.clientTest.setResult("speed", 0, messuredBW);
                    break;
            }
        }
        else { // Old test rules
            switch (true) {
                case (messuredBW >= 1500):
                    CANALPLUS.clientTest.setResult("speed", 3, messuredBW);
                    break;
                case (messuredBW == 0):
                    CANALPLUS.clientTest.setResult("speed", -1);
                    break;
                default:
                    CANALPLUS.clientTest.setResult("speed", 0, messuredBW);
                    break;
            }
        }

        //		// Film BW test
        //		switch(true) {
        //			case (messuredBW >= 2200):
        //				CANALPLUS.clientTest.setResult("speed",3);
        //				break;
        //			case (messuredBW >= 1500):
        //				CANALPLUS.clientTest.setResult("speed",2);
        //				break;
        //			case (messuredBW >= 850):
        //				CANALPLUS.clientTest.setResult("speed",1);
        //				break;
        //			case (messuredBW == 0):
        //				CANALPLUS.clientTest.setResult("speed",-1);
        //				break;
        //			default:
        //				CANALPLUS.clientTest.setResult("speed",0);
        //				break;
        //		}

        // Set service status
        CANALPLUS.clientTest.setResult("sport", isFlash ? 1 : 0);
        CANALPLUS.clientTest.setResult("sportWMP", isWMP ? 1 : 0);
        CANALPLUS.clientTest.setResult("sportSmooth", isSilverlight ? 1 : 0);
        //      CANALPLUS.clientTest.setResult("film",isMovie ? 1:0);

        // Display re-test button and activate next step
        CANALPLUS.clientTest.enableNextStep();

        // Display stream test (hide stream buttons the user cannot see)
        if (CANALPLUS.enableHDStreaming) {
            if (!isFlash) {
                $("div#testClip a.low").addClass("hide");
            }

            // Remove this part if you need to test on Win7
            if (!isWMP) {
                $("div#testClip a.hi,div#testClip a.med").addClass("hide");
            }

            // Move the last visible element
            $("div#testClip a:not(.hide)").filter(":first").css("margin-right", "20px");
        }
        else {
            if (!isFlash) {
                $("div#testClip a.swf").addClass("hide");
            }

            if (!isWMP) {
                $("div#testClip a.wmp").addClass("hide");
            }

            if (!isSilverlight) {
                $("div#testClip a.silverlight").addClass("hide");
            }
        }

        if (isFlash || isWMP || isSilverlight) {
            $("div#testClip").slideDown("fast").removeClass("hide");
            $("p.note").addClass("divide");
        }
    },


    setFaqResult: function(name, code, bandwidth) {
        var result;
        switch (code) {
            case -1: // Test not run
                result = JUNE.lan("TEST_NOT_DONE");
                break;
            case 0: // Fail
                result = JUNE.lan("TEST_STATUS_FAIL");
                break;
            case 1: case 2: case 3: // Success
                result = JUNE.lan("TEST_STATUS_OK");
                break;
        }

        if (bandwidth !== undefined) {
            var mBit = bandwidth / 1024;
            if (mBit = mBit.toFixed(1)) {
                result = mBit + " Mbit/s.";
            }
            else {
                result = bandwidth + " kbit/s.";
            }
        }

        var $MPSTestData = $("input[id$='hfMPSTestData']");
        $MPSTestData.val($MPSTestData.val() + name + ": " + result + "|");
    },

    checkFaqBandWidthResult: function(messuredBW) {
        // Set the result status in the test list
        switch (true) {
            case (messuredBW >= 1500):
                CANALPLUS.clientTest.setFaqResult("speed", 3, messuredBW);
                break;
            case (messuredBW == 0):
                CANALPLUS.clientTest.setFaqResult("speed", -1);
                break;
            default:
                CANALPLUS.clientTest.setFaqResult("speed", 0, messuredBW);
                break;
        }
    },

    setResult: function(name, code, bandwidth) {
        var status = $("li#" + name + " > span");
        var statusName = status.children("span > span")[0];

        var description = $("li#" + name + " > p")[0];
        if (description) {
            switch (code) {
                case -1: // Test not run
                    description.innerHTML = JUNE.lan("TEST_NOT_DONE");
                    break;
                case 0: // Fail
                    status.addClass("err");
                    statusName.innerHTML = JUNE.lan("TEST_STATUS_FAIL");
                    description.innerHTML = JUNE.lan(name + "_FAIL");
                    break;
                case 1: // Success
                    status.addClass("ok");
                    statusName.innerHTML = JUNE.lan("TEST_STATUS_OK");
                    description.innerHTML = JUNE.lan(name + "_OK");
                    break;
                case 2: // Success, Level 2
                    status.addClass("ok");
                    statusName.innerHTML = JUNE.lan("TEST_STATUS_OK");
                    description.innerHTML = JUNE.lan(name + "_OK_S2");
                    break;
                case 3: // Success, Level 3
                    status.addClass("ok");
                    statusName.innerHTML = JUNE.lan("TEST_STATUS_OK");
                    description.innerHTML = JUNE.lan(name + "_OK_S3");
                    break;
            }

            if (bandwidth !== undefined) {
                var mBit = bandwidth / 1024;
                if (mBit = mBit.toFixed(1)) {
                    description.innerHTML += " " + mBit + " Mbit/s.";
                }
                else {
                    description.innerHTML += " " + bandwidth + " kbit/s.";
                }
            }

            // Remember the test result in a Cookie for use on the gameinfo page.
            JUNE.cookie.set('test-' + name, code);
        }

        // Add show events to the more information link
        if (name == "sport" || name == "sportWMP" || name == "sportSmooth") {
            var link = $(description).children("a.show");

            // Fix anchors since we use base href on the document
            if (link.length > 0) {
                if (document.location.href.indexOf("#") != -1) {
                    link[0].href = document.location.href;
                }
                else {
                    link[0].href = document.location.href + link[0].hash;
                }
            }

            // Add slider effect to the links
            link.click(function() {
                var moreInfo = $(this.hash);
                moreInfo.slideDown("slow");

                // We don't want to jump to the anchor the first click
                if (moreInfo[0].expanded != true) {
                    moreInfo[0].expanded = true;
                    return false;
                }
            });
        }
    }
};

// CANALPLUS Facebook
jQuery.namespace("CANALPLUS.fb");
CANALPLUS.fb = {
    initialized: false,
    chatActive: false,
    selector: "#fbSideComments",

    init: function() {
        /*$("#openFBchat").live("click", function() {
        $("#fbSideComments").slideToggle("fast");
        });*/
        if (!JUNE.hasValue(CANALPLUS.facebookApiKey)) {
            return; 
        }
        JUNE.initListener("click", "#openFBchat", function() {
            CANALPLUS.fb.chatActive = !CANALPLUS.fb.chatActive;
            var $fbChatArea = $(CANALPLUS.fb.selector);
            var $fbFrame = $("#fbSideCommentsStart, #fbSideCommentsEnd");
        
            if(CANALPLUS.fb.chatActive) {
                $fbFrame.toggleClass("expanded");
                $fbChatArea.animate({ height: "239px" }, 300, function() {
                    $fbChatArea.css({ minHeight: "239px", height: "auto" });
                    // Animation complete, start initializing facebook comments
                    if(!CANALPLUS.fb.initialized) {
                        CANALPLUS.fb.initFBenv(function() {  // initialize forum
                            CANALPLUS.fb.loadChat(); 
                        });
                    }
                    else {
                        CANALPLUS.fb.loadChat();
                    }
                });    
            }
            else {
                var height = $fbChatArea.height();
                $fbChatArea.css({ height: height + "px" }).get(0).style.minHeight="";
                CANALPLUS.fb.hideChat();
                $fbChatArea.fadeOut("fast", function() {
                    $fbChatArea.animate({ height: "0px" }, 300, function() {
                        $("#fbSideCommentsEnd").animate({ marginTop: "0px", height: "5px" }, 300, function() {
                            $fbFrame.fadeOut("fast", function() {
                                $fbFrame.css({ opacity: "0" }).removeClass("expanded").show().animate({ opacity: "100" }, 300, function() {
                                    $fbFrame.css({ opacity: "" });
                                    $("#fbSideCommentsEnd").css({ height: "", marginTop: ""}); 
                                });
                            });
                        });
                            
                    }); 
                });
            }
        });
    },

    initFBenv: function(callback) {
        // Create hidden FB-div (to let us lazy-load the FB-scripts)
        if($("#FB_HiddenContainer").length==0) {
            var fbHiddenDiv = document.createElement("div");
            fbHiddenDiv.id = "FB_HiddenContainer";
            fbHiddenDiv.style.position = "absolute";
            //fbHiddenDiv.style.left = "-10000px";
            fbHiddenDiv.style.top = "-10000px";
            fbHiddenDiv.style.width = "0px";
            fbHiddenDiv.style.height = "0px";
            $("body").append(fbHiddenDiv);
        }

        // Lazy load FB-scripts
        $.getScript("http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php", function() {
            FB.init(CANALPLUS.facebookApiKey, "/Connect/xd_receiver.htm");
            FB.ensureInit(function() {
                CANALPLUS.fb.initialized = true;
                callback();
            });
        });
    },

    loadChat: function(xfbml, target) {
        $(target).html(xfbml);
        if(CANALPLUS.fb.initialized) {
            FB.XFBML.Host.parseDomTree();
            $(CANALPLUS.fb.selector).children().show();
        }
    },

    hideChat: function() {
        $(CANALPLUS.fb.selector).children().hide();
        /*if(CANALPLUS.fb.initialized) {
            FB.XFBML.Host.parseDomTree();
        }*/
    }
};    


var l = new Array();l["$('ACCOUNT_ERROR_USERNAMEFORMAT','ANVÄNDARNAMN FÅR BARA INNEHÅLLA BOKSTÄVER, PUNKT, -, @, OCH _')"] = "";
l["$('BUYCARD_ERR_APPROVESUBSCRIPTION')"] = "";
l["$('BUYCARD_LABEL_BONUSCODE')"] = "";
l["$('BUYCARD_LABEL_CARDHOLDERNAME','NAMN PÅ KORTET')"] = "";
l["$('BUYCARD_LABEL_CARDNBR','KORTNUMMER')"] = "";
l["$('BUYCARD_LABEL_CVC','CVC-KOD')"] = "";
l["$('BUYCARD_LABEL_MONTH','MÅNAD')"] = "";
l["$('BUYCARD_LABEL_YEAR','ÅR')"] = "";
l["$('CAMPAIGN_CAPTCHA_ERR','DU VERKAR HA MATAT IN DET FÖRVRÄNGDA ORDET FEL, PROVA IGEN.')"] = "";
l["$('CAMPAIGN_CODE_ERR','ANGE DEN KORREKTA KODEN.')"] = "";
l["$('LOGIN_EMAIL','E-POST')"] = "$('LOGIN_EMAIL','E-post')";
l["$('LOGIN_PASSWORD','LÖSENORD')"] = "";
l["$('LOGIN_PINCODE','PIN-KOD')"] = "$('LOGIN_PINCODE','PIN-kode')";
l["$('LOGIN_USERNAME','ANVÄNDARNAMN')"] = "$('LOGIN_USERNAME','Brukernavn')";
l["*"] = "*";
l["ACCOUNT_ACCEPTTERMS"] = "Jeg har lest og <a href=\"{0}\" class=\"targetNew\">godkjenner brukervilkårene</a> hos CANAL+ Web-TV.";
l["ACCOUNT_ACTIVATION_PATH"] = "activateuser.aspx";
l["ACCOUNT_ADDITIONAL_AGREEMENT_INFO"] = "";
l["ACCOUNT_ADDRESS"] = "Adresse";
l["ACCOUNT_ALLSVENSKAN"] = "Allsvenskan";
l["ACCOUNT_BIRTHYEAR"] = "Fødselsår (f.eks 1972)";
l["ACCOUNT_CHANGEPASSWORD"] = "Klikk her for å endre brukernavn og passord.";
l["ACCOUNT_CHANGEUSERNAMEORPASSWORD"] = "Klikk her for å endre brukernavn og passord.";
l["ACCOUNT_CITY"] = "Sted";
l["ACCOUNT_COMPLETE"] = "Avslutt";
l["ACCOUNT_CREATE"] = "Opprett konto";
l["ACCOUNT_DTM"] = "DTM";
l["ACCOUNT_ELITSERIEN"] = "Elitserien";
l["ACCOUNT_EMAIL"] = "E-post";
l["ACCOUNT_EMAIL_DESCRIPTION"] = "E-postadressen er ditt brukernavn";
l["ACCOUNT_EMAIL_SENDER"] = "noreply@canalplus.no";
l["ACCOUNT_ERROR_ACCEPT"] = "Akseptér brukervilkårene";
l["ACCOUNT_ERROR_ADDRESS"] = "Fyll inn adresse";
l["ACCOUNT_ERROR_BIRTHYEAR"] = "";
l["ACCOUNT_ERROR_CITY"] = "Fyll inn sted";
l["ACCOUNT_ERROR_EMAIL"] = "Fyll inn din e-postadresse";
l["ACCOUNT_ERROR_EMAILFORMAT"] = "Oppgi en korrekt e-postadresse";
l["ACCOUNT_ERROR_FIRSTNAME"] = "Fyll inn ditt fornavn";
l["ACCOUNT_ERROR_LASTTNAME"] = "Fyll inn ditt etternavn";
l["ACCOUNT_ERROR_MOBILE"] = "Skriv inn et korrekt mobilnummer";
l["ACCOUNT_ERROR_MOBILEFORMAT"] = "Uriktig nummer";
l["ACCOUNT_ERROR_PASSWORD_NUMBERS"] = "Skriv samme passord en gang til";
l["ACCOUNT_ERROR_PASSWORD1"] = "Velg en passord. OBS! 4 siffer";
l["ACCOUNT_ERROR_PASSWORD2"] = "Fyll inn din passord igjen. OBS! 4 siffer";
l["ACCOUNT_ERROR_PASSWORD2EQUALTO"] = "Skriv samme passord en gang til";
l["ACCOUNT_ERROR_PHONE"] = "Ukorrekt nummer";
l["ACCOUNT_ERROR_PINCODEFORMAT"] = "OBS! 4 siffer";
l["ACCOUNT_ERROR_USERNAME"] = "Fyll inn din brukernavn";
l["ACCOUNT_ERROR_USERNAMEFORMAT"] = "Brukernavnet må innholde minst fem tegn. ";
l["ACCOUNT_ERROR_YEARFORMAT"] = "Fyll inn ditt fødselsår (f.eks 1972)";
l["ACCOUNT_ERROR_ZIPCODE"] = "Uriktig postnummer";
l["ACCOUNT_ERROR_ZIPCODEFORMAT"] = "Fyll inn korrekt postnummer";
l["ACCOUNT_FAILED_ACTIVATE_SUBSCRIBER"] = "Dessverre mislyktes aktiveringen av din brukerkonto. Prøv igjen eller kontakt vår <a href=\"mailto:webtvtech@canalplus.se\">support på webtvtech@canalplus.se</a>";
l["ACCOUNT_FAVOURITESPORTS"] = "Favorittsport";
l["ACCOUNT_FIRSTNAME"] = "Fornavn";
l["ACCOUNT_FORMULA3"] = "Formel 3";
l["ACCOUNT_GAMES_AND_CARDS"] = "Mine kort";
l["ACCOUNT_INCOMPLETE_INTRO"] = "";
l["ACCOUNT_LALIGA"] = "La Liga";
l["ACCOUNT_LASTNAME"] = "Etternavn";
l["ACCOUNT_LOGINPAGE_URL"] = "login.aspx";
l["ACCOUNT_LOGOUT_REDIRECTPAGE"] = "/";
l["ACCOUNT_MISSING_EMAILTEMPLATE"] = "Dessverre kan vi  for øyeblikket ikke sende deg en aktiveringsmail.";
l["ACCOUNT_MOBILE"] = "Mobilnummer";
l["ACCOUNT_MOTORSPORT"] = "SM-Liiga";
l["ACCOUNT_MY_PROFILE"] = "Min profil";
l["ACCOUNT_NEWSLETTER"] = "Nyhetsbrev";
l["ACCOUNT_NEWSLETTER_CSPORTS"] = "C SPORTS";
l["ACCOUNT_NEWSLETTER_DESCRIPTION"] = "Jeg ønsker å abonnere på nyhetsbrevet:";
l["ACCOUNT_NEWSLETTER_FILM"] = "Film og sport";
l["ACCOUNT_NEWSLETTER_SPORT"] = "Sport";
l["ACCOUNT_NHL"] = "DTM";
l["ACCOUNT_NONE"] = "Elitserien";
l["ACCOUNT_PASSWORD"] = "Passord";
l["ACCOUNT_PASSWORD_DESCRIPTION"] = "Passordet må inneholde minst 4 tegn";
l["ACCOUNT_PINCODE"] = "Passord";
l["ACCOUNT_PINCODE_DESCRIPTION"] = "Koden må bestå av fire siffer.";
l["ACCOUNT_PREMIERLEAGUE"] = "Premier League";
l["ACCOUNT_PWDREMINDER_INTRO"] = "Fyll inn e-postadressen din for påminnelse på mail";
l["ACCOUNT_PWDREMINDER_TITLE"] = "Glemt passord";
l["ACCOUNT_RECURRING_CARD_CONFIRM_NO"] = "";
l["ACCOUNT_RECURRING_CARD_CONFIRM_YES"] = "";
l["ACCOUNT_RECURRING_CARD_NEXT_DEBIT"] = "";
l["ACCOUNT_RECURRING_CARD_NEXT_RECEIPT_TEXT"] = "";
l["ACCOUNT_RECURRING_CARD_VALID_TO"] = "";
l["ACCOUNT_RECURRING_CONFIRM_QUESTION"] = "";
l["ACCOUNT_REMINDER_SUBSCRIPTIONS"] = "Mine påminnelser";
l["ACCOUNT_REPEAT_PASSWORD"] = "Gjenta passord";
l["ACCOUNT_REPEAT_PINCODE"] = "Gjenta Passord";
l["ACCOUNT_RESENDPASSWORD"] = "Send passordet";
l["ACCOUNT_SERIEA"] = "Serie A";
l["ACCOUNT_SEX"] = "Kjønn";
l["ACCOUNT_SMLIIGA"] = "Eredivisie";
l["ACCOUNT_SPEEDWAY"] = "Speedway";
l["ACCOUNT_UPDATE"] = "Oppdatér konto";
l["ACCOUNT_USERALREADYEXISTS"] = "Brukernavnet finnes allerede.";
l["ACCOUNT_USERCREATEFAILED"] = "Det lyktes ikke å opprette en brukerkonto.";
l["ACCOUNT_USEREMAILALREADYEXISTS"] = "Denne e-postadressen er allerede registrert. <a href=\"http://www.csports.se/templates/account/passwordreminder_cs.aspx\">Klikk her for å få passordet sendt til din e-post >></a>";
l["ACCOUNT_USERINFO"] = "Brukerinformasjon";
l["ACCOUNT_USERINFO_DESCRIPTION"] = " ";
l["ACCOUNT_USERINFO_DESCRIPTION_INCOMPLETE"] = "<p>Vennligst les og akseptér de oppdaterte brukervilkårene for å fortsette.</p>";
l["ACCOUNT_USERINFO_INCOMPLETE"] = "Takk for at du oppdaterer dine opplysninger!";
l["ACCOUNT_USERLOGGEDIN_TEXT"] = "<h1>Du er innlogget!</h1><p>{0}, Du er nå innlogget og kan benytte deg av våre tilbud.</p>";
l["ACCOUNT_USERNAME"] = "Brukernavn";
l["ACCOUNT_USERUPDATED_TEXT"] = "<h1>Dine brukeropplysninger er lagret</h1><p><br>Dine opplysninger gjør det enklere for oss å hjelpe deg som kunde. Takk for hjelpen!</br></p><p>Mvh CANAL+</p>";
l["ACCOUNT_USERUPDATEFAILED"] = "Det lyktes ikke å opprette en brukerkonto.";
l["ACCOUNT_WAITINGFORACTIVATION"] = "Du har enda ikke verifisert din e-postadresse og kan derfor ikke logge inn. Vi har sendt en ny aktiveringsmail til deg.";
l["ACCOUNT_WAITINGFORACTIVATION_FAILED"] = "Du har enda ikke verifisert din e-postadresse og kan derfor ikke logge inn. Det lyktes ikke å sende deg en ny aktiveringsmail.";
l["ACCOUNT_VERIFIED_BUTTON"] = "Jeg har bekreftet min konto";
l["ACCOUNT_VERIFYEMAIL_TEXT"] = "<h1>Aktivér din konto  - for å logge inn!</h1>                                   <p>Du har fått en e-post med en aktiveringslink til den angitte e-postadressen.</p><p>Klikk på linken i e-posten for å logge inn.</p><p>Mvh CANAL+</p>";
l["ACCOUNT_ZIPCODE"] = "Postnummer";
l["ACCOUNTINFO_MY_CARDS"] = "Mine kjøp";
l["ACCOUNTINFO_MY_TICKETS"] = "Mine billetter";
l["ACCOUNTINFO_NEXT_GAME"] = "";
l["ACCOUNTINFO_NO_PURCHASES"] = "Du har ingen kort eller gyldige billetter.";
l["BANNER_ALLSVENSKAN"] = "";
l["BANNER_FILM"] = "Lei og se film direkte!";
l["BANNER_LEAGUE_ALLSVENSKAN"] = "";
l["BANNER_LIVEGAMES"] = "Se live-kampene her!";
l["BANNER_SEASONCARD"] = "";
l["BANNER_TEAMCARD"] = "";
l["BROWSER_VERSION_NOTIFICATION_HEADER"] = "";
l["BROWSER_VERSION_NOTIFICATION_MESSAGE"] = "";
l["BTN_DOACTIVATE"] = "Aktivér kort";
l["BTN_DOBUY"] = "GJENNOMFØR KJØP";
l["BTN_NEXTSTEP"] = "NESTE";
l["BTN_NEXTSTEP_TOOLTIP"] = "Neste-knappen aktiveres når testen er ferdig!";
l["BTN_PREVSTEP"] = "FORRIGE STEG";
l["BTN_TO_NEXT_GAME"] = "";
l["BTN_TO_THE_GAME"] = "Til kampen";
l["BTN_USE_VALUECODE"] = "Klikk her om du har en rabatt- eller verdikode";
l["BUY_CONFIRMATIONHEADER_GAME"] = "Klart!";
l["BUY_CONFIRMATIONTEXT_AWAYCARD"] = "";
l["BUY_CONFIRMATIONTEXT_CARD"] = "";
l["BUY_CONFIRMATIONTEXT_GAME"] = "Du har nå kjøpt kampen  \"##PRODNAME##\" för ##PRICE##. Du vil kunne se kampen på din PC så snart den begynner. <a href=\"##GAMELINK##\"> Klikk her</a>for å komme til kampen eller for kampinformasjon";
l["BUY_CONFIRMATIONTEXT_GAME_PURCHASE"] = "Kjøpet er gjennomført, ordrenummer ##PURCHASEID##. Du kan se kampen på din datamaskin så snart den starter. ";
l["BUY_CONFIRMATIONTEXT_GAME_PURCHASE_WITHCODE"] = "Kjøpet er gjennomført. Du kan se kampen på din datamaskin så snart den starter. <a href=\"##GAMELINK##\">Klikk her</a> for å komme til kampen eller kampinfo.";
l["BUY_CONFIRMATIONTEXT_NHLCARD"] = "";
l["BUY_CONFIRMATIONTEXT_PUNCHCARD"] = "Ditt kjøp av klippekort er nå gjennomført.";
l["BUY_GAME_PRICE_WHEN_HASACCESS"] = "(Pris: 1 klipp)";
l["BUY_GAME_SOLD_OUT"] = "Kampen er utsolgt";
l["BUY_PUNCHCARD_CONFIRMATIONTEXT_STATUS"] = "Kjøpet er gjennomført og du har ##PUNCHES## klipp igjen på kortet. Du kan se kampen på datamaskinen din så snart den begynner. ";
l["BUY_PUNCHCARD_GAME_PURCHASE_EXTRA_INFO"] = "Du kan bruke klippekortet ditt for å betale for kampen over. <br/><br/><a href=\"##PURCHASELINK##\">Klikk her for å kjøpe en billett med klippekortet.</a><br/><br/>Vil du bruke klippekortet senere logger du bare inn og velger den kampen du ønsker å se. Når du skal betale får du automatisk muligheten til å bruke klippekortet som betaling.";
l["BUYCARD_ACCEPTTEST"] = "Jeg har lest og forstår innholdet av testresultatet. <a href=\"{0}\" target=\"_blank\">Generelle vilkår</a>";
l["BUYCARD_ACTCONFIRMATIONHEADER"] = "Klart!";
l["BUYCARD_ACTCONFIRMATIONTEXT"] = "Ditt kort er nå aktivert.";
l["BUYCARD_AWAYCARDLABEL"] = "";
l["BUYCARD_AWAYCARDNAME"] = "";
l["BUYCARD_AWAYCARDPRICE"] = "";
l["BUYCARD_CHOOSETEAM_LABEL"] = "-- Velg lag --";
l["BUYCARD_CONFIRMATION_PRICEINFO"] = "<br/>Ny pris: ##CARDPRICE##";
l["BUYCARD_CONFIRMATION_RECURRING_CARD_ALLSVENSKAN"] = "";
l["BUYCARD_CONFIRMATION_VALUECODEINFO"] = "Kjøpet er gjennomført. ";
l["BUYCARD_CONFIRMATIONHEADER"] = "Ditt kjøp er nå klart!";
l["BUYCARD_CONFIRMATIONHEADER_ACT"] = "";
l["BUYCARD_CONFIRMATIONTEXT"] = "";
l["BUYCARD_CONFIRMATIONTEXT_ACT"] = "";
l["BUYCARD_CONFIRMATIONTEXT_GEN"] = "Kjøpet er gjennomført.";
l["BUYCARD_CONFIRMATIONTEXT_REOCCURING"] = "";
l["BUYCARD_CONFIRMATIONTEXT_SEASON"] = "";
l["BUYCARD_CONFIRMATIONTEXT_TEAM"] = "";
l["BUYCARD_DESCRIPTION_LOGIN"] = "Du må logge inn for å gjennomføre kjøpet. Bruk den e-posadressen som du registrerte deg med, samt PIN-koden din. Du kan logge inn selv om du er registrert på den gamle portalen. Du vil bli bedt om å verifisere din e-postadresse. ";
l["BUYCARD_ELITSERIEN_5PUNCHCARD_NAME"] = "";
l["BUYCARD_ELITSERIEN_SMALLPUNCHCARD_NAME"] = "Klippekort med 5 klipp til Elitserien";
l["BUYCARD_ERR_ALREADYOWNSCONTENT"] = "Du har allerede tilgang til denne kampen!";
l["BUYCARD_ERR_ALREADYOWNSPROD"] = "Du har allerede tilgang til denne kampen!<br/> <a href=\"http://webtv.canalplus.no\">Klikk her for å komme til kamplisten</a>";
l["BUYCARD_ERR_APPROVESUBSCRIPTION"] = "";
l["BUYCARD_ERR_BONUSCODE"] = "Vennligst kontrollér at koden stemmer.";
l["BUYCARD_ERR_CARDHOLDERNAME"] = "Navn på kortet";
l["BUYCARD_ERR_CARDNBR"] = "Vennligst kontrollér ditt kortnummer";
l["BUYCARD_ERR_CVC"] = "Kontrollér at CVC-koden stemmer.";
l["BUYCARD_ERR_GAME_SOLD_OUT"] = "Kampen er utsolgt";
l["BUYCARD_ERR_ILLEGALVALUECODE"] = "Feil verdikode!";
l["BUYCARD_ERR_INCOMPLETEFORM"] = "Formularet er ikke korrekt utfylt!";
l["BUYCARD_ERR_MONTH"] = "Måned";
l["BUYCARD_ERR_MUSTCHOOSETEAM"] = "Du må velge et lag!";
l["BUYCARD_ERR_PUNCHCARDBUY_BY_SEASONCARDOWNER"] = "Du har allerede et sesongkort for denne ligaen og kan ikke kjøpe klippekort fordi du allerede har fri tilgang til alle kampene.";
l["BUYCARD_ERR_YEAR"] = "År";
l["BUYCARD_ERROR_ACTIVATIONFAILED"] = "Feil! Aktiveringen mislyktes!";
l["BUYCARD_ERROR_LABEL"] = "En feil oppstod. <br/>Vennligst forsøk igjen og kontakt <a href=\"mailto: webtvtech@canalplus.no\">webtvtech@canalplus.no</a> om feilen vedvarer. <br/>Feilkode: U300000 <br/><a href=\"http://www.csports.no\">Tilbake til forsiden.</a>";
l["BUYCARD_ERROR_PURCHASEFAILED"] = "En feil oppstod med betalingen. <br/>Vennligst forsøk igjen og kontakt <a href=\"mailto:webtvtech@canalplus.no\">webtvtech@canalplus.no</a>om feilen vedvarer. <br/>Feilkode: U400000";
l["BUYCARD_FAKECONFIRMATIONHEADER"] = "The system is configure for test purchases only, please contact webtvtech@canalplus.se so that they can correct the settings.";
l["BUYCARD_GAME_PRICE_COMMENT_ALLSVENSKAN"] = "";
l["BUYCARD_GENERAL_ERROR_PAYEX_COMPLETE"] = "En feil oppstod ved  betalingskontrollen. <br/>Vennligst forsøk igjen og kontakt <a href=\"mailto:webtvtech@canalplus.no\">webtvtech@canalplus.no</a>om feilen vedvarer. <br/>Felkod: C000055";
l["BUYCARD_GENERAL_ERROR_PAYEX_INIT"] = "En feil oppstod, og kjøpet kunne ikke gjennomføres. Prøv igjen.  <a href=\"http://webtv.canalplus.no\">Tilbake til forsiden.</a>";
l["BUYCARD_HELP_BONUSCODE"] = "Fyll inn din verdi- eller rabattkode i ruten over. Klikk deretter \"Neste\"";
l["BUYCARD_HELP_BONUSCODE_ACT"] = "";
l["BUYCARD_HELP_CVC"] = "CVC-koden er de 3 siste tallene på baksiden av kortet.";
l["BUYCARD_HELP_VALUECODEEX"] = "Verdikode";
l["BUYCARD_IFPROBLEM_PAYEX"] = "Klikk her og prøv igjen om ingenting skjer etter 30 sekunder!";
l["BUYCARD_IFPROBLEM_PAYEX_REPLY"] = "Venter på bekreftelse på ditt kjøp med ordrenummer ##PURCHASEID##.";
l["BUYCARD_LABEL_ACTIVATE"] = "Oppgi kode";
l["BUYCARD_LABEL_ACTIVATECARD"] = "Aktivér kort";
l["BUYCARD_LABEL_APPROVESUBSCRIPTION"] = "";
l["BUYCARD_LABEL_BANK"] = "";
l["BUYCARD_LABEL_BONUSCODE"] = "Verdikode";
l["BUYCARD_LABEL_BONUSCODE_ACT"] = "Aktiveringskode";
l["BUYCARD_LABEL_CARD"] = "Kort";
l["BUYCARD_LABEL_CARDHOLDERNAME"] = "Navn på kortet";
l["BUYCARD_LABEL_CARDNBR"] = "Kortnummer";
l["BUYCARD_LABEL_CHOOSECARD"] = "Kjøp billett eller kort";
l["BUYCARD_LABEL_CVC"] = "CVC-kode";
l["BUYCARD_LABEL_LOGIN"] = "Innlogging kreves";
l["BUYCARD_LABEL_LOGIN_2"] = "Logg inn";
l["BUYCARD_LABEL_MONTH"] = "Måned";
l["BUYCARD_LABEL_PAY"] = "Velg betalingsmåte";
l["BUYCARD_LABEL_PAYMETHODS"] = "Velg betalingsmåte";
l["BUYCARD_LABEL_PUNCHCARD"] = "Klippekort";
l["BUYCARD_LABEL_PURCHASECANCELLED"] = "Kjøpet er avbrutt og ingenting er trukket fra din konto. <br/><a href=\"http://webtv.canalplus.no\">Tilbake til forsiden.</a>";
l["BUYCARD_LABEL_PURCHASEUNREG"] = "Kjøpet ble gjennomført, men er ikke registrert på din konto. Vennligst kontakt kundeservice og oppgi ordrenummer ##PURCHASEID##.";
l["BUYCARD_LABEL_YEAR"] = "År";
l["BUYCARD_MUSTACCEPTTEST"] = "Akseptér brukervilkårene.";
l["BUYCARD_PGLOGIN_HEAD"] = "Login";
l["BUYCARD_PRICE_COMMENT_2009"] = "";
l["BUYCARD_PRICE_COMMENT_2009 HIGHLIGHTS"] = "";
l["BUYCARD_PRICE_COMMENT_2009/2010"] = "";
l["BUYCARD_PRICE_COMMENT_2009/2010 GROUP C"] = "";
l["BUYCARD_PRICE_COMMENT_2009/2010 HIGHLIGHTS"] = "";
l["BUYCARD_PRICE_COMMENT_2009/2010 J OR B"] = "";
l["BUYCARD_PRICE_COMMENT_2010"] = "";
l["BUYCARD_PRICE_COMMENT_2010 HIGHLIGHTS"] = "";
l["BUYCARD_PRICE_COMMENT_2010/2011"] = "";
l["BUYCARD_PRICE_COMMENT_ÆRESDIVISIONEN "] = "";
l["BUYCARD_PRICE_COMMENT_ÆRESDIVISIONEN 2009/2010"] = "";
l["BUYCARD_PRICE_COMMENT_ALLSVENSKA SAMMANDRAG"] = "";
l["BUYCARD_PRICE_COMMENT_ALLSVENSKAN"] = "";
l["BUYCARD_PRICE_COMMENT_ALLSVENSKAN KVAL"] = "";
l["BUYCARD_PRICE_COMMENT_BUNDESLIGA - HÅNDBOLD"] = "";
l["BUYCARD_PRICE_COMMENT_CARLING CUP"] = "";
l["BUYCARD_PRICE_COMMENT_CASINO EREDIVISIE"] = "";
l["BUYCARD_PRICE_COMMENT_CASINO EREDIVISIE 2009/2010"] = "";
l["BUYCARD_PRICE_COMMENT_CHAMPIONS LEAGUE"] = "";
l["BUYCARD_PRICE_COMMENT_CHAMPIONS LEAGUE-KVALIFIKATION"] = "";
l["BUYCARD_PRICE_COMMENT_COPA DEL REY"] = "";
l["BUYCARD_PRICE_COMMENT_COPA DEL SOL"] = "";
l["BUYCARD_PRICE_COMMENT_DAMALLSVENSKAN"] = "";
l["BUYCARD_PRICE_COMMENT_DTM"] = "";
l["BUYCARD_PRICE_COMMENT_DTM: NÜRBURGRING"] = "";
l["BUYCARD_PRICE_COMMENT_DTM: RACE"] = "";
l["BUYCARD_PRICE_COMMENT_EHF CHAMPIONS LEAGUE"] = "";
l["BUYCARD_PRICE_COMMENT_ELITSERIEN"] = "";
l["BUYCARD_PRICE_COMMENT_EM"] = "";
l["BUYCARD_PRICE_COMMENT_EM-KVAL"] = "";
l["BUYCARD_PRICE_COMMENT_EM-KVALIK"] = "";
l["BUYCARD_PRICE_COMMENT_ENGLANNIN VALIOLIIGA"] = "";
l["BUYCARD_PRICE_COMMENT_EREDIVISIE"] = "";
l["BUYCARD_PRICE_COMMENT_EREDIVISIE 2009/2010"] = "";
l["BUYCARD_PRICE_COMMENT_EUROPA LEAGUE"] = "";
l["BUYCARD_PRICE_COMMENT_EUROPALIGAN"] = "";
l["BUYCARD_PRICE_COMMENT_FORMEL 3"] = "";
l["BUYCARD_PRICE_COMMENT_FORMEL 3: EURO SERIES"] = "";
l["BUYCARD_PRICE_COMMENT_FORMULA 3"] = "";
l["BUYCARD_PRICE_COMMENT_FORMULA 3: EURO SERIES"] = "";
l["BUYCARD_PRICE_COMMENT_HANDBOLL"] = "";
l["BUYCARD_PRICE_COMMENT_HOLLANNIN EREDIVISIE"] = "";
l["BUYCARD_PRICE_COMMENT_INDY 500"] = "";
l["BUYCARD_PRICE_COMMENT_INDYCAR "] = "";
l["BUYCARD_PRICE_COMMENT_INDYCAR: MID-OHIO SPORTS CAR COURSE"] = "";
l["BUYCARD_PRICE_COMMENT_INNEBANDY"] = "";
l["BUYCARD_PRICE_COMMENT_KAMPSPORT: UFC FIGHT NIGHT"] = "";
l["BUYCARD_PRICE_COMMENT_KAMPSPORT: UFC LIVE"] = "";
l["BUYCARD_PRICE_COMMENT_KVALSERIEN "] = "";
l["BUYCARD_PRICE_COMMENT_LA LIGA"] = "";
l["BUYCARD_PRICE_COMMENT_LANDSKAMP"] = "";
l["BUYCARD_PRICE_COMMENT_MAJOR LEAGUE SOCCER"] = "";
l["BUYCARD_PRICE_COMMENT_NÜRBURGRING"] = "";
l["BUYCARD_PRICE_COMMENT_OL ISHOCKEY SEMIFINALE 2"] = "";
l["BUYCARD_PRICE_COMMENT_OL: ALPIN"] = "";
l["BUYCARD_PRICE_COMMENT_OL: ISHOCKEY"] = "";
l["BUYCARD_PRICE_COMMENT_OL: ISHOCKEY FINALE"] = "";
l["BUYCARD_PRICE_COMMENT_OL: ISHOCKEY SEMIFINALE"] = "";
l["BUYCARD_PRICE_COMMENT_PARALLEL STORSLALOM, KVINDER"] = "";
l["BUYCARD_PRICE_COMMENT_PEAK ANTIFREEZE INDY 300 "] = "";
l["BUYCARD_PRICE_COMMENT_PREMIER LEAGUE"] = "";
l["BUYCARD_PRICE_COMMENT_SAS LIGAEN "] = "";
l["BUYCARD_PRICE_COMMENT_SERIE A"] = "";
l["BUYCARD_PRICE_COMMENT_SM SLUTSPELET"] = "";
l["BUYCARD_PRICE_COMMENT_SM SLUTSPELET 2010"] = "";
l["BUYCARD_PRICE_COMMENT_SM SLUTSPILLET"] = "";
l["BUYCARD_PRICE_COMMENT_SM SLUTSPILLET 2010"] = "";
l["BUYCARD_PRICE_COMMENT_SM-LIIGA"] = "";
l["BUYCARD_PRICE_COMMENT_SPEEDWAY"] = "";
l["BUYCARD_PRICE_COMMENT_SUPERETTAN"] = "";
l["BUYCARD_PRICE_COMMENT_SUPERLIGAN"] = "";
l["BUYCARD_PRICE_COMMENT_SUPERSERIEN"] = "";
l["BUYCARD_PRICE_COMMENT_SVENSKA CUPEN"] = "";
l["BUYCARD_PRICE_COMMENT_THE CHAMPIONSHIP"] = "";
l["BUYCARD_PRICE_COMMENT_UCL 2009-2010"] = "";
l["BUYCARD_PRICE_COMMENT_UEFA CHAMPIONS LEAGUE 2009-2010"] = "";
l["BUYCARD_PRICE_COMMENT_UEFA EUROPA LEAGUE "] = "";
l["BUYCARD_PRICE_COMMENT_UEL 2009-2010"] = "";
l["BUYCARD_PRICE_COMMENT_UFC 2010 (DANMARK)"] = "";
l["BUYCARD_PRICE_COMMENT_UFC LIVE 2009"] = "";
l["BUYCARD_PRICE_COMMENT_WIMBLEDON"] = "";
l["BUYCARD_PRICE_COMMENT_VM 2010"] = "";
l["BUYCARD_PUNCHCARD_BUY_INFO"] = "<br/>Du har ##PUNCHES## klipp igjen.";
l["BUYCARD_PUNCHCARD_STATUS_INFO"] = "Du har brukt et klipp på ditt klippekort. Det er ##PUNCHES## igjen på kortet.";
l["BUYCARD_PURCHASE_ERR"] = "En feil oppstod under oppkoblingen mot betalingsleverandøren. ";
l["BUYCARD_PURCHASE_INFO"] = "";
l["BUYCARD_SEASONCARD_NAME"] = "";
l["BUYCARD_SERIEA_5PUNCHCARD_NAME"] = "Klippekort med 5 klipp til Serie A 08/09";
l["BUYCARD_SERIEA_SMALLPUNCHCARD_NAME"] = "Klippekort med 5 klipp til Serie A";
l["BUYCARD_STEP1BHEAD"] = "1. Produktinformasjon";
l["BUYCARD_STEP1HEAD"] = "1. Kjøp billett";
l["BUYCARD_STEP2HEAD"] = "2. Test PC'en din";
l["BUYCARD_STEP3BHEAD"] = "3. Aktivér kort";
l["BUYCARD_STEP3HEAD"] = "3. Betal";
l["BUYCARD_TEAMCARD_BASENAME"] = "";
l["BUYCARD_TENCARD_NAME"] = "";
l["BUYCARD_TIMEOUT_ERROR_PAYEX_COMPLETE"] = "En feil oppstod da vi skulle kontrollere betalingen din. Vennligst forsøk igjen. <br/>Feilkode: C008888";
l["BUYCARD_TIMEOUT_ERROR_PAYEX_INIT"] = "Det er for øyeblikket mange som forsøker å betale og køen er full. <br/>Vennligst prøv igjen senere og husk at du alltid kan kjøpe billetten din i forkant av sendingen, så slipper du å gå glipp av noe. <br/>Feilkode: Q999000 <br/><a href=\"http://webtv.canalplus.no\">Tilbake til forsiden.</a>";
l["BUYCARD_WAITING_FOR_PAYEX"] = "Vennligst vent, kontakter betalingsleverandøren...";
l["BUYCARD_WAITING_FOR_PAYEX_REPLY"] = "Vennligst vent, kontakter betalingsleverandøren...";
l["BUYCARD_VALIDATION_CHOOSETEAM"] = "";
l["BUYCARD_VALIDATION_HEADER"] = "Følgende felt er feil utfylt eller mangler innhold:";
l["BUYFLOW_PAGE_PATH"] = "kjop";
l["CAMPAIGN_CAPTCHA"] = "";
l["CAMPAIGN_CAPTCHA_INFO"] = "";
l["CAMPAIGN_CODE"] = "";
l["CAMPAIGN_CODE_BODY"] = "";
l["CAMPAIGN_CODE_ERROR"] = "";
l["CAMPAIGN_CODE_HEAD"] = "";
l["CAMPAIGN_CODE_HEAD2"] = "";
l["CAMPAIGN_EMAIL_HTMLBODY"] = "";
l["CAMPAIGN_EMAIL_SENDER"] = "WebTV <noreply@canalplus.no>";
l["CAMPAIGN_EMAIL_SUBJECT"] = "";
l["CAMPAIGN_IS_INACTIVE"] = "";
l["CAMPAIGN_LABEL_LOGIN"] = "";
l["CAMPAIGN_LOGIN_NEWACCOUNT"] = "";
l["CAMPAIGN_LOGIN_NEWACCOUNT_BODY"] = "";
l["CAMPAIGN_LOGIN_NEWACCOUNT2"] = "Opprett konto";
l["CAMPAIGN_LOGIN_NEWACCOUNTINFO"] = "";
l["CAMPAIGN_LOGININFO"] = "";
l["CAMPAIGN_NEXT"] = "";
l["CAMPAIGN_START_HEAD"] = "";
l["CAMPAIGN_USER_NOT_LOGGEDIN"] = "";
l["CAMPAIGN1_ILLEGAL_REGION"] = "Denna kampanj är bara tillgänglig i Sverige!";
l["COMMON_QUESTIONS"] = "Generelle spørsmål";
l["COMMON_QUESTIONS_WEBTV"] = "Spørsmål om Web-TV";
l["COMMUNICATOR_EXCEPTIONRAISED"] = "Kjøpet ble avbrutt eller kunne ikke gjennomføres. Vennligst forsøk igjen.</br>Feilkode: R650000";
l["COUNTDOWN_TIMETOSTART"] = "Starter om:";
l["E-POST"] = "E-post";
l["ERR_CARDS_ID"] = "Produktet du har valgt er ikke tilgjengelig. <br/>Vennligst velg et av produktene nedenfor. ";
l["ERR_CARDS_TYPE"] = "Ukjent korttype!";
l["ERR_CONTENT_REGION_CHECK"] = "Den valgte kampen kan ikke vises i regionen tilhørende din ip-adresse. ";
l["ERR_GAME_LOAD_FAILED"] = "Kan ikke vise ønsket kamp!";
l["ERR_GAME_PRICE_NOT_FOUND"] = "Could not get price from MPP!";
l["ERR_GAMEINFO_NOT_FOUND"] = "Den ønskede kampen ble ikke funnet!";
l["ERR_GENERAL_ERROR"] = "En feil oppstod ved visning av siden!";
l["ERR_GET_MPP_USER"] = "Kunne ikke finne den angitte brukeren!";
l["ERR_GROUPFACT_NOT_FOUND"] = "";
l["ERR_ILLEGAL_VALUECODE_FORMAT"] = "Denne rabatt- eller verdikoden er ikke gyldig. Vennligst kontroller koden og prøv på nytt.";
l["ERR_MPP_CONTENT_LOAD_ERROR"] = "";
l["ERR_MPP_CONTENT_NOT_FOUND"] = "";
l["ERR_MPPTESTCONTENT_1"] = "";
l["ERR_MPPTESTCONTENT_2"] = "";
l["ERR_NO_CONTENT_ACCESS"] = "Du har ikke tilgang til denne kampen/filmen. <br/>Vennligst kjøp en billett for å se programmet.";
l["ERR_NO_MPP_SETTINGS"] = "";
l["ERR_NO_SUCH_CONTENT"] = "Innhold ikke funnet!";
l["ERR_ORDER_CARD_UNKNOWN"] = "Dette kortet er dessverre ikke tilgjengelig.";
l["ERR_ORDER_NO_CARD_CHOOSEN"] = "Ingen kort er valgt.";
l["ERR_ORDER_PARAMS"] = "";
l["ERR_ORDER_PRODUCT_NOT_FOUND"] = "Produktet kan ikke kjøpes for øyeblikket.";
l["ERR_SHOP_INPUT"] = "Feil kort er valgt. Vennligst forsøk på nytt.";
l["ERR_SHOP_NO_GAME"] = "Ingen kamp er valgt!";
l["ERR_SHOP_NO_PRODUCT_CHOOSEN"] = "Ingen produkt er valgt!";
l["ERROR_GOBACK"] = "";
l["ERROR_MISSINGPAGE_FOOTER"] = "";
l["ERROR_MISSINGPAGE_HEADING"] = "";
l["ERROR_MISSINGPAGE_INTRO"] = "";
l["ERROR_START"] = "";
l["FAQ_CLIENTTEST_PAGE"] = "faq/klienttest.aspx";
l["FAQ_INSTRUCTIONS"] = "Beskriv ditt spørsmål så detaljert som mulig. Det gjør det enklere for oss, og du får raskere svar. Svaret blir sendt til din e-postadresse.";
l["FB_DISCUSSGAME"] = "";
l["FILM_FAIL"] = "Ikke godkjent. Merk at Mac-brukere ikke har tilgang til denne tjenesten enda. <a href=\"#testResults\" class=\"show\">Mer informasjon</a>.";
l["FILM_OK"] = "Godkjent";
l["FIREWALL_MMS_FAIL"] = "Ikke godkjent. Vennligst sjekk dine brannmurinnstillinger.";
l["FIREWALL_MMS_OK"] = "Godkjent";
l["FLASH_DOWNLOAD"] = "Du må innstallere Flash Player. <a href=\"http://www.adobe.com/go/getflashplayer\" class=\"targetNew\">Last den ned her!</a>";
l["FLASH_FAIL"] = "Ikke godkjent. Last ned den versjonen som kreves <a href=\"templates/cardshop/flashdownload.aspx\">her!</a>";
l["FLASH_OK"] = "Godkjent";
l["FLASHCHANNEL_HITS"] = "";
l["FOOTER_CSPORTS_ADDRESS"] = "C More Entertainment AB, Regeringsgatan 25, SE-115 84 Stockholm";
l["FOOTER_CSPORTS_COPYRIGHT"] = "Copyright © 2009 C More Entertainment AB. All rights reserved";
l["FOOTER_CSPORTS_PUBLISHER"] = "Ansvarlig utgiver: Mats Örbrink utnevnt av C More Entertainment AB";
l["FOOTER_SITEMAP_LINK_HTML"] = "<a href=\"/sitemap.aspx\">Sitemap</a>";
l["FORM_PLAYER_STARTPG_ONERRORLINK"] = "Gå til sportssiden";
l["GAMEINFO_ELITSERIEN_GAME_DEFAULT_PRICE"] = "109 NOK";
l["GAMEINFO_FORMATS_AVAILABLE"] = "Sendningen kan ses i:";
l["GAMEINFO_FORMATS_FLV"] = "";
l["GAMEINFO_FORMATS_FLVLIVE"] = "Flash";
l["GAMEINFO_FORMATS_FLVLIVE_LOW"] = "Lav";
l["GAMEINFO_FORMATS_FLVLIVE_MED"] = "Middels";
l["GAMEINFO_FORMATS_HEAD"] = "Jeg vil se sendingen i:";
l["GAMEINFO_FORMATS_ONLYFLVLIVE"] = "Denne sendingen kan kun sees i Flash.";
l["GAMEINFO_FORMATS_ONLYSMOOTH"] = "Denne sendingen finnes kun som Silverlight.";
l["GAMEINFO_FORMATS_ONLYWMV"] = "Denne sendingen kan kun sees i Windows Media.";
l["GAMEINFO_FORMATS_SHORT_FLV"] = "Flash";
l["GAMEINFO_FORMATS_SHORT_FLVLIVE"] = "Flash";
l["GAMEINFO_FORMATS_SHORT_WMV"] = "Windows Media";
l["GAMEINFO_FORMATS_SMOOTH"] = "Silverlight";
l["GAMEINFO_FORMATS_WMV"] = "WMP (PC)";
l["GAMEINFO_FORMATS_WMV_HIGH"] = "Høj";
l["GAMEINFO_FORMATS_WMV_MED"] = "Middels";
l["GAMEINFO_NHL_GAME_DEFAULT_PRICE"] = "";
l["GAMEINFO_NHL_PRICE_POSTFIX"] = "";
l["GAMEINFO_PRICE_POSTFIX"] = " pr kamp";
l["GAMEINFO_PRICE_PREFIX"] = "";
l["GAMEINFO_SERIE_GAME_DEFAULT_PRICE"] = "";
l["GAMEINFO_SERIEA_GAME_DEFAULT_PRICE"] = "fr 55 NOK";
l["GAMEINFO_SOLD_OUT_TEXT"] = "Utsolgt";
l["GAMELIST_LOADFACT_TEXT"] = "Vis fakta om ligaen";
l["GAMELIST_LOADMORE_TEXT"] = "Vis flere";
l["GAMELIST_NO_BROADCASTS"] = "Det er ingen programlagte sendinger for øyeblikket.";
l["GAMELIST_NO_HIGHLIGHTS"] = "Ingen videoklipp er tilgjengelige for øyeblikket.";
l["GAMESLIST_LINKLABEL"] = "Se";
l["GAMESLIST_MOREBROADCASTS"] = "Vis flere";
l["GAMESLIST_TAB1LABEL"] = "LIVEKAMPER";
l["GAMESLIST_TAB2LABEL"] = "Klipp";
l["GAMESLIST_TAB3LABEL"] = "Archive";
l["GAMESLIST_TITLE"] = "Kommende kamper";
l["GENERAL_READ_MORE"] = "Les mer";
l["GENERAL_SEX_FEMALE"] = "Kvinne";
l["GENERAL_SEX_MALE"] = "Mann";
l["HEAD_BUYCARD"] = "Kjøp og aktivér kort";
l["HIGHLIGHTS_FROM_PREFIX"] = "Fra";
l["HOME_BOTTOM_TEASERS_HEADING"] = "Øvrige tilbud fra CANAL+ og C SPORTS";
l["HOME_TOPGAMES"] = "TOPPKAMPER";
l["HOME_TOPGAMES_DESCRIPTION"] = "De største kampene fra toppligaene innen fotball og hockey";
l["IE_FAIL"] = "Ikke godkjent";
l["IE_OK"] = "Godkjent";
l["IMGALT_GETSTARTED"] = "Kom i gang";
l["INFO_ANALYTICSTITLE"] = "";
l["INFO_DOCTITLE"] = "C SPORTS";
l["INFO_MAIL"] = "info@canalplus.no";
l["INFO_MAIL_WEBTV"] = "webtvtech@canalplus.no";
l["INFO_OR"] = "";
l["INFO_PHONE"] = " ";
l["INFO_PHONE_WEBTV"] = "";
l["LEAGUE_FACT_0"] = "";
l["LEAGUE_FACT_1"] = "";
l["LEAGUE_FACT_100"] = "";
l["LEAGUE_FACT_10001"] = "";
l["LEAGUE_FACT_10002"] = "";
l["LEAGUE_FACT_10003"] = "";
l["LEAGUE_FACT_10004"] = "";
l["LEAGUE_FACT_10005"] = "";
l["LEAGUE_FACT_10006"] = "";
l["LEAGUE_FACT_10007"] = "";
l["LEAGUE_FACT_10008"] = "";
l["LEAGUE_FACT_10009"] = "";
l["LEAGUE_FACT_10010"] = "";
l["LEAGUE_FACT_10011"] = "";
l["LEAGUE_FACT_10012"] = "";
l["LEAGUE_FACT_101"] = "";
l["LEAGUE_FACT_102"] = "";
l["LEAGUE_FACT_103"] = "";
l["LEAGUE_FACT_105"] = "";
l["LEAGUE_FACT_106"] = "";
l["LEAGUE_FACT_107"] = "";
l["LEAGUE_FACT_11"] = "";
l["LEAGUE_FACT_110"] = "";
l["LEAGUE_FACT_11000"] = "";
l["LEAGUE_FACT_111"] = "";
l["LEAGUE_FACT_112"] = "";
l["LEAGUE_FACT_113"] = "";
l["LEAGUE_FACT_114"] = "";
l["LEAGUE_FACT_116"] = "";
l["LEAGUE_FACT_117"] = "";
l["LEAGUE_FACT_118"] = "";
l["LEAGUE_FACT_119"] = "";
l["LEAGUE_FACT_12"] = "";
l["LEAGUE_FACT_121"] = "";
l["LEAGUE_FACT_122"] = "";
l["LEAGUE_FACT_123"] = "";
l["LEAGUE_FACT_13"] = "eredivisie";
l["LEAGUE_FACT_14"] = "speedway";
l["LEAGUE_FACT_15"] = "";
l["LEAGUE_FACT_16"] = "";
l["LEAGUE_FACT_17"] = "";
l["LEAGUE_FACT_2"] = "";
l["LEAGUE_FACT_24"] = "";
l["LEAGUE_FACT_25"] = "";
l["LEAGUE_FACT_27"] = "";
l["LEAGUE_FACT_29"] = "";
l["LEAGUE_FACT_3"] = "";
l["LEAGUE_FACT_30"] = "";
l["LEAGUE_FACT_33"] = "";
l["LEAGUE_FACT_34"] = "";
l["LEAGUE_FACT_35"] = "";
l["LEAGUE_FACT_36"] = "";
l["LEAGUE_FACT_37"] = "";
l["LEAGUE_FACT_38"] = "";
l["LEAGUE_FACT_4"] = "";
l["LEAGUE_FACT_42"] = "";
l["LEAGUE_FACT_44"] = "";
l["LEAGUE_FACT_45"] = "";
l["LEAGUE_FACT_46"] = "";
l["LEAGUE_FACT_47"] = "";
l["LEAGUE_FACT_48"] = "formula3";
l["LEAGUE_FACT_49"] = "";
l["LEAGUE_FACT_5"] = "";
l["LEAGUE_FACT_50"] = "";
l["LEAGUE_FACT_51"] = "dtm";
l["LEAGUE_FACT_52"] = "";
l["LEAGUE_FACT_53"] = "";
l["LEAGUE_FACT_54"] = "";
l["LEAGUE_FACT_55"] = "";
l["LEAGUE_FACT_58"] = "";
l["LEAGUE_FACT_6"] = "";
l["LEAGUE_FACT_60"] = "";
l["LEAGUE_FACT_62"] = "";
l["LEAGUE_FACT_63"] = "";
l["LEAGUE_FACT_64"] = "";
l["LEAGUE_FACT_65"] = "";
l["LEAGUE_FACT_66"] = "";
l["LEAGUE_FACT_67"] = "carlingcup";
l["LEAGUE_FACT_69"] = "laliga";
l["LEAGUE_FACT_69241"] = "";
l["LEAGUE_FACT_7"] = "serie-a";
l["LEAGUE_FACT_71"] = "elitserien";
l["LEAGUE_FACT_73"] = "";
l["LEAGUE_FACT_74"] = "";
l["LEAGUE_FACT_75"] = "";
l["LEAGUE_FACT_76"] = "";
l["LEAGUE_FACT_77"] = "";
l["LEAGUE_FACT_78"] = "";
l["LEAGUE_FACT_79"] = "premier-league";
l["LEAGUE_FACT_8"] = "";
l["LEAGUE_FACT_82"] = "";
l["LEAGUE_FACT_84"] = "";
l["LEAGUE_FACT_85"] = "nofactfound";
l["LEAGUE_FACT_86"] = "";
l["LEAGUE_FACT_91"] = "";
l["LEAGUE_FACT_92"] = "";
l["LEAGUE_FACT_93"] = "";
l["LEAGUE_FACT_94"] = "allsvenskan-webtv";
l["LEAGUE_FACT_95"] = "";
l["LEAGUE_FACT_96"] = "";
l["LEAGUE_FACT_97"] = "bundesliga-handball";
l["LEAGUE_FACT_98"] = "copa-del-rey";
l["LEAGUE_FACT_99"] = "";
l["LINEUPGROUPCLASS_FACT_8"] = "";
l["LINEUPGROUPCLASS_FACT_HOCKEY"] = "elitserien-webtv";
l["LINEUPGROUPCLASS_FACT_MOTOR"] = "speedway";
l["LINEUPGROUPCLASS_FACT_OTHER"] = "default";
l["LINEUPGROUPCLASS_FACT_SOCCER"] = "laliga";
l["LINEUPGROUPCLASS_FACT_UNKNOWN"] = "";
l["LINEUPGROUPCLASS_FOOTBALL"] = "Fotball";
l["LINEUPGROUPCLASS_ICEHOCKEY"] = "Ishockey";
l["LINEUPGROUPCLASS_MOTOR"] = "Motorsport";
l["LINEUPGROUPCLASS_OTHER"] = "Øvrige sporter";
l["LOGIN_EMAIL"] = "E-post";
l["LOGIN_EMPTYEMAIL"] = "Oppgi e-postadressen du er registrert med for å få passordet tilsendt. OBS! Denne type e-post kan havne i din junk/søppelpostfolder.";
l["LOGIN_ERR_INTRO"] = "";
l["LOGIN_ERR_MISSINGFIELDSLABEL"] = "Følgende felt må fylles ut:";
l["LOGIN_FORGOT_PASSWORD"] = "Glemt passordet?";
l["LOGIN_FORGOT_PIN"] = "Glemt passord?";
l["LOGIN_LOGGEDINAS"] = "Du er logget inn som";
l["LOGIN_LOGIN"] = "Logg inn";
l["LOGIN_LOGININFO"] = "Logg inn ved å oppgi din registrerte e-postadresse og PIN-kode. Hvis du allerede har en brukerkonto, kan du logge inn under. Du vil motta en mail med en link for å verifisere e-postadressen din første gang du logger inn.";
l["LOGIN_LOGININFO_2"] = "Logg inn ved å oppgi din registrerte e-postadresse og PIN-kode.";
l["LOGIN_LOGOUT"] = "Logg ut";
l["LOGIN_NEWACCOUNT"] = "Opprett en ny konto";
l["LOGIN_NEWACCOUNTHEAD"] = "Opprett konto";
l["LOGIN_NEWACCOUNTINFO"] = "Ny bruker? Gå videre og opprett en konto!";
l["LOGIN_NEWACCOUNTURI"] = "Ny konto";
l["LOGIN_PASSWORD"] = "Passord";
l["LOGIN_PGHEAD"] = "Logg inn";
l["LOGIN_PINCODE"] = "Passord";
l["LOGIN_PWDNOTSENT"] = "E-postadressen er ikke gyldig!";
l["LOGIN_PWDSENT"] = "Din PIN-kode er sendt til den angitte e-postadressen. Husk at denne typen e-post risikerer å havne i ditt spamfilter.";
l["LOGIN_STDERR"] = "Innloggingen mislyktes! Vennligst kontrollér at du har angitt riktig e-postadresse og passord.";
l["LOGIN_TOPLABEL"] = "Logg inn";
l["LOGIN_URL"] = "~/login.aspx?backUrl={0}";
l["LOGIN_USEREMAIL"] = "E-post";
l["LOGIN_USERNAME"] = "Brukernavn";
l["MENU_BUYCARD"] = "";
l["MENU_CREATE_ACCOUNT"] = "Opprett konto";
l["MENU_CREATE_ACCOUNT_URL"] = "~/createaccount.aspx";
l["MENU_CREATEACC"] = "Opprett konto";
l["MENU_CUSTOMERSERVICE"] = "";
l["MENU_CUSTOMERSERVICE_LINK"] = "";
l["MENU_EDIT_ACCOUNT"] = "Min side";
l["MENU_EDIT_ACCOUNT_URL"] = "~/minside.aspx";
l["MENU_FILM"] = "Film";
l["MENU_FILM_URI"] = "http://www.filmnetonline.no";
l["MENU_FILM_URI2"] = "https://mpsmppgw01.mpsnordic.se/MPSNordic_MPPClients/Canalplus/service.aspx?service=NOR&referrer=no_web";
l["MENU_GRID"] = "Programoversikt";
l["MENU_GRID_TEXT"] = "";
l["MENU_GRID_URI"] = "";
l["MENU_GRID_URL"] = "~/programoversikt.aspx";
l["MENU_HD"] = "";
l["MENU_HELP"] = "Hjelp";
l["MENU_HELP_URL"] = "~/hjalp.aspx";
l["MENU_HOCKEY_TEXT"] = "";
l["MENU_HOCKEY_URI"] = "";
l["MENU_MATRIX"] = "Sport";
l["MENU_MATRIX_TEXT"] = "";
l["MENU_MATRIX_URI"] = "";
l["MENU_MATRIX_URL"] = "~/sporter.aspx";
l["MENU_MOTORSPORT_TEXT"] = "";
l["MENU_MOTORSPORT_URI"] = "";
l["MENU_MYPAGE"] = "Min side";
l["MENU_ORDER_URL"] = "";
l["MENU_SELECT"] = "Velg";
l["MENU_SELECT_URI"] = "";
l["MENU_SERIES"] = "";
l["MENU_SOCCER_TEXT"] = "";
l["MENU_SOCCER_URI"] = "";
l["MENU_SPORT"] = "Sport";
l["MENU_SPORT_URI"] = "player.aspx";
l["MENU_START"] = "Startside";
l["MENU_START_TEXT"] = "";
l["MENU_START_TEXT_URL"] = "";
l["META_DESCRIPTION"] = "Det beste tilbudet av sport, film og serier";
l["META_KEYWORDS"] = "Sport Film Serier";
l["MOBILE_INDEX_PAGE"] = "";
l["MOBILE_SCHEDULE_PAGE"] = "";
l["MPPERR_MPP_ERR_AGREEMENTALREADYVERIFIED"] = "";
l["MPPERR_SUBSCRIBER_ALREADY_STREAMS_CONTENT"] = "Du er innlogget paa en annen datamaskin.";
l["MPPERR_VALUECODE_PAYMENT_FAILED"] = "Verdikoden du har tastet inn er ugyldig. Vennligst kontroller at du har angitt korrekt kode og forsøk igjen.";
l["MSG_ALREADY_HAS_ACCESS"] = "Du har allerede tilgang til denne kampen. <br/><a href=\"##ViewUrl##\">Klikk her for å se programmet!</a>";
l["MSG_ALREADY_HAS_PRODUCT"] = "Du har allerede adgang til dette kortet!<br/> <a href=\"http://www.csports.no/minside.aspx?tab=2\">Klik her for å komme til kamplisten</a>";
l["MSG_PUNCHCARDBUY_BY_SEASONCARDOWNER"] = "Du har allerede et sesongkort for denne ligaen og kan ikke kjøpe klippekort fordi du allerede har fri tilgang til alle kampene.";
l["MSG_PURCHASE_ALREADY_IN_ACTION"] = "Du har allerede et uavsluttet kjøp av kampen. <br/><a href=\"templates/cardshop/payexreply.aspx?mypurchaseId=##PURCHASE_ID##&orderRef=##ORDERREF##&cmd=complete\"> Klikk her </a> for å fikse problemet og avslutte kjøpet. <br/>Feilkode: H660000";
l["NEW_ACCOUNT_LABEL_LOGIN"] = "Er du ny kunde må du opprette en konto.";
l["NEW_ACCOUNT_LOGIN_LOGININFO"] = "Har du ikke brukt CANAL+ Web-TV tidligere må du registrere deg for å gjennomføre kjøpet. Det er enkelt og tar kort tid.";
l["NEWSLETTER_UNSUBSCRIBE_CONFIRMATION"] = "";
l["NEWSLETTER_UNSUBSCRIBE_CONFIRMATION_HEADER"] = "";
l["NEWSLETTER_UNSUBSCRIBE_FEEDBACK"] = "";
l["NEWSLETTER_UNSUBSCRIBE_HEADING"] = "";
l["NHL_CLIP_GROUP"] = "";
l["NHL_CLIPS_SERIES_TITLE"] = "";
l["NHL_GAMEINFO_PRICE"] = "";
l["NOFACTPAGE_PAGENAME"] = "nofactfound";
l["ORDER_CPLUS"] = "";
l["ORDER_DISCOUNT_NONE"] = "Det gis ikke rabatt på dette produktet.";
l["ORDER_DISOUNT_PREFIX"] = "Pris med rabatt: ";
l["ORDER_HEADER_CANCELLED"] = "Kjøpet ble avbrutt!";
l["ORDER_HEADER_DONE"] = "Kjøpet er gjennomført!";
l["ORDER_LABEL_VALUECODE"] = "Skriv din kode";
l["PAYEX_CARDDATA_EXPIRE_DATE_INCORRECT"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen.<br/> Feilkode: P000004";
l["PAYEX_CARDDATA_GENERAL_ERROR"] = "En feil oppstod ved  betalingskontrollen. <br/> Vennligst forsøk igjen og kontakt <a href=\"mailto:webtvtech@canalplus.no\">webtvtech@canalplus.no</a>  om feilen vedvarer. <br/>Feilkode: P000006";
l["PAYEX_CARDDATA_INCORRECT_CVC"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen. <br/>Feilkode: P000003";
l["PAYEX_CARDDATA_INCORRECT_HOLDER_NAME"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen. <br/>Feilkode: P000002";
l["PAYEX_CARDDATA_INVALID_CARD_TYPE"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen. <br/>Feilkode: P000007";
l["PAYEX_CARDDATA_UNSUFFIENT_FUNDS_ERROR"] = "Det er dessverre ikke dekning på kontoen din og betalingen kunne derfor ikke gjennomføres. <br/>Feilkode: P000001";
l["PAYEX_CARDDATA_WRONG_CARD_NO"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen. <br/>Feilkode: P000005";
l["PAYEX_CREDITCARD_GENERAL_ERROR"] = "";
l["PAYEX_FRAUD_PATTERN_DETECTED"] = "Din betaling ble ikke akseptert av betalingsleverandøren. Vennligst kontakt <a href=\"mailto:webtvtech@canalplus.no\">webtvtech@canalplus.no</a>og oppgi feilkoden under. <br/>Feilkode: P000012";
l["PAYEX_PAYMENT_FRAUD_PATTERN_DETECTED"] = "";
l["PAYEX_PAYMENT_REFUSED_BY_FINANCIAL_INSTITUTION"] = "Din betaling ble ikke akseptert av betalingsleverandøren. Vennligst forsøk igjen med et annet kort eller betalingsmåte. <br/>Feilkode: P000009";
l["PAYEX_PAYMENT_REFUSED_NOT_3DSECURE_VERIFIED"] = "Din betaling ble ikke akseptert av betalingsleverandøren. Vennligst forsøk igjen med et annet kort eller betalingsmåte. <br/>Feilkode: P000011";
l["PAYEX_PAYMENT_REFUSED_UNSUPPORTED_COUNTRY"] = "Informasjonen som ble oppgitt ved betaling inneholder dessverre feil. Vennligst forsøk igjen. <br/>Feilkode: P000010";
l["PAYEX_TRANSACTION_WRONG_STATUS_ERROR"] = "En feil oppstod ved  betalingskontrollen. <br/>Vennligst forsøk igjen og kontakt <a href=\"mailto:webtvtech@canalplus.no\">webtvtech@canalplus.no</a>om feilen vedvarer. <br/>Feilkode: P000008";
l["PAYEX_UNKNOWN_PURCHASE"] = "";
l["PAYMENTREFUSEDBYFINANCIALINSTITUTION"] = "Kjøpet kunne ikke gjennomføres, vennligst kontroller informasjonen du har oppgitt og forsøk igjen. </br>Feilkode: R000001";
l["PG_ACCOUNTINFO_TITLE"] = "Min side";
l["PG_START_FIRSTVISIT_SMALLTEASER_1_HEADING"] = "";
l["PG_START_FIRSTVISIT_SMALLTEASER_1_IMAGEURL"] = "http://www.csports.no/image.ashx?format=35&guid=af88b17f-da2a-4641-a945-8d9a348da7b6";
l["PG_START_FIRSTVISIT_SMALLTEASER_1_LINKURL"] = "http://www.csports.no/hjalp.aspx";
l["PG_START_FIRSTVISIT_SMALLTEASER_1_SUBHEADING"] = "";
l["PG_START_FIRSTVISIT_SMALLTEASER_2_HEADING"] = "";
l["PG_START_FIRSTVISIT_SMALLTEASER_2_IMAGEURL"] = "http://www.csports.no/image.ashx?format=35&guid=12bc7f3a-a571-418e-84e9-160b8e7df945";
l["PG_START_FIRSTVISIT_SMALLTEASER_2_LINKURL"] = "";
l["PG_START_FIRSTVISIT_SMALLTEASER_2_SUBHEADING"] = "";
l["PIN-KOD!"] = "Passord!";
l["PLAYER_ANALYTICSTITLE"] = "";
l["PLAYER_ANALYTICSTITLE_CLIP"] = "";
l["PLAYER_ANALYTICSTITLE_CLIP_NHL"] = "";
l["PLAYER_BEGINWATCHING"] = "Begynn å se!";
l["PLAYER_BUY"] = "Kjøp";
l["PLAYER_BWTOOLOW"] = "Din båndbredde på BW0 er for lav for sendingen (BW1)";
l["PLAYER_DOCTITLE"] = "CANAL+ Web-TV";
l["PLAYER_DOCTITLE_CLIP"] = "";
l["PLAYER_FLASH_VIEWERPAGE_URL"] = "";
l["PLAYER_FULL_URL"] = "~/player.aspx";
l["PLAYER_GAME_ENDED"] = "";
l["PLAYER_INFOBUBBLE"] = "";
l["PLAYER_INFOBUBBLE_TITLE"] = "";
l["PLAYER_NEXT_GAME_FOR_TEAM_X"] = "Neste kamp for %TEAM%";
l["PLAYER_SHOPPAGE_URL"] = "/kjop.aspx";
l["PLAYER_SOLD_OUT"] = "Utsolgt";
l["PLAYER_SWITCHTO_FLV"] = "Se sendingen i Flash";
l["PLAYER_SWITCHTO_FLVLIVE"] = "Se sendingen i Flash";
l["PLAYER_SWITCHTO_SMOOTH"] = "Se sendingen i Sillverlight";
l["PLAYER_SWITCHTO_WMV"] = "Se sendingen i Windows Media";
l["PLAYER_TEST"] = "Vennligst vent mens vi tester ditt system og starter spilleren (kan ta opp til 30 sekunder)";
l["PLAYER_TESTCLIPINFO_FLV"] = "Forsøk å spille av klippet i fullskjerm ved å <em>klikke på fullskjermsikonet</em> i spilleren.";
l["PLAYER_TESTCLIPINFO_SILVERLIGHT"] = "Forsøk også å spille av klippet i fullskjermmodus ved å <em>dobbeltklikke i avspillingsvinduet</em>.";
l["PLAYER_TESTCLIPINFO_WMV"] = "Forsøk å spille av klippet i fullskjerm ved å <em>dobbeltklikke i avspillingsvinduet</em>.";
l["PLAYER_TRYANYWAY"] = "Forsøk avspilling";
l["PLAYER_VIEW_GAME"] = "Se kamp";
l["PLAYER_VIEW_GAMENOTSTARTED"] = "Kampen har ikke begynt";
l["PLAYER_VIEW_GAMEOVER"] = "Kampen er slutt";
l["PLAYER_VIEW_HIGHLIGHT"] = "";
l["PLAYER_VIEW_NOTICKET"] = "Billett savnes!";
l["PLAYER_VIEW_NOTLOGGEDIN"] = "Har du allerede billett? Logg inn!";
l["PLAYER_VIEW_WRONGREGION"] = "Feil region!";
l["PLAYER_VIEW_WRONGREGION_DESCRIPTION"] = "Kampen er ikke tilgjengelig i det landet du befinner deg i.";
l["PLAYER_VIEWERPAGE_URL"] = "~/Templates/Sport/GameViewerPart.aspx";
l["PLAYER_WRONGREGION"] = "Feil region!";
l["PLAYER_WRONGREGION_HEAD"] = "Dessverre!";
l["PLAYER_WRONGREGION_INFO"] = "Du befinner deg i feil region.";
l["PLAYERPART_EMPTY_HIGHLIGHT_SYNOPSIS"] = " ";
l["POSTAL_CITY"] = "Oslo";
l["POSTAL_CODE"] = "NO-0611";
l["PRESENTATIONHELPER_STARTED"] = "Vises akkurat nå!";
l["PRESENTATIONHELPER_TIME_PREFIX"] = "kl.";
l["PRESENTATIONHELPER_TODAY"] = "I dag";
l["PRESENTATIONHELPER_TOMORROW"] = "I morgen";
l["PRESENTATIONHELPER_TONIGHT"] = "I kveld";
l["PROMOPRICE_FOR_LEAGUE_2009  _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009  _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009  _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009 HIGHLIGHTS_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009 HIGHLIGHTS_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010 GROUP C_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010 GROUP C_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010 HIGHLIGHTS_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010 HIGHLIGHTS_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010 HIGHLIGHTS_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009/2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2009_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010 HIGHLIGHTS_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010 HIGHLIGHTS_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010 HIGHLIGHTS_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010/2011_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010/2011_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010/2011_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISION 2009/2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISION 2009/2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISIONEN _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISIONEN _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISIONEN _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISIONEN 2009/2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ÆRESDIVISIONEN 2009/2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKA SAMMANDRAG_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKA SAMMANDRAG_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKA SAMMANDRAG_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKAN KVAL_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKAN KVAL_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKAN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKAN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ALLSVENSKAN_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_BUNDESLIGA - HÅNDBOLD_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_BUNDESLIGA - HÅNDBOLD_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_BUNDESLIGA - HÅNDBOLD_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_CARLING CUP_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CARLING CUP_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CARLING CUP_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_CASINO EREDIVISIE 2009/2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CASINO EREDIVISIE 2009/2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CASINO EREDIVISIE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CASINO EREDIVISIE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CHAMPIONS LEAGUE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CHAMPIONS LEAGUE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CHAMPIONS LEAGUE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_CHAMPIONS LEAGUE-KVALIFIKATION_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_CHAMPIONS LEAGUE-KVALIFIKATION_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL REY_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL REY_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL REY_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL SOL_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL SOL_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_COPA DEL SOL_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_DAMALLSVENSKAN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DAMALLSVENSKAN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: NÜRBURGRING_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: NÜRBURGRING_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: NÜRBURGRING_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: RACE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: RACE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM: RACE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_DTM_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EHF CHAMPIONS LEAGUE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EHF CHAMPIONS LEAGUE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ELITSERIEN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ELITSERIEN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ELITSERIEN_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVAL_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVAL_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVAL_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVALIK_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVALIK_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EM-KVALIK_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_ENGLANNIN VALIOLIIGA_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ENGLANNIN VALIOLIIGA_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_ENGLANNIN VALIOLIIGA_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE 2009/2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE 2009/2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EREDIVISIE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EUROPA LEAGUE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EUROPA LEAGUE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EUROPA LEAGUE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_EUROPALIGAN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_EUROPALIGAN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3: EURO SERIES_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3: EURO SERIES_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3: EURO SERIES_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMEL 3_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: EURO SERIES _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: EURO SERIES _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: EURO SERIES_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: EURO SERIES_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: EURO SERIES_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: NORISRING_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: NORISRING_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3: NORISRING_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_FORMULA 3_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_HANDBOLL_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_HANDBOLL_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDY 500_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDY 500_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDY 500_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR: MID-OHIO SPORTS CAR COURSE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR: MID-OHIO SPORTS CAR COURSE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR: MID-OHIO SPORTS CAR COURSE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INDYCAR_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_INNEBANDY_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INNEBANDY_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_INNEBANDY_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC FIGHT NIGHT_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC FIGHT NIGHT_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC FIGHT NIGHT_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC LIVE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC LIVE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_KAMPSPORT: UFC LIVE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_LA LIGA_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_LA LIGA_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_LA LIGA_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_LANDSKAMP_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_LANDSKAMP_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_LANDSKAMP_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_MAJOR LEAGUE SOCCER_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_MAJOR LEAGUE SOCCER_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_MAJOR LEAGUE SOCCER_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL - PLAY-OFFS ARKIV_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL - PLAY-OFFS ARKIV_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL - PLAYOFFS_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL - PLAYOFFS_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NHL_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NÜRBURGRING_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NÜRBURGRING_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_NÜRBURGRING_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL ISHOCKEY SEMIFINALE 2_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL ISHOCKEY SEMIFINALE 2_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ALPIN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ALPIN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY FINALE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY FINALE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY SEMIFINALE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY SEMIFINALE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_OL: ISHOCKEY_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PARALLEL STORSLALOM, KVINDER_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PARALLEL STORSLALOM, KVINDER_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PEAK ANTIFREEZE INDY 300 _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PEAK ANTIFREEZE INDY 300 _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PEAK ANTIFREEZE INDY 300 _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_PREMIER LEAGUE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PREMIER LEAGUE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_PREMIER LEAGUE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SAS LIGAEN _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SAS LIGAEN _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SAS LIGAEN _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SERIE A_1ST_ROW"] = "fra 69,-";
l["PROMOPRICE_FOR_LEAGUE_SERIE A_2ND_ROW"] = " pr kamp";
l["PROMOPRICE_FOR_LEAGUE_SERIE A_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET 2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET 2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET 2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPELET_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET 2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET 2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET 2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SM SLUTSPILLET_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SPEEDWAY_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SPEEDWAY_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SPEEDWAY_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SUPERETTAN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SUPERETTAN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SUPERETTAN_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_SUPERSERIEN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SUPERSERIEN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SVENSKA CUPEN_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SVENSKA CUPEN_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_SVENSKA CUPEN_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_THE CHAMPIONSHIP_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_THE CHAMPIONSHIP_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_THE CHAMPIONSHIP_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UCL 2009-2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UCL 2009-2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UCL 2009-2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA CHAMPIONS LEAGUE 2009-2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA CHAMPIONS LEAGUE 2009-2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA CHAMPIONS LEAGUE 2009-2010_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE _1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE _2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE _PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UEFA EUROPA LEAGUE_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UFC 2010 (DANMARK)_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UFC 2010 (DANMARK)_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UFC 2010 (DANMARK)_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_UFC LIVE 2009_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_UFC LIVE 2009_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_WIMBLEDON_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_WIMBLEDON_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_WIMBLEDON_PREFIX"] = "";
l["PROMOPRICE_FOR_LEAGUE_VM 2010_1ST_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_VM 2010_2ND_ROW"] = "";
l["PROMOPRICE_FOR_LEAGUE_VM 2010_PREFIX"] = "";
l["PWDREMINDER_EMAIL_EMPTY"] = "Du må oppgi en e-postadresse";
l["REMINDER_BODY_CONFIRMATION"] = "Gå ikke glipp av viktige kamper i fremtiden. Vi minner deg gjerne på når vi viser kamper med ditt favorittlag her på CANAL+ Web-TV.";
l["REMINDER_BODY_MY_PAGES"] = "Velg dine favorittligaer under så passer vi på at du aldri går glipp av en kamp ved å sende ut en påminnelse når vi viser kamper med dine lag.";
l["REMINDER_BUTTON_UNSUBSCRIBE"] = "Slette";
l["REMINDER_CALENDAR_HEADER"] = "Din egen kalender";
l["REMINDER_CALENDAR_HEADER_INFO"] = "Få alle kamper direkte i din kalender";
l["REMINDER_HEADER_CONFIRMATION"] = "Gå aldri glipp av en kamp på CANAL+ Web-TV.";
l["REMINDER_HEADER_MY_PAGES"] = "Mine påminnelser";
l["REMINDER_OUTLOOK2003_INFO"] = "Lagre først, importér deretter filen";
l["REMINDER_OUTLOOK2003UPDATES_INFO"] = "Innstaller applikasjonen for Outlook først";
l["REMINDER_SAVE_BUTTON_TEXT"] = "Lagre";
l["REMINDER_SAVE_CONFIRMATION"] = "";
l["REMINDER_UC_BODY_CHECKALL"] = "Minn meg på alle kamper";
l["REMINDER_UC_HEADER"] = "E-post";
l["REMINDER_UC_HEADER_INFO"] = "Marker dine favorittligaer, og vi sender deg en påminnelse dagen før kampen.";
l["REMINDER_UC_HEADER_SAVE_FAILURE"] = "Dine påminnelser kunne dessverre ikke lagres.";
l["REMINDER_UC_HEADER_SAVE_SUCCESS"] = "Dine påminnelser er lagret.";
l["REMINDER_UNSUBSCRIBE"] = "Slett alle mine påminnelser.";
l["REMINDER_UNSUBSCRIBE_CONFIRMATION"] = "Er du sikker på at du vil slette alle dine påminnelser?";
l["REMINDER_UNSUBSCRIBE_CONFIRMATION_HEADER"] = "Bekreft";
l["REMINDER_UNSUBSCRIBE_FAILURE"] = "Det er ingen brukere knyttet til spesifiserte abonnement. ";
l["REMINDER_UNSUBSCRIBE_REDIRECT_LINK"] = "Tilbake til min side.";
l["REMINDER_UNSUBSCRIBE_SUCCESS"] = "";
l["REMINDER_USERUPDATED_LINK"] = "<h1>Du har meldt deg av påminnelsesutsendelsene!</h1>";
l["SERVICEMESSAGE_CLOSE"] = "Lukk";
l["SERVICEMESSAGE_READMORE"] = "Les mer";
l["SETTING_WEBTV_SETTINGS_HOSTURL"] = "";
l["SETTINGS_ENABLE_HDSTREAMING"] = "";
l["SHOP_TESTPAGE_ACCEPTTERMS"] = "Jeg har lest og aksepterer baade testresultatet og <a href=\"{0}\" class=\"targetNew\">brukervilkaarene</a> hos CANAL+ WEB TV.";
l["SILVERLIGHT_FAIL"] = "Ikke godkjent. Last ned versjonen som kreves <a href=\"http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx\">her!</a>";
l["SILVERLIGHT_OK"] = "Godkjent";
l["SIMPLETEST_WMPPLUGIN_OLDVERSION"] = "";
l["SINGLE_GAME_TEXT"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_10"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_12"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_132"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_14"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_143"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_15"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_18"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_19"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_194"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_195"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_197"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_209"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_224"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_25"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_36"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_4"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_5"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_53"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_6"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_72"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_8"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_84"] = "";
l["SINGLE_GAME_TEXT_FOR_LEAGUE_94"] = "";
l["SINGLE_GAME_TITLE"] = "Kampbillett";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_10"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_12"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_132"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_14"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_143"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_15"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_18"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_19"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_194"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_195"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_197"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_209"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_224"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_25"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_36"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_4"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_5"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_53"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_6"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_72"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_8"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_84"] = "";
l["SINGLE_GAME_TITLE_FOR_LEAGUE_94"] = "";
l["SITE_TITLE"] = "CANAL+ WEB-TV";
l["SPEED_FAIL"] = "Ikke godkjent. Vennligst kontrollér din bredbåndsoppkobling.";
l["SPEED_OK"] = "Båndbredden avgjør i hvilken kvalitet du kan se kampen eller filmen. Kvalitet 3 er den beste.  [speed]";
l["SPEED_OK_S2"] = "Godkjent";
l["SPEED_OK_S3"] = "Godkjent";
l["SPORT_FAIL"] = "Ikke godkjent. <a href=\"#testResults\" class=\"show\">Mer informasjon</a>.";
l["SPORT_OK"] = "Godkjent";
l["SPORT_PLAY_URI"] = "";
l["SPORTS_PAGE_TEXT_ALLSVENSKAN"] = "De beste kampene fra Allsvenskan ser du på C SPORTS Web-TV";
l["SPORTS_PAGE_TEXT_BUNDESLIGA_HB"] = "";
l["SPORTS_PAGE_TEXT_CARLINGCUP"] = "C SPORTS sender de beste kampene fra Carling Cup";
l["SPORTS_PAGE_TEXT_DAMALLSVENSKAN"] = "";
l["SPORTS_PAGE_TEXT_DTM"] = "En av Europas mest populære touringcar-serier ser du på C SPORTS";
l["SPORTS_PAGE_TEXT_EHF"] = "";
l["SPORTS_PAGE_TEXT_ELITSERIEN"] = "De beste kampene fra Elitserienser du på C SPORTS Web-TV";
l["SPORTS_PAGE_TEXT_EREDIVISE"] = "Følg den nederlandske fotballigaen - Eredivisie på C SPORTS";
l["SPORTS_PAGE_TEXT_EREDIVISIE"] = "Følg den nederlandske fotballigaen - Eredivisie";
l["SPORTS_PAGE_TEXT_F3"] = "Se stjernene bli født!";
l["SPORTS_PAGE_TEXT_HOCKEYALLSVENSKAN"] = "";
l["SPORTS_PAGE_TEXT_LALIGA"] = "C SPORTS sender de beste kampene fra La Liga";
l["SPORTS_PAGE_TEXT_NHL"] = "";
l["SPORTS_PAGE_TEXT_PREMIER_LEAGUE"] = "C SPORTS sender de beste kampene fra Premier League";
l["SPORTS_PAGE_TEXT_SASLIGAEN"] = "";
l["SPORTS_PAGE_TEXT_SERIEA"] = "C SPORTS sender de beste kampene fra Serie A";
l["SPORTS_PAGE_TEXT_SMLIIGA"] = "";
l["SPORTS_PAGE_TEXT_SPEEDWAY"] = "Se elitserien i speedway på C SPORTS";
l["SPORTS_PAGE_TEXT_SUPERETTAN"] = "";
l["SPORTS_PAGE_TEXT_SUPERLIGAN"] = "";
l["SPORTS_PAGE_TEXT_THECHAMPIONSHIP"] = "";
l["SPORTS_PAGE_TEXT_UEFAEUROPA"] = "";
l["SPORTS_PAGE_TEXT_UFC"] = "";
l["SPORTSMOOTH_FAIL"] = "Ikke godkjent. <a href=\"#testResults\" class=\"show\">Mer informasjon</a>.";
l["SPORTSMOOTH_OK"] = "Godkjent";
l["SPORTWMP_FAIL"] = "Ikke godkjent. <a href=\"#testResults\" class=\"show\">Mer informasjon</a>.";
l["SPORTWMP_OK"] = "Godkjent";
l["STANDARD_CLOSE"] = "Lukk";
l["STREET_ADRESS"] = "Postboks 80";
l["SUBSCRIBER_ALREADY_STREAMS_CONTENT"] = "";
l["TEST_BANDWIDTH"] = "Båndbredde";
l["TEST_BROWSER"] = "Nettleser";
l["TEST_CLIP_BODY"] = "For å teste om din PC er i stand til å vise kampen, kan du prøve et testklipp her.";
l["TEST_CLIP_BUTTON"] = "Spill testklippet";
l["TEST_CLIP_BUTTON_HQ"] = "Høj";
l["TEST_CLIP_BUTTON_LQ"] = "Lav";
l["TEST_CLIP_BUTTON_MQ"] = "Middels";
l["TEST_CLIP_BUTTON_SILVERLIGHT"] = "Silverlight";
l["TEST_CLIP_BUTTON_SWF"] = "Flash";
l["TEST_CLIP_BUTTON_WMP"] = "Windows Media";
l["TEST_CLIP_HEAD"] = "Spill av et testklipp";
l["TEST_CLIP_URI"] = "player.aspx?game=47639&amp;play=1";
l["TEST_CLIP_URI_SWF"] = "player.aspx?game=47639&amp;play=1&amp;format=swf";
l["TEST_CLIP_URI_WMP"] = "player.aspx?game=47638&amp;format=wmp";
l["TEST_FIREWALL_MMS"] = "Brannmur";
l["TEST_FLASH"] = "Flash-player";
l["TEST_HEADING"] = "Din PC testes";
l["TEST_INPROGRESS"] = "Testen pågår...";
l["TEST_INTRO"] = "Din datamaskin og internettoppkobling kontrolleres. Testen kan ta opp til 30 sekunder.";
l["TEST_NOT_DONE"] = "Testen er ikke utført";
l["TEST_NOTDONE"] = "Testen er ikke utført.";
l["TEST_NOTE"] = "<b>NB!</b><br>Kjøp kampbilletten din med den PCen som du skal se kampen på.<br>Båndbredden kan variere i løpet av kampen. For lav båndbredde kan forårsake bildeforstyrrelser. Kontakt din internettleverandør om problemet oppstår.<br>Mobilt bredbånd fungerer vanligvis ikke på C Sports fordi båndbredden er for dårlig for en hel kamp.";
l["TEST_NOTTESTED"] = "Ikke testet";
l["TEST_OS"] = "Operativsystem";
l["TEST_RESULTS"] = "Testresultat";
l["TEST_RETRY"] = "Ta testen på nytt";
l["TEST_SILVERLIGHT"] = "Silverlight-spiller";
l["TEST_SPORT"] = "Flash";
l["TEST_SPORT_SMOOTH"] = "Silverlight";
l["TEST_SPORT_WMP"] = "Windows Media";
l["TEST_STATUS_FAIL"] = "Ikke godkjent";
l["TEST_STATUS_OK"] = "Godkjent";
l["TEST_WIN"] = "Windows";
l["TEST_WMP"] = "Windows Media";
l["TEST_WMPPLUGIN"] = "WMP-Plugin";
l["THE VERIFICATION WORDS ARE INCORRECT."] = "";
l["TOPGAMES_TXT_ORDERNOW"] = "Bestill nå";
l["UNSUBSCRIBE_BUTTONTEXT"] = "";
l["USER_NOTINITIALIZED"] = "Ditt kjøp ble avbrutt. Vennligst forsøk igjen.</br>Feilkode: B770000";
l["VALUECODE_ERROR_BAD_FORMAT_OR_INCORRECT"] = "Denne rabatt- eller verdikoden er ikke gyldig. Vennligst kontroller koden og prøv på nytt.";
l["WARN_GAME_ALREADYHASACCESS"] = "Du har allerede tilgang til denne kampen/filmen!";
l["WEBTV_ASKQUESTION"] = "Still ditt spørsmål!";
l["WEBTV_EMAIL"] = "E-post";
l["WEBTV_EMAILMALFORMED"] = "Feil e-postadresse!";
l["WEBTV_EMAILRECIEVER"] = "webtvtech@canalplus.no";
l["WEBTV_EMAILREQUIRED"] = "E-postadresse må angis";
l["WEBTV_HIDEANSWER"] = "Skjul svar";
l["WEBTV_NOQUESTIONS"] = "Kategorien inneholder ingen spørsmål.";
l["WEBTV_QNA_HEADING"] = "WEB-TV - SPØRSMÅL OG SVAR";
l["WEBTV_QUESTION"] = "Spørsmål";
l["WEBTV_QUESTIONFEEDBACK"] = "Takk for ditt spørsmål!";
l["WEBTV_QUESTIONISREQUIRED"] = "Du må stille et spørsmål!";
l["WEBTV_RETURN"] = "Tilbake til spørsmål og svar!";
l["WEBTV_SHOWANSWER"] = "Vis svar";
l["WEBTV_SIGNATURE"] = "Navn";
l["WEBTV_SIGNATUREISREQUIRED"] = "Signatur er nødvendig!";
l["WIN_FAIL"] = "Ikke godkjent";
l["WIN_OK"] = "Godkjent";
l["WMP_FAIL"] = "For å benytte tjenesten må du ha <a target=\"_blank\" href=\"http://www.microsoft.com/windows/windowsmedia/player/download/default.aspx\">Windows Media Player 11.0.</a> (Åpnes i nytt vindu).";
l["WMP_OK"] = "Godkjent";
l["WMPPLUGIN_FAIL"] = "For åkunne bruke tjenesten kreves det at du har Windows Media Player Firefox Plugin. Last ned <a href=\"#\" onclick=\"window.open('http://port25.technet.com/videos/downloads/wmpfirefoxplugin.exe');return false;\">her!</a> (Åpnes i et nytt vindu.). Slik gjør du:<br/>1. Installasjonen av Windows Media Player Firefox Plugin kan kreve administratorrettigheter på din PC. Vi anbefaler at du lukker alle åpne nettlesere før du fortsetter med installasjonen.<br/><br/>2. Klikk på installasjonsknappen for automatisk nedlasting og installasjon av Windows Media Player Firefox Plugin.<br/><br/>3. Avhengig av dine sikkerhetsinnstillinger, kan du se en rute med sikkerhetsvarslinger. Klikk på innstallere for å fortsette med installasjonen.";
l["WMPPLUGIN_OK"] = "Gratulerer! [wmpplugin]";
