/**
* phpBB3 forum functions
*/

/**
* Window popup
*/
function popup(url, width, height, name)
{
        if (!name)
        {
                name = '_popup';
        }

        window.open(url.replace(/&amp;/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes, width=' + width);
        return false;
}

/**
* Jump to page
*/
 // www.phpBB-SEO.com SEO TOOLKIT BEGIN
    function jumpto() {
       var page = prompt(jump_page, on_page);

       if (page !== null && !isNaN(page) && page == Math.floor(page) && page > 0) {
          var seo_page = (page - 1) * per_page;
          var anchor = '';
          var anchor_parts = base_url.split('#');
          if ( anchor_parts[1] ) {
             base_url = anchor_parts[0];
             anchor = '#' + anchor_parts[1];
          }
          if ( base_url.indexOf('?') >= 0 ) {
             document.location.href = base_url.replace(/&amp;/g, '&') + '&start=' + seo_page + anchor;
          } else if ( seo_page > 0 ) {
             var seo_type1 = base_url.match(/\.[a-z0-9]+$/i);
             if (seo_type1 !== null) {
                document.location.href = base_url.replace(/\.[a-z0-9]+$/i, '') + seo_delim_start + seo_page + seo_type1 + anchor;
             }
             var seo_type2 = base_url.match(/\/$/);
             if (seo_type2 !== null) {
                document.location.href = base_url + seo_static_pagination + seo_page + seo_ext_pagination + anchor;
             }
          } else {
             document.location.href = base_url + anchor;
          }
       }
    }
    // Open external links in new window in a XHTML 1.x compliant way.
    /**
    *  phpbb_seo_href()
    *  Fixes href="#something" links with virtual directories
    *  Optionally open external or marked with a css class links in a new window
    *  in a XHTML 1.x compliant way.
    */
    function phpbb_seo_href() {
       var current_domain = document.domain.toLowerCase();
       if (!current_domain || !document.getElementsByTagName) return;
       if (seo_external_sub && current_domain.indexOf('.') >= 0) {
          current_domain = current_domain.replace(new RegExp(/^[a-z0-9_-]+\.([a-z0-9_-]+\.([a-z]{2,6}|[a-z]{2,3}\.[a-z]{2,3}))$/i), '$1');
       }
       if (seo_ext_classes) {
          var extclass = new RegExp("(^|\s)(" + seo_ext_classes + ")(\s|$)");
       }
       if (seo_hashfix) {
          var basehref = document.getElementsByTagName('base')[0];
          if (basehref) {
             basehref = basehref.href;
             var hashtest = new RegExp("^(" + basehref + "|)#[a-z0-9_-]+$");
             var current_href = document.location.href.replace(/#[a-z0-9_-]+$/i, "");
          } else {
             seo_hashfix = false;
          }
       }
       var hrefels = document.getElementsByTagName("a");
       var hrefelslen = hrefels.length;
       for (var i = 0; i < hrefelslen; i++) {
          var el = hrefels[i];
          var hrefinner = el.innerHTML.toLowerCase();
          if (el.onclick || (el.href == '') || (el.href.indexOf('javascript') >=0 ) || (hrefinner.indexOf('<a') >= 0) ) {
             continue;
          }
          if (seo_hashfix && el.hash && hashtest.test(el.href)) {
             el.href = current_href + el.hash;
          }
          if (seo_external) {
             if ((el.href.indexOf(current_domain) >= 0) && !(seo_ext_classes && extclass.test(el.className))) {
                continue;
             }
             el.onclick = function () { window.open(this.href); return false; };
          }
       }
    }
    if (seo_external || seo_hashfix) {
       onload_functions.push('phpbb_seo_href()');
    }
    // www.phpBB-SEO.com SEO TOOLKIT END

/**
* Mark/unmark checklist
* id = ID of parent container, name = name prefix, state = state [true/false]
*/
function marklist(id, name, state)
{
        var parent = document.getElementById(id);
        if (!parent)
        {
                eval('parent = document.' + id);
        }

        if (!parent)
        {
                return;
        }

        var rb = parent.getElementsByTagName('input');

        for (var r = 0; r < rb.length; r++)
        {
                if (rb[r].name.substr(0, name.length) == name)
                {
                        rb[r].checked = state;
                }
        }
}

/**
* Resize viewable area for attached image or topic review panel (possibly others to come)
* e = element
*/
function viewableArea(e, itself)
{
        if (!e) return;
        if (!itself)
        {
                e = e.parentNode;
        }

        if (!e.vaHeight)
        {
                // Store viewable area height before changing style to auto
                e.vaHeight = e.offsetHeight;
                e.vaMaxHeight = e.style.maxHeight;
                e.style.height = 'auto';
                e.style.maxHeight = 'none';
                e.style.overflow = 'visible';
        }
        else
        {
                // Restore viewable area height to the default
                e.style.height = e.vaHeight + 'px';
                e.style.overflow = 'auto';
                e.style.maxHeight = e.vaMaxHeight;
                e.vaHeight = false;
        }
}

/**
* Set display of page element
* s[-1,0,1] = hide,toggle display,show
*/
function dE(n, s)
{
        var e = document.getElementById(n);

        if (!s)
        {
                s = (e.style.display == '' || e.style.display == 'block') ? -1 : 1;
        }
        e.style.display = (s == 1) ? 'block' : 'none';
}

/**
* Alternate display of subPanels
*/
function subPanels(p)
{
        var i, e, t;

        if (typeof(p) == 'string')
        {
                show_panel = p;
        }

        for (i = 0; i < panels.length; i++)
        {
                e = document.getElementById(panels[i]);
                t = document.getElementById(panels[i] + '-tab');

                if (e)
                {
                        if (panels[i] == show_panel)
                        {
                                e.style.display = 'block';
                                if (t)
                                {
                                        t.className = 'activetab';
                                }
                        }
                        else
                        {
                                e.style.display = 'none';
                                if (t)
                                {
                                        t.className = '';
                                }
                        }
                }
        }
}

/**
* Call print preview
*/
function printPage()
{
        if (is_ie)
        {
                printPreview();
        }
        else
        {
                window.print();
        }
}

/**
* Show/hide groups of blocks
* c = CSS style name
* e = checkbox element
* t = toggle dispay state (used to show 'grip-show' image in the profile block when hiding the profiles)
*/
function displayBlocks(c, e, t)
{
        var s = (e.checked == true) ?  1 : -1;

        if (t)
        {
                s *= -1;
        }

        var divs = document.getElementsByTagName("DIV");

        for (var d = 0; d < divs.length; d++)
        {
                if (divs[d].className.indexOf(c) == 0)
                {
                        divs[d].style.display = (s == 1) ? 'none' : 'block';
                }
        }
}

function selectCode(a)
{
        // Get ID of code block
        var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];

        // Not IE
        if (window.getSelection)
        {
                var s = window.getSelection();
                // Safari
                if (s.setBaseAndExtent)
                {
                        s.setBaseAndExtent(e, 0, e, e.innerText.length - 1);
                }
                // Firefox and Opera
                else
                {
                        // workaround for bug # 42885
                        if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) == '<BR>')
                        {
                                e.innerHTML = e.innerHTML + '&nbsp;';
                        }

                        var r = document.createRange();
                        r.selectNodeContents(e);
                        s.removeAllRanges();
                        s.addRange(r);
                }
        }
        // Some older browsers
        else if (document.getSelection)
        {
                var s = document.getSelection();
                var r = document.createRange();
                r.selectNodeContents(e);
                s.removeAllRanges();
                s.addRange(r);
        }
        // IE
        else if (document.selection)
        {
                var r = document.body.createTextRange();
                r.moveToElementText(e);
                r.select();
        }
}

