/*
	Hierarchic comments. JavaScript implementation part.
	Property: bigmir)net
	Author: Alexey Karpinskiy (alex_kiy@bigmir.net)
	Release date: november 2007
*/

// Global structure with settings. Included in source code to preserve compatibility and save js module integrity
// May be redeclared in comment's html source.
// Can be cutted off here and simply placed in source html output in script tags

function _(id) {
    return document.getElementById(id) ? document.getElementById(id) : null;
}

function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}

function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}

function Find_AbsoluteDocObjCoords(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return [curleft, curtop];
}
function Find_AbsoluteDocObjCoord_X(obj) {
	var coords = Find_AbsoluteDocObjCoords(obj);
	return coords[0];
}
function Find_AbsoluteDocObjCoord_Y(obj) {
	var coords = Find_AbsoluteDocObjCoords(obj);
	return coords[1];
}

function Trim_Str (str) {
	if (window.RegExp && str) {
		str = str.replace(/^s+|\s+$/g, '');
	}
	return str;
}

var isBrowsMSIE = document.attachEvent != null;
var isBrowsGecko = !document.attachEvent && document.addEventListener;

function Get_ElementCurrentStyle(element, CssStyleProperty) {
	if (!element) return false;
	if (element.currentStyle) {
		return element.currentStyle[CssToJavascriptStyle(CssStyleProperty)];
	}else if (window.getComputedStyle) {
		var compStyle = window.getComputedStyle(element, '');
		return compStyle.getPropertyValue(CssStyleProperty);
	}else {
		return '';
	}
}

function CssToJavascriptStyle(CssProperty) {
	var stringArray = CssProperty.toLowerCase().split('-');
	if (stringArray.length == 1) {
		return stringArray[0];
	}
	var ret = (CssProperty.indexOf("-") == 0) ? stringArray[0].charAt(0).toUpperCase() + stringArray[0].substring(1) : stringArray[0];
	for (var i = 1; i < stringArray.length; i++) {
		var s = stringArray[i];
		ret += s.charAt(0).toUpperCase() + s.substring(1);
	}
	return ret;
};

function browseIt() {
	this.ver = navigator.appVersion.toLowerCase();
	this.agent = navigator.userAgent.toLowerCase();
	this.vendor = (navigator.vendor) ? navigator.vendor.toLowerCase() : '';
	this.dom = document.getElementById ? 1 : 0;
	this.opera = (this.agent.indexOf("opera")>-1 && document.getElementById) ? 1 : 0;
	this.opera7 = (this.opera && parseInt(navigator.appVersion) >= 7) ? 1 : 0;
	this.safari = (this.agent.indexOf("applewebkit")>-1 || this.vendor.indexOf("apple")>-1) ? 1 : 0;
	this.ie = (/*this.ver.indexOf("msie")>-1 && */this.dom &&  ('undefined' !== typeof window.onbeforeunload) && !this.safari && !this.opera) ? 1 : 0;
	this.macOS = (this.agent.indexOf("mac") > -1) ? 1 : 0;
	this.mac = (this.macOS && parseInt(this.ver) >= 7) ? 1 : 0;
	this.moz = (this.agent.indexOf("gecko")>-1 && !this.safari) ? 1 : 0;
	this.ns6 = (this.dom && this.agent.indexOf("netscape")>-1 && parseInt(this.ver) >= 5) ? 1 : 0;
	this.b = (this.ie || this.ns6 || this.opera7 || this.mac || this.moz || this.safari || this.dom);
	return this;
}

function Attach_EventListener(element, action, callback, capture) {
	capture = (capture) ? true : false;
	element = (element) ? element : document;
	if (isBrowsMSIE && element.attachEvent) {
		element.attachEvent("on"+action, callback);
	}
	else if (isBrowsGecko && element.addEventListener) {
		element.addEventListener(action, callback, capture);
	}
}

function Change_LayerVisibility(id, forceOpen, forceClose) {
	var layer = _(id); if (!layer) return false;

	if ((Check_LayerVisibility(layer) === 'hidden' && !forceClose) || forceOpen) {
		//layer.style.visibility = 'visible';
		layer.style.display = 'block';
	}
	else if ((Check_LayerVisibility(layer) === 'visible' && !forceOpen) || forceClose) {
		//layer.style.visibility = 'hidden';
		layer.style.display = 'none';
	}
	return false;
}

