﻿
$(document).ready(function(){
	
	// Common
	$('.nav a').not('.active').hover(
		function(){
			$(this).animate({ backgroundPosition: 'right 100%'}, 100);
		},
		function(){
			$(this).animate({ backgroundPosition: 'right 0%'}, 100);
		}
	);
	
	
	if ($('#page-home').html != null){
		rotateImg();
	}
	
	
	// Events
	if ($('#page-events').html() != ''){
		
		// Get sub page
		var eventUrl = document.location.href;
		var getSubId = eventUrl.substring( eventUrl.lastIndexOf('#')+1, eventUrl.length);
		if (Number(getSubId.length) == 1){
			$('.events h2').attr('class', 'down_info');
			$('.event_ct').hide();
			$('.events h2:eq('+getSubId+')').attr('class', 'up_info');
			$('.event_ct:eq('+getSubId+')').show();
			
			if (getSubId=="3") $('.event_guess').jScrollPane({ showArrows:'true', scrollbarWidth:'10'});
		}
		
		
		$('.navSub_events').append('<label id="navCur"></label>');
		$('.navSub_events a')
							.each(function(i){
								$(this).attr('id',i);
							})
							.hover(
								function(){
									clearTimeout(navDelay);
									getItemId = $(this).attr('id');
									navGo(navArr[getItemId]);
									
								},
								function(){
									navDelay = setTimeout(" navGo(navArr[getInitNavCur]) ", 500);								
								}
							);
		getInitNavCur = $('.navSub_events .active').attr('id');
		navInit(navArr[getInitNavCur]);
		
		
		//$('.events h2.down_info').next().show();
		$('.events h2').find('a').hover(
			function(){
				$(this).stop(true, true).animate({ paddingRight: '64'}, 500, 'easeOutElastic');
			},
			function(){
				$(this).stop(true, true).animate({ paddingRight: '32'}, 500, 'easeOutElastic');
			}
		);
		$('.events h2.down_info').live('click', function(){
			$('.events h2.up_info').attr('class','down_info').next().slideUp(500);
			$(this).attr('class','up_info').next().slideDown(500, function(){
				if ($(this).attr('lang')=="guess") $('.event_guess').jScrollPane({ showArrows:'true', scrollbarWidth:'10'});
			});
			return false;
		});
		$('.events h2.up_info').live('click', function(){
			return false;
		});
		
		
		$("#guess_form").validate({
			submitHandler: function(form) { }
		});
		
		
		// FAQ
		$('.event_2 a').live('click', function(){
				if ($(this).attr('class') != "active"){
					$('.event_2 .active').removeClass('active');
					$(this).addClass('active').parent().parent().parent().find('p').hide(500);
					$(this).next().show(500);
					return false;
				}
				else{
					return false;
				}
			}
		);
		
		
		var galleries = $('.ad-gallery').adGallery();
		//var galleries = $('.ad-gallery').adGallery({
//		  loader_image: 'images/loader.gif',
//		  width: 600, // Width of the image, set to false and it will read the CSS width
//		  height: 400, // Height of the image, set to false and it will read the CSS height
//		  thumb_opacity: 0.7, // Opacity that the thumbs fades to/from, (1 removes fade effect)
//							  // Note that this effect combined with other effects might be resource intensive
//							  // and make animations lag
//		  start_at_index: 0, // Which image should be displayed at first? 0 is the first image
//		  description_wrapper: $('#descriptions'), // Either false or a jQuery object, if you want the image descriptions
//												   // to be placed somewhere else than on top of the image
//		  animate_first_image: false, // Should first image just be displayed, or animated in?
//		  animation_speed: 400, // Which ever effect is used to switch images, how long should it take?
//		  display_next_and_prev: true, // Can you navigate by clicking on the left/right on the image?
//		  display_back_and_forward: true, // Are you allowed to scroll the thumb list?
//		  scroll_jump: 0, // If 0, it jumps the width of the container
//		  slideshow: {
//			enable: true,
//			autostart: true,
//			speed: 5000,
//			start_label: 'Start',
//			stop_label: 'Stop',
//			stop_on_scroll: true, // Should the slideshow stop if the user scrolls the thumb list?
//			countdown_prefix: '(', // Wrap around the countdown
//			countdown_sufix: ')',
//			onStart: function() {
//			  // Do something wild when the slideshow starts
//			},
//			onStop: function() {
//			  // Do something wild when the slideshow stops
//			}
//		  },
//		  effect: 'fade', // or 'slide-vert', 'resize', 'fade', 'none' or false
//		  enable_keyboard_move: true, // Move to next/previous image with keyboard arrows?
//		  cycle: true, // If set to false, you can't go from the last image to the first, and vice versa
//		  // All callbacks has the AdGallery objects as 'this' reference
//		  callbacks: {
//			// Executes right after the internal init, can be used to choose which images
//			// you want to preload
//			init: function() {
//			  // preloadAll uses recursion to preload each image right after one another
//			  this.preloadAll();
//			  // Or, just preload the first three
//			  this.preloadImage(0);
//			  this.preloadImage(1);
//			  this.preloadImage(2);
//			},
//			// This gets fired right after the new_image is fully visible
//			afterImageVisible: function() {
//			  // For example, preload the next image
//			  var context = this;
//			  this.loading(true);
//			  this.preloadImage(this.current_index + 1,
//				function() {
//				  // This function gets executed after the image has been loaded
//				  context.loading(false);
//				}
//			  );
//		
//			  // Want slide effect for every other image?
//			  if(this.current_index % 2 == 0) {
//				this.settings.effect = 'slide';
//			  } else {
//				this.settings.effect = 'fade';
//			  }
//			},
//			// This gets fired right before old_image is about to go away, and new_image
//			// is about to come in
//			beforeImageVisible: function(new_image, old_image) {
//			  // Do something wild!
//			}
//		  }
//		});
		
		// Set image description
		//some_img.data('ad-desc', 'This is my description!');
		
		// Change effect on the fly
		//galleries[0].settings.effect = 'fade';
	}
	
	
	
	// Station
	if ($('#page-station').html() != null){
		$('.stationPhotos a').live('click', function(){		
			$('#loading').fadeIn();
			var getSrcImg =  $(this).attr('href');
			$(this).parent().parent().parent().parent().parent().find('.mapPhotos').addClass('mapPhotos_active');
			 
			var Img = new Image();			
			Img.onerror = function(){
				fn.error('This image cannot download!');
			}		
			var src = getSrcImg;
			Img.onload = function(){ 
				$('#loading').hide();
				
				$('.mapPhotos_active').append('<img src="'+getSrcImg+'" />').find('img').fadeIn(500, function(){ $('.btn_mapphoto_close').show(); });
				
				Img.onload=function(){};
			}	
			Img.src = src;
			 
			return false;
		});
		
		
		$('.btn_mapphoto_close').live('click', function(){
			$(this).parent().find('img').fadeOut(500, function(){ $(this).parent().find('img').remove(); });
			$(this).hide();
			$('.mapPhotos_active').removeClass('mapPhotos_active');
		});
	}
	
	
});




var delayRotate = 8000;
var animationSpeed = 1000;
var tempRotateI = 0;
var count_lastest;
var buttonClick = false;
function rotateImg(){
count_lastest = $('.rotateCopy').length;
						
//images
$('.rotateCopy').fadeOut(animationSpeed);
$('.rotateCopy:eq('+tempRotateI+')').fadeIn(animationSpeed);

if ((count_lastest>1) && (buttonClick==false)) t=setTimeout("rotateImg()",delayRotate)
tempRotateI = tempRotateI+1;
if (tempRotateI == count_lastest) tempRotateI=0;	
};





var getInitNavCur;
var navDelay;
var navArr = new Array();
navArr[0] = '122';
navArr[1] = '364';
navArr[2] = '614';
function navGo(goToItem){
	$('#navCur').stop(true, true).animate({ left:goToItem}, 400, 'easeOutBack');
};
function navInit(goToItem){
	$('#navCur').css({ left:goToItem+'px'});
};





(function($) {
	if(!document.defaultView || !document.defaultView.getComputedStyle){ // IE6-IE8
		var oldCurCSS = $.curCSS;
		$.curCSS = function(elem, name, force){
			if(name === 'background-position'){
				name = 'backgroundPosition';
			}
			if(name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[ name ]){
				return oldCurCSS.apply(this, arguments);
			}
			var style = elem.style;
			if ( !force && style && style[ name ] ){
				return style[ name ];
			}
			return oldCurCSS(elem, 'backgroundPositionX', force) +' '+ oldCurCSS(elem, 'backgroundPositionY', force);
		};
	}
	
	var oldAnim = $.fn.animate;
	$.fn.animate = function(prop){
		if('background-position' in prop){
			prop.backgroundPosition = prop['background-position'];
			delete prop['background-position'];
		}
		if('backgroundPosition' in prop){
			prop.backgroundPosition = '('+ prop.backgroundPosition;
		}
		return oldAnim.apply(this, arguments);
	};
	
	function toArray(strg){
		strg = strg.replace(/left|top/g,'0px');
		strg = strg.replace(/right|bottom/g,'100%');
		strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g,"$1px$2");
		var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
		return [parseFloat(res[1],10),res[2],parseFloat(res[3],10),res[4]];
	}
	
	$.fx.step. backgroundPosition = function(fx) {
		if (!fx.bgPosReady) {
			var start = $.curCSS(fx.elem,'backgroundPosition');
			if(!start){//FF2 no inline-style fallback
				start = '0px 0px';
			}
			
			start = toArray(start);
			fx.start = [start[0],start[2]];
			var end = toArray(fx.end);
			fx.end = [end[0],end[2]];
			
			fx.unit = [end[1],end[3]];
			fx.bgPosReady = true;
		}
		//return;
		var nowPosX = [];
		nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
		nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];           
		fx.elem.style.backgroundPosition = nowPosX[0]+' '+nowPosX[1];

	};
})(jQuery);




/*
 * 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. 
 *
 */
 
 
 
 
 /**
 * Copyright (c) 2010 Anders Ekdahl (http://coffeescripter.com/)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Version: 1.2.4
 *
 * Demo and documentation: http://coffeescripter.com/code/ad-gallery/
 */
