//http://deziddon.com/mkiscript
(function(){
	if (typeof MKAvail === 'boolean') {return;}

	var MK = function(ls) {
		this.els = [];
		for (var i = 0, k = ls.length; i < k; i++) {
			var l = ls[i];
			if (typeof l === 'string') l = $i(l);
			this.els.push(l);
		}
		return this;
	}

	MK.prototype = {
		push : function(a) {
			for (var j = 0, p = a.length; j < p; j++) {
				this.els.push(a[j]);
			}
			return this;
		},

		all : function(f) {
			for (var i = 0, xn = this.els.length; i < xn; ++i) {
				f.call(this, this.els[i]);
			}
			return this;
		},

		on : function(t, f) {
			var lsn = function(el) {
				if (window.addEventListener) {
					el.addEventListener(t, f, false);
				} else if (window.attachEvent) {
					el.attachEvent('on' + t, function() {
							f.call(el, window.event);
						}
					);
				}
			};
			this.all(function(el) {
				lsn(el);
			});
			return this;
		},

		style : function(p, v) {
			this.all(function(el) {
				var u = v;
				if (p === 'opacity') {
					el.style['filter'] = 'alpha(opacity='+ u +')';
					u = u / 100;
				}
				el.style[p] = u;
			});
			return this;
		},

		css : function(o) {
			for (var p in o) {
				this.style(p, o[p]);
			}
			return this;
		},

		anim : function(f, b, e, t, c) {
			var that = this;
			for (var p in b) {
				if (p !== 'opacity' || p !== 'zIndex') {
					e[p] = (e[p] - b[p]);
				}
			} 
			var nd = new Date().getTime() + t;
			setTimeout(function() {
				var k = (t - (nd - new Date().getTime()));
				if (t <= k) k = t;	
				for (var p in b) {
					if (p === 'scrollLeft' || p === 'scrollTop') {
						that.all(function(el) {
							el[p] = f(k, b[p], e[p], t);
						});
					} else {
						var prt = (p === 'zIndex' || p === 'opacity') ? '' : 'px';
						that.style(p, Math.floor(f(k, b[p], e[p], t)) + prt);
					}
				}
				if (k === t) {
					if (c) c();
				} else {
					setTimeout(arguments.callee, 30);
				}
			}, 30);
			return this;
		}
	};

	window.$ = function() {
		return new MK(arguments);
	};

	$i = function(o) {
		if (typeof o == 'string') {
			return document.getElementById(o);
		}
		return o;
	};

	$e = function(i, e) {
		var d = i ? $i(i) : document;
		return d.getElementsByTagName(e);
	};

	$c = function(c, e) {
		var d = e ? $i(e) : document;
		if (!document.getElementsByClassName) {
			var r = [];
			c = new RegExp('\\b'+c+'\\b');
			d = d.getElementsByTagName('*');
			for (var i = 0;i < d.length;i++) {
				if (c.test(d[i].className)) {
					r.push(d[i]);
				}
			}
			return r;
		}
		return d.getElementsByClassName(c);
	};

	xhr = function(u, p, s, f) {
		var X = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
		if (p == '') {
			X.open('GET', u, true);
		} else {
			X.open('POST', u, true);
			X.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		}
		X.onreadystatechange = function() {
			if (X.readyState === 4) {
				var r = X.responseText;
				if (X.status === 200) {
					if (s) s(r, X);
				} else {
					if (f) f(r, X);
				}
			}
		};
		X.send(p);
	};

	load = function(s, c) {
		var f = document.createElement('script');
		f.type = 'text/javascript';
		f.setAttribute('async', 'true');
		f.onloadDone = false;
		if (c) {
            f.onload = function() {
	     		f.onloadDone = true;        
            	c();
            };
	     	f.onreadystatechange = function() {
	     		if (('loaded' === f.readyState || 'complete' === f.readyState) && !f.onloadDone) {
		     		f.onloadDone = true;
	     			c();
	     		}
	     	};
        }
		f.src = s;
		var h = $e(document, 'head')[0];
		h.insertBefore(f, h.firstChild);
	};

	offSet = function(o) {
		var l = 0;
		var t = 0;
		if (o.offsetParent) {
			do {
				l += o.offsetLeft;
				t += o.offsetTop;
			} while(o = o.offsetParent);
			return [l, t];
		}
	};

	preventDefault = function(e) {
		if (!e) e = window.event;
		e.cancelBubble = true;
		e.returnValue = false;
		if (e.preventDefault) {
			e.preventDefault();
		}
	};

	if (!Array.indexOf) {
		Array.prototype.indexOf = function(o, i) {
			for(var j = this.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; i < j && this[i] !== o; i++);
			return j <= i ? -1 : i
		}
	}

	ease = {
		cubic : function(t, b, c, d) {
			if((t /= d / 2) < 1){
				return (c / 2 * t * t * t + b) * 1;
			}
			return (c / 2 * ((t -= 2) * t * t + 2) + b) * 1;
		},

		bounce : function(t, b, c, d) {
			if((t /= d) < (1 / 2.75)) {
				return c * (7.5625 * t * t) + b;
			} else if(t < (2 / 2.75)) {
				return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;
			} else if(t < (2.5 / 2.75)) {
				return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;
			}else{
				return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;
			}
		}
	}
	MKAvail = true;
})();

