/*
	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

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 cObj = new UserHttpRequest(vars, commJsGlVar.commScriptFullUrl);
	cObj.curSpecificAction = false;
	for(var i = 0; i < vars.length; i++) {
		switch(vars[i].name) {
			case 'addcomment' : {
				cObj.curSpecificAction = true;
				break;
			}
			case 'sort': {
				if(typeof(commSortOrder)!="undefined")
					commSortOrder = vars[i].value;
				break;
			}
		}
		if(cObj.curSpecificAction === true) break;
	}
	cObj.onSate_Complete = function() {
		if(cObj.httpRequest.responseJS.body) {
			var comLayer = Get_DOM_Node('comment_header_layer');
			if(comLayer && cObj.httpRequest.responseJS.body) {
				comLayer.innerHTML = Trim_Str(cObj.httpRequest.responseJS.body);
				commJsGlVar.commErrorMsg = Boolean(cObj.httpRequest.responseJS.errorMsg);
				commJsGlVar.commID = parseInt(cObj.httpRequest.responseJS.ID);
				initComments(Boolean(!this.curSpecificAction));
			}
		}
	}
	cObj.Do_BeforSend = function() {
		Change_LayerVisibility('imgLoaderStatus_1', true, false);
		Change_LayerVisibility('imgLoaderStatus_2', true, false);
	}
	cObj.Do_After_ExceedTimeout = function() {
		Change_LayerVisibility('imgLoaderStatus_1', false, true);
		Change_LayerVisibility('imgLoaderStatus_2', false, true);
	}
	cObj.Load(true);
		
	return false;
}

function commHttpLoadContainer(obj, i) {
	
	vars = [{name:'p', value:i}, {name:'sort', value:commSortOrder}];
	
	return commHttpLoad(vars);
}

// captcha reloader
function reloadCommCaptcha() {
/*
	captcha_IMG = Get_DOM_Node('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 = Get_DOM_Node('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 = Get_DOM_Node(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.value='';
	else if (obj.value == '') obj.value = text;
}

// form checker
function checkComForm() {
	var cmnt_text = Get_DOM_Node('cmnt_text');
	if (cmnt_text && !Trim_Str(cmnt_text.value)) {
		alert(__REPLIC.enterComment); return false;
	}
	var captcha_msg = Get_DOM_Node('msg_captcha');
	if (captcha_msg && !Trim_Str(captcha_msg.value)) {
		alert(__REPLIC.enterCaptcha); return false;
	}
	return true;
}

// form data collector
function proceedComSubmit() {

	var form_Obj = Get_DOM_Node('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_captcha) {
			serverParams[serverParams.length] = {name:'msg_captcha', value: Trim_Str(form_Obj.msg_captcha.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.newComments) {
			var newCommentsRequest = form_Obj.newComments.checked ? 1 : 0;
			serverParams[serverParams.length] = {name:'newComments', value: newCommentsRequest};
		}
		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 = Get_DOM_Node(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 = Get_DOM_Node('comment_threads');

	if(comLayer) {

		var rel_value = '';

		var tags_a = comLayer.getElementsByTagName('A');
		var tags_a_length = 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 && matching[0]) ? matching[0] : null;
				var commID = (matching && matching[1]) ? matching[1] : null;

				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;
					}
				}
			}
		}

		// 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]);
		}
	}
	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 = __REPLIC.delComment+' '+relID+'?';
			break;
		}
		case 'clear': {
			httpGetValue = 'setdeftext';
			userWarnMessage = __REPLIC.clearComment+' '+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') ? __REPLIC.add : __REPLIC.minimize;
	var arrowImg = (direction == 'up') ? 'ic_expand.gif' : 'ic_collapse.gif';
	var forceOpen = (direction == 'up') ? false : true;
	var forceClose = (direction == 'up') ? true : false;
	
	var cContrL = Get_DOM_Node('cControllerLayer');
	
	if(cContrL) {
		cContrL.innerHTML = 
			'<a href="javascript://" onclick="javascript:changeAddHideText(\''+opposite_derection+'\');hideAllCommForms();" title="'+action+'">'
				+ action + '&nbsp;'
				+ '<img src="'+commJsGlVar.bmImgServer+'a/common/img/'+arrowImg+'" width="12" height="12" alt="'+action+'" title="'+action+'" style="margin-bottom:-1px" />'
			+ '</a>';
	}

	if(direction == 'down') {
		changeLayerVisibility(commJsGlVar.commNullId);
		Change_LayerVisibility('com_header_bottom_corners', false, true);
		Change_LayerVisibility('com_form_top_corners', false, true);
	}
	else if(direction == 'up') { // close comment form only if it opened in null comment place (top)
		var hJsHierarchComObj = initGetCommFormContainerObj();
		var nullLayerObj = Get_DOM_Node(commJsGlVar.commTplIdPrefix + commJsGlVar.commNullId);
		if(nullLayerObj && typeof(hJsHierarchComObj) == 'object' && hJsHierarchComObj.containerID === commJsGlVar.commNullId) {
			changeLayerVisibility(commJsGlVar.commNullId);
		}
		Change_LayerVisibility('com_header_bottom_corners', true, false);
		Change_LayerVisibility('com_form_top_corners', true, false);
	}

	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 = Get_DOM_Node(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 = Get_DOM_Node(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;
				hideAllCommForms();
			}
		}
		else { // insert comment form into given comment ID thread

			if(hJsHierarchComObj.containerID !== null) { // form is opened. close it first

				var xPrevLayerObj = Get_DOM_Node(commJsGlVar.commTplIdPrefix + hJsHierarchComObj.containerID);

				if(xPrevLayerObj) {
					hJsHierarchComObj.node = DOM.cutNodeFirstChild(xPrevLayerObj);
					hJsHierarchComObj.containerID = null;
				}
			}

			DOM.appendNode(xLayerObj, hJsHierarchComObj.modifyCommFormNode(commID));
			hJsHierarchComObj.containerID = commID;
		}

		// close null comment form and change link text
		if (commID != commJsGlVar.commNullId) {
			changeAddHideText('up');
		}

	}

	return false;
}


function answerCom(answerID){
	
	/*if need to open show form by id - showId */
	
	if(document.getElementById('answ_'+answerID)){
		var oldStyle = document.getElementById('answ_'+answerID).style.display;
		newStyle = oldStyle=='block'? "none" : "block";
		hideAllCommForms();
		document.getElementById('answ_'+answerID).style.display=newStyle;
	}
}


/* hide all comments form */
function hideAllCommForms(){
	var clasObj = getElementsByClassName('comment_header_layer' ,'insideform'); 
	for(i=0; i< clasObj.length; i++){
		clasObj[i].style.display="none";
	}
}

function getElementsByClassName(id,clsName){
  var blockID=document.getElementById(id);
  var aelem=[];
  oaelem=blockID.getElementsByTagName("*");
  for(var i=0;i<oaelem.length;i++){
    if (oaelem[i].className == clsName ){
      aelem[aelem.length]=oaelem[i];
    }
  }
  return aelem;
}

function comment_addsmile(smile) 
{
	try
    {
		var cmnt_text = Get_DOM_Node('cmnt_text');
		cmnt_text.value += smile;
		cmnt_text.focus();

	}catch (e){;}
}