(function($) {
  $.fn.adGallery = function(options) {
    var defaults = { loader_image: 'loader.gif',
                     start_at_index: 0,
                     description_wrapper: false,
                     thumb_opacity: 0.7,
                     animate_first_image: false,
                     animation_speed: 400,
                     width: false,
                     height: false,
                     display_next_and_prev: true,
                     display_back_and_forward: true,
                     scroll_jump: 0, // If 0, it jumps the width of the container
                     slideshow: {
                       enable: true,
                       autostart: false,
                       speed: 5000,
                       start_label: 'Start',
                       stop_label: 'Stop',
                       stop_on_scroll: true,
                       countdown_prefix: '(',
                       countdown_sufix: ')',
                       onStart: false,
                       onStop: false
                     },
                     effect: 'slide-hori', // or 'slide-vert', 'fade', or 'resize', 'none'
                     enable_keyboard_move: true,
                     cycle: true,
                     callbacks: {
                       init: false,
                       afterImageVisible: false,
                       beforeImageVisible: false
                     }
    };
    var settings = $.extend(false, defaults, options);
    if(options && options.slideshow) {
      settings.slideshow = $.extend(false, defaults.slideshow, options.slideshow);
    };
    if(!settings.slideshow.enable) {
      settings.slideshow.autostart = false;
    };
    var galleries = [];
    $(this).each(function() {
      var gallery = new AdGallery(this, settings);
      galleries[galleries.length] = gallery;
    });
    // Sorry, breaking the jQuery chain because the gallery instances
    // are returned so you can fiddle with them
    return galleries;
  };

  function VerticalSlideAnimation(img_container, direction, desc) {
    var current_top = parseInt(img_container.css('top'), 10);
    if(direction == 'left') {
      var old_image_top = '-'+ this.image_wrapper_height +'px';
      img_container.css('top', this.image_wrapper_height +'px');
    } else {
      var old_image_top = this.image_wrapper_height +'px';
      img_container.css('top', '-'+ this.image_wrapper_height +'px');
    };
    if(desc) {
      desc.css('bottom', '-'+ desc[0].offsetHeight +'px');
      desc.animate({bottom: 0}, this.settings.animation_speed * 2);
    };
    if(this.current_description) {
      this.current_description.animate({bottom: '-'+ this.current_description[0].offsetHeight +'px'}, this.settings.animation_speed * 2);
    };
    return {old_image: {top: old_image_top},
            new_image: {top: current_top}};
  };

  function HorizontalSlideAnimation(img_container, direction, desc) {
    var current_left = parseInt(img_container.css('left'), 10);
    if(direction == 'left') {
      var old_image_left = '-'+ this.image_wrapper_width +'px';
      img_container.css('left',this.image_wrapper_width +'px');
    } else {
      var old_image_left = this.image_wrapper_width +'px';
      img_container.css('left','-'+ this.image_wrapper_width +'px');
    };
    if(desc) {
      desc.css('bottom', '-'+ desc[0].offsetHeight +'px');
      desc.animate({bottom: 0}, this.settings.animation_speed * 2);
    };
    if(this.current_description) {
      this.current_description.animate({bottom: '-'+ this.current_description[0].offsetHeight +'px'}, this.settings.animation_speed * 2);
    };
    return {old_image: {left: old_image_left},
            new_image: {left: current_left}};
  };

  function ResizeAnimation(img_container, direction, desc) {
    var image_width = img_container.width();
    var image_height = img_container.height();
    var current_left = parseInt(img_container.css('left'), 10);
    var current_top = parseInt(img_container.css('top'), 10);
    img_container.css({width: 0, height: 0, top: this.image_wrapper_height / 2, left: this.image_wrapper_width / 2});
    return {old_image: {width: 0,
                        height: 0,
                        top: this.image_wrapper_height / 2,
                        left: this.image_wrapper_width / 2},
            new_image: {width: image_width,
                        height: image_height,
                        top: current_top,
                        left: current_left}};
  };

  function FadeAnimation(img_container, direction, desc) {
    img_container.css('opacity', 0);
    return {old_image: {opacity: 0},
            new_image: {opacity: 1}};
  };

  // Sort of a hack, will clean this up... eventually
  function NoneAnimation(img_container, direction, desc) {
    img_container.css('opacity', 0);
    return {old_image: {opacity: 0},
            new_image: {opacity: 1},
            speed: 0};
  };

  function AdGallery(wrapper, settings) {
    this.init(wrapper, settings);
  };
  AdGallery.prototype = {
    // Elements
    wrapper: false,
    image_wrapper: false,
    gallery_info: false,
    nav: false,
    loader: false,
    preloads: false,
    thumbs_wrapper: false,
    scroll_back: false,
    scroll_forward: false,
    next_link: false,
    prev_link: false,

    slideshow: false,
    image_wrapper_width: 0,
    image_wrapper_height: 0,
    current_index: 0,
    current_image: false,
    current_description: false,
    nav_display_width: 0,
    settings: false,
    images: false,
    in_transition: false,
    animations: false,
    init: function(wrapper, settings) {
      var context = this;
      this.wrapper = $(wrapper);
      this.settings = settings;
      this.setupElements();
      this.setupAnimations();
      if(this.settings.width) {
        this.image_wrapper_width = this.settings.width;
        this.image_wrapper.width(this.settings.width);
        this.wrapper.width(this.settings.width);
      } else {
        this.image_wrapper_width = this.image_wrapper.width();
      };
      if(this.settings.height) {
        this.image_wrapper_height = this.settings.height;
        this.image_wrapper.height(this.settings.height);
      } else {
        this.image_wrapper_height = this.image_wrapper.height();
      };
      this.nav_display_width = this.nav.width();
      this.current_index = 0;
      this.current_image = false;
      this.current_description = false;
      this.in_transition = false;
      this.findImages();
      if(this.settings.display_next_and_prev) {
        this.initNextAndPrev();
      };
      // The slideshow needs a callback to trigger the next image to be shown
      // but we don't want to give it access to the whole gallery instance
      var nextimage_callback = function(callback) {
        return context.nextImage(callback);
      };
      this.slideshow = new AdGallerySlideshow(nextimage_callback, this.settings.slideshow);
      this.controls.append(this.slideshow.create());
      if(this.settings.slideshow.enable) {
        this.slideshow.enable();
      } else {
        this.slideshow.disable();
      };
      if(this.settings.display_back_and_forward) {
        this.initBackAndForward();
      };
      if(this.settings.enable_keyboard_move) {
        this.initKeyEvents();
      };
      var start_at = parseInt(this.settings.start_at_index, 10);
      if(window.location.hash && window.location.hash.indexOf('#ad-image') === 0) {
        start_at = window.location.hash.replace(/[^0-9]+/g, '');
        // Check if it's a number
        if((start_at * 1) != start_at) {
          start_at = this.settings.start_at_index;
        };
      };

      this.loading(true);
      this.showImage(start_at,
        function() {
          // We don't want to start the slideshow before the image has been
          // displayed
          if(context.settings.slideshow.autostart) {
            context.preloadImage(start_at + 1);
            context.slideshow.start();
          };
        }
      );
      this.fireCallback(this.settings.callbacks.init);
    },
    setupAnimations: function() {
      this.animations = {
        'slide-vert': VerticalSlideAnimation,
        'slide-hori': HorizontalSlideAnimation,
        'resize': ResizeAnimation,
        'fade': FadeAnimation,
        'none': NoneAnimation
      };
    },
    setupElements: function() {
      this.controls = this.wrapper.find('.ad-controls');
      this.gallery_info = $('<p class="ad-info"></p>');
      this.controls.append(this.gallery_info);
      this.image_wrapper = this.wrapper.find('.ad-image-wrapper');
      this.image_wrapper.empty();
      this.nav = this.wrapper.find('.ad-nav');
      this.thumbs_wrapper = this.nav.find('.ad-thumbs');
      this.preloads = $('<div class="ad-preloads"></div>');
      this.loader = $('<img class="ad-loader" src="'+ this.settings.loader_image +'">');
      this.image_wrapper.append(this.loader);
      this.loader.hide();
      $(document.body).append(this.preloads);
    },
    loading: function(bool) {
      if(bool) {
        this.loader.show();
      } else {
        this.loader.hide();
      };
    },
    addAnimation: function(name, fn) {
      if($.isFunction(fn)) {
        this.animations[name] = fn;
      };
    },
    findImages: function() {
      var context = this;
      this.images = [];
      var thumb_wrapper_width = 0;
      var thumbs_loaded = 0;
      var thumbs = this.thumbs_wrapper.find('a');
      var thumb_count = thumbs.length;
      if(this.settings.thumb_opacity < 1) {
        thumbs.find('img').css('opacity', this.settings.thumb_opacity);
      };
      thumbs.each(
        function(i) {
          var link = $(this);
          var image_src = link.attr('href');
          var thumb = link.find('img');
          // Check if the thumb has already loaded
          if(!context.isImageLoaded(thumb[0])) {
            thumb.load(
              function() {
                thumb_wrapper_width += this.parentNode.parentNode.offsetWidth;
                thumbs_loaded++;
              }
            );
          } else{
            thumb_wrapper_width += thumb[0].parentNode.parentNode.offsetWidth;
            thumbs_loaded++;
          };
          link.addClass('ad-thumb'+ i);
          link.click(
            function() {
              context.showImage(i);
              context.slideshow.stop();
              return false;
            }
          ).hover(
            function() {
              if(!$(this).is('.ad-active') && context.settings.thumb_opacity < 1) {
                $(this).find('img').fadeTo(300, 1);
              };
              context.preloadImage(i);
            },
            function() {
              if(!$(this).is('.ad-active') && context.settings.thumb_opacity < 1) {
                $(this).find('img').fadeTo(300, context.settings.thumb_opacity);
              };
            }
          );
          var link = false;
          if(thumb.data('ad-link')) {
            link = thumb.data('ad-link');
          } else if(thumb.attr('longdesc') && thumb.attr('longdesc').length) {
            link = thumb.attr('longdesc');
          };
          var desc = false;
          if(thumb.data('ad-desc')) {
            desc = thumb.data('ad-desc');
          } else if(thumb.attr('alt') && thumb.attr('alt').length) {
            desc = thumb.attr('alt');
          };
          var title = false;
          if(thumb.data('ad-title')) {
            title = thumb.data('ad-title');
          } else if(thumb.attr('title') && thumb.attr('title').length) {
            title = thumb.attr('title');
          };
          context.images[i] = { thumb: thumb.attr('src'), image: image_src, error: false,
                                preloaded: false, desc: desc, title: title, size: false,
                                link: link };
        }
      );
      // Wait until all thumbs are loaded, and then set the width of the ul
      var inter = setInterval(
        function() {
          if(thumb_count == thumbs_loaded) {
            thumb_wrapper_width -= 100;
            var list = context.nav.find('.ad-thumb-list');
            list.css('width', thumb_wrapper_width +'px');
            var i = 1;
            var last_height = list.height();
            while(i < 201) {
              list.css('width', (thumb_wrapper_width + i) +'px');
              if(last_height != list.height()) {
                break;
              }
              last_height = list.height();
              i++;
            }
            clearInterval(inter);
          };
        },
        100
      );
    },
    initKeyEvents: function() {
      var context = this;
      $(document).keydown(
        function(e) {
          if(e.keyCode == 39) {
            // right arrow
            context.nextImage();
            context.slideshow.stop();
          } else if(e.keyCode == 37) {
            // left arrow
            context.prevImage();
            context.slideshow.stop();
          };
        }
      );
    },
    initNextAndPrev: function() {
      this.next_link = $('<div class="ad-next"><div class="ad-next-image"></div></div>');
      this.prev_link = $('<div class="ad-prev"><div class="ad-prev-image"></div></div>');
      this.image_wrapper.append(this.next_link);
      this.image_wrapper.append(this.prev_link);
      var context = this;
      this.prev_link.add(this.next_link).mouseover(
        function(e) {
          // IE 6 hides the wrapper div, so we have to set it's width
          $(this).css('height', context.image_wrapper_height);
          $(this).find('div').show();
        }
      ).mouseout(
        function(e) {
          $(this).find('div').hide();
        }
      ).click(
        function() {
          if($(this).is('.ad-next')) {
            context.nextImage();
            context.slideshow.stop();
          } else {
            context.prevImage();
            context.slideshow.stop();
          };
        }
      ).find('div').css('opacity', 1);
    },
    initBackAndForward: function() {
      var context = this;
      this.scroll_forward = $('<div class="ad-forward"></div>');
      this.scroll_back = $('<div class="ad-back"></div>');
      this.nav.append(this.scroll_forward);
      this.nav.prepend(this.scroll_back);
      var has_scrolled = 0;
      var thumbs_scroll_interval = false;
      $(this.scroll_back).add(this.scroll_forward).click(
        function() {
          // We don't want to jump the whole width, since an image
          // might be cut at the edge
          var width = context.nav_display_width - 50;
          if(context.settings.scroll_jump > 0) {
            var width = context.settings.scroll_jump;
          };
          if($(this).is('.ad-forward')) {
            var left = context.thumbs_wrapper.scrollLeft() + width;
          } else {
            var left = context.thumbs_wrapper.scrollLeft() - width;
          };
          if(context.settings.slideshow.stop_on_scroll) {
            context.slideshow.stop();
          };
          context.thumbs_wrapper.animate({scrollLeft: left +'px'});
          return false;
        }
      ).css('opacity', 0.6).hover(
        function() {
          var direction = 'left';
          if($(this).is('.ad-forward')) {
            direction = 'right';
          };
          thumbs_scroll_interval = setInterval(
            function() {
              has_scrolled++;
              // Don't want to stop the slideshow just because we scrolled a pixel or two
              if(has_scrolled > 30 && context.settings.slideshow.stop_on_scroll) {
                context.slideshow.stop();
              };
              var left = context.thumbs_wrapper.scrollLeft() + 1;
              if(direction == 'left') {
                left = context.thumbs_wrapper.scrollLeft() - 1;
              };
              context.thumbs_wrapper.scrollLeft(left);
            },
            10
          );
          $(this).css('opacity', 1);
        },
        function() {
          has_scrolled = 0;
          clearInterval(thumbs_scroll_interval);
          $(this).css('opacity', 0.6);
        }
      );
    },
    _afterShow: function() {
      this.gallery_info.html((this.current_index + 1) +' / '+ this.images.length);
      if(!this.settings.cycle) {
        // Needed for IE
        this.prev_link.show().css('height', this.image_wrapper_height);
        this.next_link.show().css('height', this.image_wrapper_height);
        if(this.current_index == (this.images.length - 1)) {
          this.next_link.hide();
        };
        if(this.current_index == 0) {
          this.prev_link.hide();
        };
      };
      this.fireCallback(this.settings.callbacks.afterImageVisible);
    },
    /**
     * Checks if the image is small enough to fit inside the container
     * If it's not, shrink it proportionally
     */
    _getContainedImageSize: function(image_width, image_height) {
      if(image_height > this.image_wrapper_height) {
        var ratio = image_width / image_height;
        image_height = this.image_wrapper_height;
        image_width = this.image_wrapper_height * ratio;
      };
      if(image_width > this.image_wrapper_width) {
  	    var ratio = image_height / image_width;
  	    image_width = this.image_wrapper_width;
  	    image_height = this.image_wrapper_width * ratio;
  	  };
      return {width: image_width, height: image_height};
    },
    /**
     * If the image dimensions are smaller than the wrapper, we position
     * it in the middle anyway
     */
    _centerImage: function(img_container, image_width, image_height) {
      img_container.css('top', '0px');
      if(image_height < this.image_wrapper_height) {
        var dif = this.image_wrapper_height - image_height;
        img_container.css('top', (dif / 2) +'px');
      };
      img_container.css('left', '0px');
      if(image_width < this.image_wrapper_width) {
        var dif = this.image_wrapper_width - image_width;
        img_container.css('left', (dif / 2) +'px');
      };
    },
    _getDescription: function(image) {
      var desc = false;
      if(image.desc.length || image.title.length) {
        var title = '';
        if(image.title.length) {
          title = '<strong class="ad-description-title">'+ image.title +'</strong>';
        };
        var desc = '';
        if(image.desc.length) {
          desc = '<span>'+ image.desc +'</span>';
        };
        desc = $('<p class="ad-image-description">'+ title + desc +'</p>');
      };
      return desc;
    },
    /**
     * @param function callback Gets fired when the image has loaded, is displaying
     *                          and it's animation has finished
     */
    showImage: function(index, callback) {
      if(this.images[index] && !this.in_transition) {
        var context = this;
        var image = this.images[index];
        this.in_transition = true;
        if(!image.preloaded) {
          this.loading(true);
          this.preloadImage(index, function() {
            context.loading(false);
            context._showWhenLoaded(index, callback);
          });
        } else {
          this._showWhenLoaded(index, callback);
        };
      };
    },
    /**
     * @param function callback Gets fired when the image has loaded, is displaying
     *                          and it's animation has finished
     */
    _showWhenLoaded: function(index, callback) {
      if(this.images[index]) {
        var context = this;
        var image = this.images[index];
        var img_container = $(document.createElement('div')).addClass('ad-image');
        var img = $(new Image()).attr('src', image.image);
        if(image.link) {
          var link = $('<a href="'+ image.link +'" target="_blank"></a>');
          link.append(img);
          img_container.append(link);
        } else {
          img_container.append(img);
        }
        this.image_wrapper.prepend(img_container);
        var size = this._getContainedImageSize(image.size.width, image.size.height);
        img.attr('width', size.width);
        img.attr('height', size.height);
        img_container.css({width: size.width +'px', height: size.height +'px'});
        this._centerImage(img_container, size.width, size.height);
        var desc = this._getDescription(image, img_container);
        if(desc) {
          if(!this.settings.description_wrapper) {
            img_container.append(desc);
            var width = size.width - parseInt(desc.css('padding-left'), 10) - parseInt(desc.css('padding-right'), 10);
            desc.css('width', width +'px');
          } else {
            this.settings.description_wrapper.append(desc);
          }
        };
        this.highLightThumb(this.nav.find('.ad-thumb'+ index));

        var direction = 'right';
        if(this.current_index < index) {
          direction = 'left';
        };
        this.fireCallback(this.settings.callbacks.beforeImageVisible);
        if(this.current_image || this.settings.animate_first_image) {
          var animation_speed = this.settings.animation_speed;
          var easing = 'swing';
          var animation = this.animations[this.settings.effect].call(this, img_container, direction, desc);
          if(typeof animation.speed != 'undefined') {
            animation_speed = animation.speed;
          };
          if(typeof animation.easing != 'undefined') {
            easing = animation.easing;
          };
          if(this.current_image) {
            var old_image = this.current_image;
            var old_description = this.current_description;
            old_image.animate(animation.old_image, animation_speed, easing,
              function() {
                old_image.remove();
                if(old_description) old_description.remove();
              }
            );
          };
          img_container.animate(animation.new_image, animation_speed, easing,
            function() {
              context.current_index = index;
              context.current_image = img_container;
              context.current_description = desc;
              context.in_transition = false;
              context._afterShow();
              context.fireCallback(callback);
            }
          );
        } else {
          this.current_index = index;
          this.current_image = img_container;
          context.current_description = desc;
          this.in_transition = false;
          context._afterShow();
          this.fireCallback(callback);
        };
      };
    },
    nextIndex: function() {
      if(this.current_index == (this.images.length - 1)) {
        if(!this.settings.cycle) {
          return false;
        };
        var next = 0;
      } else {
        var next = this.current_index + 1;
      };
      return next;
    },
    nextImage: function(callback) {
      var next = this.nextIndex();
      if(next === false) return false;
      this.preloadImage(next + 1);
      this.showImage(next, callback);
      return true;
    },
    prevIndex: function() {
      if(this.current_index == 0) {
        if(!this.settings.cycle) {
          return false;
        };
        var prev = this.images.length - 1;
      } else {
        var prev = this.current_index - 1;
      };
      return prev;
    },
    prevImage: function(callback) {
      var prev = this.prevIndex();
      if(prev === false) return false;
      this.preloadImage(prev - 1);
      this.showImage(prev, callback);
      return true;
    },
    preloadAll: function() {
      var context = this;
      var i = 0;
      function preloadNext() {
        if(i < context.images.length) {
          i++;
          context.preloadImage(i, preloadNext);
        };
      };
      context.preloadImage(i, preloadNext);
    },
    preloadImage: function(index, callback) {
      if(this.images[index]) {
        var image = this.images[index];
        if(!this.images[index].preloaded) {
          var img = $(new Image());
          img.attr('src', image.image);
          if(!this.isImageLoaded(img[0])) {
            this.preloads.append(img);
            var context = this;
            img.load(
              function() {
                image.preloaded = true;
                image.size = { width: this.width, height: this.height };
                context.fireCallback(callback);
              }
            ).error(
              function() {
                image.error = true;
                image.preloaded = false;
                image.size = false;
              }
            );
          } else {
            image.preloaded = true;
            image.size = { width: img[0].width, height: img[0].height };
            this.fireCallback(callback);
          };
        } else {
          this.fireCallback(callback);
        };
      };
    },
    isImageLoaded: function(img) {
      if(typeof img.complete != 'undefined' && !img.complete) {
        return false;
      };
      if(typeof img.naturalWidth != 'undefined' && img.naturalWidth == 0) {
        return false;
      };
      return true;
    },
    highLightThumb: function(thumb) {
      this.thumbs_wrapper.find('.ad-active').removeClass('ad-active');
      thumb.addClass('ad-active');
      if(this.settings.thumb_opacity < 1) {
        this.thumbs_wrapper.find('a:not(.ad-active) img').fadeTo(300, this.settings.thumb_opacity);
        thumb.find('img').fadeTo(300, 1);
      };
      var left = thumb[0].parentNode.offsetLeft;
      left -= (this.nav_display_width / 2) - (thumb[0].offsetWidth / 2);
      this.thumbs_wrapper.animate({scrollLeft: left +'px'});
    },
    fireCallback: function(fn) {
      if($.isFunction(fn)) {
        fn.call(this);
      };
    }
  };

  function AdGallerySlideshow(nextimage_callback, settings) {
    this.init(nextimage_callback, settings);
  };
  AdGallerySlideshow.prototype = {
    start_link: false,
    stop_link: false,
    countdown: false,
    controls: false,

    settings: false,
    nextimage_callback: false,
    enabled: false,
    running: false,
    countdown_interval: false,
    init: function(nextimage_callback, settings) {
      var context = this;
      this.nextimage_callback = nextimage_callback;
      this.settings = settings;
    },
    create: function() {
      this.start_link = $('<span class="ad-slideshow-start">'+ this.settings.start_label +'</span>');
      this.stop_link = $('<span class="ad-slideshow-stop">'+ this.settings.stop_label +'</span>');
      this.countdown = $('<span class="ad-slideshow-countdown"></span>');
      this.controls = $('<div class="ad-slideshow-controls"></div>');
      this.controls.append(this.start_link).append(this.stop_link).append(this.countdown);
      this.countdown.hide();

      var context = this;
      this.start_link.click(
        function() {
          context.start();
        }
      );
      this.stop_link.click(
        function() {
          context.stop();
        }
      );
      $(document).keydown(
        function(e) {
          if(e.keyCode == 83) {
            // 's'
            if(context.running) {
              context.stop();
            } else {
              context.start();
            };
          };
        }
      );
      return this.controls;
    },
    disable: function() {
      this.enabled = false;
      this.stop();
      this.controls.hide();
    },
    enable: function() {
      this.enabled = true;
      this.controls.show();
    },
    toggle: function() {
      if(this.enabled) {
        this.disable();
      } else {
        this.enable();
      };
    },
    start: function() {
      if(this.running || !this.enabled) return false;
      var context = this;
      this.running = true;
      this.controls.addClass('ad-slideshow-running');
      this._next();
      this.fireCallback(this.settings.onStart);
      return true;
    },
    stop: function() {
      if(!this.running) return false;
      this.running = false;
      this.countdown.hide();
      this.controls.removeClass('ad-slideshow-running');
      clearInterval(this.countdown_interval);
      this.fireCallback(this.settings.onStop);
      return true;
    },
    _next: function() {
      var context = this;
      var pre = this.settings.countdown_prefix;
      var su = this.settings.countdown_sufix;
      clearInterval(context.countdown_interval);
      this.countdown.show().html(pre + (this.settings.speed / 1000) + su);
      var slide_timer = 0;
      this.countdown_interval = setInterval(
        function() {
          slide_timer += 1000;
          if(slide_timer >= context.settings.speed) {
            var whenNextIsShown = function() {
              // A check so the user hasn't stoped the slideshow during the
              // animation
              if(context.running) {
                context._next();
              };
              slide_timer = 0;
            };
            if(!context.nextimage_callback(whenNextIsShown)) {
              context.stop();
            };
            slide_timer = 0;
          };
          var sec = parseInt(context.countdown.text().replace(/[^0-9]/g, ''), 10);
          sec--;
          if(sec > 0) {
            context.countdown.html(pre + sec + su);
          };
        },
        1000
      );
    },
    fireCallback: function(fn) {
      if($.isFunction(fn)) {
        fn.call(this);
      };
    }
  };
})(jQuery);




