00001 <?php
00010 class tpAJAX extends Plugin
00011 {
00012 var $guid;
00013
00017 function tpAJAX() {
00018 $this->Plugin();
00019 $this->depend('html');
00020
00021 $this->guid = 1;
00022 }
00023
00053 function dialog($dlg_id, $target, $buttons=array(), $overlay=false, $modal=false, $opts=array())
00054 {
00055
00056
00057 $opts[] = 'toTop:true';
00058 if(!$overlay) $opts[] = 'overlay:0';
00059 if($modal) $opts[] = 'modal:true';
00060 if(empty($opts)) {
00061 $opts = '';
00062 } else {
00063 $opts = '{' . implode(',', $opts) . '}';
00064 }
00065
00066 list($btn_html,$btn_js) = $this->buttons($buttons, 'dialog', true);
00067 $btn_html = str_replace("'", "\\'", $btn_html);
00068
00069
00070 $tb = '<div class="dialog-tb">'.$this->depends->html->image('icons/close_x.gif',array('class'=>'dialog-close jqmClose')).'</div>';
00071 $tb = str_replace("'", "\\'", $tb);
00072 $rz = $this->depends->html->image('icons/resize.gif', array('class'=>'dialog-resize'));
00073 $rz = str_replace("'", "\\'", $rz);
00074
00075
00076 $js = "$('#$dlg_id').wrap('<div></div>');";
00077 $js .= "$('#$dlg_id').before('$tb').after('$rz');";
00078 $js .= "$('#$dlg_id').parent().attr('style', $('#$dlg_id').attr('style'));";
00079 $js .= "$('#$dlg_id').parent().attr('class', $('#$dlg_id').attr('class'));";
00080 $js .= "$('#$dlg_id').parent().addClass('dialog');";
00081 $js .= "$('#$dlg_id').removeAttr('style').removeAttr('class');";
00082 $js .= "$('#$dlg_id').addClass('dialog-content');";
00083 $js .= "$('#$dlg_id').attr('id', '').parent().attr('id', '$dlg_id');";
00084 $js .= "$('#$dlg_id').find('.dialog-tb').append('<span>'+$('#$dlg_id').find('.dialog-content').attr('title')+'</span>');";
00085 $js .= "$('#$dlg_id').find('.dialog-content').append('$btn_html');";
00086 $js .= $btn_js;
00087
00088 $this->depends->html->js_run('jq_dlgsetup_'.$dlg_id, $js);
00089
00090 $js = "$('#{$dlg_id}').jqm({$opts}).jqDrag('.dialog-tb').jqResize('img.dialog-resize');";
00091 if($target) {
00092 $event = 'click';
00093 if(is_array($target)) {
00094 $event = $target[0];
00095 $target = $target[1];
00096 }
00097 $js .= "$('{$target}').{$event}(function(){";
00098 $js .= "$(this).blur();";
00099 $js .= "$('#$dlg_id').jqmShowCenter(); return false; });";
00100 }
00101
00102 $this->depends->html->css_load('dialog');
00103 $this->depends->html->js_load('jq/jquery.modal');
00104 $this->depends->html->js_run('jq_dlg_'.$dlg_id, $js);
00105 }
00106
00117 function popup_bind($div_id, $targets=array(), $buttons=array())
00118 {
00119 list($btn_html,$btn_js) = $this->buttons($buttons, 'popup', true);
00120 $js = "$('#$div_id').append('<div>".str_replace("'","\\'",$btn_html)."</div>');";
00121 $js .= $btn_js;
00122
00123 if(!is_array($targets)) $targets = array($targets);
00124 foreach($targets as $targ) {
00125 $js .= "$('$targ').click(function(e){ ";
00126
00127 $js .= "if($(this).attr('id') == '') $(this).attr('id', 'anon'+parseInt(Math.random()*100000));";
00128
00129 $js .= "$('#$div_id').attr('rel',$(this).attr('id')).position_near_click(e).show('normal');return false; });";
00130 }
00131 $this->depends->html->css_load('dialog', 'dialog');
00132 $this->depends->html->js_load('ajax');
00133 $this->depends->html->js_run('', $js);
00134 }
00135
00170 function buttons($buttons, $context, $retjs=false)
00171 {
00172 switch($context) {
00173 case 'dialog':
00174 $hide = "$(this).parents('.dialog:first').jqmHide()";
00175 $content = "$(this).parents('.dialog-content:first')";
00176 break;
00177 case 'popup':
00178 $hide = "$(this).parents('.popup:first').hide('normal')";
00179 $content = "$(this).parents('.popup:first')";
00180 break;
00181 }
00182 $ret = '<div class="buttons">';
00183 $bjs = '';
00184 foreach($buttons as $label=>$btn) {
00185 switch($btn['action']) {
00186 case 'ajax_load':
00187 $this->depends->html->js_load('ajax');
00188 $js = "var c = {$content};".
00189 "$.ajax({".
00190 "url: '{$btn['url']}',".
00191 "type: 'GET',".
00192 "data: {_ajax:1},".
00193 "dataType: 'json',".
00194 "success: function(d){ if(d.html) {c.empty().append(d.html)} else {{$hide};} ajax_exec(d); }".
00195 "});"; break;
00196
00197 case 'submit_form':
00198 $js = "$('#{$btn['form_id']}').submit();"; break;
00199
00200 case 'custom':
00201 $js = $btn['js']; break;
00202
00203 case 'function':
00204 $js = "{$btn['function']}({$content});"; break;
00205
00206 case 'close':
00207 default:
00208 $js = "{$hide};";
00209 }
00210 $id = "prontobtn-".$this->guid++;
00211 $ret .= '<input id="'.$id.'" type="button" class="button" value="'.$label.'" /> ';
00212
00213 $bjs .= "$('#$id').click(function(){ $js return false; });";
00214 }
00215 $ret .= '</div>';
00216
00217 if($retjs) {
00218 return array($ret, $bjs);
00219 } else {
00220 $this->depends->html->js_run('', $bjs);
00221 return $ret;
00222 }
00223 }
00224
00264 function autocomplete($name, $value_id, $value_name, $search_url, $form_id) {
00265 $this->depend('form');
00266 $this->depends->html->js_load('jq/jquery.autocomplete');
00267 $this->depends->html->css_load('autocomplete');
00268
00269
00270
00271
00272 $guid = $this->guid++;
00273 $id = $this->depends->form->dom_id($name);
00274 $icon = $this->depends->html->image('icons/pencil.gif', __('Change'), array('id'=>"ac{$guid}-chg",'style'=>'cursor:pointer'));
00275
00276 $out = <<<EOT
00277 <script type="text/javascript">
00278 function ac{$guid}_cb(event, data, formatted) {
00279 $('#$id').val(data[0]);
00280 $('#ac{$guid}-text').hide();
00281 $('#ac{$guid}-val span.ac-val').html(data[1]);
00282 $('#ac{$guid}-val').show();
00283 }
00284 $(document).ready(function(){
00285 $('#ac{$guid}-text').autocomplete("{$search_url}", {
00286 minChars: 2,
00287 cacheLength: 20,
00288 formatItem: function(d){ return d[1]; },
00289 formatResult: function(d){ return d[1]; }
00290 });
00291 $('#ac{$guid}-text').result(ac{$guid}_cb);
00292
00293 $('#ac{$guid}-chg').click(function(){
00294 $('#$id').val('');
00295 $('#ac{$guid}-val span.ac-val').html('');
00296 $('#ac{$guid}-val').hide();
00297 $('#ac{$guid}-text').val('').show();
00298 });
00299 });
00300 </script>
00301 EOT;
00302 if($value_id && $value_name === true) {
00303 $out .= <<<EOT
00304 <script type="text/javascript">
00305 $(document).ready(function(){
00306 $.get("{$search_url}", {id: {$value_id}}, function(d){
00307 $('#ac{$guid}-val span.ac-val').html(d);
00308 });
00309 });
00310 </script>
00311 EOT;
00312 }
00313
00314 $out .= '<input type="hidden" id="'.$id.'" name="'.$name.'" value="'.$value_id.'" />';
00315 if($value_id) {
00316 $out .= '<span id="ac'.$guid.'-val" class="ac-val"><span class="ac-val">'.$value_name.'</span><span class="ac-chg">'.$icon.'</span></span>';
00317 $out .= $this->depends->form->text("ac{$guid}-text", '', '', '', array('id'=>"ac{$guid}-text",'class'=>'ac-txt','style'=>'display:none'));
00318 } else {
00319 $out .= '<span id="ac'.$guid.'-val" class="ac-val" style="display:none"><span class="ac-val">'.$value_name.'</span><span class="ac-chg">'.$icon.'</span></span>';
00320 $out .= $this->depends->form->text("ac{$guid}-text", '', '', '', array('id'=>"ac{$guid}-text",'class'=>'ac-txt'));
00321 }
00322
00323 return $out;
00324 }
00325
00354 function autocomplete_multisel($name, $values, $search_url, $form_id, $max_sel=0) {
00355 $this->depend('form');
00356 $this->depends->html->js_load('jq/jquery.autocomplete');
00357 $this->depends->html->css_load('autocomplete');
00358
00359
00360
00361
00362 $guid = $this->guid++;
00363
00364
00365 $msg_remove = __('Remove');
00366 $msg_toomany = __("You can have a maximum of %d selections.", $max_sel);
00367
00368 $out = <<<EOT
00369 <script type="text/javascript">
00370 function ac{$guid}_cb(event, data, formatted) {
00371 $('#ac{$guid}-text').val('');
00372 if({$max_sel} > 0 && $('li', $('#ac{$guid}-sel')).length >= {$max_sel}) {
00373 alert("{$msg_toomany}");
00374 return;
00375 }
00376 if($('li[rel='+data[0]+']', $('#ac{$guid}-sel')).length == 0) {
00377 $('#ac{$guid}-sel').append('<li rel="'+data[0]+'">[<a title="{$msg_remove}" href="#" onClick="return ac{$guid}_remove(this)">x</a>] '+data[1]+'</li>');
00378 $('#{$form_id}').append('<input type="hidden" name="{$name}[]" value="'+data[0]+'" />');
00379 }
00380 }
00381 function ac{$guid}_remove(el) {
00382 var id = $(el).parent().attr('rel');
00383 $('#$form_id').find('input[name="{$name}[]"][type="hidden"][value="'+id+'"]').remove();
00384 $('#ac{$guid}-sel').find('li[rel="'+id+'"]').remove();
00385 return false;
00386 }
00387 $(document).ready(function(){
00388 $('#ac{$guid}-text').autocomplete("{$search_url}", {
00389 minChars: 2,
00390 cacheLength: 20,
00391 formatItem: function(d){ return d[1]; },
00392 formatResult: function(d){ return d[1]; }
00393 });
00394 $('#ac{$guid}-text').result(ac{$guid}_cb);
00395 });
00396 </script>
00397 EOT;
00398
00399 $out .= $this->depends->form->text("ac{$guid}-text", '', '', '', array('id'=>"ac{$guid}-text",'class'=>'ac-txt'));
00400 foreach($values as $id=>$val) {
00401 $out .= '<input type="hidden" name="'.$name.'[]" value="'.$id.'" />';
00402 }
00403 $out .= '<ul id="ac'.$guid.'-sel" class="ac-sel">';
00404 foreach($values as $id=>$val) {
00405 $out .= '<li rel="'.$id.'">[<a title="Remove" href="#" onClick="return ac'.$guid.'_remove(this)">x</a>] '.$val.'</li>';
00406 }
00407 $out .= '</ul>';
00408
00409 return $out;
00410 }
00411
00412 function _attribs($attribs)
00413 {
00414 $ret = '';
00415 foreach($attribs as $k=>$v) {
00416 $ret .= " $k=\"$v\"";
00417 }
00418 return $ret;
00419 }
00420
00421 }
00422
00423 ?>