//-----------------------------------------------------------------------------
//    mwForum - Web-based discussion forum
//    Copyright (c) 1999-2009 Markus Wichitill
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//-----------------------------------------------------------------------------

var mwf = {};

mwf.initParameters = function() {
	mwf.p = {};
	var dlElem = document.getElementById('params');
	var dtElems = dlElem.getElementsByTagName('dt');
	var ddElems = dlElem.getElementsByTagName('dd');
	for (var i = 0; i < dtElems.length; i++) {
		var name = dtElems[i].textContent || dtElems[i].innerText;
		var value = ddElems[i].textContent || ddElems[i].innerText || "";
		mwf.p[name] = value.replace(/^\s+|\s+$/g, '');
	}
};

mwf.onLoad = function() {
	mwf.initParameters();
	var script = mwf.p.env_script;
	if (mwf.p.cfg_boardJumpList) mwf.initBoardList();
	if (mwf.p.tagButtons) mwf.initTagButtons();
	if (script == 'forum_show') mwf.initCategoryHiding();
	else if (script == 'topic_show') {
		mwf.initBranchHiding();
		mwf.initPostHiding();
		if (mwf.p.scrollToPost == 1) mwf.scrollToPost();
	}
	if (script == 'user_info' && mwf.p.location) mwf.initGoogleMaps();
	mwf.setFocus();
};

if (window.addEventListener) window.addEventListener('load', mwf.onLoad, false);
else if (window.attachEvent) window.attachEvent('onload', mwf.onLoad);

//-----------------------------------------------------------------------------

mwf.initBoardList = function() {
	var elem = document.getElementsByName('bid')[0];
	elem.onchange = function() {
		var ext = mwf.p.m_ext;
		var sid = mwf.p.m_sessionId ? "sid=" + mwf.p.m_sessionId : "";
		var id = elem.options[elem.selectedIndex].value;
		if (id.indexOf('cid') == 0) window.location = 'forum_show' + ext + "?" + sid + "#" + id;
		else if (id == 0) window.location = 'forum_show' + ext + "?" + sid;
		else window.location = 'board_show' + ext + "?" + "bid=" + id + ";" + sid;
	};
};

//-----------------------------------------------------------------------------

mwf.setFocus = function() {
	var focusElems = getElementsByClassName('fcs');
	if (focusElems.length) focusElems[0].focus();
	else {
		var inputElems = document.getElementsByTagName('input');
		for (var i = 0; i < inputElems.length; i++) {
			var elem = inputElems[i];
			if (elem.type != 'hidden' && elem.type != 'submit' && !elem.className.match(/\bnfc\b/)) {
				var inputElem = elem;
				break;
			}
		}
		if (inputElem) inputElem.focus();
		else {
			var textaElem = document.getElementsByTagName('textarea')[0];
			if (textaElem) textaElem.focus();
		}
	}
};

//-----------------------------------------------------------------------------

mwf.saveCategState = function() {
	mwf.categState = "";
	var elems = document.getElementsByTagName('tbody');
	for (var i = 0; i < elems.length; i++) {
		var elem = elems[i];
		if (elem.id.indexOf('cat') == 0) {
			var state = elem.style.display == 'none' ? 0 : 1;
			mwf.categState += elem.id.substr(3) + ":" + state + "-";
		}
	}
	var domain = mwf.p.cfg_cookieDomain ? "domain=" + mwf.p.cfg_cookieDomain + "; " : "";
	var path = mwf.p.cfg_cookiePath ? "path=" + mwf.p.cfg_cookiePath + "; "
		: "path=" + mwf.p.env_scriptUrlPath + "; ";
	document.cookie = mwf.p.cfg_cookiePrefix + "catstat=" + mwf.categState + "; "
		+ domain + path + "expires=Mon, 16-Mar-2020 00:00:00 GMT";
};

