blob: 41229c14b65c1a5d1bf9072106c1b09e8440aad7 [file] [log] [blame]
<?php
########################################################################################################
# Aastra XML API Classes - AastraIPPhoneScrollableTextMenu
#
# Aastra SIP Phones 1.4.2 or better
#
# Copyright 2009-2010 Aastra Telecom Ltd
#
# Supported Aastra Phones
# All IP phones except Aastra9112i and Aastra9133i
#
# AastraIPPhoneScrollableTextMenu object.
#
# Public methods
# setEntries(entries) Set entries of the list by 2 dim array. Inner array field names: 'name', 'url', 'selection', 'icon', 'dial'
# verifyCookie(cookie) Verifies if the cookie of the HTTP requests matches the cookie of the saved context.
# setBackURI(URI) Set the cancel parameter with the URI to be called on Cancel or Back Softkey (optional)
# setBackKeyPosition(position) Set position of Back Softkey. Default is 3.
# setNextKeyPosition(position) Set position of Next Softkey. Default is 4.
# setPreviousKeyPosition(position) Set position of Previous Softkey. Default is 5.
# setExitKeyPosition(position) Set position of Back Softkey. Default is 6.
# setSelectKeyPosition(position) Set position of Back Softkey. Default is 1.
# setNextKeyIcon(icon) Set icon of Next Softkey. Default is Icon:TailArrowDown. Set NULL to disable icon.
# setPreviousKeyIcon(icon) Set icon of Previous Softkey. Default is Icon:TailArrowUp. Set NULL to disable icon.
# disableExitKey() Disable the Exit Softkey
# setSelectKeyLabel(label) Set the label of the Select Softkey. Default is 'Select'. Make sure the string is in language.ini.
#
# Overwritten methods from AastraIPPhoneTextMenu
# setCancelAction(uri) to set the cancel parameter with the URI to be called on Cancel or Back Softkey (optional)
# output() to display the object
# addEntry(name,url,selection,icon,dial) to add an element in the list to be displayed
# natsortbyname() to order the list
#
# Inherited from AastraIPPhoneTextMenu
# setTitle(Title) to setup the title of an object (optional)
# setTitleWrap() to set the title to be wrapped on 2 lines (optional)
# setDestroyOnExit() to set DestroyOnExit parameter to "yes" (optional)
# setBeep() to enable a notification beep with the object (optional)
# setLockIn() to set the Lock-in tag to 'yes' (optional)
# setAllowAnswer() to set the allowAnswer tag to 'yes' (optional)
# setTimeout(timeout) to define a specific timeout for the XML object (optional)
# addSoftkey(index,label,uri,icon_index) to add custom softkeys to the object (optional)
# setRefresh(timeout,URL) to add Refresh parameters to the object (optional)
# generate() to return the object content
# setDefaultIndex(index) to set the default selection in the list (optional)
# setStyle(style) to set the style of the list numbered/none/radio (optional)
# setWrapList() to allow 2 lines items (optional)
#
# Example 1:
# $menu = new AastraIPPhoneScrollableTextMenu();
# $menu->setTitle('My Menu');
# $menu->addEntry('Choice 1', $XML_SERVER."?choice=1", '1');
# # ... add as many entries you want
# $menu->addEntry('Choice 100', $XML_SERVER."?choice=100", '100');
# $menu->output(); # Page scrolling will be handled by AastraIPPhoneScrollableTextMenu
#
# Example 2:
# $entries[0]['name'] = "Choice 1";
# $entries[0]['url'] = $XML_SERVER."?choice=1";
# $entries[0]['selection'] = "1";
# # ... add as many entries you want
# $entries[99]['name'] = "Choice 100";
# $entries[99]['url'] = $XML_SERVER."?choice=100";
# $entries[99]['selection'] = "100";
# $menu = new AastraIPPhoneScrollableTextMenu();
# $menu->setTitle('My Menu');
# $menu->setEntries($entries):
# $menu->output(); # Page scrolling will be handled by AastraIPPhoneScrollableTextMenu
#
########################################################################################################
require_once('AastraCommon.php');
require_once('AastraIPPhoneTextMenu.class.php');
class AastraIPPhoneScrollableTextMenu extends AastraIPPhoneTextMenu {
var $_language;
var $_list = array(); # All entries of the list
var $_count = 0; # Total number of entries
var $_cookie; # Cookie - unique per AastraIPPhoneScrollableTextMenu instance
var $_header;
var $_scrollHandlerReference;
var $_backCancelURL;
var $_maxLines;
var $_exitKeyDisabled;
var $_selectKeyLabel = 'Select';
var $_backKeyPosition = 3;
var $_exitKeyPosition = 6;
var $_selectKeyPosition = 1;
var $_nextKeyPosition = 4;
var $_previousKeyPosition = 5;
var $_nextKeyIconIndex = 11;
var $_previousKeyIconIndex = 12;
var $_nextKeyIcon = 'Icon:TailArrowDown';
var $_previousKeyIcon = 'Icon:TailArrowUp';
# Constructor
function AastraIPPhoneScrollableTextMenu()
{
# Get Language
$this->_language = Aastra_get_language();
# Decode HTTP header
$this->_header = Aastra_decode_HTTP_header();
# Generate new cookie
$this->_cookie = $this->_generateCookie();
# Generate Scroll Handler reference
global $XML_HTTP, $AA_XML_SERVER, $AA_XMLDIRECTORY;
$this->_scrollHandlerReference = $XML_HTTP.$AA_XML_SERVER."/".$AA_XMLDIRECTORY."/include/AastraIPPhoneScrollHandler.php?listCookie=".$this->_cookie;
# Calculate max linex
$this->_calculateMaxLines();
# Modify some values for 6739i
if(Aastra_number_softkeys_supported()==10)
{
$this->_backKeyPosition = 9;
$this->_exitKeyPosition = 10;
$this->_nextKeyPosition = 8;
$this->_previousKeyPosition = 3;
}
}
function addEntry($name, $url, $selection=NULL, $icon=NULL, $dial=NULL)
{
$entry['name'] = $name;
$entry['url'] = $url;
$entry['selection'] = $selection;
$entry['icon'] = $icon;
$entry['dial'] = $dial;
$this->_list[] = $entry;
}
function setEntries($entries)
{
$this->_list = $entries;
}
function output($page=NULL)
{
# Test phone firmware / model
Aastra_test_phone_version('1.4.2.',0);
Aastra_test_phone_model(array('Aastra9112i','Aastra9133i'),False,0);
# Force destroyOnExit
$this->_destroyOnExit = 'yes';
# Initial call?
if (!isset($page))
{
# Count number of entries in list
$this->_count = count($this->_list);
# Setup icons
$this->_setupIcons();
# Setup Softkeys
$this->_setupSoftKeys();
# Set Cancel URI
if (!empty($this->_backCancelURL)) parent::setCancelAction($this->_backCancelURL);
# Do some security / compliancy checks
# Protect against wrap list bug in FW < R2.4.0
if (Aastra_test_phone_version('2.4.0.',1)) $this->_wraplist = 'no';
if (!Aastra_is_wrap_title_supported())$this->_wraplist = 'no';
if (!Aastra_is_textmenu_wrapitem_supported()) $this->_title_wrap = 'no';
if (!Aastra_is_style_textmenu_supported()) $this->_style = '';
if (!Aastra_is_lockin_supported()) $this->_lockin = 'no';
# Save object in user context (context = mac address)
Aastra_save_user_context($this->_header['mac'],'scrollableTextMenuData',$this);
}
else
{
# If beep is set, only beep during initial call
$this->_beep='no';
}
# Generate the actual items of the menu for the given page
$this->_generatePage($page);
parent::output();
}
function _generatePage($page)
{
# Empty List protection (to avoid 'cannot display')
if ($this->_count==0)
{
$tmpEntry['name'] = '[NO ENTRIES]';
$this->_list[] = $tmpEntry;
$this->_count++;
}
# Calculate total number of pages
$last = ceil($this->_count / $this->_maxLines);
# Invalid page protection
if (empty($page) or $page < 1) $page = 1;
if ($page > $last) $page = $last;
# On phones without softkeys: Add dummy entry that allows to jump to previous page
if (!Aastra_is_softkeys_supported() && ($page > 1 && $last > 1)) $this->_entries[] = new AastraIPPhoneTextMenuEntry('['.Aastra_get_label('Previous Page',$this->_language).']', $this->_scrollHandlerReference.'&listPage='.($page-1), NULL, NULL, NULL, NULL,NULL);
# Populate list for current page
for ($i = 0; ($i < $this->_maxLines and ($i + (($page - 1) * $this->_maxLines)) < $this->_count); $i++)
{
# Get entry from list
$tmpEntry = $this->_list[$i + (($page - 1) * $this->_maxLines)];
# Add 'recentSelection' and 'recentPage' attribute to URL of the entry.
# Allows to jump back to same page / selection
$tmpURI = $tmpEntry['url'];
# Check if URI is an HTTP(S) URL (could also be an URI like Dial:1234)
if (preg_match('/^http/i',$tmpURI))
{
# Check if URL already contains parameters
if (preg_match('/\?/',$tmpURI)) $tmpEntry['url'] = $tmpEntry['url'].'&recentSelection='.($i+1).'&recentPage='.$page;
else $tmpEntry['url'] = $tmpEntry['url'].'?recentSelection='.($i+1).'&recentPage='.$page;
}
# Make sure we don't add menu items the phone firmware cannot handle
if (!Aastra_is_icons_supported()) $tmpEntry['icon'] = NULL;
if (Aastra_test_phone_version('2.0.1.',1)) $tmpEntry['dial'] = NULL;
$this->_entries[] = new AastraIPPhoneTextMenuEntry($tmpEntry['name'], $tmpEntry['url'], $tmpEntry['selection'], $tmpEntry['icon'], $tmpEntry['dial'], NULL, NULL);
}
# On phones without softkeys: Add dummy entry that allows to jump to next page
if (!Aastra_is_softkeys_supported() && ($page < $last)) $this->_entries[] = new AastraIPPhoneTextMenuEntry('['.Aastra_get_label('Next Page',$this->_language).']', $this->_scrollHandlerReference.'&listPage='.($page+1), NULL, NULL, NULL, NULL,NULL);
# On phones with softkeys:Add Next/Previous Softkeys
if(Aastra_is_softkeys_supported())
{
if ($page < $last)
{
# Add Next key
if (Aastra_is_icons_supported() && !empty($this->_nextKeyIcon)) $this->addSoftkey($this->_nextKeyPosition, Aastra_get_label('Next',$this->_language), $this->_scrollHandlerReference.'&listPage='.($page+1), $this->_nextKeyIconIndex);
else $this->addSoftkey($this->_nextKeyPosition, Aastra_get_label('Next',$this->_language), $this->_scrollHandlerReference.'&listPage='.($page+1));
}
if ($page > 1 && $last > 1)
{
# Add Previous key
if (Aastra_is_icons_supported() && !empty($this->_previousKeyIcon)) $this->addSoftkey($this->_previousKeyPosition, Aastra_get_label('Previous',$this->_language), $this->_scrollHandlerReference.'&listPage='.($page-1), $this->_previousKeyIconIndex);
else $this->addSoftkey($this->_previousKeyPosition, Aastra_get_label('Previous',$this->_language), $this->_scrollHandlerReference.'&listPage='.($page-1));
}
}
# Add page info to title
if ($last > 1)
{
# For phones with big screen
if (Aastra_is_softkeys_supported()) $this->_title = $this->_title.' ('.Aastra_get_label('Pg.',$this->_language).' '.$page.'/'.$last.')';
# For 3 line phones
else $this->_title = $this->_title.' ('.$page.'/'.$last.')';
}
}
function _calculateMaxLines()
{
$this->_maxLines = Aastra_max_items_textmenu();
if(!Aastra_is_softkeys_supported()) $this->_maxLines = $this->_maxLines - 2;
}
function _setupIcons()
{
if (Aastra_is_icons_supported())
{
$this->addIcon($this->_nextKeyIconIndex, $this->_nextKeyIcon);
$this->addIcon($this->_previousKeyIconIndex, $this->_previousKeyIcon);
}
}
function _setupSoftKeys()
{
if (Aastra_is_softkeys_supported())
{
$this->addSoftkey($this->_selectKeyPosition, Aastra_get_label($this->_selectKeyLabel,$this->_language), 'SoftKey:Select');
if (!$this->_exitKeyDisabled) $this->addSoftkey($this->_exitKeyPosition, Aastra_get_label('Exit',$this->_language), 'SoftKey:Exit');
if (!empty($this->_backCancelURL)) $this->addSoftkey($this->_backKeyPosition, Aastra_get_label('Back',$this->_language), $this->_backCancelURL);
}
}
function _generateCookie()
{
return md5(time().rand());
}
function verifyCookie($cookie)
{
return ($this->_cookie == $cookie);
}
function setBackURI($URI)
{
$this->_backCancelURL = $URI;
}
function setBackKeyPosition($position)
{
$this->_backKeyPosition = $position;
}
function setNextKeyPosition($position)
{
$this->_nextKeyPosition = $position;
}
function setPreviousKeyPosition($position)
{
$this->_previousKeyPosition = $position;
}
function setExitKeyPosition($position)
{
$this->_exitKeyPosition = $position;
}
function setSelectKeyPosition($position)
{
$this->_selectKeyPosition = $position;
}
function setNextKeyIcon($icon=NULL)
{
$this->_nextKeyIcon = $icon;
}
function setPreviousKeyIcon($icon=NULL)
{
$this->_previousKeyIcon = $icon;
}
function disableExitKey()
{
$this->_exitKeyDisabled = 1;
}
function setSelectKeyLabel($label)
{
$this->_selectKeyLabel = $label;
}
function setCancelAction($cancelAction)
{
$this->_backCancelURL = $cancelAction;
}
function natsortByName()
{
if (empty($this->_list)) return;
$tmpary = array();
foreach ($this->_list as $id => $entry) $tmpary[$id] = $entry['name'];
natsort($tmpary);
foreach ($tmpary as $key => $value) $new[] = $this->_list[$key];
$this->_list = $new;
}
}
?>