var getCookie = function(nm) {
	if (document.cookie.length > 0) {
		var cs = document.cookie.indexOf(nm + '=');
		if (cs != -1) {
			cs = (cs + nm.length + 1);
			ce = document.cookie.indexOf(';', cs);
			if (ce == -1) ce = document.cookie.length;
			return unescape(document.cookie.substring(cs, ce));
		}
	}
	return '';
};
		
var setCookie = function(n, v) {
	var date = new Date();
	date.setTime(date.getTime() + (50 * 24 * 60 * 60 * 1000));
	var x = '; expires=' + date.toGMTString();
	document.cookie = n + '=' + escape(v) + ';expires='+ x;
};


// NAV
$(window).on('load', function() {
	$().push($e('nav', 'li')).all(function(el) {
		var sLnk = $e(el, 'a')[0].href;
		if (document.location == sLnk) {
			el.className = 'cur';
		}	
	}).on('mouseover', function(){
		if (this.className == 'cur') { return; }
		$(this).css({backgroundImage:'url(/media/img/v4/nbgi.png)'});
	}).on('mouseout', function() {
		if (this.className == 'cur') { return; }
		$(this).css({backgroundImage:'none'});	
	});
	$().push($c('pLoad')).css({visibility: 'visible'});	
});

// HURT DEVELOPER
$(window).on('load', function() {
	var hd = $i('hurtDeveloper');
	if (hd) {
		hd.onclick = function() {
			alert('HAHA! A lazy GrabaGAFF developer hasn\'t written this functionality yet!!\n\n\nBut management has been notified you want that developer harmed...');
		};
	}
});

