PHP Classes
Icontem

File: Ajax.php


  Search   All class groups All class groups   Latest entries Latest entries   Top 10 charts Top 10 charts   Newsletter Newsletter   Blog Blog   Forums Forums   Help FAQ Help FAQ  
  Login   Register  
Recommend this page to a friend! ReTweet ReTweet Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Enéas Gesing  >  AJAX Wrapper  >  Ajax.php  
File: Ajax.php
Role: Class source
Content type: text/plain
Description: Class File
Class: AJAX Wrapper
Implement AJAX functionality using Scriptaculous
 

Contents

Class file image Download
<?php
/**
 * AJAX Wrapper Class
 *
 * This class enables you to integrate AJAX into your web apps.
 *
 * @package	AJAX Wrapper
 * @author	Eneas Gesing
 */

class JavaScript {

	function button_to_function($name,$function=null)
	{
		return '<input type="button" value="'.$name.'" onclick="'.$function.'" />';
	}

	function escape($javascript)
	{
		$javascript=str_replace(array("\r\n","\n","\r"),array("\n"),$javascript);
		$javascript=addslashes($javascript);
		return $javascript;
	}

	function tag($content)
	{
		return '<script type="text/javascript">'.$content.'</script>';
	}

	function link_to_function($name,$function,$html_options=null)
	{
		return '<a href="'.((isset($html_options['href']))?$html_options['href']:'#').'" onclick="'.((isset($html_options['onclick']))?$html_options['onclick'].';':'').$function.'; return false;" />'.$name.'</a>';
	}

	function _array_or_string_for_javascript($option)
	{
		$return_val='';

		if(is_array($option))
		{
			foreach ($option as $value)
      {
				if(!empty($return_val))$ret_val.=', ';
				$return_val.=$value;
			}

			return '['.$return_val.']';
		}

			return "'$option'";
	}

	function _options_for_javascript($options)
	{
		$return_val='';

		if (is_array($options))
    {
  		foreach ($options as $var=>$val)
  		{
  			if (!empty($return_val)) $return_val.=', ';
  			$return_val.="$var:$val";
  		}
		}

		return '{'.$return_val.'}';
	}

}

class Prototype extends JavaScript {

	var $CALLBACKS = array('uninitialized',
							'loading',
							'loaded',
							'interactive',
							'complete',
							'failure',
							'success');

	var $AJAX_OPTIONS = array('before',
							   'after',
							   'condition',
							   'url',
							   'asynchronous',
							   'method',
							   'insertion',
							   'position',
							   'form',
							   'with',
							   'update',
							   'script',
							   'uninitialized',
							   'loading',
							   'loaded',
							   'interactive',
							   'complete',
							   'failure',
							   'success');

	function evaluate_remote_response()
  {
		return 'eval(request.responseText)';
	}

	function form_remote_tag($options)
	{
		$options['form'] = true;
		return '<form action="'.$options['url'].'" onsubmit="'.$this->remote_function($options).'; return false;" method="'.(isset($options['method'])?$options['method']:'post').'"  >';
	}

	function link_to_remote($name,$options=null,$html_options=null)
	{
		return $this->link_to_function($name,$this->remote_function($options),$html_options);
	}

	function observe_field($field_id,$options=null)
	{
		if (isset($options['frequency']) && $options['frequency']> 0 ) {
			return $this->_build_observer('Form.Element.Observer',$field_id,$options);
		}
    else
    {
			return $this->_build_observer('Form.Element.EventObserver',$field_id,$options);
		}
	}

	function observe_form($form_id,$options = null)
	{
		if (isset($options['frequency']))
    {
			return $this->_build_observer('Form.Observer',$form_id,$options);
		}
    else
    {
			return $this->_build_observer('Form.EventObserver',$form_id,$options);
		}
	}

	function periodically_call_remote($options=null)
  {
		$frequency=(isset($options['frequency']))?$options['frequency']:10;
		$code = 'new PeriodicalExecuter(function() {'.$this->remote_function($options).'},'.$frequency.')';
		return $code;
	}

	function remote_function($options)
	{
		$javascript_options = $this->_options_for_ajax($options);
		$update ='';

		if(isset($options['update']) && is_array($options['update']))
		{
			$update=(isset($options['update']['success']))?'success: '.$options['update']['success']:'';
			$update.=(empty($update))?'':",";
			$update.=(isset($options['update']['failure']))?'failure: '.$options['update']['failure']:'';
		}
    else
    {
			$update.=(isset($options['update']))?$options['update']:'';
		}

		$ajax_function=(empty($update))?'new Ajax.Request(':'new Ajax.Updater(\''.$update.'\',';

		$ajax_function.="'".$options['url']."'";
		$ajax_function.=",".$javascript_options.')';

		$ajax_function=(isset($options['before']))?  $options['before'].';'.$ajax_function : $ajax_function;
		$ajax_function=(isset($options['after']))?  $ajax_function.';'.$options['after'] : $ajax_function;
		$ajax_function=(isset($options['condition']))? 'if ('.$options['condition'].') {'.$ajax_function.'}' : $ajax_function;
		$ajax_function=(isset($options['confirm'])) ? 'if ( confirm(\''.$options['confirm'].'\' ) ) { '.$ajax_function.' } ':$ajax_function;

		return $ajax_function;
	}