/*
 * Lightbox use jQuery library - Require $ 1.2+
 * @Version:	1.0.4

Usage: 	caobox.show('boxID', 'overlayColor', 'overlayOpacity', 'overlayDisable', 'leftPosition', 'topPosition')
Exp:	caobox.show('testID', '000', '50', '', '10', '10')
Arguments:
	divID : [char] Div’s id
	overlayColor : [hex number] Used to define the overlay background color.  ‘000‘ (black) is default
	overlayOpacity : [int 0~100] Used to define the overlay opacity. ‘50‘ is default.
	overlayDisable : ['false'] Used to disable click on overlay to close popup. null is default
	leftPosition : [int] The padding CSS information used in the left position of image box. null mean center is default. [int]<0 is padding-right position
	topPosition : [int] The padding CSS information used in the top position of image box. null mean middle is default. [int]<0 is padding-bottom position
*/

var caobox = {		
	fadeEffectDuration : 900,
	fade:"#fade",
	light:"#light",
	boxID:"",
	overlayBgColor:"#000",
	overlayOpacity:"50",
	
	show:function(boxId, overlayBgColor, overlayOpacity, overlayDisable, leftPosition, topPosition)
	{
		// Get layer Background color & opacity
		if (overlayBgColor) this.overlayBgColor = "#"+ overlayBgColor;
		if (overlayOpacity) this.overlayOpacity = overlayOpacity;
		
		// Add layer
		$('body').prepend('<div id="light"></div><div id="fade"></div>');		
		$('#light, #fade').css({'display':'none', 'position':'absolute'});
		$('#light').css({	'zIndex':'10002',
							'height':'auto',
							'overflow':'hidden'});
		$('#fade').css({	'zIndex':'10001',
					   		'left':'0',
							'top':'0',
					   		'backgroundColor': ''+ this.overlayBgColor +'',
					   		'opacity':'.'+ this.overlayOpacity+'',
							'filter':'alpha(opacity='+ this.overlayOpacity +')'
						}).click(	function(){
										if (overlayDisable) return true;
										else caobox.hide();
									});
	
		// Show layer
		this.boxID='#'+boxId;		
		$('object, embed, select').css('visibility','hidden');

		// fix clone function not work in IE
		// FLV		
		var inner_boxID = $(this.boxID).html();
		if (boxId) var filetype = inner_boxID.substring(inner_boxID.length-3, inner_boxID.length);
		if (filetype == "flv"){
			var embedFLV = '<object height="400" width="420" type="application/x-shockwave-flash" data="'+inner_boxID+'&bufferTime=3&autoStart=false">'
				+'<param value="true" name="allowfullscreen"/>'
				+'<param value="high" name="quality"/>'
				+'<param value="'+inner_boxID+'" name="src"/></object>';		
			var full_boxID = "<div id="+ boxId +">"+ embedFLV +"</div>";
			$(this.light).append(full_boxID);
		}
		else{
			$(this.boxID).clone().appendTo($(this.light));
		}
		
		$(this.boxID).show();
		$(this.light).fadeIn('fast', function(){
			 //$(this.light).css({display:'block'}); 
		});	

		var _top = Math.round((getDocumentSize(3) - $(this.light).height()) / 2);
		
		// Left position, default is center
		if (leftPosition){
			_left = leftPosition;
			if (leftPosition > 0) $(this.light).css({left: _left+ "px"});
			else			
				$(this.light).css({right: Math.abs(_left) + "px"});			
		}
		else{
			_left = Math.round((getDocumentSize(2) - $(this.light).width()) / 2);
			$(this.light).css({left: _left+ "px"});
		}		
		
		// Top position, default is middle
		if (topPosition){			
			if (topPosition > 0){
				_top = topPosition;
				$(this.light).css({top: _top+"px"});
			}
			else{
				_top = Math.abs(topPosition);
				$(this.light).css({bottom: _top+"px"});
			}
		}		
		else{
			if(_top < 0) _top = 20;		
			$(this.light).css({top: _top+"px"});
		}
		
		caobox.showAlertLayer();	
		caobox.setFocusElement();
		window.scrollTo(0,0);
		window.onresize=caobox.resizeLayers;
	},
	
	hide:function(){	
		$(this.boxID).remove();
		$(this.fade).fadeOut(this.fadeEffectDuration);
		$(this.light).fadeOut(this.fadeEffectDuration, function(){
			$('object, embed, select').css('visibility','');
			$('#fade, #light').remove();
		});
	},
	
	showAlertLayer : function(){
		var _height=getDocumentSize(1);
		var _width =getDocumentSize(0);
		
		if(_width < 974) 
			 _width = 974;	
		
		if($(this.boxID).height() > getDocumentSize(1))
			_height=parseInt($(this.boxID).height()) + 65;		
		
		$(this.fade).css({width:_width +'px'});
		$(this.fade).css({height:_height +'px'});	
		//$(this.fade).css({display:'block'}); 
		$(this.fade).fadeIn('normal');
	},
	
	resizeLayers : function(){
		if($(this.boxID).height() > getDocumentSize(1)){
			var _height = parseInt($(this.boxID).height());
			var pageHeight = _height;
		}
		else{
			if (getDocumentSize(1) > getDocumentSize(3)){ var pageHeight=getDocumentSize(1)}
			else{ var pageHeight=getDocumentSize(3);}
		};
		
		if(getDocumentSize(0) < 974) $('#fade').css({width:974 + "px"});
		else $('#fade').css({width:getDocumentSize(0) + "px"});
		$('#fade').css({height:pageHeight + 'px'});
		$('#light').css({left: Math.round((getDocumentSize(2) - $('#light').width()) / 2)+"px"});
		
		var _top=Math.round((getDocumentSize(3) - $(this.light).height()) / 2);
		if(_top < 0) _top = 20;
		$(this.light).css({top:_top+"px"});
	},
	
	findFucusElement:function(){
		$("#light").find('object, embed, select').css({'visibility':'visible'});
		$("#light").find('input[@type!=hidden], a, select, textarea').addClass('setFocusAble');			
		return $('.setFocusAble');
	},
	
	setFocusElement:function(){
		var i = 0;
		var cntElement = 0;	
		var allFocusElement = caobox.findFucusElement();
		var len=allFocusElement.length;	
		
		if (len>0){
			for(var temJ = 0; temJ<len-1; temJ++){
				$(allFocusElement[temJ]).attr('rel',temJ+1);
			}
			
			// fix focus on 1st hidden element
			if ( allFocusElement[0].style.display == 'none') 
				allFocusElement[1].focus();
			else
				allFocusElement[0].focus();
	
	
			allFocusElement.focus(function(){ cntElement=this.getAttribute('rel'); });
			$("#light").keydown(function(event){									 
				if(event.shiftKey){
					if(event.keyCode == 9){					
						if (i!=cntElement) i=cntElement;
						i--;			
						if (i == 0) {
							i = len-1;
							allFocusElement[i].focus();
							return false;
						}
					}
				}
				else{
					if(event.keyCode == 9){
						if (i != cntElement) i = cntElement;
						if (i == len-1){
							i=0;
							allFocusElement[0].focus();						
							return false;
						}
						else{
							i++;
						}
					}
				}			
			}); 
		}
	},
	
	unbindClickFace:function(){
		$(this.fade).unbind('click');
	},
	
	init:function()
	{		
		$(document).ready(function(){
			$('.caobox-popup').hide();
			$('body').css({'margin':'0', 'padding':'0'}); // hack browser
			$('img.caobox-popup').css({ 'border':'5px solid #000'});
		})		
	}
};
caobox.init({							
});