/**
* Play quicktime file by determining it's width/height
* from the displayed rectangle area
*/
function play_qt_file(obj)
{
        var rectangle = obj.GetRectangle();

        if (rectangle)
        {
                rectangle = rectangle.split(',');
                var x1 = parseInt(rectangle[0]);
                var x2 = parseInt(rectangle[2]);
                var y1 = parseInt(rectangle[1]);
                var y2 = parseInt(rectangle[3]);

                var width = (x1 < 0) ? (x1 * -1) + x2 : x2 - x1;
                var height = (y1 < 0) ? (y1 * -1) + y2 : y2 - y1;
        }
        else
        {
                var width = 200;
                var height = 0;
        }

        obj.width = width;
        obj.height = height + 16;

        obj.SetControllerVisible(true);
        obj.Play();
}

/**
* Check if the nodeName of elem is name
* @author jQuery
*/
function is_node_name(elem, name)
{
        return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
}

/**
* Check if elem is in array, return position
* @author jQuery
*/
function is_in_array(elem, array)
{
        for (var i = 0, length = array.length; i < length; i++)
                // === is correct (IE)
                if (array[i] === elem)
                        return i;

        return -1;
}

/**
* Find Element, type and class in tree
* Not used, but may come in handy for those not using JQuery
* @author jQuery.find, Meik Sievertsen
*/
function find_in_tree(node, tag, type, class_name)
{
        var result, element, i = 0, length = node.childNodes.length;

        for (element = node.childNodes[0]; i < length; element = node.childNodes[++i])
        {
                if (!element || element.nodeType != 1) continue;

                if ((!tag || is_node_name(element, tag)) && (!type || element.type == type) && (!class_name || is_in_array(class_name, (element.className || element).toString().split(/\s+/)) > -1))
                {
                        return element;
                }

                if (element.childNodes.length)
                        result = find_in_tree(element, tag, type, class_name);

                if (result) return result;
        }
}