	function submit_to_remote($name,$value,$options)
  {
		if(isset($options['with']))
    {
			$options['with'] ="Form.serialize(this.form)";
		}

		return '<input type="button" onclick="'.$this->remote_function($options).'" name="'.$name.'" value ="'.$value.'" />';
	}

	function update_element_function($element_id,$options=null,$block)
	{
		$content=(isset($options['content']))?$options['content']:'';
		$content=$this->escape($content);
	}

	function update_page($block)
	{
	}

	function update_page_tag(& $block)
	{
		return $this->tag($block);
	}

	function _build_callbacks($options)
	{
		$callbacks=array();

		foreach ($options as $callback=>$code)
    {
			if (in_array($callback,$this->CALLBACKS))
      {
  			$name = 'on'.ucfirst($callback);
  			$callbacks[$name]='function(request){'.$code.'}';
			}
		}

		return $callbacks;
	}

	function _build_observer($klass,$name,$options=null)
	{
		if (isset($options['with']) && !strstr($options['with'],'='))
    {
			$options['with'] = '\''.$options['with'].'=\' + value';
		}
    elseif (isset($options['with']) && isset($options['update']))
    {
			$options['with'] = 'value';
		}

		$callback = $options['function'] ? $options['function'] : $this->remote_function($options);

		$javascript = "new $klass('$name', ";
		$javascript.= (isset($options['frequency']))?$options['frequency'].', ':'';
		$javascript.= 'function (element,value) { ';
		$javascript.= $callback;
		$javascript.=  (isset($options['on']))?', '.$options['on']:'';
		$javascript.= '})';

		return $javascript;
	}

	function _method_option_to_s($method)
	{
		return (strstr($method,"'"))?$method:"'$method'";
	}

	function _options_for_ajax($options)
	{
		$js_options=(is_array($options))?$this->_build_callbacks($options):array();

		if (isset($options['type']) && $option['type']=='synchronous')	$js_options['asynchronous'] ='false';
		if (isset($options['method'])) $js_options['method']    = $this->_method_option_to_s($options['method']);
		if (isset($options['position'])) $js_options['insertion']    = 'Insertion.'.ucfirst($options['position']);

		$js_options['evalScripts'] = isset($options['script'])?$options['script']:'true';

		if (isset($options['form']))
    {
			$js_options['parameters']='Form.serialize(this)';
		}
    elseif (isset($options['parameters']))
    {
			$js_options['parameters']='Form.serialize(\''.$options['submit'].'\')';
		}
    elseif (isset($options['with']))
    {
			$js_options['parameters']= $options['with'];
		}

		return $this->_options_for_javascript($js_options);
	}

	function dump($javascript)
	{
		echo $javascript;
	}

	function ID($id,$extend=null)
	{
		return "$('$id')".(!empty($extend))?'.'.$extend.'()':'';
	}

	function alert($message)
	{
		return $this->call('alert',$message);
	}

	function assign($variable,$value)
	{
		return "$variable = $value;";
	}

	function call($function , $args = null)
	{
		$arg_str='';
		if (is_array($args))
    {
			foreach ($args as $arg)
      {
				if (!empty($arg_str))$arg_str.=', ';

				if (is_string($arg))
        {
					$arg_str.="'$arg'";
				}
        else
        {
					$arg_str.=$arg;
				}
			}
		}
    else
    {
			if (is_string($arg))
      {
				$arg_str.="'$arg'";
			}
      else
      {
				$arg_str.=$arg;
			}
		}

		return "$function($arg_str)";
	}

	function delay($seconds=1,$script='')
	{
		return "setTimeout( function() { $script } , ".($seconds*1000)." )";
	}

	function hide($id)
	{
		return $this->call('Element.hide',$id);
	}

	function insert_html($position,$id,$options_for_render=null)
	{
		$args=array_merge(array($id),(is_array($options_for_render)?$options_for_render:array($options_for_render)));
		return $this->call('new Insertion.'.ucfirst($position),$args);
	}

	function redirect_to($location)
	{
		return $this->assign('window.location.href',$location);
	}

	function remove($id)
	{
		if (is_array($id))
    {
			$arr_str='';
			foreach ($id as $obj)
      {
				if(!empty($arg_str))$arg_str.=', ';
				$arg_str.="'$arg'";
			}

			return "$A[$arg_str].each(Element.remove)";
		}
    else
    {
			return "Element.remove('$id')";
		}
	}

