﻿var debug = false;

if ($.browser.msie) {
	if (debug) var logWin = window.open('/docs/sdk/console.log.htm', 'logger', 'status=no,toolbar=no,menubar=no,location=no,scrollbars=no,resizable=yes')
	var console = {
		log: function(s) {
			if (debug)
				logWin.log(s);
		}
	}
}

jQuery.fn.tagName = function() {
	if (1 === this.length) {
		return this[0].tagName.toLowerCase();
	} else {
		var tagNames = [];
		this.each(function(i, el) {
			tagNames[i] = el.tagName.toLowerCase();
		});
		return tagNames;
	}
};

var progressBar = {
	width: 222,
	bars: 55,
	barWidth: 2,
	leftOffset: 0,
	curPosition: 0,
	internalWidth: 0,
	barContainer: null,
	animTimer: null,
	animRate: 5,
	animStepWidth: 2,
	html: '<div class=marquee><div class=bars></div></div><div class=loading>Content loading...</div>',
	init: function() {
		$('div.rightContentContainer').last().append(progressBar.html);
		progressBar.barContainer = $('div.marquee div.bars').first();
		for (var i = 0; i < progressBar.bars; i++) {
			var bar = $('<span></span>');
			bar.css('opacity', (i / progressBar.bars).toString());
			progressBar.barContainer.append(bar);
		}
		progressBar.leftOffset = 0 - (progressBar.bars * progressBar.barWidth);
		progressBar.internalWidth = progressBar.width + (progressBar.bars * progressBar.barWidth);
		progressBar.animTimer = setInterval(progressBar.animate, progressBar.animRate);
	},
	animate: function() {
		progressBar.curPosition = (progressBar.curPosition + progressBar.animStepWidth) % progressBar.internalWidth;
		progressBar.barContainer.css('left', progressBar.curPosition + progressBar.leftOffset);
	},
	destroy: function() {
		clearInterval(progressBar.animTimer);
		$('div.marquee').first().remove();
		$('div.loading').first().remove();
	}
};

$(document).ready(function() {
	progressBar.init();
	var str = getQSValue('str');
	if (str != '') {
		str = unescape(str);
		var targetEl = $(String.format("*:contains('{0}')", str));
		if (targetEl.length == 0) {
			str = str.split(' ').join(String.fromCharCode(160));
			targetEl = $(String.format("*:contains('{0}')", str));
			str = str.split(String.fromCharCode(160)).join(' ');
		}
		while (str.length > 11 && targetEl.length == 0) {
			str = str.substr(0, str.length - 1);
			targetEl = $(String.format("*:contains('{0}')", str));
			targetEl = targetEl.last();
		}
		targetEl = targetEl.last();
		if (targetEl.length > 0) {
			var anchorName = null;
			var counter = 0;
			while (anchorName == null && counter < 99) {
				counter++;
				while (anchorName == null && targetEl.prev().length > 0) {
					if (targetEl.find('a[name]').length > 0) {
						anchorName = targetEl.find('a[name]').last().attr('name');
						break;
					}
					targetEl = targetEl.prev();
				}
				if (anchorName == null)
					anchorName = targetEl.prevAll('a[name]').first().attr('name');
				targetEl = targetEl.parent();
			}
			if (anchorName != null)
				location.href = '#' + anchorName;
		}
	}
	$("#sdkFrame").load(function() {

		$('div.rightContentContainer').last().append(pager.tempContainer);
		$('div.rightContentContainer').last().append(pager.sdkDiv);

		pager.slicePages();
		progressBar.destroy();
	});
	$('div.pager-div input').keypress(function(event) {
		if (event.keyCode == 13) {
			event.preventDefault();
			searchDocs();
		}
	});
});

function searchDocs() { 
	var redir = String.format("/authoring/search.aspx?q={0}", $('div.pager-div input').val());
	location.href = redir;
}