var in_autocomplete = false;
var last_key_entered = '';

/**
* Check event key
*/
function phpbb_check_key(event)
{
        // Keycode is array down or up?
        if (event.keyCode && (event.keyCode == 40 || event.keyCode == 38))
                in_autocomplete = true;

        // Make sure we are not within an "autocompletion" field
        if (in_autocomplete)
        {
                // If return pressed and key changed we reset the autocompletion
                if (!last_key_entered || last_key_entered == event.which)
                {
                        in_autocompletion = false;
                        return true;
                }
        }

        // Keycode is not return, then return. ;)
        if (event.which != 13)
        {
                last_key_entered = event.which;
                return true;
        }

        return false;
}

/**
* Usually used for onkeypress event, to submit a form on enter
*/
function submit_default_button(event, selector, class_name)
{
        // Add which for key events
        if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode))
                event.which = event.charCode || event.keyCode;

        if (phpbb_check_key(event))
                return true;

        var current = selector['parentNode'];

        // Search parent form element
        while (current && (!current.nodeName || current.nodeType != 1 || !is_node_name(current, 'form')) && current != document)
                current = current['parentNode'];

        // Find the input submit button with the class name
        //current = find_in_tree(current, 'input', 'submit', class_name);
        var input_tags = current.getElementsByTagName('input');
        current = false;

        for (var i = 0, element = input_tags[0]; i < input_tags.length; element = input_tags[++i])
        {
                if (element.type == 'submit' && is_in_array(class_name, (element.className || element).toString().split(/\s+/)) > -1)
                        current = element;
        }

        if (!current)
                return true;

        // Submit form
        current.focus();
        current.click();
        return false;
}

/**
* Apply onkeypress event for forcing default submit button on ENTER key press
* The jQuery snippet used is based on http://greatwebguy.com/programming/dom/default-html-button-submit-on-enter-with-jquery/
* The non-jQuery code is a mimick of the jQuery code ;)
*/
function apply_onkeypress_event()
{
        // jQuery code in case jQuery is used
        if (jquery_present)
        {
                $('form input').live('keypress', function (e)
                {
                        var default_button = $(this).parents('form').find('input[type=submit].default-submit-action');

                        if (!default_button || default_button.length <= 0)
                                return true;

                        if (phpbb_check_key(e))
                                return true;

                        if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13))
                        {
                                default_button.click();
                                return false;
                        }

                        return true;
                });

                return;
        }

        var input_tags = document.getElementsByTagName('input');

        for (var i = 0, element = input_tags[0]; i < input_tags.length ; element = input_tags[++i])
        {
                if (element.type == 'hidden')
                        continue;

                // onkeydown is possible too
                element.onkeypress = function (evt) { submit_default_button((evt || window.event), this, 'default-submit-action'); };
        }
}

/**
* Detect JQuery existance. We currently do not deliver it, but some styles do, so why not benefit from it. ;)
*/
var jquery_present = typeof jQuery == 'function';