/*
+----------------------------------------------------------
|   (SnS) AJAX Fast Reply v2 for IP.Board 2.3
|   =======================================================
|   (С) 2007 Олег «Sannis» Ефимов
|   http://sannis.ru
|   http://ibresource.ru/forums/index.php?showuser=36662
|   http://forum.sysman.ru/index.php?showuser=3739
|   =======================================================
|   Some code (C) 2005 Richard Heyes
|   http://www.phpguru.org/
+----------------------------------------------------------
*/

var afr_timeout_moderate = 6000;
var afr_timeout_message = 4000;

function sns_afr_check_use_afr_checkbox()
{
	var use_afr = 1;
	
	if ( my_getcookie('dont_use_afr') == '1' )
	{
		use_afr = 0;
	}
	
	if ( !use_enhanced_js )
	{
		use_afr = 0;
	}
	
	document.forms['REPLIER'].elements['use_afr'].checked = use_afr ? 'yes' : '';
}

function sns_afr_post()
{
	sns_afr_buttons_lock();
	
	// Hide previous message
	sns_afr_show_msg( afr_lang['posting'], 'afr-msg' );
	$('sns-afr-msg').scrollIntoView();
	
	//----------------------------------
	// Using fancy js?
	//----------------------------------

	if ( !use_enhanced_js )
	{
		sns_afr_hide_msg();
		sns_afr_buttons_unlock();
		return true;
	}
	
	//----------------------------------
	// Don't using AJAX fast reply?
	//----------------------------------
	
	var dont_use_afr = document.forms['REPLIER'].elements['use_afr'].checked ? false : '1';
	
	if( dont_use_afr )
	{
		my_setcookie('dont_use_afr', '1');
		sns_afr_hide_msg();
		sns_afr_buttons_unlock();
		return true;
	}
	else
	{
		my_setcookie('dont_use_afr', '');
	}
	
	//----------------------------------
	// Make data for request
	//----------------------------------

	var url    = ipb_var_base_url+'act=xmlout&do=sns-fast-reply-post';
	var fields = new Array();

	fields['act']       = 'xmlout';
	fields['do']        = 'sns-fast-reply-post';
	fields['f']         = ipb_input_f;
	fields['t']         = ipb_input_t;
	fields['st']        = ipb_var_st;
	fields['auth_key']  = ipb_md5_check;

	fields['Post']      = document.forms['REPLIER'].Post.value;

	try{
		fields['UserName'] = document.forms['REPLIER'].UserName.value;
	}catch(e){};
	
	try{
		fields['enabletrack'] = document.forms['REPLIER'].elements['enabletrack'].checked ? 'yes' : '';
	}catch(e){};
	fields['enableemo']   = document.forms['REPLIER'].elements['enableemo'].checked ? 'yes' : '';
	fields['enablesig']   = document.forms['REPLIER'].elements['enablesig'].checked ? 'yes' : '';
	
	//----------------------------------
	// Request onready handler
	//----------------------------------
	
	do_request_function = function()
	{
		if (!xmlobj.readystate_ready_and_ok())
		{
			sns_afr_show_msg( afr_lang['posting'], 'afr-msg' );
			return;
		}
		
		sns_afr_hide_msg();

		var ret_str = xmlobj.xmlhandler.responseText;

		if ( ret_str == 'moderate' )
		{
			sns_afr_show_msg(afr_lang['moderate'], 'afr-ok');
			$('sns-afr-msg').scrollIntoView();
			sns_afr_hide_msg(afr_timeout_moderate);
			
			sns_afr_buttons_unlock();
			document.forms['REPLIER'].Post.value = '';
			ShowHide('qr_open', 'qr_closed');
		}
		else if ( ret_str == 'show_form' || ret_str == 'error' )
		{
			sns_afr_buttons_unlock();
			
			document.forms['REPLIER'].submit.onclick = '';
			document.forms['REPLIER'].submit.click();
			setTimeout("document.forms['REPLIER'].submit.click();", 100);
			
			return;
		}
		else if( ret_str.substr(0, 6) == 'error#' )
		{
			sns_afr_show_error(ret_str);
			
			sns_afr_buttons_unlock();
		}
		else if( ret_str.substr(0, 6) == 'merge#' )
		{
			sns_afr_buttons_unlock();
			
			if( sns_afr_update_merged_post(ret_str) )
			{
				document.forms['REPLIER'].Post.value = '';
				ShowHide('qr_open', 'qr_closed');
			}
			else
			{
				document.forms['REPLIER'].Post.value = '';
				ShowHide('qr_open', 'qr_closed');
				
				sns_afr_get();
			}
		}
		else
		{
			sns_afr_buttons_unlock();
			
			if( parseInt(ret_str) > 0 )
			{
				document.forms['REPLIER'].Post.value = '';
				ShowHide('qr_open', 'qr_closed');
				
				sns_afr_get();
			}
			else
			{
				locationjump('showtopic=' + document.forms['REPLIER'].t.value + '&view=getnewpost');
			}
		}
	}

	xmlobj = new ajax_request();
	xmlobj.onreadystatechange(do_request_function);
	var xmlreturn = xmlobj.process(url, 'POST', xmlobj.format_for_post(fields));

	return false;
}

