//-- Uniplayer packed file consists of these files:
//-- uniplayer languages
//-- uniplayer core
//-- uniplayer mimes
//-- module html5
//-- module flash
//-- module windowsmedia
//-- module vlc
/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

UniplayerLanguages = {
	'en': {
		controlsPrevious: 'Previous',
		controlsPlay: 'Play',
		controlsPause: 'Pause',
		controlsStop: 'Stop',
		controlsNext: 'Next',
		controlsMute: 'Mute',
		controlsVolume: 'Volume',
		controlsTime: 'Time',
		controlsPosition: 'Position',
		controlsFullScreen: 'FullScreen',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'About'
	},
	'uk': {
		controlsPrevious: 'Попереднiй',
		controlsPlay: 'Грати',
		controlsPause: 'Пауза',
		controlsStop: 'Стоп',
		controlsNext: 'Наступний',
		controlsMute: 'Приглушити',
		controlsVolume: 'Гучнiсть',
		controlsTime: 'Час',
		controlsPosition: 'Позицiя',
		controlsFullScreen: 'На весь екран',
		controlsPlaylist: 'Плейлист',
		controlsMenu: 'Меню',
		about: 'Про'
	},
	'ru': {
		controlsPrevious: 'Предыдущий',
		controlsPlay: 'Воспроизведение',
		controlsPause: 'Пауза',
		controlsStop: 'Стоп',
		controlsNext: 'Следующий',
		controlsMute: 'Выключить звук',
		controlsVolume: 'Громкость',
		controlsTime: 'Время',
		controlsPosition: 'Позиция',
		controlsFullScreen: 'На весь экран',
		controlsPlaylist: 'Список',
		controlsMenu: 'Меню',
		about: 'О программе'
	},
	'fr': {
		controlsPrevious: 'Précédent',
		controlsPlay: 'Jouer',
		controlsPause: 'Pause',
		controlsStop: 'Stop',
		controlsNext: 'Prochain',
		controlsMute: 'Muet',
		controlsVolume: 'Volume',
		controlsTime: 'Temps',
		controlsPosition: 'Position',
		controlsFullScreen: 'Plein écran',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'Sur'
	},
	'it': {
		controlsPrevious: 'Precedente',
		controlsPlay: 'Giocare',
		controlsPause: 'Pausa',
		controlsStop: 'Fermare',
		controlsNext: 'Successivo',
		controlsMute: 'Mute',
		controlsVolume: 'Volume',
		controlsTime: 'Tempo',
		controlsPosition: 'Posizione',
		controlsFullScreen: 'FullScreen',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'Circa'
	},
	'de': {
		controlsPrevious: 'Zurück',
		controlsPlay: 'Spielen',
		controlsPause: 'Pause',
		controlsStop: 'Stopp',
		controlsNext: 'Nächster',
		controlsMute: 'Mute',
		controlsVolume: 'Band',
		controlsTime: 'Zeit',
		controlsPosition: 'Position',
		controlsFullScreen: 'FullScreen',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menü',
		about: 'Über'
	},
	'ja': {
		controlsPrevious: '前',
		controlsPlay: '遊び',
		controlsPause: '一時停止',
		controlsStop: '停止',
		controlsNext: '次の',
		controlsMute: 'ミュート',
		controlsVolume: 'ボリューム',
		controlsTime: '時間',
		controlsPosition: '位置',
		controlsFullScreen: 'フルスクリーン',
		controlsPlaylist: 'プレイリスト',
		controlsMenu: 'メニュー',
		about: '約'
	},
	'tr': {
		controlsPrevious: 'Önceki',
		controlsPlay: 'Oyun',
		controlsPause: 'Durma',
		controlsStop: 'Dur',
		controlsNext: 'Sonraki',
		controlsMute: 'Sessiz',
		controlsVolume: 'Hacim',
		controlsTime: 'Zaman',
		controlsPosition: 'Pozisyon',
		controlsFullScreen: 'Tam Ekran',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menü',
		about: 'Hakkında'
	},
	'zh': {
		controlsPrevious: '以前',
		controlsPlay: '玩',
		controlsPause: '暂停',
		controlsStop: '停止',
		controlsNext: '未来',
		controlsMute: '哑',
		controlsVolume: '体积',
		controlsTime: '时间',
		controlsPosition: '位置',
		controlsFullScreen: '全屏',
		controlsPlaylist: '播放列表',
		controlsMenu: '菜单',
		about: '关于'
	},
	'nl': {
		controlsPrevious: 'Vorig',
		controlsPlay: 'Spelen',
		controlsPause: 'Pauzeren',
		controlsStop: 'Stop',
		controlsNext: 'Volgende',
		controlsMute: 'Dempen',
		controlsVolume: 'Volume',
		controlsTime: 'Tijd',
		controlsPosition: 'Positie',
		controlsFullScreen: 'FullScreen',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'Over'
	},
	'fi': {
		controlsPrevious: 'Edellinen',
		controlsPlay: 'Pelata',
		controlsPause: 'Pause',
		controlsStop: 'Tauko',
		controlsNext: 'Ensi',
		controlsMute: 'Mykkä',
		controlsVolume: 'Määrä',
		controlsTime: 'Aika',
		controlsPosition: 'Sijainti',
		controlsFullScreen: 'Koko näyttö',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'Noin'
	},
	'da': {
		controlsPrevious: 'Previous',
		controlsPlay: 'Spil',
		controlsPause: 'Pause',
		controlsStop: 'Stands',
		controlsNext: 'Næste',
		controlsMute: 'Mute',
		controlsVolume: 'Bind',
		controlsTime: 'Time',
		controlsPosition: 'Position',
		controlsFullScreen: 'Fuldskærm',
		controlsPlaylist: 'Playlist',
		controlsMenu: 'Menu',
		about: 'Om'
	},
	'el': {
		controlsPrevious: 'Προηγούμενο',
		controlsPlay: 'Παιχνίδι',
		controlsPause: 'Παύση',
		controlsStop: 'σταμάτημα',
		controlsNext: 'Επόμενο',
		controlsMute: 'Σίγαση',
		controlsVolume: 'Όγκος',
		controlsTime: 'Χρόνος',
		controlsPosition: 'Θέση',
		controlsFullScreen: 'Πλήρους οθόνη',
		controlsPlaylist: 'Λίστ',
		controlsMenu: 'Μενού',
		about: 'Περίπου'
	},
	'es': {
		controlsPrevious: 'Anterior',
		controlsPlay: 'Jugar',
		controlsPause: 'Pausa',
		controlsStop: 'Alto',
		controlsNext: 'Próximo',
		controlsMute: 'Mudo',
		controlsVolume: 'Volumen',
		controlsTime: 'Tiempo',
		controlsPosition: 'Posición',
		controlsFullScreen: 'Pantalla completa',
		controlsPlaylist: 'Lista de reproducción',
		controlsMenu: 'Menú',
		about: 'Sobre'
	},
	'pl': {
		controlsPrevious: 'Poprzedni',
		controlsPlay: 'Grać',
		controlsPause: 'Pauza',
		controlsStop: 'Stop',
		controlsNext: 'Obok',
		controlsMute: 'Niemy',
		controlsVolume: 'Objętość',
		controlsTime: 'Czas',
		controlsPosition: 'Miejsce',
		controlsFullScreen: 'Pełny ekran',
		controlsPlaylist: 'Listy odtwarzania',
		controlsMenu: 'Menu',
		about: 'O'
	},
	'pt': {
		controlsPrevious: 'Anterior',
		controlsPlay: 'Jogar',
		controlsPause: 'Pausa',
		controlsStop: 'Pare',
		controlsNext: 'Próximo',
		controlsMute: 'Mudo',
		controlsVolume: 'Volume',
		controlsTime: 'Tempo',
		controlsPosition: 'Posição',
		controlsFullScreen: 'FullScreen',
		controlsPlaylist: 'Lista',
		controlsMenu: 'Menu',
		about: 'Sobre'
	}
};


/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

Uniplayer = function(options){
	// options start
	this.options = {
		src: '',							// src file on start
		mimetype: '',						// mime-type for file on start
		volume: .8,							// volume (0-1) on start
		position: 0,						// position (0-1) on start
		id: '',								// id for <object> tag, leave empty to do not add an id attribute at all
		width: 1,							// width of movie
		height: 1,							// height of movie
		autoplay: false,					// auto play movie after load
		autoload: false,					// auto load movie at start
		showControls: true,					// show or not uniplayer controls
		showNativeControls: false,			// show or not current module "native" controls
		clearHolder: false,					// clear ar not holder element before writting player there
		preview: '',						// preview image of start movie, leave empty to show 'supply players' if enabled below
		showSupply: true,					// show or not list of supported players on start
		showSupplyLogos: true,				// show it with logotypes?
		showSupplyLogosSmall: false,		// show logos small
		showSupplyLogosTransparent: false,	// show transparent logos (png images used which incorrect displayed in IE<7)
		updaterInterval: 500,				// interval of plugin status updates in milliseconds
		background: '#EDEDED',				// background of movie
		guiPath: 'gui/default/',			// path to GUI folder (with trailing slash)
		language: 'en',
		hideStartLogo: false,
		autoloadModules: false,
		noCache: false,
		repeat: false,
		flashReloadPage: false,
		showTitleSrc: true,
		onlyAudio: false,
		onlyVideo: false
	};
	var autoloadModules = [
		'UniplayerFlashJWPlayer',
		'UniplayerSilverlight',
		'UniplayerRealPlayer',
		'UniplayerDivX',
		'UniplayerVLC',
		'UniplayerQuickTime',
		'UniplayerWindowsMedia',
		'UniplayerFlashFlowplayer'
	];
	// options end - do not edit below
	if(typeof options == 'object'){
		for(var i in options){
			this.options[i] = options[i];
		}
	}
	// options depencies
	if(this.options.autoplay && !this.options.autoload){
		this.options.autoload = true;
	}
	if(this.options.background){
		if(navigator.userAgent.indexOf('MSIE 6')>=0 || navigator.userAgent.indexOf('MSIE 5')>=0){
			this.options.background = '#EDEDED';
			this.options.showSupplyLogosTransparent = false;
		}
		else if(!this.options.showSupplyLogosTransparent){
			this.options.showSupplyLogosTransparent = true;
		}
	}
	
	// setting up
	this.name = 'Uniplayer';
	this.version = '0.4b';
	this.modules = {};
	this.modulesList = [];
	this.supported = {};
	this.mimeTypeCache = {};
	this.holders = {};
	this.listeners = {};
	this.states = {
		stopped: 0,
		loading: 1,
		playing: 2,
		paused: 3,
		failed: 4
	};
	this.current = {
		src: this.options.src || '',
		mimetype: this.options.mimetype || '',
		state: this.states.stopped,
		mute: false,
		pageScreen: false,
		volume: this.options.volume || 0,
		duration: 0,
		position: this.options.position || 0,
		width: this.options.width || 1,
		height: this.options.height || 1
	};
	this.expectedStop = true;	// flag to know when the stop was initiated by the user or not
	this.expectedPlay = false;	// flag to know that player was playing before the stop
	var previous = {};
	// autoload modules
	if(this.options.autoloadModules){
		for(var i=0; i<autoloadModules.length; i++){
			if(typeof window[autoloadModules[i]] == 'function'){
				this.addModule(new window[autoloadModules[i]]);
			}
		}
	}
	var fireChangeEvent = function(type, value){
		if (!this.listeners[type]) {return;}
		for (var i=0; i<this.listeners[type].length; i++) {
			if (this.listeners[type][i]) {
				try{this.listeners[type][i].call(this, value);}catch(e){}
			}
		}
	};
	var updaterChangeTypes = ['src', 'state', 'mute', 'volume', 'duration', 'position'];
	var updaterFunction = function(){
		if(this.current.module){
			try{this.current.state = this.current.module.getState();}catch(e){}
			try{this.current.mute = this.current.module.getMute();}catch(e){}
			try{this.current.volume = this.current.module.getVolume();}catch(e){}
			try{this.current.duration = this.current.module.getDuration();}catch(e){}
			try{this.current.position = this.current.module.getPosition();}catch(e){}
			for(var i=0; i<updaterChangeTypes.length; i++){
				if(previous[updaterChangeTypes[i]] != this.current[updaterChangeTypes[i]]){
					previous[updaterChangeTypes[i]] = this.current[updaterChangeTypes[i]];
					fireChangeEvent.call(this, updaterChangeTypes[i], this.current[updaterChangeTypes[i]]);
				}
			}
			if(this.current.state == this.states.stopped){
				if(this.expectedStop){
					this.expectedStop = false;
					this.expectedPlay = false;
				}
				else if(this.expectedPlay && this.options.repeat){
					this.stop(null, true);
					this.play();
				}
			}
		}
	};
	this.updater = setInterval((function(self){return function(){updaterFunction.call(self);};})(this), this.options.updaterInterval);
	// controls
	this.addControl('getVersion', function(){
		var module = this.current.module ? this.current.module.title : '';
		if(this.current.module && this.current.module.getVersion){
			if(version = this.current.module.getVersion()){
				module+= ' '+version;
			}
		}
 		return this.name +' '+ this.version + (module ? ' ('+ module +')' : '');
	});
	this.addControl('getState', function(){
		return this.current.state;
	});
	this.addControl('play', function(){
		if(this.current.module.play){
			this.expectedPlay = true;
			if(this.options.noCache){
				var baseSrc = this.current.src;
				var seedIndex = 0;
				if((seedIndex = baseSrc.indexOf('seed=')) > 0){
					baseSrc = baseSrc.substring(0, seedIndex - 1);
				}
				var url = baseSrc + (baseSrc.indexOf('?') >= 0 ? '&' : '?') + 'seed=' + Math.floor(Math.random()*100000000);
				this.current.src = url;
			}
			return this.current.module.play();
		}
	});
	this.addControl('pause', function(){
		if(this.current.module.pause){
			return this.current.module.pause();
		}
	});
	this.addControl('prev', function(){
		fireChangeEvent.call(this, 'prev', true);
	});
	this.addControl('next', function(){
		fireChangeEvent.call(this, 'next', true);
	});
	this.addControl('stop', function(e, unexpected){
		if(this.current.module.stop){
			if(!unexpected){
				this.expectedStop = true;
			}
			return this.current.module.stop();
		}
	});
	this.addControl('fullScreen', function(){
		if(this.current.module.fullScreen){
			return this.current.module.fullScreen();
		}
	});
	this.addControl('mute', function(){
		if(this.current.module.setMute && this.current.module.getMute){
			var turn = !this.current.module.getMute();
			this.current.module.setMute(turn);
			return turn;
		}
	});
	this.addControl('volume', function(volume){
		if(typeof(volume) != 'undefined' && this.current.module.setVolume){	
			this.current.module.setVolume(parseFloat(volume));
		}
		return this.current.module.getVolume ? this.current.module.getVolume() : this.current.volume;
	});
	this.addControl('position', function(position){
		if(typeof(position) != 'undefined' && this.current.module.setPosition){
			this.current.module.setPosition(parseFloat(position));
		}
		return this.current.module.getPosition ? this.current.module.getPosition() : this.current.position;
	});
};


UniplayerException = function(e){
	this.error = e || null;
	this.message = this.error ? this.error.message : '';
};


Uniplayer.prototype.addEventListener = function(type, listener){
	if (!this.listeners[type]) {this.listeners[type] = [];}
	this.listeners[type].push(listener);
};


Uniplayer.prototype.removeEventListener = function(type, listener){
	if (!this.listeners[type]) {return;}
	for (var i=0; i<this.listeners[type].length; i++) {
		if (this.listeners[type][i] == listener) {
			delete this.listeners[type][i];
		}
	}
};


Uniplayer.prototype.log = function(e){
	if(typeof(this.options.logger) != 'undefined'){
		if(typeof(this.options.logger) == 'object'){
			this.options.logger.log('Uniplayer: '+e.message);
		}
		else if(this.options.logger === 'alert'){
			alert('Uniplayer Exception\n\n' + e.message);
		}
	}
};


Uniplayer.prototype.setOptions = function(options){
	if(typeof options != 'object'){
		return false;
	}
	for(var i in options){
		this.options[i] = options[i];
	}
	return true;
};


Uniplayer.prototype.getMimeType = function(src){
	try{
		if(!src){
			throw new UniplayerException({message:'No source to get mime type of'});
		}
	}
	catch(e){
		this.log(e);
		return '';
	}
	var mimetype = this.mimeTypeCache[src] || '';
	if(!mimetype){
		var qp = -1;
		if(qp = src.indexOf('?') >= 0){
			src = src.substring(0, qp);
		}
		var ext = UniplayerUtils.getExtension(src);
		if(ext && this.mimes){	// get from file 'uniplayer-mimes.js' if exists
			mimetype = this.mimes[ext];
		}
		if(!mimetype){	// get from server's HTTP header
			mimetype = this.queryMimeType(src);
		}
	}
	this.mimeTypeCache[src] = mimetype;
	return mimetype;
};


