///<reference path="main.js"/>
//------------------------------------------------------------------
//## INIT
//------------------------------------------------------------------
var PAGE = {};
var MENU = {};
var LAYOUT = {};
var iPOP = {};
var TOOLTIP = {};
var TRANSLATE = {};
var COMMENTS = {};
var SEARCHHANDLER = {};
var FUNCTIONS = {};

var VISITEDPAGESHANDLER;
var STRINGHANDLER;
var IO;
var TEXTHANDLER;

var isIE = /*@cc_on!@*/false;
var isIE6 = false/*@cc_on || @_jscript_version < 5.7@*/;

/* EVENTHANDLER FOR DOMONLOAD
//## ADD FUNCTIONS THAT SHOULD RUN ON DOM LOAD
----------------------------------------------------*/
var onPageLoad = function() {
	//##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>##

	TRANSLATE.Init();

	VISITEDPAGESHANDLER = new VisitedPagesHandler();
	STRINGHANDLER = new StringHandler();
	IO = new InputOutput();
	TEXTHANDLER = new TextHandler();

	PAGE.Init();
	MENU.Init();

	//## ERRORHANDLING
	if (!$('content')) {
		var h1 = document.getElementsByTagName('H1')[0];
		h1.innerHTML = h1.innerHTML + '<br/><br/>Error! Missing PageRoot: <strong>div#content</strong>';
		return;
	}

	LAYOUT.Init();
	SEARCHHANDLER.Init();
	TOOLTIP.Init();
	iPOP.Init();

	EVENT.Add(document, 'keydown', keyboardSniffer);
	if (PAGE.RenderMode == 'dynamic') {
		EVENT.Add($('btnSearch'), 'click', SEARCHHANDLER.SearchForm);
		EVENT.Add($('tbSearchBox'), 'focus', SEARCHHANDLER.InputOnFocus);
		EVENT.Add($('tbSearchBox'), 'blur', SEARCHHANDLER.InputOnBlur);
	}

	PAGE.CheckForOversize();

	if (isIE6) {
		var preload = new Image();
		preload.src = 'http://www.ap1.se/2008/gfx/bg-menu.gif';
	}
	if (typeof hhStatistics == "object" && ! hhStatistics.runOnce && ((typeof sA == "object" && typeof sA.t == "function") || (typeof sC == "object" && typeof sC.t == "function"))) {
		hhStatistics.runOnce = true;
		setTimeout('if (typeof sA == "object" && typeof sA.t == "function") hhStatistics.sACode = sA.t(); if (typeof sC == "object" && typeof sC.t == "function") hhStatistics.sCCode = sC.t();', 1000);
	}

	//##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>##
};


/* CANCEL EVENT
----------------------------------------------------*/
var CancelEvent = function(e) {
	if (e.preventDefault) { e.preventDefault() }
	else { e.returnResult = false }
	if (e.stopPropagation) { e.stopPropagation() }
	else { e.cancelBubble = true; event.returnValue = false; }
};


/* SHORTCUT FOR GET ELEMENY BY ID
----------------------------------------------------*/
var $ = function(elm) { return document.getElementById(elm); }


