├── css ├── cupertino │ ├── images │ │ ├── ui-bg_diagonals-thick_90_eeeeee_40x40.png │ │ ├── ui-bg_flat_15_cd0a0a_40x100.png │ │ ├── ui-bg_glass_100_e4f1fb_1x400.png │ │ ├── ui-bg_glass_50_3baae3_1x400.png │ │ ├── ui-bg_glass_80_d7ebf9_1x400.png │ │ ├── ui-bg_highlight-hard_100_f2f5f7_1x100.png │ │ ├── ui-bg_highlight-hard_70_000000_1x100.png │ │ ├── ui-bg_highlight-soft_100_deedf7_1x100.png │ │ ├── ui-bg_highlight-soft_25_ffef8f_1x100.png │ │ ├── ui-icons_2694e8_256x240.png │ │ ├── ui-icons_2e83ff_256x240.png │ │ ├── ui-icons_3d80b3_256x240.png │ │ ├── ui-icons_72a7cf_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── jquery-ui-1.8.14.custom.css │ └── jquery-ui-1.8.16.custom.css └── fspanel.css ├── fscontrol.php ├── fspanel.html ├── images ├── businessman_delete.png ├── close_button.png ├── delete2.png ├── disable.png ├── export1.png ├── gauge.png ├── import1.png ├── loudspeaker.png ├── loudspeaker_network.png ├── microphone2.png ├── play.png ├── stop.png ├── tab_background.gif ├── user1_delete.png ├── user1_into.png └── warning.png └── js ├── fspanel.js ├── jquery-1.6.4.min.js ├── jquery-1.7.1.min.js ├── jquery-ui-1.8.14.custom.min.js ├── jquery.json-2.2.min.js └── jquery.tinysort.js /css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-icons_2694e8_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-icons_2694e8_256x240.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-icons_3d80b3_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-icons_3d80b3_256x240.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-icons_72a7cf_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-icons_72a7cf_256x240.png -------------------------------------------------------------------------------- /css/cupertino/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/css/cupertino/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /css/cupertino/jquery-ui-1.8.14.custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.14 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming/API 9 | */ 10 | 11 | /* Layout helpers 12 | ----------------------------------*/ 13 | .ui-helper-hidden { display: none; } 14 | .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } 15 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 16 | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } 17 | .ui-helper-clearfix { display: inline-block; } 18 | /* required comment for clearfix to work in Opera \*/ 19 | * html .ui-helper-clearfix { height:1%; } 20 | .ui-helper-clearfix { display:block; } 21 | /* end clearfix */ 22 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 23 | 24 | 25 | /* Interaction Cues 26 | ----------------------------------*/ 27 | .ui-state-disabled { cursor: default !important; } 28 | 29 | 30 | /* Icons 31 | ----------------------------------*/ 32 | 33 | /* states and images */ 34 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 35 | 36 | 37 | /* Misc visuals 38 | ----------------------------------*/ 39 | 40 | /* Overlays */ 41 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 42 | 43 | 44 | /* 45 | * jQuery UI CSS Framework 1.8.14 46 | * 47 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 48 | * Dual licensed under the MIT or GPL Version 2 licenses. 49 | * http://jquery.org/license 50 | * 51 | * http://docs.jquery.com/UI/Theming/API 52 | * 53 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=02_glass.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=02_glass.png&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=04_highlight_hard.png&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px 54 | */ 55 | 56 | 57 | /* Component containers 58 | ----------------------------------*/ 59 | .ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } 60 | .ui-widget .ui-widget { font-size: 1em; } 61 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } 62 | .ui-widget-content { border: 1px solid #dddddd; background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; } 63 | .ui-widget-content a { color: #362b36; } 64 | .ui-widget-header { border: 1px solid #aed0ea; background: #deedf7 url(images/ui-bg_highlight-soft_100_deedf7_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } 65 | .ui-widget-header a { color: #222222; } 66 | 67 | /* Interaction states 68 | ----------------------------------*/ 69 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; background: #d7ebf9 url(images/ui-bg_glass_80_d7ebf9_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2779aa; } 70 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; } 71 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; background: #e4f1fb url(images/ui-bg_glass_100_e4f1fb_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #0070a3; } 72 | .ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; } 73 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #2694e8; background: #3baae3 url(images/ui-bg_glass_50_3baae3_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; } 74 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; } 75 | .ui-widget :active { outline: none; } 76 | 77 | /* Interaction Cues 78 | ----------------------------------*/ 79 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #ffef8f url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; } 80 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } 81 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; } 82 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } 83 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } 84 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } 85 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 86 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 87 | 88 | /* Icons 89 | ----------------------------------*/ 90 | 91 | /* states and images */ 92 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_72a7cf_256x240.png); } 93 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_72a7cf_256x240.png); } 94 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_72a7cf_256x240.png); } 95 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_3d80b3_256x240.png); } 96 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_2694e8_256x240.png); } 97 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } 98 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } 99 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } 100 | 101 | /* positioning */ 102 | .ui-icon-carat-1-n { background-position: 0 0; } 103 | .ui-icon-carat-1-ne { background-position: -16px 0; } 104 | .ui-icon-carat-1-e { background-position: -32px 0; } 105 | .ui-icon-carat-1-se { background-position: -48px 0; } 106 | .ui-icon-carat-1-s { background-position: -64px 0; } 107 | .ui-icon-carat-1-sw { background-position: -80px 0; } 108 | .ui-icon-carat-1-w { background-position: -96px 0; } 109 | .ui-icon-carat-1-nw { background-position: -112px 0; } 110 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 111 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 112 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 113 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 114 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 115 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 116 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 117 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 118 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 119 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 120 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 121 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 122 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 123 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 124 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 125 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 126 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 127 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 128 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 129 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 130 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 131 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 132 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 133 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 134 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 135 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 136 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 137 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 138 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 139 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 140 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 141 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 142 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 143 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 144 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 145 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 146 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 147 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 148 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 149 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 150 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 151 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 152 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 153 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 154 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 155 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 156 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 157 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 158 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 159 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 160 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 161 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 162 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 163 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 164 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 165 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 166 | .ui-icon-arrow-4 { background-position: 0 -80px; } 167 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 168 | .ui-icon-extlink { background-position: -32px -80px; } 169 | .ui-icon-newwin { background-position: -48px -80px; } 170 | .ui-icon-refresh { background-position: -64px -80px; } 171 | .ui-icon-shuffle { background-position: -80px -80px; } 172 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 173 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 174 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 175 | .ui-icon-folder-open { background-position: -16px -96px; } 176 | .ui-icon-document { background-position: -32px -96px; } 177 | .ui-icon-document-b { background-position: -48px -96px; } 178 | .ui-icon-note { background-position: -64px -96px; } 179 | .ui-icon-mail-closed { background-position: -80px -96px; } 180 | .ui-icon-mail-open { background-position: -96px -96px; } 181 | .ui-icon-suitcase { background-position: -112px -96px; } 182 | .ui-icon-comment { background-position: -128px -96px; } 183 | .ui-icon-person { background-position: -144px -96px; } 184 | .ui-icon-print { background-position: -160px -96px; } 185 | .ui-icon-trash { background-position: -176px -96px; } 186 | .ui-icon-locked { background-position: -192px -96px; } 187 | .ui-icon-unlocked { background-position: -208px -96px; } 188 | .ui-icon-bookmark { background-position: -224px -96px; } 189 | .ui-icon-tag { background-position: -240px -96px; } 190 | .ui-icon-home { background-position: 0 -112px; } 191 | .ui-icon-flag { background-position: -16px -112px; } 192 | .ui-icon-calendar { background-position: -32px -112px; } 193 | .ui-icon-cart { background-position: -48px -112px; } 194 | .ui-icon-pencil { background-position: -64px -112px; } 195 | .ui-icon-clock { background-position: -80px -112px; } 196 | .ui-icon-disk { background-position: -96px -112px; } 197 | .ui-icon-calculator { background-position: -112px -112px; } 198 | .ui-icon-zoomin { background-position: -128px -112px; } 199 | .ui-icon-zoomout { background-position: -144px -112px; } 200 | .ui-icon-search { background-position: -160px -112px; } 201 | .ui-icon-wrench { background-position: -176px -112px; } 202 | .ui-icon-gear { background-position: -192px -112px; } 203 | .ui-icon-heart { background-position: -208px -112px; } 204 | .ui-icon-star { background-position: -224px -112px; } 205 | .ui-icon-link { background-position: -240px -112px; } 206 | .ui-icon-cancel { background-position: 0 -128px; } 207 | .ui-icon-plus { background-position: -16px -128px; } 208 | .ui-icon-plusthick { background-position: -32px -128px; } 209 | .ui-icon-minus { background-position: -48px -128px; } 210 | .ui-icon-minusthick { background-position: -64px -128px; } 211 | .ui-icon-close { background-position: -80px -128px; } 212 | .ui-icon-closethick { background-position: -96px -128px; } 213 | .ui-icon-key { background-position: -112px -128px; } 214 | .ui-icon-lightbulb { background-position: -128px -128px; } 215 | .ui-icon-scissors { background-position: -144px -128px; } 216 | .ui-icon-clipboard { background-position: -160px -128px; } 217 | .ui-icon-copy { background-position: -176px -128px; } 218 | .ui-icon-contact { background-position: -192px -128px; } 219 | .ui-icon-image { background-position: -208px -128px; } 220 | .ui-icon-video { background-position: -224px -128px; } 221 | .ui-icon-script { background-position: -240px -128px; } 222 | .ui-icon-alert { background-position: 0 -144px; } 223 | .ui-icon-info { background-position: -16px -144px; } 224 | .ui-icon-notice { background-position: -32px -144px; } 225 | .ui-icon-help { background-position: -48px -144px; } 226 | .ui-icon-check { background-position: -64px -144px; } 227 | .ui-icon-bullet { background-position: -80px -144px; } 228 | .ui-icon-radio-off { background-position: -96px -144px; } 229 | .ui-icon-radio-on { background-position: -112px -144px; } 230 | .ui-icon-pin-w { background-position: -128px -144px; } 231 | .ui-icon-pin-s { background-position: -144px -144px; } 232 | .ui-icon-play { background-position: 0 -160px; } 233 | .ui-icon-pause { background-position: -16px -160px; } 234 | .ui-icon-seek-next { background-position: -32px -160px; } 235 | .ui-icon-seek-prev { background-position: -48px -160px; } 236 | .ui-icon-seek-end { background-position: -64px -160px; } 237 | .ui-icon-seek-start { background-position: -80px -160px; } 238 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 239 | .ui-icon-seek-first { background-position: -80px -160px; } 240 | .ui-icon-stop { background-position: -96px -160px; } 241 | .ui-icon-eject { background-position: -112px -160px; } 242 | .ui-icon-volume-off { background-position: -128px -160px; } 243 | .ui-icon-volume-on { background-position: -144px -160px; } 244 | .ui-icon-power { background-position: 0 -176px; } 245 | .ui-icon-signal-diag { background-position: -16px -176px; } 246 | .ui-icon-signal { background-position: -32px -176px; } 247 | .ui-icon-battery-0 { background-position: -48px -176px; } 248 | .ui-icon-battery-1 { background-position: -64px -176px; } 249 | .ui-icon-battery-2 { background-position: -80px -176px; } 250 | .ui-icon-battery-3 { background-position: -96px -176px; } 251 | .ui-icon-circle-plus { background-position: 0 -192px; } 252 | .ui-icon-circle-minus { background-position: -16px -192px; } 253 | .ui-icon-circle-close { background-position: -32px -192px; } 254 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 255 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 256 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 257 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 258 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 259 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 260 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 261 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 262 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 263 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 264 | .ui-icon-circle-check { background-position: -208px -192px; } 265 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 266 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 267 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 268 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 269 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 270 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 271 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 272 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 273 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 274 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 275 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 276 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 277 | 278 | 279 | /* Misc visuals 280 | ----------------------------------*/ 281 | 282 | /* Corner radius */ 283 | .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } 284 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } 285 | .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } 286 | .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } 287 | 288 | /* Overlays */ 289 | .ui-widget-overlay { background: #eeeeee url(images/ui-bg_diagonals-thick_90_eeeeee_40x40.png) 50% 50% repeat; opacity: .80;filter:Alpha(Opacity=80); } 290 | .ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #000000 url(images/ui-bg_highlight-hard_70_000000_1x100.png) 50% top repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* 291 | * jQuery UI Resizable 1.8.14 292 | * 293 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 294 | * Dual licensed under the MIT or GPL Version 2 licenses. 295 | * http://jquery.org/license 296 | * 297 | * http://docs.jquery.com/UI/Resizable#theming 298 | */ 299 | .ui-resizable { position: relative;} 300 | .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } 301 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } 302 | .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } 303 | .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } 304 | .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } 305 | .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } 306 | .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } 307 | .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } 308 | .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } 309 | .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* 310 | * jQuery UI Selectable 1.8.14 311 | * 312 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 313 | * Dual licensed under the MIT or GPL Version 2 licenses. 314 | * http://jquery.org/license 315 | * 316 | * http://docs.jquery.com/UI/Selectable#theming 317 | */ 318 | .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } 319 | /* 320 | * jQuery UI Accordion 1.8.14 321 | * 322 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 323 | * Dual licensed under the MIT or GPL Version 2 licenses. 324 | * http://jquery.org/license 325 | * 326 | * http://docs.jquery.com/UI/Accordion#theming 327 | */ 328 | /* IE/Win - Fix animation bug - #4615 */ 329 | .ui-accordion { width: 100%; } 330 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } 331 | .ui-accordion .ui-accordion-li-fix { display: inline; } 332 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } 333 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } 334 | .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 335 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } 336 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } 337 | .ui-accordion .ui-accordion-content-active { display: block; } 338 | /* 339 | * jQuery UI Autocomplete 1.8.14 340 | * 341 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 342 | * Dual licensed under the MIT or GPL Version 2 licenses. 343 | * http://jquery.org/license 344 | * 345 | * http://docs.jquery.com/UI/Autocomplete#theming 346 | */ 347 | .ui-autocomplete { position: absolute; cursor: default; } 348 | 349 | /* workarounds */ 350 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ 351 | 352 | /* 353 | * jQuery UI Menu 1.8.14 354 | * 355 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 356 | * Dual licensed under the MIT or GPL Version 2 licenses. 357 | * http://jquery.org/license 358 | * 359 | * http://docs.jquery.com/UI/Menu#theming 360 | */ 361 | .ui-menu { 362 | list-style:none; 363 | padding: 2px; 364 | margin: 0; 365 | display:block; 366 | float: left; 367 | } 368 | .ui-menu .ui-menu { 369 | margin-top: -3px; 370 | } 371 | .ui-menu .ui-menu-item { 372 | margin:0; 373 | padding: 0; 374 | zoom: 1; 375 | float: left; 376 | clear: left; 377 | width: 100%; 378 | } 379 | .ui-menu .ui-menu-item a { 380 | text-decoration:none; 381 | display:block; 382 | padding:.2em .4em; 383 | line-height:1.5; 384 | zoom:1; 385 | } 386 | .ui-menu .ui-menu-item a.ui-state-hover, 387 | .ui-menu .ui-menu-item a.ui-state-active { 388 | font-weight: normal; 389 | margin: -1px; 390 | } 391 | /* 392 | * jQuery UI Button 1.8.14 393 | * 394 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 395 | * Dual licensed under the MIT or GPL Version 2 licenses. 396 | * http://jquery.org/license 397 | * 398 | * http://docs.jquery.com/UI/Button#theming 399 | */ 400 | .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ 401 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ 402 | button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ 403 | .ui-button-icons-only { width: 3.4em; } 404 | button.ui-button-icons-only { width: 3.7em; } 405 | 406 | /*button text element */ 407 | .ui-button .ui-button-text { display: block; line-height: 1.4; } 408 | .ui-button-text-only .ui-button-text { padding: .4em 1em; } 409 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } 410 | .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } 411 | .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } 412 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } 413 | /* no icon support for input elements, provide padding by default */ 414 | input.ui-button { padding: .4em 1em; } 415 | 416 | /*button icon element(s) */ 417 | .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } 418 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } 419 | .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } 420 | .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 421 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 422 | 423 | /*button sets*/ 424 | .ui-buttonset { margin-right: 7px; } 425 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } 426 | 427 | /* workarounds */ 428 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ 429 | /* 430 | * jQuery UI Dialog 1.8.14 431 | * 432 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 433 | * Dual licensed under the MIT or GPL Version 2 licenses. 434 | * http://jquery.org/license 435 | * 436 | * http://docs.jquery.com/UI/Dialog#theming 437 | */ 438 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } 439 | .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } 440 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 441 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } 442 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } 443 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } 444 | .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 445 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } 446 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } 447 | .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } 448 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 449 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 450 | /* 451 | * jQuery UI Slider 1.8.14 452 | * 453 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 454 | * Dual licensed under the MIT or GPL Version 2 licenses. 455 | * http://jquery.org/license 456 | * 457 | * http://docs.jquery.com/UI/Slider#theming 458 | */ 459 | .ui-slider { position: relative; text-align: left; } 460 | .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } 461 | .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } 462 | 463 | .ui-slider-horizontal { height: .8em; } 464 | .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } 465 | .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } 466 | .ui-slider-horizontal .ui-slider-range-min { left: 0; } 467 | .ui-slider-horizontal .ui-slider-range-max { right: 0; } 468 | 469 | .ui-slider-vertical { width: .8em; height: 100px; } 470 | .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } 471 | .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } 472 | .ui-slider-vertical .ui-slider-range-min { bottom: 0; } 473 | .ui-slider-vertical .ui-slider-range-max { top: 0; }/* 474 | * jQuery UI Tabs 1.8.14 475 | * 476 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 477 | * Dual licensed under the MIT or GPL Version 2 licenses. 478 | * http://jquery.org/license 479 | * 480 | * http://docs.jquery.com/UI/Tabs#theming 481 | */ 482 | .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 483 | .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } 484 | .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } 485 | .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } 486 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } 487 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } 488 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ 489 | .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } 490 | .ui-tabs .ui-tabs-hide { display: none !important; } 491 | /* 492 | * jQuery UI Progressbar 1.8.14 493 | * 494 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 495 | * Dual licensed under the MIT or GPL Version 2 licenses. 496 | * http://jquery.org/license 497 | * 498 | * http://docs.jquery.com/UI/Progressbar#theming 499 | */ 500 | .ui-progressbar { height:2em; text-align: left; } 501 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } -------------------------------------------------------------------------------- /css/cupertino/jquery-ui-1.8.16.custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.16 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming/API 9 | */ 10 | 11 | /* Layout helpers 12 | ----------------------------------*/ 13 | .ui-helper-hidden { display: none; } 14 | .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } 15 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 16 | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } 17 | .ui-helper-clearfix { display: inline-block; } 18 | /* required comment for clearfix to work in Opera \*/ 19 | * html .ui-helper-clearfix { height:1%; } 20 | .ui-helper-clearfix { display:block; } 21 | /* end clearfix */ 22 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 23 | 24 | 25 | /* Interaction Cues 26 | ----------------------------------*/ 27 | .ui-state-disabled { cursor: default !important; } 28 | 29 | 30 | /* Icons 31 | ----------------------------------*/ 32 | 33 | /* states and images */ 34 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 35 | 36 | 37 | /* Misc visuals 38 | ----------------------------------*/ 39 | 40 | /* Overlays */ 41 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 42 | 43 | 44 | /* 45 | * jQuery UI CSS Framework 1.8.16 46 | * 47 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 48 | * Dual licensed under the MIT or GPL Version 2 licenses. 49 | * http://jquery.org/license 50 | * 51 | * http://docs.jquery.com/UI/Theming/API 52 | * 53 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=deedf7&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=100&borderColorHeader=aed0ea&fcHeader=222222&iconColorHeader=72a7cf&bgColorContent=f2f5f7&bgTextureContent=04_highlight_hard.png&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=362b36&iconColorContent=72a7cf&bgColorDefault=d7ebf9&bgTextureDefault=02_glass.png&bgImgOpacityDefault=80&borderColorDefault=aed0ea&fcDefault=2779aa&iconColorDefault=3d80b3&bgColorHover=e4f1fb&bgTextureHover=02_glass.png&bgImgOpacityHover=100&borderColorHover=74b2e2&fcHover=0070a3&iconColorHover=2694e8&bgColorActive=3baae3&bgTextureActive=02_glass.png&bgImgOpacityActive=50&borderColorActive=2694e8&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=ffef8f&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=25&borderColorHighlight=f9dd34&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=cd0a0a&bgTextureError=01_flat.png&bgImgOpacityError=15&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffffff&bgColorOverlay=eeeeee&bgTextureOverlay=08_diagonals_thick.png&bgImgOpacityOverlay=90&opacityOverlay=80&bgColorShadow=000000&bgTextureShadow=04_highlight_hard.png&bgImgOpacityShadow=70&opacityShadow=30&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px 54 | */ 55 | 56 | 57 | /* Component containers 58 | ----------------------------------*/ 59 | .ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; } 60 | .ui-widget .ui-widget { font-size: 1em; } 61 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; } 62 | .ui-widget-content { border: 1px solid #dddddd; background: #f2f5f7 url(images/ui-bg_highlight-hard_100_f2f5f7_1x100.png) 50% top repeat-x; color: #362b36; } 63 | .ui-widget-content a { color: #362b36; } 64 | .ui-widget-header { border: 1px solid #aed0ea; background: #deedf7 url(images/ui-bg_highlight-soft_100_deedf7_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } 65 | .ui-widget-header a { color: #222222; } 66 | 67 | /* Interaction states 68 | ----------------------------------*/ 69 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #aed0ea; background: #d7ebf9 url(images/ui-bg_glass_80_d7ebf9_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2779aa; } 70 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2779aa; text-decoration: none; } 71 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #74b2e2; background: #e4f1fb url(images/ui-bg_glass_100_e4f1fb_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #0070a3; } 72 | .ui-state-hover a, .ui-state-hover a:hover { color: #0070a3; text-decoration: none; } 73 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #2694e8; background: #3baae3 url(images/ui-bg_glass_50_3baae3_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; } 74 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; } 75 | .ui-widget :active { outline: none; } 76 | 77 | /* Interaction Cues 78 | ----------------------------------*/ 79 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #f9dd34; background: #ffef8f url(images/ui-bg_highlight-soft_25_ffef8f_1x100.png) 50% top repeat-x; color: #363636; } 80 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } 81 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #cd0a0a url(images/ui-bg_flat_15_cd0a0a_40x100.png) 50% 50% repeat-x; color: #ffffff; } 82 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; } 83 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; } 84 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } 85 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 86 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 87 | 88 | /* Icons 89 | ----------------------------------*/ 90 | 91 | /* states and images */ 92 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_72a7cf_256x240.png); } 93 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_72a7cf_256x240.png); } 94 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_72a7cf_256x240.png); } 95 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_3d80b3_256x240.png); } 96 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_2694e8_256x240.png); } 97 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } 98 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } 99 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } 100 | 101 | /* positioning */ 102 | .ui-icon-carat-1-n { background-position: 0 0; } 103 | .ui-icon-carat-1-ne { background-position: -16px 0; } 104 | .ui-icon-carat-1-e { background-position: -32px 0; } 105 | .ui-icon-carat-1-se { background-position: -48px 0; } 106 | .ui-icon-carat-1-s { background-position: -64px 0; } 107 | .ui-icon-carat-1-sw { background-position: -80px 0; } 108 | .ui-icon-carat-1-w { background-position: -96px 0; } 109 | .ui-icon-carat-1-nw { background-position: -112px 0; } 110 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 111 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 112 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 113 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 114 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 115 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 116 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 117 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 118 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 119 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 120 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 121 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 122 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 123 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 124 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 125 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 126 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 127 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 128 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 129 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 130 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 131 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 132 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 133 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 134 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 135 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 136 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 137 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 138 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 139 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 140 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 141 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 142 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 143 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 144 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 145 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 146 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 147 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 148 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 149 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 150 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 151 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 152 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 153 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 154 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 155 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 156 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 157 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 158 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 159 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 160 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 161 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 162 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 163 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 164 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 165 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 166 | .ui-icon-arrow-4 { background-position: 0 -80px; } 167 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 168 | .ui-icon-extlink { background-position: -32px -80px; } 169 | .ui-icon-newwin { background-position: -48px -80px; } 170 | .ui-icon-refresh { background-position: -64px -80px; } 171 | .ui-icon-shuffle { background-position: -80px -80px; } 172 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 173 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 174 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 175 | .ui-icon-folder-open { background-position: -16px -96px; } 176 | .ui-icon-document { background-position: -32px -96px; } 177 | .ui-icon-document-b { background-position: -48px -96px; } 178 | .ui-icon-note { background-position: -64px -96px; } 179 | .ui-icon-mail-closed { background-position: -80px -96px; } 180 | .ui-icon-mail-open { background-position: -96px -96px; } 181 | .ui-icon-suitcase { background-position: -112px -96px; } 182 | .ui-icon-comment { background-position: -128px -96px; } 183 | .ui-icon-person { background-position: -144px -96px; } 184 | .ui-icon-print { background-position: -160px -96px; } 185 | .ui-icon-trash { background-position: -176px -96px; } 186 | .ui-icon-locked { background-position: -192px -96px; } 187 | .ui-icon-unlocked { background-position: -208px -96px; } 188 | .ui-icon-bookmark { background-position: -224px -96px; } 189 | .ui-icon-tag { background-position: -240px -96px; } 190 | .ui-icon-home { background-position: 0 -112px; } 191 | .ui-icon-flag { background-position: -16px -112px; } 192 | .ui-icon-calendar { background-position: -32px -112px; } 193 | .ui-icon-cart { background-position: -48px -112px; } 194 | .ui-icon-pencil { background-position: -64px -112px; } 195 | .ui-icon-clock { background-position: -80px -112px; } 196 | .ui-icon-disk { background-position: -96px -112px; } 197 | .ui-icon-calculator { background-position: -112px -112px; } 198 | .ui-icon-zoomin { background-position: -128px -112px; } 199 | .ui-icon-zoomout { background-position: -144px -112px; } 200 | .ui-icon-search { background-position: -160px -112px; } 201 | .ui-icon-wrench { background-position: -176px -112px; } 202 | .ui-icon-gear { background-position: -192px -112px; } 203 | .ui-icon-heart { background-position: -208px -112px; } 204 | .ui-icon-star { background-position: -224px -112px; } 205 | .ui-icon-link { background-position: -240px -112px; } 206 | .ui-icon-cancel { background-position: 0 -128px; } 207 | .ui-icon-plus { background-position: -16px -128px; } 208 | .ui-icon-plusthick { background-position: -32px -128px; } 209 | .ui-icon-minus { background-position: -48px -128px; } 210 | .ui-icon-minusthick { background-position: -64px -128px; } 211 | .ui-icon-close { background-position: -80px -128px; } 212 | .ui-icon-closethick { background-position: -96px -128px; } 213 | .ui-icon-key { background-position: -112px -128px; } 214 | .ui-icon-lightbulb { background-position: -128px -128px; } 215 | .ui-icon-scissors { background-position: -144px -128px; } 216 | .ui-icon-clipboard { background-position: -160px -128px; } 217 | .ui-icon-copy { background-position: -176px -128px; } 218 | .ui-icon-contact { background-position: -192px -128px; } 219 | .ui-icon-image { background-position: -208px -128px; } 220 | .ui-icon-video { background-position: -224px -128px; } 221 | .ui-icon-script { background-position: -240px -128px; } 222 | .ui-icon-alert { background-position: 0 -144px; } 223 | .ui-icon-info { background-position: -16px -144px; } 224 | .ui-icon-notice { background-position: -32px -144px; } 225 | .ui-icon-help { background-position: -48px -144px; } 226 | .ui-icon-check { background-position: -64px -144px; } 227 | .ui-icon-bullet { background-position: -80px -144px; } 228 | .ui-icon-radio-off { background-position: -96px -144px; } 229 | .ui-icon-radio-on { background-position: -112px -144px; } 230 | .ui-icon-pin-w { background-position: -128px -144px; } 231 | .ui-icon-pin-s { background-position: -144px -144px; } 232 | .ui-icon-play { background-position: 0 -160px; } 233 | .ui-icon-pause { background-position: -16px -160px; } 234 | .ui-icon-seek-next { background-position: -32px -160px; } 235 | .ui-icon-seek-prev { background-position: -48px -160px; } 236 | .ui-icon-seek-end { background-position: -64px -160px; } 237 | .ui-icon-seek-start { background-position: -80px -160px; } 238 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 239 | .ui-icon-seek-first { background-position: -80px -160px; } 240 | .ui-icon-stop { background-position: -96px -160px; } 241 | .ui-icon-eject { background-position: -112px -160px; } 242 | .ui-icon-volume-off { background-position: -128px -160px; } 243 | .ui-icon-volume-on { background-position: -144px -160px; } 244 | .ui-icon-power { background-position: 0 -176px; } 245 | .ui-icon-signal-diag { background-position: -16px -176px; } 246 | .ui-icon-signal { background-position: -32px -176px; } 247 | .ui-icon-battery-0 { background-position: -48px -176px; } 248 | .ui-icon-battery-1 { background-position: -64px -176px; } 249 | .ui-icon-battery-2 { background-position: -80px -176px; } 250 | .ui-icon-battery-3 { background-position: -96px -176px; } 251 | .ui-icon-circle-plus { background-position: 0 -192px; } 252 | .ui-icon-circle-minus { background-position: -16px -192px; } 253 | .ui-icon-circle-close { background-position: -32px -192px; } 254 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 255 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 256 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 257 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 258 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 259 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 260 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 261 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 262 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 263 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 264 | .ui-icon-circle-check { background-position: -208px -192px; } 265 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 266 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 267 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 268 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 269 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 270 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 271 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 272 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 273 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 274 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 275 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 276 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 277 | 278 | 279 | /* Misc visuals 280 | ----------------------------------*/ 281 | 282 | /* Corner radius */ 283 | .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -khtml-border-top-left-radius: 6px; border-top-left-radius: 6px; } 284 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -khtml-border-top-right-radius: 6px; border-top-right-radius: 6px; } 285 | .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -khtml-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; } 286 | .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; -khtml-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; } 287 | 288 | /* Overlays */ 289 | .ui-widget-overlay { background: #eeeeee url(images/ui-bg_diagonals-thick_90_eeeeee_40x40.png) 50% 50% repeat; opacity: .80;filter:Alpha(Opacity=80); } 290 | .ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #000000 url(images/ui-bg_highlight-hard_70_000000_1x100.png) 50% top repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* 291 | * jQuery UI Resizable 1.8.16 292 | * 293 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 294 | * Dual licensed under the MIT or GPL Version 2 licenses. 295 | * http://jquery.org/license 296 | * 297 | * http://docs.jquery.com/UI/Resizable#theming 298 | */ 299 | .ui-resizable { position: relative;} 300 | .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } 301 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } 302 | .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } 303 | .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } 304 | .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } 305 | .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } 306 | .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } 307 | .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } 308 | .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } 309 | .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* 310 | * jQuery UI Selectable 1.8.16 311 | * 312 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 313 | * Dual licensed under the MIT or GPL Version 2 licenses. 314 | * http://jquery.org/license 315 | * 316 | * http://docs.jquery.com/UI/Selectable#theming 317 | */ 318 | .ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } 319 | /* 320 | * jQuery UI Accordion 1.8.16 321 | * 322 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 323 | * Dual licensed under the MIT or GPL Version 2 licenses. 324 | * http://jquery.org/license 325 | * 326 | * http://docs.jquery.com/UI/Accordion#theming 327 | */ 328 | /* IE/Win - Fix animation bug - #4615 */ 329 | .ui-accordion { width: 100%; } 330 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } 331 | .ui-accordion .ui-accordion-li-fix { display: inline; } 332 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } 333 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } 334 | .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } 335 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } 336 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } 337 | .ui-accordion .ui-accordion-content-active { display: block; } 338 | /* 339 | * jQuery UI Autocomplete 1.8.16 340 | * 341 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 342 | * Dual licensed under the MIT or GPL Version 2 licenses. 343 | * http://jquery.org/license 344 | * 345 | * http://docs.jquery.com/UI/Autocomplete#theming 346 | */ 347 | .ui-autocomplete { position: absolute; cursor: default; } 348 | 349 | /* workarounds */ 350 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ 351 | 352 | /* 353 | * jQuery UI Menu 1.8.16 354 | * 355 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 356 | * Dual licensed under the MIT or GPL Version 2 licenses. 357 | * http://jquery.org/license 358 | * 359 | * http://docs.jquery.com/UI/Menu#theming 360 | */ 361 | .ui-menu { 362 | list-style:none; 363 | padding: 2px; 364 | margin: 0; 365 | display:block; 366 | float: left; 367 | } 368 | .ui-menu .ui-menu { 369 | margin-top: -3px; 370 | } 371 | .ui-menu .ui-menu-item { 372 | margin:0; 373 | padding: 0; 374 | zoom: 1; 375 | float: left; 376 | clear: left; 377 | width: 100%; 378 | } 379 | .ui-menu .ui-menu-item a { 380 | text-decoration:none; 381 | display:block; 382 | padding:.2em .4em; 383 | line-height:1.5; 384 | zoom:1; 385 | } 386 | .ui-menu .ui-menu-item a.ui-state-hover, 387 | .ui-menu .ui-menu-item a.ui-state-active { 388 | font-weight: normal; 389 | margin: -1px; 390 | } 391 | /* 392 | * jQuery UI Button 1.8.16 393 | * 394 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 395 | * Dual licensed under the MIT or GPL Version 2 licenses. 396 | * http://jquery.org/license 397 | * 398 | * http://docs.jquery.com/UI/Button#theming 399 | */ 400 | .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ 401 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ 402 | button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ 403 | .ui-button-icons-only { width: 3.4em; } 404 | button.ui-button-icons-only { width: 3.7em; } 405 | 406 | /*button text element */ 407 | .ui-button .ui-button-text { display: block; line-height: 1.4; } 408 | .ui-button-text-only .ui-button-text { padding: .4em 1em; } 409 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } 410 | .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } 411 | .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } 412 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } 413 | /* no icon support for input elements, provide padding by default */ 414 | input.ui-button { padding: .4em 1em; } 415 | 416 | /*button icon element(s) */ 417 | .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } 418 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } 419 | .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } 420 | .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 421 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 422 | 423 | /*button sets*/ 424 | .ui-buttonset { margin-right: 7px; } 425 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } 426 | 427 | /* workarounds */ 428 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ 429 | /* 430 | * jQuery UI Dialog 1.8.16 431 | * 432 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 433 | * Dual licensed under the MIT or GPL Version 2 licenses. 434 | * http://jquery.org/license 435 | * 436 | * http://docs.jquery.com/UI/Dialog#theming 437 | */ 438 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } 439 | .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } 440 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 441 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } 442 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } 443 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } 444 | .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 445 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } 446 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } 447 | .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } 448 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 449 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 450 | /* 451 | * jQuery UI Slider 1.8.16 452 | * 453 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 454 | * Dual licensed under the MIT or GPL Version 2 licenses. 455 | * http://jquery.org/license 456 | * 457 | * http://docs.jquery.com/UI/Slider#theming 458 | */ 459 | .ui-slider { position: relative; text-align: left; } 460 | .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } 461 | .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } 462 | 463 | .ui-slider-horizontal { height: .8em; } 464 | .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } 465 | .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } 466 | .ui-slider-horizontal .ui-slider-range-min { left: 0; } 467 | .ui-slider-horizontal .ui-slider-range-max { right: 0; } 468 | 469 | .ui-slider-vertical { width: .8em; height: 100px; } 470 | .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } 471 | .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } 472 | .ui-slider-vertical .ui-slider-range-min { bottom: 0; } 473 | .ui-slider-vertical .ui-slider-range-max { top: 0; }/* 474 | * jQuery UI Tabs 1.8.16 475 | * 476 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 477 | * Dual licensed under the MIT or GPL Version 2 licenses. 478 | * http://jquery.org/license 479 | * 480 | * http://docs.jquery.com/UI/Tabs#theming 481 | */ 482 | .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 483 | .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } 484 | .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } 485 | .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } 486 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } 487 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } 488 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ 489 | .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } 490 | .ui-tabs .ui-tabs-hide { display: none !important; } 491 | /* 492 | * jQuery UI Datepicker 1.8.16 493 | * 494 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 495 | * Dual licensed under the MIT or GPL Version 2 licenses. 496 | * http://jquery.org/license 497 | * 498 | * http://docs.jquery.com/UI/Datepicker#theming 499 | */ 500 | .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } 501 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } 502 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } 503 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } 504 | .ui-datepicker .ui-datepicker-prev { left:2px; } 505 | .ui-datepicker .ui-datepicker-next { right:2px; } 506 | .ui-datepicker .ui-datepicker-prev-hover { left:1px; } 507 | .ui-datepicker .ui-datepicker-next-hover { right:1px; } 508 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } 509 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 510 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 511 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 512 | .ui-datepicker select.ui-datepicker-month, 513 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 514 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } 515 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } 516 | .ui-datepicker td { border: 0; padding: 1px; } 517 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } 518 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } 519 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } 520 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } 521 | 522 | /* with multiple calendars */ 523 | .ui-datepicker.ui-datepicker-multi { width:auto; } 524 | .ui-datepicker-multi .ui-datepicker-group { float:left; } 525 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } 526 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } 527 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } 528 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } 529 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } 530 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } 531 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } 532 | .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } 533 | 534 | /* RTL support */ 535 | .ui-datepicker-rtl { direction: rtl; } 536 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } 537 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } 538 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } 539 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } 540 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } 541 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } 542 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } 543 | .ui-datepicker-rtl .ui-datepicker-group { float:right; } 544 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 545 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 546 | 547 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ 548 | .ui-datepicker-cover { 549 | display: none; /*sorry for IE5*/ 550 | display/**/: block; /*sorry for IE5*/ 551 | position: absolute; /*must have*/ 552 | z-index: -1; /*must have*/ 553 | filter: mask(); /*must have*/ 554 | top: -4px; /*must have*/ 555 | left: -4px; /*must have*/ 556 | width: 200px; /*must have*/ 557 | height: 200px; /*must have*/ 558 | }/* 559 | * jQuery UI Progressbar 1.8.16 560 | * 561 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 562 | * Dual licensed under the MIT or GPL Version 2 licenses. 563 | * http://jquery.org/license 564 | * 565 | * http://docs.jquery.com/UI/Progressbar#theming 566 | */ 567 | .ui-progressbar { height:2em; text-align: left; } 568 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } -------------------------------------------------------------------------------- /css/fspanel.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | font-family: Arial, sans-serif; 5 | font-size: 100.1%; 6 | font-size: 1em; 7 | } 8 | body { 9 | margin: 4px; 10 | } 11 | h3 { 12 | text-align: center; 13 | color: #2163A4; 14 | font-size: 16px; 15 | text-shadow: 1px 1px 0 rgba(200, 200, 200, 0.7); 16 | border-bottom: 1px solid #dddddd; 17 | margin-bottom: 8px; 18 | } 19 | 20 | #extensions, #calls, #conferences, #freetdms, #sofiastatuses 21 | { 22 | sheight: 50%; 23 | padding: 6px; 24 | float: left; 25 | margin-right: 12px; 26 | } 27 | #extensions { 28 | width: 16%; 29 | } 30 | #sofiastatuses { 31 | width: 16%; 32 | } 33 | #calls { 34 | width: 28%; 35 | } 36 | #conferences { 37 | width: 19%; 38 | } 39 | #freetdms { 40 | width: 22%; 41 | } 42 | 43 | #main_header { 44 | background: url("../images/tab_background.gif") repeat-x scroll 0 0 transparent; 45 | border: 1px solid #DDDDDD; 46 | border-radius: 5px 5px 5px 5px; 47 | height: 26px; 48 | color: #4183C4; 49 | font-size: 14px; 50 | height: 26px; 51 | line-height: 26px; 52 | margin-bottom: 8px; 53 | padding: 0 8px; 54 | text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.7); 55 | } 56 | 57 | .ui-widget-content { 58 | background: 0; 59 | border: 0; 60 | } 61 | .ui-widget-header { 62 | background: 0; 63 | border: 0; 64 | } 65 | 66 | .block_green { 67 | background-color: #F0FFF0; 68 | border: 1px solid #ACCBAC; 69 | border-radius: 5px 5px 5px 5px; 70 | box-shadow: 0 1px 3px #DDDDDD; 71 | display: block; 72 | margin: 0px 0 15px; 73 | overflow: hidden; 74 | padding: 20px; 75 | } 76 | .block_green .ui-widget-content { 77 | background-color: #F0FFF0; 78 | } 79 | .block_green .ui-tabs-panel { 80 | border: 1px solid #ACCBAC; 81 | border-radius: 5px; 82 | } 83 | .block_yellow { 84 | background-color: #FFFFF0; 85 | border: 1px solid #CBCBAC; 86 | border-radius: 5px 5px 5px 5px; 87 | box-shadow: 0 1px 3px #DDDDDD; 88 | display: block; 89 | margin: 0px 0 15px; 90 | overflow: hidden; 91 | padding: 20px; 92 | } 93 | .block_yellow .ui-widget-content { 94 | background-color: #FFFFF0; 95 | } 96 | .block_yellow .ui-tabs-panel { 97 | border: 1px solid #CBCBAC; 98 | border-radius: 5px; 99 | } 100 | .block_blue { 101 | background-color: #F0FFFF; 102 | border: 1px solid #ACCBCB; 103 | border-radius: 5px 5px 5px 5px; 104 | box-shadow: 0 1px 3px #DDDDDD; 105 | display: block; 106 | margin: 0px 0 15px; 107 | overflow: hidden; 108 | padding: 20px; 109 | } 110 | .block_blue .ui-widget-content { 111 | background-color: #F0FFFF; 112 | } 113 | .block_blue .ui-tabs-panel { 114 | border: 1px solid #ACCBCB; 115 | border-radius: 5px; 116 | } 117 | .block_red { 118 | background-color: #FFF0F0; 119 | border: 1px solid #CBACAC; 120 | border-radius: 5px 5px 5px 5px; 121 | box-shadow: 0 1px 3px #DDDDDD; 122 | display: block; 123 | margin: 0px 0 15px; 124 | overflow: hidden; 125 | padding: 20px; 126 | } 127 | .block_red .ui-widget-content { 128 | background-color: #FFF0F0; 129 | } 130 | .block_red .ui-tabs-panel { 131 | border: 1px solid #CBACAC; 132 | border-radius: 5px; 133 | } 134 | .datatable { 135 | font-size: 14px; 136 | border-collapse: collapse; 137 | } 138 | .datatable th, .datatable td { 139 | padding: 1px; 140 | border: 2px solid white; 141 | } 142 | .yellow_border { 143 | border-bottom: 1px solid #CBCBAC; 144 | } 145 | .row_selected { 146 | background-color: #D0DDDD; 147 | } 148 | .conf_header { 149 | text-align: center; 150 | font-weight: bold; 151 | } 152 | .sort_sign { 153 | font-size: 10px; 154 | color: blue; 155 | cursor: hand; 156 | cursor: pointer; 157 | } 158 | #logo { 159 | float: left; 160 | } 161 | .top_item { 162 | float: right; 163 | margin-right: 16px; 164 | cursor: hand; 165 | cursor: pointer; 166 | } 167 | input[type=submit], input[type=reset], input[type=button] { 168 | border-color:#c2e254 #9bb838 #9bb838 #c2e254; 169 | border-style:solid; 170 | border-width:1px; 171 | background-color: #D0F0D0; 172 | cursor: hand; 173 | cursor: pointer; 174 | padding: 0px 4px 0px 4px; 175 | } 176 | #settings, #about, #commands, #cmdresult { 177 | position: absolute; 178 | left: 100px; 179 | right: 100px; 180 | width: 240px; 181 | height: 200px; 182 | z-index: 1; 183 | display: none; 184 | } 185 | #commands td { 186 | cursor: hand; 187 | cursor: pointer; 188 | } 189 | #cmdresult { 190 | width: 400px; 191 | height: 300px; 192 | } 193 | .settings_div { 194 | display: none; 195 | position: absolute; 196 | top: 0px; 197 | left: 0px; 198 | } 199 | #table_conf {width: 100%} 200 | .ui-widget { font-size: 10px; } 201 | .sliders { 202 | padding: 4px !important; 203 | width: 100px; 204 | float: right; 205 | display: inline; 206 | margin-top: 4px; 207 | margin-right: 10px; 208 | } 209 | .ui-widget-content { border: 1px solid #dddddd; height: 2px;} 210 | .cmd_item { 211 | border: 1px solid #dddddd; 212 | border-radius: 4px; 213 | margin: 2px; 214 | padding-left: 8px; 215 | cursor: hand; 216 | cursor: pointer; 217 | } 218 | .cmd_item input { border: 1px solid #dddddd; } 219 | .cmd_item_hover {background-color: #F0DDDD;} 220 | .context_menu_hdr_left {float: left;} 221 | .context_menu_hdr_right {float: right;} 222 | .cmd_div { 223 | padding: 4px; 224 | display: none; 225 | position: absolute; 226 | top: 0px; 227 | left: 0px; 228 | z-index: 1; 229 | } 230 | #cmdresult { 231 | overflow: scroll; 232 | } 233 | -------------------------------------------------------------------------------- /fscontrol.php: -------------------------------------------------------------------------------- 1 | window.parent.comet.handleResponse(\' '); 21 | echo '{"ERROR": "'.$err.'"}'; 22 | //echo '{"ERROR": "'.$err.'"}'."\r\n\r\n"; 23 | print(' \');'); 24 | clearFlush(); 25 | exit; 26 | } 27 | function sendErrorXML() { 28 | $s = ''; 29 | foreach (libxml_get_errors() as $error) { 30 | $s .= str_replace("\n", ' ', $error->message).' Line: '.$error->line.', column: '.$error->column.' '; 31 | } 32 | libxml_clear_errors(); 33 | sendError($s.' Please debug or disable XML!'); 34 | exit; 35 | } 36 | 37 | // getVar definition 38 | if (!defined('PHP_VERSION_ID')) { 39 | $version = explode('.', PHP_VERSION); 40 | define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); 41 | if (PHP_VERSION_ID < 50200) { 42 | function getVar($varname) { 43 | if (array_key_exists($varname, $_GET)) { 44 | return trim($_GET[$varname]); 45 | } else { 46 | return ''; 47 | } 48 | } 49 | } else { 50 | function getVar($varname) { 51 | // PHP ver >= 5.2 52 | return filter_input(INPUT_GET, $varname, FILTER_SANITIZE_STRING); 53 | } 54 | } 55 | } else { 56 | function getVar($varname) { 57 | return filter_input(INPUT_GET, $varname, FILTER_SANITIZE_STRING); 58 | } 59 | } 60 | // For old versions PHP 61 | if ( !function_exists('json_decode') ){ 62 | function json_decode($json, $assoc=false) 63 | { 64 | $comment = false; 65 | $out = '$x='; 66 | 67 | for ($i=0; $i $value ) { 93 | $items[] = json_encode("$key") . ':' . json_encode($value); 94 | } 95 | $json = '{' . implode(',', $items) . '}'; 96 | } 97 | } elseif( is_string($data) ) { 98 | # Escape non-printable or Non-ASCII characters. 99 | # I also put the \\ character first, as suggested in comments on the 'addclashes' page. 100 | $string = '"' . addcslashes($data, "\\\"\n\r\t/" . chr(8) . chr(12)) . '"'; 101 | $json = ''; 102 | $len = strlen($string); 103 | # Convert UTF-8 to Hexadecimal Codepoints. 104 | for( $i = 0; $i < $len; $i++ ) { 105 | $char = $string[$i]; 106 | $c1 = ord($char); 107 | # Single byte; 108 | if( $c1 <128 ) { 109 | $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1); 110 | continue; 111 | } 112 | # Double byte 113 | $c2 = ord($string[++$i]); 114 | if ( ($c1 & 32) === 0 ) { 115 | $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128); 116 | continue; 117 | } 118 | # Triple 119 | $c3 = ord($string[++$i]); 120 | if( ($c1 & 16) === 0 ) { 121 | $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128)); 122 | continue; 123 | } 124 | # Quadruple 125 | $c4 = ord($string[++$i]); 126 | if( ($c1 & 8 ) === 0 ) { 127 | $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1; 128 | $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3); 129 | $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128); 130 | $json .= sprintf("\\u%04x\\u%04x", $w1, $w2); 131 | } 132 | } 133 | } else { 134 | # int, floats, bools, null 135 | $json = strtolower(var_export( $data, true )); 136 | } 137 | return $json; 138 | } 139 | } 140 | 141 | class socketReader { 142 | protected $socket; 143 | 144 | public function __construct() { 145 | $this->socket = socket_create (AF_INET, SOCK_STREAM, 0); 146 | if ($this->socket < 0) sendError('socket_create() failed: reason: '.socket_strerror ($this->socket)); 147 | } 148 | public function connect($server, $port) { 149 | return socket_connect($this->socket, $server, $port); 150 | } 151 | public function disconnect() { 152 | return socket_close($this->socket); 153 | } 154 | public function sRead($cnt) { 155 | if (empty($cnt)) return false; 156 | $c = 0; 157 | $res = ''; 158 | do { 159 | $s = socket_read($this->socket, 1400, PHP_NORMAL_READ); 160 | if ($s === false) break; 161 | $res .= $s; 162 | $c = $c + strlen($s); 163 | } while ($c < $cnt); 164 | return $res; 165 | } 166 | public function pRead() { 167 | $res = ''; 168 | do { 169 | $s = socket_read($this->socket, 1400, PHP_NORMAL_READ); 170 | if (($s === false) | ($s == "\n")) break; 171 | $res .= $s; 172 | } while (true); 173 | return $res; 174 | } 175 | public function sendData($data) { 176 | socket_write($this->socket, $data, strlen ($data)); 177 | } 178 | public function getContentLen($v) { 179 | $p = strpos($v, 'Content-Length:'); 180 | if ($p === false) return false; 181 | $n = strpos($v, "\n", $p+15); 182 | if ($n === false) return false; 183 | return trim(substr($v, $p+15, $n-$p-15)); 184 | } 185 | } 186 | 187 | function findID($arr, $id) { 188 | if (count($arr) == 0) return false; 189 | for ($i=0; $isocket = $socket; 208 | } 209 | public function getData($command) { 210 | $this->socket->sendData($command); 211 | $out = $this->socket->pRead(); 212 | $c = $this->socket->getContentLen($out); 213 | if ($c === false) return ''; 214 | return $this->socket->sRead($c); 215 | } 216 | 217 | public function loadData($param = null) {} 218 | public function fieldProcessing($field, $value) { 219 | return $value; 220 | } 221 | public function compare($data1, $data2) { 222 | foreach ($data1 as $part => $dvalue) { 223 | if (array_key_exists($part, $data2)) { 224 | foreach ($dvalue as $key => $value) { 225 | if (array_key_exists($key, $data2[$part])) { 226 | // Field exist - compare two fields 227 | if (is_array($value)) { 228 | $x = array_diff($value, $data2[$part][$key]); 229 | if (count($x) > 0) $this->onCompare(fsData::cFieldNotEqual, $part, $key, $data2[$part][$key]); 230 | } else { 231 | if ($value != $data2[$part][$key]) { 232 | $this->onCompare(fsData::cFieldNotEqual, $part, $key, $data2[$part][$key]); 233 | } 234 | } 235 | } else { 236 | // Field not exist in data2[part] 237 | $this->onCompare(fsData::cField1NotFound, $part, $key, $value); 238 | } 239 | } 240 | } else { 241 | // Part not found in data2 242 | $this->onCompare(fsData::cPart1NotFound, $part, null, $dvalue); 243 | } 244 | } 245 | foreach ($data2 as $part => $dvalue) { 246 | if (array_key_exists($part, $data1)) { 247 | foreach ($dvalue as $key => $value) { 248 | if (!array_key_exists($key, $data1[$part])) { 249 | // Field not exist in data1[part] 250 | $this->onCompare(fsData::cField2NotFound, $part, $key, $value); 251 | } 252 | } 253 | } else { 254 | // Part not found in data1 255 | $this->onCompare(fsData::cPart2NotFound, $part, null, $dvalue); 256 | } 257 | } 258 | } 259 | public function onCompare($cmp, $part, $field, $newvalue) { 260 | if (!array_key_exists($part, $this->extdata)) $this->extdata[$part] = array(); 261 | if (!array_key_exists($part, $this->data)) $this->data[$part] = array(); 262 | switch ($cmp) { 263 | case fsData::cPart1NotFound : 264 | unset($this->data[$part]); 265 | $this->extdata[$part][fsData::cExtOperation] = 'part_del'; 266 | break; 267 | case fsData::cPart2NotFound : 268 | $this->data[$part] = $newvalue; 269 | $this->extdata[$part] = $newvalue; 270 | $this->extdata[$part][fsData::cExtOperation] = 'part_add'; 271 | break; 272 | case fsData::cField1NotFound : 273 | unset($this->data[$part][$field]); 274 | $this->extdata[$part][$field] = $newvalue; 275 | if (is_array($newvalue)) { 276 | $this->extdata[$part][$field][fsData::cExtOperation] = 'field_del'; 277 | } else { 278 | $this->extdata[$part][fsData::cExtOperation] = 'field_del'; 279 | } 280 | break; 281 | case fsData::cField2NotFound : 282 | $this->data[$part][$field] = $newvalue; 283 | $this->extdata[$part][$field] = $newvalue; 284 | if (is_array($newvalue)) { 285 | $this->extdata[$part][$field][fsData::cExtOperation] = 'field_add'; 286 | } else { 287 | $this->extdata[$part][fsData::cExtOperation] = 'field_add'; 288 | } 289 | break; 290 | case fsData::cFieldNotEqual : 291 | $this->data[$part][$field] = $newvalue; 292 | $this->extdata[$part][$field] = $newvalue; 293 | if (is_array($newvalue)) { 294 | $this->extdata[$part][$field][fsData::cExtOperation] = 'field_upd'; 295 | } else { 296 | $this->extdata[$part][fsData::cExtOperation] = 'field_upd'; 297 | } 298 | break; 299 | } 300 | } 301 | } 302 | 303 | class fsSofia extends fsData { 304 | protected $isFirstCall = true; 305 | 306 | public function loadData($param = null) { 307 | $out = $this->getData("api sofia status profile ".$param." reg\n\n"); 308 | // Fill array: d[user_id][fields from sofia status] 309 | $d = array(); 310 | $n = strpos($out, "Registrations:\n"); 311 | if ($n === false) return $d; 312 | $x = strpos($out, "=====\n", $n); 313 | $y = strpos($out, "Total items returned:", $x+7); 314 | $z = explode("\n\n", substr($out, $x+6, $y-$x-7)); 315 | if ($this->isFirstCall) $d['fields'] = array(); 316 | for ($i=0; $iisFirstCall) $d['fields'][count($d['fields'])] = $y; 326 | $d[$usr][$y] = $this->fieldProcessing($y, trim(substr($x[$j], $n+1, strlen($x[$j])-$n))); 327 | } 328 | $this->isFirstCall = false; 329 | } 330 | return $d; 331 | } 332 | public function loadDataStatus($param = null) { 333 | $fieldNames = array('name', 'type', 'data', 'state', 'count'); 334 | 335 | $out = $this->getData("api sofia status".(is_null($param) ? '' : ' profile '.$param.' reg')."\n\n"); 336 | // Fill array: d[n][fields from sofia status] 337 | $d = array(); 338 | $n = strpos($out, "=====\n"); 339 | if ($n === false) return $d; 340 | $x = strpos($out, "=====", $n+6); 341 | // Variant only for all sofia status (without profile name) 342 | $z = explode("\n", substr($out, $n+6, $x-$n-7)); 343 | for ($i=0; $iisFirstCall) $this->isFirstCall = false; 362 | return $d; 363 | } 364 | /* 365 | * Special processing (delete EXPSECS parameter) 366 | */ 367 | public function fieldProcessing($field, $value) { 368 | if ($field == 'Contact') { 369 | $s = str_replace('"', '', $value); 370 | $n = strpos($s, '<'); 371 | if ($n !== false) $s = substr($s, 0, $n); 372 | return $s; 373 | //return str_replace('<', '<', str_replace('>', '>', $s)); 374 | } 375 | if ($field != 'Status') return $value; 376 | $n = strpos($value, 'EXPSECS'); 377 | if ($n === false) { 378 | return $value; 379 | } else { 380 | return substr($value, 0, $n-1); 381 | } 382 | } 383 | } 384 | class fsSofiaXML extends fsSofia { 385 | public function loadDataStatus($param = null) { 386 | $out = $this->getData("api sofia xmlstatus\n\n"); 387 | $xml = simplexml_load_string(str_replace('encoding="ISO-8859-1"', 'encoding="utf-8"', $out), 'SimpleXMLElement', LIBXML_NOERROR | LIBXML_NOWARNING); 388 | if (!$xml) sendErrorXML(); 389 | $d = array(); 390 | $prevp = ''; // parent profile name, for construct profile::gateway 391 | foreach ($xml->children() as $child) { //level: profile gateway alias 392 | $x = false; 393 | $type = $child->getName(); 394 | foreach ($child->children() as $item) { // next level: name, type, data, state 395 | $s = $item->getName(); 396 | if ($s == 'name') { 397 | $x = strval($item); 398 | if ($type == 'gateway') $x = $prevp.'::'.$x; 399 | $d[$x] = array(); 400 | if ($type == 'profile') $prevp = $x; 401 | } 402 | if ($s == 'state') { 403 | /* $c = explode(' ', $item); 404 | $d[$x]['state'] = $c[0]; 405 | $d[$x]['count'] = (count($c) > 1 ? intval(str_replace('(', '', str_replace(')', '', $c[1]))) : 0);*/ 406 | $c = explode('(', $item); 407 | $d[$x]['state'] = $c[0]; 408 | $d[$x]['count'] = (count($c) > 1 ? intval(str_replace(')', '', $c[1])) : 0); 409 | } else { 410 | $d[$x][$s] = strval($item); 411 | } 412 | } 413 | } 414 | if ($this->isFirstCall) $this->isFirstCall = false; 415 | return $d; 416 | } 417 | public function loadData($param = null) { 418 | $out = $this->getData("api sofia xmlstatus profile ".$param." reg\n\n"); 419 | $xml = simplexml_load_string(str_replace('encoding="ISO-8859-1"', 'encoding="utf-8"', $out), 'SimpleXMLElement', LIBXML_NOERROR | LIBXML_NOWARNING); 420 | if (!$xml) sendErrorXML(); 421 | $d = array(); 422 | if ($this->isFirstCall) { 423 | $child2 = $xml->children(); 424 | $child = $child2->children(); 425 | $i = 0; 426 | $d['fields'] = array(); 427 | foreach ($child->children() as $item) { 428 | $d['fields'][$i] = $item->getName(); 429 | $i++; 430 | } 431 | } 432 | foreach ($xml->children() as $child) { //level: profile-info, registrations 433 | foreach ($child->children() as $regs) { // level: registration 434 | $x = false; 435 | foreach ($regs->children() as $item) { // next level: fields 436 | $s = $item->getName(); 437 | if ($s == 'call-id') { 438 | $x = strval($item); 439 | $d[$x] = array(); 440 | } 441 | $d[$x][$s] = $this->fieldProcessing($s, strval($item)); 442 | } 443 | } 444 | } 445 | if ($this->isFirstCall) $this->isFirstCall = false; 446 | return $d; 447 | } 448 | /* 449 | * Special processing (delete exp parameter) 450 | */ 451 | public function fieldProcessing($field, $value) { 452 | if ($field == 'contact') { 453 | $s = str_replace('"', '', $value); 454 | $n = strpos($s, '<'); 455 | if ($n !== false) $s = substr($s, 0, $n); 456 | return $s; 457 | //return str_replace('<', '<', str_replace('>', '>', $s)); 458 | } 459 | if ($field != 'status') return $value; 460 | $n = strpos($value, 'exp'); 461 | if ($n === false) { 462 | return $value; 463 | } else { 464 | return substr($value, 0, $n-1); 465 | } 466 | } 467 | } 468 | 469 | class fsConf extends fsData { 470 | public $filter = ''; 471 | 472 | public function loadData($param = null) { 473 | $out = $this->getData("api conference list\n\n"); 474 | // Fill array: d[conference id][confNNN][name, number, status] 475 | $d = array(); 476 | if (stripos($out, 'No active conferences') !== false) return $d; 477 | $x = explode("\n", $out); 478 | for ($i=0; $ifilter)) & ($conf != $this->filter)) continue; 483 | $d[$conf] = array(); 484 | } else { 485 | $y = explode(";", $x[$i]); 486 | if (count($y) < 3) continue; 487 | // variant 1: 488 | //$n = count($d[$conf]); 489 | for ($j=0; $jgetData("api show ".(empty($param) ? $this->defaultChanFunc : $param)."\n\n"); 517 | // Fill array d[uuid][fields from channel status] 518 | $d = array(); 519 | $idx = array(); 520 | $x = explode("\n", $out); 521 | for ($i=0; $iisFirstCall) $d['fields'][$j] = $y[$j]; 529 | } else { 530 | if ($j == 0) { 531 | $d[$y[0]] = array(); 532 | } else { 533 | $d[$y[0]][$idx[$j]] = $y[$j]; 534 | } 535 | } 536 | } 537 | } 538 | if ($this->isFirstCall) $this->isFirstCall = false; 539 | return $d; 540 | } 541 | /* 542 | * Special one channel parsing 543 | */ 544 | public static function parseChan($s) { 545 | $arr = array(); 546 | $x = 0; // word count 547 | $w = ''; // last word 548 | $utf8marker = chr(128); 549 | $doparse = true; 550 | $i = 0; 551 | while(isset($s{$i})){ 552 | if ($s{$i} >= $utf8marker) { 553 | $parsechar = substr($s, $i, 2); 554 | $i += 2; 555 | } else { 556 | $parsechar = $s{$i}; 557 | $i++; 558 | } 559 | if ($doparse) { 560 | if ($parsechar == ',') { 561 | $arr[$x] = $w; 562 | $w = ''; 563 | $x++; 564 | } else { 565 | if ($parsechar == '[') { 566 | $doparse = false; 567 | $w .= $parsechar; 568 | } else { 569 | $w .= $parsechar; 570 | } 571 | } 572 | } else { 573 | if ($parsechar == ']') { 574 | $w .= $parsechar; 575 | $doparse = true; 576 | } else { 577 | $w .= $parsechar; 578 | } 579 | } 580 | } 581 | return $arr; 582 | } 583 | } 584 | class fsChannelXML extends fsChannel { 585 | /* 586 | * param: channels, calls, detailed_calls 587 | */ 588 | public function loadData($param = null) { 589 | $d = array(); 590 | $out = $this->getData("api show ".(empty($param) ? $this->defaultChanFunc : $param)." as xml\n\n"); 591 | if (strpos($out, '-USAGE:') !== false) return $d; // invalid chan func 592 | $xml = simplexml_load_string(str_replace('encoding="ISO-8859-1"', 'encoding="utf-8"', $out), 'SimpleXMLElement', LIBXML_NOERROR | LIBXML_NOWARNING); 593 | if (!$xml) sendErrorXML(); 594 | 595 | if ($this->isFirstCall) { 596 | $child = $xml->children(); 597 | $i = 0; 598 | $d['fields'] = array(); 599 | foreach ($child->children() as $item) { 600 | $d['fields'][$i] = $item->getName(); 601 | $i++; 602 | } 603 | } 604 | foreach ($xml->children() as $child) { //level: row 605 | $x = false; 606 | foreach ($child->children() as $item) { // next level: uuid, direction, etc. 607 | $s = $item->getName(); 608 | if ($s == 'uuid') { 609 | $x = strval($item); 610 | $d[$x] = array(); 611 | } 612 | if ((!$x) & ($s == 'call_uuid')) { // for api show calls 613 | $x = strval($item); 614 | $d[$x] = array(); 615 | continue; 616 | } 617 | $d[$x][$s] = strval($item); 618 | } 619 | } 620 | if ($this->isFirstCall) $this->isFirstCall = false; 621 | return $d; 622 | } 623 | } 624 | 625 | class fsFreeTDM extends fsData { 626 | public $_names; 627 | 628 | /* 629 | * Convert one line with statuses to an array of fields 630 | */ 631 | public static function lineToFields($s) { 632 | $x = explode("\n", $s); 633 | $a = array(); 634 | for ($i=0; $i_names as $k => $v) { 644 | $s = $this->cmdDump($v); 645 | if ($s === false) continue; 646 | $n = strpos($s, "\n"); 647 | $s = substr($s, $n+1); // delete +OK from string 648 | $x = explode("\n\n", $s); // first explode - by chan's 649 | for ($i=0; $igetData("api ftdm dump $span\n\n"); 667 | } else { 668 | return $this->getData("api ftdm dump $span $chan\n\n"); 669 | } 670 | } 671 | public function cmdTrace($filename, $span, $chan=false) { 672 | return $this->getData("api ftdm trace $filename $span ".($chan!==false ? $chan : '')."\n\n"); 673 | } 674 | public function cmdStopTrace($span, $chan=false) { 675 | return $this->getData("api ftdm notrace $span ".($chan!==false ? $chan : '')."\n\n"); 676 | } 677 | public function cmdStartSpan($span) { 678 | return $this->getData("api ftdm start $span\n\n"); 679 | } 680 | public function cmdStopSpan($span) { 681 | return $this->getData("api ftdm stop $span\n\n"); 682 | } 683 | public function cmdQ931pcap($onoff, $span, $filename='') { // pcapfilename without suffix 684 | return $this->getData("api ftdm q931_pcap $span ".($onoff ? 'on' : 'off').(empty($filename) ? '' : ' '.$filename)."\n\n"); 685 | } 686 | public function cmdDTMF($onoff, $span, $chan=false) { 687 | return $this->getData("api ftdm dtmf ".($onoff ? 'on' : 'off')." $span ".($chan!==false ? $chan : '')."\n\n"); 688 | } 689 | public function cmdGains($tx, $rx, $span, $chan=false) { 690 | return $this->getData("api ftdm gains $tx $rx $span ".($chan!==false ? $chan : '')."\n\n"); 691 | } 692 | } 693 | 694 | //echo(str_repeat(' ', 2048)); 695 | // Clear buffer 696 | while (@ob_end_flush()) {} 697 | ob_implicit_flush(1); 698 | 699 | $sock = new socketReader(); 700 | if ($sock->connect($FreeSWITCHserver, $FreeSWITCHport) < 0) { 701 | sendError('socket_connect() failed. Reason: ('.$result.') '.socket_strerror($result)); 702 | } 703 | $out = $sock->pRead(); 704 | 705 | //Sending AUTH request 706 | $sock->sendData("auth $FreeSWITCHpassword\n\n"); 707 | $out = $sock->pRead(); 708 | if (strpos($out, 'Reply-Text: -ERR') !== false) { 709 | sendError('Cannot connect to FreeSWITCH. May be wrong password in the file fspanel.php $FreeSWITCHpassword='.$FreeSWITCHpassword); 710 | } 711 | 712 | // Run only one command and return result 713 | if (array_key_exists('cmdapi', $_GET)) { 714 | switch (getVar('cmdapi')) { 715 | case 'cmd_sofia_status': $s = "api sofia status\n\n"; break; 716 | case 'cmd_status': $s = "api status\n\n"; break; 717 | case 'cmd_version': $s = "api version\n\n"; break; 718 | case 'cmd_reloadxml': $s = "api reloadxml\n\n"; break; 719 | case 'cmd_reloadacl': $s = "api reloadacl\n\n"; break; 720 | case 'cmd_uuid_kill': $s = "api uuid_kill ".getVar('param')." hangup\n\n"; break; 721 | case 'cmd_uuid_hold': $s = "api uuid_hold ".getVar('param')."\n\n"; break; 722 | case 'cmd_uuid_unhold': $s = "api uuid_hold off ".getVar('param')."\n\n"; break; 723 | case 'cmd_uuid_park': $s = "api uuid_park ".getVar('param')."\n\n"; break; 724 | 725 | case 'cmd_conf_deaf': $s = "api conference ".getVar('param')." deaf ".getVar('param2')."\n\n"; break; 726 | case 'cmd_conf_undeaf': $s = "api conference ".getVar('param')." undeaf ".getVar('param2')."\n\n"; break; 727 | case 'cmd_conf_hup': $s = "api conference ".getVar('param')." hup ".getVar('param2')."\n\n"; break; 728 | case 'cmd_conf_kick': $s = "api conference ".getVar('param')." kick ".getVar('param2')."\n\n"; break; 729 | case 'cmd_conf_mute': $s = "api conference ".getVar('param')." mute ".getVar('param2')."\n\n"; break; 730 | case 'cmd_conf_transfer': $s = "api conference ".getVar('param')." transfer ".getVar('param2')." ".getVar('param3')."\n\n"; break; 731 | case 'cmd_conf_unmute': $s = "api conference ".getVar('param')." unmute ".getVar('param2')."\n\n"; break; 732 | case 'cmd_conf_vol_in': $s = "api conference ".getVar('param')." volume_in ".getVar('param2')." ".getVar('param3')."\n\n"; break; 733 | case 'cmd_conf_vol_out': $s = "api conference ".getVar('param')." volume_out ".getVar('param2')." ".getVar('param3')."\n\n"; break; 734 | case 'cmd_conf_energy': $s = "api conference ".getVar('param')." energy ".getVar('param2')." ".getVar('param3')."\n\n"; break; 735 | 736 | case 'cmd_profile_rescan': $s = "api sofia profile ".getVar('param')." rescan reloadxml\n\n"; break; 737 | case 'cmd_profile_restart': $s = "api sofia profile ".getVar('param')." restart reloadxml\n\n"; break; 738 | case 'cmd_profile_flush_ir': $s = "api sofia profile ".getVar('param')." flush_inbound_reg\n\n"; break; 739 | case 'cmd_profile_flush_irr': $s = "api sofia profile ".getVar('param')." flush_inbound_reg reboot\n\n"; break; 740 | case 'cmd_gateway_kill': $s = "api sofia profile ".getVar('param')." killgw ".getVar('param2')."\n\n"; break; 741 | 742 | case 'cmd_ftdm_start_span': $s = "api ftdm start ".getVar('param')."\n\n"; break; 743 | case 'cmd_ftdm_stop_span': $s = "api ftdm stop ".getVar('param')."\n\n"; break; 744 | case 'cmd_ftdm_dump': $s = "api ftdm dump ".getVar('param')." ".getVar('param2')."\n\n"; break; 745 | } 746 | $sock->sendData($s); 747 | $out = $sock->pRead(); 748 | $c = $sock->getContentLen($out); 749 | if ($c === false) exit; 750 | print(str_replace("\n", '
', $sock->sRead($c)).'
'); 751 | exit; 752 | } 753 | 754 | $useXML = function_exists('simplexml_load_string'); 755 | if ($disableXML) $useXML = false; 756 | if ($useXML) libxml_use_internal_errors(true); 757 | 758 | $useChan = false; 759 | $useConf = false; 760 | $useSofiaReg = false; 761 | $useSofiaStatus = false; 762 | $useFTDM = false; 763 | 764 | $src = array(); 765 | //$src = array('exts'=>array()); // for debug 766 | if (array_key_exists('data', $_POST)) { 767 | $src = json_decode($_POST['data'], true); 768 | } 769 | if (array_key_exists('channels', $src)) { 770 | $useChan = true; 771 | if ($useXML) { 772 | $fChan = new fsChannelXML($sock); 773 | } else { 774 | $fChan = new fsChannel($sock); 775 | } 776 | if (array_key_exists('chan_func', $src['channels'])) { 777 | $fChan->defaultChanFunc = $src['channels']['chan_func']; 778 | unset($src['channels']['chan_func']); 779 | } 780 | $fChan->data = $src['channels']; 781 | } 782 | if (array_key_exists('exts', $src) && (count($SofiaProfiles) > 0)) { 783 | $useSofiaReg = true; 784 | if ($useXML) { 785 | $fSofiaReg = new fsSofiaXML($sock); 786 | } else { 787 | $fSofiaReg = new fsSofia($sock); 788 | } 789 | $fSofiaReg->data = $src['exts']; 790 | } 791 | if (array_key_exists('ss', $src)) { 792 | $useSofiaStatus = true; 793 | if ($useXML) { 794 | $fSofiaStatus = new fsSofiaXML($sock); 795 | } else { 796 | $fSofiaStatus = new fsSofia($sock); 797 | } 798 | $fSofiaStatus->data = $src['ss']; 799 | } 800 | if (array_key_exists('confs', $src)) { 801 | $useConf = true; 802 | $fConf = new fsConf($sock); 803 | $fConf->data = $src['confs']; 804 | $fConf->filter = getVar('conf_filter'); 805 | } 806 | if (array_key_exists('ftdms', $src) && (count($FreeTDMspans) > 0)) { 807 | $useFTDM = true; 808 | $fFTDM = new fsFreeTDM($sock); 809 | $fFTDM->_names = $FreeTDMspans; 810 | $fFTDM->data = $src['ftdms']; 811 | } 812 | 813 | $tmax = ini_get('max_execution_time') - (time()-$t) - 5; 814 | //$tmax = 25; // for debug 815 | 816 | if ($useChan || $useConf || $useSofiaReg || $useSofiaStatus || $useFTDM) { 817 | do { 818 | $res = array('channels'=>array(), 'confs'=>array(), 'exts'=>array(), 'ftdms'=>array(), 'ss'=>array()); // Compare result array 819 | 820 | if ($useChan) { 821 | $x = $fChan->loadData(); 822 | $fChan->extdata = &$res['channels']; 823 | $fChan->compare($fChan->data, $x); 824 | } 825 | if ($useConf) { 826 | $x = $fConf->loadData(); 827 | $fConf->extdata = &$res['confs']; 828 | $fConf->compare($fConf->data, $x); 829 | } 830 | if ($useSofiaReg) { 831 | for ($i=0; $iloadData($SofiaProfiles[$i]); 833 | $fSofiaReg->extdata = &$res['exts']; 834 | $fSofiaReg->compare($fSofiaReg->data, $x); 835 | } 836 | } 837 | if ($useSofiaStatus) { 838 | $x = $fSofiaStatus->loadDataStatus(); 839 | $fSofiaStatus->extdata = &$res['ss']; 840 | $fSofiaStatus->compare($fSofiaStatus->data, $x); 841 | } 842 | if ($useFTDM) { 843 | $x = $fFTDM->loadData(); 844 | $fFTDM->extdata = &$res['ftdms']; 845 | $fFTDM->compare($fFTDM->data, $x); 846 | } 847 | // No changes found? 848 | if ((count($res['channels'])==0) && (count($res['confs'])==0) && (count($res['exts'])==0) && (count($res['ftdms'])==0) && (count($res['ss'])==0)) { 849 | if ((time()-$t) >= $tmax) break; 850 | continue; 851 | } 852 | print(''); 855 | clearFlush(); 856 | sleep(1); 857 | } while ((time()-$t) < $tmax); 858 | } 859 | 860 | $sock->sendData("exit\n\n"); 861 | $sock->pRead(); 862 | $sock->disconnect(); 863 | 864 | // Restart script on client side! 865 | print(''); 866 | clearFlush(); 867 | ?> -------------------------------------------------------------------------------- /fspanel.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FreeSWITCH panel 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
©
17 |
commands
18 |
settings
19 |
20 | 21 |
22 |

Settings

23 |
24 | Extensions (SIP Sofia)
25 | SIP Sofia status
26 |
31 | Conferences
32 | FreeTDM channels
33 |
34 | 35 |
36 |
37 | 38 |
39 |

About

40 |
41 | FreeSWITCH panel

42 | © Valery Kalinin
43 | version 0.99
44 | Download, info, etc. 45 |
46 | 47 |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |
conference member:
*
deaf
undeaf
mute
unmute
hup
kick
transfer to
volume in 0
volume out 0
energy 0
61 |
62 |
63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
conference:
*
lock
unlock
pin
nopin
dial
dtmf
72 |
73 |
74 | 75 | 76 | 77 |
call:
*
hangup
78 |
79 |
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 |
span:
*
start span
stop span
chan:
info
session kill
88 |
89 |
90 | 91 | 92 | 93 | 94 | 95 | 96 |
profile:
*
rescan
restart
flush registered endpoints
flush and reboot registered endpoints
97 |
98 |
99 | 100 | 101 | 102 |
gateway:
*
kill
103 |
104 | 105 |
106 |

Commands

107 | 108 | 109 | 110 | 111 | 112 | 113 |
sofia status
reloadxml
reloadacl
status
version
114 |
115 | 116 |
117 |

Command result

118 |
119 |
120 | 121 |
122 |

SIP registrations

123 |
124 |
125 | 126 |
127 |

Sofia status

128 |
129 |
130 | 131 |
132 |

Calls

133 | 134 |
135 |
136 | 137 |
138 |

Conferences

139 | 140 | 141 |
142 |
143 | 144 |
145 |

FreeTDM

146 | 147 |
148 |
149 | 150 |
151 |

Extensions columns

152 |
153 |
154 | 155 |
156 |

FreeTDM columns

157 |
158 |
159 | 160 |
161 |

Calls columns

162 |
163 |
164 | 165 |
166 |

Sofia status columns

167 |
168 |
169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /images/businessman_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/businessman_delete.png -------------------------------------------------------------------------------- /images/close_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/close_button.png -------------------------------------------------------------------------------- /images/delete2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/delete2.png -------------------------------------------------------------------------------- /images/disable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/disable.png -------------------------------------------------------------------------------- /images/export1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/export1.png -------------------------------------------------------------------------------- /images/gauge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/gauge.png -------------------------------------------------------------------------------- /images/import1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/import1.png -------------------------------------------------------------------------------- /images/loudspeaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/loudspeaker.png -------------------------------------------------------------------------------- /images/loudspeaker_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/loudspeaker_network.png -------------------------------------------------------------------------------- /images/microphone2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/microphone2.png -------------------------------------------------------------------------------- /images/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/play.png -------------------------------------------------------------------------------- /images/stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/stop.png -------------------------------------------------------------------------------- /images/tab_background.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/tab_background.gif -------------------------------------------------------------------------------- /images/user1_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/user1_delete.png -------------------------------------------------------------------------------- /images/user1_into.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/user1_into.png -------------------------------------------------------------------------------- /images/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Slonik/FreeSWITCH-panel/22b77630e3c5a7758e4423e408eda547e3d345c5/images/warning.png -------------------------------------------------------------------------------- /js/fspanel.js: -------------------------------------------------------------------------------- 1 | // For sort table 2 | var aAsc = []; 3 | function sortTable(nr) { 4 | aAsc[nr] = aAsc[nr]=='asc'?'desc':'asc'; 5 | $('#table_ext>tbody>tr').tsort('td:eq('+nr+')', {order:aAsc[nr]}); 6 | } 7 | // Form with fields list 8 | function createForm(flds, showflds) { 9 | var s = ''; 10 | var c = ''; 11 | var n = true; 12 | for (i=0;i'; 14 | c = ''; 15 | if (jQuery.inArray(flds[i], showflds) >= 0) c = ' checked'; 16 | s = s + ''; 17 | if (!n) s = s + ''; 18 | n = !n; 19 | } 20 | if (!n) s = s + ''; 21 | return s + '
'+flds[i]+'
 

'; 22 | } 23 | function init_windows() { 24 | if (jQuery.inArray('opt_ext', settings.data) < 0) 25 | $('#extensions').hide(); 26 | else 27 | $('#extensions').show(); 28 | if (jQuery.inArray('opt_call', settings.data) < 0) 29 | $('#calls').hide(); 30 | else 31 | $('#calls').show(); 32 | if (jQuery.inArray('opt_conf', settings.data) < 0) 33 | $('#conferences').hide(); 34 | else 35 | $('#conferences').show(); 36 | if (jQuery.inArray('opt_ftdm', settings.data) < 0) 37 | $('#freetdms').hide(); 38 | else 39 | $('#freetdms').show(); 40 | if (jQuery.inArray('opt_ss', settings.data) < 0) 41 | $('#sofiastatuses').hide(); 42 | else 43 | $('#sofiastatuses').show(); 44 | } 45 | function cmdClose(cmd, table) { 46 | $('#cmd_'+cmd).fadeOut('fast'); 47 | $('#table_'+table+' .row_selected').removeClass('row_selected'); 48 | } 49 | function showSettings(allfld, shfld, prefix) { 50 | var s = '
'+ 51 | createForm(allfld, shfld)+ 52 | '
'; 53 | $('#'+prefix+'_form_set').html(s); 54 | var h = $(window).height(); 55 | var ww = $(window).width(); 56 | var w = $('#'+prefix+'_settings').width(); 57 | $('#'+prefix+'_settings').css('left', Math.round(ww/2 - w/2)); 58 | $('#'+prefix+'_settings').fadeIn('fast'); 59 | } 60 | //-------------------------------- COOKIE 61 | function setCookie(name, value, exp_y, exp_m, exp_d, path, domain, secure) { 62 | var cookie_string = name + "=" + escape (value); 63 | if (exp_y) { 64 | var expires = new Date (exp_y, exp_m, exp_d); 65 | cookie_string += "; expires=" + expires.toGMTString(); 66 | } 67 | if (path) cookie_string += "; path=" + escape (path); 68 | if (domain) cookie_string += "; domain=" + escape (domain); 69 | if (secure) cookie_string += "; secure"; 70 | document.cookie = cookie_string; 71 | } 72 | function getCookie(cookie_name) { 73 | var results = document.cookie.match ( '(^|;) ?' + cookie_name + '=([^;]*)(;|$)' ); 74 | if (results) 75 | return (unescape(results[2])); 76 | else 77 | return ''; 78 | } 79 | function delete_cookie(name) { 80 | var cookie_date = new Date(); 81 | cookie_date.setTime(cookie_date.getTime() - 1); 82 | document.cookie = name += "=; expires=" + cookie_date.toGMTString(); 83 | } 84 | 85 | var settings = { 86 | data : false, 87 | 88 | loadCookie: function(cook, datas, id) { 89 | x = getCookie(cook+'_show'); 90 | if (x != '') datas.show_fields = x.split(","); 91 | x = getCookie(cook+'_width'); 92 | if (x != '') { 93 | datas.width = x.split(","); 94 | $(id).width(datas.width); 95 | } 96 | }, 97 | initialize: function() { 98 | var x = getCookie('data'); 99 | if (x == '') { 100 | settings.data = new Array('opt_ss', 'opt_call', 'opt_conf'); 101 | } else { 102 | settings.data = x.split(','); 103 | } 104 | settings.loadCookie('exts', extsdata, '#extensions'); 105 | settings.loadCookie('call', calldata, '#calls'); 106 | settings.loadCookie('conf', confdata, '#conferences'); 107 | settings.loadCookie('ftdm', ftdmdata, '#freetdms'); 108 | settings.loadCookie('ss', ssdata, '#sofiastatuses'); 109 | x = getCookie('call_func'); 110 | if (x != '') { 111 | calldata.call_func = x; 112 | } else { 113 | calldata.call_func = 'channels'; 114 | } 115 | $('#top_settings').click(function () { 116 | var p = $('#top_settings').position(); 117 | var h = $('#top_settings').height(); 118 | var w = $('#settings').width(); 119 | $('#settings').css('left', p.left - w); 120 | $('#settings').css('top', p.top + h + 4); 121 | $('#settings').fadeIn('fast'); 122 | }); 123 | $('#set_cancel').click(function () { 124 | $('#settings').fadeOut('fast'); 125 | }); 126 | $('#set_save').click(function () { 127 | delete settings.data; 128 | settings.data = new Array(); 129 | var x = $('#settings input[type=checkbox]:checked').map(function() { 130 | settings.data[settings.data.length] = $(this).val(); 131 | }); 132 | calldata.call_func = $('#opt_call_func').val(); 133 | settings.save(); 134 | $('#settings').fadeOut('fast'); 135 | //init_windows(); 136 | location.reload(true); 137 | }); 138 | }, 139 | save: function() { 140 | setCookie('exts_show', extsdata.show_fields); 141 | setCookie('call_show', calldata.show_fields); 142 | setCookie('call_func', calldata.call_func); 143 | setCookie('ss_show', ssdata.show_fields); 144 | setCookie('ftdm_show', ftdmdata.show_fields); 145 | setCookie('data', settings.data); 146 | } 147 | } 148 | //----------------------------------- 149 | var extsdata = { 150 | show_fields : Array('Contact', 'IP', 'Auth-User'), 151 | // all available fields: 152 | all_fields : Array('Call-ID', 'User', 'Contact', 'Agent', 'Status', 'Host', 'IP', 'Port', 'Auth-User', 'Auth-Realm', 'MWI-Account'), 153 | // prev version - header fields translate table 154 | //header_fields : {'Call-ID': 'Call-ID', 'User': 'User', 'Contact': 'Contact', 'Agent': 'Agent', 'Status': 'Status', 'Host': 'Host', 155 | // 'IP': 'IP', 'Port': 'Port', 'Auth-User': '#', 'Auth-Realm': 'Auth-Realm', 'MWI-Account': 'MWI'}, 156 | link_field : Array('ip', 'network-ip'), 157 | data : false, 158 | width : 200, 159 | 160 | initialize: function() { 161 | extsdata.data = new Object(); 162 | extsdata.fill(); 163 | }, 164 | fill: function() { 165 | var s = ''; 166 | var n = 0; 167 | for (i=0;i' +extsdata.header_fields[extsdata.show_fields[i]]+ ' '; 169 | s = s + '' +extsdata.all_fields[jQuery.inArray(extsdata.show_fields[i], extsdata.all_fields)]+ ' '; 170 | n = n + 1; 171 | } 172 | s = s + ''; 173 | $('#table_ext').html(s); 174 | for (var key in extsdata.data) { 175 | extsdata.add(extsdata.data[key], key); 176 | } 177 | $('.sort_sign').click(function(e) { 178 | var x = $(e.target).parent().attr('abbr'); 179 | sortTable(x); 180 | }); 181 | $('#table_ext th').click(function(e) { 182 | if ($(e.target).hasClass('sort_sign')) return; 183 | showSettings(extsdata.all_fields, extsdata.show_fields, 'exts'); 184 | }); 185 | }, 186 | // Data from server: d[user_id][fields from sofia status] 187 | load: function(d) { 188 | for (var key in d) { 189 | switch (d[key]['fsoperation']) { 190 | case 'part_del': 191 | delete extsdata.data[key]; 192 | extsdata.del(key); 193 | break; 194 | case 'part_add': 195 | delete d[key]['fsoperation']; 196 | if (key == 'fields') { 197 | extsdata.resetFields(d[key]); 198 | extsdata.fill(); 199 | break; 200 | } 201 | extsdata.data[key] = d[key]; 202 | extsdata.add(d[key], key); 203 | break; 204 | case 'field_upd': 205 | delete d[key]['fsoperation']; 206 | for (var i in d[key]) { 207 | i = i.toLowerCase(); 208 | extsdata.data[key][i] = d[key][i]; 209 | extsdata.update(key, i, d[key][i]); 210 | } 211 | break; 212 | // now ignore field_del 213 | } 214 | } 215 | $('#table_ext').trigger("update"); 216 | }, 217 | add: function(r, id) { 218 | var n = ' id="exts_' + id; 219 | var x = $('#table_ext tbody').length; 220 | var shb = ''; 221 | var she = ''; 222 | var sf = 'tbody tr:last'; 223 | if (x == 0) { 224 | shb = ''; 225 | she = ''; 226 | sf = 'thead'; 227 | } 228 | var s = shb+''; 229 | for (var x in extsdata.show_fields) { 230 | var key = extsdata.show_fields[x]; 231 | if (jQuery.inArray(key, extsdata.link_field) > -1) { 232 | s = s + ''+r[key]+''; 233 | } else { 234 | s = s + ''+r[key]+''; 235 | } 236 | } 237 | s = s + ''+she; 238 | $('#table_ext '+sf).after(s); 239 | //$('#table_ext').trigger("update"); 240 | }, 241 | del: function(id) { 242 | $('#exts_'+id).remove(); 243 | }, 244 | update: function(id, fld, v) { 245 | $('#exts_'+id+fld).html(''+v+''); 246 | }, 247 | resetFields: function(r) { 248 | extsdata.all_fields = Array(); 249 | var i = 0; 250 | for (var x in r) { 251 | extsdata.all_fields[i] = r[x]; 252 | i++; 253 | } 254 | }, 255 | saveSettings: function() { 256 | extsdata.show_fields = new Array(); 257 | $('#exts_form_set input:checked').each(function() {extsdata.show_fields[extsdata.show_fields.length] = $(this).attr('id');}); 258 | extsdata.fill(); 259 | settings.save(); 260 | $('#exts_settings').fadeOut('fast'); 261 | } 262 | } 263 | 264 | var calldata = { 265 | show_fields : Array('direction','cid_name','cid_num','dest','callee_num','callstate','write_codec'), 266 | all_fields : Array('direction','created','created_epoch','name','state','cid_name','cid_num','ip_addr','dest','application','application_data','dialplan','context','read_codec','read_rate','read_bit_rate','write_codec','write_rate','write_bit_rate','secure','hostname','presence_id','presence_data','callstate','callee_name','callee_num','callee_direction','call_uuid'), 267 | data : false, 268 | call_func : false, 269 | width : 200, 270 | 271 | initialize: function() { 272 | calldata.data = new Object(); 273 | calldata.fill(); 274 | }, 275 | fill: function() { 276 | var s = ''; 277 | for (var x in calldata.show_fields) { 278 | var v = calldata.show_fields[x]; 279 | if (v == 'direction') v = ' '; 280 | s = s + '' + v + ''; 281 | } 282 | s = s + ''; 283 | $('#table_call').html(s); 284 | for (var key in calldata.data) { 285 | calldata.add(calldata.data[key], key); 286 | } 287 | }, 288 | // Data from server: d[uuid][fields from channel status] 289 | load: function(d) { 290 | for (var key in d) { 291 | switch (d[key]['fsoperation']) { 292 | case 'part_del': 293 | delete calldata.data[key]; 294 | calldata.del(key); 295 | break; 296 | case 'part_add': 297 | delete d[key]['fsoperation']; 298 | if (key == 'fields') { 299 | calldata.resetFields(d[key]); 300 | break; 301 | } 302 | calldata.data[key] = d[key]; 303 | calldata.add(d[key], key); 304 | break; 305 | case 'field_upd': 306 | for (var i in d[key]) { 307 | calldata.data[key][i] = d[key][i]; 308 | calldata.update(key, i, d[key][i]); 309 | } 310 | break; 311 | } 312 | } 313 | }, 314 | add: function(r, id) { 315 | var n = ' id="call_'+id; 316 | var s = ''; 317 | for (x in calldata.show_fields) { 318 | var i = calldata.show_fields[x]; 319 | if (i == 'direction') { 320 | var ss = '→'; 321 | if (r[i] == 'outbound') ss = '←'; 322 | } else { 323 | var ss = r[i]; 324 | } 325 | if (ss == '') ss = ' '; 326 | s = s + '
' + ss + '
'; 327 | } 328 | s = s + ''; 329 | $('#table_call tr:last').after(s); 330 | }, 331 | del: function(id) { 332 | $('#call_'+id).remove(); 333 | }, 334 | update: function(id, fld, v) { 335 | if (v == '') v = ' '; 336 | $('#call_'+id+fld).html('
'+v+'
'); 337 | }, 338 | resetFields: function(r) { 339 | calldata.all_fields = Array(); 340 | var i = 0; 341 | for (var x in r) { 342 | calldata.all_fields[i] = r[x]; 343 | i++; 344 | } 345 | }, 346 | saveSettings: function() { 347 | calldata.show_fields = new Array(); 348 | $('#call_form_set input:checked').each(function() {calldata.show_fields[calldata.show_fields.length] = $(this).attr('id');}); 349 | calldata.fill(); 350 | settings.save(); 351 | $('#call_settings').fadeOut('fast'); 352 | } 353 | } 354 | 355 | var ssdata = { 356 | show_fields : Array('name', 'type', 'data', 'state', 'count'), 357 | all_fields : Array('name', 'type', 'data', 'state', 'count'), 358 | data : false, 359 | width : 200, 360 | 361 | initialize: function() { 362 | ssdata.data = new Object(); 363 | ssdata.fill(); 364 | }, 365 | fill: function() { 366 | var s = ''; 367 | for (var x in ssdata.show_fields) { 368 | s = s + '' + ssdata.show_fields[x] + ''; 369 | } 370 | s = s + ''; 371 | $('#table_ss').html(s); 372 | for (var key in ssdata.data) { 373 | ssdata.add(ssdata.data[key], key); 374 | } 375 | }, 376 | // Data from server: d[name][fields from status] 377 | load: function(d) { 378 | for (var key in d) { 379 | keyx = key.replace('::', '__'); 380 | switch (d[key]['fsoperation']) { 381 | case 'part_del': 382 | delete ssdata.data[keyx]; 383 | ssdata.del(keyx); 384 | break; 385 | case 'part_add': 386 | ssdata.data[keyx] = d[key]; 387 | ssdata.add(d[key], keyx); 388 | break; 389 | case 'field_upd': 390 | for (var i in d[key]) { 391 | ssdata.data[keyx][i] = d[key][i]; 392 | ssdata.update(keyx, i, d[key][i]); 393 | } 394 | break; 395 | } 396 | } 397 | }, 398 | add: function(r, id) { 399 | var n = ' id="ss_'+id; 400 | var s = ''; 401 | var p = ''; 402 | for (x in ssdata.show_fields) { 403 | var i = ssdata.show_fields[x]; 404 | s = s + '
' + r[i] + '
'; 405 | } 406 | s = s + ''; 407 | var t = $('#table_ss tr:last').after(s); 408 | }, 409 | del: function(id) { 410 | $('#ss_'+id).remove(); 411 | }, 412 | update: function(id, fld, v) { 413 | if (v == '') v = ' '; 414 | $('#ss_'+id+fld).html('
'+v+'
'); 415 | }, 416 | saveSettings: function() { 417 | ssdata.show_fields = new Array(); 418 | $('#ss_form_set input:checked').each(function() {ssdata.show_fields[ssdata.show_fields.length] = $(this).attr('id');}); 419 | ssdata.fill(); 420 | settings.save(); 421 | $('#ss_settings').fadeOut('fast'); 422 | } 423 | } 424 | 425 | var confdata = { 426 | data : false, 427 | width : 200, 428 | 429 | initialize: function() { 430 | confdata.data = new Object(); 431 | }, 432 | // Data from server: d[conference id][confNNN][name, number, status] 433 | load: function(d) { 434 | for (var key in d) { 435 | switch (d[key]['fsoperation']) { 436 | case 'part_del': 437 | delete confdata.data[key]; 438 | confdata.del(key); 439 | delete d[key]['fsoperation']; 440 | break; 441 | case 'part_add': 442 | confdata.data[key] = d[key]; 443 | confdata.add(key); 444 | for (var i in d[key]) { 445 | if (i == 'fsoperation') { 446 | delete d[key][i]; 447 | continue; 448 | } 449 | confdata.data[key][i] = d[key][i]; 450 | confdata.addfld(key, i, d[key][i]); 451 | } 452 | delete d[key]['fsoperation']; 453 | break; 454 | default: for (var i in d[key]) { 455 | switch (d[key][i]['fsoperation']) { 456 | case 'field_del': 457 | delete confdata.data[key][i]; 458 | confdata.delfld(i); 459 | break; 460 | case 'field_add': 461 | delete d[key][i]['fsoperation']; 462 | confdata.data[key][i] = d[key][i]; 463 | confdata.addfld(key, i, d[key][i]); 464 | break; 465 | case 'field_upd': 466 | delete d[key][i]['fsoperation']; 467 | confdata.data[key][i] = d[key][i]; 468 | confdata.update(key, i, d[key][i]); 469 | break; 470 | } 471 | } 472 | break; 473 | } 474 | } 475 | }, 476 | add: function(id) { 477 | var s = ''+id+''; 478 | $('#table_conf thead').after(s); 479 | }, 480 | del: function(id) { 481 | $('#table_conf tbody[id="conference_'+id+'"]').remove(); 482 | }, 483 | addfld: function(id, fld, v) { 484 | var s = '' + 485 | '' + v['name'] + '' + 486 | '' + v['number'] + '' + 487 | '' + v['status'] + '' + 488 | ''; 489 | $('#table_conf tbody tr[id="'+id+'"]').after(s); 490 | }, 491 | delfld: function(id) { 492 | $('#table_conf tbody tr[id="'+id+'"]').remove(); 493 | }, 494 | update: function(id, fld, v) { 495 | var s = '' + v['name'] + '' + 496 | '' + v['number'] + '' + 497 | '' + v['status'] + ''; 498 | $('#table_conf tbody tr[id="'+fld+'"]').html(s); 499 | } 500 | } 501 | 502 | var ftdmdata = { 503 | show_fields : Array('span_id', 'chan_id', 'physical_status', 'signaling_status', 'state', 'cid_name', 'cid_num', 'dnis'), 504 | all_fields : Array('span_id', 'chan_id', 'physical_span_id', 'physical_chan_id', 'physical_status', 'physical_status_red', 505 | 'physical_status_yellow', 'physical_status_rai', 'physical_status_blue', 'physical_status_ais', 506 | 'physical_status_general', 'signaling_status', 'type', 'state', 'last_state', 'txgain', 'rxgain', 'cid_date', 507 | 'cid_name', 'cid_num', 'ani', 'aniII', 'dnis', 'rdnis', 'cause', 'session'), 508 | header_fields : {'span_id': 'span', 'chan_id': 'chan', 'physical_span_id': 'ph_span', 'physical_chan_id': 'ph_chan', 'physical_status': 'status', 509 | 'physical_status_red': 'red','physical_status_yellow': 'yellow', 'physical_status_rai': 'rai', 'physical_status_blue': 'blue', 510 | 'physical_status_ais': 'ais','physical_status_general': 'general', 'signaling_status': 'sign', 'type': 'type', 'state': 'state', 511 | 'last_state': 'last', 'txgain': 'txgain', 'rxgain': 'rxgain', 'cid_date': 'date','cid_name': 'name', 'cid_num': 'num', 512 | 'ani': 'ani', 'aniII': 'aniII', 'dnis': 'dnis', 'rdnis': 'rdnis', 'cause': 'cause', 'session': 'session'}, 513 | data : false, 514 | width : 200, 515 | 516 | initialize: function() { 517 | ftdmdata.data = new Object(); 518 | ftdmdata.fill(); 519 | }, 520 | fill: function() { 521 | var s = ''; 522 | for (i=0;i' + ftdmdata.header_fields[ftdmdata.show_fields[i]] + ''; 524 | } 525 | s = s + ''; 526 | $('#table_ftdm').html(s); 527 | for (var key in ftdmdata.data) {//span 528 | for (var i in ftdmdata.data[key]) {//chan 529 | if (typeof ftdmdata.data[key][i]['span_id']=='undefined') continue; 530 | ftdmdata.add(ftdmdata.data, key, i); 531 | } 532 | } 533 | }, 534 | // Data from server: d[span_id][chan_id][fields] 535 | load: function(d) { 536 | for (var key in d) { 537 | if (typeof ftdmdata.data[key]=='undefined') ftdmdata.data[key] = new Object(); 538 | switch (d[key]['fsoperation']) { 539 | case 'part_add': 540 | for (var i in d[key]) { 541 | if (i == 'fsoperation') continue; 542 | ftdmdata.data[key][i] = d[key][i]; 543 | ftdmdata.add(d, key, i); 544 | } 545 | default: 546 | for (var i in d[key]) { 547 | ftdmdata.data[key][i] = d[key][i]; 548 | ftdmdata.update(d, key, i); 549 | } 550 | } 551 | } 552 | }, 553 | add: function(r, span, chan) { 554 | var n = ' id="ftdm_' + span + '_' + chan; 555 | var s = ''; 556 | for (var x in ftdmdata.show_fields) { 557 | var key = ftdmdata.show_fields[x]; 558 | s = s + ''+r[span][chan][key]+''; 559 | } 560 | s = s + ''; 561 | $('#table_ftdm tr:last').after(s); 562 | }, 563 | update: function(r, span, chan) { 564 | var n = ' id="ftdm_' + span + '_' + chan; 565 | for (var x in ftdmdata.show_fields) { 566 | var key = ftdmdata.show_fields[x]; 567 | $('#ftdm_'+span+'_'+chan+'_'+key).html(r[span][chan][key]); 568 | } 569 | }, 570 | saveSettings: function() { 571 | ftdmdata.show_fields = new Array(); 572 | $('#ftdm_form_set input:checked').each(function() {ftdmdata.show_fields[ftdmdata.show_fields.length] = $(this).attr('id');}); 573 | ftdmdata.fill(); 574 | settings.save(); 575 | $('#ftdm_settings').fadeOut('fast'); 576 | } 577 | } 578 | //-------------------------------- COMET (to server-side transport instead of Ajax) 579 | var comet = { 580 | server : './fscontrol.php', 581 | connection : false, // ActiveX for IE, iframe for other 582 | iframediv : false, // internal for IE 583 | form : false, // Form for POST data 584 | 585 | restart: function() { 586 | $(comet.connection).remove(); 587 | comet.connection = false; 588 | comet.start(); 589 | }, 590 | toj: function(d, d2) { 591 | var j = ''; 592 | if (d2.length > 0) j = '{' + d2; 593 | for (var k in d) { 594 | if (j.length == 0) { 595 | j = '{' + d2; 596 | } else { 597 | j += ','; 598 | } 599 | j += '"' + k + '":' + $.toJSON(d[k]); 600 | } 601 | if (j.length == 0) j = '{'; 602 | j += '}'; 603 | return j; 604 | }, 605 | start: function() { 606 | var j = ''; 607 | if (jQuery.inArray('opt_call', settings.data) >= 0) { 608 | j = '"channels": ' + comet.toj(calldata.data, '"chan_func" : "'+calldata.call_func+'"'); 609 | } 610 | if (jQuery.inArray('opt_ext', settings.data) >= 0) { 611 | if (j.length > 0) j += ', '; 612 | j += '"exts": ' + comet.toj(extsdata.data, ''); 613 | } 614 | if (jQuery.inArray('opt_conf', settings.data) >= 0) { 615 | if (j.length > 0) j += ', '; 616 | j += '"confs": ' + comet.toj(confdata.data, ''); 617 | } 618 | if (jQuery.inArray('opt_ftdm', settings.data) >= 0) { 619 | if (j.length > 0) j += ', '; 620 | j += '"ftdms": ' + comet.toj(ftdmdata.data, ''); 621 | } 622 | if (jQuery.inArray('opt_ss', settings.data) >= 0) { 623 | if (j.length > 0) j += ', '; 624 | j += '"ss": ' + comet.toj(ssdata.data, ''); 625 | } 626 | j = '{' + j + '}'; 627 | if (navigator.appVersion.indexOf("MSIE") != -1) { 628 | // For IE browsers 629 | comet.connection = new ActiveXObject("htmlfile"); 630 | comet.connection.open(); 631 | comet.connection.write(""); 632 | //comet.connection.write(''); 633 | //comet.connection.write("