Your IP : 172.28.240.42


Current Path : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/vote/classes/general/
Upload File :
Current File : /var/www/html/clients/old.e-nkama.ru/e-nkama_bitrix/bitrix/modules/vote/classes/general/vote.php

<?
##############################################
# Bitrix Site Manager Forum                  #
# Copyright (c) 2002-2009 Bitrix             #
# http://www.bitrixsoft.com                  #
# mailto:admin@bitrixsoft.com                #
##############################################
IncludeModuleLangFile(__FILE__); 

class CAllVote
{
	function err_mess()
	{
		$module_id = "vote";
		return "<br>Module: ".$module_id."<br>Class: CAllVote<br>File: ".__FILE__;
	}
	
	function CheckFields($ACTION, &$arFields, $ID = 0, $arParams = array())
	{
		global $DB;
		$aMsg = array();
		$ID = intVal($ID);
		$date_start = 0;
		$date_end = 0;
		
		$arVote = array();
		if ($ID > 0):
			$db_res = CVote::GetByID($ID);
			if ($db_res && $res = $db_res->Fetch()):
				$arVote = $res;
			endif;
		endif;
		
		unset($arFields["ID"]);
		if (is_set($arFields, "CHANNEL_ID") || $ACTION == "ADD") 
		{
			$arFields["CHANNEL_ID"] = intVal($arFields["CHANNEL_ID"]);
			if ($arFields["CHANNEL_ID"] <= 0):
				$aMsg[] = array(
					"id" => "CHANNEL_ID", 
					"text" => GetMessage("VOTE_EMPTY_CHANNEL_ID"));
			endif;
		}
		
		if (is_set($arFields, "C_SORT")) { $arFields["C_SORT"] = intVal($arFields["C_SORT"]); }
		if (is_set($arFields, "ACTIVE") || $ACTION == "ADD") { $arFields["ACTIVE"] = ($arFields["ACTIVE"] == "N" ? "N" : "Y"); }
		
		unset($arFields["TIMESTAMP_X"]);
		$date_start = false;
		if (is_set($arFields, "DATE_START") || $ACTION == "ADD") 
		{ 
			$arFields["DATE_START"] = trim($arFields["DATE_START"]); 
			$date_start = MakeTimeStamp($arFields["DATE_START"]);
			if (!$date_start):
				$aMsg[] = array(
					"id" => "DATE_START", 
					"text" => GetMessage("VOTE_WRONG_DATE_START"));
			endif;
		}
		
		if (is_set($arFields, "DATE_END") || $ACTION == "ADD") 
		{ 
			$arFields["DATE_END"] = trim($arFields["DATE_END"]); 
			$date_end = false;
			if (strLen($arFields["DATE_END"]) <= 0):
				if ($date_start != false):
					$date_end = $date_start + 2592000;
					$arFields["DATE_END"] = GetTime($date_end, "FULL");
				else:
					$date_end = 1924984799; // '31.12.2030 23:59:59'
					$arFields["DATE_END"] = GetTime($date_end, "FULL");
				endif;
			else:
				$date_end = MakeTimeStamp($arFields["DATE_END"]);
			endif;
			if (!$date_end):
				$aMsg[] = array(
					"id" => "DATE_END", 
					"text" => GetMessage("VOTE_WRONG_DATE_END"));
			elseif ($date_start >= $date_end && !empty($arFields["DATE_START"])):
				$aMsg[] = array(
					"id" => "DATE_END", 
					"text" => GetMessage("VOTE_WRONG_DATE_TILL"));
			endif;
		}
		
		if (empty($aMsg) && (is_set($arFields, "DATE_START") || is_set($arFields, "DATE_END") || is_set($arFields, "CHANNEL_ID") || is_set($arFields, "ACTIVE")))
		{
			$vid = 0;
			if ($ACTION == "ADD" && $arFields["ACTIVE"] == "Y")
			{
				$vid = CVote::WrongDateInterval(0, $arFields["DATE_START"], $arFields["DATE_END"], $arFields["CHANNEL_ID"]);
			}
			elseif ($ACTION != "ADD" && !(is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "Y"))
			{
				$res = array(
					"DATE_START" => (is_set($arFields, "DATE_START") ? $arFields["DATE_START"] : false), 
					"DATE_END" => (is_set($arFields, "DATE_END") ? $arFields["DATE_END"] : false), 
					"CHANNEL_ID" => (is_set($arFields, "CHANNEL_ID") ? $arFields["CHANNEL_ID"] : false));
				$vid = CVote::WrongDateInterval($ID, $res["DATE_START"], $res["DATE_END"], $res["CHANNEL_ID"]);
			}
			if (intVal($vid) > 0):
				$aMsg[] = array(
					"id" => "DATE_START", 
					"text" => str_replace("#ID#", $vid, GetMessage("VOTE_WRONG_INTERVAL")));
			endif;
		}
		
		if (is_set($arFields, "IMAGE_ID") && strLen($arFields["IMAGE_ID"]["name"]) <= 0 && strLen($arFields["IMAGE_ID"]["del"]) <= 0)
		{
			unset($arFields["IMAGE_ID"]);
		}
		elseif (is_set($arFields, "IMAGE_ID"))
		{
			if ($str = CFile::CheckImageFile($arFields["IMAGE_ID"])):
				$aMsg[] = array(
					"id" => "IMAGE_ID", 
					"text" => $str);
			else:
				$arFields["IMAGE_ID"]["MODULE_ID"] = "vote";
				if (!empty($arVote)):
					$arFields["IMAGE_ID"]["old_file"] = $arVote["IMAGE_ID"];
				endif;
			endif;
		}
		
		if (is_set($arFields, "COUNTER")) { $arFields["COUNTER"] = intVal($arFields["COUNTER"]); }
		if (is_set($arFields, "TITLE")) { $arFields["TITLE"] = trim($arFields["TITLE"]); }
		if (is_set($arFields, "DESCRIPTION")) { $arFields["DESCRIPTION"] = trim($arFields["DESCRIPTION"]); }
		if (is_set($arFields, "DESCRIPTION_TYPE") || $ACTION == "ADD") { $arFields["DESCRIPTION_TYPE"] = ($arFields["DESCRIPTION_TYPE"] == "html" ? "html" : "text"); }
		
		if (is_set($arFields, "EVENT1")) { $arFields["EVENT1"] = trim($arFields["EVENT1"]); }
		if (is_set($arFields, "EVENT2")) { $arFields["EVENT2"] = trim($arFields["EVENT2"]); }
		if (is_set($arFields, "EVENT3")) { $arFields["EVENT3"] = trim($arFields["EVENT3"]); }
		if (is_set($arFields, "UNIQUE_TYPE")) { $arFields["UNIQUE_TYPE"] = intVal($arFields["UNIQUE_TYPE"]); }
		
		if (is_set($arFields, "DELAY_TYPE") || $ACTION == "ADD") { 
			$arFields["DELAY_TYPE"] = trim($arFields["DELAY_TYPE"]); 
			$arFields["DELAY_TYPE"] = (in_array($arFields["DELAY_TYPE"], array("S", "M", "H", "D")) ? $arFields["DELAY_TYPE"] : "D");
		}
		if (is_set($arFields, "DELAY") || $ACTION == "ADD") { $arFields["DELAY"] = intVal($arFields["DELAY"]); }
		
		unset($arFields["KEEP_IP_SEC"]);
		if ($ACTION == "ADD")
		{
			$sec = 1;
			switch ($arFields["DELAY_TYPE"]) {
				case "S": $sec = 1; break;
				case "M": $sec = 60; break;
				case "H": $sec = 3600; break;
				case "D": $sec = 86400; break; }
			$arFields["KEEP_IP_SEC"] = $arFields["DELAY"] * $sec;
		}
		
		if (CVote::IsOldVersion() != "Y")
		{
			unset($arFields["TEMPLATE"]);
			unset($arFields["RESULT_TEMPLATE"]);
		}
		
		if (is_set($arFields, "TEMPLATE")) { $arFields["TEMPLATE"] = trim($arFields["TEMPLATE"]); }
		if (is_set($arFields, "RESULT_TEMPLATE")) { $arFields["RESULT_TEMPLATE"] = trim($arFields["RESULT_TEMPLATE"]); }
		if (is_set($arFields, "NOTIFY")) { $arFields["NOTIFY"] = ($arFields["NOTIFY"] == "Y" ? "Y" : "N"); }

		if(!empty($aMsg))
		{
			$e = new CAdminException(array_reverse($aMsg));
			$GLOBALS["APPLICATION"]->ThrowException($e);
			return false;
		}
		return true;
	}
	