/* KEYBOARD LISTENER
----------------------------------------------------*/
var keyboardSniffer = function(e) {
	if (PAGE.RenderMode == 'static') return;
	var srcType = '', src = null, key;
	e = (!e) ? window.event : e;
	if (!e || e.altKey) return;
	src = (typeof e.target !== 'undefined') ? e.target : e.srcElement;
	key = (typeof e.keyCode !== 'undefined') ? e.keyCode : e.which;
	srcType = src.tagName;
	var validIds = new Array('tbSearchBox', 'tbSearchBoxInMenu', 'txtPasswordLogin', 'txtPassword');
	if (srcType == 'INPUT') {
		if (!validIds.exists(src.id))
			return;
	} else if (srcType == 'TEXTAREA') {
		return;
	}
	switch (key) {
		//------------------------------      
		//## ENTER:      
		case 13:
			switch (src.id) {
				case 'tbSearchBox':
				case 'tbSearchBoxInMenu':
					SEARCHHANDLER.SearchForm(e);
					break;

				case 'txtPasswordLogin':
					ActionHandler('login');
					break;

				case 'txtPassword':
					ActionHandler('button-signup');
					break;
			}

			CancelEvent(e);
			break;

		//------------------------------      
		//## RIGHT ARROW:  
		case 39:
			CancelEvent(e);
			LAYOUT.ScrollNext();
			iPOP.Close();
			MENU.Hide();
			break;
		//------------------------------      
		//## LEFT ARROW:      
		case 37:
			CancelEvent(e);
			LAYOUT.ScrollPrevious();
			iPOP.Close();
			MENU.Hide();
			break;
		//------------------------------      
		//## ARROW UP:      
		//		case 38: if(menuwidth > 250){focusMenuItem(-1);CancelEvent(e)}break;      
		//------------------------------      
		//## ARROW DOWN:      
		//		case 40: if(menuwidth > 250){focusMenuItem(1);CancelEvent(e)}break;      
		//------------------------------      
		//##PAGE UP:      
		//	case 33: location.href=previousUrl;break;      
		//------------------------------      
		//## PAGE DOWN:      
		///	case 34: location.href=nextUrl;break;      
		//------------------------------      
		//## END:    
		case 35:
			CancelEvent(e);
			LAYOUT.ScrollTo(LAYOUT.Columns - 1);
			MENU.Hide();
			break;
		//------------------------------      
		//## HOME:    
		case 36:
			CancelEvent(e);
			LAYOUT.ScrollTo(0);
			MENU.Hide();
			break;
		//------------------------------      
		//## SPACE:
		case 32:
			if (src.id !== 'tbSearchBox') {
				MENU.Show();
				CancelEvent(e);
			}
			break;
		//------------------------------      
		//## ESCAPE:  
		case 27:
			MENU.Hide();
			iPOP.Close();
			break;
		//------------------------------      
		//## NOTHING:      
		default: return true; break;
	}
};


/* TO STRING
----------------------------------------------------*/
String.prototype.ToString = function() {
	return this.replace(/<\/?[^>]+(>|$)/g, '').toString();
};


/* TO STRING
----------------------------------------------------*/
String.prototype.WebSafe = function() { return this.replace(/\s/g,'-') };


/* LINEARIZE
----------------------------------------------------*/
String.prototype.Linearize = function() { return this.replace(/\r|\n|\r\n|\r\n|\t|\s|\f|\v/g, '') };

/* COOKIE HANDLER (v.20090320)
----------------------------------------------------*/
var COOKIE = function() {
	return {
		Create: function(name, value, days) { if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); var expires = '; expires=' + date.toGMTString() } else { var expires = '' } document.cookie = name + '=' + value + expires + '; path=/' },
		Read: function(name) { var nameEQ = name + '=', ca = document.cookie.split(';'); for (var i = 0, n = ca.length; i < n; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1, c.length) }; if (c.indexOf(nameEQ) == 0) { return c.substring(nameEQ.length, c.length) } }; return null },
		Remove: function(name) { COOKIE.Create(name, '', -1) }
	}
} ();


