var config = { // global variable
	fn: new fns(), // base functions
	player: new Player(), // player object
	is: { // is uses
		video: false,
		logged: false,
		json: typeof JSON === 'object' ? true : false, // is browser support JSON
		ie: $.browser.msie ? $.browser.version.substr(0, 1) : false, //IE browser detection
		storage: typeof localStorage === 'object' ? true : false, // is browser support localStorage
		fSetting: false // is the first setting popup load
	},
	selecters: { // objects
		busy: '#kp_jBusy',
		body: '#kp_Body',
		navigation: '#kp_Nav_Ul a',
		ad: ['#kp_AdWrapper', '#kp_WidgetAd'],
		scroll: '#kp_BodyLeftWrapper',
		container: '#kp_BodyLeftContainer',
		contentlist: '#kp_bodyLeftList',
		contentlistTMP: '#kp_bodyLeftList_TMP',
		contentlistMovieTMP: '#kp_bodyLeftListMovie_TMP',
		setting: {
			imageBusy: '#uploadBusy',
			bgList: '#kp_backgroundContainer'
		},
		search: {
			form: '#kp_SearchForm',
			wrapper: '#kp_Search',
			keyword: '#kp_SearchKeyword'
		},
		widget: '[rel=widget]',
		player: {
			li: '#player_%i',
			screen: ['#kp_WidgetVideo', '#kp_PlayerWrapper', 'kp_WidgetClose'],
			widget: '[rel=player]',
			data: '#playerData_%i',
			volume: ['#playerVolume_%i', '[id^=playerVolume]'],
			loadbar: 'kp_ItemWidgetPreloadbar_%i',
			seekbar: 'kp_ItemWidgetSeekbar_%i',
			play: '#kp_ItemWidgetPlay_%i'
		}
	},
	play: {
		li: null,
		data: null
	},
	index: null // index player
};

/**
 * $ start
 */
$(document).ready(function(){
	/**
	 * load config
	 */
	$.getScript(config.path + 'public/core/swfobject.js', function(){
		var SWFJWPlayer = new SWFObject(config.path+'public/core/jwplayer/player.swf','JWPlayer','800','450','9');
			SWFJWPlayer.addVariable('menu','false');
			SWFJWPlayer.addVariable('icons','false');
			SWFJWPlayer.addVariable('controlbar','over');
			SWFJWPlayer.addVariable('file','http://content.longtailvideo.com/videos/bunny.mov');
			SWFJWPlayer.addVariable('skin',config.path+'public/core/jwplayer/bekle.zip');
			SWFJWPlayer.addParam('menu','false');
			SWFJWPlayer.addParam('wmode','transparent');
			SWFJWPlayer.addParam('allowfullscreen','true');
			SWFJWPlayer.write('kp_JWPlayer');
		/**
		 * initialize site
		 */
		$.widgets.common.init();
	});
});

/**
 * all widgets
 * contain all method for all events
 */