	function Add($arFields, $strUploadDir = false)
	{
		global $DB, $CACHE_MANAGER;
		$arBinds = array();
		$strUploadDir = ($strUploadDir === false ? "vote" : $strUploadDir);
		
		if (!CVote::CheckFields("ADD", $arFields))
			return false;
/***************** Event onBeforeVoteAdd ***************************/
		$events = GetModuleEvents("vote", "onBeforeVoteAdd");
		while ($arEvent = $events->Fetch())
			ExecuteModuleEventEx($arEvent, array(&$arFields));
/***************** /Event ******************************************/
		if (empty($arFields))
			return false;
		
		CFile::SaveForDB($arFields, "IMAGE_ID", $strUploadDir);
		$arFields["~TIMESTAMP_X"] = $DB->GetNowFunction();
		if (is_set($arFields, "DESCRIPTION"))
			$arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"];

		$ID = $DB->Add("b_vote", $arFields, $arBinds);
		
		$CACHE_MANAGER->CleanDir("b_vote_channel");
/***************** Event onAfterVoteAdd ****************************/
		$events = GetModuleEvents("vote", "onAfterVoteAdd");
		while ($arEvent = $events->Fetch())
			ExecuteModuleEventEx($arEvent, array($ID, $arFields));
/***************** /Event ******************************************/
		return $ID;
	}

