include/projax/classes/Scriptaculous.php
<?php
/**
* Projax
*
* An open source set of php helper classes for prototype and script.aculo.us.
*
* @package Projax
* @author Vikas Patial
* @copyright Copyright (c) 2006, ngcoders.
* @license http://www.gnu.org/copyleft/gpl.html
* @link http://www.ngcoders.com
* @since Version 0.2
* @filesource
*/
class Scriptaculous extends Prototype
{
public $TOGGLE_EFFECTS = ['toggle_appear', 'toggle_slide', 'toggle_blind'];
/**
* Scriptaculous constructor.
*/
public function __construct()
{
}
/**
* @param $element_id
* @param null $options
* @return string
*/
public function dragable_element($element_id, $options = null)
{
return $this->tag($this->_dragable_element_js($element_id, $options));
}
/**
* @param $element_id
* @param null $options
* @return string
*/
public function drop_receiving_element($element_id, $options = null)
{
return $this->tag($this->_drop_receiving_element($element_id, $options));
}
/**
* @param $name
* @param bool $element_id
* @param null $js_options
* @return string
*/
public 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) . ')';
}
}
/**
* @param $element_id
* @param null $options
* @return string
*/
public function sortabe_element($element_id, $options = null)
{
return $this->tag($this->_sortabe_element($element_id, $options));
}
/////////////////////////////////////////////////////////////////////////////////////
// Private functions
/////////////////////////////////////////////////////////////////////////////////////
/**
* @param $element_id
* @param $options
* @return string
*/
public 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 = ['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) . ')';
}
/**
* @param $element_id
* @param $options
* @return string
*/
public function _dragable_element_js($element_id, $options)
{
return 'new Draggable(\'' . $element_id . '\',' . $this->_options_for_javascript($options) . ')';
}
/**
* @param $element_id
* @param $options
* @return string
*/
public 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) . ')';
}
/////////////////////////////////////////////////////////////////////////////////////
// Merged Javascript macro
/////////////////////////////////////////////////////////////////////////////////////
/**
* @param $field_id
* @param $options
* @param bool $tag
* @return string
*/
public function in_place_editor($field_id, $options, $tag = true)
{
$function = 'new Ajax.InPlaceEditor(';
$function .= "'$field_id', ";
$function .= "'" . $options['url'] . "'";
$js_options = [];
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;
}
}
/**
* @param $object
* @param null $tag_options
* @param null $in_place_editor_options
* @return string
*/
public 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;
}
/**
* @param $field_id
* @param $options
* @return mixed
*/
public 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 = [];
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 (['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);
}
/**
* @param $entries
* @param $field
* @param null $phrase
*/
public function auto_complete_results($entries, $field, $phrase = null)
{
if (!is_array($entries)) {
return;
}
$ret_val = '<ul>';
// Complete this function
}
/**
* @param $object
* @param null $tag_options
* @param null $completion_options
* @return string
*/
public 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;
}
/**
* @return string
*/
public 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>';
}
}