// Mootools missing functions, will be added back in future release
var $E = function(selector, filter){
	return ($(filter) || document).getElement(selector);
};

Cookie.set = function(key, value, options){
	return new Cookie(key, options).write(value);
};

Cookie.get = function(key){
	return new Cookie(key).read();
};

Cookie.remove = function(key, options){
	return new Cookie(key, options).dispose();
};

// Store options and params in here
var EMYTH = {
	shadowbox: {
		options: {
			animSequence:'sync',
			counterType:'skip'
		}
	}
}

window.addEvent('domready', function(){
		
		Clientcide.setAssetLocation('/js/mootools/clientcide/Assets/');
		Clientcide.preLoadCss();
		
		// BG fix if viewport width is odd number
		if (document.getSize().x % 2 == 0) {
			// console.log('broken... ' + document.getSize().x);
			// document.getElementsByTagName('html')[0].style.marginLeft -= 1;
		}

		//Shadowbox
		Shadowbox.init(EMYTH.shadowbox.options);

		//Tooltips
		if ($E('.tips')) {
			var myTips = new Tips($$('.tips'));
		};

		//Tabbed Divs
		if($('tab_set')) {
			EMYTH.myTabs = new TabSwapper({
			selectedClass: 'on',
			deselectedClass: 'off',
			tabs: 'ul#tab_set li',
			sections: '#panel_set div.panel',
			smooth: true
			});
		}

		// All anchor tags scroll smoothly (need id on target anchor)
		new SmoothScroll({duration: 2000, fps:50, transition: Fx.Transitions.Quart.easeInOut});

		// Auto Mouseover
		$$('img.autoMouseOver').each(function(img){
			   img.autoMouseOvers({
				   overString: '_on',
				   outString: '_off'
			   });
		});
		
		// pointy tips on forms
		$$('form .ptip').each(function(el,i){
			el.addEvents({
				'focus': function(){
					if (this.retrieve('ptip')) {
						this.retrieve('ptip').show();
					} else {
						var text = this.getNext('span.ptip_text').get('text') || '...';
						var title;
						var body;

						if (!text) {return false};

						if (text.contains('::')) {
							var text_array = text.split('::');
							title = text_array[0];
							body = text_array[1];
						} else {
							title = '';
							body = text;
						};
						
						var ptip = new StickyWin.PointyTip(title, body, {
							point: 'left',
							width: 225,
							closeButton: false,
							relativeTo: this
						}).hide();
						this.retrieve('ptip',ptip).show();
					};
				},
				'blur': function(){
					this.retrieve('ptip').hide();
				}
			});
		});
		
});

/*
Used to filter state/country area select based on parent country select
Registration uses this mostly
*/
var filterSelect = new Class ({
	initialize: function(parent, child, url){

		this.parent = $(parent);
		this.child = $(child);
		this.url = url;

		this.request = new Request.HTML({
			method: 'get',
			link: 'cancel',
			onSuccess: function(tree,elements){
				elements[0].replaces($(child)).highlight();
			}
		});

		this.parent.addEvent('change',function() {
			if (this.parent.get('value')) this.insertNewChild();
		}.bind(this));
		if (this.parent.get('value') && !this.child.get('value')) this.insertNewChild();
	},
	insertNewChild: function(){
		this.request.options.url = this.url + this.parent.get('value');
		this.request.send();
	}
});

/*
Pop up window in center of screen, if no params are set uses defaults
Example: onclick="popUp('/pub/htdocs/my_e-myth')" or onclick="popUp('/pub/htdocs/my_e-myth',{width:300,height:200,scrollbars:1})"
*/
function popUp(url,params){
	($defined(params)) ? params : (params = {});
	var fromTop = screen.availHeight / 2 - $pick(params.height,400) / 2;
	var fromLeft = screen.availWidth / 2 - $pick(params.width,500) / 2;
	var settings =
		'height=' + $pick(params.height,400) +
		',width=' + $pick(params.width,500) +
		',top=' + fromTop +
		',left=' + fromLeft +
		',scrollbars=' + $pick(params.scrollbars,0) +
		',resizable=' + $pick(params.resizable,1) +
		',menubar=' + $pick(params.menubar,0) +
		',toolbar=' + $pick(params.toolbar,0) +
		',location=' + $pick(params.location,0) +
		',statusbar=' + $pick(params.statusbar,0)
	;
	win = window.open(url,'popUp',settings);
}