	function Update($ID, $arFields, $strUploadDir = false)
	{
		global $DB, $CACHE_MANAGER;
		$arBinds = array();
		$strUploadDir = ($strUploadDir === false ? "vote" : $strUploadDir);
		$ID = intVal($ID);

		if ($ID <= 0 || !CVote::CheckFields("UPDATE", $arFields, $ID))
			return false;

/***************** Event onBeforeVoteUpdate ************************/
		$events = GetModuleEvents("vote", "onBeforeVoteUpdate");
		while ($arEvent = $events->Fetch())
			ExecuteModuleEventEx($arEvent, array(&$arFields));
/***************** /Event ******************************************/
		if (empty($arFields))
			return false;
/***************** Cleaning cache **********************************/
		$CACHE_MANAGER->CleanDir("b_vote_channel");
/***************** Cleaning cache/**********************************/

		$arFields["~TIMESTAMP_X"] = $DB->GetNowFunction();
		if (is_set($arFields, "DESCRIPTION"))
			$arBinds["DESCRIPTION"] = $arFields["DESCRIPTION"];

		CFile::SaveForDB($arFields, "IMAGE_ID", $strUploadDir);

		$strUpdate = $DB->PrepareUpdateBind("b_vote", $arFields, $strUploadDir, false, $arBinds);
		
		if (!empty($strUpdate)):
			$strSql = "UPDATE b_vote SET ".$strUpdate." WHERE ID=".$ID;
			$DB->QueryBind($strSql, $arBinds);
		endif;
/***************** Event onAfterVoteUpdate *************************/
		$events = GetModuleEvents("vote", "onAfterVoteUpdate");
		while ($arEvent = $events->Fetch())
			ExecuteModuleEventEx($arEvent, array($ID, $arFields));
/***************** /Event ******************************************/
		return $ID;
	}

	function Delete($ID)
	{
		global $DB, $CACHE_MANAGER;
		$err_mess = (CVote::err_mess())."<br>Function: Delete<br>Line: ";
		$ID = intval($ID);
		if ($ID <= 0):
			return false;
		endif;
		
		@set_time_limit(1000);
		$DB->StartTransaction();
		
		$CACHE_MANAGER->CleanDir("b_vote_channel");
		// delete questions
		CVoteQuestion::Delete(false, $ID);
		// delete vote images
		$strSql = "SELECT IMAGE_ID FROM b_vote WHERE ID = ".$ID." AND IMAGE_ID > 0";
		$z = $DB->Query($strSql, false, $err_mess.__LINE__);
		while ($zr = $z->Fetch()) { CFile::Delete($zr["IMAGE_ID"]); }
		
		// delete vote events
		$DB->Query("DELETE FROM b_vote_event WHERE VOTE_ID='$ID'", false, $err_mess.__LINE__);
		// delete vote
		$res = $DB->Query("DELETE FROM b_vote WHERE ID='$ID'", false, $err_mess.__LINE__);
		$DB->Commit();
		return $res;
	}