	function replace($id,$options_for_render)
	{
		$args=array_merge(array($id),(is_array($options_for_render)?$options_for_render:array($options_for_render)));
		return $this->call('Element.replace',$args);
	}

	function replace_html($id,$options_for_render)
	{
		$args=array_merge(array($id),(is_array($options_for_render)?$options_for_render:array($options_for_render)));
		return $this->call('Element.update',$args);
	}

	function select($pattern,$extend=null)
	{
		return "$$('$pattern')".(!empty($extend))?'.'.$extend:'';
	}

	function show($id)
	{
		return $this->call('Element.show',$id);
	}

	function toggle($id)
	{
		return $this->call('Element.toggle',$id);
	}

}

class Scriptaculous extends Prototype {

	var $TOGGLE_EFFECTS = array('toggle_appear', 'toggle_slide','toggle_blind');

	function Scriptaculous()
  {
	}

	function dragable_element($element_id,$options=null)
	{
		return $this->tag($this->_dragable_element_js($element_id,$options));
	}

	function drop_receiving_element($element_id,$options=null)
	{
		return $this->tag($this->_drop_receiving_element($element_id,$options));
	}

	function visual_effect($name,$element_id=false,$js_options=null)
  {
		$element=($element_id)?"'$element_id'":'element';

		$js_queue ='';

		if(isset($js_options) && is_array($js_options['queue']))
    {
		}
    elseif (isset($js_options))
    {
			$js_queue="'$js_options'";
		}

		if(in_array($name,$this->TOGGLE_EFFECTS))
    {
			return "Effect.toggle($element,'".str_replace('toggle_','',$name)."',".$this->_options_for_javascript($js_options).')';
		}
    else
    {
			return  "new Effect.".ucwords($name)."($element,".$this->_options_for_javascript($js_options).')';
		}
	}

	function sortabe_element($element_id,$options=null)
	{
		return $this->tag($this->_sortabe_element($element_id,$options));
	}

	function _sortabe_element($element_id,$options)
	{
		//if(isset($options['with']))
		{
			$options['with'] ="Sortable.serialize('$element_id')";
		}

		//if (isset($option['onUpdate']))
		{
			$options['onUpdate'] ="function(){". $this->remote_function($options) ."}";
		}

		foreach ($options as $var=>$val)if(in_array($var,$this->AJAX_OPTIONS))unset($options[$var]);

		$arr = array('tag','overlap','contraint','handle');

		foreach ($arr as $var)
    {
			if (isset($options[$var]))
      {
				$options[$var]	= "'".$options[$var]."'";
			}
		}

		if (isset($options['containment']))
    {
			$options['containment'] =$this->_array_or_string_for_javascript($options['containment']);
		}

		if (isset($options['only']))
    {
			$options['only'] =$this->_array_or_string_for_javascript($options['only']);
		}

		return "Sortable.create('$element_id',".$this->_options_for_javascript($options).')';

	}

	function _dragable_element_js($element_id,$options)
	{
		return 'new Draggable(\''.$element_id.'\','.$this->_options_for_javascript($options).')';
	}

	function _drop_receiving_element($element_id,$options)
	{
		//if(isset($options['with']))
		{
			$options['with'] = '\'id=\' + encodeURIComponent(element.id)';
		}

		//if (isset($option['onDrop']))
		{
			$options['onDrop'] ="function(element){". $this->remote_function($options) ."}";
		}

		if (is_array($options))
    {
			foreach ($options as $var=>$val)if(in_array($var,$this->AJAX_OPTIONS))unset($options[$var]);
		}

		if (isset($options['accept']))
    {
			$options['accept'] =$this->_array_or_string_for_javascript($options['accept']);
		}

		if (isset($options['hoverclass']))
    {
			$options['hoverclass'] ="'".$options['hoverclass']."'";
		}

		return 'Droppables.add(\''.$element_id.'\','. $this->_options_for_javascript($options).')';
	}

  	function in_place_editor($field_id,$options,$tag=true)
  {
    $function  =  "new Ajax.InPlaceEditor(";
    $function .= "'$field_id', ";
    $function .= "'".$options['url']."'";

    $js_options=array();
    if (isset($options['cancel_text']))$js_options['cancelText']=$options['cancel_text'];
    if (isset($options['save_text']))$js_options['okText']=$options['save_text'];
    if (isset($options['loading_text']))$js_options['loadingText']=$options['loading_text'];
    if (isset($options['rows']))$js_options['rows']=$options['rows'];
    if (isset($options['cols']))$js_options['cols']=$options['cols'];
    if (isset($options['size']))$js_options['size']=$options['size'];
    if (isset($options['external_control']))$js_options['externalControl']="'".$options['external_control']."'";
    if (isset($options['load_text_url']))$js_options['loadTextURL']="'".$options['load_text_url']."'";
    if (isset($options['options']))$js_options['ajaxOptions']=$options['options'];
    if (isset($options['script']))$js_options['evalScripts']=$options['script'];
    if (isset($options['with']))$js_options['callback']="function(form) { return ".$options['with']." }";

    $function.= ', '.$this->_options_for_javascript($js_options).' )';

    if($tag)return $this->tag($function);
    else return $function;
  }