// Get ducument size
// @param int 0 ~ 3
// @return array [width of current page] [height of current page] [width of window] [height of window]
function getDocumentSize(val){
	var xScroll,yScroll,value;
	
	if(window.innerHeight&&window.scrollMaxY){
		xScroll=window.innerWidth+window.scrollMaxX;
		yScroll=window.innerHeight+window.scrollMaxY;
	}
	else if(document.body.scrollHeight>document.body.offsetHeight){
		xScroll=document.body.scrollWidth;
		yScroll=document.body.scrollHeight;
		}
		else{
			xScroll=document.body.offsetWidth;
			yScroll=document.body.offsetHeight;
		}
	
	var windowWidth,windowHeight;
	
	if(self.innerHeight){
		if(document.documentElement.clientWidth){
			windowWidth=document.documentElement.clientWidth;
		}
		else{
			windowWidth=self.innerWidth;
		}
		windowHeight=self.innerHeight;
	}
	else if(document.documentElement&&document.documentElement.clientHeight){
			windowWidth=document.documentElement.clientWidth;
			windowHeight=document.documentElement.clientHeight;
		}
		else if(document.body){
			windowWidth=document.body.clientWidth;
			windowHeight=document.body.clientHeight;
		}
	
	if(yScroll<windowHeight){
		pageHeight=windowHeight;
	}
	else{
		pageHeight=yScroll
	}
	
	if(xScroll<windowWidth){
		pageWidth=xScroll
	}
	else{
		pageWidth=windowWidth
	}
	
	arrayPageSize=new Array(pageWidth, pageHeight, windowWidth, windowHeight);
	return arrayPageSize[val];
};




/* Copyright (c) 2006 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.
 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
 *
 * $LastChangedDate: 2007-12-20 09:02:08 -0600 (Thu, 20 Dec 2007) $
 * $Rev: 4265 $
 *
 * Version: 3.0
 * 
 * Requires: $ 1.2.2+
 */

(function($) {

$.event.special.mousewheel = {
	setup: function() {
		var handler = $.event.special.mousewheel.handler;
		
		// Fix pageX, pageY, clientX and clientY for mozilla
		if ( $.browser.mozilla )
			$(this).bind('mousemove.mousewheel', function(event) {
				$.data(this, 'mwcursorposdata', {
					pageX: event.pageX,
					pageY: event.pageY,
					clientX: event.clientX,
					clientY: event.clientY
				});
			});
	
		if ( this.addEventListener )
			this.addEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
		else
			this.onmousewheel = handler;
	},
	
	teardown: function() {
		var handler = $.event.special.mousewheel.handler;
		
		$(this).unbind('mousemove.mousewheel');
		
		if ( this.removeEventListener )
			this.removeEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
		else
			this.onmousewheel = function(){};
		
		$.removeData(this, 'mwcursorposdata');
	},
	
	handler: function(event) {
		var args = Array.prototype.slice.call( arguments, 1 );
		
		event = $.event.fix(event || window.event);
		// Get correct pageX, pageY, clientX and clientY for mozilla
		$.extend( event, $.data(this, 'mwcursorposdata') || {} );
		var delta = 0, returnValue = true;
		
		if ( event.wheelDelta ) delta = event.wheelDelta/120;
		if ( event.detail     ) delta = -event.detail/3;
//		if ( $.browser.opera  ) delta = -event.wheelDelta;
		
		event.data  = event.data || {};
		event.type  = "mousewheel";
		
		// Add delta to the front of the arguments
		args.unshift(delta);
		// Add event to the front of the arguments
		args.unshift(event);

		return $.event.handle.apply(this, args);
	}
};

$.fn.extend({
	mousewheel: function(fn) {
		return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
	},
	
	unmousewheel: function(fn) {
		return this.unbind("mousewheel", fn);
	}
});

})(jQuery);