function Check_LayerVisibility(layer) {

	if (typeof(layer) == 'string'){layer = _(layer);}
	else if(typeof(layer) != 'object') {return 'undef';}

	//if (layer.style.visibility == '') layer.style.visibility = Get_ElementCurrentStyle(layer, 'visibility');
	if (layer.style.display == '') layer.style.display = Get_ElementCurrentStyle(layer, 'display');

	//if (layer.style.visibility == 'hidden' && layer.style.display == 'none') {
	if (layer.style.display == 'none') {
		return 'hidden';
	}
	//else if (layer.style.visibility == 'visible' && layer.style.display == 'block') {
	else if (layer.style.display == 'block') {
		return 'visible';
	}
	return 'undef';
}

if(typeof(window.commJsGlVar) == 'undefined') {

	window.commJsGlVar = {
		bmImgServer : 'http://i.bigmir.net/',
		commCaptchaWebPath : 'http://main.bigmir.net/include/c_captcha.inc.php',
		commScriptFullUrl : window.location.protocol + '//' + window.location.host + window.location.pathname + '/',
		commTplIdPrefix : 'CMNT_ID_',
		commTplAnchorPrefix : 'CMNT_ANCHOR_',
		commNullId : 0,
		commID : 0,
		commErrorMsg : false
	};
}

// --------------- Ajax loader ------

function commHttpLoad(vars) {
	if (vars) vars[vars.length] = {'name':'ajaxify', 'value':'1'};
	var initCom = false;
	var q = '';
	for (k in vars) {
		if(vars[k]['name'] == 'addcomment') {
			initCom = true;
		}
		q += vars[k]['name'] + '=' + vars[k]['value'] + '&';
	}
	q += 'sended';
	Change_LayerVisibility('send_btns', false, true);
	Change_LayerVisibility('send_indicator', true, false);
	Change_LayerVisibility('imgLoaderStatus_1', true, false);
	Change_LayerVisibility('imgLoaderStatus_2', true, false);
	function wrupper(res) {
		eval("var responsedata = (" + res.responseText + ")");
		$('comment_header_layer').innerHTML = responsedata.body;
		commJsGlVar.commErrorMsg = Boolean(responsedata.errorMsg);
		commJsGlVar.commID = parseInt(responsedata.ID);
		initComments(Boolean(!initCom));
		Change_LayerVisibility('send_btns', true, false);
		Change_LayerVisibility('send_indicator', false, true);
		Change_LayerVisibility('imgLoaderStatus_1', false, true);
		Change_LayerVisibility('imgLoaderStatus_2', false, true);
	}
	new ajax(commJsGlVar.commScriptFullUrl, {postBody: q, onComplete: wrupper});
	return false;
}

// captcha reloader
function reloadCommCaptcha() {
/*
	captcha_IMG = _('captcha_img');
	captcha_IMG.src = commJsGlVar.commCaptchaWebPath + '?' + Math.random();
*/

	var capObj = new UserHttpRequest([{'rand':'', 'value':Math.random()}], commJsGlVar.commCaptchaWebPath);
	capObj.onSate_Complete = function() {

		var captcha_cont = _('captcha_container');

		if(captcha_cont && capObj.httpRequest.responseJS.body) {

			captcha_cont.innerHTML = capObj.httpRequest.responseJS.body;

		}
	}
	capObj.Load(true);
	return false; // should return false
}

// text symbol counter
function limitInputText(input, maxlen, left) {
	inputstr = input.value;
	strlen = inputstr.length;
	if (strlen > maxlen) {
		input.value = inputstr.substring(0, maxlen);
	}
	if (left = _(left)) {
		if (left.tagName == 'INPUT') {
			left.value = maxlen - input.value.length;
		}
		else {
			left.innerHTML = maxlen - input.value.length;
		}
	}
	return true;
}

// clear/update name-field
function clearUNameBoxInput(obj, clear, text) {
	if (clear && (obj.value == text)) obj.select();
	else if (obj.value == '') obj.value = text;
}

// form checker
function checkComForm() {
	var cmnt_text = _('cmnt_text');
	if (cmnt_text && !Trim_Str(cmnt_text.value)) {
		alert('Введите текст комментария'); return false;
	}
	var captcha_msg = _('msg_captch');
	if (captcha_msg && !Trim_Str(captcha_msg.value)) {
		alert('Введите защитный код'); return false;
	}
	return true;
}