/* EVENT HANDLER (v.20090320) 
----------------------------------------------------*/
var EVENT = function() {
	return { Add: function(obj, EventType, FunctionName) { var eventTypeRef = '__' + EventType; if (obj[eventTypeRef]) { if (EVENT.Search(FunctionName, obj[eventTypeRef]) > -1) return } else { obj[eventTypeRef] = []; if (obj['on' + EventType]) obj[eventTypeRef][0] = obj['on' + EventType]; obj['on' + EventType] = EVENT.Handle } obj[eventTypeRef][obj[eventTypeRef].length] = FunctionName },
		Remove: function(obj, EventType, FunctionName) { var eventTypeRef = '__' + EventType; if (obj[eventTypeRef]) { var i = EVENT.Search(FunctionName, obj[eventTypeRef]); if (i > -1) delete obj[eventTypeRef][i] } },
		Handle: function(e) { e = e || window.event; var eventTypeRef = '__' + e.type, returnValue = true; for (var i = 0, j = this[eventTypeRef].length; i < j; i++) { if (this[eventTypeRef][i]) { this.__fn = this[eventTypeRef][i]; returnValue = this.__fn(e) && returnValue } } if (this.__fn) try { delete this.__fn } catch (e) { this.__fn = null } return returnValue },
		Search: function(val, arr) { var i = arr.length; while (i--) { if (arr[i] && arr[i] === val) break } return i },
		Abort: function(e) { if (e.preventDefault) { e.preventDefault() } else { e.returnResult = false } if (e.stopPropagation) { e.stopPropagation() } else { e.cancelBubble = true; event.returnValue = false } }
	}
} ();


/* DOM HANDLER (v.20090320) 
----------------------------------------------------*/
var DOM = function() {
	return {
		Get: function(elm) { if (typeof elm === 'string') { return document.getElementById(elm) } else { return elm } },
		Create: function(tag, cssClass, id) { var tmp = document.createElement(tag); if (cssClass) { tmp.className = cssClass }; if (id) { tmp.id = id }; return tmp },
		Remove: function(elm) { var elm = this.Get(elm); if (elm) { elm.parentNode.removeChild(elm) } },
		Add: function(elm, target) { var elm = this.Get(elm); var target = this.Get(target); if (elm && target) { target.appendChild(elm) } },
		AddFirst: function(elm, target) { var elm = this.Get(elm); var target = this.Get(target); if (elm && target) { target.insertBefore(elm, target.firstChild) } },
		AddAfter: function(elm, target) { var parent = target.parentNode; if (parent) { if (DOM.LastChild(parent) == target) { parent.appendChild(elm) } else { parent.insertBefore(elm, target.nextSibling) } } },
		AddBefore: function(elm, target) { var parent = target.parentNode; if (parent) { parent.insertBefore(elm, target) } },
		SetAttribute: function(elm, type, value) { if (DOM.GetAttribute(elm, type)) { elm.removeAttribute(type) }; var t = document.createAttribute(type); t.nodeValue = value; elm.setAttributeNode(t) },
		GetAttribute: function(elm, attrib) { for (var q = 0, qn = elm.attributes.length; q < qn; q++) { if (elm.attributes[q].nodeName.toLowerCase() == attrib.toLowerCase()) { return elm.attributes[q].nodeValue } } },
		PreviousSibling: function(node) { if (node.previousSibling) { node = node.previousSibling; while (node != null && node.nodeType != 1) { node = node.previousSibling }; return node }; return null },
		NextSibling: function(node) { if (node.nextSibling) { node = node.nextSibling; while (node != null && node.nodeType != 1) { node = node.nextSibling }; return node }; return null },
		FirstChild: function(node) { if (node) { var children = DOM.ChildNodes(node); if (children.length > 0) { return children[0] }; return null }; return null },
		LastChild: function(node) { if (node) { var children = DOM.ChildNodes(node); if (children.length > 0) { return children[children.length - 1] }; return null }; return null },
		ChildNodes: function(node) { if (node) { var children = node.childNodes, tmp = []; if (children.length > 0) { for (var ii = 0, nn = children.length; ii < nn; ii++) { var node = children[ii]; if (node.nodeType == 1) tmp.push(node) }; return tmp }; return null }; return null },
		GetByClassName: function(parent, tag, classname) { var arrReturnElements = new Array(); if (parent) { var d = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag); classname = classname.replace(/\-/g, '\\-'); var e = new RegExp('(^|\\s)' + classname + '(\\s|$)'), oElement = null; for (var i = 0, n = d.length; i < n; i++) { oElement = d[i]; if (e.test(oElement.className)) arrReturnElements.push(oElement) } } return (arrReturnElements) },
		GetByAttribute: function(parent, tag, attrib, value) { var f = new Array(); if (parent) { var e = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag); var g = (typeof value != 'undefined') ? new RegExp("(^|\\s)" + value + "(\\s|$)") : null, h, j; for (var i = 0, n = e.length; i < n; i++) { h = e[i]; j = h.getAttribute && DOM.GetAttribute(h, attrib); if (typeof j == 'string' && j.length > 0) { if (typeof value == 'undefined' || (g && g.test(j))) { f.push(h) } } } } return f }
	}
} ();