/* Copyright (c) 2009 Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 * 
 * See http://kelvinluck.com/assets/jquery/jScrollPane/
 * $Id: jScrollPane.js 93 2010-06-01 08:17:28Z kelvin.luck $
 */

/**
 * Replace the vertical scroll bars on any matched elements with a fancy
 * styleable (via CSS) version. With JS disabled the elements will
 * gracefully degrade to the browsers own implementation of overflow:auto.
 * If the mousewheel plugin has been included on the page then the scrollable areas will also
 * respond to the mouse wheel.
 *
 * @example jQuery(".scroll-pane").jScrollPane();
 *
 * @name jScrollPane
 * @type jQuery
 * @param Object	settings	hash with options, described below.
 *								scrollbarWidth	-	The width of the generated scrollbar in pixels
 *								scrollbarMargin	-	The amount of space to leave on the side of the scrollbar in pixels
 *								wheelSpeed		-	The speed the pane will scroll in response to the mouse wheel in pixels
 *								showArrows		-	Whether to display arrows for the user to scroll with
 *								arrowSize		-	The height of the arrow buttons if showArrows=true
 *								animateTo		-	Whether to animate when calling scrollTo and scrollBy
 *								dragMinHeight	-	The minimum height to allow the drag bar to be
 *								dragMaxHeight	-	The maximum height to allow the drag bar to be
 *								animateInterval	-	The interval in milliseconds to update an animating scrollPane (default 100)
 *								animateStep		-	The amount to divide the remaining scroll distance by when animating (default 3)
 *								maintainPosition-	Whether you want the contents of the scroll pane to maintain it's position when you re-initialise it - so it doesn't scroll as you add more content (default true)
 *								tabIndex		-	The tabindex for this jScrollPane to control when it is tabbed to when navigating via keyboard (default 0)
 *								enableKeyboardNavigation - Whether to allow keyboard scrolling of this jScrollPane when it is focused (default true)
 *								animateToInternalLinks - Whether the move to an internal link (e.g. when it's focused by tabbing or by a hash change in the URL) should be animated or instant (default false)
 *								scrollbarOnLeft	-	Display the scrollbar on the left side?  (needs stylesheet changes, see examples.html)
 *								reinitialiseOnImageLoad - Whether the jScrollPane should automatically re-initialise itself when any contained images are loaded (default false)
 *								topCapHeight	-	The height of the "cap" area between the top of the jScrollPane and the top of the track/ buttons
 *								bottomCapHeight	-	The height of the "cap" area between the bottom of the jScrollPane and the bottom of the track/ buttons
 *								observeHash		-	Whether jScrollPane should attempt to automagically scroll to the correct place when an anchor inside the scrollpane is linked to (default true)
 * @return jQuery
 * @cat Plugins/jScrollPane
 * @author Kelvin Luck (kelvin AT kelvinluck DOT com || http://www.kelvinluck.com)
 */

