/**
 * @copyright  Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved.
 * @license    GNU General Public License version 2 or later; see LICENSE.txt
 */

// Only define the Joomla namespace if not defined.
Joomla = window.Joomla || {};

Joomla.editors = {};
// An object to hold each editor instance on page
Joomla.editors.instances = {};

/**
 * Generic submit form
 */
Joomla.submitform = function(task, form) {
    if (typeof(form) === 'undefined') {
        form = document.getElementById('adminForm');
    }

    if (typeof(task) !== 'undefined' && task !== "") {
        form.task.value = task;
    }

    // Submit the form.
    if (typeof form.onsubmit == 'function') {
        form.onsubmit();
    }
    if (typeof form.fireEvent == "function") {
        form.fireEvent('submit');
    }
    form.submit();
};

/**
 * Default function. Usually would be overriden by the component
 */
Joomla.submitbutton = function(pressbutton) {
    Joomla.submitform(pressbutton);
}

/**
 * Custom behavior for JavaScript I18N in Joomla! 1.6
 *
 * Allows you to call Joomla.JText._() to get a translated JavaScript string pushed in with JText::script() in Joomla.
 */
Joomla.JText = {
    strings: {},
    '_': function(key, def) {
        return typeof this.strings[key.toUpperCase()] !== 'undefined' ? this.strings[key.toUpperCase()] : def;
    },
    load: function(object) {
        for (var key in object) {
            this.strings[key.toUpperCase()] = object[key];
        }
        return this;
    }
};

/**
 * Method to replace all request tokens on the page with a new one.
 */
Joomla.replaceTokens = function(n) {
    var els = document.getElementsByTagName('input'), i;
    for (i = 0; i < els.length; i++) {
        if ((els[i].type == 'hidden') && (els[i].name.length == 32) && els[i].value == '1') {
            els[i].name = n;
        }
    }
};

/**
 * USED IN: administrator/components/com_banners/views/client/tmpl/default.php
 *
 * Verifies if the string is in a valid email format
 *
 * @param string
 * @return boolean
 */
Joomla.isEmail = function(text) {
    var regex = new RegExp("^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$");
    return regex.test(text);
};

/**
 * USED IN: all list forms.
 *
 * Toggles the check state of a group of boxes
 *
 * Checkboxes must have an id attribute in the form cb0, cb1...
 *
 * @param   mixed   The number of box to 'check', for a checkbox element
 * @param   string  An alternative field name
 */
Joomla.checkAll = function(checkbox, stub) {
    if (!stub) {
        stub = 'cb';
    }
    if (checkbox.form) {
        var c = 0, i, e;
        for (i = 0, n = checkbox.form.elements.length; i < n; i++) {
            e = checkbox.form.elements[i];
            if (e.type == checkbox.type) {
                if ((stub && e.id.indexOf(stub) == 0) || !stub) {
                    e.checked = checkbox.checked;
                    c += (e.checked == true ? 1 : 0);
                }
            }
        }
        if (checkbox.form.boxchecked) {
            checkbox.form.boxchecked.value = c;
        }
        return true;
    }
    return false;
}

/**
 * Render messages send via JSON
 *
 * @param   object  messages    JavaScript object containing the messages to render
 * @return  void
 */
Joomla.renderMessages = function(messages) {
    var $ = jQuery.noConflict(), $container, $div, $h4, $divList, $p;
    Joomla.removeMessages();
    $container = $('#system-message-container');

    $.each(messages, function(type, item) {
        $div = $('<div/>', {
            'id' : 'system-message',
            'class' : 'alert alert-' + type
        });
        $container.append($div)

        $h4 = $('<h4/>', {
            'class' : 'alert-heading',
            'text' : Joomla.JText._(type)
        });
        $div.append($h4);

        $divList = $('<div/>');
        $.each(item, function(index, item) {
            $p = $('<p/>', {
                html : item
            });
            $divList.append($p);
        });
        $div.append($divList);
    });
};


/**
 * Remove messages
 *
 * @return  void
 */
Joomla.removeMessages = function() {
    jQuery('#system-message-container').empty();
}

/**
 * USED IN: administrator/components/com_cache/views/cache/tmpl/default.php
 * administrator/components/com_installer/views/discover/tmpl/default_item.php
 * administrator/components/com_installer/views/update/tmpl/default_item.php
 * administrator/components/com_languages/helpers/html/languages.php
 * libraries/joomla/html/html/grid.php
 *
 * @param isitchecked
 * @param form
 * @return
 */
Joomla.isChecked = function(isitchecked, form) {
    if (typeof(form) === 'undefined') {
        form = document.getElementById('adminForm');
    }

    if (isitchecked == true) {
        form.boxchecked.value++;
    } else {
        form.boxchecked.value--;
    }

    // Toggle main toggle checkbox depending on checkbox selection
    var c = true, i, e;
    for (i = 0, n = form.elements.length; i < n; i++) {
        e = form.elements[i];
        if (e.type == 'checkbox') {
            if (e.name != 'checkall-toggle' && e.checked == false) {
                c = false;
                break;
            }
        }
    }
    if (form.elements['checkall-toggle']) {
        form.elements['checkall-toggle'].checked = c;
    }
}

/**
 * USED IN: libraries/joomla/html/toolbar/button/help.php
 *
 * Pops up a new window in the middle of the screen
 */
Joomla.popupWindow = function(mypage, myname, w, h, scroll) {
    var winl = (screen.width - w) / 2, wint, winprops, win;
    wint = (screen.height - h) / 2;
    winprops = 'height=' + h + ',width=' + w + ',top=' + wint + ',left=' + winl
            + ',scrollbars=' + scroll + ',resizable'
    win = window.open(mypage, myname, winprops)
    win.window.focus();
}

