/*
 *  These first few functions need to be
 *  replaced by jQuery equivalents ... someday.
 */

//--------------------------------------------------------

if (!Array.indexOf) { 
	jQuery.extend( Array.prototype, {  ///NodeList.prototype, HTMLCollection.prototype, Object.prototype, {
		indexOf: function(obj) {
			for (var i=0; i<this.length; i++) {
				if (this[i]==obj) {
					return i;
				}
			}
			return -1;
		 }
	});
}
//--------------------------------------------------------

var stepSize = -10;
var speed = 24;
var topz = 111;

var currentPage = null;
var currentHash = location.hash;

var useWebKitAnimations = (typeof WebKitTransitionEvent === "object");
var isFullScreenMode = (window.navigator.standalone === true) || !(window.onorientationchange && typeof(window.onorientationchange) === "object");

var animating = true;
var defaultAnimation = "slide";

var glowing = false;
var isDialog = false


var orientationTimer;
var orientationTimerMs = 250;

var hashPrefix = "#";
var pageHistory = [];

var $jqt = null;

var ajaxGet = null;


function adjustBodyToEl() {
	$('div.page.current').css({'height':'auto'});
}

function checkOrientationAndLocationHash()
{
	if (location.hash != currentHash)
	{
		currentHash = location.hash;
		var page = $(currentHash)[0];
		if (page)
		{
			var index = pageHistory.indexOf(currentHash.substr(hashPrefix.length));
			var backwards = index != -1;
			if (backwards) pageHistory.splice(index, pageHistory.length);
			showPage(page, backwards);
		}
	}
}
		
//--------------------------------------------------------
//--------------------------------------------------------

function showPage(page, backwards)
{
	if(!page) return;

	///console.log("showPage:: "+page+" / "+page.id);

	backwards = !!backwards;
	if(currentPage) {location.href = currentHash = hashPrefix + currentPage.id;}
	orientationTimer = clearInterval(orientationTimer);
	var fromPage = currentPage;
	currentPage = page;
	location.href = currentHash = hashPrefix + page.id;
	$('#homeButton',page).css({display:(pageHistory.length>0?'block':'none')});
	$('#backButton',page).css({display:(pageHistory.length>1?'block':'none')});
	pageHistory.unshift(page.id);
	if (fromPage)
	{
		setTimeout(function(){ transitionPage(fromPage, page, backwards); },1);
	} else {
		
		// ToDo:  move this to show page...
		setTimeout( function() {
			$(page).css({'display':'none','left':0}).fadeIn(500,
				function() {
					$(page).css({'display':''}).addClass('current');
					location.hash = currentHash = hashPrefix + $(page).attr('id');
					orientationTimer = setInterval( checkOrientationAndLocationHash, orientationTimerMs );
					///console.log("fade in complete: "+page.id+" / "+currentPage.className);
					animating = false;
				});
			}, 100);
	}
}