(function($) {

$.jScrollPane = {
	active : []
};
$.fn.jScrollPane = function(settings)
{
	settings = $.extend({}, $.fn.jScrollPane.defaults, settings);

	var rf = function() { return false; };
	
	return this.each(
		function()
		{
			var $this = $(this);
			var paneEle = this;
			var currentScrollPosition = 0;
			var paneWidth;
			var paneHeight;
			var trackHeight;
			var trackOffset = settings.topCapHeight;
			var $container;
			
			if ($(this).parent().is('.jScrollPaneContainer')) {
				$container = $(this).parent();
				currentScrollPosition = settings.maintainPosition ? $this.position().top : 0;
				var $c = $(this).parent();
				paneWidth = $c.innerWidth();
				paneHeight = $c.outerHeight();
				$('>.jScrollPaneTrack, >.jScrollArrowUp, >.jScrollArrowDown, >.jScrollCap', $c).remove();
				$this.css({'top':0});
			} else {
				$this.data('originalStyleTag', $this.attr('style'));
				// Switch the element's overflow to hidden to ensure we get the size of the element without the scrollbars [http://plugins.jquery.com/node/1208]
				$this.css('overflow', 'hidden');
				this.originalPadding = $this.css('paddingTop') + ' ' + $this.css('paddingRight') + ' ' + $this.css('paddingBottom') + ' ' + $this.css('paddingLeft');
				this.originalSidePaddingTotal = (parseInt($this.css('paddingLeft')) || 0) + (parseInt($this.css('paddingRight')) || 0);
				paneWidth = $this.innerWidth();
				paneHeight = $this.innerHeight();
				$container = $('<div></div>')
					.attr({'className':'jScrollPaneContainer'})
					.css(
						{
							'height':paneHeight+'px', 
							'width':paneWidth+'px'
						}
					);
				if (settings.enableKeyboardNavigation) {
					$container.attr(
						'tabindex', 
						settings.tabIndex
					);
				}
				$this.wrap($container);
				$container = $this.parent();
				// deal with text size changes (if the jquery.em plugin is included)
				// and re-initialise the scrollPane so the track maintains the
				// correct size
				$(document).bind(
					'emchange', 
					function(e, cur, prev)
					{
						$this.jScrollPane(settings);
					}
				);
				
			}
			trackHeight = paneHeight;
			
			if (settings.reinitialiseOnImageLoad) {
				// code inspired by jquery.onImagesLoad: http://plugins.jquery.com/project/onImagesLoad
				// except we re-initialise the scroll pane when each image loads so that the scroll pane is always up to size...
				// TODO: Do I even need to store it in $.data? Is a local variable here the same since I don't pass the reinitialiseOnImageLoad when I re-initialise?
				var $imagesToLoad = $.data(paneEle, 'jScrollPaneImagesToLoad') || $('img', $this);
				var loadedImages = [];
				
				if ($imagesToLoad.length) {
					$imagesToLoad.each(function(i, val)	{
						$(this).bind('load readystatechange', function() {
							if($.inArray(i, loadedImages) == -1){ //don't double count images
								loadedImages.push(val); //keep a record of images we've seen
								$imagesToLoad = $.grep($imagesToLoad, function(n, i) {
									return n != val;
								});
								$.data(paneEle, 'jScrollPaneImagesToLoad', $imagesToLoad);
								var s2 = $.extend(settings, {reinitialiseOnImageLoad:false});
								$this.jScrollPane(s2); // re-initialise
							}
						}).each(function(i, val) {
							if(this.complete || this.complete===undefined) { 
								//needed for potential cached images
								this.src = this.src; 
							} 
						});
					});
				};
			}

			var p = this.originalSidePaddingTotal;
			var realPaneWidth = paneWidth - settings.scrollbarWidth - settings.scrollbarMargin - p;

			var cssToApply = {
				'height':'auto',
				'width': realPaneWidth + 'px'
			}

			if(settings.scrollbarOnLeft) {
				cssToApply.paddingLeft = settings.scrollbarMargin + settings.scrollbarWidth + 'px';
			} else {
				cssToApply.paddingRight = settings.scrollbarMargin + 'px';
			}

			$this.css(cssToApply);

			var contentHeight = $this.outerHeight();
			var percentInView = paneHeight / contentHeight;
			
			var isScrollable = percentInView < .99;
			$container[isScrollable ? 'addClass' : 'removeClass']('jScrollPaneScrollable');

			if (isScrollable) {
				$container.append(
					$('<div></div>').addClass('jScrollCap jScrollCapTop').css({height:settings.topCapHeight}),
					$('<div></div>').attr({'className':'jScrollPaneTrack'}).css({'width':settings.scrollbarWidth+'px'}).append(
						$('<div></div>').attr({'className':'jScrollPaneDrag'}).css({'width':settings.scrollbarWidth+'px'}).append(
							$('<div></div>').attr({'className':'jScrollPaneDragTop'}).css({'width':settings.scrollbarWidth+'px'}),
							$('<div></div>').attr({'className':'jScrollPaneDragBottom'}).css({'width':settings.scrollbarWidth+'px'})
						)
					),
					$('<div></div>').addClass('jScrollCap jScrollCapBottom').css({height:settings.bottomCapHeight})
				);
				
				var $track = $('>.jScrollPaneTrack', $container);
				var $drag = $('>.jScrollPaneTrack .jScrollPaneDrag', $container);
				
				
				var currentArrowDirection;
				var currentArrowTimerArr = [];// Array is used to store timers since they can stack up when dealing with keyboard events. This ensures all timers are cleaned up in the end, preventing an acceleration bug.
				var currentArrowInc;
				var whileArrowButtonDown = function() 
				{
					if (currentArrowInc > 4 || currentArrowInc % 4 == 0) {
						positionDrag(dragPosition + currentArrowDirection * mouseWheelMultiplier);
					}
					currentArrowInc++;
				};

				if (settings.enableKeyboardNavigation) {
					$container.bind(
						'keydown.jscrollpane',
						function(e) 
						{
							switch (e.keyCode) {
								case 38: //up
									currentArrowDirection = -1;
									currentArrowInc = 0;
									whileArrowButtonDown();
									currentArrowTimerArr[currentArrowTimerArr.length] = setInterval(whileArrowButtonDown, 100);
									return false;
								case 40: //down
									currentArrowDirection = 1;
									currentArrowInc = 0;
									whileArrowButtonDown();
									currentArrowTimerArr[currentArrowTimerArr.length] = setInterval(whileArrowButtonDown, 100);
									return false;
								case 33: // page up
								case 34: // page down
									// TODO
									return false;
								default:
							}
						}
					).bind(
						'keyup.jscrollpane',
						function(e) 
						{
							if (e.keyCode == 38 || e.keyCode == 40) {
								for (var i = 0; i < currentArrowTimerArr.length; i++) {
									clearInterval(currentArrowTimerArr[i]);
								}
								return false;
							}
						}
					);
				}

				if (settings.showArrows) {
					
					var currentArrowButton;
					var currentArrowInterval;

					var onArrowMouseUp = function(event)
					{
						$('html').unbind('mouseup', onArrowMouseUp);
						currentArrowButton.removeClass('jScrollActiveArrowButton');
						clearInterval(currentArrowInterval);
					};
					var onArrowMouseDown = function() {
						$('html').bind('mouseup', onArrowMouseUp);
						currentArrowButton.addClass('jScrollActiveArrowButton');
						currentArrowInc = 0;
						whileArrowButtonDown();
						currentArrowInterval = setInterval(whileArrowButtonDown, 100);
					};
					$container
						.append(
							$('<a></a>')
								.attr(
									{
										'href':'javascript:;', 
										'className':'jScrollArrowUp', 
										'tabindex':-1
									}
								)
								.css(
									{
										'width':settings.scrollbarWidth+'px',
										'top':settings.topCapHeight + 'px'
									}
								)
								.html('Scroll up')
								.bind('mousedown', function()
								{
									currentArrowButton = $(this);
									currentArrowDirection = -1;
									onArrowMouseDown();
									this.blur();
									return false;
								})
								.bind('click', rf),
							$('<a></a>')
								.attr(
									{
										'href':'javascript:;', 
										'className':'jScrollArrowDown', 
										'tabindex':-1
									}
								)
								.css(
									{
										'width':settings.scrollbarWidth+'px',
										'bottom':settings.bottomCapHeight + 'px'
									}
								)
								.html('Scroll down')
								.bind('mousedown', function()
								{
									currentArrowButton = $(this);
									currentArrowDirection = 1;
									onArrowMouseDown();
									this.blur();
									return false;
								})
								.bind('click', rf)
						);
					var $upArrow = $('>.jScrollArrowUp', $container);
					var $downArrow = $('>.jScrollArrowDown', $container);
				}
				
				if (settings.arrowSize) {
					trackHeight = paneHeight - settings.arrowSize - settings.arrowSize;
					trackOffset += settings.arrowSize;
				} else if ($upArrow) {
					var topArrowHeight = $upArrow.height();
					settings.arrowSize = topArrowHeight;
					trackHeight = paneHeight - topArrowHeight - $downArrow.height();
					trackOffset += topArrowHeight;
				}
				trackHeight -= settings.topCapHeight + settings.bottomCapHeight;
				$track.css({'height': trackHeight+'px', top:trackOffset+'px'})
				
				var $pane = $(this).css({'position':'absolute', 'overflow':'visible'});
				
				var currentOffset;
				var maxY;
				var mouseWheelMultiplier;
				// store this in a seperate variable so we can keep track more accurately than just updating the css property..
				var dragPosition = 0;
				var dragMiddle = percentInView*paneHeight/2;
				
				// pos function borrowed from tooltip plugin and adapted...
				var getPos = function (event, c) {
					var p = c == 'X' ? 'Left' : 'Top';
					return event['page' + c] || (event['client' + c] + (document.documentElement['scroll' + p] || document.body['scroll' + p])) || 0;
				};
				
				var ignoreNativeDrag = function() {	return false; };
				
				var initDrag = function()
				{
					ceaseAnimation();
					currentOffset = $drag.offset(false);
					currentOffset.top -= dragPosition;
					maxY = trackHeight - $drag[0].offsetHeight;
					mouseWheelMultiplier = 2 * settings.wheelSpeed * maxY / contentHeight;
				};
				
				var onStartDrag = function(event)
				{
					initDrag();
					dragMiddle = getPos(event, 'Y') - dragPosition - currentOffset.top;
					$('html').bind('mouseup', onStopDrag).bind('mousemove', updateScroll).bind('mouseleave', onStopDrag)
					if ($.browser.msie) {
						$('html').bind('dragstart', ignoreNativeDrag).bind('selectstart', ignoreNativeDrag);
					}
					return false;
				};
				var onStopDrag = function()
				{
					$('html').unbind('mouseup', onStopDrag).unbind('mousemove', updateScroll);
					dragMiddle = percentInView*paneHeight/2;
					if ($.browser.msie) {
						$('html').unbind('dragstart', ignoreNativeDrag).unbind('selectstart', ignoreNativeDrag);
					}
				};
				var positionDrag = function(destY)
				{
					$container.scrollTop(0);
					destY = destY < 0 ? 0 : (destY > maxY ? maxY : destY);
					dragPosition = destY;
					$drag.css({'top':destY+'px'});
					var p = destY / maxY;
					$this.data('jScrollPanePosition', (paneHeight-contentHeight)*-p);
					$pane.css({'top':((paneHeight-contentHeight)*p) + 'px'});
					$this.trigger('scroll');
					if (settings.showArrows) {
						$upArrow[destY == 0 ? 'addClass' : 'removeClass']('disabled');
						$downArrow[destY == maxY ? 'addClass' : 'removeClass']('disabled');
					}
				};
				var updateScroll = function(e)
				{
					positionDrag(getPos(e, 'Y') - currentOffset.top - dragMiddle);
				};
				
				var dragH = Math.max(Math.min(percentInView*(paneHeight-settings.arrowSize*2), settings.dragMaxHeight), settings.dragMinHeight);
				
				$drag.css(
					{'height':dragH+'px'}
				).bind('mousedown', onStartDrag);
				
				var trackScrollInterval;
				var trackScrollInc;
				var trackScrollMousePos;
				var doTrackScroll = function()
				{
					if (trackScrollInc > 8 || trackScrollInc%4==0) {
						positionDrag((dragPosition - ((dragPosition - trackScrollMousePos) / 2)));
					}
					trackScrollInc ++;
				};
				var onStopTrackClick = function()
				{
					clearInterval(trackScrollInterval);
					$('html').unbind('mouseup', onStopTrackClick).unbind('mousemove', onTrackMouseMove);
				};
				var onTrackMouseMove = function(event)
				{
					trackScrollMousePos = getPos(event, 'Y') - currentOffset.top - dragMiddle;
				};
				var onTrackClick = function(event)
				{
					initDrag();
					onTrackMouseMove(event);
					trackScrollInc = 0;
					$('html').bind('mouseup', onStopTrackClick).bind('mousemove', onTrackMouseMove);
					trackScrollInterval = setInterval(doTrackScroll, 100);
					doTrackScroll();
					return false;
				};
				
				$track.bind('mousedown', onTrackClick);
				
				$container.bind(
					'mousewheel',
					function (event, delta) {
						delta = delta || (event.wheelDelta ? event.wheelDelta / 120 : (event.detail) ?
-event.detail/3 : 0);
						initDrag();
						ceaseAnimation();
						var d = dragPosition;
						positionDrag(dragPosition - delta * mouseWheelMultiplier);
						var dragOccured = d != dragPosition;
						return !dragOccured;
					}
				);

				var _animateToPosition;
				var _animateToInterval;
				function animateToPosition()
				{
					var diff = (_animateToPosition - dragPosition) / settings.animateStep;
					if (diff > 1 || diff < -1) {
						positionDrag(dragPosition + diff);
					} else {
						positionDrag(_animateToPosition);
						ceaseAnimation();
					}
				}
				var ceaseAnimation = function()
				{
					if (_animateToInterval) {
						clearInterval(_animateToInterval);
						delete _animateToPosition;
					}
				};
				var scrollTo = function(pos, preventAni)
				{
					if (typeof pos == "string") {
						// Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
						// errors from the lookup...
						try {
							$e = $(pos, $this);
						} catch (err) {
							return;
						}
						if (!$e.length) return;
						pos = $e.offset().top - $this.offset().top;
					}
					ceaseAnimation();
					var maxScroll = contentHeight - paneHeight;
					pos = pos > maxScroll ? maxScroll : pos;
					$this.data('jScrollPaneMaxScroll', maxScroll);
					var destDragPosition = pos/maxScroll * maxY;
					if (preventAni || !settings.animateTo) {
						positionDrag(destDragPosition);
					} else {
						$container.scrollTop(0);
						_animateToPosition = destDragPosition;
						_animateToInterval = setInterval(animateToPosition, settings.animateInterval);
					}
				};
				$this[0].scrollTo = scrollTo;
				
				$this[0].scrollBy = function(delta)
				{
					var currentPos = -parseInt($pane.css('top')) || 0;
					scrollTo(currentPos + delta);
				};
				
				initDrag();
				
				scrollTo(-currentScrollPosition, true);
			
				// Deal with it when the user tabs to a link or form element within this scrollpane
				$('*', this).bind(
					'focus',
					function(event)
					{
						var $e = $(this);
						
						// loop through parents adding the offset top of any elements that are relatively positioned between
						// the focused element and the jScrollPaneContainer so we can get the true distance from the top
						// of the focused element to the top of the scrollpane...
						var eleTop = 0;
						
						var preventInfiniteLoop = 100;
						
						while ($e[0] != $this[0]) {
							eleTop += $e.position().top;
							$e = $e.offsetParent();
							if (!preventInfiniteLoop--) {
								return;
							}
						}
						
						var viewportTop = -parseInt($pane.css('top')) || 0;
						var maxVisibleEleTop = viewportTop + paneHeight;
						var eleInView = eleTop > viewportTop && eleTop < maxVisibleEleTop;
						if (!eleInView) {
							var destPos = eleTop - settings.scrollbarMargin;
							if (eleTop > viewportTop) { // element is below viewport - scroll so it is at bottom.
								destPos += $(this).height() + 15 + settings.scrollbarMargin - paneHeight;
							}
							scrollTo(destPos);
						}
					}
				)
				
				
				if (settings.observeHash) {
					if (location.hash && location.hash.length > 1) {
						setTimeout(function(){
							scrollTo(location.hash);
						}, $.browser.safari ? 100 : 0);
					}
					
					// use event delegation to listen for all clicks on links and hijack them if they are links to
					// anchors within our content...
					$(document).bind('click', function(e){
						$target = $(e.target);
						if ($target.is('a')) {
							var h = $target.attr('href');
							if (h && h.substr(0, 1) == '#' && h.length > 1) {
								setTimeout(function(){
									scrollTo(h, !settings.animateToInternalLinks);
								}, $.browser.safari ? 100 : 0);
							}
						}
					});
				}
				
				// Deal with dragging and selecting text to make the scrollpane scroll...
				function onSelectScrollMouseDown(e)
				{
				   $(document).bind('mousemove.jScrollPaneDragging', onTextSelectionScrollMouseMove);
				   $(document).bind('mouseup.jScrollPaneDragging',   onSelectScrollMouseUp);
				  
				}
				
				var textDragDistanceAway;
				var textSelectionInterval;
				
				function onTextSelectionInterval()
				{
					direction = textDragDistanceAway < 0 ? -1 : 1;
					$this[0].scrollBy(textDragDistanceAway / 2);
				}

				function clearTextSelectionInterval()
				{
					if (textSelectionInterval) {
						clearInterval(textSelectionInterval);
						textSelectionInterval = undefined;
					}
				}
				
				function onTextSelectionScrollMouseMove(e)
				{
					var offset = $this.parent().offset().top;
					var maxOffset = offset + paneHeight;
					var mouseOffset = getPos(e, 'Y');
					textDragDistanceAway = mouseOffset < offset ? mouseOffset - offset : (mouseOffset > maxOffset ? mouseOffset - maxOffset : 0);
					if (textDragDistanceAway == 0) {
						clearTextSelectionInterval();
					} else {
						if (!textSelectionInterval) {
							textSelectionInterval  = setInterval(onTextSelectionInterval, 100);
						}
					}
				}

				function onSelectScrollMouseUp(e)
				{
				   $(document)
					  .unbind('mousemove.jScrollPaneDragging')
					  .unbind('mouseup.jScrollPaneDragging');
				   clearTextSelectionInterval();
				}

				$container.bind('mousedown.jScrollPane', onSelectScrollMouseDown);

				
				$.jScrollPane.active.push($this[0]);
				
			} else {
				$this.css(
					{
						'height':paneHeight+'px',
						'width':paneWidth-this.originalSidePaddingTotal+'px',
						'padding':this.originalPadding
					}
				);
				$this[0].scrollTo = $this[0].scrollBy = function() {};
				// clean up listeners
				$this.parent().unbind('mousewheel').unbind('mousedown.jScrollPane').unbind('keydown.jscrollpane').unbind('keyup.jscrollpane');
			}
			
		}
	)
};

$.fn.jScrollPaneRemove = function()
{
	$(this).each(function()
	{
		$this = $(this);
		var $c = $this.parent();
		if ($c.is('.jScrollPaneContainer')) {
			$this.css(
				{
					'top':'',
					'height':'',
					'width':'',
					'padding':'',
					'overflow':'',
					'position':''
				}
			);
			$this.attr('style', $this.data('originalStyleTag'));
			$c.after($this).remove();
		}
	});
}

$.fn.jScrollPane.defaults = {
	scrollbarWidth : 10,
	scrollbarMargin : 5,
	wheelSpeed : 18,
	showArrows : false,
	arrowSize : 0,
	animateTo : false,
	dragMinHeight : 1,
	dragMaxHeight : 99999,
	animateInterval : 100,
	animateStep: 3,
	maintainPosition: true,
	scrollbarOnLeft: false,
	reinitialiseOnImageLoad: false,
	tabIndex : 0,
	enableKeyboardNavigation: true,
	animateToInternalLinks: false,
	topCapHeight: 0,
	bottomCapHeight: 0,
	observeHash: true
};

// clean up the scrollTo expandos
$(window)
	.bind('unload', function() {
		var els = $.jScrollPane.active; 
		for (var i=0; i<els.length; i++) {
			els[i].scrollTo = els[i].scrollBy = null;
		}
	}
);

})(jQuery);




