<?php
/*
Plugin Name: Gamatam Tasks
Plugin URI: http://www.gamatam.com/wp-tasks.jsp
Description: Task management plugin with super streamlined interface.
Version: 0.1
Author: Brian Silberbauer
Author URI: http://www.gamatam.com
License: GPL2
*/
/*  Copyright 2010  Brian Silberbauer  (email : brian.silberbauer@gamatam.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as 
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

//        $wpdb->show_errors();
//        $wpdb->print_error();

include 'paging.php';
include 'widget.php';

$GT = new Gamatam_Tasks();

add_action('init', array(&$GT, 'public_init'));
add_action('wp_head', array(&$GT, 'public_head'));
// admin
add_action('admin_init', array(&$GT, 'admin_init'));
add_action('admin_menu', array(&$GT, 'admin_menu'));
add_action('admin_head', array(&$GT, 'admin_head'));
add_action('wp_dashboard_setup', array(&$GT, 'dashboard_setup' ));
// admin ajax
add_action('wp_ajax_task_add', array(&$GT, 'admin_ajax_task_add'));
add_action('wp_ajax_status_update', array(&$GT, 'admin_ajax_status_update'));
add_action('wp_ajax_priority_update', array(&$GT, 'admin_ajax_priority_update'));
add_action('wp_ajax_assigned_update', array(&$GT, 'admin_ajax_assigned_update'));
add_action('wp_ajax_description_details', array(&$GT, 'admin_ajax_description_details'));
add_action('wp_ajax_description_update', array(&$GT, 'admin_ajax_description_update'));
add_action('wp_ajax_task_update', array(&$GT, 'admin_ajax_task_update'));
add_action('wp_ajax_task', array(&$GT, 'ajax_task'));
// widgets
add_action('widgets_init', create_function('', 'return register_widget("Gamatam_Tasks_Widget");'));

register_activation_hook(__FILE__, array(&$GT, 'table_setup'));

class Gamatam_Tasks {

    public static $TABLE_PREFIX = "gt_";

    function public_head(){
        echo('<link type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/start/jquery-ui.css" rel="stylesheet" />');
    }

    function public_init(){
        wp_enqueue_script('gt_tasks_public', WP_PLUGIN_URL . '/gamatam-tasks/script/public.js', array('jquery-ui-dialog'));
    }

    function admin_init() {
        wp_register_script('gt_tasks_admin', WP_PLUGIN_URL . '/gamatam-tasks/script/admin.js', array('jquery'));
        wp_register_script('jquery.cluetip', WP_PLUGIN_URL . '/gamatam-tasks/script/jquery.cluetip.min.js', array('jquery'));
    }

    function admin_menu() {
        $page = add_menu_page('Gamatam Tasks', 'Gamatam Tasks', 'level_2', 'gamatam_tasks_admin_current_tasks', array($this, 'admin_current_tasks'));
        add_action('admin_print_scripts-' . $page, array($this, 'admin_scripts'));
        $page = add_submenu_page('gamatam_tasks_admin_current_tasks', 'All Tasks', 'All Tasks', 'level_2', 'gamatam_tasks_admin_manage_tasks', array($this, 'admin_manage_tasks'));
        add_action('admin_print_scripts-' . $page, array($this, 'admin_scripts'));
        $page = add_submenu_page('gamatam_tasks_admin_current_tasks', 'Settings', 'Settings', 'level_2', 'gamatam_tasks_admin_settings', array($this, 'admin_settings'));
        add_action('admin_print_scripts-' . $page, array($this, 'admin_scripts'));
    }

    function admin_scripts() {
        wp_enqueue_script('gt_tasks_admin');
        wp_enqueue_script('jquery.cluetip');
    }

    function admin_head() {
        echo '<link type="text/css" rel="stylesheet" href="'. WP_PLUGIN_URL.'/gamatam-tasks/style/admin.css" />' . "\n";
        echo '<link type="text/css" rel="stylesheet" href="'. WP_PLUGIN_URL.'/gamatam-tasks/script/jquery.cluetip.css" />' . "\n";
    }

    function dashboard_setup() {
        wp_add_dashboard_widget('gamatam_tasks_dashboard_widget', 'Gamatam Tasks', array($this, 'admin_dashboard_widget'));
    }

    function admin_dashboard_widget() {
        $task_stats = $this->get_stats();
        ?>
<p><em>Task Stats:</em></p>
<table class="widefat">
    <tbody>
                <?php foreach ($task_stats as $key => $value) {?>
                    <tr><th><?= $key ?></th><td><?= $value ?></td></tr>
                <?php } ?>
    </tbody>
</table>
<a href="<?= get_bloginfo('url') ?>/wp-admin/admin.php?page=gamatam_tasks_admin_current_tasks">curent tasks</a> - 
<a href="<?= get_bloginfo('url') ?>/wp-admin/admin.php?page=gamatam_tasks_admin_manage_tasks">all tasks</a>
        <?PHP
    }

    function admin_ajax_task_add() {
        $this->add_task($_GET['description'], $_GET['status'], $_GET['priority'], $_GET['assigned']);
        include 'admin_current_tasks.php';
        die();
    }

    function admin_ajax_status_update() {
        $this->updateStatus($_POST['task_id'], $_POST['status_id']);
        include 'admin_current_tasks.php';
        die();
    }

    function admin_ajax_priority_update() {
        $this->updatePriority($_POST['task_id'], $_POST['priority_id']);
        include 'admin_current_tasks.php';
        die();
    }

    function admin_ajax_assigned_update() {
        $this->updateAssigned($_POST['task_id'], $_POST['user_id']);
        include 'admin_current_tasks.php';
        die();
    }

    function admin_ajax_description_details() {
        $description = $this->getDescriptionDetails($_GET['task_id']);
        echo '<div id="taskDescriptionDetail" onclick="descriptionEdit()" title="click to edit this description">';
        echo nl2br($description);
        echo '</div>';
        echo '<div id="taskDescriptionDetailEdit" style="display:none">';
        echo '<form action="" method="post" onsubmit="descriptionUpdate(this);return false">';
        echo '<input type="hidden" name="action" value="description_update"/>';
        echo '<input type="hidden" name="task_id" value="'.$_GET['task_id'].'"/>';
        echo '<textarea id="descriptionEdit" name="descriptionEdit" cols="70" rows="10" style="width:580px">';
        echo $description;
        echo '</textarea>';
        echo '<input type="submit" value="update description"/>';
        echo '</form>';
        echo '</div>';
        die();
    }

    function admin_ajax_description_update() {
        $this->updateDescription($_GET['task_id'], $_GET['descriptionEdit']);
        include 'admin_current_tasks.php';
        die();
    }

    function admin_ajax_task_update() {
        $id=$_GET['id'];
        $description=$_GET['description'];
        $status=$_GET['status'];
        $priority=$_GET['priority'];
        $assigned=$_GET['assigned'];
        $this->updateTask($id, $description, $status, $priority, $assigned);
        include 'admin_all_tasks.php';
        die();
    }

    function ajax_task(){
        $id=$_GET['id'];
        $task = $this->get_task($id);
        $status_array = $this->get_status_array();
        $priority_array = $this->get_priority_array();
        $users_array = $this->get_users_array();
        echo '{';
        echo '"id":'.$task->id.',';
        echo '"assigned":"'.$users_array[$task->assigned].'",';
        echo '"created":"'.$task->created.'",';
        echo '"description":"'.preg_replace('/[\r\n]+/', '\\n', $task->description).'",';
        echo '"status_id":"'.$status_array[$task->status_id].'",';
        echo '"priority_id":"'.$priority_array[$task->priority_id].'",';
        echo '"created_by":"'.$users_array[$task->created_by].'"';
        echo '}';
        die();
    }

    function admin_settings() {
        include 'admin_settings.php';
    }

    function admin_manage_tasks() {
        if(isset ($_GET['action'])) {
            global $current_user,$wpdb;
            $table_name = $this->get_table_name('tasks');
            switch ($_GET['action']) {
                case 'delete':
                    $task_id = $_GET['task_id'];
                    $wpdb->query('delete from '.$table_name.' where id='.$task_id);
                    echo 'deleted task';
                    break;
            }
        }
        echo '<div class="wrap">';
        echo '<h2>Manage All Tasks <a href="'.get_bloginfo('wpurl').'/wp-admin/admin.php?page=gamatam_tasks_admin_current_tasks'.'" class="button add-new-h2">Current Tasks</a></h2>';
        echo '<div id="task_list"';//for ajax load
        include 'admin_all_tasks.php';
        echo '</div>';
        include 'admin_inline_edit.php';
        echo '</div>';
    }

    function admin_current_tasks() {
        echo '<div class="wrap">';
        echo '    <h2>Current Tasks <a href="'.get_bloginfo('wpurl').'/wp-admin/admin.php?page=gamatam_tasks_admin_manage_tasks'.'" class="button add-new-h2">All Tasks</a></h2>';
        include 'admin_add_task.php';
        echo '<div id="task_list"';//for ajax load
        include 'admin_current_tasks.php';
        echo '</div>';
        echo'<p/>';
        echo '</div>';
    }

    function get_description_subject($description, $description_length=50) {
        $lines = split("[\n|\r]", $description);
        $firstline = $lines[0];
        if(strlen($firstline)>$description_length) {
            $firstline = substr($firstline, 0, $description_length-2).'..';
        }
        return $firstline;
    }

    function table_setup() {
        $this->create_table_status();
        $this->create_table_priority();
        $this->create_table_tasks();
    }

    function create_table_tasks() {
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $sql = 'CREATE TABLE ' . $table_name . ' (
	  id mediumint(9) NOT NULL AUTO_INCREMENT,
          assigned bigint(20) not null,
          created_by bigint(20) not null,
	  created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
	  description text NOT NULL,
          status_id mediumint(9), 
          priority_id mediumint(9),
	  UNIQUE KEY id (id)
	);';
        dbDelta($sql);
    }

    function create_table_status() {
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        global $wpdb;
        $table_name = $this->get_table_name('status');
        if($wpdb->get_var("show tables like '$table_name'") != $table_name) {
            $sql = 'CREATE TABLE ' . $table_name . ' (
	  id mediumint(9) NOT NULL,
	  name varchar (50) NOT NULL,
	  UNIQUE KEY id (id)
	);';
            dbDelta($sql);
            $status = array(1=>'open', 2=>'in progress', 3=>'test', 4=>'closed', 5=>'deleted');
            foreach($status as $key => $value) {
                $wpdb->insert( $table_name, array('id'=>$key, 'name' => $value), array( '%d', '%s') );
            }
        }
    }

    function create_table_priority() {
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        global $wpdb;
        $table_name = $this->get_table_name('priority');
        if($wpdb->get_var("show tables like '$table_name'") != $table_name) {
            $sql = 'CREATE TABLE ' . $table_name . ' (
	  id mediumint(9) NOT NULL,
	  name varchar (50) NOT NULL,
	  UNIQUE KEY id (id)
	);';
            dbDelta($sql);
            $status = array(10=>'low', 20=>'medium', 30=>'high');
            foreach($status as $key => $value) {
                $wpdb->insert( $table_name, array('id'=>$key, 'name' => $value), array( '%d', '%s') );
            }
        }
    }

    function get_status_array() {
        global $wpdb;
        $table_name = $this->get_table_name('status');
        $status_array = $wpdb->get_results('SELECT id, name FROM '.$table_name);
        $return = array();
        foreach($status_array as $status) {
            $return[$status->id] = $status->name;
        }
        return $return;
    }

    function get_priority_array() {
        global $wpdb;
        $table_name = $this->get_table_name('priority');
        $status_array = $wpdb->get_results('SELECT id, name FROM '.$table_name);
        $return = array();
        foreach($status_array as $status) {
            $return[$status->id] = $status->name;
        }
        return $return;
    }

    function get_filtered_tasks_array($paging) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $tasks_array = $wpdb->get_results('SELECT id, assigned, created, description, status_id, priority_id FROM '.$table_name.' where status_id not in (4,5) order by priority_id desc, status_id desc limit '.$paging->get_start_record().','.$paging->records_per_page);
        return $tasks_array;
    }

    function get_filtered_tasks_array_size() {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $count = $wpdb->get_var('SELECT count(*) FROM '.$table_name.' where status_id not in (4,5)');
        return $count;
    }

    function get_all_tasks_array($paging) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $tasks_array = $wpdb->get_results('SELECT id, assigned, created_by, created, description, status_id, priority_id FROM '.$table_name.' order by priority_id desc, status_id asc limit '.$paging->get_start_record().','.$paging->records_per_page);
        return $tasks_array;
    }

    function get_all_tasks_array_size() {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $count = $wpdb->get_var('SELECT count(*) FROM '.$table_name);
        return $count;
    }

    function get_tasks_array() {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $tasks_array = $wpdb->get_results('SELECT id, assigned, created, description, status_id, priority_id FROM '.$table_name);
        return $tasks_array;
    }

    function get_users_array() {
        global $wpdb;
        $table_name = $wpdb->prefix.'users';
        $users_array = $wpdb->get_results('SELECT ID, display_name FROM '.$table_name);
        $return = array();
        foreach($users_array as $user) {
            $return[$user->ID] = $user->display_name;
        }
        return $return;
    }

    function get_table_name($name) {
        global $wpdb;
        $table_name = $wpdb->prefix.self::$TABLE_PREFIX.$name;
        return $table_name;
    }

    function get_task($task_id){
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $sql = 'select * from '.$table_name.' where id='.$task_id;
        $task = $wpdb->get_row($sql);
        return $task;
    }

    function add_task($description, $status_id, $priority_id, $assigned) {
        global $current_user,$wpdb;
        $table_name = $wpdb->prefix.'gt_tasks';
        $insert = "INSERT INTO " . $table_name ." (assigned,created_by,status_id,priority_id,description) VALUES (".$assigned.",'.$current_user->ID.','.$status_id.','.$priority_id.','".$description."')";
        $results = $wpdb->query( $insert );
    }

    function updateStatus($task_id, $status_id) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $wpdb->update( $table_name, array( 'status_id' => $status_id), array( 'id' => $task_id ), array( '%s'), array( '%d' ) );
    }

    function updatePriority($task_id, $priority_id) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $wpdb->update( $table_name, array( 'priority_id' => $priority_id), array( 'id' => $task_id ), array( '%s'), array( '%d' ) );
    }

    function updateAssigned($task_id, $assigned) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $wpdb->update( $table_name, array( 'assigned' => $assigned), array( 'id' => $task_id ), array( '%d'), array( '%d' ) );
    }

    function updateDescription($task_id, $description) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $wpdb->update( $table_name, array( 'description' => $description), array( 'id' => $task_id ), array( '%s'), array( '%d' ) );
    }

    function updateTask($task_id,  $description,  $status,  $priority,  $assigned) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $values = array( 'description' => $description, 'status_id'=> $status, 'priority_id'=>$priority, 'assigned'=>$assigned);
        $wpdb->update( $table_name, $values, array( 'id' => $task_id ), array( '%s'), array( '%d' ) );
    }
    function getDescriptionDetails($task_id) {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $description = $wpdb->get_var('SELECT description FROM '.$table_name.' where id='.$task_id);
        return $description;
    }

    function get_stats() {
        global $wpdb;
        $table_name = $this->get_table_name('tasks');
        $stats['Current Tasks'] = $wpdb->get_var('select count(*) from wp_gt_tasks where status_id in (1, 2, 3)');
        $stats['Total Tasks'] = $wpdb->get_var('select count(*) from wp_gt_tasks');
        $stats['Closed or Deleted Tasks'] = $wpdb->get_var('select count(*) from wp_gt_tasks where status_id in (4, 5)');
        // current high
        $stats['Current Tasks: High-Priority'] = $wpdb->get_var('select count(*) from wp_gt_tasks where status_id in (1, 2, 3) and priority_id=30');
        $stats['Current Tasks: Medium-Priority'] = $wpdb->get_var('select count(*) from wp_gt_tasks where status_id in (1, 2, 3) and priority_id=20');
        $stats['Current Tasks: Low-Priority'] = $wpdb->get_var('select count(*) from wp_gt_tasks where status_id in (1, 2, 3) and priority_id=10');
        return $stats;
    }


}

?>