$.widgets = {
	common: {
		init: function(){
			/**
			 * change style of input file upload
			 */
			$('input[type=file]').jFile();

			/**
			 * search events
			 */
			config.selecters.search.form = $( config.selecters.search.form );
			config.selecters.search.wrapper = $( config.selecters.search.wrapper );
			config.selecters.search.keyword = $( config.selecters.search.keyword ).focusin(function(){
				if(this.value == config.transition.search)
					this.value = '';
				config.selecters.search.wrapper.addClass('kp_SearchFocus');
			}).focusout(function(){
				if(this.value == '')
					this.value = config.transition.search;
				config.selecters.search.wrapper.removeClass('kp_SearchFocus');
			});
			config.selecters.search.form.submit(function(){
				var keyword = config.selecters.search.keyword.val();
				if(keyword === '' || keyword === config.transition.search)
					return false;
				// do action
				$.widgets.common.find(keyword);
				return false;
			});

			/**
			 * toggle content
			 * @rev: config
			 * @rel: selected
			 */
			$('[rel=toggle]').bind('click.toggle', function(){
				var self = $( this ) ,
					item = config.fn.evals( self.attr('rev') ),
					object = $( item.selecter ),
					height = object.height();
				if(height === 0) {
					if(item.height === null)
						item.height = object.data('height');
					object.animate({ height: item.height }, 500, function(){
						self.addClass( item.classes );
					}).data('height', height);
				} else {
					object.animate({ height: object.data('height') }, 500, function(){
						self.removeClass( item.classes );
					}).data('height', height);
				}
			});

			/**
			 * navigation events
			 */
			config.selecters.navigation = $( config.selecters.navigation ).bind('click.Navigation', $.widgets.navigation.click);

			/**
			 * player
			 */
			$( config.selecters.player.widget ).live('click.Play', $.widgets.player.click);

			/**
			 * widget menu events
			 */
			config.selecters.widget = $( config.selecters.widget ).bind('click.Menu', $.widgets.items.click);

			/**
			 * jScroll
			 */
			config.selecters.scroll = $(config.selecters.scroll).jScroll();

			var tooltips = {
					item: $('#kp_Tooltip')
				};
				tooltips.size = {
					width: tooltips.item.width(),
					height: tooltips.item.height()
				};
			$(config.selecters.contentlist + ' li:not(.empty)').live('mouseover', function(e){
				if(config.is.video) {
					var self = $(this),
						width = self.width(),
						offset = self.offset(),
						imageURL = self.attr('rev');
					tooltips.item.css({
						left: (width + offset.left),
						top: offset.top - (tooltips.size.height / 2 - 10)
					}).show().find('img').attr('src', imageURL);
				}
			}).live('mouseout', function(){
				tooltips.item.hide();
			});

			/**
			 * cache all selecters
			 */
			config.selecters.container = $(config.selecters.container);
			config.selecters.contentlist = $(config.selecters.contentlist);
			config.selecters.contentlistTMP = $(config.selecters.contentlistTMP);
			config.selecters.contentlistMovieTMP = $(config.selecters.contentlistMovieTMP);

			config.selecters.setting.bgList = $( config.selecters.setting.bgList );

			/**
			 * options
			 */
			$.widgets.setting.events.background.set(false, true);
			$.widgets.common.post({
				busy: true,
				url: config.path + 'page/islogged',
				fn: function(data){
					if(data.rep === 'ok') {
						config.is.logged = true;
					}
				}
			});
			// auto play first item in the list
			if($.widgets.setting.get('autoload') == 1)
				$( config.selecters.player.play.replace(/%i/gi, 0) ).trigger('click.Play');
			// advertising is hide
			var ad = $.widgets.setting.get('ad');
			if(ad === '0') {
				var adContent = $( config.selecters.ad[0] ),
					adContentHeight = adContent.height();
					adToggle = $( config.selecters.ad[1] ),
					adToggleData = config.fn.evals( adToggle.attr('rev') ),
					adToggleData.height = adContentHeight;
				adToggle.attr('rev', JSON.stringify (adToggleData ).replace(/"/gi, "'") ).removeClass('kp_WidgetClose');
				adContent.height(0);
			}
		},
		post: function(item){
			if(item.busy === true)
				$.widgets.common.busy();
			item.data = item.data || {};
			$.post(item.url, item.data, function(data){
				if(item.busy === true)
					$.widgets.common.busy(true);
				item.fn(data);
			}, 'json');
		},
		find: function(keyword){
			var item = {
				mp3: function(){
					var records = $.widgets.setting.get('records');
						config.records = !records ? config.records : records;
					var url = 'http://123.30.6.9:3761/Search.aspx?q=' + encodeURIComponent(keyword) +
							  '&num=' + config.records + '&f=0&r=0&start=0';
					this.fn = $.get;
					this.ajax(url, function(data){
						data = data.its;
						if(data === null) {
							alert('mp3 null');
							return;
						}
						$.widgets.template.render.call(
							config.selecters.contentlist,
							config.selecters.contentlistTMP, data, function(){
								config.selecters.scroll.jScroll();
							}
						);
					});
				},
				video: function(){
					var records = $.widgets.setting.get('records');
						config.records = !records ? config.records : records;
					var url = 'http://gdata.youtube.com/feeds/api/videos?v=2&q=' + encodeURIComponent(keyword) +
						  '&alt=json-in-script&callback=?&max-results=' + (config.records > 50 ? 50 : config.records) +
						  '&start-index=1&prettyprint=false';
					this.fn = $.getJSON;
					this.ajax(url, function(data){
						data = data.feed.entry;
						if(typeof data === 'undefined') {
							alert('video null');
							return;
						}
						$.widgets.template.render.call(
							config.selecters.contentlist,
							config.selecters.contentlistTMP, data, function(){
								config.selecters.scroll.jScroll();
							}
						);
					});
				},
				ajax: function(url, fn){
					$.widgets.common.busy();
					this.fn(url, function(data){
						if(!$.isPlainObject(data)) {
							data = JSON.parse(data);
						}
						$.widgets.common.busy(true);
						fn(data);
					});
				}
			};
			$.widgets.player.refresh();
			if(config.is.video) item.video();
			else if(!config.is.video) item.mp3();
		},
		busy: function(isShow){
			isShow = false || isShow;
			$( config.selecters.busy ).jBusy(isShow);
		},
		encode: function(key){
			key = null || key;
			if(key === null)
				return false;
			return Base64.encode(key);
		},
		decode: function(key){
			key = null || key;
			if(key === null)
				return false;
			return Base64.decode(key);
		},
		uri: {
			parse: function(key, isPath){
				var url = '#', i = 0;
				for(x in key) {
					if(i > 0) {
						url += '&';
					}
					url += x + ':' + $.widgets.common.encode(key[x]);
					i++;
				}
				isPath = false || true;
				if(!isPath)
					url = new Array(config.path, url).join('');
				return url;
			},
			set: function(key){
				window.location = $.widgets.common.uri.parse(key);
			},
			get: function(){
				var hash = window.location.hash.replace(/#/gi, '');
				if(hash === '') {
					return null;
				}
				hash = hash.split('&');
				if(hash.length > 0) {
					var object = {};
					for(x in hash) {
						var param = hash[x].split(':');
						object[param[0]] = $.widgets.common.decode(param[1]);
					}
					hash = object;
				}
				return hash;
			}
		},
		support: function(){
			if( config.is.json && config.is.storage ) {
				return true;
			}
			if(!config.is.storage) {
				$.widgets.common.msg(config.transition.error_e5);
			} else if(!config.is.json) {
				$.widgets.common.msg(config.transition.error_e6);
			}
		},
		settitle: function(title, isSet){
			var isSetTitle = $.widgets.setting.get('title'),
				isValue = typeof title === 'undefined' ? '' : config.transition.title[1].replace(/%s/gi, title);
			if(isSetTitle == 1 || !isSetTitle || isSet)
				document.title = config.transition.title[0] + isValue + config.transition.title[2];
		},
		msg: function(msg, fnClose){
			document.getElementById('alertContent').innerHTML = msg;
			$.jPopup({padding: 0, fnClose: function(){
				if($.isFunction(fnClose)){
					fnClose();
				}
			},jInline: $('#alert') });
		}
	},
	player: {
		click: function(e){
			var item = {
				e: e,
				self: $( this )
			};
			item.index = item.self.attr('index') || null;
			item.type = item.self.attr('rev');
			if(item.index !== null)
				item.data = JSON.parse( $( config.selecters.player.data.replace(/%i/gi, item.index) ).html() );
			$.widgets.player[item.type].run(item);
		},
		play: {
			run: function(item){
				if(config.play.li !== null)
					config.play.li.removeClass('playing pausing');
				config.play.li = $( config.selecters.player.li.replace(/%i/gi, item.index) ).addClass('playing');
				if(player !== null) // for auto play first item in the list
					config.play.li
						.find(config.selecters.player.volume[1])
							.width(player.getConfig().volume + '%'); // set current volume
				if(config.play.li.hasClass('error')) {
					return;
				}
				if(item.index == config.index) { // from paused to playing
					config.player.play();
					$.widgets.player.play.style();
					$.widgets.common.settitle(config.data.title);
				} else {
					config.index = item.index;
					config.data = item.data;
					$.widgets.player.stop(); // stop playing
					if(config.is.video)
						$.widgets.player.play.video(item);
					else if(!config.is.video)
						$.widgets.player.play.mp3(item);
				}
			},
			mp3: function(item){
				$.widgets.player.play.busy();
				$.widgets.common.post({
					busy: false,
					data: item.data,
					url: config.path + 'page/add',
					fn: function(data){
						if(data.rep === 'ok') {
							$.get('http://123.30.6.9:3761/Getplaylist.aspx?list=' + item.data.id, function(data){
								if(data === null) {
									$.widgets.player.error('none');
								} else {
									data = JSON.parse(data.replace(/\{\[|\]\}/gi, ''));
									$.widgets.common.settitle(item.data.title);
									$.widgets.player.play.seturi({ q: item.data.title, t: 'mp3' });
									config.player.load(data.url);
								}
							});
						}
					}
				});
			},
			video: function(item){
				$.widgets.common.post({
					busy: false,
					data: item.data,
					url: config.path + 'page/add/1',
					fn: function(data){
						if(data.rep === 'ok') {
							$.widgets.common.settitle(item.data.title);
							$.widgets.player.play.seturi({ q: item.data.title, t: 'video' });
							config.player.load('http://www.youtube.com/watch?v=' + item.data.id);
							var video = $.widgets.setting.get('video');
							if(video === '1' || !video) {
								config.selecters.player.screen[1] = $(config.selecters.player.screen[1]);
								var height = config.selecters.player.screen[1].height();
								if(height == 0) {
									config.selecters.player.screen[1].animate({
										height:450
									}, function(){
										config.selecters.player.screen[0] = $(config.selecters.player.screen[0]).addClass(
											config.selecters.player.screen[2]
										);
									}).data('height', height);
								}
							}
						}
					}
				});
			},
			seturi: function(param) {
				$.widgets.common.uri.set(param);
			},
			style: function(){
				config.play.li.removeClass('pausing');
			},
			busy: function(isHide){
				$.widgets.common.settitle('Loading');
				$.widgets.player.busy = config.play.li.find('[rev=pause]').addClass('busy');
				if(isHide) {
					$.widgets.common.settitle(config.data.title);
					$.widgets.player.busy.removeClass('busy');
				}
			}
		},
		pause: {
			run: function(item){
				config.player.pause();
				$.widgets.player.pause.style();
				$.widgets.common.settitle('Pause');
			},
			style: function(){
				config.play.li.addClass('pausing');
			}
		},
		stop: function(item){
			config.player.stop();
		},
		next: function(){
			var index = config.index,
				isRepeat = $.widgets.setting.get('repeat');
			if(isRepeat == 2 || !isRepeat) { // repeat all
				index++;
				if($(config.selecters.player.li).length == index) {
					index = 0;
				}
				$( config.selecters.player.play.replace(/%i/gi, index) ).trigger('click.Play');
			} else if(isRepeat == 1) { // shuffle
				$( config.selecters.player.play.replace(/%i/gi, index) ).trigger('click.Play');
			} else {
				$.widgets.common.settitle();
				config.play.li.removeClass('playing pausing');
			}
		},
		volume: {
			run: function(item){
				var self = $(item.self),
					percent = typeof item.e === 'object' ? ((item.e.pageX - self.offset().left)*100) / self.width() : item;
				if(typeof item === 'object')
					config.player.volume(percent);
				$(config.selecters.player.volume[0].replace(/%i/gi, config.index)).css({ width: percent + '%' });
			}
		},
		error: function(msg){
			$.widgets.common.post({
				busy: false,
				data: config.data,
				url: config.path + 'page/add/0/1',
				fn: function(data){
					config.play.li.addClass('error');
					$.widgets.player.next();
				}
			});
			$.widgets.common.settitle('Error ' + msg);
		},
		loadbar: function(percent){
			document.getElementById(config.selecters.player.loadbar.replace(/%i/gi, config.index)).style.width = percent + '%';
		},
		seekbar: function(percent){
			document.getElementById(config.selecters.player.seekbar.replace(/%i/gi, config.index)).style.width = percent + '%';
		},
		download: {
			run: function(item){
				var downloadURL = 'http://mp3.socbay.com/mp3/download/';
				if(config.is.video)
					downloadURL = 'http://www.linkyoutube.com/watch/java.php?v=';
				window.open(downloadURL + item.data.id, '_blank');
			}
		},
		addplaylist: {
			run: function(item){
				if(config.is.logged)
					$.widgets.player.addplaylist.logged(item);
				$.widgets.player.addplaylist.normal(item);
			},
			logged: function(item){

			},
			normal: function(item){
				if(config.is.video)
					$.widgets.storage.set('video', item.data, false);
				else if(!config.is.video)
					$.widgets.storage.set('mp3', item.data, false);
				item.self.addClass('success');
			}
		},
		removeplaylist: {
			run: function(item){
				if(config.is.logged)
					$.widgets.player.removeplaylist.logged(item);
				$.widgets.player.removeplaylist.normal(item);
			},
			logged: function(item){

			},
			normal: function(item){
				if(config.is.video)
					$.widgets.storage.remove('video', item.data.id);
				else if(!config.is.video)
					$.widgets.storage.remove('mp3', item.data.id);
				$( config.selecters.player.li.replace(/%i/gi, item.index) ).remove();
				if( config.selecters.contentlist.find('li').length == 0 )
					$.widgets.common.msg(config.transition.error_e7, function(){
						if( config.is.video )
							$('#kp_Nav_Ul a[rev=video]').trigger('click.Navigation');
						else if(!config.is.video)
							$('#kp_Nav_Ul a[rev=mp3]').trigger('click.Navigation');
					});
			}
		},
		comment: {
			run: function(item){
				$.widgets.debug('comment')
			}
		},
		refresh: function(){
			config.index = null;
			$.widgets.player.stop(); // stop playing
		}
	},
	template: {
		render: function(tempObj, data, fn, isType){
			var html = tempObj.render(
				$.widgets.template.html(data, isType)
			);
			this.html(html);
			if($.isFunction(fn)) fn();
			$.widgets.player.refresh();
			return this;
		},
		html: function(data, isType){
			var html = [], x = 0;;
			$.each(data, function(i, item){
				var nitem = {};
				if(isType === true) {
					nitem = item;
					nitem.playlist = false;
				} else if(isType === 'playlist') {
					nitem = item;
					nitem.playlist = true;
				} else if(isType == 'movie') {
					nitem = item;
				} else {
					nitem.playlist	= false;
					if(config.is.video) {
						nitem.id		= item['media$group']['yt$videoid']['$t'];
						nitem.title		= item['title']['$t'];
						nitem.thumbnailSM	= item['media$group']['media$thumbnail'][0]['url'];
						nitem.thumbnailLG	= item['media$group']['media$thumbnail'][4]['url'];
						nitem.info		= config.fn.parseStringToTime(item['media$group']['yt$duration']['seconds']);
						nitem.artist	= item['author'][0]['name']['$t'];
						nitem.hash		= $.widgets.common.uri.parse({ q: nitem.artist, t: 'video' }, true);
					} else if(!config.is.video) {
						nitem.id		= item.id;
						nitem.title		= (item.tit == 'undefined') ? 'Đang cập nhật' : item.tit;
						nitem.info		= item.bit + ' kb/s. ' + config.fn.parseStringToTime(item.du) + '. ' + config.fn.parseStringToSize(item.si);
						nitem.artist	= (item.sin == '') ? 'Đang cập nhật' : item.sin;
						nitem.hash		= $.widgets.common.uri.parse({ q: item.sin, t: 'mp3' }, true);
					}
				}
				if(config.is.video)
					nitem.video = true;
				else if(!config.is.video)
					nitem.video = false;
				nitem.i = x;
				nitem.classes	= (x%2 == 0 ) ? 'odd' : 'even';
				nitem.data = JSON.stringify(nitem);
				html.push(nitem);
				x++;
			});
			config.play.li = null; // reset old li
			return html;
		}
	},
	storage: {
		set: function(key, value, isSingle){
			if(value === '')
				return false;
			if( $.widgets.common.support() ) {
				$.widgets.storage.data = {};
				$.widgets.storage.value = value;
				if( !$.isPlainObject( value ) )
					value = $.widgets.storage.value = JSON.parse(value);
				if ( localStorage[key] )
					$.widgets.storage.data = JSON.parse( localStorage[key] );
				if( isSingle ) {
					$.widgets.storage.value = $.widgets.storage.value.data;
				}
				$.widgets.storage.data[value.id] = $.widgets.storage.value;
				localStorage[key] = JSON.stringify( $.widgets.storage.data );
			}
			return true;
		},
		get: function(key){
			if( $.widgets.common.support() ) {
				$.widgets.storage.data = {};
				if ( localStorage[key] )
					$.widgets.storage.data = JSON.parse(localStorage[key]);
				return $.widgets.storage.data;
			}
			return $.widgets.storage.data;
		},
		remove: function(key, id){
			if ( localStorage[key] )
				$.widgets.storage.data = JSON.parse(localStorage[key]);
			delete $.widgets.storage.data[id];
			localStorage[key] = JSON.stringify( $.widgets.storage.data );
			return $.widgets.storage.data;
		},
		clear: function(key){
			try {
				delete localStorage[key];
			} catch(e) { return null; }
		}
	},
	items: {
		click: function(){
			var item = { self: $(this) };
				item.url = item.self.attr('href');
				item.type = item.self.attr('rev');
			try {
				$.widgets.common.settitle();
				$.widgets.items[item.type].run(item);
			} catch(e) {
				$.widgets.debug(e);
			}
			return false;
		},
		setting: {
			run: function(item){
				$.getScript(config.path + 'public/core/jquery.ajaxupload.js', function(){
					$.jPopup({
						padding: 0,
						fnDone: function(){
							var self = this.jPopup,
								file = self.find('input[type=file][name=background]'),
								busy = self.find(config.selecters.setting.imageBusy);
							// ajax upload
							new AjaxUpload(file, {
								action: file.attr('action'),
								name: file.attr('name'),
								onSubmit: function(file, ext){
									var jFile = self.find('span.filename');
									if (!ext || !/^(jpg|png|jpeg|gif)$/.test(ext)){
										$.widgets.common.msg(config.transition.error_e8);
										jFile.text(config.transition.common_c40);
										return false;
									}
									jFile.text(file);
									busy.show();
								},
								onComplete : function(file, data){
									busy.hide();
									if(typeof data === 'string') data = JSON.parse(data);
									if(data.rep === "ok") {
										$.widgets.setting.events.background.set(data.url, false, true);
									} else {
										$.widgets.common.msg(config.transition.error_e9.replace(/%s/gi, data.note));
									}
								}
							});
							$.widgets.setting.events.background.change();
							$.widgets.setting.events.background.scroll();
							// config first load
							if(!config.is.fSetting) {
								config.is.fSetting = true;
								var options = $.widgets.storage.get('options');
									delete options.background;
								$.each(options, function(i, item){
									self.find('input[type=radio][value=' + item + '][name=' + i + ']').attr('checked', true);
								});
							}
							// config for all radio input
							self.find('input[type=radio]').change(function(){
								var key = this.getAttribute('name');
								if(key == 'title' && this.value == 0)
									$.widgets.common.settitle();
								if(key == 'title' && this.value == 1)
									$.widgets.common.settitle(config.data.title, true);
								$.widgets.setting.set(key, this.value);
							});
						},
						jInline: $( '#' + item.type )
					});
				});
			}
		},
		mp3: {
			run: function(item){
				if(config.is.logged)
					$.widgets.items.mp3.logged(item);
				$.widgets.items.mp3.normal(item);
			},
			logged: function(item){},
			normal: function(item){
				var data = $.widgets.storage.get('mp3');
				if($.isEmptyObject(data)) {
					$.widgets.common.msg(config.transition.error_e10);
					return;
				}
				config.is.video = false;
				$.widgets.template.render.call(
					config.selecters.contentlist,
					config.selecters.contentlistTMP, data, function(){
						config.selecters.scroll.jScroll();
						$.widgets.navigation.common.style();
						$.widgets.items.common.style(item.self);
					},
					'playlist'
				);

			}
		},
		video: {
			run: function(item){
				if(config.is.logged)
					$.widgets.items.video.logged(item);
				$.widgets.items.video.normal(item);
			},
			logged: function(item){},
			normal: function(item){
				var data = $.widgets.storage.get('video');
				if($.isEmptyObject(data)) {
					$.widgets.common.msg(config.transition.error_e11);
					return;
				}
				config.is.video = true;
				$.widgets.template.render.call(
					config.selecters.contentlist,
					config.selecters.contentlistTMP, data, function(){
						config.selecters.scroll.jScroll();
						$.widgets.navigation.common.style();
						$.widgets.items.common.style(item.self);
					},
					'playlist'
				);

			}
		},
		profile: {
			run: function(item){
				if(!config.is.logged)
					$.widgets.common.msg(config.transition.error_e4);
			}
		},
		mysetting: {
			run: function(item){
				if(!config.is.logged)
					$.widgets.common.msg(config.transition.error_e1);
			}
		},
		friends: {
			run: function(item){
				if(!config.is.logged)
					$.widgets.common.msg(config.transition.error_e2);
			}
		},
		blacklist: {
			run: function(item){
				if(!config.is.logged)
					$.widgets.common.msg(config.transition.error_e3);
			}
		},
		signin: {
			run: function(item){
				$.jPopup({
					padding: 0,
					fnDone: function(){
					},
					jInline: $( '#signin' )
				});
			}
		},
		signup: {
			run: function(item){
				$.jPopup({
					padding: 0,
					fnDone: function(){
					},
					jInline: $( '#signup' )
				});
			}
		},
		common: {
			style: function(self){
				config.selecters.widget.removeClass('active');
				if(typeof self == 'object')
					self.addClass('active');
			}
		}
	},
	setting: {
		set: function(key, value){
			$.widgets.storage.set('options', {
				id: key,
				data: value
			}, true);
		},
		get: function(key){
			return $.widgets.storage.get('options')[key] || false;
		},
		events: {
			background: {
				set: function(bgUrl, isGet, isSet){
					if(isSet) {
						$.widgets.setting.set('background', bgUrl);
					}
					if(isGet) {
						bgUrl = $.widgets.setting.get('background');
					}
					if(bgUrl) {
						$( config.selecters.body ).css({ backgroundImage: 'url("' + bgUrl + '")' });
					}
				},
				change: function(){
					config.selecters.setting.bgList.find('li').click(function(){
						$.widgets.setting.events.background.set($(this).attr('url'), false, true);
					});
				},
				scroll: function(){
					var val = 0,
						width = 0,
						liObject = config.selecters.setting.bgList.find('li'),
						liLength = liObject.length - 4,
						liWidth = liObject.width() + 14;
					config.selecters.setting.bgList.bind('mousewheel', function(event, delta) {
						if(delta > 0) {
							if(val > 0)
								val = val - 1;
						} else {
							if(val < liLength)
								val = val + 1;
						}
						config.selecters.setting.bgList.children('ul').css({ marginLeft: -(val * liWidth) + 'px' });
						return false;
					});
				}
			}
		}
	},
	debug: function(msg, isType) {
		if(typeof isType === 'undefined')
			isType = false;
		if(typeof window.console === 'object') {
			if(!isType)
				console.log(msg);
			else if(isType == 'error')
				console.error(msg);
			else if(isType == 'error')
				console.warn(msg);
			else
				console.trace(msg)
		}
	},
	navigation: {
		click: function(){
			var item = { self: $(this) };
				item.url = item.self.attr('href');
				item.type = item.self.attr('rev');
			$.widgets.common.settitle();
			$.widgets.navigation[item.type].run(item, function(){
				$.widgets.items.common.style();
				$.widgets.navigation.common.style(item.self);
			}, function(){
				$.widgets.common.uri.set({ t: item.type });
			});
			return false;
		},
		mp3: {
			run: function(item, fn, fnu){
				config.is.video = false;
				config.selecters.container.removeClass('kp_BodyLeftContainerBgNone');
				$.widgets.common.post({
					busy: true,
					url: item.url,
					fn: function(data){
						$.widgets.template.render.call(
							config.selecters.contentlist,
							config.selecters.contentlistTMP, data, function(){
								config.selecters.scroll.jScroll();
								fn(); fnu();
							},
							true
						);
					}
				});
			}
		},
		video: {
			run: function(item, fn, fnu){
				config.is.video = true;
				config.selecters.container.removeClass('kp_BodyLeftContainerBgNone');
				$.widgets.common.post({
					busy: true,
					url: item.url,
					fn: function(data){
						$.widgets.template.render.call(
							config.selecters.contentlist,
							config.selecters.contentlistTMP, data, function(){
								config.selecters.scroll.jScroll();
								fn(); fnu();
							},
							true
						);
					}
				});
				fn(); fnu();
			}
		},
		people: {
			run: function(item){
				$.widgets.debug(item);
				$.widgets.common.msg('I want to see `people` in the popup ? <a href="javascript:$.jPopup.hide()">Yes</a> or <a href="javascript:$.jPopup.hide()">No</a>');
			}
		},
		movie: {
			run: function(item, fn, fnu){
				config.is.video = null;
				config.selecters.container.addClass('kp_BodyLeftContainerBgNone');
				$.widgets.common.post({
					busy: true,
					url: item.url,
					fn: function(data){
						$.widgets.template.render.call(
							config.selecters.contentlist,
							config.selecters.contentlistMovieTMP, data, function(){
								config.selecters.scroll.jScroll();
								fn(); fnu();
								config.selecters.contentlist.children('li').click(function(){
									alert(this.getAttribute('title'));
								});
							},
							'movie'
						);
					}
				});
			}
		},
		common: {
			style: function(self){
				config.selecters.navigation.removeClass('active');
				if(typeof self == 'object')
					self.addClass('active');
			}
		}
	}
};

/**
 * player
 * defined runtime of jwplayer
 */
var player = null;
function playerReady(object) {
	player = document.getElementById(object.id);
	config.player.eventListeners();
}
function Player(){
	this.curentVolume = 80;
	this.isError = false;
	this.load = function(url) {
		if (player !== null)
			player.sendEvent('LOAD',url);
		config.player.play();
		this.isError = false;
	}
	this.play = function(){
		if(player !== null)
			player.sendEvent('PLAY','true');
	}
	this.pause = function(){
		player.sendEvent('PLAY','false');
	}
	this.volume = function(percent) {
		player.sendEvent('VOLUME',percent);
	}
	this.stop = function() {
		try { player.sendEvent('STOP','true'); }catch(e){};
	}
	this.eventListeners = function(){
		try {
			player.addModelListener('ERROR', 'config.player.errorListener')
			player.addModelListener('LOADED', 'config.player.loaderListener')
			player.addModelListener('TIME', 'config.player.timeListener')
			player.addModelListener('BUFFER', 'config.player.bufferListener');
			player.addModelListener('STATE',  'config.player.stateListener');
			player.addControllerListener('VOLUME', 'config.player.volumeListener');
		} catch(e) {
			setTimeout('config.player.eventListeners()',100);
		}
	}
	this.errorListener = function(object){
		if(!this.isError) {
			this.isError = true;
			$.widgets.player.error(object.message);
		}
	}
	this.loaderListener = function(object){}
	this.bufferListener = function(object){
		$.widgets.player.loadbar(object.percentage);
	}
	this.timeListener = function(object){
		var percent = object.position/object.duration*100;
		$.widgets.player.seekbar(percent);
	}
	this.stateListener = function(object){
		if(object.newstate == 'COMPLETED') {
			$.widgets.player.next();
		}
		if(object.newstate == 'PLAYING' && object.oldstate == 'PAUSED') {
			$.widgets.player.play.style();
		}
		if(object.newstate == 'PAUSED' && object.oldstate == 'PLAYING') {
			$.widgets.player.pause.style();
		}
		if(object.newstate == 'BUFFERING') {
			$.widgets.player.play.busy();
		}
		if(object.oldstate == 'BUFFERING') {
			$.widgets.player.play.busy(true);
		}

	}
	this.volumeListener = function(object){
		this.curentVolume = object.percentage;
		$.widgets.player.volume.run(object.percentage);
	}
}