/* Content Slider */
var SL_Slider = new Class({

	//implements
	Implements: [Options],

	//variables setup
	numNav: new Array(),			//will store number nav elements (if used)
	timer: null,					//periodical function variable holder
	isSliding: 0,					//flag for animation/click prevention
	direction: 1,					//flag for direction (forward/reverse)

	//options
	options: {
	slideTimer: 8000,				//Time between slides (1 second = 1000), a.k.a. the interval duration
	orientation: 'horizontal',		//vertical, horizontal, or none: None will create a fading in/out transition.
	fade: false,					//if true will fade the outgoing slide - only used if orientation is != None
	isPaused: false,				//flag for paused state
	transitionTime: 1100,			//Transition time (1 second = 1000)
	transitionType: 'cubic:out',	//Transition type
	container: null,				//container element
	items:	null,					//Array of elements for sliding
	itemNum: 0,						//Current item number
	playBtn: null,					//Play (and pause) button element
	prevBtn: null,					//Previous button element
	nextBtn: null,					//Next button element
	navTabs: null					//Define ul li elements that will trigger numNav == the li's index
	},

	//initialization
	initialize: function(options) {
		var self = this;

		//set options
		this.setOptions(options);

		//remove any scrollbar(s) on the container
		self.options.container.setStyle('overflow', "hidden");

		//if there is a play/pause button, set up functionality for it
		if(self.options.playBtn != null) {
			self.options.playBtn.addEvents({
				'click': function() {
					self.pauseIt();
				}
			});
		}

		//if there is a prev button, set up functionality for it
		if(self.options.prevBtn){
			self.options.prevBtn.addEvents({
				'click' : function() {
					// if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
						}
						self.direction = 0;
						self.slideIt();
					// }
				},
				'mouseover' : function() {
					this.setStyle('cursor', 'pointer');
				}
			});
		}

		//if there is a next button, set up functionality for it
		if(self.options.nextBtn){
			self.options.nextBtn.addEvents({
				'click' : function() {
					// if(self.isSliding == 0){
						if(self.options.isPaused == false){
							$clear(self.timer);
							self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
						}
						self.direction = 1;
						self.slideIt();
					// }
				},
				'mouseover' : function() {
					this.setStyle('cursor', 'pointer');
				}
			});
		}

		//setup items (a.k.a. slides) from list
		self.options.items.each(function(el, i){
			el.setStyle('position', 'absolute');
			var itemH = el.getSize().y;
			var itemW = el.getSize().x;
			if (self.options.orientation == 'vertical') {
				el.setStyle('top', (-1 * itemH));
				el.setStyle('left', 0);
			} else if (self.options.orientation == 'none') {
				el.setStyle('left', 0);
				el.setStyle('top', 0);
				el.set('opacity', 0);
			} else {
				el.setStyle('left', (-1 * itemW));
			}

			//set up our animation and store them on the element for speed
			var morph = new Fx.Morph(el, {
				duration: self.options.transitionTime,
				transition: self.options.transitionType,
				link: 'chain',
				onStart: function(){
					self.isSliding = 1;	 //prevents extra clicks
				},
				onComplete: function(){
					self.isSliding = 0;	 //prevents extra clicks
				}
			});
			el.store('morph',morph);
		});

		// set up navigational tabs
		if(self.options.navTabs){
			 var tabs = self.options.navTabs;
			 tabs.each(function(el,i){
				 el.addEvent('click',function(e){
					e.stop();
					self.numPress(i);
					el.getElement('a').addClass('active');
					tabs.each(function(tab){
						if (el != tab) tab.getElement('a').removeClass('active');
					});
				});
			});
		}
	},

	//startup method
	start: function() {

		var self = this;

		self.slideIt(self.options.itemNum);	 //initialize first slide

		if(self.options.isPaused == false){
			self.timer = self.slideIt.periodical(self.options.slideTimer, self, null);
		} else {
			self.pauseIt();
		}

	},

	slideIt: function(passedID) {

		var self = this;

		//get item to slide out
		var curItem = self.options.items[self.options.itemNum];

		//check for passedID presence
		if(passedID != null) {
			if(self.options.itemNum != passedID){
				if(self.options.itemNum > passedID) {
					self.direction = 0;
				} else {
					self.direction = 1;
				}
				self.options.itemNum = passedID;
			}
		} else {
			self.changeIndex();
		}

		//now get item to slide in using new index
		var newItem = self.options.items[self.options.itemNum];
		if (self.direction == 0) {
			var curX = self.options.container.getSize().x;
			var newX = (-1 * newItem.getSize().x);
			var curY = self.options.container.getSize().y;
			var newY = (-1 * newItem.getSize().y);
		} else {
			var curX = (-1 * self.options.container.getSize().x);
			var newX = newItem.getSize().x;
			var curY = (-1 * self.options.container.getSize().y);
			var newY = newItem.getSize().y;
		}

		//add/remove active number's highlight
		if (self.options.navTabs) {
			var tabs = self.options.navTabs;
			var activeTab =	 self.options.navTabs[self.options.itemNum];

			activeTab.getElement('a').addClass('active');
			tabs.each(function(tab){
				if (activeTab != tab) tab.getElement('a').removeClass('active');
			});
		}

		// bring new item in
		if (self.options.orientation == 'vertical') {
			if (self.options.fade == true) {newItem.retrieve('morph').start({'opacity':[0,1],'top' : [newY, 0]})}
			else {newItem.retrieve('morph').start({'top' : [newY, 0]})}
		} else if (self.options.orientation == 'none') {
			newItem.retrieve('morph').start({'opacity':[0,1]});
		} else {
			if (self.options.fade == true){newItem.retrieve('morph').start({'opacity':[0,1],'left' : [newX, 0]})}
			else {newItem.retrieve('morph').start({'left' : [newX, 0]})}
		}

		// send last item out
		if (curItem != newItem) {
			if (self.options.orientation == 'vertical') {
				if (self.options.fade == true) {curItem.retrieve('morph').start({'opacity':[0],'top' : [(curY)]})}
				else {curItem.retrieve('morph').start({'top' : [(curY)]});}
			} else if (self.options.orientation == 'none') {
				curItem.retrieve('morph').start({'opacity':[1,0]});
			} else {
				if(self.options.fade == true){curItem.retrieve('morph').start({'opacity':[0],'left' : [(curX)]})}
				else{curItem.retrieve('morph').start({'left' : [(curX)]});}
			}
		}
	},

	pauseIt: function () {
		var self = this;
		//only move if not currently moving
		if (self.isSliding == 0) {
			if(self.options.isPaused == false){
				self.options.isPaused = true;
				$clear(self.timer);
			} else {
				self.options.isPaused = false;
				self.slideIt();
				self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
			}
		}
	},

	changeIndex: function() {
		var self = this;
		var numItems = self.options.items.length;  //get number of slider items
		//change index based on value of 'direction' parameter
		if(self.direction == 1){
			if(self.options.itemNum < (numItems - 1)){
				self.options.itemNum++;
			} else {
				self.options.itemNum = 0;
			}
		} else if (self.direction == 0) {
			if (self.options.itemNum > 0) {
				self.options.itemNum--;
			} else {
				self.options.itemNum = (numItems - 1);
			}
		}
	},

	numPress: function (theIndex) {
		var self = this;
		if (self.options.itemNum != theIndex) {
			if(self.options.isPaused == false){
				$clear(self.timer);
				self.timer = self.slideIt.periodical(self.options.slideTimer, this, null);
			}
			self.slideIt(theIndex);
		}
	}
});