function sns_afr_get()
{
	sns_afr_buttons_lock();
	
	// Hide previous message
	sns_afr_show_msg( afr_lang['get_new'], 'afr-msg' );
	
	//----------------------------------
	// Using fancy js?
	//----------------------------------

	if ( !use_enhanced_js )
	{
		sns_afr_hide_msg();
		sns_afr_buttons_unlock();
		return true;
	}

	//----------------------------------
	// Make data for request
	//----------------------------------

	var url = ipb_var_base_url + 'act=xmlout&do=sns-fast-reply-get';
	var fields = new Array();

	fields['act']       = 'xmlout';
	fields['do']        = 'sns-fast-reply-get';
	fields['f']         = document.forms['REPLIER'].f.value;
	fields['t']         = document.forms['REPLIER'].t.value;
	fields['sns_last_topic_view'] = document.forms['REPLIER'].elements['sns_last_topic_view'].value;
	fields['auth_key']  = document.forms['REPLIER'].auth_key.value;
	
	//----------------------------------
	// Request onready handler
	//----------------------------------
	
	do_request_function = function()
	{
		if (!xmlobj.readystate_ready_and_ok())
		{
			sns_afr_show_msg( afr_lang['get_new'], 'afr-msg' );
			return;
		}
		
		sns_afr_hide_msg();
		
		var ret_str = xmlobj.xmlhandler.responseText;
		
		if ( ret_str == 'error' )
		{
			sns_afr_buttons_unlock();
			return
		}
		else if( ret_str == 'no_new_posts' )
		{
			sns_afr_show_msg(afr_lang['no_new_posts'], 'afr-ok');
			sns_afr_hide_msg(afr_timeout_message);
			
			sns_afr_buttons_unlock();
		}
		else if( ret_str.substr(0,6) == 'error#' )
		{
			sns_afr_show_error(ret_str);
			
			sns_afr_buttons_unlock();
		}
		else
		{
			// Unconvert data
			var ret_arr = PHP_Unserialize(ret_str);

			// Show new posts
			var afr_div = $('sns-afr-posts');
			if(afr_div)
			{
				var html = '';
				for( var pid in ret_arr['html'] )
				{
					if( !$('post-'+pid) )
					{
						html += ret_arr['html'][pid];
					}
				}
				afr_div.innerHTML += html;
				ajax_request.prototype.execute_javascript(html);
				if( ret_arr['js'] ) { try{eval(ret_arr['js']);}catch(e){} }
			}
			else
			{
				alert('Ошибка в скине. Сообщите об этот администратору форума.');
			}
			
			// Scroll to first unread post
			topic_scroll_to_post(ret_arr['pid']);
			
			// Show success message
			sns_afr_show_msg(afr_lang['get_success'], 'afr-ok');
			sns_afr_hide_msg(afr_timeout_message);
			
			// Unlock buttons
			sns_afr_buttons_unlock();
			
			// Update members posts count
			if( ret_arr['posts_count'] )
			{
				var spans = document.getElementsByTagName('span');
				
				for( var i in ret_arr['posts_count'] )
				{
					for (var j = 0; j < spans.length; j++)
					{
						if ( spans[j].id == 'ajaxpostcount-'+i )
						{
							
							spans[j].innerHTML = ret_arr['posts_count'][i];
						}
					}
				}	
			}
			
			// Set topic read cookie if needed
			if ( ret_arr['topicsread'] )
			{
				my_setcookie('topicsread', escape(ret_arr['topicsread']), -1 );
			}
			
			// Update topic last view GMT time
			document.forms['REPLIER'].elements['sns_last_topic_view'].value = ret_arr['last_topic_view'];
			
			// (SnS) SoftwareManiacs highlighter
			try{initHighlighting();}catch(e){};
			// (SnS) SoftwareManiacs highlighter [E]
			// (SnS) AJAX Topic tip
			try{ajax_topic_tip_check_all_links();}catch(e){};
			// (SnS) AJAX Topic tip [E]
		}		
	}
	
	xmlobj = new ajax_request();
	xmlobj.onreadystatechange(do_request_function);
	var xmlreturn = xmlobj.process(url, 'POST', xmlobj.format_for_post(fields));

	return false;
}

function sns_afr_update_merged_post(ret_str)
{
	ret_str = ret_str.substr(6, ret_str.length-6);
	
	var pos  = ret_str.indexOf('#');
	var pid  = ret_str.substr(0, pos);
	var post = ret_str.substr(pos + 1, ret_str.length - pos - 1);

	if( !$('post-' + pid) )
	{
		return false;
	}
	
	$('post-' + pid).innerHTML = post;
	ajax_request.prototype.execute_javascript(post);
	topic_scroll_to_post(pid);
	
	sns_afr_show_msg(afr_lang['merge_success'], 'afr-ok');
	sns_afr_hide_msg(afr_timeout_message);
	
	// (SnS) SoftwareManiacs highlighter
	try{initHighlighting();}catch(e){};
	// (SnS) SoftwareManiacs highlighter [E]
	// (SnS) AJAX Topic tip
	try{ajax_topic_tip_check_all_links();}catch(e){};
	// (SnS) AJAX Topic tip [E]
	
	return true;
}

