/**
 * JavaScript Toolbox
 *
 * @package    toolbox.js
 * @author     "Thomas Buhk" <buhk@pointproduction.com>
 * @copyright  (c) Copyright 2007 by Point Production e.K. All rights reserved. (http://www.pointproduction.com/)
 * @version    $Id$
 */
 
var Toolbox = {
    Version: '0.1'
}; 
 
var Url = {

    request : {
        baseurl : '',
        language : '',
        module : '',
        controller : '',
        action : ''
    },

    routeTemplate : new Template(
        '/#{baseurl}/#{language}/#{module}/#{controller}/#{action}'
    ),
        
    init : function(request)
    {
        Object.extend(this.request, request || {});
    },

    assemble : function(urlObject, paramObject, reset)
    {
    	// Variables
    	var param = null;
    	var url = null;
    	var route = null;
    	var params = '';
    	
        // Update/reset request/params
        if (reset == true) {
            for (param in this.request) {
                switch (param) {
                    case 'baseurl':
                    case 'language':
                    case 'module':
                    case 'controller':
                    case 'action':
                        break;
                    default:
                        this.request[param] = null;
                }
            }
        }
        Object.extend(this.request, urlObject);
        Object.extend(this.request, paramObject);

        // Create route
        route = this.routeTemplate.evaluate(this.request).gsub('//', '/');
        
        // Create params
        for (param in this.request) {
            switch (param) {
                case 'baseurl':
                case 'language':
                case 'module':
                case 'controller':
                case 'action':
                    break;
                default:
                    if (this.request[param] != null) {
                        params += '/' + param + '/' + this.request[param];
                    }
                    break;
            } 
        }
        
        // Create url
        if (params != '') {
            url = route + params; 
        } else {
            url = route;
        }
        
        return url;
    }
    
};

var Cookie = {

    create : function(name, value, days)
    {
		// Variables
		var date = null;
		var expires = null;
	
        if (days) {
            date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = '; expires=' + date.toGMTString();
        } else {
            expires = '';
        }
        document.cookie = name + '=' + value + expires + '; path=/';
    },

    read : function(name)
    {
        var nameEQ = name + '=';
        var ca = document.cookie.split(';');
        for (var i=0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') {
                c = c.substring(1, c.length);
            }
            if (c.indexOf(nameEQ) == 0) {
                return c.substring(nameEQ.length, c.length);
            }
        }
        return null;
    },
    
    erase : function(name)
    {
        this.create(name, '', -1);
    }

};

