// Naked Slide v0.1 naked-slide.js --  Creative Common Lisense BY-NC-SA 2.1 JP
// Please see http://alfasado.net/contents/labs.html for information 
// (c) Alfasado,Inc Some Rights Reserved.

window.onload = function(){
	slideShow.setSlide();
	slideShow.setKeybord();
}

window.onresize = function(){
	slideShow.resizeStage();
}

var slideShow = {
	setting: {
		pointListColor1: '#555555',
		pointListColor2: '#FFFFFF',
		pointListColorAnchor1: '#555555',
		pointListColorAnchor2: '#FFFF66'
	},
	arrayElement: function(eleClassName){
		var slideArray = new Array();
		var slideCount = 0;
		var divs = this.$E('div');
		for(var i = 0,num = divs.length;i < num;i++){
			var div = divs[i];
			if(div.className == eleClassName){
				slideArray[slideCount] = div;
				slideCount++;
			}
		}
		this.resizeStage();
		return slideArray;
	},
	resizeStage: function(){
		this.$('nakedSlideAll').style.height = this.bodyHeight() - 60 + 'px';
		this.checkPage();
	},
	checkPage: function(){
		if(this.$('nakedSlideDocInfo')){
			var titlePadding = ((this.bodyHeight() - 60)/2) - ((this.$('nakedSlideDocInfo').clientHeight)/2);
			this.$('nakedSlideDocInfo').style.top = titlePadding + 'px';
		}
		if(this.count <= 0){
			this.$('nakedSlideDocTitleBox').style.textIndent = '-99999px';
			this.$('nakedSlideDocInfo').style.display = 'block';
			this.okGoNext = true;
		}else{
			this.$('nakedSlideDocTitleBox').style.textIndent = '20px';
			this.$('nakedSlideDocInfo').style.display = 'none';
		}
	},
	setSlide: function(){
		var titleBox = document.createElement('div');
		titleBox.appendChild(document.createTextNode(document.title));
		titleBox.setAttribute('id','nakedSlideDocTitleBox');
		this.$E('body')[0].appendChild(titleBox);
		
		this.checkPage();
		
		this.setEvent(this.$('nakedSlideAll'),'onclick','slideShow.clickPage(event)');
		
		var pagerUl = document.createElement('ul');
		var nextLi = document.createElement('li');
		var prevLi = document.createElement('li');
		var selsectLi = document.createElement('li');
		var topLi = document.createElement('li');
		var nextA = document.createElement('a');
		var prevA = document.createElement('a');
		var topA = document.createElement('a');
		
		pagerUl.setAttribute('id','slideScriptNavi');
		
		nextLi.setAttribute('id','slideScriptNext');
		prevLi.setAttribute('id','slideScriptPrev');
		selsectLi.setAttribute('id','slideScriptSelect');
		topLi.setAttribute('id','slideScriptTop');
		
		nextA.appendChild(document.createTextNode('Next'));
		prevA.appendChild(document.createTextNode('Previous'));
		topA.appendChild(document.createTextNode('Top'));
		
		nextA.setAttribute('href','#next');
		prevA.setAttribute('href','#prev');
		topA.setAttribute('href','#top');
		
		this.setEvent(nextA,'onclick','slideShow.pager(1);return false;');
		this.setEvent(prevA,'onclick','slideShow.pager(-1);return false;');
		this.setEvent(topA,'onclick','slideShow.topSlide();return false;');
		
		nextLi.appendChild(nextA);
		prevLi.appendChild(prevA);
		topLi.appendChild(topA);
		
		prevA.style.visibility = 'hidden';
		topA.style.visibility = 'hidden';
		
		pagerUl.appendChild(nextLi);
		pagerUl.appendChild(prevLi);
		pagerUl.appendChild(topLi);
		
//		this.setEvent(body,'onkeydown','slideShow.pager(1);return false;');
		
		var selectForm = document.createElement('form');
		var selectBox = document.createElement('select');
		selectBox.setAttribute('name','slideSelect');
		selectBox.setAttribute('id','slideSelect');
		this.setEvent(selectBox,'onchange','slideShow.jump(this.form.slideSelect)');
		
		var selectObjects = new Array();
		for(var i = 0,num = this.arrayElement(('nakedSlide')).length; i <= num; i++){
			selectObjects[i] = document.createElement('option');
			selectObjects[i].setAttribute('value',i);
			selectObjects[i].appendChild(document.createTextNode(i));
			selectBox.appendChild(selectObjects[i]);
		}
		
		
		selectForm.appendChild(selectBox);
		selectForm.appendChild(document.createTextNode(' / ' + this.arrayElement(('nakedSlide')).length));
		selsectLi.appendChild(selectForm);
		pagerUl.appendChild(selsectLi);
		
		var body = this.$E('body')[0];
		body.appendChild(pagerUl);
		
		
		var slides = this.arrayElement(('nakedSlide'));
		this.slideNumber = slides.length;
		
		if(window.location.hash && (window.location.hash.indexOf('slide') >= 0)){
			var hashNumber = window.location.hash.split('slide')[1];
			
			var slides = this.arrayElement(('nakedSlide'));
			this.slideNumber = slides.length;
			
			if(hashNumber <= this.slideNumber && hashNumber != '' && !hashNumber.match(/[^0-9]/g)){
				this.count = parseFloat(hashNumber);
				this.jumpSlide();
				this.selectSet();
			}
		}
	},
	count: 0,
	slideNumber: 0,
	pager: function(s){
		if(this.scrollTime != ''){
			clearInterval(this.scrollTime);
			this.scrollTime = '';
		}
		if((this.okGoPrev && s < 0) || (this.okGoNext && s > 0)){
			this.points = new Array();
			var slides = this.arrayElement(('nakedSlide'));
			this.slideNumber = slides.length;
			this.count = this.count + s;
			
			this.okGoPrev = true;
			this.okGoNext = true;
			
			this.checkPage();
			
			if(0 < this.count && this.count <= this.slideNumber){
				if(this.count > 0){
					this.$EE('a','slideScriptPrev')[0].style.visibility = 'visible';
					this.$EE('a','slideScriptTop')[0].style.visibility = 'visible';
				}else{
					this.$EE('a','slideScriptPrev')[0].style.visibility = 'hidden';
				}
				if(this.count > this.slideNumber - 1){
					this.$EE('a','slideScriptNext')[0].style.visibility = 'hidden';
				}else{
					this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
				}
				
				this.$('nakedSlideAll').scrollTop = 0;
				
				for(var i = 0,num = this.slideNumber; i < num; i++ ){
					slides[i].style.display = 'none';
				}
				slides[this.count-1].style.display = 'block';
				
				this.checkPoint(slides[this.count-1],s);
				
			}else if(this.count == 0){
				for(var i = 0,num = this.slideNumber; i < num; i++ ){
					slides[i].style.display = 'none';
				}
				this.$EE('a','slideScriptPrev')[0].style.visibility = 'hidden';
				this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
				this.$EE('a','slideScriptTop')[0].style.visibility = 'hidden';
			}else{
				this.count = this.count - s;
			}
			this.selectSet();
		}else{
			this.point(s);
		}
	},
	jump: function(t){
		if(this.scrollTime != ''){
			clearInterval(this.scrollTime);
			this.scrollTime = '';
		}
		this.points = new Array();
		
		var optValue = parseFloat(t.options[t.selectedIndex].value);
		this.count = optValue;
		
		this.jumpSlide();
		
		this.okGoPrev = true;
		this.$('nakedSlideAll').focus();
	},
	jumpSlide: function(){
		var slides = this.arrayElement(('nakedSlide'));
		this.slideNumber = slides.length;
		for(var i = 0,num = this.slideNumber; i < num; i++ ){
			slides[i].style.display = 'none';
		}
		if(this.count == 0){
			this.$EE('a','slideScriptPrev')[0].style.visibility = 'hidden';
			this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
			this.$EE('a','slideScriptTop')[0].style.visibility = 'hidden';
		}else if(this.count == this.slideNumber){
			this.$EE('a','slideScriptPrev')[0].style.visibility = 'visible';
			this.$EE('a','slideScriptNext')[0].style.visibility = 'hidden';
			this.$EE('a','slideScriptTop')[0].style.visibility = 'visible';
		}else {
			this.$EE('a','slideScriptPrev')[0].style.visibility = 'visible';
			this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
			this.$EE('a','slideScriptTop')[0].style.visibility = 'visible';
		}
		
		if(this.count != 0){
			slides[this.count - 1].style.display = 'block';
			this.checkPoint(slides[this.count - 1]);
		}
		this.$('nakedSlideAll').scrollTop = 0;
		this.checkPage();
		this.pointCount = 0;
	},
	topSlide: function(){
		this.count = 0;
		this.$EE('a','slideScriptTop')[0].style.visibility = 'hidden';
		var slides = this.arrayElement(('nakedSlide'));
		for(var i = 0,num = this.slideNumber; i < num; i++ ){
			slides[i].style.display = 'none';
		}
		this.checkPage();
		this.selectSet();
		this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
		this.$EE('a','slideScriptPrev')[0].style.visibility = 'hidden';
		this.okGoPrev = false;
		this.okGoNext = true;
		this.pointCount = 0;
	},
	selectSet: function(){
		var selectObjects = new Array();
		this.$('slideSelect').innerHTML = '';
		for(var i = 0,num = this.arrayElement(('nakedSlide')).length; i <= num; i++){
			selectObjects[i] = document.createElement('option');
			selectObjects[i].setAttribute('value',i);
			selectObjects[i].appendChild(document.createTextNode(i));
			if(this.count == i){
				selectObjects[i].setAttribute('selected','selected');
			}
			this.$('slideSelect').appendChild(selectObjects[i]);
		}
	},
	checkPoint: function(o,s){
		this.endPoint = false;
		var inSlides = o.getElementsByTagName('*');
		if(inSlides){
			var p = 0;
			for(var i = 0,num = inSlides.length; i< num; i++){
				if(inSlides[i].className == 'nakedSlidePoint'){
					this.points[p] = inSlides[i];
					if(s && s < 0){
						var color = this.setting.pointListColor2;
						var colorAnchor = this.setting.pointListColorAnchor2;
					}else{
						var color = this.setting.pointListColor1;
						var colorAnchor = this.setting.pointListColorAnchor1;
					}
					this.points[p].style.color = color;
					
					var inSlidesPoints = inSlides[i].getElementsByTagName('*');
					if(inSlidesPoints){
						for(var j = 0,num2 = inSlidesPoints.length; j< num2; j++){
							if(inSlidesPoints[j].href){
								inSlidesPoints[j].style.color = colorAnchor;
							}
						}
					}
					p++;
					if(s){
						if(s > 0){
							this.okGoPrev = true;
							this.okGoNext = false;
							this.pointCount = 0;
						}
						if(s < 0){
							this.okGoPrev = false;
							this.okGoNext = true;
							this.pointCount = this.points.length;
						}
					}else{
						this.okGoPrev = false;
						this.okGoNext = false;
					}
					if(this.count > this.slideNumber - 1){
						this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
					}
				}
				if(inSlides[i].href){
					inSlides[i].setAttribute('target','_blank');
				}
			}
			if(p == 0){
				this.okGoPrev = true;
				this.okGoNext = true;
			}
		}
	},
	point: function(s){
		if(!this.endPoint){
			this.pointCount = this.pointCount;
		}
		this.pointCount = this.pointCount + s;
		for(var i = 0,num = this.points.length; i < num; i++){
			if(s > 0){
				var color = this.setting.pointListColor1;
				var colorAnchor = this.setting.pointListColorAnchor1;
				if(i < this.pointCount){
					var color = this.setting.pointListColor2;
					var colorAnchor = this.setting.pointListColorAnchor2;
				}
			}else if(s < 0){
				var color = this.setting.pointListColor2;
				var colorAnchor = this.setting.pointListColorAnchor2;
				if(i >= this.pointCount){
					var color = this.setting.pointListColor1;
					var colorAnchor = this.setting.pointListColorAnchor1;
				}
			}
			this.points[i].style.color = color;
			
			var inSlidesPoints = this.points[i].getElementsByTagName('*');
			if(inSlidesPoints){
				for(var j = 0,num2 = inSlidesPoints.length; j< num2; j++){
					if(inSlidesPoints[j].href){
						inSlidesPoints[j].style.color = colorAnchor;
					}
				}
			}
		}
		
		if(this.pointCount >= this.points.length){
			this.okGoNext = true;
			if(this.count > this.slideNumber - 1){
				this.endPoint = true;
				this.$EE('a','slideScriptNext')[0].style.visibility = 'hidden';
			}else{
				this.$EE('a','slideScriptNext')[0].style.visibility = 'visible';
			}
		}else if(this.pointCount <= 0){
			this.okGoPrev = true;
			this.pointCount = 0;
		}else{
			this.okGoNext = false;
			this.okGoPrev = false;
		}
	},
	points: new Array(),
	pointCount: 0,
	okGoPrev: true,
	okGoNext: true,
	endPoint: false,
	setKeybord: function(){
		this.setEvent(this.$E('body')[0],'onkeydown','slideShow.keyEvent(event);return false;');
	},
	getKeycode: function(e){
		if(document.all){
			return  event.keyCode;
		}else if(document.getElementById){
			return (e.keyCode!=0)?e.keyCode:e.charCode;
		}else if(document.layers){
			return  e.which;
		}else{
			return false;
		}
	},
	keyEvent: function(e){
		
		var code = this.getKeycode(e);
		
		if((e.ctrlKey && code == '82') | (e.metaKey && code == '82')){
			document.location.reload();
		}
		if((e.ctrlKey && code == '87') | (e.metaKey && code == '87')){
			window.close();
		}
		
		if(e.ctrlKey && code == '39' && (this.count != this.slideNumber)){
			this.okGoNext = true;
			this.pager(1);
		}else if(e.ctrlKey && code == '37'){
			this.okGoPrev = true;
			this.pager(-1);
		}else if(code == '37' | (e.ctrlKey && code == '32')){
			this.pager(-1);
		}else if((code == '39' | code == '13' | code == '32') && !this.endPoint){
			this.pager(1);
		}else if(code == '36' | code == '72'){
			this.topSlide();
		}
		if(code == '40'){	// Down
			var stageHeight = this.$('nakedSlideAll').innerHeight || this.$('nakedSlideAll').clientHeight;
			this.goToScroll = this.$('nakedSlideAll').scrollTop + stageHeight;
			if(this.scrollTime != ''){
				clearInterval(this.scrollTime);
				this.scrollTime = '';
			}
			this.scrollTime = setInterval('slideShow.scrollAction()',50);
		}else if(code == '38'){	// Up
			var stageHeight = this.$('nakedSlideAll').innerHeight || this.$('nakedSlideAll').clientHeight;
			this.goToScroll = this.$('nakedSlideAll').scrollTop - stageHeight;
			if(this.scrollTime != ''){
				clearInterval(this.scrollTime);
				this.scrollTime = '';
			}
			this.scrollTime = setInterval('slideShow.scrollAction()',50);
		}
	},
	scrollAction: function(){
		this.$('nakedSlideAll').scrollTop += (this.goToScroll - this.$('nakedSlideAll').scrollTop)/10;
		
		
		if((Math.abs(this.goToScroll - this.$('nakedSlideAll').scrollTop) < 50) || (this.$('nakedSlideAll').scrollTop == this.nowScrolling)){
			clearInterval(this.scrollTime);
		}
		this.nowScrolling = this.$('nakedSlideAll').scrollTop;
		
	},
	goToScroll: 0,
	scrollTime: '',
	nowScrolling: 0,
	clickPage: function(e){
		var targetEle = e.target || e.srcElement;
		if(!targetEle.href){
			this.pager(1);
		}
	},
	bodyHeight: function(){
		var bodyHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
		return bodyHeight;
	},
	setEvent: function(obj,eventType,func){
		if(this.isIE) {
			obj.setAttribute(eventType,new Function(func));
		} else {
			obj.setAttribute(eventType,func);
		}
	},
	isIE: (document.documentElement.getAttribute("style") == document.documentElement.style),
	$: function(ele){
		return document.getElementById(ele);
	},
	$E: function(ele){
		return document.getElementsByTagName(ele);
	},
	$EE: function(ele,eleId){
		return document.getElementById(eleId).getElementsByTagName(ele);
	}
}