mwf.toggleCategState = function(categId) {
	var catElem = document.getElementById('cat' + categId);
	var tglElem = document.getElementById('tgl' + categId);
	if (!catElem || !tglElem) return;
	if (catElem.style.display != 'none') {
		catElem.style.display = 'none';
		tglElem.className = "sic sic_nav_plus";
		tglElem.title = mwf.p.lng_frmCtgExpand;
		tglElem.alt = "+";
	}
	else {
		catElem.style.display = '';
		tglElem.className = "sic sic_nav_minus";
		tglElem.title = mwf.p.lng_frmCtgCollap;
		tglElem.alt = "-";
	}
};

mwf.setCategState = function() {
	var match = document.cookie.match(new RegExp(mwf.p.cfg_cookiePrefix + "catstat=([^;]+)"));
	if (match) mwf.categState = match[1];
	var elems = document.getElementsByTagName('tbody');
	for (var i = 0; i < elems.length; i++) {
		var elem = elems[i];
		if (elem.id.indexOf('cat') == 0) {
			var categId = elem.id.substr(3);
			match = mwf.categState.match(new RegExp("\\b" + categId + ":(1|0)"));
			var collapsed = false;
			if (match) collapsed = match[1] == 0;
			else if (mwf.p.cfg_collapseCategs == 1 && elem.id != 'cat' + mwf.p.cfg_collapseCategs)
				collapsed = true;
			if (collapsed) mwf.toggleCategState(categId);
		}
	}
};

mwf.initCategoryHiding = function() {
	mwf.categState = "";
	mwf.setCategState();
	var elems = document.getElementsByTagName('img');
	for (var i = 0; i < elems.length; i++) { (function(i) {
		var elem = elems[i];
		if (elem.id.indexOf('tgl') == 0)  {
			var categId = elem.id.substr(3);
			elem.onclick = function() {
				mwf.toggleCategState(categId);
				mwf.saveCategState()
			};
		}
	})(i) }
};

//-----------------------------------------------------------------------------

mwf.insertTags = function(tag1, tag2) {
	var txta = getElementsByClassName('tgi')[0];
	txta.focus();
	if (document.selection) {
		var range = document.selection.createRange();
		var sel = range.text;
		range.text = tag2
			? "[" + tag1 + "]" + sel + "[/" + tag2 + "]"
			: ":" + tag1 + ":";
		range = document.selection.createRange();
		if (tag2 && !sel.length) range.move('character', -tag2.length - 3);
		else if (tag2) range.move('character', tag1.length + 2 + sel.length + tag2.length + 3);
		range.select();
	}
	else if (typeof txta.selectionStart != 'undefined') {
		var scroll = txta.scrollTop;
		var start  = txta.selectionStart;
		var end    = txta.selectionEnd;
		var before = txta.value.substring(0, start);
		var sel    = txta.value.substring(start, end);
		var after  = txta.value.substring(end, txta.textLength);
		txta.value = tag2
			? before + "[" + tag1 + "]" + sel + "[/" + tag2 + "]" + after
			: before + ":" + tag1 + ":" + after;
		var caret = sel.length == 0
			? start + tag1.length + 2
			: start + tag1.length + 2 + sel.length + tag2.length + 3;
		txta.selectionStart = caret;
		txta.selectionEnd = caret;
		txta.scrollTop = scroll;
	}
};

mwf.initTagButtons = function() {
	var elems = getElementsByClassName('tbt');
	for (var i = 0; i < elems.length; i++) { (function(i) {
		var elem = elems[i];
		var match = elem.id.match(/tbt_([a-z]+)/)
		var tag1 = match[1];
		var tag2 = tag1;
		if (elem.className.match(/\btbt_p\b/)) tag1 += "=";
		match = elem.id.match(/\btbt_[a-z]+_([a-z]+)/);
		if (match) tag1 += "=" + match[1];
		elem.onclick = function() { mwf.insertTags(tag1, tag2) };
		elem.onfocus = function() { getElementsByClassName('tgi')[0].focus() };
	})(i) }
	elems = getElementsByClassName('tbc');
	for (var i = 0; i < elems.length; i++) { (function(i) {
		var elem = elems[i];
		var tag = elem.id.substr(4);
		elem.onclick = function() { mwf.insertTags(tag) };
	})(i) }
};

//-----------------------------------------------------------------------------

mwf.scrollToPost = function() {
	var elem = document.getElementById('pid' + mwf.p.scrollPostId);
	if (elem) window.scrollTo(0, elem.offsetTop - 5);
};