var Folder = {

    options : {
        type : '',
        clipboard : {
            mode : '',
            data : new Array(),
            selected : new Array()
        },
        column : {
            name : '',
            order : '',
            id : ''
        },
        counter : 0
    },

    init : function(options)
    {
        // Init view object
        Object.extend(this.options, options || {});
        
        // Init clipboard:
        var selected = this.options.clipboard.selected;
        this.options.clipboard.selected = new Array();
        selected.scan(/\w+/,  function(token) {
            var id = token.toString();
            Folder.select(id);
        });
        
        // Update buttonbar:
        this.update();
        
        // Init tablesort:
        SortableTable.sort($('tableBody'), this.options.column.id, this.options.column.order);
        if (this.options.column.order == 1) {
            $('col' + this.options.column.name).addClassName('thSortingUp');
            $('col' + this.options.column.name).removeClassName('thSortingDown');
        } else {
            $('col' + this.options.column.name).addClassName('thSortingDown');
            $('col' + this.options.column.name).removeClassName('thSortingUp');
        }
    },

    action : function(urlOptions, param, reset)
    {
        var data = this.options.clipboard.selected.compact();
                 
        if (data.size() != 0) {
            switch (urlOptions.action) {
                case 'preview':
                    var temp = Url.assemble(urlOptions, {id:data}, reset);
                    var url = false;
                    Dialog.open(temp, 600, 700);
                    break;
                default:
                    switch (param) {
                        case 'id':
                            var url = Url.assemble(urlOptions, {id:data}, reset);
                            break;
                        case 'selected':
                            var url = Url.assemble(urlOptions, {selected:data}, reset);
                            break;
                        default:
                            var url = Url.assemble(urlOptions, {selected:null}, reset);
                            break;
                    }
                    break;
            }
        } else {
            var url = Url.assemble(urlOptions, {selected:null}, reset);
        }
        if (url != false) {
            window.location = url;
        }
    },
    
    select : function(id)
    {
        var row = $('r' + id);
        if (row != null) {
            // select/unselect
            if (row.hasClassName('selected')) {
                row.removeClassName('selected');
                this.options.clipboard.selected[id] = null;
                this.options.counter--;
            } else {
                row.addClassName('selected');
                this.options.clipboard.selected[id] = id;
                this.options.counter++;
            }
            this.update();
        }
    },
    
    update : function()
    {
        var type = this.options.type;
        var selected = this.options.clipboard.selected.compact();
        var mode = this.options.clipboard.mode; 
        
        if (selected.size() == 0) {
            switch (type) {
                case 'folder':
                case 'uncategorized':
                    $('buttonEdit').hide();
                    $('buttonEditDisabled').show();
                    $('buttonCopy').hide();
                    $('buttonCopyDisabled').show();
                    $('buttonCut').hide();
                    $('buttonCutDisabled').show();
                    $('buttonDelete').hide();
                    $('buttonDeleteDisabled').show();
                    $('buttonPreview').hide();
                    $('buttonPreviewDisabled').show();
                    $('buttonDownload').hide();
                    $('buttonDownloadDisabled').show();
                    $('buttonApprove').hide();
                    $('buttonApproveDisabled').show();
                    break;
                case 'category':
                    $('buttonEdit').hide();
                    $('buttonEditDisabled').show();
                    $('buttonCopy').hide();
                    $('buttonCopyDisabled').show();
                    $('buttonCut').hide();
                    $('buttonCutDisabled').show();
                    $('buttonDelete').hide();
                    $('buttonDeleteDisabled').show();
                    break;
                case 'orders':
                    $('buttonOrderEdit').hide();
                    $('buttonOrderEditDisabled').show();
                    $('buttonReview').hide();
                    $('buttonReviewDisabled').show();
                    $('buttonArchived').hide();
                    $('buttonArchivedDisabled').show();
                    $('buttonInvoice').hide();
                    $('buttonInvoiceDisabled').show();
                    break;    
                case 'trashcan':
                    $('buttonUndelete').hide();
                    $('buttonUndeleteDisabled').show();
                    $('buttonArchive').hide();
                    $('buttonArchiveDisabled').show();
                    break;
                case 'searchresult':
                    $('buttonGoto').hide();
                    $('buttonGotoDisabled').show();
                    $('buttonPreview').hide();
                    $('buttonPreviewDisabled').show();
                    break;
                case 'rules':
                    $('buttonRuleEdit').hide();
                    $('buttonRuleEditDisabled').show();
                    $('buttonRuleDelete').hide();
                    $('buttonRuleDeleteDisabled').show();
                    break;
                default:
                    break;
            }
        } else {
            switch (type) {
                case 'folder':
                case 'uncategorized':
                    if (this.options.counter == 1) {
                        $('buttonEdit').show();
                        $('buttonEditDisabled').hide();
                    } else {
                        $('buttonEdit').hide();
                        $('buttonEditDisabled').show();
                    }
                    $('buttonCopy').show();
                    $('buttonCopyDisabled').hide();
                    $('buttonCut').show();
                    $('buttonCutDisabled').hide();
                    $('buttonDelete').show();
                    $('buttonDeleteDisabled').hide();
                    if (this.options.counter == 1) {
                        $('buttonPreview').show();
                        $('buttonPreviewDisabled').hide();
                        $('buttonDownload').show();
                        $('buttonDownloadDisabled').hide();
                    } else {
                        $('buttonPreview').hide();
                        $('buttonPreviewDisabled').show();
                        $('buttonDownload').hide();
                        $('buttonDownloadDisabled').show();
                    }
                    $('buttonApprove').show();
                    $('buttonApproveDisabled').hide();
                    break;
                case 'category':
                    if (this.options.counter == 1) {
                        $('buttonEdit').show();
                        $('buttonEditDisabled').hide();
                    } else {
                        $('buttonEdit').hide();
                        $('buttonEditDisabled').show();
                    }
                    $('buttonCopy').show();
                    $('buttonCopyDisabled').hide();
                    $('buttonCut').show();
                    $('buttonCutDisabled').hide();
                    $('buttonDelete').show();
                    $('buttonDeleteDisabled').hide();
                    break;
                case 'orders':
                    $('buttonReview').show();
                    $('buttonReviewDisabled').hide();
                    $('buttonArchived').show();
                    $('buttonArchivedDisabled').hide();
                    if (this.options.counter == 1) {
                        $('buttonOrderEdit').show();
                        $('buttonOrderEditDisabled').hide();
                        $('buttonInvoice').show();
                        $('buttonInvoiceDisabled').hide();
                    } else {
                        $('buttonOrderEdit').hide();
                        $('buttonOrderEditDisabled').show();
                        $('buttonInvoice').hide();
                        $('buttonInvoiceDisabled').show();
                    }
                    break;    
                case 'trashcan':
                    $('buttonUndelete').show();
                    $('buttonUndeleteDisabled').hide();
                    $('buttonArchive').show();
                    $('buttonArchiveDisabled').hide();
                    break;
                case 'searchresult':
                    $('buttonGoto').show();
                    $('buttonGotoDisabled').hide();
                    if (this.options.counter == 1) {
                        $('buttonPreview').show();
                        $('buttonPreviewDisabled').hide();
                    } else {
                        $('buttonPreview').hide();
                        $('buttonPreviewDisabled').show();
                    }
                    break;
                case 'rules':
                    if (this.options.counter == 1) {
                        $('buttonRuleEdit').show();
                        $('buttonRuleEditDisabled').hide();
                    } else {
                        $('buttonRuleEdit').hide();
                        $('buttonRuleEditDisabled').show();
                    }
                    $('buttonRuleDelete').show();
                    $('buttonRuleDeleteDisabled').hide();
                    break;
                default:
                    break;
            }
        }
        if (type != 'trashcan' && type != 'uncategorized' && type != 'searchresult' && type != 'orders' && type != 'rules') {
            if (mode.empty()) {
                $('buttonPaste').hide();
                $('buttonPasteDisabled').show();
            } else {
                $('buttonPaste').show();
                $('buttonPasteDisabled').hide();
            }
        }
    },
    
    sort : function(table, field, index)
    {
        if (this.options.column.name != field) {
            $('col' + this.options.column.name).removeClassName('thSortingUp');
            $('col' + this.options.column.name).removeClassName('thSortingDown');
            this.options.column.order = -1;
        }
        if (this.options.column.order == 1) {
            SortableTable.sort($(table), index, -1);
            this.options.column.name = field;
            this.options.column.order = -1;
            Url.init({column:this.options.column.name, order:'DESC'});
            $('col' + field).addClassName('thSortingDown');
            $('col' + field).removeClassName('thSortingUp');
        } else {
            SortableTable.sort($(table), index, 1);
            this.options.column.name = field;
            this.options.column.order = 1;
            Url.init({column:this.options.column.name, order:'ASC'});
            $('col' + field).addClassName('thSortingUp');
            $('col' + field).removeClassName('thSortingDown');
        }
    }

};