var sdkLinkMapper = [
	/*['WorldWideTelescopeDataFilesReference.html',		'Developer.aspx?Page=DataFilesReference'],
	['WorldWideTelescopeDataToolsGuide.html',			'Developer.aspx?Page=DataToolsGuide'],
	['WorldWideTelescopeProjectionReference.html',		'Developer.aspx?Page=ProjectionReference'],
	['WorldWideTelescopeWebControlScriptReference.html','Developer.aspx?Page=WebControlScriptReference'],
	['worldwidetelescopeplanetarium.html',				'Developer.aspx?Page=WWTPlanetarium'],
	['worldwidetelescopelocalizationtool.html',			'Developer.aspx?Page=LocalizationTool'],
	['worldwidetelescopeuserguide.html',				'../help/SupportHelp.aspx?Page=UserGuide'],
	['wtml/',											'../docs/wtml/']*/
]

var pager = {
	//searchTarget:null,
	frame: null,
	tempContainer: $('<div id="tempContainer"></div>'),
	sdkDiv: $('<div class="sdk-content"></div>'),
	pageCount: 0,
	curPage: 0,
	divs: [],
	anchors: [],
	/*control: $('<div class=pager-div><a title="First Page" class=first-page href="javascript:pager.gotoPage(0)"><< </a>&nbsp;&nbsp;<a title="Previous Page" class=prev-page href="javascript:pager.prev()">< </a><div class=page-num-links></div><a class=next-page title="Next Page" href="javascript:pager.next()"> ></a>&nbsp;&nbsp;<a href="javascript:pager.gotoPage(pager.pageCount-1)" class=last-page title="Last Page">  >></a><div class=right><input class=search value="' + getQSValue('q') + '"/> <a href="javascript:searchDocs()" class=search>Search</a>&nbsp;&nbsp;&nbsp;<a href=javascript:pager.printSDK() class=print><img src="../images/print16.png" />&nbsp;Printable view</a></div></div>'),*/
	control: $('<div class=pager-div><a title="First Page" class=first-page href="javascript:pager.gotoPage(0)"><< </a>&nbsp;&nbsp;<a title="Previous Page" class=prev-page href="javascript:pager.prev()">< </a><div class=page-num-links></div><a class=next-page title="Next Page" href="javascript:pager.next()"> ></a>&nbsp;&nbsp;<a href="javascript:pager.gotoPage(pager.pageCount-1)" class=last-page title="Last Page">  >></a><div class=right>&nbsp;&nbsp;&nbsp;<a href=javascript:pager.printSDK() class=print><img src="../images/print16.png" />&nbsp;Printable view</a></div></div>'),
	init: function(opts) {
		pager.options = opts;
	},
	slicePages: function() {
		pager.tempContainer.append(pager.control);
		pager.frame = $('#sdkFrame').contents();
		if ($.browser.msie) {
			pager.frame.find('body').contents().filter(function() {
				if (this.nodeType != 1) {
					console.log('node type: ' + this.nodeType);
					if (this.nodeType == 8) {
						$(this).remove();
						console.log('removed node');
					}
				}
			});
		}

		pager.frame.find('img').first().css('display', 'none');
		pager.makeDiv(pager.frame.find('h1').first().text(), 0);
		seps = pager.frame.find('hr');
		seps.each(function(index, hr) {
			var Heading = $(hr).next();
			while (Heading.attr('tagName').toLowerCase().indexOf('h') != 0) {
				if (Heading.children().length > 0)
					Heading = Heading.children().first();
				else
					Heading = Heading.next();
			}
			pager.makeDiv(Heading.text(), index + 1);
			//console.log((index + 2) + ': ' + Heading.text());

		});
		// replace image paths
		pager.frame.find('img[src*=uiimages/]').each(function(i, img) {
			img = $(img);
			if (img.attr('src').indexOf('/Docs/') == -1)
				img.attr('src', String.format("/Docs/{0}", img.attr('src')));

		});

		pager.frame.find('img[src*=Images/]').each(function(i, img) {
			img = $(img);
			if (img.attr('src').indexOf('/Docs/') == -1)
				img.attr('src', String.format("/Docs/{0}", img.attr('src')));

		});
		var htmlString = new String();
		htmlString = pager.frame.find('body').html();

		var pagesHtmlArray = htmlString.split('<hr>');
		if (pagesHtmlArray.length == 1)
			pagesHtmlArray = htmlString.split('<HR>');

		pager.sdkDiv.html('');
		pager.sdkDiv.append(pager.control);
		pager.pageCount = pager.divs.length;
		for (var i = 0; i < pager.divs.length; i++) {
			pager.divs[i].html(pagesHtmlArray[i]);
			pager.sdkDiv.append(pager.divs[i]);
			pager.divs[i].find('a[name]').each(function(index, anchor) {
				var a = $(anchor);
				pager.anchors[a.attr('name')] = i;

				if (a.html().length > 0) {
					a.after(a.html());
					a.html('');
				}
			});
			var pageLink = $(String.format('<a>{0}</a>', i + 1));
			pager.control.children('div').first().append(pageLink);
			pageLink.attr({
				'href': 'javascript:pager.gotoPage(' + i + ')',
				'class': i < 5 ? 'pager' : 'hidden',
				'page': i,
				'title': pager.divs[i].attr('tooltip')
			});
		}
		var clonedPager = $(pager.control.clone());
		clonedPager.find('div.right').first().css('display', 'none');
		clonedPager.find('a.print').first().css('display', 'none');
		clonedPager.css({ 'top': 22, 'margin-top': 10 });
		pager.sdkDiv.append(clonedPager);
		$('div.pager-div a.first-page').attr('title', pager.divs[0].attr('tooltip'));
		$('div.pager-div a.last-page').attr('title', pager.divs[pager.pageCount - 1].attr('tooltip'));
		if (location.hash.indexOf('#') != -1) {
			var name = location.hash.split('#')[1];
			pager.gotoPage(parseInt(pager.anchors[name]), name);
		}
		else {
			pager.gotoPage(0);
		}

	},
	makeDiv: function(id, pageNum) {
		var div = $('<div></div>');
		pager.tempContainer.append(div);
		div.attr({ 'id': id.replace(/ /g, '') + pageNum, 'pageNum': pageNum, 'class': 'sdk-page', 'tooltip': id });
		pager.divs[pageNum] = div;
	},
	gotoPage: function(page, anchorName) {
		setTimeout("pager.unbindPageLinks(" + pager.curPage + ")", 1);
		pager.divs[pager.curPage].css('display', 'none');
		pager.curPage = page;
		pager.divs[pager.curPage].css('display', 'block');
		var textLinks = $('div.pager-div').children('a');
		pager.setPagerControlsEnabled(textLinks.first(), page != 0);
		pager.setPagerControlsEnabled(textLinks.first().next(), page != 0);
		pager.setPagerControlsEnabled(textLinks.last().prev(), page != pager.pageCount - 1);
		pager.setPagerControlsEnabled(textLinks.last().prev().prev(), page != pager.pageCount - 1);
		$('div.page-num-links').children('a').attr('class', 'hidden');
		var pagerOffset = 0;
		var startPage = page - 4;
		if (startPage < 0) {
			pagerOffset = Math.abs(startPage);
			startPage = 0;
		}
		var endPage = page + 4 + pagerOffset;
		if (endPage > pager.pageCount - 1) {
			startPage = Math.max(0, startPage - (endPage - pager.pageCount) - 1);
			endPage = pager.pageCount - 1;
		}

		for (var i = startPage; i <= endPage; i++) {
			$('div.page-num-links a[page=' + i + ']').attr('class', 'pager');
		}

		$('div.page-num-links a[page=' + page + ']').attr('class', 'selected-page');
		$('div.pager-div a.next-page').attr('title', page + 1 != pager.pageCount ? pager.divs[page + 1].attr('tooltip') : '');
		$('div.pager-div a.prev-page').attr('title', page != 0 ? pager.divs[page - 1].attr('tooltip') : '');

		pager.divs[pager.curPage].find('img').each(function(index, image) {
			var img = $(image);
			if (img.attr('crawled') == '1') return;
			img.attr('crawled', '1');
			var iw = img.innerWidth();
			if (iw > 675) {
				var ih = img.innerHeight();
				var ratio = ih / iw;
				img.css({
					'width': 675, 'height': 675 * ratio,
					'border': 'solid 1px blue', 'cursor': 'pointer'
				});
				img.attr({ 'origW': iw, 'origH': ih, 'title': 'Click to view full-size image...', 'alt': 'Click to view full-size image...' });
				img.click(function(event) {
					var image = $(event.target);
					var h = parseInt(image.attr('origH'));
					var w = parseInt(image.attr('origW'));
					var win = window.open(
						String.format('/authoring/ImgViewer.htm?h={0}&w={1}&src={2}', h, w, image.attr('src')), 'imgWin',
						String.format("height={0},width={1},status=no,toolbar=no,menubar=no,location=no,scrollbars=no", h, w)
					);
					win.resizeTo(w, h);
					win.focus();
				});
			}
		});

		if (anchorName != null)
			location.href = '#' + anchorName;
		$('div.content-main').css('height', Math.max(pager.sdkDiv.height() + 55, 400));
		setTimeout(pager.bindPageLinks, 2);

	},
	next: function() {
		var page = Math.min(pager.curPage + 1, pager.pageCount - 1);
		pager.gotoPage(page);
	},
	prev: function() {
		var page = Math.max(pager.curPage - 1, 0);
		pager.gotoPage(page);
	},
	clickAnchor: function(event) {
		var anchor = $(event.target);
		if (anchor.attr('tagName').toLowerCase() != 'a')
			anchor = anchor.parent('a').first();
		var name = anchor.attr('href').split('#')[1];
		if (isNaN(parseInt(pager.anchors[name]))) {
			console.log('Err! ' + name);
			return;
		}
		pager.gotoPage(parseInt(pager.anchors[name]), name);
		event.stopPropagation();
	},
	bindPageLinks: function() {
		pager.divs[pager.curPage].find("a[href*='#']").each(function(i, anchor) {
			anchor = $(anchor);
			var loc = location.href.split('#')[0];
			var link = anchor.attr('href').split('#');
			if (link[0] == '' || link[0] == loc) {
				anchor.bind('click', pager.clickAnchor);
			}

		});
		pager.divs[pager.curPage].find("a[href*='.html']").each(function(i, anchor) {
			anchor = $(anchor);
			for (var i = 0; i < sdkLinkMapper.length; i++) {
				anchor.attr('href', anchor.attr('href').replace(new RegExp(sdkLinkMapper[i][0], 'i'), sdkLinkMapper[i][1]));
			}
		});
	},
	unbindPageLinks: function(page) {
		pager.divs[page].find("a[href*='#']").each(function(i, anchor) {
			var loc = location.href.split('#')[0];
			var link = $(anchor).attr('href').split('#');
			if (link[0] == '' || link[0] == loc) {
				$(anchor).unbind('click');
			}
		});
	},
	setPagerControlsEnabled: function(link, enabled) {
		link.attr('disabled', enabled ? '' : 'disabled');
		if (enabled)
			link.removeClass('disabled');
		else
			link.addClass('disabled');
		if (link.attr('hasDisabledListener') != '1') {
			link.attr('hasDisabledListener', '1');
			link.click(function(event) {
				if (link.attr('disabled') == 'disabled')
					event.stopPropagation();
			});
		}
	},
	printSDK: function() {
		var win = window.open('/authoring/print.htm', 'printWin', 'height=600,width=800,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
	},
	setPrintContent: function() {
		return pager.divs[pager.curPage].html();
	}
};

