/* Meshfields AJAX and DOM Control */

try{Typekit.load();}catch(e){}

// path to backend script
var pathToPhp = "wp-content/themes/beta/";
	
	// AJAX Core function
	function ajaxFunction(url,callback,postData) {
	    var req = createXMLHTTPObject();
	    if (!req) return;
	    var method = (postData) ? "POST" : "GET";
	    req.open(method,url,true);
	    req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	    if (postData)
	        req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	    req.onreadystatechange = function () {
	        if (req.readyState != 4) return;
	        if (req.status != 200 && req.status != 304) {
				// alert('HTTP error ' + req.status);
	            return;
	        }
	        callback(req.responseXML);
	    }
	    if (req.readyState == 4) return;
	    req.send(postData);
	}
	
	var XMLHttpFactories = [
	    function () {return new XMLHttpRequest()},
	    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
	    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
	    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];
	
	function createXMLHTTPObject() {
	    var xmlhttp = false;
	    for (var i=0;i<XMLHttpFactories.length;i++) {
	        try {
	            xmlhttp = XMLHttpFactories[i]();
	        }
	        catch (e) {
	            continue;
	        }
	        break;
	    }
	    return xmlhttp;
	}
	
	
	// Callback from HTTP EventListener for ImageData
    var setImgData = function(responseContent) {
    
       	// Delete old nodes if there are any
       	var sectionParent = document.getElementById("section3XML");
       
        if (sectionParent.childNodes[0]) {
        
        	while(sectionParent.hasChildNodes() ) {
				sectionParent.removeChild(sectionParent.childNodes[0])
			}
		}
    
    	// retreive the dir
        var actualDirectory = responseContent.getElementsByTagName("directory")[0].getAttribute('name');
        
        // retreive child objects of dir and store them
        var directory = responseContent.getElementsByTagName("file");
        
        // hide arrows if to few pictures
        if (directory.length < 3) {
        	document.getElementById("buttonRight").style.visibility = "hidden";
        	document.getElementById("buttonLeft").style.visibility = "hidden";
        }
        
        else {
        	document.getElementById("buttonRight").style.visibility = "visible";
        	document.getElementById("buttonLeft").style.visibility = "visible";
        }
        
        // cycle through child objects of dir
        for (var i=0;i<directory.length;i++) {
        
        	var x = document.createElement('img');
       		 	
        	x.src = pathToPhp + actualDirectory + '/' + directory[i].childNodes[0].nodeValue;
        	x.alt = directory[i].childNodes[0].nodeValue;
        	
        	// append the pics to the corresponding html5 section
        	document.getElementById("section3XML").appendChild(x);
        }
        
		// reset x-position of the section in case we already animated 
		sectionParent.style.left = 0;
		
        // If we show Portfolio, we start a new AJAX Request for portfolio.xml
        if (actualDirectory === "img_portfolio") {
        	return ajaxFunction(pathToPhp + "portfolio.xml", setXMLData);
        }
    }
    
    // Callback from HTTP EventListener for XMLData
    var setXMLData = function(responseContent) {
    	
    	for (var i=1; i<4; i++) {
    
	    	var j = i-1;
	    	
	        var x = document.createElement('div');
	        x.id = "txt"+i;
	        document.getElementById("section3XML").appendChild(x);
	        
	        var newel = document.createElement('h1');
	        //var newtext = document.createTextNode(responseContent.getElementsByTagName("title")[j].childNodes[0].nodeValue);
	        var myLink = document.createElement('a');
	        myLink.href = responseContent.getElementsByTagName("link")[j].childNodes[0].nodeValue;
	        myLink.target = "_blank";
	        myLink.innerText = responseContent.getElementsByTagName("title")[j].childNodes[0].nodeValue;
	        
	        newel.appendChild(myLink); 
	        document.getElementById("txt"+i).appendChild(newel);
	        
			var newel = document.createElement('h2');
	        var newtext = document.createTextNode(responseContent.getElementsByTagName("subtitle")[j].childNodes[0].nodeValue);
	        newel.appendChild(newtext); 
	        document.getElementById("txt"+i).appendChild(newel);
	        
	        var newel = document.createElement('h3');
	        var newtext = document.createTextNode(responseContent.getElementsByTagName("function")[j].childNodes[0].nodeValue);
	        newel.appendChild(newtext); 
	        document.getElementById("txt"+i).appendChild(newel);
	        
	        var newel = document.createElement('h4');
	        var newtext = document.createTextNode(responseContent.getElementsByTagName("description")[j].childNodes[0].nodeValue);
	        newel.appendChild(newtext); 
	        document.getElementById("txt"+i).appendChild(newel);
	        	        
        }
    }

	// domImg Object
	var domImg = {
		
		skipPhpImgFilter: function (imgId) {
			// uses regex to get rid of the greyscale
			return document.getElementById(imgId).src = document.getElementById(imgId).src.replace(/grey.png/, ".png"); 
		},
			// this method injects the grey right back into the DOM images 'src' attribute
		usePhpImgFilter: function (imgId) {
			return document.getElementById(imgId).src = document.getElementById(imgId).src.replace(/.png/, "grey.png");
		}
	}
	

    // Event Delegation
    document.onclick = function(event) {

    	// IE8 bubbles instead of capture events
    	var event = event || window.event;
    	var target = event.target || event.srcElement;
    	
    	switch(target.innerHTML) {
    		// Ajax
    		case "Official Work": return ajaxFunction(pathToPhp + "getdir.php?dir=img_portfolio", setImgData); 
    		case "Photography": return ajaxFunction(pathToPhp + "getdir.php?dir=img_photography", setImgData); 
    		case "Scribbles": return ajaxFunction(pathToPhp + "getdir.php?dir=img_scribbles", setImgData); 
    	}		
    	
    	switch(target.id) {
    		// Animation
    		case "buttonLeftImg":return animatePics(319);
    		case "buttonRightImg":return animatePics(-319);
    	}
 	}
 	
 	
 	document.onmouseover = function(event) {

    	var event = event || window.event;
    	var target = event.target || event.srcElement;
    	
    	switch(target.className) {
    		// we use the domImg Object from above which en-/disables grey (or gray in british)
    		case "twitter": 	return domImg.skipPhpImgFilter('twitterImg');
    		case "facebook": 	return domImg.skipPhpImgFilter('facebookImg');
    		case "reddit": 		return domImg.skipPhpImgFilter('redditImg');
    		case "stumbleupon":	return domImg.skipPhpImgFilter('stumbleuponImg');
    		case "diggit":		return domImg.skipPhpImgFilter('diggitImg'); 
    		case "google": 		return domImg.skipPhpImgFilter('googleImg');  
    		case "delicious": 	return domImg.skipPhpImgFilter('deliciousImg'); 
    		case "stack": 		return domImg.skipPhpImgFilter('stackImg');       
    	}
    }
  
  	document.onmouseout = function(event) {
  	
  		var event = event || window.event;
  		var target = event.target || event.srcElement;
  			
  		switch(target.className) {
  			case "twitter": 	return domImg.usePhpImgFilter('twitterImg');
  			case "facebook": 	return domImg.usePhpImgFilter('facebookImg'); 
  			case "reddit": 		return domImg.usePhpImgFilter('redditImg'); 
  			case "stumbleupon": return domImg.usePhpImgFilter('stumbleuponImg');
  			case "diggit": 		return domImg.usePhpImgFilter('diggitImg'); 
  			case "google": 		return domImg.usePhpImgFilter('googleImg');   
  			case "delicious": 	return domImg.usePhpImgFilter('deliciousImg');
  			case "stack": 	return domImg.usePhpImgFilter('stackImg');    			
  		}
  	}
  	
  	// \.(?:jpg|gif|png)$
  	// <?php bloginfo('template_url'); ?>/imagegrey.php?i=img/icons/reddit.png
  
	// Animation 
	var animatePics = function (deltaValue) {
		var DOMelement = document.getElementById('section3XML');
		var DOMelementProp = 'left';
		var startValue = DOMelement.offsetLeft;
		var endValue = startValue + deltaValue;
		var duration = 0.3; 	
		
		// get all images we loaded via AJAX
		var section3XMLImages = document.getElementById('section3XML').getElementsByTagName('img');
		
		// check if we should animate to very first or last pic thus alter the endValue
		if (endValue <= (section3XMLImages.length-1)*(-319)) {
			
			endValue = 0;
		}
		
		else if (endValue === 319) {
			
			endValue = ((section3XMLImages.length-2)*(-319));
		}
		
		// animate the pics according to calculated endValue
		myTween = new Tween(DOMelement.style,DOMelementProp,Tween.regularEaseInOut,startValue,endValue,duration,'px');
		myTween.start();

	}
	
	ajaxFunction(pathToPhp + "getdir.php?dir=img_portfolio", setImgData); 
	