// form data collector
function proceedComSubmit() {

	var form_Obj = _('commAddForm');

	if (form_Obj && checkComForm()) {
		var serverParams = new Array(
			{name:'addcomment', value:'true'},
			{name:'cmnt_text', value: encodeURIComponent(Trim_Str(form_Obj.cmnt_text.value))}, // send cyrilic text via JsHttpTransport
			{name:'ID', value: form_Obj.ID.value}
		);
		if(form_Obj.userName) {
			serverParams[serverParams.length] = {name:'userName', value: encodeURIComponent(Trim_Str(form_Obj.userName.value))};
		}
		if(form_Obj.msg_captch) {
			serverParams[serverParams.length] = {name:'msg_captch', value: Trim_Str(form_Obj.msg_captch.value)};
			if(form_Obj.msg_captcha_rndSeq) {
				serverParams[serverParams.length] = {name:'msg_captcha_rndSeq', value: Trim_Str(form_Obj.msg_captcha_rndSeq.value)};
			}
		}
	//	if (form_Obj.ID.value != 0) {
			if(form_Obj.displayModeCurrent) {
				serverParams[serverParams.length] = {name:'display', value:form_Obj.displayModeCurrent.value};
			}
			if(form_Obj.currentPage) {
				serverParams[serverParams.length] = {name:'p', value: form_Obj.currentPage.value};
			}
			if(form_Obj.sortMode) {
				serverParams[serverParams.length] = {name:'sort', value: form_Obj.sortMode.value};
			}
	//	}
		return commHttpLoad(serverParams);
	}
	return false;
}

// move scroll to given object
function adjustScrollPosition(comLayer) {
	if (typeof(comLayer) == 'string') {
		comLayer = _(comLayer);
		//comLayer = document.getElementById(comLayer);
	}
	if(comLayer && typeof(comLayer) == 'object') {
		var coordX = f_scrollLeft();
		var coordY = Find_AbsoluteDocObjCoord_Y(comLayer);
		if(coordY > 0) scrollTo(coordX, coordY);
	}
}

// coment form container and modifier class
function hierarchicComment(){

	this.node = null,

	this.containerID = null, // contains comment's ID with opened form. Otherwise = null.

	this.getFormNode= function() {
		if(this.node != null && this.node.nodeType > 0) {
			var form = this.node.getElementsByTagName('FORM')[0];
			return form;
		}
		else {
			return null;
		}
	},

	this.modifyCommFormNode = function(ID) {

		var form = this.getFormNode();

		if(form) {
			// fix for safari. do not use "for(x in array)" syntax
			if(typeof(form.ID) == 'undefined') {
				for(var i=0; i<form.length; i++) {
					if(form[i].name == 'ID') {
						form[i].value = ID;
						break;
					}
				}
			} else {
				form.ID.value = ID;
			}
		}

		this.initCancelCommentButton(ID); // init cancel button action

		return this.node;
	},

	this.initCancelCommentButton = function(ID) {

		var form = this.getFormNode();

		var formCancelButtom = null;

		if(typeof(form.cancel_comment) == 'undefined') {
			for(var i=0; i<form.length; i++) { // fix for safari
				if(form[i].name == 'cancel_comment') {
					formCancelButton = form[i];
					break;
				}
			}
		}
		else {
			formCancelButton = form.cancel_comment;
		}

		if(formCancelButton !== null) {

			var onclick_action = 'changeLayerVisibility(\''+ID+'\');';

			if(ID == commJsGlVar.commNullId) {
				onclick_action += 'changeAddHideText(\'up\')';
			}

			var br = new Object(); br.ie = 0;
			if(typeof(window.browseIt) != 'undefined') {
				br = new browseIt();
			}

			if(br.ie) {
				DOM.setNodeAttributeValue(formCancelButton, 'onclick', function(){eval(onclick_action)});
			}
			else {
				DOM.setNodeAttributeValue(formCancelButton, 'onclick', onclick_action);
			}
		}

		return false;
	}
}

function attachJsActions() {

	var comLayer = _('comment_threads');

	if(comLayer) {

		var rel_value = '';

		var tags_a = comLayer.getElementsByTagName('A');
		var tags_a_length = tags_a.length;
		
//		alert(tags_a_length);
		
		for(var i=0; i < tags_a_length; i++) {

			if(rel_value = Trim_Str(tags_a[i].rel)) {

				var matching = getRelValueDesc(rel_value);

				var rel_type = matching[0];
				var commID = matching[1];

				switch(rel_type) {

					case 'answer': {
						Attach_EventListener(tags_a[i], 'click', commLinkAnswerCallback);
						commCancelDefaultAction(tags_a[i], rel_type, commID);
						break;
					}
					case 'del': {
						Attach_EventListener(tags_a[i], 'click', commLinkDelClearCallback);
						commCancelDefaultAction(tags_a[i], rel_type, commID);
						break;
					}
					case 'clear': {
						Attach_EventListener(tags_a[i], 'click', commLinkDelClearCallback);
						commCancelDefaultAction(tags_a[i], rel_type, commID);
						break;
					}
                    case 'complain': {
                        Attach_EventListener(tags_a[i], 'click', commLinkDelClearCallback);
                        commCancelDefaultAction(tags_a[i], rel_type, commID);
                        break;
                    }
				}
			}
		}

		// safari fix[remove noscript contents from received html in ajax session]
		var browser = browseIt();
		if(browser.safari) {
			var tags_noscript = comLayer.getElementsByTagName('NOSCRIPT');
			for(var j=0; j < tags_noscript.length; j++) {
				DOM.cutNodeFirstChild(tags_noscript[j]);
			}
		}

	}
}