Uniplayer.prototype.queryMimeType = function(src){		// works only on same domain due to security reasons
	var jarvey, result = '';
	if(jarvey = new XMLHttpRequest){
		var logindata, user, pass;
		if(logindata = src.substring(src.indexOf('//')+2, src.indexOf('@'))){	// detect user:pass@ in the src
			src = src.replace(logindata+'@', '');
			logindata = logindata.split(':');
			user = logindata[0] || '';
			pass = logindata[1] || '';
		}
		try{
			jarvey.open('HEAD', src, false, user, pass);
			jarvey.send(null);
			if(jarvey.status && jarvey.status.toString().substring(0, 1).valueOf() < 4){
				result = jarvey.getResponseHeader('Content-Type').split(';')[0].replace(/(^\s+)|(\s+$)/g, '');
			}
			else{
				throw new UniplayerException({message:'Seems file is not accessible'});
			}
		}
		catch(e){
			this.log(e);
		}
	}
	return result;
};


Uniplayer.prototype.addModule = function(module){
	try{
		if(typeof(module) != 'object' || !module.name || !(module.supported instanceof Array)){
			throw new UniplayerException({message:'Cannot add an incorrect module'});
		}
		if(this.modules[module.name]){
			throw new UniplayerException({message:'This module already registered'});
		}
	}
	catch(e){
		this.log(e);
		return;
	}
	module.player = this;	// back reference
	this.modules[module.name] = module;
	this.modulesList.push(module.name);
	for(var i=0; i<module.supported.length; i++){
		if (this.options.onlyAudio && module.supported[i].indexOf('audio/') < 0) continue;
		if (this.options.onlyVideo && module.supported[i].indexOf('video/') < 0) continue;
		if(!this.supported[module.supported[i]]){
			this.supported[module.supported[i]] = [];
		}
		this.supported[module.supported[i]].push(module.name);
	}
	module.present = this.pluginExists(module.needle, module.progid, module.classid);
};


Uniplayer.prototype.addModules = function(modules){
	if(!(modules instanceof Array)) return;
	for(var i=0; i<modules.length; i++){
		this.addModule(modules[i]);
	}
};


Uniplayer.prototype.getModule = function(src, mimetype){
	var modulesList = [], moduleName = '';
	try{
		if(!this.modulesList.length){
			throw new UniplayerException({message:'No modules found'});
		}
	}
	catch(e){
		this.log(e);
		return moduleName;
	}
	if(!mimetype){
		mimetype = this.getMimeType(src);
	}
	if(mimetype && this.supported[mimetype]){
		modulesList = this.supported[mimetype];
	}
	//else{
	//	modulesList = this.modulesList;
	//}
	for(var i=0; i<modulesList.length; i++){
		if(this.modules[modulesList[i]].present){
			moduleName = modulesList[i];	// present module found
			break;
		}
	}
	if(!moduleName){
		moduleName = modulesList[0];	// if no present modules found, use first supported module
	}
	return moduleName;
};


Uniplayer.prototype.installModule = function(moduleName){
	if(this.modules[moduleName].pluginspage){
		if (confirm(this.modules[moduleName].title+' plug-in is needed to play this media.\nDo you wish to open the page "'+this.modules[moduleName].pluginspage+'" to perform  manual install of this plug-in?')) {
			// perform manual install
			window.open(this.modules[moduleName].pluginspage);
		}
	}
	else {
		// just notify about missing plugin
		alert(this.modules[moduleName].title+' plug-in is needed to play this media.\nPlease install this module manually and reload this page');
	}
};


Uniplayer.prototype.pluginExists = function(needle, progid, classid){
	if (needle == 'Html5') {
		result = navigator.userAgent.indexOf('MSIE') == -1;
	}
	else {
		if (progid == 'ShockwaveFlash.ShockwaveFlash') {
			var getFlashVersion = function(){
				try {
					try {
						// avoid fp6 minor version lookup issues
						// see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
						var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
						try {
							axo.AllowScriptAccess = 'always';
						}
						catch(e) {
							return '6,0,0';
						}
			    	}
			    	catch(e) {}
					return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
				}
				catch(e) {
					try {
						if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
							return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
						}
					}
					catch(e) {}
				}
				return '0,0,0';
			}
			var majorVersion = getFlashVersion().split(',').shift();
			return (majorVersion >= 9);
		}
		var np, result = false;
		if(typeof(ActiveXObject) == 'function'){
			try{
				var axo = new ActiveXObject(progid);
				result = axo ? true : false;
				delete axo;
			}
			catch(e){}
		}
		else if(np=navigator.plugins){
			var re=new RegExp((needle instanceof Array)?needle.join('.*'):needle, 'i');
			for(var i=0; i<np.length; i++){
				if(re.test(np[i].name) || re.test(np[i].description)){
					result = true;
					break;
				}
			}
		}
	}
	return result;
};


Uniplayer.prototype.write = function(holder, GUI){
	try{
		if(typeof holder == 'string'){
			holder = document.getElementById(holder);
		}
		else if(!holder){
			holder = document.body;
		}
		if(!holder){
			throw new UniplayerException({message:'Cannot write player'});
		}
		if(!GUI && typeof(UniplayerGUIDefault) == 'function'){
			GUI = new UniplayerGUIDefault(this);
		}
		if(!GUI || !GUI.getHTML){
			throw new UniplayerException({message:'No GUI available'});
		}
		if(this.options.clearHolder){
			holder.innerHTML = '';
		}
		this.GUI = GUI;
		holder.innerHTML+= GUI.getHTML();
		this.holders.main = UniplayerUtils.getElementsByClassName('upGUI', 'div', holder)[0];
		this.holders.wrapper = UniplayerUtils.getElementsByClassName('upGUIWrapper', 'div', holder)[0];
		this.holders.movie = UniplayerUtils.getElementsByClassName('upGUIMovie', 'div', holder)[0];
		this.holders.controls = UniplayerUtils.getElementsByClassName('upGUIControls', 'div', holder)[0];
		if(!this.holders.main || !this.holders.wrapper || !this.holders.movie || !this.holders.controls){
			throw new UniplayerException({message:'Cannot write broken GUI'});
		}
	}
	catch(e){
		this.log(e);
		return;
	}
	var self = this;
	// background
	this.holders.movie.style.backgroundColor = this.options.background;
	// autoload / preview / showSupply
	if(this.options.autoload && this.current.src){
		this.load(this.current.src, this.current.mimetype);
	}
	else if(this.options.preview && GUI.getPreview){
		this.holders.movie.innerHTML = GUI.getPreview(this.options.preview);
		this.holders.movie.firstChild.onclick = function() {
			self.play();
		}
	}
	else if(this.options.showSupply && GUI.getSupply){
		this.holders.movie.innerHTML = GUI.getSupply();
	}
	else if(!this.options.hideStartLogo){
		this.holders.movie.innerHTML = GUI.getPreview();
	}
	// sizing
//	this.holders.main.style.width = this.options.width + (this.holders.controls.style.width ? parseInt(this.holders.controls.style.width) : 0) + 'px';
	this.holders.main.style.height = this.options.height + (this.options.showControls ? (this.holders.controls.offsetHeight + 2) : 0) + 'px';		// 2 for border
	if(this.options.showControls){
		// buttons
		// focus/hover emulation
		var buttons = UniplayerUtils.getElementsByClassName('upGUIButton', 'a', holder);
		var buttonFocus = function(){
			this.className += ' hover';
		};
		var buttonBlur = function(){
			this.className = this.className.replace(' hover', '');
		};
		for(var i=0; i<buttons.length; i++){
			buttons[i].onfocus = buttonFocus;
			buttons[i].onblur = buttonBlur;
		}
		var buttonMenu = UniplayerUtils.getElementsByClassName('upGUIButtonMenu', 'a', holder)[0];
		var buttonPrev = UniplayerUtils.getElementsByClassName('upGUIButtonPrev', 'a', holder)[0];
			if(buttonPrev){buttonPrev.onclick = function() {self.prev(); return false;};}
		var buttonPlay = UniplayerUtils.getElementsByClassName('upGUIButtonPlay', 'a', holder)[0];
			if(buttonPlay){buttonPlay.onclick = function() {self.play(); return false;};}
		var buttonPause = UniplayerUtils.getElementsByClassName('upGUIButtonPause', 'a', holder)[0];
			if(buttonPause){buttonPause.onclick = function() {self.pause(); return false;};}
		
		if(buttonMenu || buttonPause){
  		this.addEventListener('state', function(state){
  			switch(state){
  				case self.states.playing:
  					if(buttonMenu){buttonMenu.className = buttonMenu.className.replace(' disabled', '');}
  					if(buttonPause){buttonPause.style.visibility = 'visible';}
  				break;
  				case self.states.loading:
  					if(buttonMenu){buttonMenu.className+= ' disabled';}
  				break;
  				default:
  					if(buttonMenu){buttonMenu.className = buttonMenu.className.replace(' disabled', '');}
  					if(buttonPause && buttonPause.style.visibility == 'visible'){buttonPause.style.visibility = 'hidden';}
  				break;
  			}
  		});
		}
			
		var buttonStop = UniplayerUtils.getElementsByClassName('upGUIButtonStop', 'a', holder)[0];
			if(buttonStop){buttonStop.onclick = function() {self.stop(); return false;};}
		var buttonNext = UniplayerUtils.getElementsByClassName('upGUIButtonNext', 'a', holder)[0];
			if(buttonNext){buttonNext.onclick = function() {self.next(); return false;};}
		var buttonFullScreen = UniplayerUtils.getElementsByClassName('upGUIButtonFullScreen', 'a', holder)[0];
			if(buttonFullScreen){
				buttonFullScreen.onclick = function(){
					if(this.className.indexOf('disabled') < 0){
						self.fullScreen();
					}
					return false;
				}
			}
		// volume
		var volumeSet = UniplayerUtils.getElementsByClassName('upGUIVolume', 'div', holder)[0];
		if(volumeSet){
			var buttonMute = UniplayerUtils.getElementsByClassName('upGUIButtonMute', 'a', volumeSet)[0];
				if(buttonMute){
					buttonMute.onclick = function() {self.mute(); return false;};
					this.addEventListener('mute', function(mute){
						if(mute){
							buttonMute.className+= ' disabled';
						}
						else{
							buttonMute.className = buttonMute.className.replace(' disabled', '');
						}
					});
				}
			var volumeSlider = UniplayerUtils.getElementsByClassName('upGUISlider', 'div', volumeSet)[0];
			var volumePointer = UniplayerUtils.getElementsByClassName('upGUIPointer', 'a', volumeSet)[0];
			if(volumeSlider && volumePointer){
				this.volumeSlider = new UniplayerSlider(volumePointer, volumeSlider);
				this.volumeSlider.set(this.options.volume);
				this.volumeSlider.onChange = function(volume){
					self.volume(volume);
				};
				this.addEventListener('volume', function(volume){
					self.volumeSlider.set(volume);
				});
			}
		}
		// time
		var timeMonitor = UniplayerUtils.getElementsByClassName('upGUITime', 'div', holder)[0];
		if(timeMonitor){
			timeMonitor.onselectstart = function(){return false;};
			timeMonitor.ondragstart = function(){return false;};
			timeMonitor.onclick = function(){
				if(self.current.state == self.states.paused){
					GUI.timeReverse = !GUI.timeReverse;
					GUI.setTime(timeMonitor, self.current.position*self.current.duration, self.current.duration);
				}
				else if(self.current.state == self.states.playing){
					GUI.timeReverse = !GUI.timeReverse;
				}
			};
			this.addEventListener('duration', function(duration){
				GUI.setTime(timeMonitor, duration, duration, true);
			});
		}
		// position
		var positionSet = UniplayerUtils.getElementsByClassName('upGUIPosition', 'div', holder)[0];
		if(positionSet){
			var positionSlider = UniplayerUtils.getElementsByClassName('upGUISlider', 'div', positionSet)[0];
			var positionPointer = UniplayerUtils.getElementsByClassName('upGUIPointer', 'a', positionSet)[0];
			if(positionSlider && positionPointer){
				this.positionSlider = new UniplayerSlider(positionPointer, positionSlider);
				this.positionSlider.onChange = function(position){
					self.position(position);
				};
				this.addEventListener('position', function(position){
					self.positionSlider.set(position);
					if(timeMonitor){
						var stopped = (!position && self.current.state == self.states.stopped);
						GUI.setTime(timeMonitor, (stopped ? self.current.duration : position*self.current.duration), self.current.duration, stopped);
					}
				});
			}
		}
		// title
		var titleMonitor = UniplayerUtils.getElementsByClassName('upGUITitle', 'nobr', holder)[0];
		if(titleMonitor){
			GUI.titleMonitor = titleMonitor;
			this.addEventListener('src', function(src){
				GUI.setTitle(null, src);
				if(buttonFullScreen){
					if(self.current.module && (typeof self.current.module.fullScreen != 'function')){
						buttonFullScreen.className += ' disabled';
					}
					else{
						buttonFullScreen.className = buttonFullScreen.className.replace(' disabled', '');
					}
				}
			});
		}
		// menu
		var menu = UniplayerUtils.getElementsByClassName('upGUIMenu', 'div', holder)[0];
		if(menu && buttonMenu){
			buttonMenu.onclick = function(){
				(menu.style.display = (menu.style.display == 'block' ? 'none' : 'block')) == 'block'
				? (this.className += ' active')
				: (this.className = this.className.replace(' active',''))
			};
		}
		// version
		var version = UniplayerUtils.getElementsByClassName('upGUIVersion', 'span', holder)[0];
		if(version){
			version.innerHTML = this.version;
		}
	}
};


Uniplayer.prototype.loadPlay = function(src, mimetype, moduleName){
	this.stop();
	var resetAutoplay = false;
	if (!this.options.autoplay) {
		this.options.autoplay = true;
		resetAutoplay = true;
	}
	this.load(src, mimetype, moduleName);
	if (resetAutoplay) {
		this.options.autoplay = false;
	}
};


Uniplayer.prototype.load = function(src, mimetype, moduleName){
	try{
		if(!src){
			src = this.current.src;
		}
		if(!src){
			throw new UniplayerException({message:'No file to play'});
		}
		if (!mimetype) {
			mimetype = this.getMimeType(src);
		}
		if(!moduleName){
			moduleName = this.getModule(src, mimetype);
		}
		if(!moduleName){
			var ext = UniplayerUtils.getExtension(src);
			var message = '';
			if(ext){
				message = 'Unknown file format "'+ext+'"'
			}
			else{
				message = 'Cannot play this URL: ' + decodeURIComponent(src);
			}
			this.GUI.setTitle(message, src);
			throw new UniplayerException({message:message});
		}
	}
	catch(e){
		this.log(e);
		return;
	}
	this.current.src = src;
	this.current.mimetype = mimetype;
	if(this.current.module != this.modules[moduleName]){
		if(this.current.module){
			try {
				this.current.module.stop();
			}
			catch(e){
				this.log(e);
			}
		}
		this.current.module = this.modules[moduleName];
		try{
			this.current.movie = this.current.module.build();
			this.holders.main.style.height = this.current.height + this.holders.controls.offsetHeight + 2 + 'px';		// 2 for border
			// test modules
			if(this.current.module.test && !this.current.module.test()){
				for(var i in this.modules){
					if(i == moduleName){continue;}
					if(this.modules[i].test){
						if(this.modules[i].test()){
							this.current.module = this.modules[i];
							break;
						}
					}
				}
			}
		}
		catch(e){
			this.log(e);
		}
	}
	else{
		try{
			this.current.module.reload();
			if(this.options.autoplay){
				this.current.module.play();
			}
		}
		catch(e){
			this.log(e);
		}
	}
};


Uniplayer.prototype.addControl = function(name, fn){
	if(!name || typeof(fn) != 'function'){
		return false;
	}
	var self = this;
	this[name] = function(){
		var args = arguments;
		try{
			if(name == 'play' && !self.current.module && self.current.src && !self.options.autoload && !self.options.autoplay){
				self.options.autoplay = true;
				self.load(self.current.src, self.current.mimetype);
				self.options.autoplay = false;
				return true;
			}
			else if(typeof self.current.movie == 'undefined'){
				throw new UniplayerException({message:'No movie to control ' + name});
			}
			if(!self.current.module.present){
				if (name == 'play') {
					self.installModule(self.current.module.name);
				}
				return false;
			}
			if(self.current.module.name.indexOf('flash') == 0){
				try{
					return fn.apply(self, args);
				}
				catch(e){	// dirty-fix for flash-player - it sometimes fails to listen js commands until page reload.
					if(self.options.flashReloadPage && name != 'fullScreen'){
						window.location.reload();
					}
					else {
						//self.log(e);
					}
				}
			}
			else{
				return fn.apply(self, args);
			}
		}
		catch(e){
			self.log(e);
		}
	};
};