//-----------------------------------------------------------------------------

mwf.toggleBranch = function(postId) {
	var brnElem = document.getElementById('brn' + postId);
	var tglElem = document.getElementById('tgl' + postId);
	if (!brnElem || !tglElem) return;
	if (brnElem.style.display != 'none') {
		brnElem.style.display = 'none';
		tglElem.className = 'sic clk sic_nav_plus';
		tglElem.title = mwf.p.lng_tpcBrnExpand;
		tglElem.alt = '+';
	}
	else {
		brnElem.style.display = '';
		tglElem.className = 'sic clk sic_nav_minus';
		tglElem.title = mwf.p.lng_tpcBrnCollap;
		tglElem.alt = '-';
	}
};

mwf.expandBranches = function() {
	var elems = document.getElementsByTagName('div');
	for (var i = 0; i < elems.length; i++) {
		if (elems[i].id.indexOf('brn') == 0) elems[i].style.display = '';
	}
	elems = document.getElementsByTagName('img');
	for (var i = 0; i < elems.length; i++) {
		var elem = elems[i];
		if (elem.id.indexOf('tgl') == 0) {
			elem.className = 'sic sic_nav_minus';
			elem.title = mwf.p.lng_tpcBrnCollap;
			elem.alt = '-';
		}
	}
};

mwf.initBranchHiding = function() {
	var elems = document.getElementsByTagName('img');
	for (var i = 0; i < elems.length; i++) { (function(i) {
		var elem = elems[i];
		if (elem.id.indexOf('tgl') == 0) {
			var postId = elem.id.substr(3);
			elem.onclick = function() { mwf.toggleBranch(postId) };
			elem.ondblclick = mwf.expandBranches;
		}
	})(i) }
};

//-----------------------------------------------------------------------------

mwf.revealPost = function(postId) {
	var elem = document.getElementById('pid' + postId);
	var elems = getElementsByClassName('ccl', 'div', elem);
	for (var i = 0; i < elems.length; i++) elems[i].style.display = 'block';
	getElementsByClassName('bcl', 'div', elem)[0].style.display = 'block';
};

mwf.initPostHiding = function() {
	var pstElems = getElementsByClassName('frm pst ign');
	for (var i = 0; i < pstElems.length; i++) { (function(i) {
		var pstElem = pstElems[i];
		var postId = pstElems[i].id.substr(3);
		pstElem.onclick = function() { mwf.revealPost(postId) };
	})(i) }
};

//-----------------------------------------------------------------------------

mwf.initGoogleMaps = function() {
	var geocoder = new google.maps.Geocoder();
	geocoder.geocode(
		{ address: mwf.p.location, country: mwf.p.countryCode, language: mwf.p.uaLangCode },
		function(results, status) {
			var elem = document.getElementById('map');
			if (status != google.maps.GeocoderStatus.OK) {
				elem.parentNode.parentNode.style.display = 'none';
				return;
			}
			mwf.viewport = results[0].geometry.viewport;
			var resultNum = results.length;
			if (results[0].formatted_address) {
				var tn = document.createTextNode(results[0].formatted_address);
				if (resultNum > 1) tn.data += " (" + (resultNum - 1) + " " + mwf.p.lng_uifMapOthrMt + ")";
				document.getElementById('loc').appendChild(tn);
			}
			mwf.map = new google.maps.Map(elem, { mapTypeId: google.maps.MapTypeId.ROADMAP,
				center: results[0].geometry.location, zoom: 4 });
			var markers = new Array();
			for (var i = 0; i < resultNum; i++) {
				markers.push(new google.maps.Marker({ map: mwf.map, position: results[i].geometry.location,
					title: results[i].formatted_address + " [" + results[i].geometry.location_type + "]" }));
			}
		}
	);
	document.getElementById('loc').onclick = function() { mwf.map.fitBounds(mwf.viewport) };
};

//-----------------------------------------------------------------------------
// getElementsByClassName (c) Robert Nyman, http://www.robertnyman.com
// Code/licensing: http://code.google.com/p/getelementsbyclassname/

var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};