/*
 * jQuery validation plug-in 1.5.2
 *
 * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
 * http://docs.jquery.com/Plugins/Validation
 *
 * Copyright (c) 2006 - 2008 JÃ¶rn Zaefferer
 *
 * $Id: jquery.validate.js 6243 2009-02-19 11:40:49Z joern.zaefferer $
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(7($){$.H($.2M,{1E:7(c){l(!6.F){c&&c.2j&&2X.1y&&1y.4Z("3p 2C, 4B\'t 1E, 6d 3p");8}p b=$.15(6[0],\'v\');l(b){8 b}b=29 $.v(c,6[0]);$.15(6[0],\'v\',b);l(b.q.3v){6.4J("21, 4E").1q(".4x").4t(7(){b.37=w});6.32(7(a){l(b.q.2j)a.5Y();7 28(){l(b.q.3Y){b.q.3Y.Z(b,b.Y);8 I}8 w}l(b.37){b.37=I;8 28()}l(b.J()){l(b.18){b.1u=w;8 I}8 28()}19{b.2k();8 I}})}8 b},N:7(){l($(6[0]).2L(\'J\')){8 6.1E().J()}19{p b=I;p a=$(6[0].J).1E();6.P(7(){b|=a.M(6)});8 b}},4L:7(c){p d={},$M=6;$.P(c.1I(/\\s/),7(a,b){d[b]=$M.1H(b);$M.4H(b)});8 d},1c:7(h,k){p f=6[0];l(h){p i=$.15(f.J,\'v\').q;p d=i.1c;p c=$.v.2u(f);2r(h){1e"1h":$.H(c,$.v.1S(k));d[f.u]=c;l(k.L)i.L[f.u]=$.H(i.L[f.u],k.L);33;1e"63":l(!k){R d[f.u];8 c}p e={};$.P(k.1I(/\\s/),7(a,b){e[b]=c[b];R c[b]});8 e}}p g=$.v.4a($.H({},$.v.47(f),$.v.43(f),$.v.3Z(f),$.v.2u(f)),f);l(g.13){p j=g.13;R g.13;g=$.H({13:j},g)}8 g}});$.H($.5C[":"],{5z:7(a){8!$.1k(a.U)},5q:7(a){8!!$.1k(a.U)},5o:7(a){8!a.3O}});$.1d=7(c,b){l(S.F==1)8 7(){p a=$.3J(S);a.5c(c);8 $.1d.1G(6,a)};l(S.F>2&&b.2l!=3C){b=$.3J(S).4V(1)}l(b.2l!=3C){b=[b]}$.P(b,7(i,n){c=c.2K(29 3A("\\\\{"+i+"\\\\}","g"),n)});8 c};$.v=7(b,a){6.q=$.H({},$.v.2J,b);6.Y=a;6.3x()};$.H($.v,{2J:{L:{},22:{},1c:{},1a:"3s",2H:"4K",2k:w,3n:$([]),2E:$([]),3v:w,3m:[],3l:I,4I:7(a){6.3k=a;l(6.q.4G&&!6.4F){6.q.1O&&6.q.1O.Z(6,a,6.q.1a);6.1P(a).2y()}},4D:7(a){l(!6.1w(a)&&(a.u 11 6.1l||!6.G(a))){6.M(a)}},4w:7(a){l(a.u 11 6.1l||a==6.3b){6.M(a)}},4u:7(a){l(a.u 11 6.1l)6.M(a)},2s:7(a,b){$(a).2q(b)},1O:7(a,b){$(a).39(b)}},6k:7(a){$.H($.v.2J,a)},L:{13:"6h 4p 2L 13.",1T:"K 35 6 4p.",1U:"K O a N 1U 6b.",1x:"K O a N 65.",1n:"K O a N 1n.",1X:"K O a N 1n (62).",1Y:"4e 4c 4b 30 5W¼5U 5S 30.",1A:"K O a N 1A.",27:"4e 4c 4b 5Q 5O 30.",1N:"K O 5L 1N",2g:"K O a N 5I 5G 1A.",3W:"K O 3V 5A U 5y.",3T:"K O a U 5u a N 5t.",16:$.1d("K O 3Q 5p 2R {0} 2Q."),1v:$.1d("K O 5n 5m {0} 2Q."),2d:$.1d("K O a U 3L {0} 40 {1} 2Q 5i."),2a:$.1d("K O a U 3L {0} 40 {1}."),1t:$.1d("K O a U 5d 2R 3I 3H 48 {0}."),1B:$.1d("K O a U 56 2R 3I 3H 48 {0}.")},3G:I,53:{3x:7(){6.2h=$(6.q.2E);6.4i=6.2h.F&&6.2h||$(6.Y);6.2p=$(6.q.3n).1h(6.q.2E);6.1l={};6.4X={};6.18=0;6.1g={};6.1b={};6.1V();p f=(6.22={});$.P(6.q.22,7(d,c){$.P(c.1I(/\\s/),7(a,b){f[b]=d})});p e=6.q.1c;$.P(e,7(b,a){e[b]=$.v.1S(a)});7 1D(a){p b=$.15(6[0].J,"v");b.q["3B"+a.1p]&&b.q["3B"+a.1p].Z(b,6[0])}$(6.Y).1D("3z 3y 4P",":2I, :4O, :4N, 23, 4M",1D).1D("4t",":3u, :3t",1D);l(6.q.3r)$(6.Y).3q("1b-J.1E",6.q.3r)},J:7(){6.3o();$.H(6.1l,6.1r);6.1b=$.H({},6.1r);l(!6.N())$(6.Y).2G("1b-J",[6]);6.1j();8 6.N()},3o:7(){6.2F();Q(p i=0,14=(6.24=6.14());14[i];i++){6.26(14[i])}8 6.N()},M:7(a){a=6.2D(a);6.3b=a;6.3a(a);6.24=$(a);p b=6.26(a);l(b){R 6.1b[a.u]}19{6.1b[a.u]=w}l(!6.3F()){6.12=6.12.1h(6.2p)}6.1j();8 b},1j:7(b){l(b){$.H(6.1r,b);6.T=[];Q(p c 11 b){6.T.20({1f:b[c],M:6.1Z(c)[0]})}6.1m=$.3j(6.1m,7(a){8!(a.u 11 b)})}6.q.1j?6.q.1j.Z(6,6.1r,6.T):6.3i()},2B:7(){l($.2M.2B)$(6.Y).2B();6.1l={};6.2F();6.2A();6.14().39(6.q.1a)},3F:7(){8 6.2e(6.1b)},2e:7(a){p b=0;Q(p i 11 a)b++;8 b},2A:7(){6.2z(6.12).2y()},N:7(){8 6.3h()==0},3h:7(){8 6.T.F},2k:7(){l(6.q.2k){3g{$(6.3f()||6.T.F&&6.T[0].M||[]).1q(":4C").3e()}3d(e){}}},3f:7(){p a=6.3k;8 a&&$.3j(6.T,7(n){8 n.M.u==a.u}).F==1&&a},14:7(){p a=6,2x={};8 $([]).1h(6.Y.14).1q(":21").1F(":32, :1V, :4A, [4z]").1F(6.q.3m).1q(7(){!6.u&&a.q.2j&&2X.1y&&1y.3s("%o 4y 3Q u 4v",6);l(6.u 11 2x||!a.2e($(6).1c()))8 I;2x[6.u]=w;8 w})},2D:7(a){8 $(a)[0]},2v:7(){8 $(6.q.2H+"."+6.q.1a,6.4i)},1V:7(){6.1m=[];6.T=[];6.1r={};6.1i=$([]);6.12=$([]);6.1u=I;6.24=$([])},2F:7(){6.1V();6.12=6.2v().1h(6.2p)},3a:7(a){6.1V();6.12=6.1P(a)},26:7(d){d=6.2D(d);l(6.1w(d)){d=6.1Z(d.u)[0]}p a=$(d).1c();p c=I;Q(V 11 a){p b={V:V,2t:a[V]};3g{p f=$.v.1Q[V].Z(6,d.U.2K(/\\r/g,""),d,b.2t);l(f=="1R-1W"){c=w;6m}c=I;l(f=="1g"){6.12=6.12.1F(6.1P(d));8}l(!f){6.4s(d,b);8 I}}3d(e){6.q.2j&&2X.1y&&1y.6l("6j 6i 6g 6f M "+d.4q+", 26 3V \'"+b.V+"\' V");6e e;}}l(c)8;l(6.2e(a))6.1m.20(d);8 w},4o:7(a,b){l(!$.1C)8;p c=6.q.36?$(a).1C()[6.q.36]:$(a).1C();8 c&&c.L&&c.L[b]},4n:7(a,b){p m=6.q.L[a];8 m&&(m.2l==4m?m:m[b])},4l:7(){Q(p i=0;i<S.F;i++){l(S[i]!==2o)8 S[i]}8 2o},2n:7(a,b){8 6.4l(6.4n(a.u,b),6.4o(a,b),!6.q.3l&&a.6c||2o,$.v.L[b],"<4k>69: 68 1f 67 Q "+a.u+"</4k>")},4s:7(b,a){p c=6.2n(b,a.V);l(17 c=="7")c=c.Z(6,a.2t,b);6.T.20({1f:c,M:b});6.1r[b.u]=c;6.1l[b.u]=c},2z:7(a){l(6.q.2m)a=a.1h(a.64(6.q.2m));8 a},3i:7(){Q(p i=0;6.T[i];i++){p a=6.T[i];6.q.2s&&6.q.2s.Z(6,a.M,6.q.1a);6.2w(a.M,a.1f)}l(6.T.F){6.1i=6.1i.1h(6.2p)}l(6.q.1o){Q(p i=0;6.1m[i];i++){6.2w(6.1m[i])}}l(6.q.1O){Q(p i=0,14=6.4j();14[i];i++){6.q.1O.Z(6,14[i],6.q.1a)}}6.12=6.12.1F(6.1i);6.2A();6.2z(6.1i).4h()},4j:7(){8 6.24.1F(6.3c())},3c:7(){8 $(6.T).4g(7(){8 6.M})},2w:7(a,c){p b=6.1P(a);l(b.F){b.39().2q(6.q.1a);b.1H("4f")&&b.4d(c)}19{b=$("<"+6.q.2H+"/>").1H({"Q":6.31(a),4f:w}).2q(6.q.1a).4d(c||"");l(6.q.2m){b=b.2y().4h().61("<"+6.q.2m+"/>").60()}l(!6.2h.5Z(b).F)6.q.3w?6.q.3w(b,$(a)):b.5X(a)}l(!c&&6.q.1o){b.2I("");17 6.q.1o=="1s"?b.2q(6.q.1o):6.q.1o(b)}6.1i=6.1i.1h(b)},1P:7(a){8 6.2v().1q("[Q=\'"+6.31(a)+"\']")},31:7(a){8 6.22[a.u]||(6.1w(a)?a.u:a.4q||a.u)},1w:7(a){8/3u|3t/i.X(a.1p)},1Z:7(d){p c=6.Y;8 $(5V.5T(d)).4g(7(a,b){8 b.J==c&&b.u==d&&b||49})},1J:7(a,b){2r(b.3D.46()){1e\'23\':8 $("45:2C",b).F;1e\'21\':l(6.1w(b))8 6.1Z(b.u).1q(\':3O\').F}8 a.F},44:7(b,a){8 6.2O[17 b]?6.2O[17 b](b,a):w},2O:{"5P":7(b,a){8 b},"1s":7(b,a){8!!$(b,a.J).F},"7":7(b,a){8 b(a)}},G:7(a){8!$.v.1Q.13.Z(6,$.1k(a.U),a)&&"1R-1W"},42:7(a){l(!6.1g[a.u]){6.18++;6.1g[a.u]=w}},41:7(a,b){6.18--;l(6.18<0)6.18=0;R 6.1g[a.u];l(b&&6.18==0&&6.1u&&6.J()){$(6.Y).32()}19 l(!b&&6.18==0&&6.1u){$(6.Y).2G("1b-J",[6])}},2c:7(a){8 $.15(a,"2c")||$.15(a,"2c",5M={2Z:49,N:w,1f:6.2n(a,"1T")})}},1K:{13:{13:w},1U:{1U:w},1x:{1x:w},1n:{1n:w},1X:{1X:w},1Y:{1Y:w},1A:{1A:w},27:{27:w},1N:{1N:w},2g:{2g:w}},3E:7(a,b){a.2l==4m?6.1K[a]=b:$.H(6.1K,a)},43:7(b){p a={};p c=$(b).1H(\'5K\');c&&$.P(c.1I(\' \'),7(){l(6 11 $.v.1K){$.H(a,$.v.1K[6])}});8 a},3Z:7(c){p a={};p d=$(c);Q(V 11 $.v.1Q){p b=d.1H(V);l(b){a[V]=b}}l(a.16&&/-1|5J|5H/.X(a.16)){R a.16}8 a},47:7(a){l(!$.1C)8{};p b=$.15(a.J,\'v\').q.36;8 b?$(a).1C()[b]:$(a).1C()},2u:7(b){p a={};p c=$.15(b.J,\'v\');l(c.q.1c){a=$.v.1S(c.q.1c[b.u])||{}}8 a},4a:7(d,e){$.P(d,7(c,b){l(b===I){R d[c];8}l(b.2Y||b.2f){p a=w;2r(17 b.2f){1e"1s":a=!!$(b.2f,e.J).F;33;1e"7":a=b.2f.Z(e,e);33}l(a){d[c]=b.2Y!==2o?b.2Y:w}19{R d[c]}}});$.P(d,7(a,b){d[a]=$.5E(b)?b(e):b});$.P([\'1v\',\'16\',\'1B\',\'1t\'],7(){l(d[6]){d[6]=2W(d[6])}});$.P([\'2d\',\'2a\'],7(){l(d[6]){d[6]=[2W(d[6][0]),2W(d[6][1])]}});l($.v.3G){l(d.1B&&d.1t){d.2a=[d.1B,d.1t];R d.1B;R d.1t}l(d.1v&&d.16){d.2d=[d.1v,d.16];R d.1v;R d.16}}l(d.L){R d.L}8 d},1S:7(a){l(17 a=="1s"){p b={};$.P(a.1I(/\\s/),7(){b[6]=w});a=b}8 a},5D:7(c,a,b){$.v.1Q[c]=a;$.v.L[c]=b;l(a.F<3){$.v.3E(c,$.v.1S(c))}},1Q:{13:7(b,c,a){l(!6.44(a,c))8"1R-1W";2r(c.3D.46()){1e\'23\':p d=$("45:2C",c);8 d.F>0&&(c.1p=="23-5B"||($.2V.2P&&!(d[0].5x[\'U\'].5w)?d[0].2I:d[0].U).F>0);1e\'21\':l(6.1w(c))8 6.1J(b,c)>0;5v:8 $.1k(b).F>0}},1T:7(e,h,d){l(6.G(h))8"1R-1W";p g=6.2c(h);l(!6.q.L[h.u])6.q.L[h.u]={};6.q.L[h.u].1T=17 g.1f=="7"?g.1f(e):g.1f;d=17 d=="1s"&&{1x:d}||d;l(g.2Z!==e){g.2Z=e;p i=6;6.42(h);p f={};f[h.u]=e;$.2T($.H(w,{1x:d,3S:"2S",3R:"1E"+h.u,5s:"5r",15:f,1o:7(a){l(a){p b=i.1u;i.3a(h);i.1u=b;i.1m.20(h);i.1j()}19{p c={};c[h.u]=a||i.2n(h,"1T");i.1j(c)}g.N=a;i.41(h,a)}},d));8"1g"}19 l(6.1g[h.u]){8"1g"}8 g.N},1v:7(b,c,a){8 6.G(c)||6.1J($.1k(b),c)>=a},16:7(b,c,a){8 6.G(c)||6.1J($.1k(b),c)<=a},2d:7(b,d,a){p c=6.1J($.1k(b),d);8 6.G(d)||(c>=a[0]&&c<=a[1])},1B:7(b,c,a){8 6.G(c)||b>=a},1t:7(b,c,a){8 6.G(c)||b<=a},2a:7(b,c,a){8 6.G(c)||(b>=a[0]&&b<=a[1])},1U:7(a,b){8 6.G(b)||/^((([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^W`{\\|}~]|[\\C-\\A\\B-\\E\\x-\\y])+(\\.([a-z]|\\d|[!#\\$%&\'\\*\\+\\-\\/=\\?\\^W`{\\|}~]|[\\C-\\A\\B-\\E\\x-\\y])+)*)|((\\3P)((((\\2b|\\1M)*(\\2U\\3U))?(\\2b|\\1M)+)?(([\\3X-\\5F\\3N\\3M\\5l-\\5k\\3K]|\\5j|[\\5h-\\5N]|[\\5g-\\5f]|[\\C-\\A\\B-\\E\\x-\\y])|(\\\\([\\3X-\\1M\\3N\\3M\\2U-\\3K]|[\\C-\\A\\B-\\E\\x-\\y]))))*(((\\2b|\\1M)*(\\2U\\3U))?(\\2b|\\1M)+)?(\\3P)))@((([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])))\\.)+(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|[\\C-\\A\\B-\\E\\x-\\y])))\\.?$/i.X(a)},1x:7(a,b){8 6.G(b)||/^(5e?|5R):\\/\\/(((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-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|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|\\d|[\\C-\\A\\B-\\E\\x-\\y])))\\.)+(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])|(([a-z]|[\\C-\\A\\B-\\E\\x-\\y])([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])*([a-z]|[\\C-\\A\\B-\\E\\x-\\y])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|[\\5b-\\5a]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|W|~|[\\C-\\A\\B-\\E\\x-\\y])|(%[\\1L-f]{2})|[!\\$&\'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.X(a)},1n:7(a,b){8 6.G(b)||!/59|58/.X(29 57(a))},1X:7(a,b){8 6.G(b)||/^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.X(a)},1Y:7(a,b){8 6.G(b)||/^\\d\\d?\\.\\d\\d?\\.\\d\\d\\d?\\d?$/.X(a)},1A:7(a,b){8 6.G(b)||/^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$/.X(a)},27:7(a,b){8 6.G(b)||/^-?(?:\\d+|\\d{1,3}(?:\\.\\d{3})+)(?:,\\d+)?$/.X(a)},1N:7(a,b){8 6.G(b)||/^\\d+$/.X(a)},2g:7(b,e){l(6.G(e))8"1R-1W";l(/[^0-9-]+/.X(b))8 I;p a=0,d=0,2i=I;b=b.2K(/\\D/g,"");Q(n=b.F-1;n>=0;n--){p c=b.55(n);p d=54(c,10);l(2i){l((d*=2)>9)d-=9}a+=d;2i=!2i}8(a%10)==0},3T:7(b,c,a){a=17 a=="1s"?a:"66|52?g|51";8 6.G(c)||b.50(29 3A(".("+a+")$","i"))},3W:7(b,c,a){8 b==$(a).6a()}}})})(2N);(7($){p c=$.2T;p d={};$.2T=7(a){a=$.H(a,$.H({},$.4Y,a));p b=a.3R;l(a.3S=="2S"){l(d[b]){d[b].2S()}8(d[b]=c.1G(6,S))}8 c.1G(6,S)}})(2N);(7($){$.P({3e:\'3z\',4W:\'3y\'},7(b,a){$.1z.34[a]={4U:7(){l($.2V.2P)8 I;6.4T(b,$.1z.34[a].38,w)},4S:7(){l($.2V.2P)8 I;6.4R(b,$.1z.34[a].38,w)},38:7(e){S[0]=$.1z.35(e);S[0].1p=a;8 $.1z.28.1G(6,S)}}});$.H($.2M,{1D:7(d,e,c){8 6.3q(d,7(a){p b=$(a.4r);l(b.2L(e)){8 c.1G(b,S)}})},4Q:7(a,b){8 6.2G(a,[$.1z.35({1p:a,4r:b})])}})})(2N);',62,395,'||||||this|function|return|||||||||||||if||||var|settings||||name|validator|true|uFDF0|uFFEF||uD7FF|uF900|u00A0||uFDCF|length|optional|extend|false|form|Please|messages|element|valid|enter|each|for|delete|arguments|errorList|value|method|_|test|currentForm|call||in|toHide|required|elements|data|maxlength|typeof|pendingRequest|else|errorClass|invalid|rules|format|case|message|pending|add|toShow|showErrors|trim|submitted|successList|date|success|type|filter|errorMap|string|max|formSubmitted|minlength|checkable|url|console|event|number|min|metadata|delegate|validate|not|apply|attr|split|getLength|classRuleSettings|da|x09|digits|unhighlight|errorsFor|methods|dependency|normalizeRule|remote|email|reset|mismatch|dateISO|dateDE|findByName|push|input|groups|select|currentElements||check|numberDE|handle|new|range|x20|previousValue|rangelength|objectLength|depends|creditcard|labelContainer|bEven|debug|focusInvalid|constructor|wrapper|defaultMessage|undefined|containers|addClass|switch|highlight|parameters|staticRules|errors|showLabel|rulesCache|hide|addWrapper|hideErrors|resetForm|selected|clean|errorLabelContainer|prepareForm|triggerHandler|errorElement|text|defaults|replace|is|fn|jQuery|dependTypes|msie|characters|than|abort|ajax|x0d|browser|Number|window|param|old|ein|idOrName|submit|break|special|fix|meta|cancelSubmit|handler|removeClass|prepareElement|lastElement|invalidElements|catch|focus|findLastActive|try|size|defaultShowErrors|grep|lastActive|ignoreTitle|ignore|errorContainer|checkForm|nothing|bind|invalidHandler|error|checkbox|radio|onsubmit|errorPlacement|init|focusout|focusin|RegExp|on|Array|nodeName|addClassRules|numberOfInvalids|autoCreateRanges|equal|or|makeArray|x7f|between|x0c|x0b|checked|x22|no|port|mode|accept|x0a|the|equalTo|x01|submitHandler|attributeRules|and|stopRequest|startRequest|classRules|depend|option|toLowerCase|metadataRules|to|null|normalizeRules|Sie|geben|html|Bitte|generated|map|show|errorContext|validElements|strong|findDefined|String|customMessage|customMetaMessage|field|id|target|formatAndAdd|click|onclick|assigned|onkeyup|cancel|has|disabled|image|can|visible|onfocusout|button|blockFocusCleanup|focusCleanup|removeAttr|onfocusin|find|label|removeAttrs|textarea|file|password|keyup|triggerEvent|removeEventListener|teardown|addEventListener|setup|slice|blur|valueCache|ajaxSettings|warn|match|gif|jpe|prototype|parseInt|charAt|greater|Date|NaN|Invalid|uF8FF|uE000|unshift|less|https|x7e|x5d|x23|long|x21|x1f|x0e|least|at|unchecked|more|filled|json|dataType|extension|with|default|specified|attributes|again|blank|same|multiple|expr|addMethod|isFunction|x08|card|524288|credit|2147483647|class|only|previous|x5b|Nummer|boolean|eine|ftp|Datum|getElementsByName|ltiges|document|gÃ|insertAfter|preventDefault|append|parent|wrap|ISO|remove|parents|URL|png|defined|No|Warning|val|address|title|returning|throw|checking|when|This|occured|exception|setDefaults|log|continue'.split('|'),0,{}))