	function Reset($ID)
	{
		global $DB;
		$err_mess = (CVote::err_mess())."<br>Function: Reset<br>Line: ";
		$ID = intval($ID);
		if ($ID <= 0):
			return false;
		endif;
		// zeroize questions
		CVoteQuestion::Reset(false, $ID);
		// zeroize events
		$DB->Query("DELETE FROM b_vote_event WHERE VOTE_ID='$ID'", false, $err_mess.__LINE__);
		// zeroize vote counter
		unset($GLOBALS["VOTE_CACHE_VOTING"][$ID]);
		$DB->Update("b_vote", array("COUNTER"=>"0"), "WHERE ID=".$ID, $err_mess.__LINE__);
	}

	function IsOldVersion()
	{
		$res = "N";
		$arr = GetTemplateList("RV");
		if (is_array($arr) && count($arr["reference"])>0) $res = "Y";
		else
		{
			$arr = GetTemplateList("SV");
			if (is_array($arr) && count($arr["reference"])>0) $res = "Y";
			else
			{
				$arr = GetTemplateList("RQ");
				if (is_array($arr) && count($arr["reference"])>0) $res = "Y";
			}
		}
		return $res;
	}

	function GetByID($ID)
	{
		$err_mess = (CAllVote::err_mess())."<br>Function: GetByID<br>Line: ";
		$ID = intval($ID);
		//if($ID<=0) 
			//return false;
		$res = CVote::GetList($by, $order, array("ID" => $ID), $is_filtered);
		return $res;
	}

	function UserAlreadyVote($VOTE_ID, $VOTE_USER_ID, $UNIQUE_TYPE, $KEEP_IP_SEC, $USER_ID = false)
	{
		global $DB;
		$err_mess = (CAllVote::err_mess())."<br>Function: UserAlreadyVote<br>Line: ";
		$VOTE_ID = intval($VOTE_ID);
		$UNIQUE_TYPE = intval($UNIQUE_TYPE);
		$VOTE_USER_ID = intval($VOTE_USER_ID);
		$USER_ID = intVal($USER_ID);

		if ($VOTE_ID <= 0)
			return false;
		//No restrictions
		if ($UNIQUE_TYPE <= 0)
			return false;
		//One session
		if ($UNIQUE_TYPE < 1 && is_array($_SESSION["VOTE_ARRAY"]) && in_array($VOTE_ID, $_SESSION["VOTE_ARRAY"]))
			return true;

		//Same cookie
		if ($UNIQUE_TYPE >= 2)
		{
			$arSqlSearch = array();
			if ($VOTE_USER_ID > 0):
				$arSqlSearch[] = "VE.VOTE_USER_ID='".$VOTE_USER_ID."'";
			endif;
			
			if ($UNIQUE_TYPE >= 3): 
				// VOTE_ID == $VOTE_ID AND IP == $REMOTE_ADDR AND (NOW - $KEEP_IP_SEC <= DATE_VOTE), 
				$arSqlSearch[] = CVote::CheckVotingIP($VOTE_ID, $_SERVER["REMOTE_ADDR"], $KEEP_IP_SEC, array("RETURN_SEARCH_STRING" => "Y"));
			endif;
			
			if ($UNIQUE_TYPE >= 4 && $USER_ID > 0): 
				// VOTE_ID == $VOTE_ID AND $USER_ID in vote_array), 
				$arSqlSearch[] = "VU.AUTH_USER_ID=".$USER_ID;
			endif;
			
			if (!empty($arSqlSearch)):
				$strSql = "
					SELECT 'x' 
					FROM b_vote_event VE
					LEFT JOIN b_vote_user VU ON (VE.VOTE_USER_ID = VU.ID)
					WHERE VE.VOTE_ID=".$VOTE_ID." AND ((".implode(") OR (", $arSqlSearch)."))";
				$db_res = $DB->Query($strSql, false, $err_mess.__LINE__);
				if ($db_res && $res = $db_res->Fetch())
					return true;
			endif;
		}

		return false;
	}

	function UserGroupPermission($CHANNEL_ID)
	{
		return CVoteChannel::GetGroupPermission($CHANNEL_ID, $GLOBALS['USER']->GetUserGroupArray());
	}

