// emile.js (c) 2009 Thomas Fuchs
// Licensed under the terms of the MIT license.

(function(emile, container){
  var parseEl = document.createElement('div'),
    props = ('backgroundColor borderBottomColor borderBottomWidth borderLeftColor borderLeftWidth '+
    'borderRightColor borderRightWidth borderSpacing borderTopColor borderTopWidth bottom color fontSize '+
    'fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop maxHeight '+
    'maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft '+
    'paddingRight paddingTop right textIndent top width wordSpacing zIndex').split(' '),
	queue = []; // add queue support
 
  function interpolate(source,target,pos){ return (source+(target-source)*pos).toFixed(3); }
  function s(str, p, c){ return str.substr(p,c||1); }
  function color(source,target,pos){
    var i = 2, j, c, tmp, v = [], r = [];
    while(j=3,c=arguments[i-1],i--)
      if(s(c,0)=='r') { c = c.match(/\d+/g); while(j--) v.push(~~c[j]); } else {
        if(c.length==4) c='#'+s(c,1)+s(c,1)+s(c,2)+s(c,2)+s(c,3)+s(c,3);
        while(j--) v.push(parseInt(s(c,1+j*2,2), 16)); }
    while(j--) { tmp = ~~(v[j+3]+(v[j]-v[j+3])*pos); r.push(tmp<0?0:tmp>255?255:tmp); }
    return 'rgb('+r.join(',')+')';
  }
  
  function parse(prop){
    var p = parseFloat(prop), q = prop.replace(/^[\-\d\.]+/,'');
    return isNaN(p) ? { v: q, f: color, u: ''} : { v: p, f: interpolate, u: q };
  }
  
  function normalize(style){
    var css, rules = {}, i = props.length, v;
    parseEl.innerHTML = '<div style="'+style+'"></div>';
    css = parseEl.childNodes[0].style;
    while(i--) if(v = css[props[i]]) rules[props[i]] = parse(v);
    return rules;
  }
  
  container[emile] = function(el, style, opts){
	if (queue.length>0) {clearInterval(queue[queue.length-1]);} // clear last interval
    el = typeof el == 'string' ? document.getElementById(el) : el;
    opts = opts || {};
    var target = normalize(style), comp = el.currentStyle ? el.currentStyle : getComputedStyle(el, null),
      prop, current = {}, start = +new Date, dur = opts.duration||200, finish = start+dur, interval,
      easing = opts.easing || function(pos){ return (-Math.cos(pos*Math.PI)/2) + 0.5; };
    for(prop in target) current[prop] = parse(comp[prop]);
    interval = setInterval(function(){
      var time = +new Date, pos = time>finish ? 1 : (time-start)/dur;
      for(prop in target)
        el.style[prop] = target[prop].f(current[prop].v,target[prop].v,easing(pos)) + target[prop].u;
      if(time>finish) { clearInterval(interval); opts.after && opts.after(); }
    },10);
	queue[queue.length] = interval; // store interval so animation can be cancelled
	
  }
})('emile', this);

/* quadratic easing in/out */
function easeInOutQuad(pos){
	if ((pos/=0.5) < 1) return 0.5*Math.pow(pos,2);
	return -0.5 * ((pos-=2)*pos - 2);
};

/* normalize event handling */
var addEvent = function() {
	if (window.addEventListener) {
		return function(el, sType, fn, capture) {
			el.addEventListener(sType, fn, (capture));
		};
	} else if (window.attachEvent) {
		return function(el, sType, fn, capture) {
			el.attachEvent("on" + sType, fn);
		};
	} else {
		return function(){ };
	}
}();

/* normalize target node */
function getTarget(evt) {
	var t = evt.target || evt.srcElement;
	try {
		if (t && 3 == t.nodeType) {
			return t.parentNode;
		}
	} catch(e) { 
		return null;
	}
	return t;
}

var slideCount = 4;
var currentIndex = 0;
var controlScrollLeft = document.getElementById('scrollLeft');
var controlScrollRight = document.getElementById('scrollRight');

function _scrollLeft() {
	if (currentIndex>0) {
		currentIndex--;
		_scroll(currentIndex);
	}
}

function _scrollRight() {
	if (currentIndex<slideCount-1) {
		currentIndex++;
		_scroll(currentIndex);
	}
}

function _scroll(index) {
	emile('carousel-slides', 'left:'+(index*-661)+'px;', {
		duration: 500,
		easing: easeInOutQuad
	});
}

addEvent(controlScrollLeft,'click',_scrollLeft,false);
addEvent(controlScrollRight,'click',_scrollRight,false);

