<?php

/**
 * Implements hook_menu().
 *
 * Provides a simple user interface that tells the developer where to go.
 */
function mytinytodo_menu() {
    $items['mytinytodo/init'] = array(
        'page callback' => 'mytinytodo_init_js',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/lang'] = array(
        'page callback' => 'mytinytodo_lang_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/ajax'] = array(
        'page callback' => 'mytinytodo_ajax_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/page'] = array(
        'page callback' => 'mytinytodo_page_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/settings'] = array(
        'page callback' => 'mytinytodo_settings_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/feed'] = array(
        'page callback' => 'mytinytodo_feed_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['mytinytodo/export'] = array(
        'page callback' => 'mytinytodo_export_inc',
        'access callback' => TRUE,
        'type' => MENU_CALLBACK,
    );
    $items['admin/config/content/mytinytodo'] = array(
        'title' => t('myTinyTodo'),
        'description' => t('Configure myTinyTodo settings.'),
        'page callback' => 'drupal_get_form',
        'page arguments' => array('mytinytodo_admin'),
        'access arguments' => array('administer mytinytodo'),
        'file' => 'mytinytodo.admin.inc',
    );
    $items['admin/config/content/mytinytodo/list'] = array(
        'type' => MENU_DEFAULT_LOCAL_TASK,
        'title' => t('List'),
    );

  return $items;
}

function mytinytodo_permission() {
    return array(
        'administer mytinytodo' => array(
            'title' => 'Administer myTinyTodo',
        ),
    );
}

/**
 * Implements hook_theme().
 */
