/**
 *  Global scripts for Hardware Zone
 *
 * @author Viknesk Kumarr Muniandy <vikneskm@sphm-newmedia.biz>
 * @since 13 Oct 2008
 */

// Extend array with reduce function
Array.prototype.reduce = function (fn, val, i) { return ((i = $pick(i, 0)) < this.length)? this.reduce(fn, fn(val, this[i]), i+1): val; }

// Ensure at least a fallback HWZ object exists & attach function placeholders
if (!window.HWZ) window.HWZ = {};

// Helper function to load saved preferences, falling back to HWZ object
HWZ.fn = {
	loadPref: function (key, defaultVal)
	{
		var param = key.split('.').reduce(function (a, b) { return a && a[b]; }, HWZ);
		return $pick (HWZ.prefs && HWZ.prefs.get(key), defaultVal, param);
	},
	autoCaption: function ()
	{
		$$('.article .content img[title]').each (function (img)
		{
			// skip if title is empty
			if (!img.get ('title').trim ()) return;

			new Element ('span', {'class': 'image-caption-container'})
				.addClass (['left', 'right'].contains (img.get ('align'))? img.get ('align'): '')
				.set ('width', img.get ('width'))
				.replaces (img)
				.grab (img)
				.grab (new Element ('div', {
					'class': 'image-caption',
					'html': img.get ('title')
				}))
			;
			img.erase ('align');

			var link = img.getParents ('a');
			if (link) link.addClass ('captioned');
		});
	}
}

// AddThis publisher id
var addthis_pub = "sphmnewmedia";