var Form = {

    options : {
        name : null,
        subpages : new Array()
    },

    mode : '',

    init : function(options)
    {
        // Init form object
        Object.extend(this.options, options || {})
        
        // Show first subpage
        this.subpage('');
    },
        
    action : function(urlOptions, param, reset)
    {
        switch (urlOptions.action) {
            case 'preview':
                var url = Url.assemble(urlOptions, param, reset);
                Dialog.open(url, 600, 700);
                break;
            case 'save':
            case 'close':
            case 'cancel':
            case 'reload':
            case 'delete':
            case 'create':
            case 'update':
            case 'destroy':
                this.post('mode', urlOptions.action);
                $(this.options.name).submit();
                break;
            default:
                var url = Url.assemble(urlOptions, param, reset);
                window.location = url;
                break;
        }
    },
    
    subpage : function (name)
    {
        if (name.empty()) {
            name = this.options.subpages[0].name;
        }
        for (i in this.options.subpages) {
            subpage = document.getElementById(this.options.subpages[i].name);
            tab = document.getElementById(this.options.subpages[i].name+'Tab');
            if (subpage != null) {
                if (this.options.subpages[i].name == name) {
                    subpage.style.display = '';
                    tab.className = 'formPageTabCurrent'
                } else {
                    subpage.style.display = 'none';
                    tab.className = 'formPageTabNormal';
                }
            }
        }
    },
    
    section : function (name)
    {
        var section = document.getElementById(name).style;
        var image = document.getElementById(name+'Image');
        if (section.display == '') {
            section.display = 'none';
            if (image != null) {
                image.src = '/system/icons/tree/root/close.png';
            }
        } else {
            section.display =  '';
            if (image != null) {
                image.src = '/system/icons/tree/root/open.png';
            }
        }
    },
    
    post : function (name, value)
    {
        // Create field
        var field = document.createElement('input');
        field.name = name;
        field.type = 'hidden';
        field.value = value;
        
        // Append field
        $(this.options.name).appendChild(field);
    }
    
};