Uniplayer.prototype.pageScreen = function(resize){
	if(!this.current.movie){return;}
	if(!this.current.pageScreen){
		// remove body scrollbars
		document.body.className += 'upGUINoScroll';
		// get wrapper position
		var sx = (typeof pageXOffset != 'undefined') ? pageXOffset : document.body.scrollLeft;
		var sy = (typeof pageYOffset != 'undefined') ? pageYOffset : document.body.scrollTop;
		var ax = UniplayerUtils.getAbsLeft(this.holders.wrapper);
		var ay = UniplayerUtils.getAbsTop(this.holders.wrapper);
		// set wrapper position
		with(this.holders.wrapper.style){
			top = sy - ay + 'px';
			left = sx - ax + 'px';
		}
		// connect window resize
		if(typeof window.onresize == 'function'){window._onresize = window.onresize;}
		var self = this;
		window.onresize = function(){
			if(self.current.pageScreen){
				self.pageScreen.call(self, true);
			}
			if(typeof window._onresize == 'function'){window._onresize.call();}
		}
		// connect 'esc' button
		if(typeof document.onkeydown == 'function'){document._onkeydown = document.onkeydown;}
		document.onkeydown = function(e){
			var keynum, out;
			if(window.event){
				keynum = window.event.keyCode;
			}
			else if(e.which){
				keynum = e.which;
			}
			if(keynum == 27 && self.current.pageScreen){
				self.pageScreen.call(self);
				out = false;
			}
			else{
				out = true;
			}
			if(typeof document._onkeydown == 'function'){document._onkeydown.call();}
			return out;
		}
		this.current.pageScreen = true;
		resize = true;
	}
	if(resize){
		// set movie size
		var cw = (document.documentElement.clientWidth ? document.documentElement.clientWidth : (window.innerWidth ? window.innerWidth : document.body.offsetWidth));
		var ch = (window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight));
		if(typeof ActiveXObject != 'undefined'){
			cw-= 20;
			ch-= 4;
		}
		this.current.movie.width = cw;
		this.current.movie.height = ch - this.holders.controls.offsetHeight;
		this.holders.wrapper.style.width = this.current.movie.width + 'px';
	}
	else{
		// revert body scrollbars
		document.body.className = document.body.className.replace('upGUINoScroll', '');
		// revert movie size and wrapper position
		this.current.movie.width = this.current.width;
		this.current.movie.height = this.current.height;
		this.holders.wrapper.style.width = this.current.movie.width + 'px';
		with(this.holders.wrapper.style){
			top = 'auto';
			left = 'auto';
		}
		// revert events
		document.onkeydown = (typeof document._onkeydown == 'function') ? document._onkeydown : null;
		window.onresize = (typeof window._onresize == 'function') ? window._onresize : null;
		this.current.pageScreen = false;
	}
	return this.current.pageScreen;
};


Uniplayer.prototype.UniplayerObject = function(options, html5){
	var obj, ax = typeof(ActiveXObject) == 'function';
	if (html5) {
		obj = document.createElement(html5);
		if(options.id){
			obj.setAttribute('id', options.id);
		}
		obj.setAttribute('src', options.src);
		if (options.type) {
			obj.setAttribute('type', options.type);
		}
		if (html5 == 'video') {
			obj.setAttribute('width', options.width);
			obj.setAttribute('height', options.height);
		}
	}
	else {
		if(ax){
			// object
			obj = '<object';
			if(options.id){
				obj+= ' id="'+options.id+'"';
			}
			obj+= ' width="'+options.width+'"';
			obj+= ' height="'+options.height+'"';
			obj+= ' classid="'+options.classid+'"';
			if(options.codebase){
				obj+= ' codebase="'+options.codebase+'"';
			}
			obj+= '>';
			obj+= '</object>';
		}
		else{
			// embed
			obj = document.createElement('embed');
			if(options.id){
				obj.setAttribute('id', options.id);
			}
			obj.setAttribute('src', options.src);
			obj.setAttribute('width', options.width);
			obj.setAttribute('height', options.height);
			obj.setAttribute('type', options.type);
			if(options.pluginspage){
				obj.setAttribute('pluginspage', options.pluginspage);
			}
		}
	}
	
	this.addParam = function(name, value, axOnly){
		if(!name) return;
		if(typeof value == 'boolean'){
			value = value ? 'true' : 'false';
		}
		if (html5) {
			if (name == 'src' && value instanceof Array) {
				var source;
				for (var i=0; i<value.length; i++) {
					source = document.createElement('source');
					source.setAttribute('src', value[i]);
					obj.appendChild(source);
				}
			}
			else {
				obj.setAttribute(name, value);
			}
		}
		else {
			if(ax){
				obj = obj.replace('</object>', '<param name="'+name+'" value="'+value+'"/></object>');
			}
			else if(!axOnly){
				obj.setAttribute(name, value);
			}
		}
	};
	
	this.write = function(to, append){
		if(!to || !to.tagName) return;
		if(!append){
			to.innerHTML = '';
		}
		if(ax){
			to.innerHTML+= obj;
		}
		else{
			to.appendChild(obj);
		}
		return to.lastChild;
	};
};


UniplayerUtils = {
	getExtension: function(src){
		src = decodeURIComponent(src);
		src = src.substring(src.lastIndexOf('/')+1);
		return src.substring(src.lastIndexOf('.')+1).toLowerCase();
	},
	timeToString: function(time, negative, loading){
		if(!time){return loading ? 'loading ' : '0:00';}
		var addZero = function(number){
			return (number < 10 ? ('0' + number) : number.toString());
		};
		time = parseInt(time);
		if(time < 60){
			return (negative ? '-' : '') + '0:' + addZero(time);
		}
		else{
			var seconds = 0, minutes = 0, hours = 0;
			seconds = time % 60;
			minutes = (time - seconds) / 60;
			if(minutes > 60){
				var m = minutes % 60;
				hours = (minutes - m) / 60;
				minutes = m;
			}
			return (negative ? '-' : '') + (hours ? (hours + ':') : '') + addZero(minutes) +':'+ addZero(seconds);
		}
	},
	getAbsLeft: function(obj, limiter){
		if(!limiter){limiter = document.body;}
		var element = obj;
		var offset = 0;
		while(element){
			if(element == limiter){break;}
			offset += element.offsetLeft;
			element = element.offsetParent;
		}
		return offset;
	},
	getAbsTop: function(obj, limiter){
		if(!limiter){limiter = document.body;}
		var element = obj;
		var offset = 0;
		while(element){
			if(element == limiter){break;}
			offset += element.offsetTop;
			element = element.offsetParent;
		}
		return offset;
	},
	getMousePosition: function(e){
		var x=0, y=0;
		if(!e || (typeof(e.pageX) != 'number' && typeof(e.clientX) != 'number')){return {x: x, y: y};}
		if(typeof(e.pageX) == 'number'){
			var x = e.pageX;
			var y = e.pageY;
		}
		else{
			var x = e.clientX;
			var y = e.clientY;
			if(!(
				(window.navigator.userAgent.indexOf('Opera') + 1)
				|| (window.ScriptEngine && ScriptEngine().indexOf('InScript') + 1)
				|| window.navigator.vendor == 'KDE'
			)){
				if(document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)){
					x += document.documentElement.scrollLeft;
					y += document.documentElement.scrollTop;
				}
				else if(document.body && (document.body.scrollTop || document.body.scrollLeft)){
					x += document.body.scrollLeft;
					y += document.body.scrollTop;
				}
			}
		}
		return {x: x, y: y};
	},
	/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
	*/
	getElementsByClassName: function (className, tag, elm){
		if (document.getElementsByClassName) {
			getElementsByClassName = function (className, tag, elm) {
				elm = elm || document;
				var elements = elm.getElementsByClassName(className),
					nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
					returnElements = [],
					current;
				for(var i=0, il=elements.length; i<il; i+=1){
					current = elements[i];
					if(!nodeName || nodeName.test(current.nodeName)) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		else if (document.evaluate) {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = "",
					xhtmlNamespace = "http://www.w3.org/1999/xhtml",
					namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
					returnElements = [],
					elements,
					node;
				for(var j=0, jl=classes.length; j<jl; j+=1){
					classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
				}
				try	{
					elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
				}
				catch (e) {
					elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
				}
				while ((node = elements.iterateNext())) {
					returnElements.push(node);
				}
				return returnElements;
			};
		}
		else {
			getElementsByClassName = function (className, tag, elm) {
				tag = tag || "*";
				elm = elm || document;
				var classes = className.split(" "),
					classesToCheck = [],
					elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
					current,
					returnElements = [],
					match;
				for(var k=0, kl=classes.length; k<kl; k+=1){
					classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
				}
				for(var l=0, ll=elements.length; l<ll; l+=1){
					current = elements[l];
					match = false;
					for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
						match = classesToCheck[m].test(current.className);
						if (!match) {
							break;
						}
					}
					if (match) {
						returnElements.push(current);
					}
				}
				return returnElements;
			};
		}
		return getElementsByClassName(className, tag, elm);
	},
	loadCSS: function(src){
		if(!src){return false;}
		var holder = document.getElementsByTagName('head')[0];
		if(!holder){
			holder = document.createElement('head');
			document.body.parentNode.insertBefore(holder, document.body);
		}
		var link = document.createElement('link');
		link.rel = 'stylesheet';
		link.href = src;
		holder.appendChild(link);
		return true;
	},
	animate: function(obj, prop, start, stop, step, interval, callback){
		if(!obj || !prop || typeof(start) != 'number' || typeof(stop) != 'number' || start == stop){return;}
		if(!step){step = 1;}
		if(!interval){interval = 20;}
		var timer;
		var handler = (function(pos){
			var freeze = false;
			return function(){
				if(pos > stop){
					pos-= step;
					if(pos <= stop){
						pos = stop;
						freeze = true;
					}
				}
				else if(pos < stop){
					pos+= step;
					if(pos >= stop){
						pos = stop;
						freeze = true;
					}
				}
				else{
					freeze = true;
				}
				if(freeze){
					clearInterval(timer);
					if(typeof callback == 'function'){
						callback.call(obj);
					}
				}
				obj.style[prop] = pos + 'px';
			};
		})(start);
		return timer = setInterval(handler, interval);
	}
};


UniplayerSlider = function(pointer, holder){
	if(!pointer || (typeof(pointer.tagName) == 'undefined' && !(pointer=document.getElementById(pointer)))){return;}
	if(!holder || (typeof(holder.tagName) == 'undefined' && !(holder=document.getElementById(holder)))){holder = document.body;}
	var self = this;
	this.pointer = pointer;
	this.holder = holder;
	this.vertical = false;
	this.seekInterval = .05; // float percent
	this.pointer.onclick = function(){return false;};
	this.pointer.ondragstart = function(){return false;};
	this.pointer.onselectstart = function(){return false;};
	this.set = function(percent, change){
		if(percent < 0){percent = 0;}
		else if(percent > 1){percent = 1;}
		self.pointer.style[self.vertical ? 'top' : 'left'] = Math.floor(percent*100) + '%';
		if(change && typeof(self.onChange) == 'function'){
			self.onChange.call(self, percent);
		}
	};
	// events
	var drag = function(e){
		if(!e && !(e = window.event)){return true;}
		if(document.onmousemove == moving){return false;} // multiclick protection
		self.mouse = UniplayerUtils.getMousePosition(e);
		self.offset = self.vertical ? UniplayerUtils.getAbsTop(self.pointer, self.holder) : UniplayerUtils.getAbsLeft(self.pointer, self.holder);
		self.limit = self.vertical ? self.holder.offsetHeight : self.holder.offsetWidth;
		self._onmousemove = document.onmousemove;
		self._onmouseup = document.onmouseup;
		document.onmousemove = moving;
		document.onmouseup = drop;
		self.holder.style.cursor = 'pointer';
		return false;
	};
	var drop = function(e){
		document.onmousemove = self._onmousemove;
		document.onmouseup = self._onmouseup;
		self.holder.style.cursor = 'default';
		return false;
	};
	var moving = function(e){
		if(!e && !(e = window.event)){return true;}
		var mouse = UniplayerUtils.getMousePosition(e);
		var delta = self.vertical ? (mouse.y - self.mouse.y) : (mouse.x - self.mouse.x);
		var offset = self.offset + delta;
		self.set(offset/self.limit, true);
	};
	var point = function(e){
		if(!e && !(e = window.event)){return true;}
		var mouse = UniplayerUtils.getMousePosition(e);
		var offset = self.vertical ? UniplayerUtils.getAbsTop(self.holder) : UniplayerUtils.getAbsLeft(self.holder);
		var delta = (self.vertical ? mouse.y : mouse.x) - offset - Math.round(self.pointer.offsetWidth/2);
		var limit = self.vertical ? self.holder.offsetHeight : self.holder.offsetWidth;
		if(delta >= 0 || delta <= limit){
			self.set(delta/limit, true);
		}
	};
	var seek = function(e){
		if(!e && !(e = window.event)){return true;}
		var dir;
		if(e.keyCode == 37){
			dir = 'left';
		}
		else if(e.keyCode == 39){
			dir = 'right';
		}
		else{return true;}
		var offset = self.vertical ? self.pointer.offsetTop : self.pointer.offsetLeft;
		var limit = self.vertical ? self.holder.offsetHeight : self.holder.offsetWidth;
		var delta = Math.round(dir == 'right' ? (offset + limit*self.seekInterval) : (offset - limit*self.seekInterval));
		if(delta < 0){
			delta = 0;
		}
		else if(delta > limit){
			delta = limit;
		}
		self.set(delta/limit, true);
	};
	this.holder.onclick = point;
	this.pointer.onmousedown = drag;
	if(navigator.userAgent.indexOf('Firefox') >= 0 && navigator.userAgent.indexOf('Mac') >= 0){
		this.pointer.onkeypress = seek;		// workaround to support repeating in FF on Mac
	}
	else{
		this.pointer.onkeydown = seek;
	}
};