// Search
$(window).on('load', function() {
	if (!$i('slideSearch')) {
		return;
	}
	
	var innerTEXT = function(el) {
		if (!el.innerTEXT) {
			return $i(el).textContent;
		} else {
			return $i(el).innerText;		
		}	
	};

	var slidrs = $c('sldr');
	
	for (var d = 0, s = slidrs.length; d < s; d++) {
		(function() {
			var curIdx = d;
			var colList = $i(slidrs[d]);
			$(colList).css({width: '790px', marginTop: '5px', height: '50px', overflow: 'hidden'});

			var frag = document.createDocumentFragment();

			var track = document.createElement('div');
			$(track).css({width: '18100px', textAlign: 'left'});

			frag.appendChild(track);

			while (colList.firstChild) {
				track.appendChild(colList.firstChild);
			}

			var lbs = $().push($e(track, 'label'));
			lbs.all(function(el) {
				$($e(el,'input')[0]).css({position: 'absolute', left: '-9999px'});
				if (document.all) {
					$(el).css({display: 'inline'});				
				}
			}).on('mouseover', function(e) {
				if (this.className != 'sel') {
					$i(this).className = 'pms';
				}
			}).on('mouseout', function(e) {
				if (this.className != 'sel') {
					this.className = this.className.replace('pms', '');
				}
			}).on('click', function(e){
				preventDefault(e);
				$e(this,'input')[0].checked = true;
				lbs.all(function(el){el.className = '';});
				$i(this).className = 'sel';	
				setCookie('sldr_'+ curIdx, colList.scrollLeft);
				setCookie('chosn_'+ curIdx, $e(this,'input')[0].id);
			});	
					
			colList.appendChild(frag);

			var curOffSet = getCookie('sldr_'+ curIdx);
			var curSelect = getCookie('chosn_'+ curIdx);

			if (curSelect.length > 0) {
				$i(curSelect).parentNode.className = 'sel';
				$i(curSelect).checked = true;
				colList.scrollLeft = curOffSet;
			}

			var trkWidth = 0;	
			lbs.all(function(el) {
				trkWidth = trkWidth + (el.offsetWidth + 50);
			});
			$(track).css({width: trkWidth + 'px'});

			var working = false;
			var moving;
			var scrolling = function(d) {	
				clearInterval(moving);
				moving = setInterval(function() {
					if (working) {
						$i(colList).scrollLeft = $i(colList).scrollLeft + d;
					}
				}, 5);
			};

			var pX, pY;
			var colListOS = offSet(colList);
			var sX = colListOS[0];
			var pmY = colListOS[1];
			var pmX = sX + colList.offsetWidth;
			var pmW = $i('pm').offsetWidth / 2;

			if (curIdx == 0) {							
				// CREATE ARROW VISUALISATION
				if (curSelect.length > -2) {
					var lftArr = new Image()
					lftArr.className = 'sldArr';
					if (document.all) {
						lftArr.src = '/media/img/v4/sldrLeftArr.gif';					
					} else {
						lftArr.src = '/media/img/v4/sldrRightArr.png';					
					}
					lftArr.id = 'slideLft';
					var rgtArr = new Image();
					rgtArr.className = 'sldArr flip';
					rgtArr.id = 'slideRgt';
					rgtArr.src = '/media/img/v4/sldrRightArr.png';
					document.body.appendChild(lftArr);
					document.body.appendChild(rgtArr);
					$(lftArr).css({top: pmY + 'px', left: (sX - 45) + 'px'});
					$(rgtArr).css({top: pmY + 'px', left: (pmX + 10) + 'px'});
	
					var blinkSlide = function(f) {
						$(colList).anim(ease.cubic, {opacity: 100}, {opacity: 10}, 100, function() {
							$(colList).anim(ease.cubic, {opacity: 10}, {opacity: 100}, 300, function() {
								if (f) {
									f();
								}
							});
						});				
					};
					
					var slideArrs = $(lftArr, rgtArr);
					setTimeout(function() {
						slideArrs.css({display: 'block'}).anim(ease.cubic, {opacity: 0}, {opacity: 100}, 500, function() {
							blinkSlide(blinkSlide);
							setTimeout(function() {
								slideArrs.anim(ease.cubic, {opacity: 100}, {opacity: 0}, 500, function() {
									$(lftArr).css({left: (sX - 10) + 'px'});
									$(rgtArr).css({left: (pmX - 25) + 'px'});
									if (document.all) {
										lftArr.src = '/media/img/v4/sldrLeftArr.gif';
										rgtArr.src = '/media/img/v4/sldrRightArr.png';
									} else {
										lftArr.className = 'sldArr flip';
										rgtArr.className = 'sldArr';
									}
								});
							}, 1000);
						});
					}, 500);
				}
			}			
	
			// TRIGGER SLIDER
			$(document).on('mousemove', function(e) {
			
				if (curIdx == 0) {			
					var curArrow = 'slideRgt';
					var hidden = false;
										
					var showArrow = function(arr) {
						curArrow = arr;
						$(curArrow).css({opacity: 100, display: 'block'});
						hidden = true;
					};

					var hideArrow = function() {
						if (!hidden) {
							$('slideRgt', 'slideLft').css({opacity: 0});
							//console.log('Hide ' + curArrow);
						}
					};
				}
			
				if (!e) e = window.event;
				if (e.pageX || e.pageY) {
					pX = e.pageX;
					pY = e.pageY;
				}
				else if (e.clientX || e.clientY) {
					pX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
					pY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
				}
	//			$i('diag').innerHTML = 'X:'+ pX +' - Y:'+ pY;
		
				if (pY > pmY && pY < (pmY + colList.offsetHeight) && pX > sX && pX < pmX) {
					$i('pm').style.display = 'block';				
					$i('pm').style.left = (pX - pmW) +'px';
					$i('pm').style.top = (pmY - 35) +'px';
					if (pX > (sX + 100) && pX < (pmX - 100)) {
						working = false;
						if (curIdx == 0) {
							hideArrow();
						}						
						return;
					}
					if (pX > (pmX - 100)) {
						working = true;
						scrolling(13);	
						if (curIdx == 0) {
							showArrow('slideRgt');
						}
						return;
					}
					if (pX <  (sX + 100)) {
						working = true;
						scrolling(-13);
						if (curIdx == 0) {
							showArrow('slideLft');	
						}
						return;
					}
				}
				working = false;
				if (curIdx == 0) {
					hideArrow();
				}
			});
			
			if (curIdx == 0) {	
				// SLIDE TO KeyPress			
				$(document).on('keydown', function(e) {
					if ($e('hdr', 'input')[0].hasFocus()) return;

					var evt = e || window.event;
					var curKey = evt.keyCode;
					if (curKey < 65 || curKey > 90) {
						return;
					}

					var seek = String.fromCharCode(curKey).toUpperCase();					
					var seekOS = 0;
					var railOS = offSet($i(colList));
					
					var curLbl = $e(track, 'label');
					var foundMatch = false;
					
					for (var k = 0, p = curLbl.length; k < p; k++) {
						curLbl[k].className = curLbl[k].className.replace('pms', '').replace('sel', '');
						if (!foundMatch) {
							if (document.all) {
								var curLblText = curLbl[k].innerText;
								if (curLblText.length > 0) {
									curLblText = curLblText.substring(0, 1);
								}
							} else {
 								var curLblText = innerTEXT(curLbl[k]).toString().substring(0, 1).toUpperCase();							
							}
							if (curLblText == seek) {
								curLbl[k].className = 'pms';
								seekOS = (offSet(curLbl[k])[0] - railOS[0] - curLbl[k].offsetWidth);
								foundMatch = true;
							}
						}
					}
					
					if (foundMatch) {
						$i(colList).scrollLeft = seekOS;					
						var keyPress = $i('showKey');
						if (!keyPress) {
							keyPress = document.createElement('div');
							keyPress.id = 'showKey';
							document.body.appendChild(keyPress);
						}
						keyPress.innerHTML = seek;
						var kp = $(keyPress);
						kp.css({opacity: 0, top: railOS[1] + 'px', left: (railOS[0] - 27) + 'px', display: 'block'}).anim(ease.cubic, {opacity: 0}, {opacity: 100}, 200, function() {
							kp.anim(ease.cubic, {opacity: 100}, {opacity: 0}, 500);	
						});
					}
				});					
			}			
		})();
	}
});

