/*
 * Prototype JavaScript framework, version 1.4.0
 * (c) 2005 Sam Stephenson <sam@conio.net>
 * also... 
 * event-log.js - Copyright (c) 2007-9, iUI Project Members
 *
 * Extensively modified here
/*--------------------------------------------------------------------------*/

var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
};

Object.extend = function(destination, source) {
	for (var property in source) destination[property] = source[property];
	return destination;
};

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
};

Function.prototype.bindAsEventListener = function() {
	var __method = this, args = $A(arguments), object = args.shift();
	return function(event) {
		return __method.apply(object, [event || window.event].concat(args));
 	}
};

Array.prototype.each = Array.prototype.forEach;

String.prototype.camelize = function(){
	return this.replace(/-\D/gi, function(match){
		return match.charAt(match.length - 1).toUpperCase();
	});
};

var $A = function(iterable) {
	var nArray = [];
	for (var i = 0; i < iterable.length; i++) nArray.push(iterable[i]);
	return nArray;
};


function $() {
	if (arguments.length == 1) return get$(arguments[0]);
	var elements = [];
	$A(arguments).each(function(el) {
		elements.push(get$(el));
	});
	return elements;

	function get$(el){
		if (typeof el == 'string') el = document.getElementById(el);
		return el;
	}
};

if (!window.Element) var Element = {};

Object.extend(Element, {

	remove: function(element) {
		if (typeof(element) == 'string' ) element = $(element);
		element.parentNode.removeChild(element);
	},

	hasClassName: function(element, className) {
		if (typeof(element) == 'string' ) element = $(element);
		return !!(element.className.match(new RegExp("\\b"+className+"\\b")));
	},

	addClassName: function(element, className) {
		if (typeof(element) == 'string' ) element = $(element);
		if (!Element.hasClassName(element, className)) element.className = (element.className+' '+className);
	},

	removeClassName: function(element, className) {
		if (typeof(element) == 'string' ) element = $(element);
		if (Element.hasClassName(element, className)) element.className = element.className.replace(className, '');
	},

	// removes whitespace-only text node children
	cleanWhitespace: function(element) {
		element = $(element);
		for(var i = 0; i < element.childNodes.length; i++) {
			var node = element.childNodes[i];
			if(node.nodeType == 3 && !/\S/.test(node.nodeValue)) Element.remove(node);
		}
	}

});

document.getElementsByClassName = function(className){
	var elements = [];
	var all = document.getElementsByTagName('*');
	$A(all).each(function(el){
		if (Element.hasClassName(el, className)) elements.push(el);
	});
	return elements;
};


// ************************************************************************************

var preventScroll = function(e) { e.preventDefault(); };

GlowOnTouch = Class.create();
GlowOnTouch.prototype = {
	initialize: function(el) {
		this.element = $(el);

		this.radius = 100;
		this.top = 0;
		this.left = 0;

		var element = this.element;
		while (element.offsetParent) {
			this.top += element.offsetTop;
			this.left += element.offsetLeft;
			element = element.offsetParent;
		}

		this.x = parseInt(this.left + (this.element.offsetWidth / 2), 10);
		this.y = parseInt(this.top + (this.element.offsetHeight / 2), 10);
		this.bottom = this.top + this.element.offsetHeight + this.radius;
		this.right = this.left + this.element.offsetWidth + this.radius;
		this.left = this.left - this.radius;
		this.top = this.top - this.radius;


		if (window.Touch) {
			this.element.addEventListener('touchstart', this, false);
		}
	},

	inRadius: function(x, y) {
		return (x > this.left && x < this.right && y > this.top && y < this.bottom);
	},

	createGlow: function(x, y) {
		this.canvas = document.createElement('canvas');
		this.canvas.width = 100;
		this.canvas.height = 100;
		this.canvas.style.left = (x - 50) + 'px';
		this.canvas.style.top = (y - 50) + 'px';
		this.canvas.style.position = 'absolute';
		this.canvas.style.webkitTransitionProperty = 'opacity';
		this.canvas.style.webkitTransitionDuration = '200ms';
		this.canvas.style.pointerEvents = 'none';
		this.canvas.style.zIndex = 100;
		this.visible = false;
		document.body.appendChild(this.canvas);
		var context = this.canvas.getContext("2d");
		var gradient = context.createRadialGradient(50,50,0,50,50,50);
		gradient.addColorStop(0, 'rgba(255,255,255,1)');
		gradient.addColorStop(0.8, 'rgba(255,255,255,0.05)');
		gradient.addColorStop(0.9, 'rgba(255,255,255,0)');
		context.fillStyle = gradient;
		context.fillRect(0,0,100,100);
		this.showGlow();					
	},

	hideGlow: function() {
		if (this.visible) {
			this.canvas.style.opacity = 0;
			this.visible = false;
		}
	},

	showGlow: function() {
		if (!this.visible) {
			this.canvas.style.opacity = 1;
			this.visible = true;
		}
	},

	removeGlow: function() {
		this.canvas.addEventListener('webkitTransitionEnd', function() {
			//console.log("webkitTransitionEnd - remove glow.");
			Element.remove(this.canvas);
		}.bind(this), false);

		if (this.visible) {
			this.canvas.style.opacity = 0;
			this.visible = false;
		}
	},

	handleEvent: function(e) {
		switch(e.type) {
			case 'touchstart': this.onTouchstart(e); break;
			case 'touchmove': this.onTouchmove(e); break;
			case 'touchend': this.onTouchend(e); break;
		}
	},

	onTouchstart: function(e) {
		e.preventDefault();	
		//this.createGlow(Math.round(this.left+this.width/2),Math.round(this.top+this.teight/2));
		this.createGlow(this.x, this.y);
		if (this.inRadius(e.targetTouches[0].clientX, e.targetTouches[0].clientY)) {
			this.showGlow();
		}
		this.element.addEventListener('touchmove', this, false);
		this.element.addEventListener('touchend', this, false);
	},

	onTouchmove: function(e) {
		document.body.addEventListener('touchmove', preventScroll, false );
		if (this.inRadius(e.targetTouches[0].clientX, e.targetTouches[0].clientY)) {
			this.showGlow();
		} else {
			this.hideGlow();
		}
	},

	onTouchend: function(e) {
		this.element.removeEventListener('touchmove', this, false);
		this.element.removeEventListener('touchend', this, false);
		document.body.removeEventListener('touchmove', preventScroll, false );
		if (this.visible) {
			var event = document.createEvent('MouseEvents');
			event.initEvent('click', true, true);
			this.element.dispatchEvent(event);
		}
		this.removeGlow();
	}
};