var Mouse = {

    pos : {
        x : 0,
        y : 0
    },
    
    win : {
        x : 0,
        y : 0  
    },

    move : function(event)
    {
        if (event.pageX) {
            var usedMethod = 'A';
            Mouse.pos.x = event.pageX;    
            Mouse.pos.y = event.pageY;
        } else if (window.event && window.event.clientX) {
            var usedMethod = 'B';
            var isStrictMode = document.compatMode && document.compatMode != 'BackCompat' ? true : false;
            var scrollX = isStrictMode ? document.documentElement.scrollLeft : document.body.scrollLeft;
            var scrollY = isStrictMode ? document.documentElement.scrollTop : document.body.scrollTop;
            Mouse.pos.x = window.event.clientX + scrollX;
            Mouse.pos.y = window.event.clientY + scrollY;
        } else {
            var usedMethod = 'C';
            Mouse.pos.x = Event.pointerX(event);
            Mouse.pos.y = Event.pointerY(event);
        }
        Mouse.win.x = event.clientX;    
        Mouse.win.y = event.clientY;

        // Debug output:
        var debug = document.getElementById("debugTop");
        if (debug != null) {
            debug.innerHTML = '[x:' + Mouse.win.x + '/y:' + Mouse.win.y + '] (x:' + Mouse.pos.x + '/y:' + Mouse.pos.y + ') {' + usedMethod + '}';
        }
        var debug = document.getElementById("debugBottom");
        if (debug != null) {
            debug.innerHTML = '[x:' + Mouse.win.x + '/y:' + Mouse.win.y + '] (x:' + Mouse.pos.x + '/y:' + Mouse.pos.y + ') {' + usedMethod + '}';
        }
    }
    
};

Event.observe(document, 'mousemove', Mouse.move);


var Keyboard = {

    options : {
        
    },
    
    init : function()
    {
        //Event.observe(document, 'keypress', Keyboard.press);
    },
    
    press : function(event)
    {
        if (event.altKey) {
            if (event.keyCode) {
                 code = event.keyCode;
            } else if (event.which) {
                code = event.which;
            }
            var character = String.fromCharCode(code);
            switch (code) {
                case 229:
                    alert('ALT + A -> SelectAll');
                    break;
                case 231:
                    alert('ALT + C -> Copy');
                    break;
                case 8730:
                    alert('ALT + V -> Paste');
                    break;
                case 8776:
                    alert('ALT + X -> Cut');
                    break;
                default:
                    alert('ALT + "' + character + '" (' + code + ')');
                    break;
            }
        }
        // Grrrrr... windows mal wieder... DA KLAPPT DER SCHEISS NICHT :(
        if (event.ctrlKey) {
            if (event.keyCode) {
                 code = event.keyCode;
            } else if (event.which) {
                code = event.which;
            }
            var character = String.fromCharCode(code);
            switch (code) {
                case 229:
                    alert('ALT + A -> SelectAll');
                    break;
                case 231:
                    alert('ALT + C -> Copy');
                    break;
                case 8730:
                    alert('ALT + V -> Paste');
                    break;
                case 8776:
                    alert('ALT + X -> Cut');
                    break;
                default:
                    alert('CTRL + "' + character + '" (' + code + ')');
                    break;
            }
        }
    }
    
};


