///<reference path="main.js"/>
//------------------------------------------------------------------
//## INIT
//------------------------------------------------------------------
var PAGE = {};
var MENU = {};
var LAYOUT = {};
var iPOP = {};
var TOOLTIP = {};
var TRANSLATE = {};
var COMMENTS = {};
var SEARCHHANDLER = {};

var COMMENTAREA = {};
var ACTIVECOMMENT = {};
var COMMENTPLACEHOLDER = {};
var ELEMENTS = {};

var VISITEDPAGESHANDLER;
var STRINGHANDLER;
var IO;
var TEXTHANDLER;
var USER;
var USERHANDLER;
var SERVERCONNECTION;
var COMMENTHANDLER;


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();
	USER = new User(); //ACTIVE USER
	USERHANDLER = new UserHandler(); //USERHANDLER
	SERVERCONNECTION = new ServerConnection();
	COMMENTHANDLER = new CommentHandler();

	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();
	COMMENTS.Init();

	//## GIVE COMMENTS TIME TO LOAD 
	setTimeout('iPOP.Init()', 100);

	addEvent(document, 'keydown', keyboardSniffer);
	addEvent($('btnSearch'), 'click', SEARCHHANDLER.SearchForm);
	addEvent($('tbSearchBox'), 'focus', SEARCHHANDLER.InputOnFocus);
	addEvent($('tbSearchBox'), 'blur', SEARCHHANDLER.InputOnBlur);

	PAGE.CheckForOversize();

	if (typeof sC == "object" && typeof sC.t == "function") {
		hhStatistics.sCCode = sC.t();
	}
	if (isIE6) {
		var preload = new Image();
		preload.src = 'http://www.ap1.se/2008/gfx/bg-menu.gif';
	}

	//##>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>##
};


/* EVENTHANDLER FOR ADDING EVENTS TO OBJECTS
----------------------------------------------------*/
var addEvent = function(obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); EventCache.add(obj, type, fn) } else if (obj.attachEvent) { obj['e' + type + fn] = fn; obj[type + fn] = function() { obj['e' + type + fn](window.event) }; obj.attachEvent('on' + type, obj[type + fn]); EventCache.add(obj, type, fn); } else { obj['on' + type] = obj['e' + type + fn] } }
var EventCache = function() { var listEvents = []; return { listEvents: listEvents, add: function(node, sEventName, fHandler) { listEvents.push(arguments) }, flush: function() { var i, item; for (i = listEvents.length - 1; i >= 0; i = i - 1) { item = listEvents[i]; if (item[0].removeEventListener) { item[0].removeEventListener(item[1], item[2], item[3]) } if (item[1].substring(0, 2) != 'on') { item[1] = 'on' + item[1] }; if (item[0].detachEvent) { item[0].detachEvent(item[1], item[2]) }; item[0][item[1]] = null } } } } ();
var removeEvent = function(obj, type, fn) { if (obj.removeEventListener) { obj.removeEventListener(type, fn, false) } else if (obj.detachEvent) { obj.detachEvent('on' + type, obj[type + fn]); obj[type + fn] = null; obj['e' + type + fn] = null } }


/* 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); }


/* COOKIE HANDLER
----------------------------------------------------*/
var Cookie = {
	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) }
};


/* 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();
			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,'-') };



/* GET ELEMENTS BY CLASS NAME
/* EX: getElementsByClassName(Parent,Tag,Class)
----------------------------------------------------*/
var getElementsByClassName = function(a, b, c) { var d = (b == '*' && a.all) ? a.all : a.getElementsByTagName(b), arrReturnElements = new Array(); c = c.replace(/\-/g, '\\-'); var e = new RegExp('(^|\\s)' + c + '(\\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) };


/* GET ELEMENTS BY ATTRIBUTE
/* EX: getElementsByAttribute(Parent, TagName, AttributeName, AttributeValue)
----------------------------------------------------*/
function getElementsByAttribute(a, b, c, d) {
	var e = (b == '*' && a.all) ? a.all : a.getElementsByTagName(b); var f = new Array(), g = (typeof d != 'undefined') ? new RegExp("(^|\\s)" + d + "(\\s|$)") : null, h, j; for (var i = 0, n = e.length; i < n; i++) { h = e[i]; j = h.getAttribute && h.getAttribute(c); if (typeof j == 'string' && j.length > 0) { if (typeof d == 'undefined' || (g && g.test(j))) { f.push(h) } } }return f;
};


/* DOM HELPER
----------------------------------------------------*/
var DOM = {
	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); elm.parentNode.removeChild(elm) },
	Add: function(elm, target) { var elm = this.Get(elm); var target = this.Get(target); target.appendChild(elm); },
	AddFirst: function(elm, target) { var elm = this.Get(elm); var target = this.Get(target); target.insertBefore(elm, DOM.ChildNodes(target)[0]); },
	AddAfter: function(elm, target) { var parent = target.parentNode; if (DOM.LastChild(parent) == target) { parent.appendChild(elm) } else { parent.insertBefore(elm, DOM.NextSibling(target)) } },
	AddBefore: function(elm, target) { var parent = target.parentNode; parent.insertBefore(elm, target); },
	SetAttribute: function(elm, type, value) {if (typeof elm != 'undefined') {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) { return elm.attributes[q].nodeValue; } } },
	PreviousSibling: function(node) { if (node.previousSibling) { node = node.previousSibling; while (node != null && node.nodeType == 3) { node = node.previousSibling; }; return node; }; return null; },
	NextSibling: function(node) { if (node.nextSibling) { node = node.nextSibling; while (node != null && node.nodeType == 3) { 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(obj) { if (obj) { var children = obj.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 d = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag), arrReturnElements = new Array();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 e = (tag == '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag); var f = new Array(), 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;
}

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;
}

/* 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;