function transitionPage(fromPage, toPage, backwards)
{
	animating = true;

	if(window.pageYOffset !== 0 ) { scrollTo(0, 0); }
	$(':focus').blur();
	if( useWebKitAnimations)
	{
		var animation = backwards ?
				fromPage.getAttribute('animation') || defaultAnimation :
				toPage.getAttribute('animation') || defaultAnimation ;
		toPage.data = { referrer:fromPage, animation:animation };
		var callback = function animationEnd(event)
		{
			$(fromPage).removeClass('current');
			if (animation)
			{
				$(toPage).removeClass('in start '+animation);
				$(fromPage).removeClass('current out start '+animation);
				if (backwards)
				{
					$(toPage).toggleClass('reverse');
					$(fromPage).toggleClass('reverse');
				}
			}
			currentPage = toPage;

			location.hash = hashPrefix + currentPage.id;

			var $originallink = $(toPage.data.referrer);
			if ($originallink) { $originallink.removeClass('selected'); }
			adjustBodyToEl();
			orientationTimer = setInterval( checkOrientationAndLocationHash, orientationTimerMs );

			$(toPage).unbind('webkitTransitionEnd', callback);
			$(toPage).unbind('webkitAnimationEnd', callback);

			animating = false;
			$jqt.removeClass('animating');
		}

		$jqt.addClass('animating');

		$(toPage).bind('webkitTransitionEnd', callback);
		$(toPage).bind('webkitAnimationEnd', callback);

		if (backwards)
		{
			$(toPage).toggleClass('reverse');
			$(fromPage).toggleClass('reverse');
		}

		$(toPage).addClass(animation+' in current');
		$(fromPage).addClass(animation+' out');
		setTimeout(function(){
			$(toPage).addClass('current start');
			$(fromPage).addClass('start');
		}, 0);
		
	}
	else
	{	// js slide default...
		$(toPage).css({'left':'100%','zIndex':topz++,'display':'block'});
		var percent=100, timer=setInterval(function()
		{
			percent += stepSize;
			if (percent <= 0)
			{
				animating = false;
				percent = 0;
				$(fromPage).css({'left':'0','display':''}).removeClass("current");
				clearInterval(timer);
				$(fromPage).css('left',"0%");
				$(toPage).css('left',"0%");
				orientationTimer = setInterval(checkOrientationAndLocationHash, orientationTimerMs);
				setTimeout(adjustBodyToEl,0);
			}
			else
			{
				$(fromPage).css({'left':(backwards ? (100-percent) : (percent-100)) + "%"});
				$(toPage).css({'left':(backwards ? -percent : percent) + "%"}).removeClass('current');
			}
		}, speed);
	}
	return true;
}

//--------------------------------------------------------
//--------------------------------------------------------

function goBack(to)  // to number OR hash
{
	if( pageHistory.length )
	{
		var numberOfPages = Math.min(parseInt(to || 1, 10), pageHistory.length-1);

		if( isNaN(numberOfPages) && typeof(to) === "string" && to != '#' )
		{
			numberOfPages = pageHistory.indexOf(to.substr(1));
		}
		if( isNaN(numberOfPages) || numberOfPages < 1 )
		{
			numberOfPages = 1;
		}
		if (pageHistory.length > 1)
		{
			pageHistory.splice(0, numberOfPages);
			to = pageHistory.shift();
			showPage(jQuery(hashPrefix+to)[0], true);
		}
		else
		{
			location.href = currentHash = hashPrefix + (pageHistory[0]=currentPage.id);
		}
	}
}

//--------------------------------------------------------
//--------------------------------------------------------

function pageClickHandler(event)
{
	var target = event.target;
	if (target === undefined || animating || isDialog ) return false;
	if (target.nodeType == 3) { target = target.parentNode; }
	if (target.toString() === "[object HTMLAreaElement]") {
		event.preventDefault();
		event.stopPropagation();
		return false;
	}
	var tmp=$(target).closest('a');

	if (tmp === undefined) { return false; }
	else {
		function unselect() { tmp.removeClass('selected'); }

		if (tmp.hasClass('glowable')) { glowOnTouch(tmp[0]); }

		if ( tmp.target === "_scroll" )
		{
			event.preventDefault();
			event.stopPropagation();
			tmp.scrollIntoView(true);
			return false;
		}
		else if (tmp.hasClass("home"))
		{
			event.preventDefault();
			event.stopPropagation();
			if (!tmp.hasClass('glowable')) {
				tmp.addClass("selected");
				setTimeout(unselect, 500);
			}
			goBack(pageHistory.length-1);
			return false;
		}
		else if (tmp.hasClass(["back", "goback", "close", "cancel"]))
		{
			event.preventDefault();
			event.stopPropagation();
			if (!tmp.hasClass('glowable')) {
				tmp.addClass("selected");
				setTimeout(unselect, 500);
			}
			goBack(tmp.hash);
			return false;
		}
		else if (tmp.hasClass("disabled"))
		{
			event.preventDefault();
			event.stopPropagation();
			return false;
		}
		else if (tmp.hasClass("ajaxMore") && tmp[0].href)
		{
			event.preventDefault();
			event.stopPropagation();
					/*
					if (!tmp.hasClass('glowable')) {
						tmp.addClass("selected");
						setTimeout(unselect, 500);
					}
					loadAndReplace(tmp);
					*/
			return false;
		}
		else if ( tmp.hasClass("ajaxPage") && tmp[0].href && tmp[0].hash )
		{
			event.preventDefault();
			event.stopPropagation();
			tmp.addClass("selected");
			setTimeout(unselect, 500);
			$jqt.append( $('.pagetemplate').clone().
				removeClass('pagetemplate').
				attr('id',tmp[0].hash.substring(1) ) );
			var $tmphash = $(tmp[0].hash);
			showPage($tmphash[0]);  // loading page...

			setTimeout( function() {  unselect();
					$tmphash.load('./ajax/'+tmp[0].hash.substring(1)+'.html .page>div', null, function() {
//console.log("ajax return status: "+arguments[1]+" / "+('./ajax/'+tmp[0].hash.substring(1)+'.html'));
					if ( arguments[1] === "success" )
					{
						$('#backButton',$tmphash[0]).css({display:(pageHistory.length>2?'block':'none')});

					} else {
						alert("This page is currently unavailable:\n\n"+('./ajax/'+tmp[0].hash.substring(1)+'.html\n'));
						goBack(1);
					}				
				});
			}, 500);
			return false;
		}
		else if ( tmp.hasClass('confirm') )
		{
			tmp.addClass("selected");
			isDialog = true;
			if (confirm("\nThis link opens in a new window without 'BACK' navigation.\nContinue?\n"))
			{
				setTimeout(unselect, 500);
				isDialog = false;
				return true;
			} else {
				event.preventDefault();
				event.stopPropagation();
				unselect();
				isDialog = false
				return false;
			}
		}
		else if (tmp[0].href && tmp[0].hash && tmp[0].hash != "#" && !tmp[0].target)
		{
			event.preventDefault();
			event.stopPropagation();
			tmp.addClass("selected");
			var $tmphash = $(tmp[0].hash);
			if( $tmphash.length ) {
				showPage($tmphash[0]);
				setTimeout(unselect, 500);
			}
			return false;
		}
	}
	return true;
}