UniplayerGUIDefault = function(player){
	var lang = UniplayerLanguages[player.options.language];
	var HTMLControls = '<div class="upGUITitleHolder"><nobr class="upGUITitle"></nobr></div><div class="upGUIButtonSet"><a href="javascript:" class="upGUIButton upGUIButtonPrev" title="'+lang.controlsPrevious+'"></a><a href="javascript:" class="upGUIButton upGUIButtonPlay" title="'+lang.controlsPlay+'"></a><a href="javascript:" class="upGUIButton upGUIButtonPause" title="'+lang.controlsPause+'"></a><a href="javascript:" class="upGUIButton upGUIButtonStop" title="'+lang.controlsStop+'"></a><a href="javascript:" class="upGUIButton upGUIButtonNext" title="'+lang.controlsNext+'"></a></div><div class="upGUIVolume"><a href="javascript:" class="upGUIButton upGUIButtonMute" title="'+lang.controlsMute+'"></a><div class="upGUISlider" title="'+lang.controlsVolume+'"><div class="upGUISliderTail"></div><a href="javascript:" class="upGUIButton upGUIPointer"></a></div></div><div class="upGUIPosition"><div class="upGUITime" title="'+lang.controlsTime+'"></div><div class="upGUISlider" title="'+lang.controlsPosition+'"><div class="upGUISliderTail"></div><a href="javascript:" class="upGUIButton upGUIPointer"></a></div></div><a href="javascript:" class="upGUIButton upGUIButtonFullScreen" title="'+lang.controlsFullScreen+'"></a><a href="javascript:" class="upGUIButton upGUIButtonPlaylist" title="'+lang.controlsPlaylist+'"></a><div class="upGUIMenu"><a class="upGUIMenuAbout" href="http://code.google.com/p/uniplayer/" target="_blank">'+lang.about+' Uniplayer <span class="upGUIVersion"></span></a></div><a href="javascript:" class="upGUIButton upGUIButtonMenu" title="'+lang.controlsMenu+'"></a>';
	this.getHTML = function(){
		if(player.options.showControls && player.options.width < 210){
			player.options.width = 210;
		}
		if(player.options.showControls || player.options.showSupply){
			UniplayerUtils.loadCSS(player.options.guiPath + 'uniplayer.css');
		}
		return '<div class="upGUI"><div class="upGUIWrapper"><div class="upGUIMovie"></div><div class="upGUIControls" style="height: 46px; display: '+(player.options.showControls ? 'block' : 'none')+'">'+(player.options.showControls ? HTMLControls : '')+'</div></div></div>';
	};
	this.getPreview = function(src){
		return '<div style="' + (src ? 'cursor:pointer;' : '') + 'background:' + player.options.background + ' url('+(src || (player.options.guiPath + 'img/logo_transparent.png'))+') no-repeat center center;height:'+(player.options.height+'px')+'"></div>';
	};
	this.getSupply = function(){
		var src, out = '', amount = 0;
		for(var i=0; i<player.modulesList.length; i++){
			if(!player.modules[player.modulesList[i]].present){
				continue;
			}
			amount++;
			if(player.options.showSupplyLogos){
				src = player.options.guiPath + 'unilogos/' + (player.options.showSupplyLogosSmall ? 'small/' : '') + player.modules[player.modulesList[i]].name + (player.options.showSupplyLogosTransparent ? '.png' : '.gif');
				out+= '<li class="upGUISupplyLogo"><img src="'+src+'" alt="'+player.modules[player.modulesList[i]].title+'" title="'+player.modules[player.modulesList[i]].title+'"/></li>';
			}
			else{
				out+= '<li>'+player.modules[player.modulesList[i]].title+'</li>';
			}
		}
		out+= '</ul>';
		out = '<ul class="upGUISupply" style="height:'+(player.options.height+'px')+'"><li class="upGUISupplyTitle'+(player.options.showSupplyLogosTransparent?' transparent':'')+'">with '+amount+' plugin'+(amount>1?'s':'')+' for your system</li>' + out;
		return out;
	};
	this.timeReverse = false;
	this.setTime = function(timeMonitor, position, duration, ignoreTimeReverse){
		if(!timeMonitor){return;}
		var timeReverse = this.timeReverse && !ignoreTimeReverse;
		if(duration && timeReverse){
			position = duration - position;
		}
		timeMonitor.innerHTML = UniplayerUtils.timeToString(position, timeReverse);
	};
	this.setTitle = function(title, src){
		if(!this.titleMonitor){return;}
		var titleMonitor = this.titleMonitor;
		if(player.options.showTitleSrc){titleMonitor.title = src ? decodeURIComponent(src) : '';}
		if(typeof title != 'string'){
			if(src){
				src = decodeURIComponent(src);
				var qp, sh, dt;
				if((qp = src.indexOf('?')) >= 0){
					src = src.substring(0, qp);
				}
				if((sh = src.lastIndexOf('/')) >= 0){
					src = src.substring(sh + 1);
				}
				if((dt = src.lastIndexOf('.')) >= 0){
					src = src.substring(0, dt);
				}
				title = src.replace(/[\_\+\.\s+]/g, ' ');
			}
			else{
				title = 'No file loaded';
			}
		}
		titleMonitor.style.left = 0;
		titleMonitor.innerHTML = title;
		var titleDiff = titleMonitor.offsetWidth - titleMonitor.offsetParent.offsetWidth;
		if(titleDiff > 0){
			var titleMoving = false;
			var titleMoved = false;
			var titleAnimation;
			var move = function(){
				if(!titleMoving){
					titleMoving = true;
					var start = this.offsetLeft;
					var stop = titleMoved ? 0 : -titleDiff;
					titleAnimation = UniplayerUtils.animate(titleMonitor, 'left', start, stop, 2, 30, function(){titleMoved = !titleMoved; titleMoving = false;});
				}
				return true;
			};
			var pause = function(){
				if(titleMoving){
					clearInterval(titleAnimation);
					titleMoving = false;
				}
				return true;
			};
			var stop = function(){
				pause();
				titleMoved = false;
				titleMonitor.style.left = 0;
				return true;
			};
			titleMonitor.onmouseover = move;
			titleMonitor.onmouseout = pause;
			titleMonitor.onclick = stop;
		}
		else{
			titleMonitor.onmouseover = null;
			titleMonitor.onmouseout = null;
			titleMonitor.onclick = null;
		}
	};
};

/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

Uniplayer.prototype.mimes = (function(){
	var a = 'audio/';
	var v = 'video/';
	return {
		//-- audio
		'flac':a+'flac',
		'mp3':a+'mpeg',
		'm4a':a+'aac',
		'm4b':a+'aac',
		'm4p':a+'aac',
		'm4r':a+'aac',
		'aac':a+'aac',
		'adts':a+'aac',
		'wav':a+'wav',
		'bwf':a+'wav',
		'aiff':a+'aiff',
		'aif':a+'aiff',
		'aifc':a+'aiff',
		'cdda':a+'aiff',
		'au':a+'basic',
		'snd':a+'basic',
		'ulw':a+'basic',
		'mid':a+'midi',
		'midi':a+'midi',
		'smf':a+'midi',
		'kar':a+'midi',
		'qcp':a+'vnd.qcelp',
		'gsm':a+'x-gsm',
		'amr':a+'amr',
		'caf':a+'x-caf',
		'ac3':a+'ac3',
		'm2a':a+'mpeg',
		'swa':a+'mpeg',
		'wma':a+'x-ms-wma',
		'wax':a+'x-ms-wax',
		'mpga':a+'mpeg',
		'mpega':a+'mpeg',
		'3gpp2':a+'3gpp2',
		'oga':a+'ogg',
		//-- video
		'3gp':v+'3gpp',
		'3gpp':v+'3gpp',
		'3g2':v+'3gpp2',
		'3gp2':v+'3gpp2',
		'h261':v+'h261',
		'h263':v+'h263',
		'h264':v+'h264',
		'jpgv':v+'jpeg',
		'jpm':v+'jpm',
		'jpgm':v+'jpm',
		'mj2':v+'mj2',
		'mjp2':v+'mj2',
		'mp4':v+'mp4',
		'mp4v':v+'mp4',
		'mpg4':v+'mp4',
		'm4u':v+'x-mpegurl',
		'mp2':v+'mpeg',
		'mpm':v+'mpeg',
		'mpa':v+'mpeg',
		'mpeg':v+'mpeg',
		'mpg':v+'mpeg',
		'mpe':v+'mpeg',
		'mpv':v+'mpeg',
		'mp2v':v+'mpeg-2',
		'mpv2':v+'mpeg-2',
		'm1s':v+'mpeg',
		'm1a':v+'mpeg',
		'm75':v+'mpeg',
		'm15':v+'mpeg',
		'm1v':v+'mpeg',
		'm2v':v+'mpeg',
		'qt':v+'quicktime',
		'mov':v+'quicktime',
		'mqv':v+'quicktime',
		'fvt':v+'vnd.fvt',
		'mxu':v+'vnd.mpegurl',
		'm4u':v+'vnd.mpegurl',
		'viv':v+'vnd.vivo',
		'vivo':v+'vnd.vivo',
		'fli':v+'fli',
		'flc':v+'flc',
		'cel':v+'flc',
		'asr':v+'x-ms-asf',
		'asf':v+'x-ms-asf',
		'asx':v+'x-ms-asx',
		'lsf':v+'x-la-asf',
		'lsx':v+'x-la-asf',
		'wm':v+'x-ms-wm',
		'wmp':v+'x-ms-wmp',
		'wmv':v+'x-ms-wmv',
		'wmx':v+'x-ms-wmx',
		'wvx':v+'x-ms-wvx',
		'avi':v+'x-msvideo',
		'avs':v+'avs-video',
		'mv':v+'x-sgi-movie',
		'movie':v+'x-sgi-movie',
		'ice':'x-conference/x-cooltalk',
		'f4v':v+'mp4',
		'f4p':v+'mp4',
		'flv':v+'flv',
		'swf':'application/x-shockwave-flash',
		'spl':'application/futuresplash',
		'dxr':'application/x-director',
		'dir':'application/x-director',
		'dcr':'application/x-director',
		'divx':v+'divx',
		'div':v+'divx',
		'dv':v+'x-dv',
		'dif':v+'x-dv',
		'dl':v+'dl',
		'gl':v+'gl',
		'ogv':v+'ogg',
		'ogg':'application/x-ogg',
		'ogx':'application/ogg',
		'axv':v+'annodex',
		'anx':'application/annodex',
		'afl':v+'animaflex',
		'fmf':v+'x-atomic3d-feature',
		'isu':v+'x-isvideo',
		'mjpg':v+'x-motion-jpeg',
		'qtc':v+'x-qtc',
		'rv':v+'vnd.rn-realvideo',
		'ra':'audio/x-pn-realaudio',
		'ram':'audio/x-pn-realaudio',
		'rm':'audio/x-pn-realaudio-plugin',
		'rpm':'audio/x-pn-realaudio-plugin',
		'rpj':'application/vnd.rn-realplayer-javascript',
		'scm':v+'x-scm',
		'vdo':v+'vdo',
		'vos':v+'vosaic',
		'xdr':v+'x-amt-demorun',
		'xsr':v+'x-amt-showrun',
		'sdv':v+'sd-video',
		'vob':v+'mpeg-system',
		'm4v':v+'x-m4v',
		'vlc':'application/x-vlc-plugin',
		'amc':'application/x-mpeg'
	};
})();

/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

UniplayerHtml5 = function(){
	this.name = 'html5';
	this.title = 'HTML5';
	this.needle = 'Html5';
	this.progid = '';
	this.classid = '';
	if (navigator.userAgent.indexOf('Safari') != -1) {		// full quicktime support
		this.supported = [
			//-- audio
			'audio/x-wav',
			'audio/wav',
			'audio/aiff',
			'audio/x-aiff',
			'audio/basic',
			'audio/mid',
			'audio/midi',
			'audio/x-midi',
			'audio/vnd.qcelp',
			'audio/x-gsm',
			'audio/amr',
			'audio/aac',
			'audio/x-aac',
			'audio/x-caf',
			'audio/ac3',
			'audio/x-ac3',
			'audio/mpeg',
			'audio/x-mpeg',
			'audio/3gpp',
			'audio/3gpp2',
			'audio/mp4',
			'audio/x-m4a',
			'audio/x-m4p',
			'audio/x-m4b',
			'audio/mp3',
			'audio/x-mp3',
			'audio/mpeg3',
			'audio/x-mpeg3',
			//-- video
			'video/quicktime',
			'video/3gpp',
			'video/x-m4v',
			'video/flc',
			'video/sd-video',
			'video/3gpp',
			'video/3gpp2',
			'video/x-mpeg',
			'video/mpeg',
			'video/mpeg',
			'video/x-msvideo',
			'video/avi',
			'video/mp4'
		];
	}
	else if (navigator.userAgent.indexOf('MSIE 9') != -1) {
		this.supported = [
			//-- audio
			'audio/mpeg',
			'audio/x-mpeg',
			'audio/mp3',
			'audio/x-mp3',
			'audio/mpeg3',
			'audio/x-mpeg3',
			'audio/aac',
			'audio/x-aac',
			'audio/webm',
			//-- video
			'video/mp4',
			'video/h264',
			'video/webm'
		];
	}
	else if (navigator.userAgent.indexOf('Firefox') != -1) {
		this.supported = [
			//-- audio
			'audio/x-wav',
			'audio/wav',
			'audio/ogg',
			//-- video
			'video/ogg',
			'application/ogg',
			'application/x-ogg'
		];
	}
	else if (navigator.userAgent.indexOf('Chrome') != -1) {
		this.supported = [
			//-- audio
			'audio/mpeg',
			'audio/x-mpeg',
			'audio/mp3',
			'audio/x-mp3',
			'audio/mpeg3',
			'audio/x-mpeg3',
			'audio/aac',
			'audio/x-aac',
			'audio/ogg',
			'audio/webm',
			//-- video
			'video/mp4',
			'video/h264',
			'video/ogg',
			'application/ogg',
			'application/x-ogg',
			'video/webm'
		];
	}
	else if (navigator.userAgent.indexOf('Opera') != -1) {
		this.supported = [
			//-- audio
			'audio/x-wav',
			'audio/wav',
			'audio/ogg',
			'audio/webm',
			//-- video
			'video/ogg',
			'application/ogg',
			'application/x-ogg',
			'video/webm'
		];
	}
	else if (navigator.userAgent.indexOf('iPhone') != -1 || navigator.userAgent.indexOf('Android') != -1) {
		this.supported = [
			//-- audio
			'audio/mpeg',
			'audio/x-mpeg',
			'audio/mp3',
			'audio/x-mp3',
			'audio/mpeg3',
			'audio/x-mpeg3',
			'audio/aac',
			'audio/x-aac',
			//-- video
			'video/mp4',
			'video/h264'
		];
	}
	this.maxVolume = 1;
	this.state = '';
	// build		http://diveintohtml5.org/video.html
	this.build = function(){
		// show native controls
		var height = this.player.options.height;
		if(this.player.options.showNativeControls){
			height+= 16;
		}
		var mime = '';
		if (this.player.current.mimetype.indexOf('video/') != -1) {
			if (this.player.current.mimetype.indexOf('ogg') != -1) {
				mime = 'video/ogg; codecs="theora, vorbis"';
			}
			else if (this.player.current.mimetype.indexOf('webm') != -1) {
				mime = 'video/webm; codecs="vp8, vorbis"';
			}
			else if (navigator.userAgent.indexOf('Android') == -1) {
				mime = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
			}
		}
		// create object
		var obj = new this.player.UniplayerObject({
			id:	this.player.options.id,
			src: this.player.current.src,
			width: this.player.options.width,
			height: height,
			type: mime
		}, this.player.current.mimetype.indexOf('audio/') != -1 ? 'audio' : 'video');
		if (this.player.options.autoplay) {
			obj.addParam('autoplay', 'autoplay');
		}
		else {
			obj.addParam('preload', 'none');
		}
		if (this.player.options.showNativeControls) obj.addParam('controls', 'controls');
		// write
		this.movie = obj.write(this.player.holders.movie);
		delete obj;
		var self = this;
		this.movie.addEventListener('durationchange', function(){
			self.player.current.duration = self.getDuration.call(self);
		});
		this.player.current.width = this.player.options.width;
		this.player.current.height = height;
		return this.movie;
	};
	// test
	this.test = function(){
		var result = false;
		try{
			result = typeof this.canPlayType == 'function' ? true : false;
		}
		catch(e){}
		return result;
	};
	//controls		https://developer.mozilla.org/En/NsIDOMHTMLMediaElement
	this.getVersion = function(){
		return '';
	};
	this.getState = function(){
		var currentState = this.player.current.state;
		if (this.player.options.autoplay || (this.state && this.state == 'playing')) {
			if (this.player.current.movie.networkState > 0 && this.player.current.movie.readyState < 4) {
				currentState = this.player.states.loading;
			}
			else {
				currentState = this.player.states.playing;
			}
		}
		if (this.player.current.movie.paused && this.state && this.state == 'paused') {
			currentState = this.player.states.paused;
		}
		if (this.player.current.movie.ended || (this.state && this.state == 'stopped')) {
			currentState = this.player.states.stopped;
		}
		return currentState;
	};
	this.reload = function(){
		this.player.current.movie = this.build();
		return true;
	};
	this.play = function(){
		this.state = 'playing';
		return this.player.current.movie.play();
	};
	this.pause = function(){
		this.state = 'paused';
		return this.player.current.movie.pause();
	};
	this.stop = function(){
		this.state = 'stopped';
		try {
			this.setPosition(0);
		}
		catch(e){}
		return this.player.current.movie.pause();
	};
	this.fullScreen = function(){	// for now only safari supports fullscreen
		if (navigator.userAgent.indexOf('Safari') != -1) {
			this.player.current.movie.webkitEnterFullscreen();
		}
	};
	this.getMute = function(){
		return this.player.current.movie.muted;
	};
	this.setMute = function(turn){
		return this.player.current.movie.muted = turn ? true : false;
	};
	this.getVolume = function(){
		return this.player.current.movie.volume;
	};
	this.setVolume = function(volume){
		return this.player.current.movie.volume = volume*this.player.current.module.maxVolume;
	};
	this.getDuration = function(){
		return (isNaN(this.player.current.movie.duration) || this.player.current.movie.duration == 'Inf') ? 0 : this.player.current.movie.duration;
	};
	this.getPosition = function(){
		return this.player.current.movie.duration ? this.player.current.movie.currentTime/this.player.current.movie.duration : 0;
	};
	this.setPosition = function(position){
		return this.player.current.movie.currentTime = parseFloat(position*this.player.current.movie.duration);
	};
};

/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