ActiveOnTouch = Class.create();
ActiveOnTouch.prototype = {
	initialize: function(el) {
		this.element = $(el);
		this.className = 'active';

		this.radius = 100;
		this.top = 0;
		this.left = 0;

		var element = this.element;
		while (element.offsetParent) {
			this.top += element.offsetTop;
			this.left += element.offsetLeft;
			element = element.offsetParent;
		}

		this.bottom = this.top + this.element.offsetHeight + this.radius;
		this.right = this.left + this.element.offsetWidth + this.radius;
		this.left = this.left - this.radius;
		this.top = this.top - this.radius;

		if (window.Touch) {
			this.element.addEventListener('touchstart', this, false);
		}
	},

	inRadius: function(x, y) {
		return (x > this.left && x < this.right && y > this.top && y < this.bottom);
	},

	handleEvent: function(e) {
		switch(e.type) {
			case 'touchstart': this.onTouchstart(e); break;
			case 'touchmove': this.onTouchmove(e); break;
			case 'touchend': this.onTouchend(e); break;
		}
	},

	onTouchstart: function(e) {
		e.preventDefault();	

		Element.addClassName(this.element, this.className);	

		this.element.addEventListener('touchmove', this, false);
		this.element.addEventListener('touchend', this, false);
	},

	onTouchmove: function(e) {
	
		document.body.addEventListener('touchmove', preventScroll, false );

		if (this.inRadius(e.targetTouches[0].clientX, e.targetTouches[0].clientY)) {
			Element.addClassName(this.element, this.className);	
		} else {
			Element.removeClassName(this.element, this.className);	
		}

	},

	onTouchend: function(e) {
		this.element.removeEventListener('touchmove', this, false);
		this.element.removeEventListener('touchend', this, false);
		document.body.removeEventListener('touchmove', preventScroll, false );

		if (Element.hasClassName(this.element, this.className)) {
			var event = document.createEvent('MouseEvents');
			event.initEvent('click', true, true);
			this.element.dispatchEvent(event);
		}
		Element.removeClassName(this.element, this.className);	
	}
};


// ************************************************************************************

/*
	iui-event-log.js
	Copyright (c) 2007-9, iUI Project Members
	See LICENSE.txt for licensing terms
 */

(function() {

	var eventNames = ['blur', 'focus', 'load', 'unload', 'beforetransition', 'aftertransition' ];

	addEventListener("DOMContentLoaded", function(event)
	{
		document.body.addEventListener('beforeinsert', logEvent, false);
		document.body.addEventListener('afterinsert', afterInsert, false);
		nodes = document.getElementsByClassName('page');
		//console.log("nodes.length: "+ nodes.length);
		for (var i = 0; i < nodes.length ; i++) registerAllEvents(nodes[i]);
	}, false);

	function registerAllEvents(node)
	{
		for (var i = 0; i < eventNames.length ; i++) {
			//console.log("addlistener: " + eventNames[i] + " on #" + node.id + " = " + node);
			node.addEventListener(eventNames[i], logEvent, false);
		}
	}

	function afterInsert(e)
	{
		logEvent(e);
		registerAllEvents(e.insertedNode); // Set event handlers on newly added node
	}

	function logEvent(e)
	{
		console.log("logEvent type: " + e.type + " target " + e.target.tagName + "#" + e.target.id);
		if (e.type == "beforetransition" || e.type == "aftertransition") {
			console.log(" out trans = " + e.out);
		} else if (e.type == "beforeinsert") {
			console.log(" fragment = " + e.fragment);
		} else if (e.type == "afterinsert") {
			console.log(" node = " + e.insertedNode);
		}
	}
})();


