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