UniplayerFlashJWPlayer = function(conf){
	/*
		KNOWN ISSUES
		
		- no javascript control for fullScreen due to flash security restrictions
	*/
	this.name = 'flashjw';
	this.title = 'Flash JW Player';
	this.needle = 'Flash';
	this.progid = 'ShockwaveFlash.ShockwaveFlash';
	this.classid = 'clsid:D27CDB6E-AE6D-11CF-96B8-444553540000';
	this.codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab';
	this.pluginspage = 'http://www.macromedia.com/go/getflashplayer';
	this.mime = 'application/x-shockwave-flash';
	this.supported = [
		//-- audio
		'audio/mpeg',
		//'audio/aac',
		//'audio/aacp',
		//-- video
		'video/flv',
		'application/x-shockwave-flash',
		'video/mp4'
	];
	this.maxVolume = 100;
	this.duration = 0;
	this.position = 0;
	// build		http://developer.longtailvideo.com/trac/wiki/FlashVars
	this.build = function(){
		if (conf && conf.flashvars && conf.flashvars.streamer == 'lighttpd' && this.player.current.mimetype != 'audio/mpeg') {
			this.streamerLighttpd = true;
		}
		// show native controls
		var height = this.player.options.height;
		if(this.player.options.showNativeControls){
			height+= 20;
		}
		// create object
		var swf = (conf && conf.swf) ? conf.swf : 'http://play.radiolla.com/uniplayer/components/jwplayer/player.swf';
		if(!this.player.options.id){
			this.player.options.id = 'uniplayer_' + this.name + '_' + Math.floor(Math.random()*100000000);	// jwplayer needs the ID to work correctly in IE
		}
		var obj = new this.player.UniplayerObject({
			id:	this.player.options.id,
			src: swf,
			width: this.player.options.width,
			height: height,
			type: 'application/x-shockwave-flash',
			classid: this.classid,
			codebase: this.codebase,
			pluginspage: this.pluginspage
		});
		obj.addParam('movie', swf, true);
		obj.addParam('quality', 'high');
		obj.addParam('wmode', 'opaque');
		obj.addParam('allowfullscreen', true);
		obj.addParam('allowscriptaccess', 'always');
		var flashvars = 'file='+escape(this.player.current.src).replace(/\%2523/g, '%25252523').replace(/\%253F/g, '%2525253F');
		flashvars+= '&id='+this.player.options.id;
		flashvars+= '&controlbar='+(this.player.options.showNativeControls?'bottom':'none');
		flashvars+= '&autostart='+(this.player.options.autoplay?'true':'false');
		flashvars+= '&volume='+this.player.options.volume*this.maxVolume;
		if(!this.player.options.showNativeControls){
			flashvars+= '&displayclick=fullscreen';
		}
		if(this.player.options.background){
			flashvars+= '&screencolor=' + this.player.options.background;
			obj.addParam('bgcolor', this.player.options.background);
		}
		if(conf && conf.flashvars){
			for(var i in conf.flashvars){
				if (i == 'streamer' && conf.flashvars[i] == 'lighttpd' && !this.streamerLighttpd) {
					continue;
				}
				flashvars+= '&' + i + '=' + conf.flashvars[i];
			}
		}
		obj.addParam('flashvars', flashvars);
		this.movie = obj.write(this.player.holders.movie);
		delete obj;
		// event time is only way to get jw flv player's position and duration
		var self = this;
		window.playerReady = function(obj){
			if(obj.id != self.player.options.id){return;}
			window[self.player.options.id + '_onPositionChange'] = function(obj){
				self.duration = obj.duration;
				self.position = self.duration ? obj.position/self.duration : 0;
			};
			self.player.current.movie.addModelListener('TIME', self.player.options.id + '_onPositionChange');
			delete window.playerReady;
		};
		this.player.current.width = this.player.options.width;
		this.player.current.height = height;
		return this.movie;
	};
	// controls		http://developer.longtailvideo.com/trac/wiki/FlashVars
	this.getVersion = function(){
		return this.player.current.movie.getConfig().version;
	};
	this.getState = function(){
		var state = this.player.current.movie.getConfig().state;
		var currentState = this.player.current.state;
		switch(state){
			case 'BUFFERING':
				currentState = this.player.states.loading;
				break;
			case 'PLAYING':
				currentState = this.player.states.playing;
				break;
			case 'PAUSED':
				currentState = this.player.states.paused;
				break;
			case 'IDLE':
			case 'COMPLETED':
				currentState = this.player.states.stopped;
				break;
			default:
				currentState = this.player.states.stopped;
				break;
		}
		return currentState;
	};
	this.reload = function(){
		if (this.streamerLighttpd && this.player.current.mimetype == 'audio/mpeg') {
			this.streamerLighttpd = false;
			this.player.current.movie = this.build();
		}
		if (!this.streamerLighttpd && this.player.current.mimetype != 'audio/mpeg') {
			this.streamerLighttpd = true;
			this.player.current.movie = this.build();
		}
		this.player.current.movie.sendEvent('LOAD', this.player.current.src.replace(/\%23/g, '%2523').replace(/\%3F/g, '%253F'));
	};
	this.play = function(){
		return this.player.current.movie.sendEvent('PLAY', true);
	};
	this.pause = function(){
		return this.player.current.movie.sendEvent('PLAY', false);
	};
	this.stop = function(){
		return this.player.current.movie.sendEvent('STOP');
	};
	this.fullScreen = function(){
		return this.player.pageScreen();
	};
	this.getMute = function(){
		return this.player.current.movie.getConfig().mute;
	};
	this.setMute = function(turn){
		return this.player.current.movie.sendEvent('MUTE', turn);
	};
	this.getVolume = function(){
		return this.player.current.movie.getConfig().volume/this.player.current.module.maxVolume;
	};
	this.setVolume = function(volume){
		return this.player.current.movie.sendEvent('VOLUME', volume*this.player.current.module.maxVolume);
	};
	this.getDuration = function(){
		return this.duration;
	};
	this.getPosition = function(){
		return this.position;
	};
	this.setPosition = function(position){
		return this.player.current.movie.sendEvent('SEEK', position*this.player.current.duration);
	};
};

/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

UniplayerWindowsMedia = function(){
	/*
		KNOWN ISSUES
		
		Windows:
			Firefox3
				-control (needs to install wmpfirefoxplugin.exe)
				-volume-param
			Safari3
				-downgrade to wmp6.4 without wmpfirefoxplugin
				-control (needs to install wmpfirefoxplugin.exe)
				-volume-param
				-volume-js (even if wmpfirefoxplugin installed)
			Opera9
				-volume
				-fullscreen
			IE5.01
				-control

		Flip4Mac:
			ALL
				-volume
				-fullscreen
				-mute
				-getPosition -	instead of Flip4Mac does not provide the Duration property,
				-setPosition	but property CurrentPosition is provided.
			Firefox3
				Flip4Mac controls trows an Exception but works
			Opera9
				-control

		Both:
			- background
			
	*/
	var mac = navigator.appVersion.indexOf('Macintosh') >= 0;
	this.name = mac ? 'flip4mac' : 'windowsmedia';
	this.title = mac ? 'Flip4Mac' : 'Windows Media Player';
	this.needle = ['(Windows Media|ActiveX Plug-in)'];// for google.chrome's activex plugin
	this.progid = 'wmplayer.ocx';
	this.classid = 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';	// 'clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95'; for wmp6.4
	this.codebase = '';	// http://support.microsoft.com/kb/321684
	this.pluginspage = 'http://www.microsoft.com/windows/windowsmedia/player/default.aspx';
	this.mime = 'video/x-ms-wm';	// force using of WMP (VLC or x-mplayer2 may override WMP if other mimetype is used)
	this.supported = [
		'application/x-mplayer2',
		//-- audio
		'audio/mpeg',
		'audio/x-ms-wma',
		'audio/x-ms-wax',
		//-- video
		'video/x-msvideo',
		'video/x-ms-wm',
		'video/x-ms-wmv',
		'video/x-ms-wvx',
		'video/x-ms-asf',
		'video/x-ms-wmx',
		'video/x-ms-asf-plugin',
		'video/x-ms-wmp',
		'video/x-ms-asx'
	];
	this.maxVolume = 100;// -10000 for WMP 6.4;
	// build
	this.build = function(){
		// show native controls
		var height = this.player.options.height;
		if(this.player.options.showNativeControls){
			if(mac){
				height+= 16;
			}
			else{
				height+= 64;
			}
		}
		// create object
		var obj = new this.player.UniplayerObject({
			id:	this.player.options.id,
			src: this.player.current.src,
			width: this.player.options.width,
			height: height,
			type: this.mime,
			classid: this.classid,
			codebase: this.codebase,
			pluginspage: this.pluginspage
		});
		obj.addParam('URL', this.player.current.src, true);
		obj.addParam('AutoStart', this.player.options.autoplay ? 1 : 0);
		obj.addParam('volume', this.player.options.volume*this.maxVolume);
		obj.addParam('ShowControls', this.player.options.showNativeControls);
		obj.addParam('ShowStatusBar', this.player.options.showNativeControls);
		obj.addParam('uiMode', this.player.options.showNativeControls ? 'mini' : 'none');
		obj.addParam('version', 'VideoLAN.VLCPlugin.2');	// if plugin is overridden by VLC, this param is needed to access VLC controls
		this.movie = obj.write(this.player.holders.movie);
		delete obj;
		this.player.current.width = this.player.options.width;
		this.player.current.height = height;
		return this.movie;
	};
	// test
	this.test = function(){
		var result = false;
		try{
			result = (this.player.current.movie.controls || this.player.current.movie.FileName) ? true : false;
		}
		catch(e){}
		return result;
	};
	//controls		http://msdn.microsoft.com/en-us/library/bb248464(VS.85).aspx
	//	wmp6.4		http://msdn.microsoft.com/en-us/ms870192.aspx
	//flip4mac		http://forum.flip4mac.com/forum/messageview.aspx?catid=9&threadid=1271
	//				Flip4Mac WMV Supports the following methods and properties from the Windows Media 6.4 SDK
	//				Methods: "play","pause","Play","Pause","Stop","Next","Previous","Open"
	//				Properties: "CurrentPosition","FileName","PlayState" 
	this.getVersion = function(){
		return this.player.current.movie.versionInfo;		// flip4mac returns undefined
	};
	this.getState = function(){
		var state = 0;
		if(this.player.current.movie.controls){
			state = this.player.current.movie.playState;
		}
		else{
			state = this.player.current.movie.PlayState;
		}
		state = parseInt(state);
		var currentState = this.player.current.state;
		if(this.player.current.movie.controls){
			switch(state){
				case 4:
				case 5:
				case 6:
				case 7:
				case 9:
				case 11:
					currentState = this.player.states.loading;
					break;
				case 3:
					currentState = this.player.states.playing;
					break;
				case 2:
					currentState = this.player.states.paused;
					break;
				case 0:
				case 1:
				case 8:
				case 10:
					currentState = this.player.states.stopped;
					break;
			}
		}
		else{
			switch(state){
				case 3:
				case 4:
				case 5:
				case 6:
				case 7:
					currentState = this.player.states.loading;
					break;
				case 2:
					currentState = this.player.states.playing;
					break;
				case 1:
					currentState = this.player.states.paused;
					break;
				case 0:
				case 8:
					currentState = this.player.states.stopped;
					break;
			}
		}
		return currentState;
	};
	this.reload = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.URL = this.player.current.src;
		}
		else{
			return this.player.current.movie.FileName = this.player.current.src;
		}
	};
	this.play = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.controls.play();
		}
		else{
			return this.player.current.movie.Play();
		}
	};
	this.pause = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.controls.pause();
		}
		else{
			return this.player.current.movie.Pause();
		}
	};
	this.stop = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.controls.stop();
		}
		else{
			return this.player.current.movie.Stop();
		}
	};
	this.fullScreen = function(){
		if(mac){
			return this.player.pageScreen();
		}
		else if(this.player.current.movie.controls){
			return this.player.current.movie.fullScreen = true;
		}
		else{
			return this.player.current.movie.displaySize = 3;
		}
	};
	this.getMute = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.settings.mute;
		}
		else{
			return this.player.current.movie.Mute;
		}
	};
	this.setMute = function(turn){
		if(this.player.current.movie.controls){
			return this.player.current.movie.settings.mute = turn;
		}
		else{
			return this.player.current.movie.Mute = turn;
		}
	};
	this.getVolume = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.settings.volume/this.player.current.module.maxVolume;
		}
		else{
			return isNaN(this.player.current.movie.Volume) ? this.player.current.volume : (this.player.current.movie.Volume+10000)/10000;
		}
	};
	this.setVolume = function(volume){
		if(this.player.current.movie.controls){
			return this.player.current.movie.settings.volume = volume*this.player.current.module.maxVolume;
		}
		else{
			return this.player.current.movie.Volume = volume*10000-10000;
		}
	};
	this.getDuration = function(){
		if(this.player.current.movie.controls){
			return this.player.current.movie.currentMedia.duration;
		}
		else{
			return isNaN(this.player.current.movie.Duration) ? 0 : this.player.current.movie.Duration;
		}
	};
	this.getPosition = function(){
		if(this.player.current.movie.controls){
			return this.player.current.duration ? this.player.current.movie.controls.currentPosition/this.player.current.duration : 0;
		}
		else{
			return (!this.player.current.duration || isNaN(this.player.current.movie.CurrentPosition) || this.player.current.movie.CurrentPosition < 0) ? 0 : this.player.current.movie.CurrentPosition/this.player.current.duration;
		}
	};
	this.setPosition = function(position){
		if(this.player.current.movie.controls){
			return this.player.current.movie.controls.currentPosition = position*this.player.current.duration;
		}
		else{
			return this.player.current.movie.currentPosition = position*this.player.current.duration;
		}
	};
};

/*
    Uniplayer - Universal Web Media Player
    Copyright (C) 2008 Artem Bandur <artico.bandurini@gmail.com>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

UniplayerVLC = function(){
	/*
		KNOWN ISSUES
		
		- background
	*/
	this.name = 'vlc';
	this.title = 'VLC';
	this.needle = ['VLC', '(Plug-in|Plugin)'];
	this.progid = 'VideoLAN.VLCPlugin';
	this.classid = 'clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921';
	this.codebase = 'http://play.radiolla.com/uniplayer/install/VLC.cab';
				  // http://downloads.videolan.org/pub/videolan/vlc/0.8.6c/win32/axvlc.cab
				  // http://downloads.videolan.org/pub/videolan/vlc/0.9.2/win32/axvlc.cab
	this.pluginspage = 'http://www.videolan.org/';
	this.mime = 'application/x-vlc-plugin';
	this.supported = [
		//-- audio
		'audio/flac',
		'audio/mpeg',
		'audio/x-mpeg',
		'audio/mpeg4',
		'audio/wav',
		'audio/x-wav',
		'audio/3gpp',
		'audio/3gpp2',
		//-- video
		'application/x-vlc-plugin',
		'video/mpeg',
		'video/mpeg4',
		'video/x-mpeg',
		'video/x-msvideo',
		'video/x-ms-wmv',
		'application/ogg',
		'application/x-ogg',
		'application/mpeg4-muxcodetable',
		'video/mp4',
		'video/3gpp2',
		'video/x-ms-asf-plugin',
		'video/x-ms-asf',
		'application/mpeg4-iod',
		'video/mpeg-system',
		'video/x-mpeg-system',
		'video/divx',
		'video/x-google-vlc-plugin'
	];
	this.maxVolume = 100;	// can be even 200
	// build		http://www.videolan.org/doc/play-howto/en/ch04.html
	this.build = function(){
		// create object
		var obj = new this.player.UniplayerObject({
			id:	this.player.options.id,
			src: this.player.current.src,
			width: this.player.options.width,
			height: this.player.options.height,
			type: this.mime,
			classid: this.classid,
			codebase: this.codebase,
			pluginspage: this.pluginspage
		});
		obj.addParam('src', this.player.current.src, true);
		obj.addParam('version', 'VideoLAN.VLCPlugin.2');
		obj.addParam('autoplay', this.player.options.autoplay);
		obj.addParam('volume', this.player.options.volume*this.maxVolume);
		obj.addParam('showdisplay', true);
		this.movie = obj.write(this.player.holders.movie);
		delete obj;
		this.movie.style.width = this.player.options.width + 'px';
		this.movie.style.height = this.player.options.height + 'px';
		this.player.current.width = this.player.options.width;
		this.player.current.height = this.player.options.height;
		return this.movie;
	};
	// test
	this.test = function(){
		var result = false;
		try{
			result = (this.getVersion() && this.player.current.movie.input) ? true : false;
		}
		catch(e){}
		return result;
	};
	//controls		http://www.videolan.org/doc/play-howto/en/ch04.html
	this.getVersion = function(){
		return this.player.current.movie.VersionInfo;
	};
	this.getState = function(){
		var state = parseInt(this.player.current.movie.input.state);
		var currentState = this.player.current.state;
		switch(state){
			case 1:
			case 2:
				currentState = this.player.states.loading;
				break;
			case 3:
				currentState = this.player.states.playing;
				break;
			case 4:
				currentState = this.player.states.paused;
				break;
			case 6:
				currentState = this.player.states.failed;
				break;
			case 0:
			case 5:
				currentState = this.player.states.stopped;
				break;
		}
		return currentState;
	};
	this.reload = function(){
		this.stop();
		this.player.current.movie.playlist.clear();
		return this.player.current.movie.playlist.add(this.player.current.src);
	};
	this.play = function(){
		return this.player.current.movie.playlist.play();
	};
	this.pause = function(){
		return this.player.current.movie.playlist.togglePause();
	};
	this.stop = function(){
		return this.player.current.movie.playlist.stop();
	};
	this.fullScreen = function(){
		return this.player.current.movie.video.toggleFullscreen();
	};
	this.getMute = function(){
		return this.player.current.movie.audio.mute;
	};
	this.setMute = function(turn){
		return this.player.current.movie.audio.mute = turn;
	};
	this.getVolume = function(){
		return this.player.current.movie.audio.volume/this.player.current.module.maxVolume;
	};
	this.setVolume = function(volume){
		return this.player.current.movie.audio.volume = volume*this.player.current.module.maxVolume;
	};
	this.getDuration = function(){
		var duration = this.player.current.movie.input.length/1000;
		return isNaN(duration) ? 0 : duration;
	};
	this.getPosition = function(){
		return this.player.current.movie.input.position;
	};
	this.setPosition = function(position){
		return this.player.current.movie.input.position = position;
	};
};