function commCancelDefaultAction(a_obj, rel_type, commID) {

	// good manner to use cancelEventPropagation but unfortunately it failed
	if(typeof(a_obj) == 'object' && a_obj.href && commID) {
		a_obj.href = 'javascript:// ' + rel_type + ' ' + commID;
	}
	return false;
}


// returns [rel_desc, id]
function getRelValueDesc(rel_value) {

	var matching = [null, null];

	if(rel_value && typeof(rel_value) == 'string') {

		// answer link
		if(matching = rel_value.match(/^comm_answer_(\d+)$/i)) {
			matching[0] = 'answer';
			matching[1] = parseInt(matching[1]);
		}
		// del link
		else if(matching = rel_value.match(/^comm_del_(\d+)$/i)) {
			matching[0] = 'del';
			matching[1] = parseInt(matching[1]);
		}
		// clear link
		else if(matching = rel_value.match(/^comm_clear_(\d+)$/i)) {
			matching[0] = 'clear';
			matching[1] = parseInt(matching[1]);
		}
		//complain link
        else if(matching = rel_value.match(/^comm_complain_(\d+)$/i)) {
            matching[0] = 'complain';
            matching[1] = parseInt(matching[1]);
        }		
		// clear link
		else if(matching = rel_value.match(/^comm_moderate_(\d+)$/i)) {
			matching[0] = 'moderate';
			matching[1] = parseInt(matching[1]);
		}

	}
	return matching;
}

// --- click link callbacks declaration ---

function getEventSrcElement(event) {
	// define source caller object
	event = (event) ? event : window.event;
	return (event.target) ? event.target : event.srcElement;
}

// returns "a"-link relative info [action, id]
function getEventSrcElementRelInfo(event) {

	var element = getEventSrcElement(event);

	var matching = [null, null];

	if(element.rel) matching = getRelValueDesc(element.rel);

	return matching;
}

function commLinkAnswerCallback(event) {

	var relInfo = getEventSrcElementRelInfo(event);
	var relID = relInfo[1];
	return changeLayerVisibility(relID);
}

function commLinkDelClearCallback(event) {

	var relInfo = getEventSrcElementRelInfo(event);

	var relAction = relInfo[0];
	var relID = relInfo[1];

	var httpGetValue = '';
	var userWarnMessage = '';

	switch(relAction) {
		case 'del': {
			httpGetValue = 'delcomment';
			userWarnMessage = 'Удалить комментарий '+relID+'?';
			break;
		}
		case 'clear': {
			httpGetValue = 'setdeftext';
			userWarnMessage = 'Очистить текст комментария '+relID+'?';
			break;
		}
		default: {
			return false;
		}
	}

	if (window.confirm(userWarnMessage)) {

		var hJsHierarchComObj = initGetCommFormContainerObj();

		if(hJsHierarchComObj) {

			var form = hJsHierarchComObj.getFormNode();

			var p = (form.currentPage) ? form.currentPage.value : 0;
			var sorting = (form.sortMode) ? form.sortMode.value : '';

			return commHttpLoad(
				[
					{name: httpGetValue, value: true},
					{name: 'ID', value: relID},
					{name: 'p', value: p},
					{name:'sort', value: sorting}
				]
			);
		}
	}
	else {
		return false;
	}
}