/**
 * USED IN: libraries/joomla/html/html/grid.php
 */
Joomla.tableOrdering = function(order, dir, task, form) {
    if (typeof(form) === 'undefined') {
        form = document.getElementById('adminForm');
    }

    form.filter_order.value = order;
    form.filter_order_Dir.value = dir;
    Joomla.submitform(task, form);
}

/**
 * USED IN: administrator/components/com_modules/views/module/tmpl/default.php
 *
 * Writes a dynamically generated list
 *
 * @param string
 *          The parameters to insert into the <select> tag
 * @param array
 *          A javascript array of list options in the form [key,value,text]
 * @param string
 *          The key to display for the initial state of the list
 * @param string
 *          The original key that was selected
 * @param string
 *          The original item value that was selected
 */
function writeDynaList(selectParams, source, key, orig_key, orig_val) {
    var html = '\n  <select ' + selectParams + '>', i, selected;
    i = 0;
    for (x in source) {
        if (source[x][0] == key) {
            selected = '';
            if ((orig_key == key && orig_val == source[x][1])
                    || (i == 0 && orig_key != key)) {
                selected = 'selected="selected"';
            }
            html += '\n     <option value="' + source[x][1] + '" ' + selected
                    + '>' + source[x][2] + '</option>';
        }
        i++;
    }
    html += '\n </select>';

    document.writeln(html);
}

/**
 * USED IN: administrator/components/com_content/views/article/view.html.php
 *
 * Changes a dynamically generated list
 *
 * @param string
 *          The name of the list to change
 * @param array
 *          A javascript array of list options in the form [key,value,text]
 * @param string
 *          The key to display
 * @param string
 *          The original key that was selected
 * @param string
 *          The original item value that was selected
 */
function changeDynaList(listname, source, key, orig_key, orig_val) {
    var list = document.adminForm[listname];

    // empty the list
    for (i in list.options.length) {
        list.options[i] = null;
    }
    i = 0;
    for (x in source) {
        if (source[x][0] == key) {
            opt = new Option();
            opt.value = source[x][1];
            opt.text = source[x][2];

            if ((orig_key == key && orig_val == opt.value) || i == 0) {
                opt.selected = true;
            }
            list.options[i++] = opt;
        }
    }
    list.length = i;
}

/**
 * USED IN: administrator/components/com_menus/views/menus/tmpl/default.php
 *
 * @param radioObj
 * @return
 */
// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function radioGetCheckedValue(radioObj) {
    if (!radioObj) {
        return '';
    }
    var n = radioObj.length, i;
    if (n == undefined) {
        if (radioObj.checked) {
            return radioObj.value;
        } else {
            return '';
        }
    }
    for (i = 0; i < n; i++) {
        if (radioObj[i].checked) {
            return radioObj[i].value;
        }
    }
    return '';
}

/**
 * USED IN: administrator/components/com_banners/views/banner/tmpl/default/php
 * administrator/components/com_categories/views/category/tmpl/default.php
 * administrator/components/com_categories/views/copyselect/tmpl/default.php
 * administrator/components/com_content/views/copyselect/tmpl/default.php
 * administrator/components/com_massmail/views/massmail/tmpl/default.php
 * administrator/components/com_menus/views/list/tmpl/copy.php
 * administrator/components/com_menus/views/list/tmpl/move.php
 * administrator/components/com_messages/views/message/tmpl/default_form.php
 * administrator/components/com_newsfeeds/views/newsfeed/tmpl/default.php
 * components/com_content/views/article/tmpl/form.php
 * templates/beez/html/com_content/article/form.php
 *
 * @param frmName
 * @param srcListName
 * @return
 */
function getSelectedValue(frmName, srcListName) {
    var form = document[frmName],
    srcList = form[srcListName];

    i = srcList.selectedIndex;
    if (i != null && i > -1) {
        return srcList.options[i].value;
    } else {
        return null;
    }
}

/**
 * USED IN: all over :)
 *
 * @param id
 * @param task
 * @return
 */
function listItemTask(id, task) {
    var f = document.adminForm, i, cbx,
    cb = f[id];
    if (cb) {
        for (i = 0; true; i++) {
            cbx = f['cb'+i];
            if (!cbx)
                break;
            cbx.checked = false;
        } // for
        cb.checked = true;
        f.boxchecked.value = 1;
        submitbutton(task);
    }
    return false;
}

/**
 * Default function. Usually would be overriden by the component
 *
 * @deprecated  12.1 This function will be removed in a future version. Use Joomla.submitbutton() instead.
 */
function submitbutton(pressbutton) {
    submitform(pressbutton);
}

/**
 * Submit the admin form
 *
 * @deprecated  12.1 This function will be removed in a future version. Use Joomla.submitform() instead.
 */
function submitform(pressbutton) {
    if (pressbutton) {
        document.adminForm.task.value = pressbutton;
    }
    if (typeof document.adminForm.onsubmit == "function") {
        document.adminForm.onsubmit();
    }
    if (typeof document.adminForm.fireEvent == "function") {
        document.adminForm.fireEvent('submit');
    }
    document.adminForm.submit();
}

// needed for Table Column ordering
/**
 * USED IN: libraries/joomla/html/html/grid.php
 */
function saveorder(n, task) {
    checkAll_button(n, task);
}

function checkAll_button(n, task) {
    if (!task) {
        task = 'saveorder';
    }
    var j, box;
    for (j = 0; j <= n; j++) {
        box = document.adminForm['cb'+j];
        if (box) {
            if (box.checked == false) {
                box.checked = true;
            }
        } else {
            alert("You cannot change the order of items, as an item in the list is `Checked Out`");
            return;
        }
    }
    submitform(task);
}