// Series of functions to load on DOMReady
var initFunctions = new Initializer (
[
	// Saved preferences
	function ()
	{
		var re = /[^.]+\.com(\.[a-z]{2})?$/;
		HWZ.prefs = new Hash.Cookie('prefs', {
			duration: 7,
			//domain: location.host.match(/[^.]+\.dev(\.[a-z]{2})?$/)[0],
			domain: re.test(location.host) ? location.host.match(re)[0] : location.host,
			path: '/'
		});
	},

	// Set defaults & customisations for TabSwapper class
	function ()
	{
		var _addTab = TabSwapper.prototype.addTab;
		TabSwapper.implement ({
			options: {
				selectedClass: 'on',
				deselectedClass: 'off',
				mouseoverClass: 'over',
				mouseoutClass: 'out',
				smooth: true
			},
			addTab: function (tab, section, clicker, index)
			{
				_addTab.run ([tab, section, clicker, index], this);
				var clicker = tab.retrieve('clicker');
				if (clicker) clicker.addEvent ('click', function (e) { e.preventDefault (); clicker.blur (); });
			}
		});
	},

	// Sidebar slider
	function ()
	{
		if (!HWZ.slidebar || !HWZ.slidebar.enabled) return false;

		var collapsedClass = 'sidebar-collapsed';

		var page = $('page');
		var sidebar = page && $('sidebar');
		if (!sidebar) return;
		
		var slider = sidebar.getChildren()[0];
		var content = $('content').getChildren()[0];
		var toggler = new Element ('div', {
			'class': 'clickable toggler',
			'events': { 'click': function () { slidebar.toggle (); } }
		}).inject (sidebar, 'top');

		var offset = content.getStyle('margin-left').toInt() - sidebar.getStyle('width').toInt();
		var width = sidebar.getStyle('width').toInt();

		var animate = function (complete, nopref)
		{
			if (!complete)
			{
				content.setStyle ('margin-left', sidebar.getStyle('width').toInt() + offset);
				//slider.setStyle ('opacity', sidebar.getStyle('width').toInt()/width);
			}
			else
			{
				content.setStyle ('margin-left', '');
				//slider.setStyle ('opacity', 1);
				page[slidebar.open? 'removeClass': 'addClass'](collapsedClass);
				toggler.set ('title', (slidebar.open? 'Hide': 'Show') + ' navigation bar');
				if (!nopref) HWZ.prefs.set('slidebar.collapsed', !slidebar.open);
			}
		};

		var slidebar = new Slidebar (
			slider.store ('wrapper', sidebar),
			{'duration': 300}
		)
		.addEvent ('complete', function() {
			animate(true);
		}, true)
		.addEvent ('step', function() {
			animate();
		})
		;

		sidebar.addClass ('slidebar');

		// Incorporate saved preference
		slidebar.open = HWZ.slidebar.override?
			!HWZ.slidebar.collapsed:
			!HWZ.fn.loadPref('slidebar.collapsed', HWZ.slidebar.collapsed || page.hasClass(collapsedClass));
		
		animate (true, HWZ.slidebar.override);

	},

	/*
	// Leaderboard Carousel
	function ()
	{
		var leaderboard = $('ads-leaderboard');

		var leaderboardAd = new SimpleCarousel (
			leaderboard,
			leaderboard.getChildren('dd').reverse(),
			leaderboard.getChildren('dt').reverse().addClass ('clickable'),
			{ slideInterval: 4500, rotateAction: 'click' }
		);
	},
	*/

	// Layout utility bar
	function ()
	{
		if ((!HWZ.layout || !HWZ.layout.enabled) && (!HWZ.fonts || !HWZ.fonts.enabled)) return;

		var floatingBar = $('floating-toolbar');
		var canvas = $('canvas');
		var page = $('page');
		
		var utilBar = new Element ('ul', {id:'utility-bar'});

		var hover = {
			'over': function () { this.addClass('hover'); },
			'out': function () { this.removeClass('hover'); }
		};

		var fonts = {
			sizes: ['small', 'medium', 'large'],
			get: function ()
			{
				return $pick(fonts.sizes.filter(function (v) { return page.hasClass('font-'+v); })[0], fonts.sizes[1]);
			},
			set: function (size)
			{
				fonts.sizes.each (function (v) { page.removeClass ('font-'+v); });
				page.addClass ('font-'+size);
				HWZ.prefs.set ('fonts.size', size);
			}
		};

		var layout = {
			widths: ['fixed', 'fluid'],
			get: function ()
			{
				return $pick(layout.widths.filter(function (v) { return canvas.hasClass(v); })[0], layout.widths[1]);
			},
			set: function (width)
			{
				layout.widths.each (function (v) { 
					if ($chk(floatingBar)) {
						floatingBar.removeClass (v); 
					}
					canvas.removeClass(v);
				});
				if ($chk(floatingBar)) {
					floatingBar.addClass (width);
				}
				canvas.addClass (width);
				utilBar.getChildren('li.selected').removeClass('selected');
				utilBar.getChildren('li#btn-layout-' + width).addClass('selected');
				OverText.update ();
				HWZ.prefs.set ('layout.width', width);
			}
		};

		if (HWZ.fonts && HWZ.fonts.enabled)
		{
			fonts.set (HWZ.fonts.size = HWZ.fn.loadPref('fonts.size', fonts.get()));
			fonts.sizes.each (function (size)
			{
				utilBar.adopt (new Element ('li', {
					'id': 'btn-font-'+size,
					'class': 'font',
					'events': { 'click': fonts.set.pass(size) }
				}));
			});
		}

		utilBar.adopt (new Element ('span', {
                        'class':'layout-label',
                        'html': 'View'
                }));

		if (HWZ.layout && HWZ.layout.enabled && $$("#social-media.forums").length > 0)
		{
			layout.set (HWZ.layout.width = HWZ.fn.loadPref('layout.width', layout.get()));
			layout.widths.each (function (width)
			{
				utilBar.adopt (new Element ('li', {
					'id': 'btn-layout-'+width,
					'class': 'layout' + ((width == HWZ.layout.width) ? ' selected' : ''),
					'events': { 'click': layout.set.pass(width) },
					'text': ( $chk(floatingBar) ? (width == 'fixed' ? '1024' : '100%' ) : "")
				}));
			});
		}
		
		if (utilBar.getChildren('li').length > 0) { 
			utilBar.getChildren('li')
				.addClass ('clickable')
				.addEvent ('mouseover', hover.over)
				.addEvent ('mouseout', hover.out)
			;
			
			var spacer = new Element('li', { 'class': 'layout', 'html': ' |&nbsp; ' });
			spacer.setStyles({
				'padding-left': '1px',
				'padding-right': '1px',
				'font-weight': 'normal'
			});
			
			spacer.injectAfter(utilBar.getChildren('li')[0]);
			
			utilBar.inject ($$('#social-media.forums')[0], 'before');
		}
	},

	// Accordion navigation
	function ()
	{
		if (!HWZ.accordion.enabled) return false;

		var defaultIndex = -1;
		var submenus = $$('#nav > li > ul:not(:empty)');
		
		if (!submenus || !submenus.length) return;
		
		var clickers = submenus.getParent().map (function (li, i)
		{
			li.addClass ('expandable');
			if (li.hasClass('selected')) defaultIndex = i;
			return new Element ('div', {'class': 'clicker'}).inject (li, 'top');
		});

		var accordion = new Accordion (clickers, submenus,
		{
			alwaysHide: true,
			returnHeightToAuto: false,
			show: ($chk(HWZ.accordion.index) && HWZ.accordion.index!=-1 && HWZ.accordion.index) || defaultIndex,
			'opacity': !Browser.Engine.trident,
			onActive: function (toggler) { toggler.getParent().addClass ('selected'); },
			onBackground: function (toggler) { toggler.getParent().removeClass ('selected'); }
		});
	},

	// Networks tab swapper
	/*
	function ()
	{
		var offset = 100;
		var networks = $('networks-menu');

		if (!networks || !(networks = networks.getChildren('dl')[0])) return;

		networks.getChildren('dt')
			.addClass ('clickable')
			.each (function (el)
			{
				el.setStyles ({position:'absolute', top:0, left:offset+'px'});
				offset += el.getSize().x;
			});

		var networksMenu = new TabSwapper (
		{
			tabs: networks.getChildren('dt'),
			clickers: networks.getChildren('dt'),
			sections: networks.getChildren('dd'),
			cookieName: 'hwz_networks'
		});
	},
	*/

	// Global Search
	function ()
	{
		/*
		var popup = new Element ('form', { 'class': 'popup' })
				.grab (new Element ('fieldset').adopt (title, btnSave))
				.inject (bookmark, 'bottom')
			,
		*/
		var contexts = {
				'products': 'Products',
				'articles': 'Articles',
				'news': 'Tech News',
				'videos': 'Videos',
				'forum': 'Forum',
				'marketplace': 'Marketplace',
				'all': 'All Content'
			},
			form = $('PageSearchForm'),
			context = form.getElement ('#PageContext'),
			textbox = form.getElement ('#PageQ').addEvents ({
				'focus': focusText,
				'blur': blurText
			}).fireEvent ('blur'),
			popup = context.get ('value') == 'all'? null: new Element ('fieldset', { 'class': 'popup' })
				.adopt (
					new Element ('span', { 'text': 'Search: ' }),
					new Element ('label', { 'text': contexts[context.get ('value')] })
						.grab (new Element ('input', {
							'type': 'radio',
							'name': context.get ('name'),
							'value': context.get ('value'),
							'checked': 'checked',
							'events': { 'click': function () { textbox.focus (); } }
						}), 'top')
					,
					new Element ('label', { 'text': contexts['all'] })
						.grab (new Element ('input', {
							'type': 'radio',
							'name': context.get ('name') ,
							'value': 'all',
							'events': { 'click': function () { textbox.focus (); } }
						}), 'top')
				)
				.inject (form, 'bottom')
		;
		
		// Use popup context switcher & dispose of hidden field
		if (popup) context.dispose ();

		function focusText ()
		{
			if (this.get ('value') == this.get ('title'))
				this.set ('value', '');
			else
				this.selectRange (0, this.value.length);

			if (popup)
				popup.set ('morph', { 'duration': 'short' }).morph ({ 'opacity': 1 });
		}

		function blurText ()
		{
			if (!this.get ('value').trim ())
				this.set ('value', this.get ('title'));

			if (popup && popup.getStyle ('visibility') != 'hidden')
				popup.set ('morph', { 'duration': 'long' }).morph ({ 'opacity': 0 });
		}
	},

	// Flash message
	function ()
	{
		var flash = $('flashMessage');
		if (flash)
			(function ()
			{
				flash
					.set('tween', {'link':'chain', 'duration':'long'})
					.highlight ('#FFEA80')
					.fade()
					.tween('display', 'none');
			}).delay (5000);
	}
]);


