/*
 *
 * Registers impressions and clicks with google analytics
 *
 * Usage:
 *
 * // AB click testing by element
 * // Chooses one element from the supplied classes in rel:elements 
 * // registers the impression and potential click
 *
 * <div class="bf_dom" rel:bf_bucket="gtrack" rel:unit="myunitname" rel:elements="class1 class2 class3">
 *		<div class="class1 hidden"><a href="#" rel:gtrack_id="uri">link1</a></div>
 *		<div class="class2 hidden"><a href="#" rel:gtrack_id="uri">link2</a></div>
 *		<div class="class3 hidden"><a href="#" rel:gtrack_id="uri">link3</a></div>
 *	</div>
 * 
 *
 * // AB click testing by class
 * // Chooses one class from rel:classes, assigns it to the div, 
 * // registers the impression and potential click
 *
 * <div class="bf_dom" rel:bf_bucket="gtrack" rel:unit="myunitname" rel:classes="class1 class2 class3">
 *		<a href="#" rel:gtrack_id="uri">link1</a>
 *		<a href="#" rel:gtrack_id="uri">link2</a>
 *		<a href="#" rel:gtrack_id="uri">link3</a>
 * </div>
 * 
 *
 * // Registers impression, and potential click
 * <div class="bf_dom" rel:bf_bucket="gtrack" rel:unit="myunitname">
 * 	<a rel:gtrack_id="uri" href="#">link1</a>
 * 	<a rel:gtrack_id="uri" href="#">link2</a>
 * </div>
 */

var BF_GTrack = function() {

	/*
	 * Assign handler to gtrack bucket (universal_dom_traversal.js)
	 */
	this.init = function() {

		universal_dom.assign_handler( {
			bucket: "gtrack", 
			handler: function( el, data ) {
				if 		( el.hasAttribute( "rel:elements" ) )		gtrack.choose_element( el );
				else if 	( el.hasAttribute( "rel:classes" ) )		gtrack.choose_class( el );
				else 																gtrack.click( el );
			}
		} );
	};

	/*
	 * Element-based AB Test
	 * Choose childnode with a class in rel:elements, 
	 * remove hidden class, registers google impression and click event
	 *
	 * @param el 	element
	 */
	this.choose_element = function( el ) {
		var classes = el.getAttribute( "rel:elements" ).split( " " );
		var unit = el.getAttribute( "rel:unit" );
		//if( ! unit ) console.error( "rel:unit not specified:", el );

		// Hide any immediate children that are not hidden
		// ( For progressive enhancement compatibility )
		//el.select( ":not(.hidden)" ).each( function( node ) {
		//	node.addClassName( "hidden" );
		//} );

		// Show random child element
		var cls = classes[ Math.floor( Math.random() * classes.length ) ];
		var element = el.select( "." + cls )[0];
		element.removeClassName( "hidden" ); 

		// Track impression
		Tracker.gClick( "/_ga/click/abtest/" + unit + "/" + cls + "/impression" );

		// Track click
		var as = el.select( "a","input" );
		as.each( function( a ) {
			var gtrack_id = a.getAttribute( "rel:gtrack_id" );	
			//if( ! gtrack_id ) console.error( "rel:gtrack_id not specified:", a );
			
			Event.observe( a, "click", function() {
				Tracker.gClick( "/_ga/click/abtest/" + unit + "/" + cls + "/click/" + gtrack_id );
			} );
		} );
	};

	/*
	 * Class-based AB Test
	 * Choose class from rel:classes, and assign it to el
	 * registers google impression and click event
	 *
	 * @param el 	element
	 */
	this.choose_class = function( el ) {
		var classes = el.getAttribute( "rel:classes" ).split( " " );
		var unit = el.getAttribute( "rel:unit" );
		//if( ! unit ) console.error( "rel:unit not specified:", el );

		// Assign random class
		var cls = classes[ Math.floor( Math.random() * classes.length ) ];
		el.addClassName( cls );

		// Track impression
		Tracker.gClick( "/_ga/click/abtest/" + unit + "/" + cls + "/impression" );
		
		// Track click
		var as = el.select( "a","input" );
		as.each( function( a ) {
			var gtrack_id = a.getAttribute( "rel:gtrack_id" );	
			//if( ! gtrack_id ) console.error( "rel:gtrack_id not specified:", a );
			
			Event.observe( a, "click", function() {
				Tracker.gClick( "/_ga/click/abtest/" + unit + "/" + cls + "/click/" + gtrack_id );
			} );
		} );
	};

	/*
	 * Click without AB Test
	 * Register impression for each a element
	 * Add google tracker for click event
	 *
	 * @param el 	element
	 */
	this.click = function( el ) {
		var unit = el.getAttribute( "rel:unit" );
		//if( ! unit ) console.error( "rel:unit not specified:", el );

		// Track impression
		Tracker.gClick( "/_ga/click/gtrack/" + unit + "/impression" );

		// Track click
		var as = el.select( "a","input" );
		as.each( function( a ) {
			var gtrack_id = a.getAttribute( "rel:gtrack_id" );	
			//if( ! gtrack_id ) console.error( "rel:gtrack_id not specified:", a );
			
			Event.observe( a, "click", function() {
				Tracker.gClick( "/_ga/click/gtrack/" + unit + "/click/" + gtrack_id );
			} );
		} );

	};
};

var gtrack = new BF_GTrack();
BuzzLoader.register( gtrack.init, 1 );
