00001 <?php
00003
00004
00005
00006
00007
00008
00010
00050 class FLEA_Ajax
00051 {
00057 var $events;
00058
00064 var $paramsType = array(
00065 'async' => 'boolean',
00066 'beforeSend' => 'function',
00067 'complete' => 'function',
00068 'contentType' => 'string',
00069 'params' => 'pair',
00070 'data' => 'object',
00071 'dataType' => 'string',
00072 'error' => 'function',
00073 'global' => 'boolean',
00074 'ifModified' => 'boolean',
00075 'processData' => 'boolean',
00076 'success' => 'function',
00077 'timeout' => 'number',
00078 'type' => 'string',
00079 'url' => 'string',
00080
00081 'beforeSubmit' => 'function',
00082 'semantic' => 'boolean',
00083 'clearForm' => 'boolean',
00084 'resetForm' => 'boolean',
00085
00086 'target' => 'object',
00087 'targetValue' => 'object',
00088 'clearTarget' => 'boolean',
00089 );
00090
00096 function FLEA_Ajax()
00097 {
00098 $this->_events = array();
00099 }
00100
00114 function dumpJs($return = false, $wrapper = true)
00115 {
00116 $out = '';
00117 if ($wrapper) {
00118 $out .= "<script language=\"JavaScript\" type=\"text/javascript\">\n";
00119 }
00120
00121
00122 $out .= $this->returnCheckJs();
00123
00124
00125 $out .= $this->returnEventJs($this->_events);
00126
00127 if ($wrapper) {
00128 $out .= "</script>\n";
00129 }
00130
00131 if ($return) {
00132 return $out;
00133 } else {
00134 echo $out;
00135 return null;
00136 }
00137 }
00138
00174 function registerEvent($control, $event, $url, $attribs = null)
00175 {
00176 $control2 = preg_replace('/[^a-z0-9_]+/i', '', $control);
00177 $functionName = "ajax_{$control2}_on{$event}";
00178 $this->_events[] = array($control, $event, $url, $attribs, $functionName);
00179 return $functionName;
00180 }
00181
00187 function returnCheckJs()
00188 {
00189 $version = FLEA_VERSION;
00190 return <<<EOT
00191
00192 if (typeof window.jQuery == "undefined") {
00193 alert('ERROR: jQuery JavaScript framework failed.');
00194 }
00195
00196
00197 EOT;
00198 }
00199
00207 function returnEventJs(& $eventList)
00208 {
00209 $bindEvents = array();
00210 $out = '';
00211 foreach ($eventList as $event) {
00212 $out .= $this->_insertAjaxRequest($event, $bindEvents) . "\n";
00213 }
00214 $bindEvents = implode("\n", $bindEvents);
00215 return $out . "\n$(function() {\n{$bindEvents}\n});\n";
00216 }
00217
00226 function _insertAjaxRequest($eventArr, & $bindEvents)
00227 {
00228 list($control, $event, $url, $attribs, $functionName) = $eventArr;
00229 $this->_formatAttribs($attribs);
00230 $bindEvents[] = " $(\"{$control}\").bind(\"{$event}\", function() { return {$functionName}(); });";
00231
00235 $beforeRequest = array();
00236 $call = $event == 'submit' ? "$(\"{$control}\").ajaxSubmit" : "$.ajax";
00237
00241 if (isset($attribs['params'])) {
00242 $params = array();
00243 parse_str($attribs['params'], $params);
00244 $params = (array)$params;
00245 if (!empty($params)) {
00246 $params = encode_url_args($params, FLEA::getAppInf('urlMode'));
00247 switch (FLEA::getAppInf('urlMode')) {
00248 case URL_PATHINFO:
00249 case URL_REWRITE:
00250 $url .= '/' . $params;
00251 break;
00252 default:
00253 if (strpos($url, '?') === false) {
00254 $url .= '?';
00255 } else {
00256 $url .= '&';
00257 }
00258 $url .= $params;
00259 }
00260 }
00261 unset($attribs['params']);
00262 }
00263 $attribs['url'] = '"' . t2js($url) . '"';
00264
00268 if (!isset($attribs['type'])) {
00269 $attribs['type'] = '"post"';
00270 }
00271
00275 if (isset($attribs['target']) || isset($attribs['targetValue'])) {
00276 $targetType = isset($attribs['target']) ? 'html' : 'val';
00277 $target = ($targetType == 'html') ? $attribs['target'] : $attribs['targetValue'];
00278
00279 if (isset($attribs['clearTarget']) && $attribs['clearTarget']) {
00280 $beforeRequest[] = " {$target}.{$targetType}(\"\");";
00281 }
00282
00283 $success = isset($attribs['success']) ? trim($attribs['success']) : '';
00284 if ($success) {
00285 $success = preg_replace('/function.+{/i', '{', $success);
00286 if (substr($success, -1) != ';') { $success .= ';'; }
00287 $success = " {$success}\n";
00288 }
00289
00290 $attribs['success'] = <<<EOT
00291 function(data) {
00292 {$target}.{$targetType}(data);
00293 {$success} }
00294 EOT;
00295
00296 unset($attribs['target']);
00297 unset($attribs['targetValue']);
00298 unset($attribs['clearTarget']);
00299 }
00300
00301 $options = '';
00302 foreach ($attribs as $option => $value) {
00303 $options .= " {$option}: {$value},\n";
00304 }
00305 $options = substr($options, 0, -2);
00306
00307 $beforeRequest = implode("\n", $beforeRequest);
00308 if ($beforeRequest) {
00309 $beforeRequest = "\n{$beforeRequest}";
00310 }
00311 $function = <<<EOT
00312 function {$functionName}()
00313 {{$beforeRequest}
00314 {$call}({
00315 {$options}
00316 });
00317
00318 return false;
00319 }
00320
00321 EOT;
00322
00323 return $function;
00324 }
00325
00331 function _formatAttribs(& $attribs)
00332 {
00333
00334 foreach ($attribs as $option => $value) {
00335 if (!isset($this->paramsType[$option])) {
00336 $type = 'object';
00337 } else {
00338 $type = $this->paramsType[$option];
00339 }
00340
00341 switch ($type) {
00342 case 'raw':
00343 case 'function':
00344 case 'number':
00345 break;
00346 case 'pair':
00347 if (is_array($value)) {
00348 $value = t2js(encode_url_args($value));
00349 }
00350 break;
00351 case 'boolean':
00352 $value = $value ? 'true' : 'false';
00353 break;
00354 case 'object':
00355 $value = "$(\"{$value}\")";
00356 break;
00357 case 'string':
00358 default:
00359 $value = '"' . t2js($value) . '"';
00360 }
00361
00362 $attribs[$option] = $value;
00363 }
00364 }
00365 }