window.isMobile = true;

/*!
 * jQuery JavaScript Library v1.4.3
 * http://jquery.com/
 *
 * Copyright 2010, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2010, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 *
 * Date: Thu Oct 14 23:10:06 2010 -0400
 */
(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X,
"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;
a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b,
e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}
function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?
e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a,
1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,
q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i=
[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i);
else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ":
"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r,
y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone=
K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready,
1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i==
null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i);
if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()===
r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length==
null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i,
r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y);
for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=
m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"),
e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),
hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b,
a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div");
s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight===
0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",
cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=
c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b=
c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e===
"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e||
[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,
a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s=
c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,
f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false},
val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&&
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&&
h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l===
"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[];
if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||
typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown||
v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=
f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===
false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e;
d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data=
l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired=
A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type===
"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]===
0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d===
"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}});
c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j,
[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3];
break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr,
t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h=
k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*"));
return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!==
A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()===
j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=
j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g,
"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o,
m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]-
0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o===
"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]];
if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o,
g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1;
for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"),
j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g);
o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&&
function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o];
j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g,
j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("",
"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,
b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||
!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});
c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",
d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}});
c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g,
$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|&#?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],
area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,
d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},
unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=
c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));
c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($,
"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?
this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,
true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild:
l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone||
!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=
d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default,
s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&&
c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]?
c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this;
return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]||
h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=
e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":
b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],
h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=
b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache=
false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src=
b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type",
b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+
"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a,
b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag");
if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr=
function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a=
0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a=
0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete);
return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)===
"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g);
G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)}
this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;
for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+=
parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a,
e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&&
c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+
b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window);


/*	aloader - sync/async crossdomain javascript loader written by Artico Bandurini [artico.bandurini@gmail.com]
	usage: aloader.load(path_to_js_file, callback_function);
	callback_function will be called in the window scope with 1 argument - HTMLElement of loaded script
*/
aloader = {
	queue: [],
	queueCallback: null,
	load: function(src, callback, async, holder){
		if(src instanceof Array){
			if(!src.length){
				return false;
			}
			else if(src.length == 1){
				src = src[0];
			}
			else{
				aloader.queue = src;
				aloader.queueCallback = callback;
				callback = null;
				src = aloader.queue[0];
			}
		}
		if(!src){
			return false;
		}
		var tag = document.createElement('script'),
		self = this;
		if (!holder) {
			holder = document.getElementsByTagName('head')[0] || document.body;
		}
		tag.async = async ? true : false;
		tag.src = src;
		holder.appendChild(tag);
		var receive = function(tag){
			if(aloader.queue.length && src == aloader.queue[0]){
				aloader.queue.shift();
				if(aloader.queue.length){
					aloader.load(aloader.queue[0]);
				}
				else{
					callback = aloader.queueCallback;
				}
			}
			if(typeof callback == 'function'){
				callback.call(self, tag);
			}
			if (tag && tag.parentNode) {
				tag.parentNode.removeChild(tag);
			}
		};
		if(navigator.userAgent.indexOf('MSIE') >= 0){
			tag.onreadystatechange = function(){
				if(this.readyState == 'loaded' || this.readyState == 'complete'){
					receive(this);
				}
			};
		}
		else{
			tag.onload = function(){
				receive(this);
			};
		}
	}
};


cookies = {
	set: function(name, value, expires, path, domain, secure){
		document.cookie = name + '=' + escape(value) +
			(expires ? ';expires=' + (new Date((new Date()).getTime() + (expires * 1000))).toGMTString() : '') +
			(path? ';path=' + path : '') +
			(domain ? ';domain=' + domain : '') +
			(secure ? ';secure' : '');
	},
	get: function(name){
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1, c.length);
			if (c.indexOf(nameEQ) == 0) return unescape(c.substring(nameEQ.length, c.length));
		}
		return null;
	},
	remove: function(name) {
		this.set(name, '', (new Date((new Date()).getTime() + (-86400 * 1000))).toGMTString());
	}
};


SpeedTest = function(holder, options){
	if(!holder || (!holder.tagName && !(holder = document.getElementById(holder)))){return;}
	if(!options){options = {};}
	var pass = options.pass || 2;
	var size = options.size || 32764;
	var path = options.path || 'play/';
	var p = pass;
	var opass = pass;
	var step = 20;	// in milliseconds
	var gears = [0, 150, 750, 1500, 3000, 5000];	// in Kbps
	// attempts: 3   5    8    11    14    18
	var timer, speedArray = [], speed = 0, time = 0, gear = 1, seed = 999999999, percent = 0;
	var y = function(){
		timer = setInterval(function(){
			time += step;
		}, step);
		var per = Math.floor((pass - p + 1)/(pass + 1)*100);
		if(per > percent){
			percent = per;
		}
		var x = new Image();
		x.onload = z;
		x.src = path + size + '.png?pass=' + (pass - p + 1) + '&seed=' + Math.round(Math.random() * seed);
		var lines = holder.getElementsByTagName('div');
		for (var i=0; i<lines.length; i++) {
			var j = Math.floor(percent / 20);
			lines[i].className = lines[i].className.replace(' active', '');
			if (lines[i].className.indexOf(j) >= 0) {
				lines[i].className += ' active';
			}
		}
		holder.onclick = null;
	};
	var z = function(){
		clearInterval(timer);
		speed = Math.floor(size * 8 * (pass - p + 1) / time);
		speedArray.push(speed);
		var again = function(){
			time = 0;
			percent = 0;
			gear = 1;
			p = pass = opass;
			y();
		};
		if(p){
			p--;
			if(gear == 1 && speed > gears[gear]){
				p += 2;
				pass += 2;
				gear++;
			}
			else if(gear == 2 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 3 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 4 && speed > gears[gear]){
				p += 3;
				pass += 3;
				gear++;
			}
			else if(gear == 5 && speed > gears[gear]){
				p += 4;
				pass += 4;
				gear = 0;
			}
			y();
		}
		else if(speedArray.length){
			var all = 0;
			for(var i=0; i<speedArray.length; i++){
				all += speedArray[i];
			}
			var finalSpeed = Math.floor(all/speedArray.length);
			if (typeof options.onReady == 'function') {
				options.onReady.call(window, finalSpeed);
			}
			var j = 0;
			var js = [32, 128, 256, 512, 1024];
			for (var i=0; i<js.length; i++) {
				if (finalSpeed > js[i]) {
					j++;
				}
				else {
					break;
				}
			}
			var lines = holder.getElementsByTagName('div');
			for (var i=0; i<lines.length; i++) {
				lines[i].className = lines[i].className.replace(' active', '');
				for (var k=0; k<=j; k++){
					if (lines[i].className.indexOf(k) >= 0) {
						lines[i].className += ' active';
					}
				}
			}
			if (finalSpeed < 32) {
				help(lang.help32k);
			}
			else if (finalSpeed < 128) {
				help(lang.help128k);
			}
			holder.title = lang.speed +': '+ (finalSpeed / 1024).toString().substring(0, 3) +' '+ lang.speedMbps;
			holder.onclick = again;
		}
	};
	y();
};

skin = function(name){
	var logo = document.getElementById('logo');
	var stripe = document.getElementById('stripe');
	switch (name) {
		case 'oldschool':
			stripe.className = 'stripe_oldschool';
			logo.className = 'logo_gold';
			cookies.set('skin', 'oldschool', cookieLifetime);
		break;
		case 'winter':
			stripe.className = 'stripe_winter';
			logo.className = 'logo_grey';
			cookies.set('skin', 'winter', cookieLifetime);
		break;
		case 'mountain':
			stripe.className = 'stripe_mountain';
			logo.className = 'logo_grey';
			cookies.set('skin', 'mountain', cookieLifetime);
		break;
		case 'jiraffe':
			stripe.className = 'stripe_jiraffe';
			logo.className = 'logo_yellow';
			cookies.set('skin', 'mountain', cookieLifetime);
		break;
		default:
			stripe.className = 'stripe_classic';
			logo.className = 'logo_red';
			cookies.set('skin', 'default', cookieLifetime);
		break;
	}
};

stat = function(speed){
	cookies.set('speedtest', (new Date()).getTime());
	var stat = {};
	stat.browser = navigator.userAgent;
	var modules = [];
	for (var i in radiolla.uniplayer.modules) {
		modules.push(radiolla.uniplayer.modules[i].name +':'+ (radiolla.uniplayer.modules[i].present?'on':'off'));
	}
	stat.modules = modules.join(', ');
	stat.module_current = radiolla.uniplayer.current.module.name;
	stat.screen_width = screen.width;
	stat.screen_height = screen.height;
	stat.skin = skinName;
	stat.lang = language;
	stat.referrer = document.referrer || '';
	stat.speed = speed;
	var params = [];
	for (var i in stat) {
		params.push(i + '=' + escape(stat[i]));
	}
	radiolla.loader.load(radiolla.statURL + '?' + params.join('&'));
};

facebookLanguageCodes = {
	de: 'de_DE',
	da: 'da_DK',
	el: 'el_GR',
	en: 'en_GB',
	es: 'es_ES',
	fi: 'fi_FI',
	fr: 'fr_FR',
	it: 'it_IT',
	ja: 'ja_JP',
	nl: 'nl_NL',
	pl: 'pl_PL',
	pt: 'pt_PT',
	ru: 'ru_RU',
	tr: 'tr_TR',
	uk: 'uk_UA',
	zh: 'zh_CN'
};

var tabs = {
	names: ['events', 'about', 'podcast', 'howto'],
	init: function() {
		if (!document.getElementById('tabs')) return;
		var names = this.names, tabSelected = false, loaded = this.loaded;
		for (i=0; i<names.length; i++) {
			if (document.getElementById('tabsw-' + names[i])) {
				document.getElementById('tabsw-' + names[i]).onclick = (function(n) {
					return function() {
						for (j=0; j<names.length; j++) {
							if (document.getElementById('tab-' + names[j])) {
								document.getElementById('tab-' + names[j]).style.visibility = names[j] == n ? 'visible' : 'hidden';
							}
							if (document.getElementById('tabsw-' + names[j])) {
								document.getElementById('tabsw-' + names[j]).className = names[j] == n ? 'active' : '';
							}
							if (names[j] == n && typeof loaded[n] == 'function') {
								loaded[n].call(window, n);
								loaded[n] = null;
							}
						}
					};
				})(names[i]);
			}
			if (location.hash.indexOf('#' + names[i]) >= 0) {
				//scrollTo(0, document.getElementById('stripe').offsetHeight + document.getElementById('header').offsetHeight);
				document.getElementById('tabsw-' + (names[i] == 'howto' ? 'about' : names[i])).onclick();
				tabSelected = true;
			}
		}
		if (!tabSelected) {
			document.getElementById('tabsw-events').onclick();
		}
	},
	onload: function(name, callback){
		this.loaded[name] = callback;
	},
	loaded: {}
};


loadEvents = function(holder, location, lat, long) {
	var loc, key = '329270164f29ace5ca2d4be1c9048efb', distance = 500, loadSecondPage = false;
	var yqlUrl = (document.location.protocol == 'https:' ? 'https' : 'http') + '://query.yahooapis.com/v1/public/yql';
	var url = 'http://ws.audioscrobbler.com/2.0/?method=geo.getevents&api_key=' + key;
	if (location) {
		url += '&location=' + encodeURIComponent(location);
	}
	else if (loc = cookies.get('location')) {
		loc = unescape(loc);
		url += '&location=' + encodeURIComponent(loc);
	}
	else if (lat && long) {
		url += '&lat=' + lat + '&long=' + long;
		url += '&distance=' + distance;
	}
	else if (lang.latitude && lang.longitude) {
		url += '&lat=' + lang.latitude + '&long=' + lang.longitude;
		url += '&distance=' + distance;
	}
	else {
		return;
	}
	holder.addClass('loading').html('');
	var addEvents = function(data) {
		var e, d, l, li, mins, hours, ul = '';
		if (data.query && data.query.results && data.query.results.lfm.status == 'ok') {
			e = data.query.results.lfm.events.event;
			if (!(e instanceof Array)) e = [e];
			for (var i=0; i<e.length; i++) {
				li = '<li>';
				d = new Date(Date.parse(e[i].startDate));
				mins = d.getMinutes();
				hours = d.getHours();
				li += '<a class="titleHolder" href="' + e[i].url + '"><span class="dateHolder"><span class="date">' + d.getDate() + '/' + (d.getMonth()+1) + '</span><br/><span class="time">' + (hours < 10 ? '0'+hours : hours) + ':' + (mins < 10 ? '0'+mins : mins) + '</span></span>';
				li += e[i].image[1].content ? '<img src="' + e[i].image[1].content + '" alt="" />' : '';
				li += '<span class="title">' + e[i].title + '</span><br/>';
				li += '<span class="venue">' + e[i].venue.name + '</span></a>';
				ul += li + '</li>';
			}
		}
		else {
			ul = '<li class="info">' + lang.noEvents + '</li>';
		}
		holder.removeClass('loading').append(ul);
		$('h5.eventsHead input').val(location || loc || lang.city);
		if (!$('h5.eventsHead input').hasClass('event')) {
			$('h5.eventsHead input').addClass('event').keypress(function(e){
				if (e.keyCode == 13 || e.which == 13) {
					l = $(this).val();
					cookies.set('location', l, cookieLifetime);
					loadEvents(holder, l);
				}
			});
		}
	};
	$.ajax({url: yqlUrl + '?q=select%20*%20from%20xml%20where%20url%3D%22'+encodeURIComponent(url)+'%22&format=json', success: function(data) {
		addEvents(data);
		if (loadSecondPage && data.query && data.query.results && data.query.results.lfm.status == 'ok') {
			url += '&page=2';
			$.ajax({url: yqlUrl + '?q=select%20*%20from%20xml%20where%20url%3D%22'+encodeURIComponent(url)+'%22&format=json', success: addEvents});
		}
	}});
};