/* WRITE TO FIREBUG CONSOLE
----------------------------------------------------*/
var Console = function() {
	return {
		Log: function(msg, args) { if (typeof console == 'undefined') return false; if (!args) args = ''; console.log(msg, args) },
		Info: function(msg, args) { if (typeof console == 'undefined') return false; if (!args) args = ''; console.info(msg, args) },
		Warn: function(msg, args) { if (typeof console == 'undefined') return false; if (!args) args = ''; console.warn(msg, args) },
		Error: function(msg, args) { if (typeof console == 'undefined') return false; if (!args) args = ''; console.error(msg, args) }
	}
} ();


/* OPACITY HANDLER
----------------------------------------------------*/
var setOpacity = function(obj, opacity) {
	if (!obj) return; obj.style.filter = 'alpha(style=0,opacity:' + opacity + ')'; obj.style.KHTMLOpacity = (opacity / 100); obj.style.MozOpacity = (opacity / 100); obj.style.opacity = (opacity / 100);
};


/* GET SCREEN VIEWPORT
----------------------------------------------------*/
var getViewport = {
	Height: function() { if (typeof window.innerHeight != 'undefined') { return window.innerHeight } else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientHeight != 'undefined' && document.documentElement.clientHeight) { return document.documentElement.clientHeight } },
	Width: function() { if (typeof window.innerWidth != 'undefined') { return window.innerWidth } else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth) { return document.documentElement.clientWidth } }
};


/* ARRAY PROTOTYPE EXISTS
----------------------------------------------------*/
Array.prototype.exists = function(search) {
	for (var i = 0, nn = this.length; i < nn; i++) {
		if (this[i] == search) return true;
	}
	return false;
}

Array.prototype.existsIn = function(search) {
	for (var i = 0, nn = this.length; i < nn; i++) {
		if (search.indexOf(this[i]) != -1) return true;
	}
	return false;
}

String.prototype.reverse = function() {
	var i = this.length;
	i = i - 1;
	var newstring = '';
	for (var x = i; x >= 0; x--)
	{ newstring += this.charAt(x); }
	return newstring;
}

var getElmPosition = {
	GetX: function(obj) { var xy = 0; if (obj.offsetParent) { while (1) { xy += obj.offsetLeft; if (!obj.offsetParent) break; obj = obj.offsetParent } } else if (obj.x) { xy += obj.x } return xy },
	GetY: function(obj) { var xy = 0; if (obj.offsetParent) { while (1) { xy += obj.offsetTop; if (!obj.offsetParent) break; obj = obj.offsetParent } } else if (obj.y) { xy += obj.y } return xy }
};


/* ON DOM LOAD
----------------------------------------------------*/
var onDOMload = function() { if (arguments.callee.done) return; arguments.callee.done = true; if (_timer) clearInterval(_timer); onPageLoad() };
/*@cc_on
@if(@_win32 || @_win64)if (document.getElementById) { document.write("<script id=\"ieScriptLoad\" defer src=\"//:\"><\/script>"); document.getElementById("ieScriptLoad").onreadystatechange = function() { if (this.readyState == "complete") { onDOMload() } } } @end@*/
if (document.addEventListener) { document.addEventListener('DOMContentLoaded', onDOMload, false) }; if (/KHTML|WebKit|iCab/i.test(navigator.userAgent)) { var _timer = setInterval(function() { if (/loaded|complete/.test(document.readyState)) { onDOMload() } }, 10) } window.onload = onDOMload;