/* Typekit Fonts API */
var Typekit=(function(y){var x={ua:function(j){if(j){for(var S=0;S<this.enabledMatchers.length;S++){var U=this.enabledMatchers[S][1];if(U.call(null,j)){var T=this.enabledMatchers[S][0];return{fonts:(!!T),format:T}}}return{fonts:false}}},enabledMatchers:[],enable:function(T){this.enabledMatchers=[];for(var j=0;j<this.matchers.length;j++){var U=this.matchers[j];for(var S=0;S<T.length;S++){if(U[0]==T[S]){this.enabledMatchers.push([U[1],U[2]]);break}}}},matchers:[],add:function(j,S,i){this.matchers.push([S,j,i])}};var M={};x.add("d","ff36",function(S){var j=S.match(/rv:(\d+\.\d+)\.(\d+).*Gecko\//);if(j){var i=parseFloat(j[1]);var T=parseInt(j[2]);if(i>=1.9&&T>1){return true}else{return false}}});x.add("b","ff35",function(j){var i=j.match(/rv:1\.9\.1.*Gecko\//);if(j.match(/rv:1.9.1b[123]{1}/)){return false}if(i){return true}else{return false}});M.isMobileOSX=function(j){var i=j.match(/OS.(\d)_(\d)/);if(i){if(i[1]=="3"){return parseInt(i[2])>0}else{if(parseInt(i[1])>3){return true}}}return false};x.add("f","iphone",function(i){if(!i.match(/(iPhone|iPod)/)){return false}return M.isMobileOSX(i)});x.add("f","ipad",function(i){if(!i.match(/iPad/)){return false}return M.isMobileOSX(i)});M.isSafari=function(S){if(S.match(/Chrome/)){return false}if(S.match(/(iPhone|iPad|iPod)/)){return false}if(S.match(/webOS/)){return false}if(S.match(/Android/)){return false}var j=S.match(/AppleWebKit\/(\d+\.\d+)/);if(j){var i=j[1];return parseFloat(i)>=525.13}};M.isChrome=function(S){var j;if(S.match(/Chrome/)){j=S.match(/Chrome\/(\d+\.\d+)\.(\d+)\.(\d+)/);if(j){var i=parseFloat(j[1]);var T=parseInt(j[2]);var U=parseInt(j[3]);if(i>4){return true}else{if(i==4&&T>249){return true}else{if(i==4&&T==249&&U>=4){return true}else{return false}}}}}};x.add("b","chromewin",function(i){return M.isChrome(i)});x.add("b","safari",M.isSafari);x.add("c","ie",function(S){var j=S.match(/MSIE\s(\d+\.\d+)/);if(j){var i=j[1];return parseFloat(i)>=6}});var g=(function(){var j=document.defaultView||{};var T=false;var V=false;var U=[];function i(){if(!T){T=true;for(var W=0;W<U.length;W++){U[W].call(null)}}}function S(){if(V){return}V=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);i()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);i()}});if(document.documentElement.doScroll&&window==window.top){(function(){if(T){return}try{document.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}i()})()}}}if(window.onload){var W=window.onload;window.onload=function(){W();i()}}else{window.onload=i}}return{ready:function(W){S();if(T){W()}else{U.push(W)}},insertInto:function(X,Y){var W=document.getElementsByTagName(X)[0];if(W&&W.lastChild){W.insertBefore(Y,W.lastChild);return true}else{return false}},createStyleElement:function(W){var X=document.createElement("style");X.setAttribute("type","text/css");if(X.styleSheet){X.styleSheet.cssText=W}else{X.appendChild(document.createTextNode(W))}return X},createCssLink:function(X){var W=document.createElement("link");W.setAttribute("rel","stylesheet");W.setAttribute("type","text/css");W.setAttribute("href",X);return W},css:function(X,Y){if(j.getComputedStyle){var W=j.getComputedStyle(X,null);return W?W.getPropertyValue(Y):null}else{if(X.currentStyle){return X.currentStyle[Y]}}},loadScript:function(aa,Z){var Y=document.getElementsByTagName("head")[0];if(Y){var X=document.createElement("script");X.src=aa;var W=false;X.onload=X.onreadystatechange=function(){if(!W&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){W=true;if(Z){Z()}X.onload=X.onreadystatechange=null;if(X.parentNode.tagName=="HEAD"){Y.removeChild(X)}}};Y.appendChild(X)}},appendClassName:function(Y,W){var X=" "+Y.className+" ";if(!X.match("\\s+"+W+"\\s+")){Y.className=Y.className+" "+W}},removeClassName:function(aa,X){var Z=" "+aa.className+" ";if(Z.match("\\s+"+X+"\\s+")){var W=Z.split(/\s+/);var Y=0;var ab=[];for(Y=0;Y<W.length;Y++){if(W[Y]!=X&&W[Y]!=""){ab.push(W[Y])}}aa.className=ab.join(" ")}}}})();function A(){return"/k"}function h(){return"http://"}var L={};var q={};var B={};var E=[];var d={};var t={};var o=[];if(window.tkKitsTracked==undefined){window.tkKitsTracked=0}function l(j){for(var i in j){q[i]=j[i]}e("setOptions",q)}function c(S){if(S.enabledBrowsers){x.enable(S.enabledBrowsers)}var j=q.ua;if(j){var i=x.ua(j);q.fonts=i.fonts;q.compatibility=i.format;e("detectUA",q.fonts,q.compatibility)}}function e(i){if(q.debug&&window.console&&window.console.log){window.console.log(arguments)}}function P(i,j){if(!d[i]){d[i]=[]}if(j){d[i].push(j);e("addCallback",i,d[i].length,j)}}function r(i){var j=document.getElementsByTagName("html")[0];if(j){g.appendClassName(j,i)}}function J(i){var j=document.getElementsByTagName("html")[0];if(j){g.removeClassName(j,i)}}function z(j){var i=new Date().getTime();P(j,function(S){Q(j).time=(new Date().getTime())-i})}function D(U,T){e("executeCallbacks",U);var S=d[U];if(S){for(var j=0;j<S.length;j++){S[j](T)}}}function b(T,i,U,j,S){e("addDataSet",T,i,U,j,S);E.push(T);B[T]={kitId:T,securityToken:i,badgeOptions:U,kitOptions:j,callbackData:S};B[T].callbackData.kitId=T}function u(j,i){if(j){e("loading kit",j);I(B[j],i)}else{for(var S in B){e("loading kit",S);I(B[S],i)}}}function I(i,j){c(i.kitOptions);if(i&&i.kitId){e("loadKit",i);o.push(i);m(i.callbackData);if(j["kit-initialized"]){j["kit-initialized"](i.callbackData)}if(q.fonts){z(i.kitId);J("wf-inactive");r("wf-loading");if(j.loading){j.loading(i.callbackData)}P(i.kitId,function(){J("wf-loading");r("wf-active");if(j.active){j.active(i.callbackData)}});R(i.kitId,i.securityToken,q.compatibility)}else{J("wf-loading");r("wf-inactive");if(j.inactive){j.inactive(i.callbackData)}}if(j["kit-loaded"]){j["kit-loaded"](i.callbackData)}}else{e("loadKit","data is invalid",i)}}function m(Y){if(Y&&Y.fonts){var Z=Y.fonts;var W=[];for(var V=0;V<Z.length;V++){var S=Z[V];if(S){var X=Z[V].css_stack;var U=Z[V].css_selectors;if(X&&U){for(var T=0;T<U.length;T++){W.push(U[T]+"{font-family:"+X+";}")}}}}g.insertInto("head",g.createStyleElement(W.join("")))}}function R(T,i,j){var S=h()+q.host+q.root+A()+"/"+T+"-"+j+".css?"+i;e("loadKitStyle",S);if(g.insertInto("head",g.createCssLink(S))){n(T)}}function n(U){e("waitForStyleLoaded",U);var j=function(X){var i=document.createElement("span");i.setAttribute("class","wf-font-watcher");i.setAttribute("style","position:absolute;left:-999px;font-size:200px;font-family:"+X+",NONE");i.innerHTML="Mm";return i};var V=function(X,ab){var i=j("NONE");var aa=j(W[S].css_stack);g.insertInto("html",i);g.insertInto("html",aa);var Z=i.offsetWidth;var Y=function(){if(aa.offsetWidth!=Z){ab()}else{setTimeout(Y,q.styleLoadIntervalTime)}};Y()};var W=B[U].callbackData.fonts;if(W&&W.length>0){var T=W.length;for(var S=0;S<W.length;S++){V(W[S].css_stack,function(){if(--T==0){if(B[U]){D(U,B[U].callbackData)}}})}}else{D(U,B[U].callbackData)}}function Q(j){var i=t[j];if(!i){i=t[j]={time:0}}return i}function f(j,i){L[j]=i}function w(){if(!q.fonts){return}for(var T=0;T<o.length;T++){var S=o[T];var V=S.badgeOptions;if(V&&V.enabled){var U=L["default"];if(U){var j=U(S.kitId,V,q);if(j){j.setAttribute("id","typekit-badge-"+S.kitId);g.insertInto("body",j)}}}}}function p(){if(window.tkKitsTracked>0){return}for(var S=0;S<o.length;S++){var j=o[S];var T=j.kitOptions;if(T&&T.ga){if(window._gat){v()}else{var V=h();var U=V.match(/https/)?"ssl":"www";g.loadScript(V+U+".google-analytics.com/ga.js",v)}break}}}function v(){try{window._gat._getTracker("UA-8850781-3")._trackPageview()}catch(i){}window.tkKitsTracked++}g.ready(w);g.ready(p);l({host:"use.typekit.com",root:"",assetHost:"use.typekit.com",assetRoot:"",colophonHost:"typekit.com",ua:navigator.userAgent,styleLoadIntervalTime:30,bodyWaitIntervalTime:20,debug:false});function C(){return{addDataSet:b,clearDataSets:function(){B={}},insertBadges:w,optionallyCallGoogleAnalytics:p}}function k(){return{configure:l,load:function(i){var S,j;if(typeof arguments[0]=="string"){S=arguments[0];j=arguments[1]}else{S=null;j=arguments[0]}u(S,j||{})},stats:Q}}f("default",function(X,V,aa){function Z(ad,ac){var ab=0,ae=0;if(document.documentElement&&(document.documentElement[ad]||document.documentElement[ac])){ab=document.documentElement[ad];ae=document.documentElement[ac]}else{if(document.body&&(document.body[ad]||document.body[ac])){ab=document.body[ad];ae=document.body[ac]}}return[ab,ae]}function U(){return Z("clientWidth","clientHeight")}function S(){return Z("scrollLeft","scrollTop")}function T(ad,ac,ab){if(ad.attachEvent){ad["e"+ac+ab]=ab;ad[ac+ab]=function(){ad["e"+ac+ab](window.event)};ad.attachEvent("on"+ac,ad[ac+ab])}else{ad.addEventListener(ac,ab,false)}}var W=document.createElement("img");var j=62;var Y=25;W.setAttribute("width",j);W.setAttribute("height",Y);W.setAttribute("src",h()+aa.assetHost+aa.assetRoot+"/badges/default.gif");W.setAttribute("class","typekit-badge");W.setAttribute("alt","Fonts by Typekit");W.setAttribute("title","Information about the fonts used on this site");W.style.position="fixed";W.style.zIndex=2000000000;W.style.right=0;W.style.bottom=0;W.style.cursor="pointer";W.style.border=0;W.style.content="normal";W.style.display="inline";W.style["float"]="none";W.style.height=Y+"px";W.style.left="auto";W.style.margin=0;W.style.maxHeight=Y+"px";W.style.maxWidth=j+"px";W.style.minHeight=Y+"px";W.style.minWidth=j+"px";W.style.orphans=2;W.style.outline="none";W.style.overflow="visible";W.style.padding=0;W.style.pageBreakAfter="auto";W.style.pageBreakBefore="auto";W.style.pageBreakInside="auto";W.style.tableLayout="auto";W.style.textIndent=0;W.style.top="auto";W.style.unicodeBidi="normal";W.style.verticalAlign="baseline";W.style.visibility="visible";W.style.widows=2;W.style.width="65px";T(W,"click",function(){document.location.href="http://"+aa.colophonHost+"/colophons/"+X});if(aa.ua.match(/MSIE\s(\d+\.\d+)/)){W.style.position="absolute";function i(){W.style.bottom="auto";W.style.right="auto";W.style.top=(S()[1]+U()[1]-Y)+"px";W.style.left=(S()[0]+U()[0]-3-j)+"px"}g.ready(i);T(window,"scroll",i);T(window,"resize",i)}return W});b("pir8lzx","3bb2a6e53c9684ffdc9a98f6195b2a62600ffda1783020e14daccf9b34f7003d6c0fcf4fd20fb3f685e72b85a8681a06c27b68a0209ad850a2c63d8414cb50c7c950f993601deb0b9bae96e25827163fe6250d6ac263816cfec7fce4eead68fcae08e988b34828907c60dbd19ce1892473bfb5053d9cd4d522e33cda57e1534ca048fae6909c2890b68bce844dee471be143a01fc9d98a0257466c1f28ca402d946835e97db2ba06263d0466134d0e9b6275f742640942a708ba6abad0b39e4e51eed23bdcae6028638f97",{enabled:true},{ga:true,enabledBrowsers:["ff36","ff35","safari","chrome","chromewin","ie"]},{fonts:[{font_family_name:'"fertigo-script-1","fertigo-script-2"',fvds:["n4"],css_stack:'"fertigo-script-1","fertigo-script-2",cursive',css_selectors:["#heading","blog-title h1","text1"]},{font_family_name:'"anivers-1","anivers-2"',fvds:["n4","i4","n7"],css_stack:'"anivers-1","anivers-2",sans-serif',css_selectors:["span"]}]});if(window.__webfonttypekitmodule__){for(var G=0;G<E.length;G++){var s=E[G];var a=window.__webfonttypekitmodule__[s];if(a){var N=B[s];var K=[];var O={};for(var F=0;F<N.callbackData.fonts.length;F++){var H=N.callbackData.fonts[F];K.push(H.font_family_name);O[H.font_family_name]=H.fvds}a(function(j,T,S){l(T.configure||{});u(s,{});var i=q.fonts;S(i,K,O)})}}}return k()})();


/* HTML 5 IE Compat Script */
(function(){if(!/*@cc_on!@*/0)return;var e = "abbr,article,aside,audio,bb,canvas,datagrid,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video".split(',');for(var i=0;i<e.length;i++){document.createElement(e[i])}})()


/**********************************************************************
TERMS OF USE - EASING EQUATIONS
Open source under the BSD License.
Copyright (c) 2001 Robert Penner
JavaScript version copyright (C) 2006 by Philippe Maegerman
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

   * Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
   * Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
   * Neither the name of the author nor the names of contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*****************************************/
function Delegate() {}
Delegate.create = function (o, f) {
	var a = new Array() ;
	var l = arguments.length ;
	for(var i = 2 ; i < l ; i++) a[i - 2] = arguments[i] ;
	return function() {
		var aP = [].concat(arguments, a) ;
		f.apply(o, aP);
	}
}

Tween = function(obj, prop, func, begin, finish, duration, suffixe){
	this.init(obj, prop, func, begin, finish, duration, suffixe)
}
var t = Tween.prototype;

t.obj = new Object();
t.prop='';
t.func = function (t, b, c, d) { return c*t/d + b; };
t.begin = 0;
t.change = 0;
t.prevTime = 0;
t.prevPos = 0;
t.looping = false;
t._duration = 0;
t._time = 0;
t._pos = 0;
t._position = 0;
t._startTime = 0;
t._finish = 0;
t.name = '';
t.suffixe = '';
t._listeners = new Array();	
t.setTime = function(t){
	this.prevTime = this._time;
	if (t > this.getDuration()) {
		if (this.looping) {
			this.rewind (t - this._duration);
			this.update();
			this.broadcastMessage('onMotionLooped',{target:this,type:'onMotionLooped'});
		} else {
			this._time = this._duration;
			this.update();
			this.stop();
			this.broadcastMessage('onMotionFinished',{target:this,type:'onMotionFinished'});
		}
	} else if (t < 0) {
		this.rewind();
		this.update();
	} else {
		this._time = t;
		this.update();
	}
}
t.getTime = function(){
	return this._time;
}
t.setDuration = function(d){
	this._duration = (d == null || d <= 0) ? 100000 : d;
}
t.getDuration = function(){
	return this._duration;
}
t.setPosition = function(p){
	this.prevPos = this._pos;
	var a = this.suffixe != '' ? this.suffixe : '';
	this.obj[this.prop] = Math.round(p) + a;
	this._pos = p;
	this.broadcastMessage('onMotionChanged',{target:this,type:'onMotionChanged'});
}
t.getPosition = function(t){
	if (t == undefined) t = this._time;
	return this.func(t, this.begin, this.change, this._duration);
};
t.setFinish = function(f){
	this.change = f - this.begin;
};
t.getFinish = function(){
	return this.begin + this.change;
};
t.init = function(obj, prop, func, begin, finish, duration, suffixe){
	if (!arguments.length) return;
	this._listeners = new Array();
	this.addListener(this);
	if(suffixe) this.suffixe = suffixe;
	this.obj = obj;
	this.prop = prop;
	this.begin = begin;
	this._pos = begin;
	this.setDuration(duration);
	if (func!=null && func!='') {
		this.func = func;
	}
	this.setFinish(finish);
}
t.start = function(){
	this.rewind();
	this.startEnterFrame();
	this.broadcastMessage('onMotionStarted',{target:this,type:'onMotionStarted'});
	//alert('in');
}
t.rewind = function(t){
	this.stop();
	this._time = (t == undefined) ? 0 : t;
	this.fixTime();
	this.update();
}
t.fforward = function(){
	this._time = this._duration;
	this.fixTime();
	this.update();
}
t.update = function(){
	this.setPosition(this.getPosition(this._time));
	}
t.startEnterFrame = function(){
	this.stopEnterFrame();
	this.isPlaying = true;
	this.onEnterFrame();
}
t.onEnterFrame = function(){
	if(this.isPlaying) {
		this.nextFrame();
		setTimeout(Delegate.create(this, this.onEnterFrame), 0);
	}
}
t.nextFrame = function(){
	this.setTime((this.getTimer() - this._startTime) / 1000);
	}
t.stop = function(){
	this.stopEnterFrame();
	this.broadcastMessage('onMotionStopped',{target:this,type:'onMotionStopped'});
}
t.stopEnterFrame = function(){
	this.isPlaying = false;
}

t.continueTo = function(finish, duration){
	this.begin = this._pos;
	this.setFinish(finish);
	if (this._duration != undefined)
		this.setDuration(duration);
	this.start();
}
t.resume = function(){
	this.fixTime();
	this.startEnterFrame();
	this.broadcastMessage('onMotionResumed',{target:this,type:'onMotionResumed'});
}
t.yoyo = function (){
	this.continueTo(this.begin,this._time);
}

t.addListener = function(o){
	this.removeListener (o);
	return this._listeners.push(o);
}
t.removeListener = function(o){
	var a = this._listeners;	
	var i = a.length;
	while (i--) {
		if (a[i] == o) {
			a.splice (i, 1);
			return true;
		}
	}
	return false;
}
t.broadcastMessage = function(){
	var arr = new Array();
	for(var i = 0; i < arguments.length; i++){
		arr.push(arguments[i])
	}
	var e = arr.shift();
	var a = this._listeners;
	var l = a.length;
	for (var i=0; i<l; i++){
		if(a[i][e])
		a[i][e].apply(a[i], arr);
	}
}
t.fixTime = function(){
	this._startTime = this.getTimer() - this._time * 1000;
}
t.getTimer = function(){
	return new Date().getTime() - this._time;
}
Tween.backEaseIn = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*(t/=d)*t*((s+1)*t - s) + b;
}
Tween.backEaseOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158;
	return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
}
Tween.backEaseInOut = function(t,b,c,d,a,p){
	if (s == undefined) var s = 1.70158; 
	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
}
Tween.elasticEaseIn = function(t,b,c,d,a,p){
		if (t==0) return b;  
		if ((t/=d)==1) return b+c;  
		if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) {
			a=c; var s=p/4;
		}
		else 
			var s = p/(2*Math.PI) * Math.asin (c/a);
		
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	
}
Tween.elasticEaseOut = function (t,b,c,d,a,p){
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return (a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b);
	}
Tween.elasticEaseInOut = function (t,b,c,d,a,p){
	if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) var p=d*(.3*1.5);
	if (!a || a < Math.abs(c)) {var a=c; var s=p/4; }
	else var s = p/(2*Math.PI) * Math.asin (c/a);
	if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
}

Tween.bounceEaseOut = function(t,b,c,d){
	if ((t/=d) < (1/2.75)) {
		return c*(7.5625*t*t) + b;
	} else if (t < (2/2.75)) {
		return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
	} else if (t < (2.5/2.75)) {
		return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
	} else {
		return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
	}
}
Tween.bounceEaseIn = function(t,b,c,d){
	return c - Tween.bounceEaseOut (d-t, 0, c, d) + b;
	}
Tween.bounceEaseInOut = function(t,b,c,d){
	if (t < d/2) return Tween.bounceEaseIn (t*2, 0, c, d) * .5 + b;
	else return Tween.bounceEaseOut (t*2-d, 0, c, d) * .5 + c*.5 + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}

Tween.regularEaseIn = function(t,b,c,d){
	return c*(t/=d)*t + b;
	}
Tween.regularEaseOut = function(t,b,c,d){
	return -c *(t/=d)*(t-2) + b;
	}

Tween.regularEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t + b;
	return -c/2 * ((--t)*(t-2) - 1) + b;
	}
Tween.strongEaseIn = function(t,b,c,d){
	return c*(t/=d)*t*t*t*t + b;
	}
Tween.strongEaseOut = function(t,b,c,d){
	return c*((t=t/d-1)*t*t*t*t + 1) + b;
	}

Tween.strongEaseInOut = function(t,b,c,d){
	if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
	return c/2*((t-=2)*t*t*t*t + 2) + b;
	}
