(function($){$.jQTouch=function(options){$.support.WebKitCSSMatrix=(typeof WebKitCSSMatrix=="object");$.support.touch=(typeof Touch=="object");$.support.WebKitAnimationEvent=(typeof WebKitTransitionEvent=="object");var $body,$head=$('head'),hist=[],newPageCount=0,jQTSettings={},hashCheck,currentPage,orientation,isMobileWebKit=RegExp(" Mobile/").test(navigator.userAgent),tapReady=true,lastAnimationTime=0,touchSelectors=[],publicObj={},extensions=$.jQTouch.prototype.extensions,defaultAnimations=['slide','flip','slideup','swap','cube','pop','dissolve','fade','back'],animations=[],hairextensions='';init(options);function init(options){var defaults={addGlossToIcon:true,backSelector:'.back, .cancel, .goback',cacheGetRequests:true,cubeSelector:'.cube',dissolveSelector:'.dissolve',fadeSelector:'.fade',fixedViewport:true,flipSelector:'.flip',formSelector:'form',fullScreen:true,fullScreenClass:'fullscreen',icon:null,touchSelector:'a, .touch',popSelector:'.pop',preloadImages:false,slideSelector:'body > * > ul li a',slideupSelector:'.slideup',startupScreen:null,statusBar:'default',submitSelector:'.submit',swapSelector:'.swap',useAnimations:true,useFastTouch:true,addToHistory:true};jQTSettings=$.extend({},defaults,options);if(jQTSettings.preloadImages){for(var i=jQTSettings.preloadImages.length-1;i>=0;i--){(new Image()).src=jQTSettings.preloadImages[i];};}
if(jQTSettings.icon){var precomposed=(jQTSettings.addGlossToIcon)?'':'-precomposed';hairextensions+='<link rel="apple-touch-icon'+precomposed+'" href="'+jQTSettings.icon+'" />';}
if(jQTSettings.startupScreen){hairextensions+='<link rel="apple-touch-startup-image" href="'+jQTSettings.startupScreen+'" />';}
if(jQTSettings.fixedViewport){hairextensions+='<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;"/>';}
if(jQTSettings.fullScreen){hairextensions+='<meta name="apple-mobile-web-app-capable" content="yes" />';if(jQTSettings.statusBar){hairextensions+='<meta name="apple-mobile-web-app-status-bar-style" content="'+jQTSettings.statusBar+'" />';}}
if(hairextensions)$head.append(hairextensions);$(document).ready(function(){for(var i in extensions)
{var fn=extensions[i];if($.isFunction(fn))
{$.extend(publicObj,fn(publicObj));}}
for(var i in defaultAnimations)
{var name=defaultAnimations[i];var selector=jQTSettings[name+'Selector'];if(typeof(selector)=='string'){addAnimation({name:name,selector:selector});}}
touchSelectors.push('input');touchSelectors.push(jQTSettings.touchSelector);touchSelectors.push(jQTSettings.backSelector);touchSelectors.push(jQTSettings.submitSelector);$(touchSelectors.join(', ')).css('-webkit-touch-callout','none');$(jQTSettings.backSelector).tap(liveTap);$(jQTSettings.submitSelector).tap(submitParentForm);$body=$('body');if(jQTSettings.fullScreenClass&&window.navigator.standalone==true){$body.addClass(jQTSettings.fullScreenClass+' '+jQTSettings.statusBar);}
$body.bind('touchstart',handleTouch).bind('orientationchange',updateOrientation).trigger('orientationchange').submit(submitForm);if(jQTSettings.useFastTouch&&$.support.touch)
{$body.click(function(e){var $el=$(e.target);if($el.attr('target')=='_blank'||$el.attr('rel')=='external'||$el.is('input[type="checkbox"]'))
{return true;}else{return false;}});$body.mousedown(function(e){var timeDiff=(new Date()).getTime()-lastAnimationTime;if(timeDiff<200)
{return false;}});}
if($('body > .current').length==0){currentPage=$('body > *:first');}else{currentPage=$('body > .current:first');$('body > .current').removeClass('current');}
$(currentPage).addClass('current');location.hash=$(currentPage).attr('id');if(jQTSettings.addToHistory){addPageToHistory(currentPage);}
scrollTo(0,0);});}
function goBack(to){if(hist.length>1){var numberOfPages=Math.min(parseInt(to||1,10),hist.length-1);if(isNaN(numberOfPages)&&typeof(to)==="string"&&to!='#'){for(var i=1,length=hist.length;i<length;i++){if('#'+hist[i].id===to){numberOfPages=i;break;}}}
if(isNaN(numberOfPages)||numberOfPages<1){numberOfPages=1;};var animation=hist[0].animation;var fromPage=hist[0].page;hist.splice(0,numberOfPages);var toPage=hist[0].page;animatePages(fromPage,toPage,animation,true);return publicObj;}else{console.error('No pages in history.');return false;}}
function goTo(toPage,animation){var fromPage=hist[0].page;if(typeof(toPage)==='string'){toPage=$(toPage);}
if(typeof(animation)==='string'){for(var i=animations.length-1;i>=0;i--){if(animations[i].name===animation)
{animation=animations[i];break;}}}
if(animatePages(fromPage,toPage,animation)){addPageToHistory(toPage,animation);return publicObj;}
else
{console.error('Could not animate pages.');return false;}}
function getOrientation(){return orientation;}
function liveTap(e){var $el=$(e.target);if($el.attr('nodeName')!=='A'){$el=$el.parent('a');}
var target=$el.attr('target'),hash=$el.attr('hash'),animation=null;if(tapReady==false||!$el.length){console.warn('Not able to tap element.')
return false;}
if($el.attr('target')=='_blank'||$el.attr('rel')=='external')
{return true;}
for(var i=animations.length-1;i>=0;i--){if($el.is(animations[i].selector)){animation=animations[i];break;}};if(target=='_webapp'){window.location=$el.attr('href');}
else if($el.is(jQTSettings.backSelector)){goBack(hash);}
else if(hash&&hash!='#'){$el.addClass('active');goTo($(hash).data('referrer',$el),animation);}else{$el.addClass('loading active');showPageByHref($el.attr('href'),{animation:animation,callback:function(){$el.removeClass('loading');setTimeout($.fn.unselect,250,$el);},$referrer:$el});}
return false;}
function addPageToHistory(page,animation){var pageId=page.attr('id');hist.unshift({page:page,animation:animation,id:pageId});}
function animatePages(fromPage,toPage,animation,backwards){if(toPage.length===0){$.fn.unselect();console.error('Target element is missing.');return false;}
$(':focus').blur();scrollTo(0,0);var callback=function(event){if(animation)
{toPage.removeClass('in reverse '+animation.name);fromPage.removeClass('current out reverse '+animation.name);}
else
{fromPage.removeClass('current');}
toPage.trigger('pageAnimationEnd',{direction:'in'});fromPage.trigger('pageAnimationEnd',{direction:'out'});currentPage=toPage;location.hash=currentPage.attr('id');var $originallink=toPage.data('referrer');if($originallink){$originallink.unselect();}
lastAnimationTime=(new Date()).getTime();tapReady=true;}
fromPage.trigger('pageAnimationStart',{direction:'out'});toPage.trigger('pageAnimationStart',{direction:'in'});if($.support.WebKitAnimationEvent&&animation&&jQTSettings.useAnimations){toPage.one('webkitAnimationEnd',callback);tapReady=false;toPage.addClass(animation.name+' in current '+(backwards?' reverse':''));fromPage.addClass(animation.name+' out'+(backwards?' reverse':''));}else{toPage.addClass('current');callback();}
return true;}
function dumbLoopStart(){dumbLoop=setInterval(function(){var curid=currentPage.attr('id');if(location.hash==''){location.hash='#'+curid;}else if(location.hash!='#'+curid){try{goBack(location.hash);console.log("dumbLoopStart: location.hash: "+location.hash+' currentPage ID: #'+curid);}catch(e){console.error('Unknown hash change.');}}},2000);}
function insertPages(nodes,animation){var targetPage=null;$(nodes).each(function(index,node){var $node=$(this);if(!$node.attr('id')){$node.attr('id','page-'+(++newPageCount));}
$node.appendTo($body);if($node.hasClass('current')||!targetPage){targetPage=$node;}});if(targetPage!==null){goTo(targetPage,animation);return targetPage;}
else
{return false;}}
function showPageByHref(href,options){var defaults={data:null,method:'GET',animation:null,callback:null,$referrer:null};var settings=$.extend({},defaults,options);if(href!='#')
{$.ajax({url:href,data:settings.data,type:settings.method,success:function(data,textStatus){var firstPage=insertPages(data,settings.animation);if(firstPage)
{if(settings.method=='GET'&&jQTSettings.cacheGetRequests&&settings.$referrer)
{settings.$referrer.attr('href','#'+firstPage.attr('id'));}
if(settings.callback){settings.callback(true);}}},error:function(data){if(settings.$referrer)settings.$referrer.unselect();if(settings.callback){settings.callback(false);}}});}
else if($referrer)
{$referrer.unselect();}}
function submitForm(e,callback){var $form=(typeof(e)==='string')?$(e):$(e.target);if($form.length&&$form.is(jQTSettings.formSelector)&&$form.attr('action')){showPageByHref($form.attr('action'),{data:$form.serialize(),method:$form.attr('method')||"POST",animation:animations[0]||null,callback:callback});return false;}
return true;}
function submitParentForm(e){var $form=$(this).closest('form');if($form.length)
{evt=jQuery.Event("submit");evt.preventDefault();$form.trigger(evt);return false;}
return true;}
function addAnimation(animation){if(typeof(animation.selector)=='string'&&typeof(animation.name)=='string'){animations.push(animation);$(animation.selector).tap(liveTap);touchSelectors.push(animation.selector);}}
function updateOrientation(){orientation=window.innerWidth<window.innerHeight?'profile':'landscape';$body.removeClass('profile landscape').addClass(orientation).trigger('turn',{orientation:orientation});}
function handleTouch(e){var $el=$(e.target);if(!$(e.target).is(touchSelectors.join(', ')))
{var $link=$(e.target).closest('a');if($link.length){$el=$link;}else{return;}}
if(event)
{var hoverTimeout=null,startX=event.changedTouches[0].clientX,startY=event.changedTouches[0].clientY,startTime=(new Date).getTime(),deltaX=0,deltaY=0,deltaT=0;$el.bind('touchmove',touchmove).bind('touchend',touchend);hoverTimeout=setTimeout(function(){$el.makeActive();},100);}
function touchmove(e){updateChanges();var absX=Math.abs(deltaX);var absY=Math.abs(deltaY);if(absX>absY&&(absX>35)&&deltaT<1000){$el.trigger('swipe',{direction:(deltaX<0)?'left':'right'}).unbind('touchmove touchend');}else if(absY>1){$el.removeClass('active');}
clearTimeout(hoverTimeout);}
function touchend(){updateChanges();if(deltaY===0&&deltaX===0){$el.makeActive();$el.trigger('tap');}else{$el.removeClass('active');}
$el.unbind('touchmove touchend');clearTimeout(hoverTimeout);}
function updateChanges(){var first=event.changedTouches[0]||null;deltaX=first.pageX-startX;deltaY=first.pageY-startY;deltaT=(new Date).getTime()-startTime;}}
$.fn.unselect=function(obj){if(obj){obj.removeClass('active');}else{$('.active').removeClass('active');}}
$.fn.makeActive=function(){return $(this).addClass('active');}
$.fn.swipe=function(fn){if($.isFunction(fn))
{return this.each(function(i,el){$(el).bind('swipe',fn);});}}
$.fn.tap=function(fn){if($.isFunction(fn))
{var tapEvent=(jQTSettings.useFastTouch&&$.support.touch)?'tap':'click';return $(this).live(tapEvent,fn);}else{$(this).trigger('tap');}}
publicObj={getOrientation:getOrientation,goBack:goBack,goTo:goTo,addAnimation:addAnimation,submitForm:submitForm}
return publicObj;}
$.jQTouch.prototype.extensions=[];$.jQTouch.addExtension=function(extension){$.jQTouch.prototype.extensions.push(extension);}})(jQuery);