	function SetVoteUserID()
	{
		global $DB, $USER;
		$err_mess = (CAllVote::err_mess())."<br>Function: SetVoteUserID<br>Line: ";
		$COOKIE_VOTE_USER_ID = intval($GLOBALS["APPLICATION"]->get_cookie("VOTE_USER_ID"));
		$_SESSION["VOTE_USER_ID"] = $COOKIE_VOTE_USER_ID;
		$arFields = array(
			"LAST_IP"		=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
			"DATE_LAST"		=> $DB->GetNowFunction(),
			"STAT_GUEST_ID"	=> "'".intval($_SESSION["SESS_GUEST_ID"])."'",
			"AUTH_USER_ID"	=> "'".intval($USER->GetID())."'"
			);
		$rows = $DB->Update("b_vote_user", $arFields, "WHERE ID='".$COOKIE_VOTE_USER_ID."'", $err_mess.__LINE__);
		// insert user if not exists
		if (intval($rows)<=0)
		{
			$arFields["DATE_LAST"] = $DB->GetNowFunction();
			$arFields["DATE_FIRST"] = $DB->GetNowFunction();
			$_SESSION["VOTE_USER_ID"] = $DB->Insert("b_vote_user",$arFields, $err_mess.__LINE__);
			$_SESSION["VOTE_USER_ID"] = intval($_SESSION["VOTE_USER_ID"]);
			$GLOBALS["APPLICATION"]->set_cookie("VOTE_USER_ID", $_SESSION["VOTE_USER_ID"]);
		}
		return $_SESSION["VOTE_USER_ID"];
	}

	function UpdateVoteUserID($VOTE_USER_ID)
	{
		global $DB;
		$err_mess = (CAllVote::err_mess())."<br>Function: UpdateVoteUserID<br>Line: ";

		$VOTE_USER_ID = intval($VOTE_USER_ID);
		$arFields = array(
			"DATE_LAST"		=> $DB->GetNowFunction(), 
			"COUNTER"		=> "COUNTER+1"
			);
		$rows = $DB->Update("b_vote_user", $arFields, "WHERE ID='".$VOTE_USER_ID."'", $err_mess.__LINE__);
	}