function mytinytodo_theme() {
    $theme = array(
        'mytinytodo_page' => array(
            'template' => 'mytinytodo-page',
            'path' => drupal_get_path('module', 'mytinytodo') . '/tpl',
        ),
        'mytinytodo_html' => array(
            'variables' => array('nid' => NULL, 'field' => NULL, 'pda' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_tree' => array(
            'variables' => array('menu' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_item' => array(
            'variables' => array('item' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_item_callback' => array(
            'variables' => array('item' => NULL, 'callback' => NULL, 'arguments' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_items' => array(
            'variables' => array('items' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_submenu_item' => array(
            'variables' => array('item' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_container' => array(
            'variables' => array('items' => NULL, 'item' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_containers' => array(
            'variables' => array('containers' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_todo_menu_scripts' => array(
            'variables' => array('scripts' => NULL, 'fid' => NULL),
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_edit_note' => array(
            'file' => 'mytinytodo.theme.inc',
        ),
        'mytinytodo_edit_tags' => array(
            'file' => 'mytinytodo.theme.inc',
        ),
    );

    return $theme;
}

function mytinytodo_ajax_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    module_load_include('php', 'mytinytodo', 'lib/ajax');
}

function mytinytodo_page_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    die( theme('mytinytodo_page') );
}

function mytinytodo_settings_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    module_load_include('php', 'mytinytodo', 'lib/settings');
}

function mytinytodo_feed_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    module_load_include('php', 'mytinytodo', 'lib/feed');
}

function mytinytodo_export_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    module_load_include('php', 'mytinytodo', 'lib/export');
}

function mytinytodo_lang_inc() {
    module_load_include('inc', 'mytinytodo', 'lib/init');
    module_load_include('php', 'mytinytodo', 'lib/lang');
}

function mytinytodo_init_js() {
    module_load_include('inc', 'mytinytodo', 'lib/init');

    header("Content-Type: text/javascript");
    die(
'
(function ($) {
  $().ready(function(){

' . ((isset($_GET['pda'])) ? "

	$('body').width(screen.width);
	$(window).resize(function() {
		$('body').width(screen.width);
	});" : '' )
		
. '
	mytinytodo.mttUrl = "/' . drupal_get_path('module', 'mytinytodo')  . '/lib/";'  . '
	mytinytodo.templateUrl = "/' .drupal_get_path('module', 'mytinytodo') . '/lib/themes/default/";' . '
	mytinytodo.db = new mytinytodoStorageAjax(mytinytodo);
	mytinytodo.init({
            showdate: ' . ((Config::get('showdate') && !isset($_GET['pda'])) ? "true" : "false") . ',
            singletab: ' . ((isset($_GET['singletab']) || isset($_GET['pda'])) ? "true" : "false") . ',
            duedatepickerformat: "' . htmlspecialchars(Config::get('dateformat2')) . '",
            firstdayofweek: ' . (int) Config::get('firstdayofweek') . ',
            autotag: ' . (Config::get('autotag') ? "true" : "false") . '
            ' . ((isset($_GET['list'])) ? ', openList: ' . (int)$_GET['list'] : '') . '
            ' . ((isset($_GET['pda'])) ?', touchDevice: true' : '') . '
	}).loadLists(1);
  });
})(jQuery);');
}

/**
 * Implements hook_field_info().
 *
 * Provides the description of the field.
 */
function mytinytodo_field_info() {
    return array(
        'mytinytodo_list' => array(
            'label' => t('TODO list'),
            'description' => t('A TODO list.'),
            'default_widget' => 'mytinytodo_widget',
            'default_formatter' => 'mytinytodo_formatter',
        ),
    );
}

/**
 * Implements hook_field_schema().
 */
function mytinytodo_field_schema($field) {
    $columns = array();
    if ($field['type'] == 'mytinytodo_list') {
        $columns = array(
            'display' => array(
                'type' => 'int',
                'default' => 1,
                'not null' => FALSE,
            ),
        );
    }

    return array('columns' => $columns);
}

/**
 * Implements hook_field_validate().
 */
function mytinytodo_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
}

/**
 * Implements hook_field_is_empty().
 */
function mytinytodo_field_is_empty($item, $field) {
    return empty($item['display']);
}

/**
 * Implements hook_field_formatter_info().
 */
function mytinytodo_field_formatter_info() {
    return array(
        'mytinytodo_formatter' => array(
            'label' => t('Default TODO list style.'),
            'field types' => array('mytinytodo_list'),
        ),
    );
}

function mytinytodo_get_field_id($entity_type, $entity_id, $instance) {
    $results = db_query("SELECT id FROM {mytinytodo_fields} WHERE entity_type = :entity_type AND entity_id = :entity_id AND delta = :delta",
            array(':entity_type' => $entity_type, ':entity_id' => $entity_id, ':delta' => $instance['field_id']));

    if ($results->rowCount() == 0) {
        db_insert("mytinytodo_fields")
            ->fields(array(
                'entity_type' => $entity_type,
                'entity_id' => $entity_id,
                'delta' => $instance['field_id'],
            ))
            ->execute();

        return mytinytodo_get_field_id($entity_type, $entity_id, $instance);
    }

    $result = $results->fetchCol();
    return $result[0];
}

/**
 * Implements hook_field_formatter_view().
 */
function mytinytodo_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
    switch ($entity_type) {
        case 'node':
            $id = $entity->nid;
            break;

        default:
            $id = entity_extract_ids($entity_type, $entity);
            $id = $id[0];
    }

    $element = array();
    foreach ($items as $delta => $item) {
        $field_id = mytinytodo_get_field_id($entity_type, $id, $instance);

        $element[$delta]['#markup'] = '<iframe scrolling="auto" style="overflow-y: auto; width: 100%; height: 400px; border: none;" src="'
            . url('mytinytodo/page', array( 'query' => array( 'fid' => $field_id ) ) )
            . '"></iframe>';
    }

    return $element;
}

/**
 * Implements hook_field_widget_info().
 */
function mytinytodo_field_widget_info() {
    return array(
        'mytinytodo_widget' => array(
            'label' => t('myTinyTodo list'),
            'field types' => array('mytinytodo_list'),
        ),
    );
}

/**
 * Implements hook_field_widget_form().
 */
function mytinytodo_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
    $value = isset($items[$delta]['display']) ? $items[$delta]['display'] : '';
    $element += array(
        '#delta' => $delta,
    );
    $element['display'] = array();

    $element['display'] += array(
        '#type' => 'checkbox',
        '#title' => "Display {$instance['label']}?",
        '#default_value' => $value,
    );
    return $element;
}

/**
 * Implements hook_field_widget_error().
 */
function mytinytodo_field_widget_error($element, $error, $form, &$form_state) {
    switch ($error['error']) {
        case 'mytinytodo_invalid':
            form_error($element, $error['message']);
            break;
    }
}

/**
 * Implements hook_views_api().
 */
function mytinytodo_views_api() {
    return array(
        'api' => 3, 
        'path' => drupal_get_path('module', 'mytinytodo') . '/views',
    );
}

/**
 * Implements hook_mytinytodo_new_list().
 */
function mytinytodo_mytinytodo_new_list($list) {
    if (variable_get('mytinytodo_enable_default_content', true)) {
        for ($i = 1; $i <= 3; $i++) {
            // Create three example tasks with random priorities.
            db_insert('mytinytodo_todos')
                ->fields(array(
                    'uuid' => mytinytodo_generateUUID(),
                    'list_id' => $list['id'],
                    'title' => "Example task $i",
                    'd_created' => time(),
                    'd_edited' => time(),
                    'tags' => "Example tag $i",
                    'tags_ids' => '',
                    'ow' => $i,
                    'prio' => rand(-1, 2)))
               ->execute();
        }
    }
}

/**
 * Implements hook_node_insert().
 * Integrates with Node Clone to completely clone todo lists.
 */
function mytinytodo_node_insert($node) {
    if (!isset($node->clone_from_original_nid) || !($original = node_load($node->clone_from_original_nid))) {
        return;
    }

    // Get all fields
    $fields = field_info_instances('node', $node->type);
    foreach ($fields as $name => $field) {
        $info = field_info_field_by_id($field['field_id']);

        // Process each myTinyTodo field
        if ($info['type'] == 'mytinytodo_list') {
            $old_field_id = mytinytodo_get_field_id('node', $original->nid, $field);
            $new_field_id = mytinytodo_get_field_id('node', $node->nid, $field);

            // Get all the old lists
            $lists = db_query("SELECT * FROM {mytinytodo_lists} WHERE field_id = :id", array(':id' => $old_field_id));
            foreach ($lists as $list) {
                // Clone the list
                $old_list_id = $list->id;
                unset($list->id);
                $list->field_id = $new_field_id;
                $list->uuid = mytinytodo_generateUUID();
                drupal_write_record('mytinytodo_lists', $list);

                // Clone the items
                $new_list_id = $list->id;
                $items = db_query("SELECT * FROM {mytinytodo_todos} WHERE list_id = :id", array(':id' => $old_list_id));
                foreach ($items as $item) {
                    $old_item_id = $item->id;
                    unset($item->id);
                    $item->uuid = mytinytodo_generateUUID();
                    $item->list_id = $new_list_id;
                    drupal_write_record('mytinytodo_todos', $item);

                    // Clone the tags
                    $tags = db_query("SELECT * FROM mytinytodo_tag2task WHERE task_id = :task AND list_id = :list", array(':task' => $old_item_id, ':list' => $old_list_id));
                    foreach ($tags as $tag) {
                        $tag->task_id = $item->id;
                        $tag->list_id = $new_list_id;
                        drupal_write_record('mytinytodo_tag2task', $tag);
                    }
                }
            }
        }
    }
}

/* Found in comments on http://www.php.net/manual/en/function.uniqid.php#94959 */
function mytinytodo_generateUUID() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}