function $(elementid)
{
    return document.getElementById(elementid);
}

var afr_msg_hide_timer = false;

function sns_afr_show_msg(msg_html, css_class, scroll)
{
	clearTimeout(afr_msg_hide_timer);
	
	obj = $('sns-afr-msg');
	obj.className = css_class;
	obj.innerHTML = msg_html;
	obj.style.display = '';
} 

function sns_afr_hide_msg(time)
{
	if( time )
	{
		afr_msg_hide_timer = setTimeout("sns_afr_hide_msg();", time);
	}
	else
	{
		clearTimeout(afr_msg_hide_timer);
		$('sns-afr-msg').style.display = 'none';
	}
} 

function sns_afr_show_error(txt)
{
	txt = txt.substr(6, txt.length - 6);
	
	sns_afr_show_msg(txt, 'afr-error', 1);
}

function sns_afr_buttons_lock()
{
	document.forms['REPLIER'].submit.disabled = true;
	try{document.forms['search'].sns_ajax_get_new.disabled = true;}catch(e){}
}

function sns_afr_buttons_unlock()
{
	document.forms['REPLIER'].submit.disabled = false;
	try{document.forms['search'].sns_ajax_get_new.disabled = false;}catch(e){}
}

/**
* This file is part of the PHP_Unserialize package (http://www.phpguru.org/)
*
* PHP_Unserialize 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 2 of the License, or
* (at your option) any later version.
*
* PHP_Unserialize 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.
*
* You should have received a copy of the GNU General Public License
* along with PHP_Unserialize; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
* © Copyright 2005 Richard Heyes
*   http://www.phpguru.org/
*/

/**
    * Unserializes a PHP serialized data type. Currently handles:
    *  o Strings
    *  o Integers
    *  o Doubles
    *  o Arrays
    *  o Booleans
    *  o NULL
    *  o Objects
    * 
    * alert()s will be thrown if the function is passed something it
    * can't handle or incorrect data.
    *
    * @param  string input The serialized PHP data
    * @return mixed        The resulting datatype
    */
function PHP_Unserialize(input)
{
	var result = PHP_Unserialize_(input);
	return result[0];
}


/**
    * Function which performs the actual unserializing
    *
    * @param string input Input to parse
    */
function PHP_Unserialize_(input)
{
	var length = 0;
	
	switch (input.charAt(0)) {
		/**
		* Array
		*/
		case 'a':
			length = PHP_Unserialize_GetLength(input);
			input  = input.substr(String(length).length + 4);

			var arr   = new Array();
			var key   = null;
			var value = null;

			for (var i=0; i<length; ++i) {
				key   = PHP_Unserialize_(input);
				input = key[1];

				value = PHP_Unserialize_(input);
				input = value[1];

				arr[key[0]] = value[0];
			}

			input = input.substr(1);
			return [arr, input];
			break;
		
		/**
		* Objects
		*/
		case 'O':
			length = PHP_Unserialize_GetLength(input);
			var classname = String(input.substr(String(length).length + 4, length));
			
			input  = input.substr(String(length).length + 6 + length);
			var numProperties = Number(input.substring(0, input.indexOf(':')))
			input = input.substr(String(numProperties).length + 2);

			var obj      = new Object();
			var property = null;
			var value    = null;

			for (var i=0; i<numProperties; ++i) {
				key   = PHP_Unserialize_(input);
				input = key[1];
				
				// Handle private/protected
				key[0] = key[0].replace(new RegExp('^\x00' + classname + '\x00'), '');
				key[0] = key[0].replace(new RegExp('^\x00\\*\x00'), '');

				value = PHP_Unserialize_(input);
				input = value[1];

				obj[key[0]] = value[0];
			}

			input = input.substr(1);
			return [obj, input];
			break;

		/**
		* Strings
		*/
		case 's':
			length = PHP_Unserialize_GetLength(input);
			return [String(input.substr(String(length).length + 4, length)), input.substr(String(length).length + 6 + length)];
			break;

		/**
		* Integers and doubles
		*/
		case 'i':
		case 'd':
			var num = Number(input.substring(2, input.indexOf(';')));
			return [num, input.substr(String(num).length + 3)];
			break;
		
		/**
		* Booleans
		*/
		case 'b':
			var bool = (input.substr(2, 1) == 1);
			return [bool, input.substr(4)];
			break;
		
		/**
		* Null
		*/
		case 'N':
			return [null, input.substr(2)];
			break;

		/**
		* Unsupported
		*/
		case 'o':
		case 'r':
		case 'C':
		case 'R':
		case 'U':
			alert('Error: Unsupported PHP data type found!');

		/**
		* Error
		*/
		default:
			return [null, null];
			break;
	}
}
    

/**
    * Returns length of strings/arrays etc
    *
    * @param string input Input to parse
    */
function PHP_Unserialize_GetLength(input)
{
	input = input.substring(2);
	var length = Number(input.substr(0, input.indexOf(':')));
	return length;
}