diff --git a/include/utils/VtlibUtils.php b/include/utils/VtlibUtils.php
index 12b068873b3de9774376438c83da1e4ee2093b96..3bab894db39eefa2c5afc043d9b84a186c65546a 100644
--- a/include/utils/VtlibUtils.php
+++ b/include/utils/VtlibUtils.php
@@ -724,6 +724,7 @@ function vtlib_purify($input, $ignore = false) {
     return $value;
 }
 
+<<<<<<< HEAD
 /**
  * To purify malicious html event attributes
  * @param <String> $value
@@ -759,6 +760,43 @@ function purifyHtmlEventAttributes($value, $replaceAll = false) {
         }
     }
     return $value;
+=======
+			$__htmlpurifier_instance = new HTMLPurifier($config);
+		}
+		if($__htmlpurifier_instance) {
+			// Composite type
+			if (is_array($input)) {
+				$value = array();
+				foreach ($input as $k => $v) {
+					$value[$k] = vtlib_purify($v, $ignore);
+				}
+			} else { // Simple type
+				$value = $__htmlpurifier_instance->purify($input);
+				$value = purifyHtmlEventAttributes($value);
+			}
+		}
+		$purified_cache[$md5OfInput] = $value;
+	}
+	 $value = str_replace('&amp;','&',$value);
+	return $value;
+>>>>>>> remotes/upstream/6.4.0
+}
+
+/**
+ * To purify malicious html event attributes
+ * @param <String> $value
+ * @return <String>
+ */
+function purifyHtmlEventAttributes($value){
+    $htmlEventAttributes = "onerror|onblur|onchange|oncontextmenu|onfocus|oninput|oninvalid|".
+                        "onreset|onsearch|onselect|onsubmit|onkeydown|onkeypress|onkeyup|".
+                        "onclick|ondblclick|ondrag|ondragend|ondragenter|ondragleave|ondragover|".
+                        "ondragstart|ondrop|onmousedown|onmousemove|onmouseout|onmouseover|".
+                        "onmouseup|onmousewheel|onscroll|onwheel|oncopy|oncut|onpaste";
+    if(preg_match("/\s(".$htmlEventAttributes.")\s*=/i", $value)) {
+        $value = str_replace("=", "&equals;", $value);
+    }
+    return $value;
 }
 
 /**
@@ -813,6 +851,7 @@ function vtlib_mime_content_type($filename) {
 	return Vtiger_Functions::mime_content_type($filename);
 }
 
+<<<<<<< HEAD
 /**
  * Function to add settings entry in CRM settings page
  * @param string $linkName
@@ -883,4 +922,7 @@ function php7_compat_ereg($pattern, $str, $ignore_case=false) {
 
 if (!function_exists('ereg')) { function ereg($pattern, $str) { return php7_compat_ereg($pattern, $str); } }
 if (!function_exists('eregi')) { function eregi($pattern, $str) { return php7_compat_ereg($pattern, $str, true); } }
-?>
\ No newline at end of file
+?>
+=======
+?>
+>>>>>>> remotes/upstream/6.4.0
diff --git a/issue/utils.php b/issue/utils.php
new file mode 100755
index 0000000000000000000000000000000000000000..72609ee33b0fb7dff3b1911e77e1c81065008979
--- /dev/null
+++ b/issue/utils.php
@@ -0,0 +1,2620 @@
+<?php
+/*********************************************************************************
+ * The contents of this file are subject to the SugarCRM Public License Version 1.1.2
+ * ("License"); You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at http://www.sugarcrm.com/SPL
+ * Software distributed under the License is distributed on an  "AS IS"  basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
+ * the specific language governing rights and limitations under the License.
+ * The Original Code is:  SugarCRM Open Source
+ * The Initial Developer of the Original Code is SugarCRM, Inc.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.;
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________.
+ ********************************************************************************/
+/*********************************************************************************
+ * $Header$
+ * Description:  Includes generic helper functions used throughout the application.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________..
+ ********************************************************************************/
+#require_once('include/database/PearDatabase.php');
+require_once('include/ComboUtil.php'); //new
+require_once('include/utils/ListViewUtils.php');
+require_once('include/utils/EditViewUtils.php');
+require_once('include/utils/CommonUtils.php');
+require_once('include/utils/InventoryUtils.php');
+require_once('include/utils/SearchUtils.php');
+require_once('include/FormValidationUtil.php');
+require_once('include/events/SqlResultIterator.inc');
+require_once('include/fields/DateTimeField.php');
+require_once('include/fields/CurrencyField.php');
+require_once('data/CRMEntity.php');
+require_once 'vtlib/Vtiger/Language.php';
+require_once("include/ListView/ListViewSession.php");
+
+require_once 'vtlib/Vtiger/Functions.php';
+require_once 'vtlib/Vtiger/Deprecated.php';
+
+require_once 'includes/runtime/Cache.php';
+require_once 'modules/Vtiger/helpers/Util.php';
+require_once 'vtlib/Vtiger/AccessControl.php';
+// Constants to be defined here
+
+// For Migration status.
+define("MIG_CHARSET_PHP_UTF8_DB_UTF8", 1);
+define("MIG_CHARSET_PHP_NONUTF8_DB_NONUTF8", 2);
+define("MIG_CHARSET_PHP_NONUTF8_DB_UTF8", 3);
+define("MIG_CHARSET_PHP_UTF8_DB_NONUTF8", 4);
+
+// For Customview status.
+define("CV_STATUS_DEFAULT", 0);
+define("CV_STATUS_PRIVATE", 1);
+define("CV_STATUS_PENDING", 2);
+define("CV_STATUS_PUBLIC", 3);
+
+// For Restoration.
+define("RB_RECORD_DELETED", 'delete');
+define("RB_RECORD_INSERTED", 'insert');
+define("RB_RECORD_UPDATED", 'update');
+
+/** Function to return a full name
+  * @param $row -- row:: Type integer
+  * @param $first_column -- first column:: Type string
+  * @param $last_column -- last column:: Type string
+  * @returns $fullname -- fullname:: Type string
+  *
+*/
+function return_name(&$row, $first_column, $last_column)
+{
+	global $log;
+	$log->debug("Entering return_name(".$row.",".$first_column.",".$last_column.") method ...");
+	$first_name = "";
+	$last_name = "";
+	$full_name = "";
+
+	if(isset($row[$first_column]))
+	{
+		$first_name = stripslashes($row[$first_column]);
+	}
+
+	if(isset($row[$last_column]))
+	{
+		$last_name = stripslashes($row[$last_column]);
+	}
+
+	$full_name = $first_name;
+
+	// If we have a first name and we have a last name
+	if($full_name != "" && $last_name != "")
+	{
+		// append a space, then the last name
+		$full_name .= " ".$last_name;
+	}
+	// If we have no first name, but we have a last name
+	else if($last_name != "")
+	{
+		// append the last name without the space.
+		$full_name .= $last_name;
+	}
+
+	$log->debug("Exiting return_name method ...");
+	return $full_name;
+}
+
+/** Function returns the user key in user array
+  * @param $add_blank -- boolean:: Type boolean
+  * @param $status -- user status:: Type string
+  * @param $assigned_user -- user id:: Type string
+  * @param $private -- sharing type:: Type string
+  * @returns $user_array -- user array:: Type array
+  *
+*/
+
+//used in module file
+function get_user_array($add_blank=true, $status="Active", $assigned_user="",$private="",$module=false)
+{
+	global $log;
+	$log->debug("Entering get_user_array(".$add_blank.",". $status.",".$assigned_user.",".$private.") method ...");
+	global $current_user;
+	if(isset($current_user) && $current_user->id != '')
+	{
+		require('user_privileges/sharing_privileges_'.$current_user->id.'.php');
+		require('user_privileges/user_privileges_'.$current_user->id.'.php');
+	}
+	static $user_array = null;
+	if(!$module){
+        $module=$_REQUEST['module'];
+    }
+
+
+	if($user_array == null)
+	{
+		require_once('include/database/PearDatabase.php');
+		$db = PearDatabase::getInstance();
+		$temp_result = Array();
+		// Including deleted vtiger_users for now.
+		if (empty($status)) {
+				$query = "SELECT id, user_name from vtiger_users";
+				$params = array();
+		}
+		else {
+				if($private == 'private')
+				{
+					$log->debug("Sharing is Private. Only the current user should be listed");
+					$query = "select id as id,user_name as user_name,first_name,last_name from vtiger_users where id=? and status='Active' union select vtiger_user2role.userid as id,vtiger_users.user_name as user_name ,
+							  vtiger_users.first_name as first_name ,vtiger_users.last_name as last_name
+							  from vtiger_user2role inner join vtiger_users on vtiger_users.id=vtiger_user2role.userid inner join vtiger_role on vtiger_role.roleid=vtiger_user2role.roleid where vtiger_role.parentrole like ? and status='Active' union
+							  select shareduserid as id,vtiger_users.user_name as user_name ,
+							  vtiger_users.first_name as first_name ,vtiger_users.last_name as last_name  from vtiger_tmp_write_user_sharing_per inner join vtiger_users on vtiger_users.id=vtiger_tmp_write_user_sharing_per.shareduserid where status='Active' and vtiger_tmp_write_user_sharing_per.userid=? and vtiger_tmp_write_user_sharing_per.tabid=? and (user_name != 'admin' OR is_owner=1)";
+					$params = array($current_user->id, $current_user_parent_role_seq."::%", $current_user->id, getTabid($module));
+				}
+				else
+				{
+					$log->debug("Sharing is Public. All vtiger_users should be listed");
+					$query = "SELECT id, user_name,first_name,last_name from vtiger_users WHERE status=? and (user_name != 'admin' OR is_owner=1)";
+					$params = array($status);
+				}
+		}
+		if (!empty($assigned_user)) {
+			 $query .= " OR id=?";
+			 array_push($params, $assigned_user);
+		}
+
+		$query .= " order by user_name ASC";
+
+		$result = $db->pquery($query, $params, true, "Error filling in user array: ");
+
+		if ($add_blank==true){
+			// Add in a blank row
+			$temp_result[''] = '';
+		}
+
+		// Get the id and the name.
+		while($row = $db->fetchByAssoc($result))
+		{
+			$temp_result[$row['id']] = getFullNameFromArray('Users', $row);
+		}
+
+		$user_array = &$temp_result;
+	}
+
+	$log->debug("Exiting get_user_array method ...");
+	return $user_array;
+}
+
+function get_group_array($add_blank=true, $status="Active", $assigned_user="",$private="",$module = false)
+{
+	global $log;
+	$log->debug("Entering get_user_array(".$add_blank.",". $status.",".$assigned_user.",".$private.") method ...");
+	global $current_user;
+	if(isset($current_user) && $current_user->id != '')
+	{
+		require('user_privileges/sharing_privileges_'.$current_user->id.'.php');
+		require('user_privileges/user_privileges_'.$current_user->id.'.php');
+	}
+	static $group_array = null;
+	if(!$module){
+        $module=$_REQUEST['module'];
+    }
+
+	if($group_array == null)
+	{
+		require_once('include/database/PearDatabase.php');
+		$db = PearDatabase::getInstance();
+		$temp_result = Array();
+		// Including deleted vtiger_users for now.
+		$log->debug("Sharing is Public. All vtiger_users should be listed");
+		$query = "SELECT groupid, groupname from vtiger_groups";
+		$params = array();
+
+		if($private == 'private'){
+
+			$query .= " WHERE groupid=?";
+			$params = array( $current_user->id);
+
+			if(!empty($current_user_groups) && (count($current_user_groups) != 0)) {
+				$query .= " OR vtiger_groups.groupid in (".generateQuestionMarks($current_user_groups).")";
+				array_push($params, $current_user_groups);
+			}
+			$log->debug("Sharing is Private. Only the current user should be listed");
+			$query .= " union select vtiger_group2role.groupid as groupid,vtiger_groups.groupname as groupname from vtiger_group2role inner join vtiger_groups on vtiger_groups.groupid=vtiger_group2role.groupid inner join vtiger_role on vtiger_role.roleid=vtiger_group2role.roleid where vtiger_role.parentrole like ?";
+			array_push($params, $current_user_parent_role_seq."::%");
+
+			if(!empty($current_user_groups) && (count($current_user_groups) != 0)) {
+				$query .= " union select vtiger_groups.groupid as groupid,vtiger_groups.groupname as groupname from vtiger_groups inner join vtiger_group2rs on vtiger_groups.groupid=vtiger_group2rs.groupid where vtiger_group2rs.roleandsubid in (".generateQuestionMarks($parent_roles).")";
+				array_push($params, $parent_roles);
+			}
+
+			$query .= " union select sharedgroupid as groupid,vtiger_groups.groupname as groupname from vtiger_tmp_write_group_sharing_per inner join vtiger_groups on vtiger_groups.groupid=vtiger_tmp_write_group_sharing_per.sharedgroupid where vtiger_tmp_write_group_sharing_per.userid=?";
+			array_push($params, $current_user->id);
+
+			$query .= " and vtiger_tmp_write_group_sharing_per.tabid=?";
+			array_push($params,  getTabid($module));
+		}
+		$query .= " order by groupname ASC";
+
+		$result = $db->pquery($query, $params, true, "Error filling in user array: ");
+
+		if ($add_blank==true){
+			// Add in a blank row
+			$temp_result[''] = '';
+		}
+
+		// Get the id and the name.
+		while($row = $db->fetchByAssoc($result))
+		{
+			$temp_result[$row['groupid']] = $row['groupname'];
+		}
+
+		$group_array = &$temp_result;
+	}
+
+	$log->debug("Exiting get_user_array method ...");
+	return $group_array;
+}
+
+/** This function retrieves an application language file and returns the array of strings included in the $app_list_strings var.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________..
+ * If you are using the current language, do not call this function unless you are loading it for the first time */
+
+function return_app_list_strings_language($language) {
+	return Vtiger_Deprecated::return_app_list_strings_language($language);
+}
+
+/**
+ * Retrieve the app_currency_strings for the required language.
+ */
+function return_app_currency_strings_language($language) {
+	return Vtiger_Deprecated::return_app_list_strings_language($language);
+}
+
+/** This function retrieves an application language file and returns the array of strings included.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________..
+ * If you are using the current language, do not call this function unless you are loading it for the first time */
+function return_application_language($language) {
+	return Vtiger_Deprecated::return_app_list_strings_language($language);
+	}
+
+/** This function retrieves a module's language file and returns the array of strings included.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________..
+ * If you are in the current module, do not call this function unless you are loading it for the first time */
+function return_module_language($language, $module) {
+	return Vtiger_Deprecated::getModuleTranslationStrings($language, $module);
+}
+
+/*This function returns the mod_strings for the current language and the specified module
+*/
+
+function return_specified_module_language($language, $module) {
+	return Vtiger_Deprecated::return_app_list_strings_language($language, $module);
+}
+
+/**
+ * Return an array of directory names.
+ * Portions created by SugarCRM are Copyright (C) SugarCRM, Inc.
+ * All Rights Reserved.
+ * Contributor(s): ______________________________________..
+ */
+function get_themes() {
+	return Vtiger_Theme::getAllSkins();
+   }
+
+
+/** Function to set default varibles on to the global variable
+  * @param $defaults -- default values:: Type array
+       */
+function set_default_config(&$defaults)
+{
+	global $log;
+	$log->debug("Entering set_default_config(".$defaults.") method ...");
+
+	foreach ($defaults as $name=>$value)
+	{
+		if ( ! isset($GLOBALS[$name]) )
+		{
+			$GLOBALS[$name] = $value;
+		}
+	}
+	$log->debug("Exiting set_default_config method ...");
+}
+
+/**
+ * Function to decide whether to_html should convert values or not for a request
+ * @global type $doconvert
+ * @global type $inUTF8
+ * @global type $default_charset
+ */
+function decide_to_html() {
+	global $doconvert, $inUTF8, $default_charset;
+ 	$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : ''; 
+ 		     
+    $inUTF8 = (strtoupper($default_charset) == 'UTF-8'); 
+
+    $doconvert = true; 
+	if ($action == 'ExportData') {
+        $doconvert = false; 
+    } 
+}
+decide_to_html();
+
+/** Function to convert the given string to html
+  * @param $string -- string:: Type string
+  * @param $encode -- boolean:: Type boolean
+    * @returns $string -- string:: Type string
+       */
+function to_html($string, $encode=true) {
+	// For optimization - default_charset can be either upper / lower case.
+    global $doconvert,$inUTF8,$default_charset,$htmlCache;
+
+    if(is_string($string)) {
+		// In vtiger5 ajax request are treated specially and the data is encoded
+		if ($doconvert == true) {
+            if(isset($htmlCache[$string])){
+                $string = $htmlCache[$string];
+            }else{
+			if($inUTF8)
+				$string = htmlentities($string, ENT_QUOTES, $default_charset);
+			else
+				$string = preg_replace(array('/</', '/>/', '/"/'), array('&lt;', '&gt;', '&quot;'), $string);
+                $htmlCache[$string] = $string;
+            }
+		}
+	}
+	return $string;
+}
+
+/** Function to get the tablabel for a given id
+  * @param $tabid -- tab id:: Type integer
+  * @returns $string -- string:: Type string
+*/
+
+function getTabname($tabid)
+{
+	global $log;
+	$log->debug("Entering getTabname(".$tabid.") method ...");
+        $log->info("tab id is ".$tabid);
+        global $adb;
+
+	static $cache = array();
+
+	if (!isset($cache[$tabid])) {
+		$sql = "select tablabel from vtiger_tab where tabid=?";
+		$result = $adb->pquery($sql, array($tabid));
+		$tabname=  $adb->query_result($result,0,"tablabel");
+		$cache[$tabid] = $tabname;
+	}
+
+	$log->debug("Exiting getTabname method ...");
+	return $cache[$tabid];
+
+}
+
+/** Function to get the tab module name for a given id
+  * @param $tabid -- tab id:: Type integer
+    * @returns $string -- string:: Type string
+      *
+       */
+
+function getTabModuleName($tabid)
+{
+	return Vtiger_Functions::getModuleName($tabid);
+}
+
+/** Function to get column fields for a given module
+  * @param $module -- module:: Type string
+    * @returns $column_fld -- column field :: Type array
+      *
+       */
+
+function getColumnFields($module)
+{
+	global $log;
+	$log->debug("Entering getColumnFields(".$module.") method ...");
+	$log->debug("in getColumnFields ".$module);
+
+	// Lookup in cache for information
+	$cachedModuleFields = VTCacheUtils::lookupFieldInfo_Module($module);
+
+	if($cachedModuleFields === false) {
+		global $adb;
+		$tabid = getTabid($module);
+
+		if ($module == 'Calendar') {
+    		$tabid = array('9','16');
+    	}
+
+		// To overcome invalid module names.
+		if (empty($tabid)) {
+			return array();
+		}
+
+    	// Let us pick up all the fields first so that we can cache information
+		$sql = "SELECT tabid, fieldname, fieldid, fieldlabel, columnname, tablename, uitype, typeofdata, presence
+		FROM vtiger_field WHERE tabid in (" . generateQuestionMarks($tabid) . ")";
+
+        $result = $adb->pquery($sql, array($tabid));
+        $noofrows = $adb->num_rows($result);
+
+        if($noofrows) {
+        	while($resultrow = $adb->fetch_array($result)) {
+        		// Update information to cache for re-use
+        		VTCacheUtils::updateFieldInfo(
+        			$resultrow['tabid'], $resultrow['fieldname'], $resultrow['fieldid'],
+        			$resultrow['fieldlabel'], $resultrow['columnname'], $resultrow['tablename'],
+        			$resultrow['uitype'], $resultrow['typeofdata'], $resultrow['presence']
+        		);
+        	}
+        }
+
+        // For consistency get information from cache
+		$cachedModuleFields = VTCacheUtils::lookupFieldInfo_Module($module);
+	}
+
+	if($module == 'Calendar') {
+		$cachedEventsFields = VTCacheUtils::lookupFieldInfo_Module('Events');
+		if (!$cachedEventsFields) {
+            getColumnFields('Events');
+            $cachedEventsFields = VTCacheUtils::lookupFieldInfo_Module('Events');
+        }
+        
+		if (!$cachedModuleFields) {
+            $cachedModuleFields = $cachedEventsFields;
+		} else {
+            $cachedModuleFields = array_merge($cachedModuleFields, $cachedEventsFields);
+        }
+    }
+
+	$column_fld = new TrackableObject();
+	if($cachedModuleFields) {
+		foreach($cachedModuleFields as $fieldinfo) {
+			$column_fld[$fieldinfo['fieldname']] = '';
+		}
+	}
+
+	$log->debug("Exiting getColumnFields method ...");
+	return $column_fld;
+}
+
+/** Function to get a users's mail id
+  * @param $userid -- userid :: Type integer
+    * @returns $email -- email :: Type string
+      *
+       */
+
+function getUserEmail($userid)
+{
+	global $log;
+	$log->debug("Entering getUserEmail(".$userid.") method ...");
+	$log->info("in getUserEmail ".$userid);
+
+        global $adb;
+        if($userid != '')
+        {
+                $sql = "select email1 from vtiger_users where id=?";
+                $result = $adb->pquery($sql, array($userid));
+                $email = $adb->query_result($result,0,"email1");
+        }
+	$log->debug("Exiting getUserEmail method ...");
+        return $email;
+}
+
+/** Function to get a userid for outlook
+  * @param $username -- username :: Type string
+    * @returns $user_id -- user id :: Type integer
+       */
+
+//outlook security
+function getUserId_Ol($username)
+{
+	global $log;
+	$log->debug("Entering getUserId_Ol(".$username.") method ...");
+	$log->info("in getUserId_Ol ".$username);
+	$cache = Vtiger_Cache::getInstance();
+	if($cache->getUserId($username) || $cache->getUserId($username) === 0){
+		return $cache->getUserId($username);
+	} else {
+	global $adb;
+	$sql = "select id from vtiger_users where user_name=?";
+	$result = $adb->pquery($sql, array($username));
+	$num_rows = $adb->num_rows($result);
+	if($num_rows > 0)
+	{
+		$user_id = $adb->query_result($result,0,"id");
+    	}
+	else
+	{
+		$user_id = 0;
+	}
+	$log->debug("Exiting getUserId_Ol method ...");
+		$cache->setUserId($username,$user_id);
+	return $user_id;
+	}
+}
+
+
+/** Function to get a action id for a given action name
+  * @param $action -- action name :: Type string
+    * @returns $actionid -- action id :: Type integer
+       */
+
+//outlook security
+
+function getActionid($action)
+{
+	global $log;
+	$log->debug("Entering getActionid(".$action.") method ...");
+	global $adb;
+	$log->info("get Actionid ".$action);
+	$actionid = '';
+	if(file_exists('tabdata.php') && (filesize('tabdata.php') != 0))
+	{
+		include('tabdata.php');
+		$actionid= $action_id_array[$action];
+	}
+	else
+	{
+		$query="select * from vtiger_actionmapping where actionname=?";
+        	$result =$adb->pquery($query, array($action));
+        	$actionid=$adb->query_result($result,0,'actionid');
+
+	}
+	$log->info("action id selected is ".$actionid );
+	$log->debug("Exiting getActionid method ...");
+	return $actionid;
+}
+
+/** Function to get a action for a given action id
+  * @param $action id -- action id :: Type integer
+    * @returns $actionname-- action name :: Type string
+       */
+
+
+function getActionname($actionid)
+{
+	global $log;
+	$log->debug("Entering getActionname(".$actionid.") method ...");
+	global $adb;
+
+	$actionname='';
+
+	if (file_exists('tabdata.php') && (filesize('tabdata.php') != 0))
+	{
+		include('tabdata.php');
+		$actionname= $action_name_array[$actionid];
+	}
+	else
+	{
+
+		$query="select * from vtiger_actionmapping where actionid=? and securitycheck=0";
+		$result =$adb->pquery($query, array($actionid));
+		$actionname=$adb->query_result($result,0,"actionname");
+	}
+	$log->debug("Exiting getActionname method ...");
+	return $actionname;
+}
+
+/** Function to get a user id or group id for a given entity
+  * @param $record -- entity id :: Type integer
+    * @returns $ownerArr -- owner id :: Type array
+       */
+
+function getRecordOwnerId($record)
+{
+	global $log;
+	$log->debug("Entering getRecordOwnerId(".$record.") method ...");
+	global $adb;
+	$ownerArr=Array();
+
+	// Look at cache first for information
+	$ownerId = VTCacheUtils::lookupRecordOwner($record);
+
+	if($ownerId === false) {
+		$query="select smownerid from vtiger_crmentity where crmid = ?";
+		$result=$adb->pquery($query, array($record));
+		if($adb->num_rows($result) > 0)
+		{
+			$ownerId=$adb->query_result($result,0,'smownerid');
+			// Update cache for re-use
+			VTCacheUtils::updateRecordOwner($record, $ownerId);
+		}
+	}
+
+	if($ownerId)
+	{
+		// Look at cache first for information
+		$count = VTCacheUtils::lookupOwnerType($ownerId);
+
+		if($count === false) {
+			$sql_result = $adb->pquery('SELECT 1 FROM vtiger_users WHERE id = ?', array($ownerId));
+			$count = $adb->query_result($sql_result, 0, 1);
+			// Update cache for re-use
+			VTCacheUtils::updateOwnerType($ownerId, $count);
+		}
+		if($count > 0)
+			$ownerArr['Users'] = $ownerId;
+		else
+			$ownerArr['Groups'] = $ownerId;
+	}
+	$log->debug("Exiting getRecordOwnerId method ...");
+	return $ownerArr;
+
+}
+
+/** Function to insert value to profile2field table
+  * @param $profileid -- profileid :: Type integer
+       */
+
+
+function insertProfile2field($profileid)
+{
+	global $log;
+	$log->debug("Entering insertProfile2field(".$profileid.") method ...");
+        $log->info("in insertProfile2field ".$profileid);
+
+	global $adb;
+	$adb->database->SetFetchMode(ADODB_FETCH_ASSOC);
+	$fld_result = $adb->pquery("select * from vtiger_field where generatedtype=1 and displaytype in (1,2,3) and vtiger_field.presence in (0,2) and tabid != 29", array());
+    $num_rows = $adb->num_rows($fld_result);
+    for($i=0; $i<$num_rows; $i++) {
+         $tab_id = $adb->query_result($fld_result,$i,'tabid');
+         $field_id = $adb->query_result($fld_result,$i,'fieldid');
+		 $params = array($profileid, $tab_id, $field_id, 0, 0);
+         $adb->pquery("insert into vtiger_profile2field values (?,?,?,?,?)", $params);
+	}
+	$log->debug("Exiting insertProfile2field method ...");
+}
+
+/** Function to insert into default org field
+       */
+
+function insert_def_org_field()
+{
+	global $log;
+	$log->debug("Entering insert_def_org_field() method ...");
+	global $adb;
+	$adb->database->SetFetchMode(ADODB_FETCH_ASSOC);
+	$fld_result = $adb->pquery("select * from vtiger_field where generatedtype=1 and displaytype in (1,2,3) and vtiger_field.presence in (0,2) and tabid != 29", array());
+        $num_rows = $adb->num_rows($fld_result);
+        for($i=0; $i<$num_rows; $i++)
+        {
+                 $tab_id = $adb->query_result($fld_result,$i,'tabid');
+                 $field_id = $adb->query_result($fld_result,$i,'fieldid');
+				 $params = array($tab_id, $field_id, 0, 0);
+                 $adb->pquery("insert into vtiger_def_org_field values (?,?,?,?)", $params);
+	}
+	$log->debug("Exiting insert_def_org_field() method ...");
+}
+
+/** Function to update product quantity
+  * @param $product_id -- product id :: Type integer
+  * @param $upd_qty -- quantity :: Type integer
+  */
+
+function updateProductQty($product_id, $upd_qty)
+{
+	global $log;
+	$log->debug("Entering updateProductQty(".$product_id.",". $upd_qty.") method ...");
+	global $adb;
+	$query= "update vtiger_products set qtyinstock=? where productid=?";
+    $adb->pquery($query, array($upd_qty, $product_id));
+	$log->debug("Exiting updateProductQty method ...");
+
+}
+
+/** This Function adds the specified product quantity to the Product Quantity in Stock in the Warehouse
+  * The following is the input parameter for the function:
+  *  $productId --> ProductId, Type:Integer
+  *  $qty --> Quantity to be added, Type:Integer
+  */
+function addToProductStock($productId,$qty)
+{
+	global $log;
+	$log->debug("Entering addToProductStock(".$productId.",".$qty.") method ...");
+	global $adb;
+	$qtyInStck=getProductQtyInStock($productId);
+	$updQty=$qtyInStck + $qty;
+	$sql = "UPDATE vtiger_products set qtyinstock=? where productid=?";
+	$adb->pquery($sql, array($updQty, $productId));
+	$log->debug("Exiting addToProductStock method ...");
+
+    }
+
+/**	This Function adds the specified product quantity to the Product Quantity in Demand in the Warehouse
+  *	@param int $productId - ProductId
+  *	@param int $qty - Quantity to be added
+  */
+function addToProductDemand($productId,$qty)
+{
+	global $log;
+	$log->debug("Entering addToProductDemand(".$productId.",".$qty.") method ...");
+		global $adb;
+	$qtyInStck=getProductQtyInDemand($productId);
+	$updQty=$qtyInStck + $qty;
+	$sql = "UPDATE vtiger_products set qtyindemand=? where productid=?";
+	$adb->pquery($sql, array($updQty, $productId));
+	$log->debug("Exiting addToProductDemand method ...");
+
+		}
+
+/**	This Function subtract the specified product quantity to the Product Quantity in Stock in the Warehouse
+  *	@param int $productId - ProductId
+  *	@param int $qty - Quantity to be subtracted
+  */
+function deductFromProductStock($productId,$qty)
+{
+	global $log;
+	$log->debug("Entering deductFromProductStock(".$productId.",".$qty.") method ...");
+	global $adb;
+	$qtyInStck=getProductQtyInStock($productId);
+	$updQty=$qtyInStck - $qty;
+	$sql = "UPDATE vtiger_products set qtyinstock=? where productid=?";
+	$adb->pquery($sql, array($updQty, $productId));
+	$log->debug("Exiting deductFromProductStock method ...");
+
+}
+
+/**	This Function subtract the specified product quantity to the Product Quantity in Demand in the Warehouse
+  *	@param int $productId - ProductId
+  *	@param int $qty - Quantity to be subtract
+  */
+function deductFromProductDemand($productId,$qty)
+{
+	global $log;
+	$log->debug("Entering deductFromProductDemand(".$productId.",".$qty.") method ...");
+	global $adb;
+	$qtyInStck=getProductQtyInDemand($productId);
+	$updQty=$qtyInStck - $qty;
+	$sql = "UPDATE vtiger_products set qtyindemand=? where productid=?";
+	$adb->pquery($sql, array($updQty, $productId));
+	$log->debug("Exiting deductFromProductDemand method ...");
+
+    }
+
+
+/** This Function returns the current product quantity in stock.
+  * The following is the input parameter for the function:
+  *  $product_id --> ProductId, Type:Integer
+  */
+function getProductQtyInStock($product_id)
+{
+	global $log;
+	$log->debug("Entering getProductQtyInStock(".$product_id.") method ...");
+	global $adb;
+        $query1 = "select qtyinstock from vtiger_products where productid=?";
+        $result=$adb->pquery($query1, array($product_id));
+        $qtyinstck= $adb->query_result($result,0,"qtyinstock");
+	$log->debug("Exiting getProductQtyInStock method ...");
+        return $qtyinstck;
+
+
+}
+
+/**	This Function returns the current product quantity in demand.
+  *	@param int $product_id - ProductId
+  *	@return int $qtyInDemand - Quantity in Demand of a product
+  */
+function getProductQtyInDemand($product_id)
+{
+	global $log;
+	$log->debug("Entering getProductQtyInDemand(".$product_id.") method ...");
+	global $adb;
+        $query1 = "select qtyindemand from vtiger_products where productid=?";
+        $result = $adb->pquery($query1, array($product_id));
+        $qtyInDemand = $adb->query_result($result,0,"qtyindemand");
+	$log->debug("Exiting getProductQtyInDemand method ...");
+        return $qtyInDemand;
+}
+
+/**     Function to get the vtiger_table name from 'field' vtiger_table for the input vtiger_field based on the module
+ *      @param  : string $module - current module value
+ *      @param  : string $fieldname - vtiger_fieldname to which we want the vtiger_tablename
+ *      @return : string $tablename - vtiger_tablename in which $fieldname is a column, which is retrieved from 'field' vtiger_table per $module basis
+  */
+function getTableNameForField($module,$fieldname)
+{
+	global $log;
+	$log->debug("Entering getTableNameForField(".$module.",".$fieldname.") method ...");
+	global $adb;
+	$tabid = getTabid($module);
+	//Asha
+	if($module == 'Calendar') {
+		$tabid = array('9','16');
+}
+	$sql = "select tablename from vtiger_field where tabid in (". generateQuestionMarks($tabid) .") and vtiger_field.presence in (0,2) and columnname like ?";
+	$res = $adb->pquery($sql, array($tabid, '%'.$fieldname.'%'));
+
+	$tablename = '';
+	if($adb->num_rows($res) > 0)
+{
+		$tablename = $adb->query_result($res,0,'tablename');
+	}
+
+	$log->debug("Exiting getTableNameForField method ...");
+	return $tablename;
+}
+
+/** Function to get parent record owner
+  * @param $tabid -- tabid :: Type integer
+  * @param $parModId -- parent module id :: Type integer
+  * @param $record_id -- record id :: Type integer
+  * @returns $parentRecOwner -- parentRecOwner:: Type integer
+  */
+
+function getParentRecordOwner($tabid,$parModId,$record_id)
+ {
+	global $log;
+	$log->debug("Entering getParentRecordOwner(".$tabid.",".$parModId.",".$record_id.") method ...");
+	$parentRecOwner=Array();
+	$parentTabName=getTabname($parModId);
+	$relTabName=getTabname($tabid);
+	$fn_name="get".$relTabName."Related".$parentTabName;
+	$ent_id=$fn_name($record_id);
+	if($ent_id != '')
+        {
+		$parentRecOwner=getRecordOwnerId($ent_id);
+        }
+	$log->debug("Exiting getParentRecordOwner method ...");
+	return $parentRecOwner;
+        }
+
+/** Function to get potential related accounts
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+
+function getPotentialsRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getPotentialsRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+	$query="select related_to from vtiger_potential where potentialid=?";
+	$result=$adb->pquery($query, array($record_id));
+	$accountid=$adb->query_result($result,0,'related_to');
+	$log->debug("Exiting getPotentialsRelatedAccounts method ...");
+	return $accountid;
+}
+
+/** Function to get email related accounts
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+function getEmailsRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getEmailsRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+	$query = "select vtiger_seactivityrel.crmid from vtiger_seactivityrel inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_seactivityrel.crmid where vtiger_crmentity.setype='Accounts' and activityid=?";
+	$result = $adb->pquery($query, array($record_id));
+	$accountid=$adb->query_result($result,0,'crmid');
+	$log->debug("Exiting getEmailsRelatedAccounts method ...");
+	return $accountid;
+}
+/** Function to get email related Leads
+  * @param $record_id -- record id :: Type integer
+  * @returns $leadid -- leadid:: Type integer
+  */
+
+function getEmailsRelatedLeads($record_id)
+{
+	global $log;
+	$log->debug("Entering getEmailsRelatedLeads(".$record_id.") method ...");
+	global $adb;
+	$query = "select vtiger_seactivityrel.crmid from vtiger_seactivityrel inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_seactivityrel.crmid where vtiger_crmentity.setype='Leads' and activityid=?";
+	$result = $adb->pquery($query, array($record_id));
+	$leadid=$adb->query_result($result,0,'crmid');
+	$log->debug("Exiting getEmailsRelatedLeads method ...");
+	return $leadid;
+}
+
+/** Function to get HelpDesk related Accounts
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+
+function getHelpDeskRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getHelpDeskRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+        $query="select parent_id from vtiger_troubletickets inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_troubletickets.parent_id where ticketid=? and vtiger_crmentity.setype='Accounts'";
+        $result=$adb->pquery($query, array($record_id));
+        $accountid=$adb->query_result($result,0,'parent_id');
+	$log->debug("Exiting getHelpDeskRelatedAccounts method ...");
+        return $accountid;
+}
+
+/** Function to get Quotes related Accounts
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+
+function getQuotesRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getQuotesRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+        $query="select accountid from vtiger_quotes where quoteid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $accountid=$adb->query_result($result,0,'accountid');
+	$log->debug("Exiting getQuotesRelatedAccounts method ...");
+        return $accountid;
+}
+
+/** Function to get Quotes related Potentials
+  * @param $record_id -- record id :: Type integer
+  * @returns $potid -- potid:: Type integer
+  */
+
+function getQuotesRelatedPotentials($record_id)
+{
+	global $log;
+	$log->debug("Entering getQuotesRelatedPotentials(".$record_id.") method ...");
+	global $adb;
+        $query="select potentialid from vtiger_quotes where quoteid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $potid=$adb->query_result($result,0,'potentialid');
+	$log->debug("Exiting getQuotesRelatedPotentials method ...");
+        return $potid;
+}
+
+/** Function to get Quotes related Potentials
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+
+function getSalesOrderRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getSalesOrderRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+        $query="select accountid from vtiger_salesorder where salesorderid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $accountid=$adb->query_result($result,0,'accountid');
+	$log->debug("Exiting getSalesOrderRelatedAccounts method ...");
+        return $accountid;
+}
+
+/** Function to get SalesOrder related Potentials
+  * @param $record_id -- record id :: Type integer
+  * @returns $potid -- potid:: Type integer
+  */
+
+function getSalesOrderRelatedPotentials($record_id)
+{
+	global $log;
+	$log->debug("Entering getSalesOrderRelatedPotentials(".$record_id.") method ...");
+	global $adb;
+        $query="select potentialid from vtiger_salesorder where salesorderid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $potid=$adb->query_result($result,0,'potentialid');
+	$log->debug("Exiting getSalesOrderRelatedPotentials method ...");
+        return $potid;
+}
+/** Function to get SalesOrder related Quotes
+  * @param $record_id -- record id :: Type integer
+  * @returns $qtid -- qtid:: Type integer
+  */
+
+function getSalesOrderRelatedQuotes($record_id)
+{
+	global $log;
+	$log->debug("Entering getSalesOrderRelatedQuotes(".$record_id.") method ...");
+	global $adb;
+        $query="select quoteid from vtiger_salesorder where salesorderid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $qtid=$adb->query_result($result,0,'quoteid');
+	$log->debug("Exiting getSalesOrderRelatedQuotes method ...");
+        return $qtid;
+}
+
+/** Function to get Invoice related Accounts
+  * @param $record_id -- record id :: Type integer
+  * @returns $accountid -- accountid:: Type integer
+  */
+
+function getInvoiceRelatedAccounts($record_id)
+{
+	global $log;
+	$log->debug("Entering getInvoiceRelatedAccounts(".$record_id.") method ...");
+	global $adb;
+        $query="select accountid from vtiger_invoice where invoiceid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $accountid=$adb->query_result($result,0,'accountid');
+	$log->debug("Exiting getInvoiceRelatedAccounts method ...");
+        return $accountid;
+}
+/** Function to get Invoice related SalesOrder
+  * @param $record_id -- record id :: Type integer
+  * @returns $soid -- soid:: Type integer
+  */
+
+function getInvoiceRelatedSalesOrder($record_id)
+{
+	global $log;
+	$log->debug("Entering getInvoiceRelatedSalesOrder(".$record_id.") method ...");
+	global $adb;
+        $query="select salesorderid from vtiger_invoice where invoiceid=?";
+        $result=$adb->pquery($query, array($record_id));
+        $soid=$adb->query_result($result,0,'salesorderid');
+	$log->debug("Exiting getInvoiceRelatedSalesOrder method ...");
+        return $soid;
+}
+
+/**
+* the function is like unescape in javascript
+* added by dingjianting on 2006-10-1 for picklist editor
+*/
+function utf8RawUrlDecode ($source) {
+    global $default_charset;
+    $decodedStr = "";
+    $pos = 0;
+    $len = strlen ($source);
+    while ($pos < $len) {
+        $charAt = substr ($source, $pos, 1);
+        if ($charAt == '%') {
+            $pos++;
+            $charAt = substr ($source, $pos, 1);
+            if ($charAt == 'u') {
+                // we got a unicode character
+                $pos++;
+                $unicodeHexVal = substr ($source, $pos, 4);
+                $unicode = hexdec ($unicodeHexVal);
+                $entity = "&#". $unicode . ';';
+                $decodedStr .= utf8_encode ($entity);
+                $pos += 4;
+		}
+            else {
+                // we have an escaped ascii character
+                $hexVal = substr ($source, $pos, 2);
+                $decodedStr .= chr (hexdec ($hexVal));
+                $pos += 2;
+ }
+	} else {
+            $decodedStr .= $charAt;
+            $pos++;
+        }
+	}
+    if(strtolower($default_charset) == 'utf-8')
+	    return html_to_utf8($decodedStr);
+    else
+	    return $decodedStr;
+    //return html_to_utf8($decodedStr);
+}
+
+/**
+*simple HTML to UTF-8 conversion:
+  */
+function html_to_utf8 ($data)
+{
+	return preg_replace("/\\&\\#([0-9]{3,10})\\;/e", '_html_to_utf8("\\1")', $data);
+	}
+
+function _html_to_utf8 ($data)
+	{
+	if ($data > 127)
+		{
+		$i = 5;
+		while (($i--) > 0)
+		{
+			if ($data != ($a = $data % ($p = pow(64, $i))))
+	{
+				$ret = chr(base_convert(str_pad(str_repeat(1, $i + 1), 8, "0"), 2, 10) + (($data - $a) / $p));
+				for ($i; $i > 0; $i--)
+					$ret .= chr(128 + ((($data % pow(64, $i)) - ($data % ($p = pow(64, $i - 1)))) / $p));
+				break;
+	}
+}
+	}
+	else
+		$ret = "&#$data;";
+	return $ret;
+	}
+
+// Return Question mark
+function _questionify($v){
+	return "?";
+}
+
+/**
+* Function to generate question marks for a given list of items
+  */
+function generateQuestionMarks($items_list) {
+	// array_map will call the function specified in the first parameter for every element of the list in second parameter
+	if (is_array($items_list)) {
+		return implode(",", array_map("_questionify", $items_list));
+	} else {
+		return implode(",", array_map("_questionify", explode(",", $items_list)));
+}
+}
+
+/**
+* Function to find the UI type of a field based on the uitype id
+  */
+function is_uitype($uitype, $reqtype) {
+	$ui_type_arr = array(
+		'_date_' => array(5, 6, 23, 70),
+		'_picklist_' => array(15, 16, 52, 53, 54, 55, 59, 62, 63, 66, 68, 76, 77, 78, 80, 98, 101, 115, 357),
+		'_users_list_' => array(52),
+	);
+
+	if ($ui_type_arr[$reqtype] != null) {
+		if (in_array($uitype, $ui_type_arr[$reqtype])) {
+			return true;
+	}
+	}
+	return false;
+	}
+/**
+ * Function to escape quotes
+ * @param $value - String in which single quotes have to be replaced.
+ * @return Input string with single quotes escaped.
+  */
+function escape_single_quotes($value) {
+	if (isset($value)) $value = str_replace("'", "\'", $value);
+	return $value;
+}
+
+/**
+ * Function to format the input value for SQL like clause.
+ * @param $str - Input string value to be formatted.
+ * @param $flag - By default set to 0 (Will look for cases %string%).
+ *                If set to 1 - Will look for cases %string.
+ *                If set to 2 - Will look for cases string%.
+ * @return String formatted as per the SQL like clause requirement
+  */
+function formatForSqlLike($str, $flag=0,$is_field=false) {
+	global $adb;
+	if (isset($str)) {
+		if($is_field==false){
+			$str = str_replace('%', '\%', $str);
+			$str = str_replace('_', '\_', $str);
+			if ($flag == 0) {
+                // If value what to search is null then we should not add % which will fail
+                if(empty($str))
+                    $str = ''.$str.'';
+                else
+                    $str = '%'. $str .'%';
+			} elseif ($flag == 1) {
+				$str = '%'. $str;
+			} elseif ($flag == 2) {
+				$str = $str .'%';
+			}
+		} else {
+			if ($flag == 0) {
+				$str = 'concat("%",'. $str .',"%")';
+			} elseif ($flag == 1) {
+				$str = 'concat("%",'. $str .')';
+			} elseif ($flag == 2) {
+				$str = 'concat('. $str .',"%")';
+			}
+		}
+	}
+	return $adb->sql_escape_string($str);
+}
+
+/**	Function used to get all the picklists and their values for a module
+	@param string $module - Module name to which the list of picklists and their values needed
+	@return array $fieldlists - Array of picklists and their values
+**/
+function getAccessPickListValues($module)
+{
+	global $adb, $log;
+	global $current_user;
+	$log->debug("Entering into function getAccessPickListValues($module)");
+
+	$id = getTabid($module);
+	$query = "select fieldname,columnname,fieldid,fieldlabel,tabid,uitype from vtiger_field where tabid = ? and uitype in ('15','33','55') and vtiger_field.presence in (0,2)";
+	$result = $adb->pquery($query, array($id));
+
+	$roleid = $current_user->roleid;
+	$subrole = getRoleSubordinates($roleid);
+
+	if(!empty($subrole) && (count($subrole)> 0))
+{
+		$roleids = $subrole;
+		array_push($roleids, $roleid);
+	}
+	else
+	{
+		$roleids = $roleid;
+	}
+
+	$temp_status = Array();
+	for($i=0;$i < $adb->num_rows($result);$i++)
+{
+		$fieldname = Vtiger_Util_Helper::validateStringForSql($adb->query_result($result,$i,"fieldname"));
+		$fieldlabel = $adb->query_result($result,$i,"fieldlabel");
+		$columnname = $adb->query_result($result,$i,"columnname");
+		$tabid = $adb->query_result($result,$i,"tabid");
+		$uitype = $adb->query_result($result,$i,"uitype");
+
+		$keyvalue = $columnname;
+		$fieldvalues = Array();
+		if (!empty($roleids) && (count($roleids) > 1))
+	{
+			$mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid in (\"". implode($roleids,"\",\"") ."\") and picklistid in (select picklistid from vtiger_$fieldname) order by sortid asc";
+	}
+	else
+	{
+			$mulsel="select distinct $fieldname from vtiger_$fieldname inner join vtiger_role2picklist on vtiger_role2picklist.picklistvalueid = vtiger_$fieldname.picklist_valueid where roleid ='".$roleid."' and picklistid in (select picklistid from vtiger_$fieldname) order by sortid asc";
+	}
+		if($fieldname != 'firstname')
+			$mulselresult = $adb->pquery($mulsel, array());
+		for($j=0;$j < $adb->num_rows($mulselresult);$j++)
+		{
+			$fieldvalues[] = $adb->query_result($mulselresult,$j,$fieldname);
+}
+		$field_count = count($fieldvalues);
+		if($uitype == 15 && $field_count > 0 && ($fieldname == 'taskstatus' || $fieldname == 'eventstatus'))
+		{
+			$temp_count =count($temp_status[$keyvalue]);
+			if($temp_count > 0)
+{
+				for($t=0;$t < $field_count;$t++)
+	{
+					$temp_status[$keyvalue][($temp_count+$t)] = $fieldvalues[$t];
+				}
+				$fieldvalues = $temp_status[$keyvalue];
+	}
+			else
+				$temp_status[$keyvalue] = $fieldvalues;
+	}
+		if($uitype == 33)
+			$fieldlists[1][$keyvalue] = $fieldvalues;
+		else if($uitype == 55 && $fieldname == 'salutationtype')
+			$fieldlists[$keyvalue] = $fieldvalues;
+		else if($uitype == 15)
+			$fieldlists[$keyvalue] = $fieldvalues;
+	}
+	$log->debug("Exit from function getAccessPickListValues($module)");
+
+	return $fieldlists;
+	}
+
+function get_config_status() {
+	global $default_charset;
+	if(strtolower($default_charset) == 'utf-8')
+		$config_status=1;
+	else
+		$config_status=0;
+	return $config_status;
+        }
+
+function getMigrationCharsetFlag() {
+	global $adb;
+
+	if(!$adb->isPostgres())
+		$db_status=$adb->check_db_utf8_support();
+	$config_status=get_config_status();
+
+	if ($db_status == $config_status) {
+		if ($db_status == 1) { // Both are UTF-8
+			$db_migration_status = MIG_CHARSET_PHP_UTF8_DB_UTF8;
+		} else { // Both are Non UTF-8
+			$db_migration_status = MIG_CHARSET_PHP_NONUTF8_DB_NONUTF8;
+}
+		} else {
+			if ($db_status == 1) { // Database charset is UTF-8 and CRM charset is Non UTF-8
+				$db_migration_status = MIG_CHARSET_PHP_NONUTF8_DB_UTF8;
+		} else { // Database charset is Non UTF-8 and CRM charset is UTF-8
+			$db_migration_status = MIG_CHARSET_PHP_UTF8_DB_NONUTF8;
+	}
+	}
+	return $db_migration_status;
+}
+
+/** Function to get on clause criteria for duplicate check queries */
+function get_on_clause($field_list,$uitype_arr,$module)
+{
+	$field_array = explode(",",$field_list);
+	$ret_str = '';
+	$i=1;
+	foreach($field_array as $fld)
+	{
+		$sub_arr = explode(".",$fld);
+		$tbl_name = $sub_arr[0];
+		$col_name = $sub_arr[1];
+		$fld_name = $sub_arr[2];
+
+		$ret_str .= " ifnull($tbl_name.$col_name,'null') = ifnull(temp.$col_name,'null')";
+
+		if (count($field_array) != $i) $ret_str .= " and ";
+		$i++;
+	}
+	return $ret_str;
+}
+
+// Update all the data refering to currency $old_cur to $new_cur
+function transferCurrency($old_cur, $new_cur) {
+
+	// Transfer User currency to new currency
+	transferUserCurrency($old_cur, $new_cur);
+
+	// Transfer Product Currency to new currency
+	transferProductCurrency($old_cur, $new_cur);
+
+	// Transfer PriceBook Currency to new currency
+	transferPriceBookCurrency($old_cur, $new_cur);
+    
+    // Transfer Services Currency to new currency
+    transferServicesCurrency($old_cur, $new_cur);
+}
+
+// Function to transfer the users with currency $old_cur to $new_cur as currency
+function transferUserCurrency($old_cur, $new_cur) {
+	global $log, $adb, $current_user;
+	$log->debug("Entering function transferUserCurrency...");
+
+	$sql = 'UPDATE vtiger_users SET currency_id=? WHERE currency_id=?';
+	$adb->pquery($sql, array($new_cur, $old_cur));
+
+	$currentUserId = $current_user->id;
+	$current_user->retrieve_entity_info($currentUserId, 'Users');
+	unset(Users_Record_Model::$currentUserModels[$currentUserId]);
+
+	require_once('modules/Users/CreateUserPrivilegeFile.php'); 
+	createUserPrivilegesfile($currentUserId);
+
+	$log->debug("Exiting function transferUserCurrency...");
+}
+
+// Function to transfer the products with currency $old_cur to $new_cur as currency
+function transferProductCurrency($old_cur, $new_cur) {
+	global $log, $adb;
+	$log->debug("Entering function updateProductCurrency...");
+	$prod_res = $adb->pquery("select productid from vtiger_products where currency_id = ?", array($old_cur));
+	$numRows = $adb->num_rows($prod_res);
+	$prod_ids = array();
+	for($i=0;$i<$numRows;$i++) {
+		$prod_ids[] = $adb->query_result($prod_res,$i,'productid');
+	}
+	if(!empty($prod_ids) && (count($prod_ids) > 0)) {
+		$prod_price_list = getPricesForProducts($new_cur,$prod_ids);
+
+		for($i=0;$i<count($prod_ids);$i++) {
+			$product_id = $prod_ids[$i];
+			$unit_price = $prod_price_list[$product_id];
+			$query = "update vtiger_products set currency_id=?, unit_price=? where productid=?";
+			$params = array($new_cur, $unit_price, $product_id);
+			$adb->pquery($query, $params);
+		}
+}
+	$log->debug("Exiting function updateProductCurrency...");
+}
+
+// Function to transfer the pricebooks with currency $old_cur to $new_cur as currency
+// and to update the associated products with list price in $new_cur currency
+function transferPriceBookCurrency($old_cur, $new_cur) {
+	global $log, $adb;
+	$log->debug("Entering function updatePriceBookCurrency...");
+	$pb_res = $adb->pquery("select pricebookid from vtiger_pricebook where currency_id = ?", array($old_cur));
+	$numRows = $adb->num_rows($pb_res);
+	$pb_ids = array();
+	for($i=0;$i<$numRows;$i++) {
+		$pb_ids[] = $adb->query_result($pb_res,$i,'pricebookid');
+}
+
+	if(!empty($pb_ids) && (count($pb_ids) > 0)) {
+		require_once('modules/PriceBooks/PriceBooks.php');
+
+		for($i=0;$i<count($pb_ids);$i++) {
+			$pb_id = $pb_ids[$i];
+			$focus = new PriceBooks();
+			$focus->id = $pb_id;
+			$focus->mode = 'edit';
+			$focus->retrieve_entity_info($pb_id, "PriceBooks");
+			$focus->column_fields['currency_id'] = $new_cur;
+			$focus->save("PriceBooks");
+}
+}
+
+	$log->debug("Exiting function updatePriceBookCurrency...");
+}
+
+//To transfer all services after deleting currency to transfered currency
+function transferServicesCurrency($old_cur, $new_cur) {
+    global $log, $adb;
+    $log->debug("Entering function updateServicesCurrency...");
+	$ser_res = $adb->pquery('SELECT serviceid FROM vtiger_service WHERE currency_id = ?', array($old_cur));
+    $numRows = $adb->num_rows($ser_res);
+    $ser_ids = array();
+    for ($i = 0; $i < $numRows; $i++) {
+        $ser_ids[] = $adb->query_result($ser_res, $i, 'serviceid');
+    }
+    if (!empty($ser_ids) && (count($ser_ids) > 0)) {
+        $ser_price_list = getPricesForProducts($new_cur, $ser_ids, 'Services');
+        for ($i = 0; $i < count($ser_ids); $i++) {
+            $service_id = $ser_ids[$i];
+            $unit_price = $ser_price_list[$service_id];
+			$query = 'UPDATE vtiger_service SET currency_id=?, unit_price=? WHERE serviceid=?';
+            $params = array($new_cur, $unit_price, $service_id);
+            $adb->pquery($query, $params);
+        }
+    }
+    $log->debug("Exiting function updateServicesCurrency...");
+}
+
+/**
+ * this function searches for a given number in vtiger and returns the callerInfo in an array format
+ * currently the search is made across only leads, accounts and contacts modules
+ *
+ * @param $number - the number whose information you want
+ * @return array in format array(name=>callername, module=>module, id=>id);
+  */
+function getCallerInfo($number){
+	global $adb, $log;
+	if(empty($number)){
+		return false;
+}
+	$caller = "Unknown Number (Unknown)"; //declare caller as unknown in beginning
+
+	$params = array();
+	$name = array('Contacts', 'Accounts', 'Leads');
+	foreach ($name as $module) {
+		$focus = CRMEntity::getInstance($module);
+		$query = $focus->buildSearchQueryForFieldTypes(11, $number);
+		if(empty($query)) return;
+
+		$result = $adb->pquery($query, array());
+		if($adb->num_rows($result) > 0 ){
+			$callerName = $adb->query_result($result, 0, "name");
+			$callerID = $adb->query_result($result,0,'id');
+			$data = array("name"=>$callerName, "module"=>$module, "id"=>$callerID);
+			return $data;
+		}
+	}
+	return false;
+}
+
+/**
+ * this function returns the value of use_asterisk from the database for the current user
+ * @param string $id - the id of the current user
+ */
+function get_use_asterisk($id){
+	global $adb;
+	if(!vtlib_isModuleActive('PBXManager') || isPermitted('PBXManager', 'index') == 'no'){
+		return false;
+	}
+	$sql = "select * from vtiger_asteriskextensions where userid = ?";
+	$result = $adb->pquery($sql, array($id));
+	if($adb->num_rows($result)>0){
+		$use_asterisk = $adb->query_result($result, 0, "use_asterisk");
+		$asterisk_extension = $adb->query_result($result, 0, "asterisk_extension");
+		if($use_asterisk == 0 || empty($asterisk_extension)){
+			return 'false';
+		}else{
+			return 'true';
+	}
+	}else{
+		return 'false';
+	}
+}
+
+/**
+ * this function adds a record to the callhistory module
+ *
+ * @param string $userExtension - the extension of the current user
+ * @param string $callfrom - the caller number
+ * @param string $callto - the called number
+ * @param string $status - the status of the call (outgoing/incoming/missed)
+ * @param object $adb - the peardatabase object
+  */
+function addToCallHistory($userExtension, $callfrom, $callto, $status, $adb, $useCallerInfo){
+	$sql = "select * from vtiger_asteriskextensions where asterisk_extension=?";
+	$result = $adb->pquery($sql,array($userExtension));
+	$userID = $adb->query_result($result, 0, "userid");
+	if(empty($userID)) {
+		// we have observed call to extension not configured in Vtiger will returns NULL
+		return;
+	}
+	if(empty($callfrom)){
+		$callfrom = "Unknown";
+	}
+	if(empty($callto)){
+		$callto = "Unknown";
+}
+
+	if($status == 'outgoing'){
+		//call is from user to record
+		$sql = "select * from vtiger_asteriskextensions where asterisk_extension=?";
+		$result = $adb->pquery($sql, array($callfrom));
+		if($adb->num_rows($result)>0){
+			$userid = $adb->query_result($result, 0, "userid");
+			$callerName = getUserFullName($userid);
+		}
+
+		$receiver = $useCallerInfo;
+		if(empty($receiver)){
+			$receiver = "Unknown";
+		}else{
+			$receiver = "<a href='index.php?module=".$receiver['module']."&action=DetailView&record=".$receiver['id']."'>".$receiver['name']."</a>";
+		}
+	}else{
+		//call is from record to user
+		$sql = "select * from vtiger_asteriskextensions where asterisk_extension=?";
+		$result = $adb->pquery($sql,array($callto));
+		if($adb->num_rows($result)>0){
+			$userid = $adb->query_result($result, 0, "userid");
+			$receiver = getUserFullName($userid);
+		}
+		$callerName = $useCallerInfo;
+		if(empty($callerName)){
+			$callerName = "Unknown $callfrom";
+		}else{
+			$callerName = "<a href='index.php?module=".$callerName['module']."&action=DetailView&record=".$callerName['id']."'>".decode_html($callerName['name'])."</a>";
+}
+}
+
+	$crmID = $adb->getUniqueID('vtiger_crmentity');
+	$timeOfCall = date('Y-m-d H:i:s');
+
+	$query = "INSERT INTO vtiger_crmentity (crmid,smcreatorid,smownerid,modifiedby,setype,description,createdtime,
+			modifiedtime,viewedtime,status,version,presence,deleted,label) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
+	$adb->pquery($query, array($crmID, $userID, $userID, 0, "PBXManager", "", $timeOfCall, $timeOfCall, NULL, NULL, 0, 1, 0, $callerName));
+
+	$sql = "insert into vtiger_pbxmanager (pbxmanagerid,callfrom,callto,timeofcall,status)values (?,?,?,?,?)";
+	$params = array($crmID, $callerName, $receiver, $timeOfCall, $status);
+	$adb->pquery($sql, $params);
+	return $crmID;
+}
+//functions for asterisk integration end
+
+/* Function to get the related tables data
+ * @param - $module - Primary module name
+ * @param - $secmodule - Secondary module name
+ * return Array $rel_array tables and fields to be compared are sent
+ * */
+function getRelationTables($module,$secmodule){
+	global $adb;
+	$primary_obj = CRMEntity::getInstance($module);
+	$secondary_obj = CRMEntity::getInstance($secmodule);
+
+	$ui10_query = $adb->pquery("SELECT vtiger_field.tabid AS tabid,vtiger_field.tablename AS tablename, vtiger_field.columnname AS columnname FROM vtiger_field INNER JOIN vtiger_fieldmodulerel ON vtiger_fieldmodulerel.fieldid = vtiger_field.fieldid WHERE (vtiger_fieldmodulerel.module=? AND vtiger_fieldmodulerel.relmodule=?) OR (vtiger_fieldmodulerel.module=? AND vtiger_fieldmodulerel.relmodule=?)",array($module,$secmodule,$secmodule,$module));
+		if($adb->num_rows($ui10_query)>0){
+			$ui10_tablename = $adb->query_result($ui10_query,0,'tablename');
+			$ui10_columnname = $adb->query_result($ui10_query,0,'columnname');
+			$ui10_tabid = $adb->query_result($ui10_query,0,'tabid');
+
+			if($primary_obj->table_name == $ui10_tablename){
+				$reltables = array($ui10_tablename=>array("".$primary_obj->table_index."","$ui10_columnname"));
+			} else if($secondary_obj->table_name == $ui10_tablename){
+				$reltables = array($ui10_tablename=>array("$ui10_columnname","".$secondary_obj->table_index.""),"".$primary_obj->table_name."" => "".$primary_obj->table_index."");
+			} else {
+				if(isset($secondary_obj->tab_name_index[$ui10_tablename])){
+					$rel_field = $secondary_obj->tab_name_index[$ui10_tablename];
+					$reltables = array($ui10_tablename=>array("$ui10_columnname","$rel_field"),"".$primary_obj->table_name."" => "".$primary_obj->table_index."");
+				} else {
+					$rel_field = $primary_obj->tab_name_index[$ui10_tablename];
+					$reltables = array($ui10_tablename=>array("$rel_field","$ui10_columnname"),"".$primary_obj->table_name."" => "".$primary_obj->table_index."");
+				}
+			}
+	}else {
+		if(method_exists($primary_obj,'setRelationTables')){
+			$reltables = $primary_obj->setRelationTables($secmodule);
+		} else {
+			$reltables = '';
+		}
+	}
+	if(is_array($reltables) && !empty($reltables)){
+		$rel_array = $reltables;
+	} else {
+		$rel_array = array("vtiger_crmentityrel"=>array("crmid","relcrmid"),"".$primary_obj->table_name."" => "".$primary_obj->table_index."");
+	}
+	return $rel_array;
+}
+
+/**
+ * This function returns no value but handles the delete functionality of each entity.
+ * Input Parameter are $module - module name, $return_module - return module name, $focus - module object, $record - entity id, $return_id - return entity id.
+  */
+function DeleteEntity($module,$return_module,$focus,$record,$return_id) {
+	global $log;
+	$log->debug("Entering DeleteEntity method ($module, $return_module, $record, $return_id)");
+
+	if ($module != $return_module && !empty($return_module) && !empty($return_id)) {
+		$focus->unlinkRelationship($record, $return_module, $return_id);
+		$focus->trackUnLinkedInfo($return_module, $return_id, $module, $record);
+	} else {
+		$focus->trash($module, $record);
+	}
+	$log->debug("Exiting DeleteEntity method ...");
+}
+
+/**
+ * Function to related two records of different entity types
+  */
+function relateEntities($focus, $sourceModule, $sourceRecordId, $destinationModule, $destinationRecordIds) {
+    $db = PearDatabase::getInstance();
+    $em = new VTEventsManager($db);
+    $data = array('sourceModule'=>$sourceModule, 'sourceRecordId'=>$sourceRecordId,
+                  'destinationModule'=>$destinationModule,'destinationRecordIds'=>$destinationRecordIds);
+    $em->triggerEvent("vtiger.entity.beforerelate", $data);
+	if(!is_array($destinationRecordIds)) $destinationRecordIds = Array($destinationRecordIds);
+	print_r("hi");die;
+	foreach($destinationRecordIds as $destinationRecordId) {
+		$focus->save_related_module($sourceModule, $sourceRecordId, $destinationModule, $destinationRecordId);
+		$focus->trackLinkedInfo($sourceModule, $sourceRecordId, $destinationModule, $destinationRecordId);
+	}
+    
+    $em->triggerEvent("vtiger.entity.afterrelate", $data);
+}
+
+/**
+ * Track install/update vtlib module in current run.
+ */
+$_installOrUpdateVtlibModule = array();
+
+/* Function to install Vtlib Compliant modules
+ * @param - $packagename - Name of the module
+ * @param - $packagepath - Complete path to the zip file of the Module
+  */
+function installVtlibModule($packagename, $packagepath, $customized=false) {
+	global $log, $Vtiger_Utils_Log, $_installOrUpdateVtlibModule;
+	if(!file_exists($packagepath)) return;
+
+	if (isset($_installOrUpdateVtlibModule[$packagename.$packagepath])) return;
+	$_installOrUpdateVtlibModule[$packagename.$packagepath] = 'install';
+
+	require_once('vtlib/Vtiger/Package.php');
+	require_once('vtlib/Vtiger/Module.php');
+	$Vtiger_Utils_Log = defined('INSTALLATION_MODE_DEBUG')? INSTALLATION_MODE_DEBUG : true;
+	$package = new Vtiger_Package();
+
+	if($package->isLanguageType($packagepath)) {
+		$package = new Vtiger_Language();
+		$package->import($packagepath, true);
+		return;
+}
+	$module = $package->getModuleNameFromZip($packagepath);
+
+	// Customization
+	if($package->isLanguageType()) {
+		require_once('vtlib/Vtiger/Language.php');
+		$languagePack = new Vtiger_Language();
+		@$languagePack->import($packagepath, true);
+		return;
+}
+	// END
+
+	$module_exists = false;
+	$module_dir_exists = false;
+	if($module == null) {
+		$log->fatal("$packagename Module zipfile is not valid!");
+	} else if(Vtiger_Module::getInstance($module)) {
+		$log->fatal("$module already exists!");
+		$module_exists = true;
+	}
+	if($module_exists == false) {
+		$log->debug("$module - Installation starts here");
+		$package->import($packagepath, true);
+		$moduleInstance = Vtiger_Module::getInstance($module);
+		if (empty($moduleInstance)) {
+			$log->fatal("$module module installation failed!");
+		}
+	}
+}
+
+/* Function to update Vtlib Compliant modules
+ * @param - $module - Name of the module
+ * @param - $packagepath - Complete path to the zip file of the Module
+ */
+function updateVtlibModule($module, $packagepath) {
+	global $log, $_installOrUpdateVtlibModule;
+	if(!file_exists($packagepath)) return;
+
+	if (isset($_installOrUpdateVtlibModule[$module.$packagepath])) return;
+	$_installOrUpdateVtlibModule[$module.$packagepath] = 'update';
+
+	require_once('vtlib/Vtiger/Package.php');
+	require_once('vtlib/Vtiger/Module.php');
+	$Vtiger_Utils_Log = defined('INSTALLATION_MODE_DEBUG')? INSTALLATION_MODE_DEBUG : true;
+	$package = new Vtiger_Package();
+
+	if($package->isLanguageType($packagepath)) {
+		require_once('vtlib/Vtiger/Language.php');
+		$languagePack = new Vtiger_Language();
+		$languagePack->update(null, $packagepath, true);
+		return;
+	}
+
+	if($module == null) {
+		$log->fatal("Module name is invalid");
+	} else {
+		$moduleInstance = Vtiger_Module::getInstance($module);
+		if($moduleInstance || $package->isModuleBundle($packagepath)) {
+			$log->debug("$module - Module instance found - Update starts here");
+			$package->update($moduleInstance, $packagepath);
+		} else {
+			$log->fatal("$module doesn't exists!");
+		}
+	}
+}
+
+/**
+ * this function checks if a given column exists in a given table or not
+ * @param string $columnName - the columnname
+ * @param string $tableName - the tablename
+ * @return boolean $status - true if column exists; false otherwise
+ */
+function columnExists($columnName, $tableName){
+	global $adb;
+	$columnNames = array();
+	$columnNames = $adb->getColumnNames($tableName);
+
+	if(in_array($columnName, $columnNames)){
+		return true;
+	}else{
+		return false;
+	}
+}
+
+/* To get modules list for which work flow and field formulas is permitted*/
+function com_vtGetModules($adb) {
+	$sql="select distinct vtiger_field.tabid, name
+		from vtiger_field
+		inner join vtiger_tab
+			on vtiger_field.tabid=vtiger_tab.tabid
+		where vtiger_field.tabid not in(9,10,16,15,29) and vtiger_tab.presence = 0 and vtiger_tab.isentitytype=1";
+	$it = new SqlResultIterator($adb, $adb->pquery($sql, array()));
+	$modules = array();
+	foreach($it as $row) {
+		if(isPermitted($row->name,'index') == "yes") {
+			$modules[$row->name] = getTranslatedString($row->name);
+		}
+	}
+	return $modules;
+        }
+
+/**
+ * Function to check if a given record exists (not deleted)
+ * @param integer $recordId - record id
+ */
+function isRecordExists($recordId) {
+	global $adb;
+	$query = "SELECT crmid FROM vtiger_crmentity where crmid=? AND deleted=0";
+	$result = $adb->pquery($query, array($recordId));
+	if ($adb->num_rows($result)) {
+		return true;
+	}
+	return false;
+}
+
+/** Function to set date values compatible to database (YY_MM_DD)
+  * @param $value -- value :: Type string
+  * @returns $insert_date -- insert_date :: Type string
+  */
+function getValidDBInsertDateValue($value) {
+	
+	global $log;
+	$log->debug("Entering getValidDBInsertDateValue(".$value.") method ...");
+	$value = trim($value);
+	$delim = array('/','.');
+	foreach ($delim as $delimiter){
+		$x = strpos($value, $delimiter);
+		
+		if($x === false) continue;
+		else{
+			$value=str_replace($delimiter, '-', $value);
+			break;
+		}
+	}
+	global $current_user;
+	$formate=$current_user->date_format;
+	list($d,$m,$y) = explode('-',$value);
+	if(strlen($d)==4||$formate=='mm-dd-yyyy'){
+		list($y,$m,$d)=explode('-',$value);
+	}
+	if(strlen($y) == 1) $y = '0'.$y;
+	if(strlen($m) == 1) $m = '0'.$m;
+	if(strlen($d) == 1) $d = '0'.$d;
+	$value = implode('-', array($y,$m,$d));
+
+	
+	
+	if(strlen($y)<4){
+		$insert_date = DateTimeField::convertToDBFormat($value);
+	} else {
+		$insert_date = $value;
+	}
+	
+	
+
+	if (preg_match("/^[0-9]{2,4}[-][0-1]{1,2}?[0-9]{1,2}[-][0-3]{1,2}?[0-9]{1,2}$/", $insert_date) == 0) {
+		return '';
+	}
+
+	$log->debug("Exiting getValidDBInsertDateValue method ...");
+	return $insert_date;
+		}
+
+function getValidDBInsertDateTimeValue($value) {
+	global $log;
+	
+	$value = trim($value);
+	$log->fatal($value);
+	$valueList = explode(' ',$value);
+	$log->fatal($valueList);
+    //checking array count = 3 if datatime format is 12hr.
+	if(is_array($valueList) && (count($valueList) == 2 || count($valueList) == 3)) {
+		$dbDateValue = getValidDBInsertDateValue($valueList[0]);
+		$dbTimeValue = $valueList[1];
+		if(!empty($dbTimeValue) && strpos($dbTimeValue, ':') === false) {
+			$dbTimeValue = $dbTimeValue.':';
+		}
+		$timeValueLength = strlen($dbTimeValue);
+		if(!empty($dbTimeValue) &&  strrpos($dbTimeValue, ':') == ($timeValueLength-1)) {
+			$dbTimeValue = $dbTimeValue.'00';
+		}
+		try {
+			$dateTime = new DateTimeField($dbDateValue.' '.$dbTimeValue);
+			return $dateTime->getDBInsertDateTimeValue();
+		} catch (Exception $ex) {
+			return '';
+		}
+	} elseif(is_array($valueList) && count($valueList) == 1) {
+		return getValidDBInsertDateValue($value);
+	}
+}
+
+/** Function to set the PHP memory limit to the specified value, if the memory limit set in the php.ini is less than the specified value
+ * @param $newvalue -- Required Memory Limit
+ */
+function _phpset_memorylimit_MB($newvalue) {
+    $current = @ini_get('memory_limit');
+    if(preg_match("/(.*)M/", $current, $matches)) {
+        // Check if current value is less then new value
+        if($matches[1] < $newvalue) {
+            @ini_set('memory_limit', "{$newvalue}M");
+	}
+	}
+	}
+
+/** Function to sanitize the upload file name when the file name is detected to have bad extensions
+ * @param String -- $fileName - File name to be sanitized
+ * @return String - Sanitized file name
+ */
+function sanitizeUploadFileName($fileName, $badFileExtensions) {
+
+	$fileName = preg_replace('/\s+/', '_', $fileName);//replace space with _ in filename
+	$fileName = rtrim($fileName, '\\/<>?*:"<>|');
+
+	$fileNameParts = explode(".", $fileName);
+	$countOfFileNameParts = count($fileNameParts);
+	$badExtensionFound = false;
+
+	for ($i=0;$i<$countOfFileNameParts;++$i) {
+		$partOfFileName = $fileNameParts[$i];
+		if(in_array(strtolower($partOfFileName), $badFileExtensions)) {
+			$badExtensionFound = true;
+			$fileNameParts[$i] = $partOfFileName . 'file';
+	}
+	}
+
+	$newFileName = implode(".", $fileNameParts);
+
+	if ($badExtensionFound) {
+		$newFileName .= ".txt";
+		}
+	return $newFileName;
+		}
+
+/** Function to get the tab meta information for a given id
+  * @param $tabId -- tab id :: Type integer
+  * @returns $tabInfo -- array of preference name to preference value :: Type array
+  */
+function getTabInfo($tabId) {
+	global $adb;
+
+	$tabInfoResult = $adb->pquery('SELECT prefname, prefvalue FROM vtiger_tab_info WHERE tabid=?', array($tabId));
+	$tabInfo = array();
+	for($i=0; $i<$adb->num_rows($tabInfoResult); ++$i) {
+		$prefName = $adb->query_result($tabInfoResult, $i, 'prefname');
+		$prefValue = $adb->query_result($tabInfoResult, $i, 'prefvalue');
+		$tabInfo[$prefName] = $prefValue;
+}
+}
+
+/** Function to return block name
+ * @param Integer -- $blockid
+ * @return String - Block Name
+ */
+function getBlockName($blockid) {
+	global $adb;
+
+	$blockname = VTCacheUtils::lookupBlockLabelWithId($blockid);
+
+	if(!empty($blockid) && $blockname === false){
+		$block_res = $adb->pquery('SELECT blocklabel FROM vtiger_blocks WHERE blockid = ?',array($blockid));
+		if($adb->num_rows($block_res)){
+			$blockname = $adb->query_result($block_res,0,'blocklabel');
+		} else {
+			$blockname = '';
+		}
+		VTCacheUtils::updateBlockLabelWithId($blockname, $blockid);
+	}
+	return $blockname;
+}
+
+function validateAlphaNumericInput($string){
+    preg_match('/^[\w _\-]+$/', $string, $matches);
+    if(count($matches) == 0) {
+        return false;
+	}
+    return true;
+}
+
+function validateServerName($string){
+    preg_match('/^[\w\-\.\\/:]+$/', $string, $matches);
+    if(count($matches) == 0) {
+        return false;
+		}
+    return true;
+	}
+
+function validateEmailId($string){
+    preg_match('/^[a-zA-Z0-9]+([\_\-\.]*[a-zA-Z0-9]+[\_\-]?)*@[a-zA-Z0-9]+([\_\-]?[a-zA-Z0-9]+)*\.+([\-\_]?[a-zA-Z0-9])+(\.?[a-zA-Z0-9]+)*$/', $string, $matches);
+    if(count($matches) == 0) {
+        return false;
+    }
+		return true;
+}
+
+/**
+* Function to get the approximate difference between two date time values as string
+*/
+function dateDiffAsString($d1, $d2) {
+	global $currentModule;
+
+	$dateDiff = dateDiff($d1, $d2);
+
+	$years = $dateDiff['years'];
+	$months = $dateDiff['months'];
+	$days = $dateDiff['days'];
+	$hours = $dateDiff['hours'];
+	$minutes = $dateDiff['minutes'];
+	$seconds = $dateDiff['seconds'];
+
+	if($years > 0) {
+		$diffString = "$years ".getTranslatedString('LBL_YEARS',$currentModule);
+	} elseif($months > 0) {
+		$diffString = "$months ".getTranslatedString('LBL_MONTHS',$currentModule);
+	} elseif($days > 0) {
+		$diffString = "$days ".getTranslatedString('LBL_DAYS',$currentModule);
+	} elseif($hours > 0) {
+		$diffString = "$hours ".getTranslatedString('LBL_HOURS',$currentModule);
+	} elseif($minutes > 0) {
+		$diffString = "$minutes ".getTranslatedString('LBL_MINUTES',$currentModule);
+				} else {
+		$diffString = "$seconds ".getTranslatedString('LBL_SECONDS',$currentModule);
+				}
+	return $diffString;
+			}
+
+function getMinimumCronFrequency() {
+	global $MINIMUM_CRON_FREQUENCY;
+
+	if(!empty($MINIMUM_CRON_FREQUENCY)) {
+		return $MINIMUM_CRON_FREQUENCY;
+		}
+	return 15;
+}
+
+//Function returns Email related Modules
+function getEmailRelatedModules() {
+	global $current_user;
+	$handler = vtws_getModuleHandlerFromName('Emails',$current_user);
+	$meta = $handler->getMeta();
+	$moduleFields = $meta->getModuleFields();
+	$fieldModel = $moduleFields['parent_id'];
+	$relatedModules = $fieldModel->getReferenceList();
+	foreach($relatedModules as $key=>$value) {
+		if($value == 'Users') {
+			unset($relatedModules[$key]);
+	}
+}
+	return $relatedModules;
+}
+
+//Get the User selected NumberOfCurrencyDecimals
+function getCurrencyDecimalPlaces($user = null) {
+    global $current_user;
+    if (!empty($user)) {
+        $currency_decimal_places = $user->no_of_currency_decimals;
+    } else {
+        $currency_decimal_places = $current_user->no_of_currency_decimals;
+    }
+    if (isset($currency_decimal_places)) {
+        return $currency_decimal_places;
+    } else {
+        return 2;
+    }
+}
+
+function getInventoryModules() {
+	$inventoryModules = array('Invoice','Quotes','PurchaseOrder','SalesOrder');
+	return $inventoryModules;
+}
+
+/* Function to only initialize the update of Vtlib Compliant modules
+ * @param - $module - Name of the module
+ * @param - $packagepath - Complete path to the zip file of the Module
+ */
+function initUpdateVtlibModule($module, $packagepath) {
+	global $log;
+	require_once('vtlib/Vtiger/Package.php');
+	require_once('vtlib/Vtiger/Module.php');
+	$Vtiger_Utils_Log = true;
+	$package = new Vtiger_Package();
+
+	if($module == null) {
+		$log->fatal("Module name is invalid");
+	} else {
+		$moduleInstance = Vtiger_Module::getInstance($module);
+		if($moduleInstance) {
+			$log->debug("$module - Module instance found - Init Update starts here");
+			$package->initUpdate($moduleInstance, $packagepath, true);
+		} else {
+			$log->fatal("$module doesn't exists!");
+		}
+	}
+}
+
+
+/**
+ * Function to get the list of Contacts related to an activity
+ * @param Integer $activityId
+ * @return Array $contactsList - List of Contact ids, mapped to Contact Names
+ */
+function getActivityRelatedContacts($activityId) {
+	$adb = PearDatabase::getInstance();
+
+	$query = 'SELECT * FROM vtiger_cntactivityrel WHERE activityid=?';
+	$result = $adb->pquery($query, array($activityId));
+
+	$noOfContacts = $adb->num_rows($result);
+	$contactsList = array();
+	for ($i = 0; $i < $noOfContacts; ++$i) {
+		$contactId = $adb->query_result($result, $i, 'contactid');
+		$displayValueArray = getEntityName('Contacts', $contactId);
+		if (!empty($displayValueArray)) {
+			foreach ($displayValueArray as $key => $field_value) {
+				$contact_name = $field_value;
+			}
+		} else {
+			$contact_name='';
+		}
+		$contactsList[$contactId] = $contact_name;
+	}
+	return $contactsList;
+}
+
+function isLeadConverted($leadId) {
+	$adb = PearDatabase::getInstance();
+
+	$query = 'SELECT converted FROM vtiger_leaddetails WHERE converted = 1 AND leadid=?';
+	$params = array($leadId);
+
+	$result = $adb->pquery($query, $params);
+
+	if($result && $adb->num_rows($result) > 0) {
+		return true;
+	}
+	return false;
+}
+
+function getSelectedRecords($input,$module,$idstring,$excludedRecords) {
+	global $current_user, $adb;
+
+	if($idstring == 'relatedListSelectAll') {
+
+		$recordid = vtlib_purify($input['recordid']);
+		if($module == 'Accounts') {
+			$result = getCampaignAccountIds($recordid);
+		}
+		if($module == 'Contacts') {
+			$result = getCampaignContactIds($recordid);
+		}
+		if($module == 'Leads') {
+			$result = getCampaignLeadIds($recordid);
+		}
+		$storearray = array();
+		for ($i = 0; $i < $adb->num_rows($result); $i++) {
+			$storearray[] = $adb->query_result($result, $i, 'id');
+		}
+
+		$excludedRecords=explode(';',$excludedRecords);
+		$storearray=array_diff($storearray,$excludedRecords);
+
+	} else if($module == 'Documents') {
+
+		if($input['selectallmode']=='true') {
+			$result = getSelectAllQuery($input,$module);
+			$storearray = array();
+			$focus = CRMEntity::getInstance($module);
+
+			for ($i = 0; $i < $adb->num_rows($result); $i++) {
+				$storearray[] = $adb->query_result($result, $i, $focus->table_index);
+			}
+
+			$excludedRecords = explode(';',$excludedRecords);
+			$storearray = array_diff($storearray,$excludedRecords);
+			if($idstring != 'all') {
+				$storearray = array_merge($storearray,explode(';',$idstring));
+			}
+			$storearray = array_unique($storearray);
+
+		} else {
+			$storearray = explode(";",$idstring);
+		}
+
+	} elseif($idstring == 'all') {
+
+		$result = getSelectAllQuery($input,$module);
+		$storearray = array();
+		$focus = CRMEntity::getInstance($module);
+
+		for ($i = 0; $i < $adb->num_rows($result); $i++) {
+			$storearray[] = $adb->query_result($result, $i, $focus->table_index);
+		}
+
+		$excludedRecords = explode(';',$excludedRecords);
+		$storearray = array_diff($storearray,$excludedRecords);
+
+	} else {
+		$storearray = explode(";",$idstring);
+	}
+
+	return $storearray;
+}
+
+function getSelectAllQuery($input,$module) {
+	global $adb,$current_user;
+
+	$viewid = vtlib_purify($input['viewname']);
+
+	if($module == "Calendar") {
+		$listquery = getListQuery($module);
+		$oCustomView = new CustomView($module);
+		$query = $oCustomView->getModifiedCvListQuery($viewid,$listquery,$module);
+		$where = '';
+		if($input['query'] == 'true') {
+			list($where, $ustring) = split("#@@#",getWhereCondition($module, $input));
+			if(isset($where) && $where != '') {
+				$query .= " AND " .$where;
+			}
+		}
+	} else {
+		$queryGenerator = new QueryGenerator($module, $current_user);
+		$queryGenerator->initForCustomViewById($viewid);
+
+		if($input['query'] == 'true') {
+			$queryGenerator->addUserSearchConditions($input);
+		}
+
+		$queryGenerator->setFields(array('id'));
+		$query = $queryGenerator->getQuery();
+
+		if($module == 'Documents') {
+			$folderid = vtlib_purify($input['folderidstring']);
+			$folderid = str_replace(';', ',', $folderid);
+			$query .= " AND vtiger_notes.folderid in (".$folderid.")";
+		}
+	}
+
+	$result = $adb->pquery($query, array());
+	return $result;
+}
+
+function getCampaignAccountIds($id) {
+	global $adb;
+	$sql="SELECT vtiger_account.accountid as id FROM vtiger_account
+		INNER JOIN vtiger_campaignaccountrel ON vtiger_campaignaccountrel.accountid = vtiger_account.accountid
+		LEFT JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_account.accountid
+		WHERE vtiger_campaignaccountrel.campaignid = ? AND vtiger_crmentity.deleted=0";
+	$result = $adb->pquery($sql, array($id));
+	return $result;
+}
+
+function getCampaignContactIds($id) {
+	global $adb;
+	$sql="SELECT vtiger_contactdetails.contactid as id FROM vtiger_contactdetails
+		INNER JOIN vtiger_campaigncontrel ON vtiger_campaigncontrel.contactid = vtiger_contactdetails.contactid
+		LEFT JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_contactdetails.contactid
+		WHERE vtiger_campaigncontrel.campaignid = ? AND vtiger_crmentity.deleted=0";
+	$result = $adb->pquery($sql, array($id));
+	return $result;
+}
+
+function getCampaignLeadIds($id) {
+	global $adb;
+	$sql="SELECT vtiger_leaddetails.leadid as id FROM vtiger_leaddetails
+		INNER JOIN vtiger_campaignleadrel ON vtiger_campaignleadrel.leadid = vtiger_leaddetails.leadid
+		LEFT JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_leaddetails.leadid
+		WHERE vtiger_campaignleadrel.campaignid = ? AND vtiger_crmentity.deleted=0";
+	$result = $adb->pquery($sql, array($id));
+	return $result;
+}
+
+/** Function to get the difference between 2 datetime strings or millisecond values */
+function dateDiff($d1, $d2){
+	$d1 = (is_string($d1) ? strtotime($d1) : $d1);
+	$d2 = (is_string($d2) ? strtotime($d2) : $d2);
+
+	$diffSecs = abs($d1 - $d2);
+	$baseYear = min(date("Y", $d1), date("Y", $d2));
+	$diff = mktime(0, 0, $diffSecs, 1, 1, $baseYear);
+	return array(
+		"years" => date("Y", $diff) - $baseYear,
+		"months_total" => (date("Y", $diff) - $baseYear) * 12 + date("n", $diff) - 1,
+		"months" => date("n", $diff) - 1,
+		"days_total" => floor($diffSecs / (3600 * 24)),
+		"days" => date("j", $diff) - 1,
+		"hours_total" => floor($diffSecs / 3600),
+		"hours" => date("G", $diff),
+		"minutes_total" => floor($diffSecs / 60),
+		"minutes" => (int) date("i", $diff),
+		"seconds_total" => $diffSecs,
+		"seconds" => (int) date("s", $diff)
+	);
+}
+
+function getExportRecordIds($moduleName, $viewid, $input) {
+	global $adb, $current_user, $list_max_entries_per_page;
+
+	$idstring = vtlib_purify($input['idstring']);
+	$export_data = vtlib_purify($input['export_data']);
+
+	if (in_array($moduleName, getInventoryModules()) && $export_data == 'currentpage') {
+		$queryGenerator = new QueryGenerator($moduleName, $current_user);
+		$queryGenerator->initForCustomViewById($viewid);
+
+		if($input['query'] == 'true') {
+			$queryGenerator->addUserSearchConditions($input);
+		}
+
+		$queryGenerator->setFields(array('id'));
+		$query = $queryGenerator->getQuery();
+		$current_page = ListViewSession::getCurrentPage($moduleName,$viewid);
+		$limit_start_rec = ($current_page - 1) * $list_max_entries_per_page;
+		if ($limit_start_rec < 0) $limit_start_rec = 0;
+		$query .= ' LIMIT '.$limit_start_rec.','.$list_max_entries_per_page;
+
+		$result = $adb->pquery($query, array());
+		$idstring = array();
+		$focus = CRMEntity::getInstance($moduleName);
+		for ($i = 0; $i < $adb->num_rows($result); $i++) {
+			$idstring[] = $adb->query_result($result, $i, $focus->table_index);
+		}
+		$idstring = implode(';',$idstring);
+		$export_data = 'selecteddata';
+	}
+	return $idstring. '#@@#' .$export_data;
+}
+
+/**
+ * Function to get combinations of string from Array
+ * @param <Array> $array
+ * @param <String> $tempString
+ * @return <Array>
+ */
+function getCombinations($array, $tempString = '') {
+	for ($i=0; $i<count($array); $i++) {
+		$splicedArray = $array;
+		$element = array_splice($splicedArray, $i, 1);// removes and returns the i'th element
+		if (count($splicedArray) > 0) {
+			 if(!is_array($result)) {
+				 $result = array();
+			 }
+			 $result = array_merge($result, getCombinations($splicedArray, $tempString. ' |##| ' .$element[0]));
+		} else {
+			return array($tempString. ' |##| ' . $element[0]);
+		}
+	}
+	return $result;
+}
+
+function getCompanyDetails() {
+	global $adb;
+
+	$sql="select * from vtiger_organizationdetails";
+	$result = $adb->pquery($sql, array());
+
+	$companyDetails = array();
+	$companyDetails['companyname'] = $adb->query_result($result,0,'organizationname');
+	$companyDetails['website'] = $adb->query_result($result,0,'website');
+	$companyDetails['address'] = $adb->query_result($result,0,'address');
+	$companyDetails['city'] = $adb->query_result($result,0,'city');
+	$companyDetails['state'] = $adb->query_result($result,0,'state');
+	$companyDetails['country'] = $adb->query_result($result,0,'country');
+	$companyDetails['phone'] = $adb->query_result($result,0,'phone');
+	$companyDetails['fax'] = $adb->query_result($result,0,'fax');
+	$companyDetails['logoname'] = $adb->query_result($result,0,'logoname');
+
+	return $companyDetails;
+}
+
+/** call back function to change the array values in to lower case */
+function lower_array(&$string){
+	$string = strtolower(trim($string));
+}
+
+if (!function_exists('get_magic_quotes_runtime')) { function get_magic_quotes_runtime() { return false; } }
+if (!function_exists('set_magic_quotes_runtime')) { function set_magic_quotes_runtime($flag) {} }
+
+/** 
+ * Function to escape backslash (\ to \\) in a string
+ * @param string $value String to be escaped
+ * @return string escaped string
+ */
+function escapeSlashes($value) {
+    return str_replace('\\', '\\\\', $value);
+}
+
+/** Function to get a user id or group id for a given entity
+ *  @param $record -- entity id :: Type integer
+ *  @returns reports to id <int>
+ */
+function getRecordOwnerReportsToId($record) {
+    global $adb;
+    $reportsToId = false;
+    $ownerArr = getRecordOwnerId($record);
+    if ($ownerArr['Users']) {
+        $query = "SELECT reports_to_id FROM vtiger_users WHERE id = ?";
+        $result = $adb->pquery($query, array($ownerArr['Users']));
+        if ($adb->num_rows($result) > 0) {
+            $reportsToId = $adb->query_result($result, 0, 'reports_to_id');
+        }
+    }
+    return $reportsToId;
+}
+
+/**
+ * Function to get last week range of give date
+ * @param type $date
+ * @return array($timestamps)
+ */
+function getLastWeekRange($date) {
+	$given_time = strtotime($date);
+	$day = gmdate('D', $given_time);
+
+	if ($day == 'Sun') {
+		$thissunday = strtotime("this sunday", $given_time);
+	} else {
+		$thissunday = strtotime("-1 week sunday", $given_time);
+	}
+
+	$lastSunday = $thissunday - (7 * 24 * 60 * 60); // 7 days; 24 hours; 60 mins; 60secs
+	$lastSaturday = $lastSunday + (6 * 24 * 60 * 60);
+
+	$lastWeekRange = array("start" => $lastSunday, "end" => $lastSaturday);
+	return $lastWeekRange;
+}
+
+/**
+ * Function to get current week range of given date
+ * @param type $date
+ * @return array($timestamps)
+ */
+function getCurrentWeekRange($date) {
+	$given_time = strtotime($date);
+	$day = gmdate('D', $given_time);
+
+	if ($day == 'Sun') {
+		$thissunday = $given_time;
+	} else {
+		$thissunday = strtotime("-1 week sunday", $given_time);
+	}
+	$thisSaturday = $thissunday + (6 * 24 * 60 * 60);
+
+	$currentWeekRange = array("start" => $thissunday, "end" => $thisSaturday);
+	return $currentWeekRange;
+}
+
+/**
+ * Function to get a group id for a given entity
+ * @param $record -- entity id :: Type integer
+ * @returns group id <int>
+ */
+function getRecordGroupId($record) {
+	global $adb;
+	// Look at cache first for information
+	$groupId = VTCacheUtils::lookupRecordGroup($record);
+
+	if ($groupId === false) {
+		$query = "SELECT smgroupid FROM vtiger_crmentity WHERE crmid = ?";
+		$result = $adb->pquery($query, array($record));
+		if ($adb->num_rows($result) > 0) {
+			$groupId = $adb->query_result($result, 0, 'smgroupid');
+			// Update cache forupdateRecordGroup re-use
+			VTCacheUtils::updateRecordGroup($record, $groupId);
+		}
+	}
+
+	return $groupId;
+}
+
+/**
+ * Function to delete record from $_SESSION[$moduleName.'_DetailView_Navigation'.$cvId]
+ */
+function deleteRecordFromDetailViewNavigationRecords($recordId, $cvId, $moduleName) {
+	$recordNavigationInfo = Zend_Json::decode($_SESSION[$moduleName . '_DetailView_Navigation' . $cvId]);
+	if (!empty($recordNavigationInfo) && (count($recordNavigationInfo) != 0)) {
+		foreach ($recordNavigationInfo as $key => $recordIdList) {
+			$recordIdList = array_diff($recordIdList, array($recordId));
+			$recordNavigationInfo[$key] = $recordIdList;
+		}
+		$_SESSION[$moduleName . '_DetailView_Navigation' . $cvId] = Zend_Json::encode($recordNavigationInfo);
+	}
+}
+
+function sendMailToUserOnDuplicationPrevention($moduleName, $fieldData, $mailBody, $userModel = '') {
+	if (!$userModel) {
+		$userId = $_SESSION['authenticated_user_id'];
+		if ($userId) {
+			$userModel = Users_Record_Model::getInstanceFromPreferenceFile($userId);
+		} else {
+			$userModel = Users_Record_Model::getCurrentUserModel();
+		}
+	}
+
+	$mailer = Emails_Mailer_Model::getInstance();
+	$mailer->IsHTML(true);
+
+	$emailRecordModel = Emails_Record_Model::getCleanInstance('Emails');
+	$fromEmail = $emailRecordModel->getFromEmailAddress();
+	$replyTo = $emailRecordModel->getReplyToEmail();
+	$userName = $userModel->getName();
+
+	$mailer->ConfigSenderInfo($fromEmail, $userName, $replyTo);
+	$mailer->Subject = vtranslate('LBL_VTIGER_NOTIFICATION');
+	$body = $mailBody;
+
+	$body .= '<br>';
+	$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
+	$fieldModels = $moduleModel->getFields();
+	foreach ($fieldModels as $fieldName => $fieldModel) {
+		if ($fieldModel->isUniqueField() && $fieldModel->isViewable()) {
+			$fieldValue = $fieldData[$fieldName];
+
+			switch($fieldModel->getFieldDataType()) {
+				case 'reference'		:	list($refModuleId, $refRecordId) = vtws_getIdComponents($fieldValue);
+											$fieldValue = Vtiger_Functions::getCRMRecordLabel($refRecordId);
+											break;
+				case 'date'				:
+				case 'datetime'			:
+				case 'currency'			:
+				case 'currencyList'		:
+				case 'documentsFolder'	:
+				case 'multipicklist'	:	if ($fieldValue) {
+												$fieldValue = $fieldModel->getDisplayValue($fieldValue);
+											}
+											break;
+			}
+
+			$fieldLabel = $fieldModel->get('label');
+			$body .= '<br>'.vtranslate($fieldLabel, $moduleName)." : $fieldValue<br>";
+		}
+	}
+	$body .= '<br>';
+
+	if ($userModel->isAdminUser()) {
+		$siteURL = vglobal('site_URL');
+		$url = "$siteURL/index.php?parent=Settings&module=LayoutEditor&sourceModule=$moduleName&mode=showDuplicationHandling";
+		$here = '<a href="'.$url.'" target="_blank">'.vtranslate('LBL_CLICK_HERE', $moduleName).'</a>';
+		$body .= vtranslate('LBL_DUPLICATION_FAILURE_FOR_ADMIN', $moduleName, $here);
+	} else {
+		$body .= vtranslate('LBL_DUPLICATION_FAILURE_FOR_NON_ADMIN', $moduleName);
+	}
+
+	$mailer->Body = $body;
+	$mailer->AddAddress($userModel->get('email1'), $userName);
+	$mailer->Send(false);
+}
+
+function getDuplicatesPreventionMessage($moduleName, $duplicateRecordsList) {
+	$moduleModel = Vtiger_Module_Model::getInstance($moduleName);
+	$fieldModels = $moduleModel->getFields();
+
+	$recordId = reset($duplicateRecordsList);
+	$recordModel = Vtiger_Record_Model::getInstanceById($recordId);
+	$recordData = $recordModel->getData();
+
+	$uniqueFields = array();
+	foreach ($fieldModels as $fieldName => $fieldModel) {
+		$fieldDataType = $fieldModel->getFieldDataType();
+		$fieldValue = $recordData[$fieldName];
+
+		if ($fieldDataType === 'reference' && $fieldValue == 0) {
+			$fieldValue = '';
+		}
+
+		if ($fieldModel->isUniqueField() && $fieldModel->isViewable() && $fieldValue !== '' && $fieldValue !== NULL) {
+			$uniqueFields[] = $fieldModel;
+		}
+	}
+
+	$fieldsString = '';
+	$uniqueFieldsCount = count($uniqueFields);
+	for($i=0; $i<$uniqueFieldsCount; $i++) {
+		$fieldModel = $uniqueFields[$i];
+		$fieldLabel = $fieldModel->get('label');
+		$fieldsString .= vtranslate($fieldLabel, $moduleName);
+
+		if ($uniqueFieldsCount != 1 && $i == ($uniqueFieldsCount-2)) {
+			$fieldsString .= ' '.vtranslate('LBL_AND', $moduleName).' ';
+		} else if ($i != ($uniqueFieldsCount-1)) {
+			$fieldsString .= ', ';
+		}
+	}
+	$fieldsString = rtrim($fieldsString, ',');
+
+	$singleModuleName = vtranslate('SINGLE_'.$moduleName, $moduleName);
+	$translatedModuleName = $singleModuleName;
+	$duplicateRecordsCount = count($duplicateRecordsList);
+	if ($duplicateRecordsCount > 1) {
+		$translatedModuleName = vtranslate($moduleName, $moduleName);
+	}
+	$message = vtranslate('LBL_DUPLICATES_FOUND_MESSAGE', $moduleName, $singleModuleName, $translatedModuleName, $fieldsString).' ';
+
+	$currentUserModel = Users_Record_Model::getCurrentUserModel();
+	if ($currentUserModel->isAdminUser()) {
+		$url = "index.php?parent=Settings&module=LayoutEditor&sourceModule=$moduleName&mode=showDuplicationHandling";
+		$here = '<a href="'.$url.'" target="_blank" style="color:#15c !important">'.vtranslate('LBL_CLICK_HERE', $moduleName).'</a>';
+		$message .= vtranslate('LBL_DUPLICATION_FAILURE_FOR_ADMIN', $moduleName, $here);
+	} else {
+		$message .= vtranslate('LBL_DUPLICATION_FAILURE_FOR_NON_ADMIN', $moduleName);
+	}
+
+	$message .= '<br><br>';
+    $message .= vtranslate('LBL_DUPLICATE_RECORD_LISTS', $moduleName, $singleModuleName).'<br>';
+	for ($i=0; $i<$duplicateRecordsCount && $i<5; $i++) {
+		$dupliRecordId = $duplicateRecordsList[$i];
+		$dupliRecordModel = new Vtiger_Record_Model();
+		$dupliRecordModel->setId($dupliRecordId)->setModuleFromInstance($moduleModel);
+		$message .= '<a href="'.$dupliRecordModel->getDetailViewUrl().'" target="_blank" style="color:#15c !important">'.Vtiger_Functions::getCRMRecordLabel($dupliRecordId).'</a><br>';
+	}
+
+	if ($duplicateRecordsCount === 6) {
+		$searchParams = array();
+		foreach ($uniqueFields as $fieldModel) {
+			$fieldName = $fieldModel->getName();
+			$fieldValue = $recordData[$fieldName];
+			$fieldDataType = $fieldModel->getFieldDataType();
+			switch($fieldDataType) {
+				case 'reference'		:	$fieldValue = Vtiger_Functions::getCRMRecordLabel($fieldValue);
+											break;
+				case 'date'				:
+				case 'datetime'			:
+				case 'currency'			:
+				case 'currencyList'		:
+				case 'documentsFolder'	:
+				case 'multipicklist'	:	if ($fieldValue) {
+												$fieldValue = $fieldModel->getDisplayValue($fieldValue);
+											}
+											break;
+			}
+
+			$comparator = 'e';
+			if (in_array($fieldDataType, array('date', 'datetime'))) {
+				$comparator = 'bw';
+				$fieldValue = "$fieldValue,$fieldValue";
+			}
+			$searchParams[] = array($fieldName, $comparator, $fieldValue);
+		}
+
+		$listViewUrl = $moduleModel->getListViewUrl().'&search_params='.json_encode(array($searchParams));
+		$message .= "<a href='$listViewUrl' target='_blank' style='color:#15c !important'>+".  strtolower(vtranslate('LBL_MORE', $moduleName)).'</a>';
+	}
+
+	return $message;
+}
+
+?>
diff --git a/modules/Users/actions/Save.php b/modules/Users/actions/Save.php
index bbe106565344b8870df76dac3b3a789fbfc1592b..09c2ea3350d76be95655bcc9e7427c3f4ed61a10 100644
--- a/modules/Users/actions/Save.php
+++ b/modules/Users/actions/Save.php
@@ -15,6 +15,7 @@ class Users_Save_Action extends Vtiger_Save_Action {
     }
     
 	public function checkPermission(Vtiger_Request $request) {
+<<<<<<< HEAD
 		$allowed = parent::checkPermission($request);
 		if ($allowed) {
 			$moduleName = $request->getModule();
@@ -26,10 +27,30 @@ class Users_Save_Action extends Vtiger_Save_Action {
 				if (empty($record)) {
 					$allowed = false;
 				} else if (($currentUserModel->get('id') != $recordModel->getId())) {
+=======
+		$moduleName = $request->getModule();
+		$record = $request->get('record');
+		$recordModel = Vtiger_Record_Model::getInstanceById($record, $moduleName);
+		$currentUserModel = Users_Record_Model::getCurrentUserModel();
+
+		// Check for operation access.
+		$allowed = Users_Privileges_Model::isPermitted($moduleName, 'Save', $record);
+		
+		if ($allowed) {
+			// Deny access if not administrator or account-owner or self
+			if(!$currentUserModel->isAdminUser() && !$recordModel->isAccountOwner()) {
+				if (empty($record)) {
+					$allowed = false;
+				} else if ($currentUserModel->get('id') != $recordModel->getId()) {
+>>>>>>> remotes/upstream/6.4.0
 					$allowed = false;
 				}
 			}
 		}
+<<<<<<< HEAD
+=======
+
+>>>>>>> remotes/upstream/6.4.0
 		if(!$allowed) {
 			throw new AppException('LBL_PERMISSION_DENIED');
 		}
diff --git a/vtigerversion.php b/vtigerversion.php
index 83a0f13b2d1a2031527763983cd6e0b2be9d2de6..9f7975f47d86be807092a74cddac7f999abc4430 100644
--- a/vtigerversion.php
+++ b/vtigerversion.php
@@ -8,7 +8,11 @@
  * All Rights Reserved.
  ************************************************************************************/
 
+<<<<<<< HEAD
 $patch_version = '-20201019'; // -ve timestamp before release, +ve timestamp after release.
+=======
+$patch_version = '20160610';  // -ve timestamp before release, +ve timestamp after release.
+>>>>>>> remotes/upstream/6.4.0
 $modified_database = '';
 $vtiger_current_version = '7.4.0';
 $_SESSION['vtiger_version'] = $vtiger_current_version;