loadArtist = function(selector, track, lang, force) {
	var key = '329270164f29ace5ca2d4be1c9048efb', trim = 350;
	var yqlUrl = (document.location.protocol == 'https:' ? 'https' : 'http') + '://query.yahooapis.com/v1/public/yql';
	var url = 'http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&api_key=' + key;
	var albumUrl = 'http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=' + key;
	if (typeof track != 'object' || !track.artist) return;
	if (radiolla.infoTrackId && (radiolla.infoTrackId == track.id) && !force) return;
	radiolla.infoTrackId = track.id;
	if (!lang) {
		lang = window.language;
	}
	// correct lang for some countries cause last.fm non-standard abbreviations or absent
	if (lang == 'ja') lang = 'jp';
	if (lang == 'uk') lang = 'ru';
	if (lang == 'nl') lang = 'en';
	if (lang == 'fi') lang = 'en';
	if (lang == 'da') lang = 'en';
	if (lang == 'el') lang = 'en';
	url += '&artist=' + encodeURIComponent(track.artist);
	url += '&lang=' + lang;
	url += '&autocorrect=1';
	albumUrl += '&artist=' + encodeURIComponent(track.artist) + '&album=' + encodeURIComponent(track.album);
	albumUrl += '&lang=' + lang;
	albumUrl += '&autocorrect=1';
	var stripTags = function(html) {
		var tmp = document.createElement('DIV');
		tmp.innerHTML = html;
		return tmp.textContent || tmp.innerText;
	}
	var draw = function(data) {
		var skip = false, html = '', desc = '', spaceIndex, artistImg, albumImg, artistImgSrc = 'style/img/no-image.png', albumImgSrc = '', description = window.lang.noArtistInfo;
		var build  = function() {
			if (albumImgSrc) {
				var albumImgSize = normalSize(albumImg);
			}
			var artistImgSize = normalSize(artistImg);
			var height = albumImgSrc ? albumImgSize.height : artistImgSize.height;
			html += '<a href="http://www.last.fm/music/' +track.artist+ '"><span class="artistInfoImage"><img src="' + artistImgSrc + '" width="' + artistImgSize.width + '" height="' + artistImgSize.height + '" alt="' + track.artist + '" title="' + track.artist + '"' + (albumImgSrc ? ' style="display:none;"' : '') + ' />' + (albumImgSrc ? '<img src="' + albumImgSrc + '" width="' + albumImgSize.width + '" height="' + albumImgSize.height + '" alt="' + track.artist + '" title="' + track.artist + '" />' : '') + '</span>';
			html += '<span class="artistInfoText"><span class="artistInfoTitle"><span class="artistInfoName">' + track.artist + '</span> - ' + track.title + ' <small>(' + track.album + ' ' + track.year + ')</small></span>';
			html += '<span class="artistInfoDescription">' + description + '</span></span></a>';
			html += '<span class="clear"></span>';
			$(selector).find('.artistInfoHolder').html(html);
			var h = $(selector).find('.artistInfoText').height();
			if (height > h) {h = height;}
			h += $(selector).find('.clear').outerHeight();
			$(selector).animate({height: h}, 500, 'swing');
		};
		var normalSize = function(img) {
			var out = {
				width: img.width,
				height: img.height
			};
			if (img.width != 64) {
				var k = 64 / img.width;
				out.width = parseInt(img.width * k);
				out.height = parseInt(img.height * k);
			}
			return out;
		};
		var loadImages = function() {
			artistImg = new Image();
			artistImg.onload = function() {
				if (albumImgSrc){
					albumImg = new Image();
					albumImg.onload = function() {
						build();
						$(selector).hover(function() {
							$(selector).find('.artistInfoImage img:first').fadeIn();
							$(selector).find('.artistInfoImage img:last').fadeOut();
						}, function() {
							$(selector).find('.artistInfoImage img:first').fadeOut();
							$(selector).find('.artistInfoImage img:last').fadeIn();
						});
					};
					albumImg.src = albumImgSrc;
				}
				else {
					build();
					$(selector).unbind('mouseenter mouseleave');
				}
			};
			artistImg.src = artistImgSrc;
		};
		if (
			data.query
			&& data.query.results
			&& data.query.results.lfm.status == 'ok'
			&& data.query.results.lfm.artist
		) {
			if (
				data.query.results.lfm.artist.bio
				&& data.query.results.lfm.artist.bio.summary
			) {
				description = stripTags(data.query.results.lfm.artist.bio.summary);
				desc = description.substr(0, trim);
				if (description.length > desc.length) {
					spaceIndex = desc.lastIndexOf(' ');
					desc = desc.substr(0, spaceIndex);
					description = desc.replace(/[\s\,\.\-\—\:\;\`\~\"\'\«\(\@\#\$\^\&\/\\\=\+\<\>\[]+$/, '') + '...';
				}
			}
			else if (lang != 'en') {
				skip = true;
				loadArtist(selector, track, 'en', true);
			}
		}
		if (!skip) {
			if (
				data.query.results.lfm.artist.image
				&& data.query.results.lfm.artist.image[1]
				&& data.query.results.lfm.artist.image[1].content
			) {
				artistImgSrc = data.query.results.lfm.artist.image[1].content;
			}
			$.ajax({url: yqlUrl + '?q=select%20*%20from%20xml%20where%20url%3D%22'+encodeURIComponent(albumUrl)+'%22&format=json', success: function(data) {
				if (
					data.query
					&& data.query.results
					&& data.query.results.lfm.status == 'ok'
					&& data.query.results.lfm.album
					&& data.query.results.lfm.album.image
					&& data.query.results.lfm.album.image[1]
					&& data.query.results.lfm.album.image[1].content
				) {
					albumImgSrc = data.query.results.lfm.album.image[1].content;
				}
				loadImages();
			}});
		}
	};
	$.ajax({url: yqlUrl + '?q=select%20*%20from%20xml%20where%20url%3D%22'+encodeURIComponent(url)+'%22&format=json', success: draw});
};

loadAnalytics = function() {
	aloader.load((("https:" == document.location.protocol) ? "https://ssl." : "http://www.") + 'google-analytics.com/ga.js', function() {
		try {
			window.pageTracker = _gat._getTracker("UA-15074642-1");
			//var pageTracker = {_trackEvent: function(){console.log(arguments)},_trackPageview: function(){console.log(arguments)}};	// fake tracker for tests
			// track this page
			pageTracker._trackPageview(location.pathname + location.hash);
			// track all links
			$('a').live('click', function() {
				// track flattr
				if (this.className == 'flattr') {
					pageTracker._trackEvent('Donate', 'Click', 'Flattr');
				}
				else if (this.href.indexOf('javascript:') == 0) {
					if (this.className.indexOf('upGUIButtonPlay') >= 0) {
						pageTracker._trackEvent('Player', 'Play', 'Big');
					}
					else if (this.className.indexOf('play-small') >= 0) {
						pageTracker._trackEvent('Player', 'Play', 'Small');
					}
					else if (this.className.indexOf('upGUIButtonStop') >= 0) {
						pageTracker._trackEvent('Player', 'Stop');
					}
					else if (this.className.indexOf('upGUIPointer') >= 0) {
						pageTracker._trackEvent('Player', 'Volume');
					}
					else if (this.className.indexOf('r32k') >= 0) {
						pageTracker._trackEvent('Player', 'Play', 'Bitrate', parseInt(this.className.replace(/^r/, '')));
					}
					else if (this.className.indexOf('r128k') >= 0) {
						pageTracker._trackEvent('Player', 'Play', 'Bitrate', parseInt(this.className.replace(/^r/, '')));
					}
					else if (this.className.indexOf('r192k') >= 0) {
						pageTracker._trackEvent('Player', 'Play', 'Bitrate', parseInt(this.className.replace(/^r/, '')));
					}
					else if (this.id == 'question') {
						pageTracker._trackEvent('Player', 'Help');
					}
					else if (this.parentNode.parentNode.parentNode.id == 'langswitcher' && this.parentNode.parentNode.parentNode.className.indexOf('open') >= 0 && this.className.indexOf('current') >= 0) {
						pageTracker._trackEvent('Language', 'Open');
					}
					else if (this.className.indexOf('classic') >= 0) {
						pageTracker._trackEvent('Site', 'Skin', 'Classic');
					}
					else if (this.className.indexOf('winter') >= 0) {
						pageTracker._trackEvent('Site', 'Skin', 'Winter');
					}
					else if (this.className.indexOf('mountain') >= 0) {
						pageTracker._trackEvent('Site', 'Skin', 'Mountain');
					}
					else if (this.className.indexOf('oldschool') >= 0) {
						pageTracker._trackEvent('Site', 'Skin', 'Oldschool');
					}
					else {
						//if (console&&console.log) console.log('event: ' + '/' + this.href + ', id: ' + this.id + ', class: ' + this.className);
					}
				}
				// track mailto
				else if (this.href.indexOf('mailto:') == 0) {
					pageTracker._trackEvent('Site', 'Mailto', this.href.replace('mailto:', ''));
				}
				else {
					if (this.hostname.indexOf(location.hostname) >= 0) {
						if (this.parentNode.parentNode.parentNode.id == 'langswitcher') {
							pageTracker._trackEvent('Language', 'Choose', this.className);
						}
						else {
							pageTracker._trackPageview(this.pathname + this.hash);
						}
					}
					else {
						pageTracker._trackPageview('/ext/' + this.href);
					}
				}
			});
			// track paypal
			$('.support form input[name=submit]').click(function() {
				pageTracker._trackEvent('Donate', 'Click', 'Paypal');
			});
			// track logo clicks ;)
			$('#logo').click(function() {
				pageTracker._trackEvent('Site', 'Click', 'Logo');
			});
			// track button code field
			$('input.buttonCode').click(function() {
				pageTracker._trackEvent('Site', 'Click', 'Button Code');
			});
			// track events location field
			$('h5.eventsHead input.event').live('keypress', function(e){
				if (e.keyCode == 13 || e.which == 13) {
					pageTracker._trackEvent('Events', 'Location', $(this).val());
				}
			});
			// track player state
			radiolla.uniplayer.addEventListener('state', function(state){
				if(state == radiolla.uniplayer.states.playing){
					var match = radiolla.uniplayer.current.src.match(/(\d+)k\.mp3/);
					pageTracker._trackEvent('Player', 'Play', 'Real', match ? parseInt(match[1]) : 0);
				}
			});
		}
		catch(err) {}
	}, true);
};

UniplayerGUIRadiolla = function(player) {
	var lang = UniplayerLanguages[player.options.language];
	var HTMLControls =
		'<div id="speedtest" class="rSpeed" onclick="speedtest();" title="' +window.lang.speedTest+' '+window.lang.speed+ '"><div class="speed5"></div><div class="speed4"></div><div class="speed3"></div><div class="speed2"></div><div class="speed1"></div></div>'+
		'<div class="upGUIButtonSet"><a href="javascript:" class="upGUIButton upGUIButtonPlay" title="'+lang.controlsPlay+'"></a><a href="javascript:" class="upGUIButton upGUIButtonStop" title="'+lang.controlsStop+'"></a></div><div class="upGUIVolume"><div class="upGUISlider" title="'+lang.controlsVolume+'"><div class="upGUISliderTail"></div><a href="javascript:" class="upGUIButton upGUIPointer"></a></div></div>'+
		'<a class="r32k" href="javascript:" onclick="radiolla.uniplayer.load(\'http://91.197.128.79/' + window.lang.channel + '.32k.mp3\'); radiolla.uniplayer.play(); this.blur(); return false;"></a><a class="r128k" href="javascript:" onclick="radiolla.uniplayer.load(\'http://91.197.128.79/' + window.lang.channel + '.128k.mp3\'); radiolla.uniplayer.play(); this.blur(); return false;"><a class="r192k" href="javascript:" onclick="radiolla.uniplayer.load(\'http://91.197.128.79/' + window.lang.channel + '.192k.mp3\'); radiolla.uniplayer.play(); this.blur(); return false;"></a>';
	this.getHTML = function() {
		if(player.options.showControls || player.options.showSupply) {
			UniplayerUtils.loadCSS(player.options.guiPath + 'uniplayer.css');
		}
		return '<div class="upGUI"><div class="upGUIWrapper"><div class="upGUIMovie"></div><div class="upGUIControls" style="display: '+(player.options.showControls ? 'block' : 'none')+'">'+(player.options.showControls ? HTMLControls : '')+'</div></div></div>';
	};
};


Radiolla = function(conf) {
	if(!conf) {
		conf = {};
	}
	var self =	this;
	this.onReady = false;
	
	//-- settings
	this.updateURL = conf.updateURL || 'rpc/status?channel=' + lang.channel;
	this.historyURL = conf.historyURL || 'rpc/history?type=json&past=5&future=5&order=asc&channel=' + lang.channel;
	this.ratingURL = conf.ratingURL || 'rpc/rate?channel=' + lang.channel;
	this.statURL = conf.statURL || 'rpc/stat';
	this.likeURL = conf.likeURL || 'rpc/like';
	this.updateInterval = conf.updateInterval || 30;	//-- seconds, used if current track's length and time are undefined
	this.updateTimeout = conf.updateTimeout || 1;		//-- seconds, used with play and stop methods to get actual data after connect/disconnect the radio
	this.loader = conf.loader || aloader;
	this.uniplayer = conf.uniplayer || new Uniplayer({
			src: 'http://91.197.128.79/' + lang.channel + '.' + (cookies.get('bitrate') || '128') + 'k.mp3',
			mimetype: 'audio/mpeg',
			volume: cookies.get('volume')*1 || (window.isMobile ? 1 : .7),
			autoload: true,
			autoplay: typeof(conf.autoplay) != 'undefined' ? conf.autoplay : false,
			showSupply: false,
			background: '#000000',
			guiPath: 'style/',
			noCache: true,
			repeat: true,
			language: language
			//,logger: window.console
		});
	
	// uniplayer modules
	if (
		window.isMobile
		|| navigator.userAgent.indexOf('iPad') > -1
//		|| (navigator.userAgent.indexOf('Macintosh') > -1 && navigator.userAgent.indexOf('Safari') > -1 && navigator.userAgent.indexOf('Chrome') == -1)	// safari on mac
	) {
		this.uniplayer.addModule(new UniplayerHtml5);
	}
	else {
		this.uniplayer.addModule(new UniplayerFlashJWPlayer({swf: 'play/jwplayer.swf', flashvars: {bufferlength: 5}}));
	}
	if(navigator.userAgent.indexOf('MSIE') != -1) {
		this.uniplayer.addModule(new UniplayerWindowsMedia);
	}
	//this.uniplayer.addModule(new UniplayerVLC);	// change channel doesn't work
	this.uniplayer.write('listen', new UniplayerGUIRadiolla(this.uniplayer));
	
	this.tracksHistoryPast = conf.tracksHistoryPast || document.getElementById('tracksHistoryPast');	//-- should be an <ul> element
	this.tracksHistoryFuture = conf.tracksHistoryFuture || document.getElementById('tracksHistoryFuture');	//-- should be an <ul> element
	if (this.tracksHistoryPast && this.tracksHistoryFuture) {
		this.tracksHistoryPast.innerHTML = this.tracksHistoryFuture.innerHTML = '';	// remove empty <li> elements added to pass XHTML validation
	}
	this.historyPastSize = 5;
	this.historyFutureSize = 5;
	this.status = {
		title: '',
		time: 0,
		length: 0
	};
	
	//-- status updater
	this.updateStatus = function() {
		self.loader.load(self.updateURL + (self.updateURL.indexOf('?') < 0 ? '?' : '&') + 'seed=' + Math.floor(Math.random()*100000000), function() {
			if(!self.onReady) {
				self.onReady = true;
				if(typeof conf.onReady == 'function') {
					conf.onReady.call(self);
				}
			}
			var timeout = self.updateInterval;
			if(self.status.length - self.status.time > 0) {
				timeout = self.status.length - self.status.time + 1;
			}
			if(self.updater) {
				clearTimeout(self.updater);
			}
			self.updater = setTimeout(self.updateStatus, timeout * 1000);
			if(self.onStatusUpdate) {
				self.onStatusUpdate.call(self, self.status);
			}
		});
	};
	
	//-- playing indicator	
	var playingInterval = null;
	var playingIndicator = null;
	var playing = function(turn) {
			if(turn == 'on') {
				if(!playingIndicator) {
					playingIndicator = document.getElementById('playing');
				}
				if(playingInterval) {
		 			clearInterval(playingInterval);
		 		}
		 		playingInterval = setInterval(function() {playing();}, 500);
			}
			if(turn == 'off') {
				clearInterval(playingInterval);
				playingInterval = null;
			}
			if(playingIndicator) {
				if(turn == 'off' || playingIndicator.className.indexOf('active') >= 0) {
					playingIndicator.className = playingIndicator.className.replace(' active', '');
				}
				else{
					playingIndicator.className += ' active';
				}
			}
	};
	
	this.uniplayer.addEventListener('state', function(state) {
		setTimeout(self.updateStatus, self.updateTimeout*1500);
		if(state == self.uniplayer.states.stopped || state == self.uniplayer.states.failed) {
			if (state != self.uniplayer.states.failed) {
				cookies.set('play', 0, cookieLifetime);
			}
			playing('off');
		}
		else{
			cookies.set('play', 1, cookieLifetime);
			playing('on');
		}
	});
	
	this.uniplayer.addEventListener('src', function(src) {
		var k192 = UniplayerUtils.getElementsByClassName('r192k', 'a', self.uniplayer.holders.controls)[0];
		var k128 = UniplayerUtils.getElementsByClassName('r128k', 'a', self.uniplayer.holders.controls)[0];
		var k32 = UniplayerUtils.getElementsByClassName('r32k', 'a', self.uniplayer.holders.controls)[0];
		k192.className = k192.className.replace(' active', '');
		k128.className = k128.className.replace(' active', '');
		k32.className = k32.className.replace(' active', '');
		if (src.indexOf('192k.mp3') >= 0) {
			cookies.set('bitrate', 192, cookieLifetime);
			k192.className += ' active';
		}
		else if (src.indexOf('128k.mp3') >= 0) {
			cookies.set('bitrate', 128, cookieLifetime);
			k128.className += ' active';
		}
		else if (src.indexOf('32k.mp3') >= 0) {
			cookies.set('bitrate', 32, cookieLifetime);
			k32.className += ' active';
		}
	});
	
	this.uniplayer.addEventListener('volume', function(volume) {
		cookies.set('volume', volume, cookieLifetime);
	});
	
	this.rate = function(node, trackId, vote) {
		self.loader.load(this.ratingURL + '&track_id=' + trackId + '&vote=' + vote, function() {
			node.className += ' rated';
			node.parentNode.className += ' rated';
		});
		// decrease volume when user set "minus"
		if (vote == 'minus' && trackId == self.status.id && !(cookies.get('DontUseMinusVolume')*1)) {
			self.showMinusVolumeMessage();
			var trackVolumeChangeInterval = setInterval(function() {
				var v = self.uniplayer.volume;
				if (cookies.get('trackVolumeChange')*1 == 0) {
					cookies.set('trackVolumeChange', v(), cookieLifetime);
					cookies.set('trackVolumeId', trackId, cookieLifetime);
				}
				if (v() > .15) {
					v(v() - .05);
				}
				else {
					clearInterval(trackVolumeChangeInterval);
				}
			}, 150);
		}
	};
	
	//-- tracks history listing
	this.toTracksHistory = function(data, future) {
		var tracksHistory = future ? this.tracksHistoryFuture : this.tracksHistoryPast;
		if(!tracksHistory) {return;}
		var dataId = data.id;
		if((tracksHistory.childNodes.length && dataId != tracksHistory.lastChild.rel) || !tracksHistory.childNodes.length) {
			// create new tracklist item
			var historyItem = document.createElement('li');
			var titleItem = document.createElement('span');
			var ratingItem = null;
			if (!future || data.plus > 0 /*|| data.minus > 0*/) {												// enable minus to be ckicked again
				ratingItem = document.createElement('span');
				var plusItem = document.createElement('span');
				var minusItem = document.createElement('span');
				ratingItem.className = 'historyRating' + (data.plus > 0 /*|| data.minus > 0*/ ? ' rated' : '');	// enable minus to be ckicked again
				plusItem.className = 'plus' + (data.plus > 0 ? ' rated' : '');
				plusItem.title = lang.plus;
				minusItem.className = 'minus';// + (data.minus > 0 ? ' rated' : '');							// enable minus to be ckicked again
				minusItem.title = lang.minus;
				ratingItem.appendChild(plusItem);
				ratingItem.appendChild(minusItem);
				if (data.plus < 1 /*&& data.minus < 1*/) {														// enable minus to be ckicked again
					plusItem.onclick = function() {
						self.rate(this, dataId, 'plus');
						plusItem.onclick = null;
						minusItem.onclick = null;
					};
					minusItem.onclick = function() {
						self.rate(this, dataId, 'minus');
						plusItem.onclick = null;
						minusItem.onclick = null;
					};
				}
			}
			historyItem.rel = dataId;
			if (data.played) {
				var playedItem = document.createElement('span');
				playedItem.className = 'historyPlayed';
				var playedDate = new Date(data.played*1000);
				var playedHours = playedDate.getHours();
				var playedMinutes = playedDate.getMinutes();
				playedItem.innerHTML = (playedHours > 9 ? playedHours : '0' + playedHours) +':'+ (playedMinutes > 9 ? playedMinutes : '0' + playedMinutes) + ' ';
				titleItem.appendChild(playedItem);
			}
			titleItem.innerHTML += this.combineTitle(data);
			titleItem.className = 'title';
			if (ratingItem) {
				titleItem.appendChild(ratingItem);
			}
			historyItem.appendChild(titleItem);
			// remove outsider
			if(tracksHistory.childNodes.length >= (future ? this.historyFutureSize : this.historyPastSize)) {
				if (!window.isMobile && typeof jQuery == 'function') {
					$(tracksHistory.firstChild).css('min-height', 0).slideUp(400, function() {
						tracksHistory.removeChild(tracksHistory.firstChild);
					});
				}
				else {
					tracksHistory.removeChild(tracksHistory.firstChild);
				}
			}
			// append item
			historyItem.style.display = 'none';
			tracksHistory.appendChild(historyItem);
			if (navigator.userAgent.indexOf('MSIE') == -1 && !window.isMobile && typeof jQuery == 'function') {
				$(historyItem).slideDown(400);
			}
			historyItem.style.display = 'block';
			// highlight current item in IE
			if (!future && navigator.userAgent.indexOf('MSIE') > -1) {
				var lis = historyItem.parentNode.getElementsByTagName('LI');
				for (var i=0; i<lis.length; i++) {
					lis[i].className = (i != lis.length - 1) ? '' : 'last-child';
				}
			}
		}
	};
	
	//-- combine title
	this.combineTitle = function(data) {
		if (!data.id) {return '';}
		var title = ('<a href="http://www.last.fm/music/' +data.artist+ '" title="' +(lang.readOnLastfm.replace('%artist%', data.artist))+ '">' +data.artist+ '</a>') + '&nbsp;&nbsp;-&nbsp;&nbsp;<span class="trackTitle">' + data.title + '</span>';
		if(data.album && data.year != '0000') {
			title += ' <small>(' + data.album + ' ' + data.year + ')</small>';
		}
		else if(data.album) {
			title += ' <small>(' + data.album + ')</small>';
		}
		else if(data.year != '0000') {
			title += ' <small>(' + data.year + ')</small>';
		}
		return title;
	};
	
	this.showCountries = function(countries) {
		if (window.isMobile) return;
		var holder = document.getElementById('countries'), str = '';
		if (!holder) return;
		for (var i=0; i<countries.length; i++) {
			if (countries[i]) {
				str += '<img src="style/countries/'+ countries[i][0] +'.png" alt="'+ countries[i][1] +'" title="'+ countries[i][1] +'" width="' + (countries[i][0] == 'ch' ? '11' : '16') + '" height="11" />';
			}
		}
		if (str) {
			holder.innerHTML = lang.nowListen + '&nbsp;' + str;
		}
	};

	//-- update status event
	this.onStatusUpdate = function(status) {
		var lastfmArtistLink = true;
		document.title = lang.docTitle.replace('%artist%', status.artist).replace('%title%', status.title);
		loadArtist('#artistInfo', status);
		var h = document.getElementById('historyLinkTitle');
		if (h) h.title = status.listeners;
		self.toTracksHistory(status);
		if (status.next) {
			self.toTracksHistory(status.next, true);
		}
		self.showCountries(status.countries);
		if (window.mapapp) {
			mapapp.call('refreshData','rpc/geo?channel=' + lang.channel + '&');		// & is a fix for cacheKiller buggy param
		}
		// new track, return volume to previous setting if it was changed by "minus" rating
		if (cookies.get('trackVolumeChange')*1 != 0 && cookies.get('trackVolumeId') && cookies.get('trackVolumeId') != status.id) {
			setTimeout(function() {
				var trackVolumeChangeInterval = setInterval(function() {
					var v = self.uniplayer.volume;
					if (v() < cookies.get('trackVolumeChange')*1) {
						v(v() + .05);
					}
					else {
						clearInterval(trackVolumeChangeInterval);
						cookies.set('trackVolumeChange', 0, cookieLifetime);
						cookies.set('trackVolumeId', 0, cookieLifetime);
					}
				}, 150);
			}, 3000);
		}
	};

	//-- connect keyboard
	document.onkeypress = function(e) {
		var keynum = 0;
		if(window.event) {
			keynum = window.event.keyCode;
		}
		else if(e.which) {
			keynum = e.which;
		}
		if(keynum == 32) {	// space
			var target = e ? e.target : (window.event ? window.event.srcElement : null);
			if (target && (target.tagName == 'INPUT' || target.tagName == 'TEXTAREA')) {
				return true;
			}
			if(radiolla.uniplayer.current.state == radiolla.uniplayer.states.stopped) {
				radiolla.uniplayer.load('http://91.197.128.79/' + lang.channel + '.256k.mp3');
				radiolla.uniplayer.play();
				cookies.set('bitrate', 256, cookieLifetime);
			}
			else{
				radiolla.uniplayer.stop();
			}
			return false;
		}
		else{
			return true;
		}
	};
	
	this.historyLoaded = function() {
		if (self.tracksHistoryFuture) self.tracksHistoryFuture.style.display = 'block';
		var n = document.getElementById('nextTitle');
		if (n) n.style.display = 'block';
		var h = document.getElementById('historyLinkTitle');
		if (h) h.style.display = 'block';
		var l = document.getElementById('nextTitle');
		if (l) l.innerHTML = l.title;	// replace 'loading...' with 'next #'
	};
	
	//-- load history
	this.loader.load(this.historyURL, this.historyLoaded);

	this.showMinusVolumeMessage = function() {
		if (!(cookies.get('DontShowMinusVolumeMessage')*1)) {
			document.getElementById('minusVolumeMessage').style.display = 'block';
		}
	};

	this.hideMinusVolumeMessage = function(remember, like) {
		if (like) {
			var what = 'MinusVolume';
			self.loader.load(self.likeURL + '?what=' + what + '&really=' + like);
			if (like == 'no') {
				// new track, return volume to previous setting if it was changed by "minus" rating
				if (cookies.get('trackVolumeChange')*1 != 0) {
					var trackVolumeChangeInterval = setInterval(function() {
						var v = self.uniplayer.volume;
						if (v() < cookies.get('trackVolumeChange')*1) {
							v(v() + .05);
						}
						else {
							clearInterval(trackVolumeChangeInterval);
							cookies.set('trackVolumeChange', 0, cookieLifetime);
							cookies.set('trackVolumeId', 0, cookieLifetime);
						}
					}, 100);
				}
			}
		}
		if (remember) {
			cookies.set('DontUseMinusVolume', like == 'yes' ? 0 : 1, cookieLifetime);
			cookies.set('DontShowMinusVolumeMessage', 1, cookieLifetime);
		}
		document.getElementById('minusVolumeMessage').style.display = 'none';
	};

};

// mobile
if (window.isMobile) {
	window.scrollTo(0, 1);
	var setSize = function() {
		var w = window.innerWidth;
		var b = document.getElementsByTagName('BODY')[0];
		var s = [320, 640, 720];
		if (w <= s[2] && w > s[1]) {
			b.className = 'mobile l';
		}
		else if (w <= s[1] && w > s[0]) {
			b.className = 'mobile m';
		}
		else if (w <= s[0]) {
			b.className = 'mobile s';
		}
		else {
			b.className = 'mobile';
		}
	};
	setSize();
	window.onresize = setSize;
}


// channel button
$('.channels a.' + lang.channel).addClass('active');
$('.channels a').click(function() {
	this.href += location.hash;
});


// skin
if (!window.isMobile) {
	/*if (lang.channel == 'radiolla') {
		skinName = cookies.get('skin') || 'classic';
	}
	else {*/
		switch(lang.channel) {
			case 'jiraffe':
				skinName = 'jiraffe';
			break;
			case 'volta':
				skinName = 'winter';
			break;
			case 'equalyza':
				skinName = 'classic';
			break;
			case 'mantra':
				skinName = 'mountain';
			break;
			default:
				skinName = 'oldschool';
			break;
		}
	//}
	skin(skinName);
}

// help
showhelp = function(str) {
	var h = document.getElementById('help');
	var c = document.getElementById('helpContent');
	if (h.className.indexOf(' active') >= 0) {
		h.className = h.className.replace(' active', '');
	}
	else {
		h.className += ' active';
		if (str) {
			help_content = c.innerHTML;
			c.innerHTML = str;
		}
		else if (typeof help_content != 'undefined') {
			c.innerHTML = help_content;
		}
	}
};


// language selector
showlang = function(name) {
	var l=document.getElementById('langswitcher');
	if (l.className.indexOf('open') != -1) {
		l.className = l.className.replace(' open', '');
	}
	else {
		l.className += ' open';
	}
};

if (document.getElementById('langswitcher')) {
	langLinks = document.getElementById('langswitcher').getElementsByTagName('a');
	for (var i=0; i<langLinks.length; i++) {
		if (langLinks[i].className.indexOf('current') >= 0) {continue;}
		langLinks[i].onclick = function() {
			var c = lang.channel != 'radiolla' ? '?' + lang.channel : '';
			location.href = this.href + c + (location.search.indexOf('facebook') > -1 ? ((c ? '&' : '?') + 'facebook') : '') + (location.hash.length > 1 ? location.hash : '');
			return false;
		};
	}
}

// speedtest
speedtest = function() {
	new SpeedTest('speedtest', {onReady: window.isMobile ? null : stat});
};


// radiolla player
radiolla = new Radiolla({
	autoplay: window.isMobile ? false : (cookies.get('play') > 0),
	onReady: function() {
		if (!window.isMobile) {
			var lastTest = cookies.get('speedtest');
			if (!lastTest || (lastTest - (new Date()).getTime() > 60)) {
				//speedtest();  - disable speedtest
			}
		}
	}
});


// Firefox 3.6 feels BAD
ff = navigator.userAgent.match(/Firefox\/(\d)\.(\d)/);
if (
	//navigator.userAgent.match(/Windows/) && 
	ff && ff[1] == 3 && ff[2] == 6
	) {
	//showhelp(lang.firefox36);
	radiolla.uniplayer.holders.movie.style.position = 'relative';
	radiolla.uniplayer.options.flashReloadPage = true;
}


loadFacebook = function() {
	if (window.fbAsyncInit) return;
	window.fbAsyncInit = function() {
		FB.init({appId: lang.fbAppId, status: false, cookie: false, xfbml: true});
	};
	aloader.load((document.location.protocol == 'https:' ? 'https' : 'http') + '://connect.facebook.net/' +facebookLanguageCodes[language]+ '/all.js#xfbml=1', null, true, document.getElementById('fb-root'));
};


loadMapapp = function() {
	aloader.load([
		'play/mapapp/JavaScriptFlashGateway.js',
		'play/mapapp/Exception.js',
		'play/mapapp/FlashTag.js',
		'play/mapapp/FlashSerializer.js',
		'play/mapapp/FlashProxy.js'
	], function(){
		var uid = new Date().getTime();
		var flashProxy = new FlashProxy(uid, 'play/mapapp/JavaScriptFlashGateway.swf');
	    var tag = new FlashTag('play/mapapp/world.swf?data_file=rpc/geo?channel=' + lang.channel, 1000, 550);
	    tag.setFlashvars('lcId='+uid);
	    tag.write(document.getElementById('mapappHolder'));
	    window.mapapp = flashProxy;
	});
};


if (!window.isMobile) {
	//-- podcast
	tabs.onload('podcast', function(n) {
		/*-- show announce on Mondays
		if ((new Date()).getDay() == 1) {
			showhelp(lang.podcastAnnounce);
		}
		var time1 = (new Date(1280772000000)).getHours();
		var time2 = (new Date(1280826000000)).getHours();
		$('span.time1').html(time1);
		$('span.time2').html(time2);*/
		var podcastNumber = 0;
		if (location.hash.indexOf('#podcast') >= 0) {
			var p = location.hash.split('/');
			if (p.length > 1) {
				podcastNumber = parseInt(p[1]);
			}
		}
		aloader.load('rpc/podcast' + (podcastNumber ? ('?number=' + podcastNumber + '&') : '?') + 'language=' + language, null, true);
	});
	tabs.onload('events', function(n) {
		//-- recently added
		aloader.load('rpc/fresh?channel=' + lang.channel);
		//-- facebook comments
		loadFacebook();
		//-- events
		loadEvents($('#eventsList'));
		loadMapapp();
	});
	if (location.search.indexOf('facebook') > -1) {
		loadFacebook();
	}
	//-- load facebook in Safari (& chrome) because of unexpected bug
	//if (navigator.userAgent.match(/Safari/)/* && !navigator.userAgent.match(/Chrome/)*/) {
	//	loadFacebook();
	//}
}

tabs.init();

loadAnalytics();