/* hide/show main null-level comment form */
function changeAddHideText(direction) {

	direction = (direction == 'up') ? 'up' : 'down';
	var opposite_derection = (direction == 'up') ? 'down' : 'up';

	var action = (direction == 'up') ? phrase_open_form : phrase_close_form;
	var arrowImg = (direction == 'up') ? 'str_bot_blue.jpg' : 'str_top_blue.jpg';
	var forceOpen = (direction == 'up') ? false : true;
	var forceClose = (direction == 'up') ? true : false;

	var cContrL = _('cControllerLayer');
	if(cContrL) {
		cContrL.innerHTML = 
			'<a href="javascript://" onclick="javascript:changeAddHideText(\''+opposite_derection+'\');" title="'+action+'">'
				+ action + '&nbsp;'
				+ '<img class="vmid" src="'+commJsGlVar.bmImgServer+'/img/comments/'+arrowImg+'" alt="'+action+'" title="'+action+'" />'
			+ '</a>';
	}

	if(direction == 'down') {
		changeLayerVisibility(commJsGlVar.commNullId);
		_('fonthack').style.fontSize = '';
	}
	else if(direction == 'up') { // close comment form only if it opened in null comment place (top)
		var hJsHierarchComObj = initGetCommFormContainerObj();
		var nullLayerObj = _(commJsGlVar.commTplIdPrefix + commJsGlVar.commNullId);
		if(nullLayerObj && typeof(hJsHierarchComObj) == 'object' && hJsHierarchComObj.containerID === commJsGlVar.commNullId) {
			changeLayerVisibility(commJsGlVar.commNullId);
		}
	}

	return false;
}

/* comment page initialization */
function initComments(forceScrollAdjust) {
	attachJsActions();
	initGetCommFormContainerObj(true);

	if(commJsGlVar.commErrorMsg) {
		(commJsGlVar.commID == commJsGlVar.commNullId) ? changeAddHideText('down') : changeLayerVisibility(commJsGlVar.commID);
	}
	else {
		changeAddHideText('up');
	}
	if(forceScrollAdjust === true || commJsGlVar.commErrorMsg) {
		adjustScrollPosition(commJsGlVar.commTplAnchorPrefix + commJsGlVar.commID);
	}
	return false;
}

// creates an "hierarchicComment"-object and init it if necessary
// returns created comm-container object
function initGetCommFormContainerObj(forceInit) {

	if(typeof(window.jsHierarchComObj) == 'undefined') {
		window.jsHierarchComObj = new hierarchicComment();
		forceInit = true;
	}
	if(forceInit) {
		var nullFormContainer = _(commJsGlVar.commTplIdPrefix + commJsGlVar.commNullId);
		if(nullFormContainer) {
			window.jsHierarchComObj.node = DOM.cutNodeFirstChild(nullFormContainer);
			window.jsHierarchComObj.containerID = null;
		}
	}
	return window.jsHierarchComObj;
}

/*
 main form visibility operator
*/
function changeLayerVisibility(commID) {

	var xLayerObj = _(commJsGlVar.commTplIdPrefix + commID);

	var hJsHierarchComObj = initGetCommFormContainerObj();

	if(xLayerObj && typeof(hJsHierarchComObj) == 'object') {

		// close comment form in source place
		if (hJsHierarchComObj.containerID == commID) {
			if(xLayerObj.hasChildNodes()) {
				hJsHierarchComObj.node = DOM.cutNodeFirstChild(xLayerObj);
				hJsHierarchComObj.containerID = null;
			}
			xLayerObj.style.display = "none";
		}
		else { // insert comment form into given comment ID thread

			if(hJsHierarchComObj.containerID !== null) { // form is opened. close it first

				var xPrevLayerObj = _(commJsGlVar.commTplIdPrefix + hJsHierarchComObj.containerID);

				if(xPrevLayerObj) {
					hJsHierarchComObj.node = DOM.cutNodeFirstChild(xPrevLayerObj);
					hJsHierarchComObj.containerID = null;
				}
			}

			DOM.appendNode(xLayerObj, hJsHierarchComObj.modifyCommFormNode(commID));
                        hJsHierarchComObj.containerID = commID;
			_('fonthack').style.fontSize = '1.0em';
			xLayerObj.style.display = "block";
		}

		if (commID != commJsGlVar.commNullId) {
			changeAddHideText('up');
		}

	}

	return false;
}

function showCommentsToThisPage(page) {
	if(!readCookie('showComments') || readCookie('showComments') != page)	{
		createCookie('showComments', page, 5);
		commHttpLoad([{name:'sort', value:'DESC'}]);
	}
}


function switchCommentsPerPage(rowsonpage) {
	if(!readCookie('rowsonpages') || readCookie('rowsonpages') != rowsonpage)	{
		createCookie('rowsonpages', rowsonpage, 5);
		commHttpLoad([{name:'rowsonpages', value:rowsonpage}]);
	}
}

    function chgCaptch() {
        if (_("capimg")) {
            _("capimg").src = '/exec/captcha.php?'+ (new Date()).getTime();
        }
        return false;
    }