// OVERLAY
$(window).on('load', function() {
	load('/media/js/imageOverlay.js');	
});

// PREDICTIVE SEARCH
$(window).on('load', function() {
	var searchField = $e('hdr', 'input')[0];
	searchField.setAttribute('autocomplete', 'off');
	searchField.focused = false;
	
	searchField.hasFocus = function() {
		return this.focused;
	};
	
	searchField.onfocus = function() {
		this.focused = true;
	};
	
	searchField.onblur = function() {
		this.focused = false;
	};		

	xhr('/modules/gaffs/predictive/', '', function(t) {
		var srcBox = $e('hdr', 'input')[0];
		
		var resultDiv = document.createElement('div');
		resultDiv.id = 'predictiveResults';
		$e(document, 'body')[0].appendChild(resultDiv);
		
		var searchDiv = document.createElement('div');
		searchDiv.innerHTML = t;		
		var sDvs = $e(searchDiv, 'div');
		var sDvl = sDvs.length;
				
		$(searchField).on('keyup', function(e) {
			var evt = e || window.event;
			preventDefault(e);
			
			var curKey = evt.keyCode;
			if (curKey == 38 || curKey == 40 || curKey == 13 || curKey == 27) {
				return;
			}
			
			var sTrm = this.value.toLowerCase();
			if (sTrm.length < 2) {
				resultDiv.style.display = 'none';
			 	return;
			 }
			
			resultDiv.innerHTML = '';
			var rslts = [];
			var cCol = '';
			var cCtr = 0;

			for (var i = 0; i < sDvl; i++) {
				var cSearch = sDvs[i].innerHTML.toLowerCase();
				if (cSearch.indexOf(sTrm) > -1) {
					if (sDvs[i].className == 'p') {	
						var cInst = 'Page matches';	
					} else {
						var cInst = cSearch.split(', ')[0];
					}
					if (cCol != cInst) {
						if (sDvs[i].className == 'p') {
							rslts.push('<h3>Page matches:</h3>');
						} else {
							rslts.push('<h3>'+ sDvs[i].innerHTML +':</h3>');						
						}
						cCol = cInst;
						cCtr = 0;
					}
					if (cCtr < 4) {
 						if (cInst == 'Page matches'){
							rslts.push('<a href=\''+ sDvs[i].getAttribute('rel') +'\'>'+ sDvs[i].getAttribute('title') +'</a>');						
						} else {
							rslts.push('<a href=\'/modules/accommodation/'+ cInst.replace(/ /g, '+') +'/?'+ sDvs[i].getAttribute('rel') +'\'>'+ sDvs[i].getAttribute('title') +'</a>');
						}
					}
					if (cCtr == 4) {
						if (cInst != 'Page matches') {
							rslts.push('<a href=\'/modules/gaffs/?colleges='+ cInst +'\'><strong>Find more</strong></a>');
						} else {
							rslts.push('<a href=\'/modules/search/?searchterm='+ sTrm +'\'><strong>Find more</strong></a>');						
						}
					}
					cCtr++;					
				}
			}
			if (rslts.length != 0) {
				resultDiv.innerHTML = rslts.join('');
				$(resultDiv).css({display: 'block', top: (offSet(srcBox)[1] + 17) + 'px', left: (offSet(srcBox)[0] + 2) + 'px'});
			} else {
				resultDiv.style.display = 'none';			
			}	
		});
	});

	$(document).on('keydown', function(e) {
		var preSearch = $i('predictiveResults');
		if (preSearch) {
			if ($i('predictiveResults').style.display != 'block') { 
				return;
			}
		}
		
		var evt = e || window.event;
		var aaz = $e('predictiveResults', 'a');
		var cur = -1;
			
		for (var i = 0, j = aaz.length; i < j; i++) {
			if (aaz[i].className == 'hvr') {
				cur = i;
				break;
			}
		}
	
		if (evt.keyCode == 38) {
			if (cur === 0) return;
			cur--;
		}
	
		if (evt.keyCode == 40) {
			if (cur === (aaz.length - 1)) return;
			cur++;	
		}
		
		if (evt.keyCode == 38 || evt.keyCode == 40) {
			for (var i = 0, j = aaz.length; i < j; i++) {
				aaz[i].className = '';			
			}
			$i('predictiveResults').scrollTop = (offSet(aaz[cur])[1] - offSet($i('predictiveResults'))[1] - 26);
			aaz[cur].className = 'hvr';
		}
	
		if (evt.keyCode == 13 && cur != -1) {
			preventDefault(e);
			document.location = aaz[cur].getAttribute('href');
		}
	
		if (evt.keyCode == 13 || evt.keyCode == 27) {
			preventDefault(e);		
			$i('predictiveResults').style.display = 'none';
		}
	});		
});

// stats
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-9565195-1']);
_gaq.push(['_trackPageview']);
load('http://www.google-analytics.com/ga.js');

// Preload assets
$(window).on('load', function() {	
	var pl = '/media/img/v4/sldrRightArr.png,/media/img/v4/sldrLeftArr.gif'.split(',');
	for (var i = 0, j = pl.length; i < j; i++) {
		var n = new Image();
		n.src = pl[i];
	}
});