//--------------------------------------------------------
//--------------------------------------------------------

function scrollPageToTop()
{
	setTimeout(function() {
		if (animating) return;
		location.href = currentHash = hashPrefix + currentPage.id;
	}, 0);
}

function adjustBodyHeight(){ $('div.page.current').css('height','auto');}

function updateOrientation() {
	var tmp = window.orientation%180 ? 'landscape' : 'portrait';
	$('#jqt').removeClass('portrait landscape').addClass(tmp).trigger('turn', {orientation: tmp});
}

function glowOnTouch(el)
{
	var	topElement = $(el).closest('.page'),
		valueX = 0,
		valueY = 0,
		element = el,
		diameter = 40,
		radius = Math.round(diameter/2);
	do{ valueX += element.offsetLeft || 0;
		valueY += element.offsetTop || 0;
		element = element.offsetParent;
	} while (element && element !== topElement);
	valueX = parseInt(valueX + (el.offsetWidth/2) - radius, 10);
	valueY = parseInt(valueY + (el.offsetHeight/2) - radius, 10);
	var glowcanvas = document.createElement('img');
	glowcanvas.id = 'elementTouched';
	glowcanvas.src = "themes/red/img/glowWhite.png";
	$(glowcanvas).css( {
			position: 'absolute',
			left: valueX + 'px',
			top: valueY + 'px',
			width: diameter + 'px',
			height: diameter + 'px',
			zIndex: 111111
		} );
	$(topElement).append(glowcanvas);
	setTimeout(function(){ $(glowcanvas).remove(); glowcanvas=null; },550);
};

//--------------------------------------------------------
//--------------------------------------------------------

jQuery(document).ready( function(event)
{
	$jqt = $('#jqt');
	if(preloadImages){for(var i=preloadImages.length-1;i>=0;i--){(new Image()).src=preloadImages[i];};}
	if ($('#jqt > div.page.current').length == 0) {
		var tmp = $('#jqt > div.page')[0];
	} else {
		var tmp = $('#jqt > div.page.current')[0];
	}
	$('#jqt > div.page.current').removeClass('current');
	$jqt.bind('orientationchange',updateOrientation).bind('click',pageClickHandler);
	
	showPage( tmp, true );
	if (typeof(onDomReady) === 'function') { onDomReady(); }

}, false);

//--------------------------------------------------------
//--------------------------------------------------------