	function in_place_editor_field($object,$tag_options=null,$in_place_editor_options=null)
	{
		$ret_val='';
		$ret_val.='<span id="'.$object.'" class="in_place_editor_field">'.(isset($tag_options['value'])?$tag_options['value']:'').'</span>';
		$ret_val.=$this->in_place_editor($object,$in_place_editor_options);
		return $ret_val;
	}

	function auto_complete_field($field_id,$options)
  {
		$function = "var $field_id"."_auto_completer = new Ajax.Autocompleter(";
		$function.= "'$field_id', ";
		$function.= "'".(isset($options['update'])?$options['update']:$field_id.'_auto_complete')."', ";
		$function.= "'".$options['url']."'";

		$js_options=array();
		if (isset($options['tokens']))$js_options['tokens']=$this->javascript->_array_or_string_for_javascript($options['tokens']);
		if (isset($options['with']))$js_options['callback']="function(element, value) { return ".$options['with']." }";
		if (isset($options['indicator']))$js_options['indicator']="'".$options['indicator']."'";
		if (isset($options['select']))$js_options['select']="'".$options['select']."'";

		foreach (array('on_show'=>'onShow','on_hide'=>'onHide','min_chars'=>'min_chars') as $var=>$val)
    {
			if (isset($options[$var])) $js_options['$val']=$options['var'];
		}

		$function.= ', '.$this->_options_for_javascript($js_options).' )';
		return $this->tag($function);
	}

	function auto_complete_results($entries,$field,$phrase=null)
  {
		if(!is_array($entries))return;
		$ret_val='<ul>';
	//	Complete this function
	}

	function text_field_with_auto_complete($object,$tag_options=null,$completion_options=null)
	{
		$ret_val=(isset($completion_options['skip_style']))?'':$this->_auto_complete_stylesheet();
		$ret_val.='<input autocomplete="off" id="'.$object.'" name="'.$object.'" size="'.(isset($tag_options['size'])?$tag_options['size']:30).'" type="text" value="'.(isset($tag_options['size'])?$tag_options['value']:'').'" '.(isset($tag_options['class'])?'class = "'.$tag_options['class'].'" ':'').'/>';

		$ret_val.='<div id="'.$object.'_auto_complete" class="auto_complete"></div>';
		$ret_val.=$this->auto_complete_field($object,$completion_options);
		return $ret_val;
	}

	function _auto_complete_stylesheet()
	{
		return '<style> div.auto_complete {
	              width: 350px;
	              background: #fff;
 	            }
	            div.auto_complete ul {
 	              border:1px solid #888;
 	              margin:0;
 	              padding:0;
 	              width:100%;
 	              list-style-type:none;
 	            }
 	            div.auto_complete ul li {
 	              margin:0;
 	              padding:3px;
 	            }
 	            div.auto_complete ul li.selected {
 	              background-color: #ffb;
 	            }
 	            div.auto_complete ul strong.highlight {
 	              color: #800;
 	              margin:0;
 	              padding:0;
 	            }
 	            </style>';
	}

	function tooltip($element_id, $content, $options = array()){
		return $this->tag($this->_tooltip_js($element_id, $content, $options));
	}

	function _tooltip_js($element_id, $content, $options){
		return 'new Effect.Tooltip(\''.$element_id.'\',\''.$content.'\','.$this->_options_for_javascript($options).')';
	}
}

class Ajax extends Scriptaculous {

	function js($js_path = '')
	{
		echo '
		<script src="'.$js_path.'prototype.js" type="text/javascript"></script>
		<script src="'.$js_path.'effects.js" type="text/javascript"></script>
		<script src="'.$js_path.'dragdrop.js" type="text/javascript"></script>
		<script src="'.$js_path.'controls.js" type="text/javascript"></script>
		<script src="'.$js_path.'tooltip.js" type="text/javascript"></script>
		';
	}
}

?>

 
  Advertise on this site Advertise on this site   Site map Site map   Statistics Statistics   Site tips Site tips   Privacy policy Privacy policy   Contact Contact  

For more information send a message to :
info at phpclasses dot org.
Copyright (c) Icontem 1999-2009 PHP Classes - PHP Class Scripts
  PHP Book Reviews - Reviews of books and other products