	function KeepVoting()
	{
		global $DB, $VOTING_LAMP, $USER_ALREADY_VOTE, $USER_ALREADY_VOTE, $USER_GROUP_ALLOW_VOTING, $USER;
		$err_mess = (CAllVote::err_mess())."<br>Function: KeepVoting<br>Line: ";

		$PUBLIC_VOTE_ID = intval($_REQUEST["PUBLIC_VOTE_ID"]);
		if (!($_SERVER['REQUEST_METHOD'] == "POST" && strlen($_REQUEST["vote"]) > 0 && $PUBLIC_VOTE_ID > 0 )):
			return false;
		elseif (($VOTE_ID = intVal(GetVoteDataByID($PUBLIC_VOTE_ID, $arChannel, $arVote, $arQuestions, $arAnswers, $arDropDown, $arMultiSelect, $arGroupAnswers, "N"))) 
			&& ($VOTE_ID <= 0 || $arVote["LAMP"] != "green")):
			$GLOBALS["VOTING_OK"] = "N";
			$VOTING_LAMP = "red";
			return false;
		endif;
		
		$GLOBALS["VOTING_OK"] = "N";
		$VOTING_LAMP = "green";
		// get user id
		$_SESSION["VOTE_USER_ID"] = CVote::SetVoteUserID();
		// check: can user vote
		$UNIQUE_TYPE = $arVote["UNIQUE_TYPE"];
		$KEEP_IP_SEC = $arVote["KEEP_IP_SEC"];
		$USER_ALREADY_VOTE = (CVote::UserAlreadyVote($VOTE_ID, $_SESSION["VOTE_USER_ID"], $UNIQUE_TYPE, $KEEP_IP_SEC, $USER->GetID())) ? "Y" : "N";
		$CHANNEL_ID = $arVote["CHANNEL_ID"];
		$USER_GROUP_PERMISSION = CVote::UserGroupPermission($CHANNEL_ID);
		
		$arSqlAnswers = array();
		// if user can vote that 
		if ($USER_ALREADY_VOTE == "N" && $USER_GROUP_PERMISSION >= 2)
		{
			// check answers 
			foreach ($arQuestions as $arQuestion)
			{
				$QUESTION_ID = $arQuestion["ID"];
				$radio = "N"; $checkbox = "N"; $multiselect = "N"; $dropdown = "N";
				
				if (!array_key_exists($QUESTION_ID, $arAnswers))
					continue;
					
				$arSqlAnswers[$QUESTION_ID] = array();
				
				foreach ($arAnswers[$QUESTION_ID] as $arAnswer)
				{
					$ANSWER_ID = 0;
					switch ($arAnswer["FIELD_TYPE"]) :
						case 0: // radio
							if ($radio == "N")
							{
								$field_name = "vote_radio_".$QUESTION_ID;
								global $$field_name;
								$ANSWER_ID = intval($$field_name);
								if ($ANSWER_ID > 0)
								{
									$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array("ANSWER_ID" => $ANSWER_ID);
									$radio = "Y";
								}
							}
							break;
						case 1: // checkbox
							if ($checkbox == "N")
							{
								$field_name = "vote_checkbox_".$QUESTION_ID;
								global $$field_name;
								if (is_array($$field_name) && count($$field_name)>0)
								{
									reset($$field_name);
									foreach($$field_name as $ANSWER_ID)
									{
										$ANSWER_ID = intval($ANSWER_ID);
										if ($ANSWER_ID>0)
										{
											$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array("ANSWER_ID" => $ANSWER_ID);
										}
									}
									$checkbox = "Y";
								}
							}
							break;
						case 2: // dropdown list
							if ($dropdown=="N")
							{
								$field_name = "vote_dropdown_".$QUESTION_ID;
								global $$field_name;
								$ANSWER_ID = intval($$field_name);
								if ($ANSWER_ID>0)
								{
									$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array(
										"ANSWER_ID"			=> $ANSWER_ID);
									$dropdown = "Y";
								}
							}
							break;
						case 3: // multiselect list
							if ($multiselect=="N")
							{
								$field_name = "vote_multiselect_".$QUESTION_ID;
								global $$field_name;
								if (is_array($$field_name) && count($$field_name)>0)
								{
									reset($$field_name);
									foreach($$field_name as $ANSWER_ID)
									{
										$ANSWER_ID = intval($ANSWER_ID);
										if ($ANSWER_ID>0)
										{
											$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array(
												"ANSWER_ID"			=> $ANSWER_ID);
										}
									}
									$multiselect = "Y";
								}
							}
							break;
						case 4: // field
							$field_name = "vote_field_".$arAnswer["ID"];
							global $$field_name;
							$ANSWER_ID = $arAnswer["ID"];
							$MESSAGE = $$field_name;
							if (strlen($MESSAGE) > 0)
							{
								$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array(
									"ANSWER_ID"			=> $ANSWER_ID, 
									"MESSAGE"			=> "'".$DB->ForSql(trim($MESSAGE),2000)."'");
							}
							break;
						case 5: // text
							$field_name = "vote_memo_".$arAnswer["ID"];
							global $$field_name;
							$ANSWER_ID = $arAnswer["ID"];
							$MESSAGE = $$field_name;
							if (strlen($MESSAGE) > 0)
							{
								$arSqlAnswers[$QUESTION_ID][$ANSWER_ID] = array(
									"ANSWER_ID"			=> $ANSWER_ID, 
									"MESSAGE"			=> "'".$DB->ForSql(trim($MESSAGE),2000)."'");
							}
							break;
					endswitch;
				}
				if (empty($arSqlAnswers[$QUESTION_ID])):
					unset($arSqlAnswers[$QUESTION_ID]);
				endif;
			}
		}
			
		if (!empty($arSqlAnswers))
		{
			unset($GLOBALS["VOTE_CACHE_VOTING"][$VOTE_ID]["QA"]);
			unset($GLOBALS["VOTE_CACHE_VOTING"][$VOTE_ID]["V"]);
			
			// vote event
			$arFields = array(
				"VOTE_ID"			=> $VOTE_ID,
				"VOTE_USER_ID"		=> intval($_SESSION["VOTE_USER_ID"]),
				"DATE_VOTE"			=> $DB->GetNowFunction(),
				"STAT_SESSION_ID"	=> intval($_SESSION["SESS_SESSION_ID"]),
				"IP"				=> "'".$DB->ForSql($_SERVER["REMOTE_ADDR"],15)."'",
				"VALID"				=> "'Y'");
			$EVENT_ID = $DB->Insert("b_vote_event", $arFields, $err_mess.__LINE__);
			$EVENT_ID = intval($EVENT_ID);
			if ($EVENT_ID > 0)
			{
				$arSqlQuestionsID = array();
				$arSqlAnswersID = array();
				
				foreach ($arSqlAnswers as $QUESTION_ID => $arSqlAnswer):
					$arFields = array("EVENT_ID" => $EVENT_ID, "QUESTION_ID" => $QUESTION_ID);
					$EVENT_QUESTION_ID = intval($DB->Insert("b_vote_event_question", $arFields, $err_mess.__LINE__));
					if ($EVENT_QUESTION_ID > 0):
						$arSqlQuestionsID[] = $QUESTION_ID;
						foreach ($arSqlAnswer as $res):
							$arSqlAnswersID[] = $res["ANSWER_ID"];
							$res["EVENT_QUESTION_ID"] = $EVENT_QUESTION_ID;
							$DB->Insert("b_vote_event_answer", $res, $err_mess.__LINE__);
						endforeach;
					endif;
				endforeach;
				
				if (empty($arSqlQuestionsID) || empty($arSqlAnswersID)):
					$EVENT_ID = $DB->Query("DELETE FROM b_vote_event WHERE ID=".$EVENT_ID, $arFields, $err_mess.__LINE__);
				else:
					$arFields = array("COUNTER" => "COUNTER+1");
					$DB->Update("b_vote", $arFields, "WHERE ID='".$VOTE_ID."'", $err_mess.__LINE__);
					$DB->Update("b_vote_question", $arFields, "WHERE ID in (".implode(", ", $arSqlQuestionsID).")",$err_mess.__LINE__);
					$DB->Update("b_vote_answer", $arFields, "WHERE ID in (".implode(", ", $arSqlAnswersID).")", $err_mess.__LINE__);
					
					// increment user counter
					CVote::UpdateVoteUserID($_SESSION["VOTE_USER_ID"]);
					$GLOBALS["VOTING_OK"] = "Y";
					$_SESSION["VOTE_ARRAY"][] = $VOTE_ID;
					// statistic module
					if (CModule::IncludeModule("statistic")) 
					{
						$event3 = $arVote["EVENT3"];
						if (strlen($event3) <= 0):
							$event3 = "http://".$_SERVER["HTTP_HOST"]."/bitrix/admin/vote_user_results.php?EVENT_ID=". $EVENT_ID."&lang=".LANGUAGE_ID;
						endif;
						CStatEvent::AddCurrent($arVote["EVENT1"], $arVote["EVENT2"], $event3);
					}
					
					if ($arVote["NOTIFY"]=="Y")
					{
						// send message 
						$arEventFields = array(
							"ID"				=> $EVENT_ID,
							"TIME"				=> GetTime(time(),"FULL"),
							"VOTE_TITLE"		=> $arVote["TITLE"],
							"VOTE_DESCRIPTION"	=> $arVote["DESCRIPTION"],
							"VOTE_ID"			=> $arVote["ID"],
							"CHANNEL"			=> $arChannel["TITLE"],
							"CHANNEL_ID"		=> $arChannel["ID"],
							"VOTER_ID"			=> $_SESSION["VOTE_USER_ID"],
							"USER_NAME"			=> $USER->GetFullName(),
							"LOGIN"				=> $USER->GetLogin(),
							"USER_ID"			=> $USER->GetID(),
							"STAT_GUEST_ID"		=> intval($_SESSION["SESS_GUEST_ID"]),
							"SESSION_ID"		=> intval($_SESSION["SESS_SESSION_ID"]),
							"IP"				=> $_SERVER["REMOTE_ADDR"]);
						$arrSites = CVoteChannel::GetSiteArray($arChannel["ID"]);
						CEvent::Send("VOTE_NEW", $arrSites,$arEventFields);
					}
				endif;
			}
		}
	}
	
	function GetNextSort($CHANNEL_ID)
	{
		global $DB;
		$err_mess = (CAllVote::err_mess())."<br>Function: GetNextSort<br>Line: ";
		$CHANNEL_ID = intval($CHANNEL_ID);
		$strSql = "SELECT max(C_SORT) MAX_SORT FROM b_vote WHERE CHANNEL_ID='$CHANNEL_ID'";
		$z = $DB->Query($strSql, false, $err_mess.__LINE__);
		$zr = $z->Fetch();
		return intval($zr["MAX_SORT"])+100;
	}
}
?>