// ========================================================
//   bseDOM - 2007 - Raziel Anarki - razielanarki@semmi.se
// --------------------------------------------------------
//
//  based on the excellent DOMAssistant
//  with some of my modding
//
//  no css selectors altough
//
// --------------------------------------------------------
//
//  DOMAssistant is developed by Robert Nyman,
//  (http://www.robertnyman.com), and it is released
//  according to the Creative Commons Deed license
//  (http://creativecommons.org/licenses/GPL/2.0/)
//
//  For more information, please see
//
//    http://www.robertnyman.com/domassistant
//
// --

// snippet from dean edwards

var isMSIE = /*@cc_on!@*/false;

if (!window.getElementsByTagName)
{
    window.getElementsByTagName = function (tag)
    {
        return document.all.tags (tag);
    };
}

// -- renamed classes to avoid possible namespace conflicts

var bseDOM = function ()
{
    var methodsToAdd = [];
    var baseMethodsToAdd = 
    [
        // -- DOM
        'prev',
        'next',
        'create',
        'remove',
        'setAttrs',
        'addContent',
        'replaceContent',

        // -- CSS
        'addClass',
        'removeClass',
        'getStyle',
        'setStyle',

        // -- selectors
        'getByTag',
        'getByClass',
        'getByAttr',

        // -- filters
        'hasClass',
        'hasAttr',

        // -- events
        'addEvent',
        'removeEvent',
        'fireEvent'
    ];

    var ArrayExt = function (last)
    {
        this.lastSet = last || null;
    };

    var ArrayExtMethods =
    {
        end : function ()
        {
            return this.lastSet;
        },
        
        setLast : function (last)
        {
            this.lastSet = last;
        },

    //-- DOM --------------------------------------------------

        prev : function ()
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;

            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.prev.call (this[i]);
                if (elm) { elms.push (elm); }
            }

            return elms;
        },

        next : function ()
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;

            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.next.call (this[i]);
                if (elm) { elms.push (elm); }
            }

            return elms;
        },

        create : function (name, attr, append, content)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;

            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.create.call (this[i], name, attr, append, content);
                if (elm) { elms.push (elm); }
            }

            return elms;

        },

        remove : function ()
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.remove.call (this[i]);
            }

            return this;
        },

        setAttrs : function (attr)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.setAttrs.call (this[i], attr);
            }

            return this;
        },

        addContent : function (content)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.addContent.call (this[i], content);
            }

            return this;
        },

        replaceContent : function (newContent)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.replaceContent.call (this[i], newContent);
            }
    
            return this;
        },

    // -- CSS -------------------------------------------------

        addClass : function (className)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.addClass.call (this[i], className);
            }

            return this;
        },
    
        removeClass : function (className)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.removeClass.call (this[i], className);
            }

            return this;
        },

        getStyle : function (cssRule)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
    
            for (var i = 0; i < this.length; i++)
            {
                elms.push (bseDOM.getStyle.call (this[i], cssRule));
            }
    
            return elms;
        },

        setStyle : function (rules)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.setStyle.call (this[i], rules);
            }
    
            return this;
        },

    // -- selectors -------------------------------------------

        getByTag : function (tag)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;

            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.getByTag.call (this[i], tag);
    
                for (var j = 0; j < elm.length; j++)
                {
                    elms.push (elm[j]);
                }
            }

            return elms;
        },
    
        getByClass : function (className, tag)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;
    
            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.getByClass.call (this[i], className, tag);

                for (var j = 0; j < elm.length; j++)
                {
                    elms.push (elm[j]);
                }
            }

            return elms;
        },
    
        getByAttr : function (attr, attrVal, tag)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);
            var elm;

            for (var i = 0; i < this.length; i++)
            {
                elm = bseDOM.getByAttr.call (this[i], attr, attrVal, tag);
                for (var j = 0; j < elm.length; j++)
                {
                    elms.push (elm[j]);
                }
            }
    
            return elms;
        },

    // -- filters ---------------------------------------------
    
        hasClass : function (className)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);

            for (var i = 0; i < this.length; i++)
            {
                if (bseDOM.hasClass.call (this[i], className))
                {
                    elms.push (this[i]);
                }
            }

            return elms;
        },

        hasAttr : function (attr, attrVal)
        {
            var elms = new ArrayExt ();
            elms.setLast (this);

            for (var i = 0; i < this.length; i++)
            {
                if (bseDOM.hasAttr.call (this[i], attr, attrVal))
                {
                    elms.push (this[i]);
                }
            }

            return elms;
        },

    // -- iterators -------------------------------------------
    
        each : function (func)
        {
            for (var i = 0; i < this.length; i++)
            {
                func.call (this[i]);
            }
    
            return this;
        },

    // -- events ----------------------------------------------

        addEvent : function (evt, func)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.addEvent.call (this[i], evt, func);
            }

            return this;
        },
        
        fireEvent : function (evt)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.fireEvent.call (this[i], evt);
            }

            return this;
        },
    
        removeEvent : function (evt, func)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.removeEvent.call (this[i], evt, func);
            }

            return this;
        }
    };

    // -- events ----------------------------------------------
    
    var processEvent = function (ev, func)
    {
        if (func.call (this, ev) === false)
        {
            bseDOM.cancelDefault (ev);
            bseDOM.cancelBubble (ev);
        }
    };

    var handleEvents = function (evt)
    {
        var ev = evt || event;
        var eventColl = this.events[ev.type];

        for (var i = 0; i < eventColl.length; i++)
        {
            processEvent.call (this, ev, eventColl[i]);
        }
    };

    // -- chaining --------------------------------------------

    var addMethods = function (elm)
    {
        if (elm)
        {
            var elms = (elm.constructor == Array) ? elm : [elm];
            var current;
            var method;

            for (var i = 0; (current = elms[i]); i++)
            {
                for (var j = 0; (method = methodsToAdd[j]); j++)
                {
                    bseDOM.applyMethod.call (current, method.name, method.func);
                }
            }
        }
    };

    // -- domready --------------------------------------------

    var functionsToCall = [];
    var DOMLoaded = false;
    var DOMLoadTimer = null;

    var DOMHasLoaded = function ()
    {
        if (DOMLoaded) { return; }
        DOMLoaded = true;
        clearInterval (DOMLoadTimer);

        var func;

        for (var i = 0; (func = functionsToCall[i]); i++)
        {
            func ();
        }
    };

    // -- Internet Explorer --

/*@cc_on
    @if (@_win32)

    // polling for no errors
    (function ()
    {
        try
        {    // throws errors until after ondocumentready
            document.documentElement.doScroll('left');
        }
        catch (e)
        {
            setTimeout(arguments.callee, 50);
            return;
        }
        // no errors, fire
        DOMHasLoaded();
    })();

    // trying to always fire before onload
    document.onreadystatechange = function()
    {
        if (document.readyState == 'complete')
        {
            document.onreadystatechange = null;
            DOMHasLoaded();
        }
    };

    @end
@*/

    // -- Mozilla/Opera --

    if (document.addEventListener)
    {
        document.addEventListener ('DOMContentLoaded', DOMHasLoaded, false);
    }

    // -- Safari --

    if (navigator.userAgent.search(/WebKit/i) != -1)
    {
        DOMLoadTimer = setInterval (function ()
        {
            if (document.readyState.search (/loaded|complete/i) != -1)
            {
                var loaded = new DOMHasLoaded();
            }
        }, 10);
    }

    // -- Other web browsers --

    window.onload = DOMHasLoaded;

    return {
    //-- DOM --------------------------------------------------
    
        prev : function ()
        {
            var prevSib = this.previousSibling;

            while (prevSib && prevSib.nodeType != 1)
            {
                prevSib = prevSib.previousSibling;
            }

            addMethods (prevSib);
            return prevSib;
        },

        next : function ()
        {
            var nextSib = this.nextSibling;

            while(nextSib && nextSib.nodeType != 1)
            {
                nextSib = nextSib.nextSibling;
            }

            addMethods (nextSib);
            return nextSib;
        },

        create : function (name, attr, append, content)
        {
            var elm = document.createElement (name);

            addMethods (elm);

            if (attr)
            {
                elm.setAttrs (attr);
            }

            if (typeof content != 'undefined')
            {
                elm.addContent (content);
            }

            if (append)
            {
                this.addContent (elm);
            }

            return elm;
        },

        remove : function ()
        {
            this.parentNode.removeChild (this);
            return null;
        },

        setAttrs : function (attr)
        {
            for (var i in attr)
            {
                if (/class/i.test(i))
                {
                    this.className = attr[i];
                }
                else
                {
                    this.setAttribute (i, attr[i]);
                }
            }

            return this;
        },
    
        addContent : function (content)
        {
            var retVal = null;

            if (typeof content == 'string')
            {
                retVal = this.innerHTML += content;
            }
            else
            {
                retVal = this.appendChild (content);
            }

            return this;
        },

        replaceContent : function (newContent)
        {
            for (var i = (this.childNodes.length - 1); i >= 0; i--)
            {
                this.childNodes[i].parentNode.removeChild (this.childNodes[i]);
            }
    
            this.addContent (newContent);

            return this;
        },

    // -- CSS -------------------------------------------------

        addClass : function (className)
        {
            var currentClass = this.className;

            if (!new RegExp(('(^|\\s)' + className + '(\\s|$)'), 'i').test(currentClass))
            {
                this.className = currentClass + ((currentClass.length > 0)? ' ' : '') + className;
            }
    
            return this;
        },

        removeClass : function (className)
        {
            var classToRemove = new RegExp(('(^|\\s)' + className + '(\\s|$)'), 'i');

            this.className = this.className.replace(classToRemove, '').replace(/^\s+|\s+$/g, '');

            return this;
        },

        hasClass : function (className)
        {
            return new RegExp(('(^|\\s)' + className + '(\\s|$)'), 'i').test (this.className);
        },

        getStyle : function (cssRule)
        {
            var cssVal = '';

            if( document.defaultView && document.defaultView.getComputedStyle)
            {
                cssVal = document.defaultView.getComputedStyle (this, '').getPropertyValue (cssRule);
            }
            else if (this.currentStyle)
            {
                var cssProp = cssRule.replace (/\-(\w)/g, function (match, p1) { return p1.toUpperCase(); });
                cssVal = this.currentStyle[cssProp];
            }
    
            return cssVal;
        },

        setStyle : function (rules)
        {
            for (var cssRule in rules)
            {
                var cssProp = cssRule.replace (/\-(\w)/g, function (match, p1) { return p1.toUpperCase(); });
                this.style[cssProp] = rules[cssRule];
            }

            return this;
        },

    // -- selectors -------------------------------------------
    
        $ : function ()
        {
            var elm = new ArrayExt ();

            if (document.getElementById)
            {
                elm = (arguments.length > 1)? new ArrayExt () : null;

                var current;

                for (var i = 0; (current = arguments[i]); i++)
                {
                    if (typeof current !== 'object')
                    {
                        current = document.getElementById (current);
                    }

                    if (arguments.length > 1)
                    {
                        elm.push (current);
                    }
                    else
                    {
                        elm = current;
                    }
                }
    
                addMethods (elm);
            }

            return elm ? elm : new ArrayExt (); // for great silence :)
        },

        getByTag : function (tag)
        {
            var elms = this.getElementsByTagName (tag || '*');
            var current;
            var returnElms = new ArrayExt ();
            returnElms.setLast (this);

            for (var i = 0; (current = elms[i]); i++)
            {
                returnElms.push (current);
            }

            addMethods (returnElms);

            return returnElms;
        },

        getByClass : function (className, tag)
        {
            var elms = this.getByTag (tag);
            var returnElms = new ArrayExt ();
            returnElms.setLast (this);
            var regExp = new RegExp ('(^|\\s)' + className + '(\\s|$)');
            var current;

            for (var i = 0; (current = elms[i]); i++)
            {
                if (regExp.test (current.className))
                {
                    returnElms.push (current);
                }
            }

            return returnElms;
        },

        getByAttr : function (attr, attrVal, tag)
        {
            var elms = this.getByTag (tag);
            var returnElms = new ArrayExt ();
            returnElms.setLast (this);
            var current;
            var currentAttr;
            var regExp;

            if (typeof attrVal != 'undefined')
            {
                regExp = new RegExp ('(^|\\s)' + attrVal + '(\\s|$)');
            }

            for (var i = 0; (current = elms[i]); i++)
            {
                currentAttr = current.getAttribute (attr);

                if (typeof currentAttr == 'string' && currentAttr.length > 0)
                {
                    if (typeof attrVal == 'undefined' || (attrVal && regExp.test (currentAttr)))
                    {
                        returnElms.push (current);
                    }
                }
            }

            return returnElms;
        },

    // -- filters ---------------------------------------------

        hasClass : function (className)
        {
            return new RegExp (('(^|\\s)' + className + '(\\s|$)'), 'i').test (this.className);
        },
    
        hasAttr : function (attr, attrVal)
        {
            var currentAttr;
            var regExp;
    
            if (typeof attrVal != 'undefined')
            {
                regExp = new RegExp ('(^|\\s)' + attrVal + '(\\s|$)');
            }
    
            currentAttr = this.getAttribute (attr);

            if (typeof currentAttr == 'string' && currentAttr.length > 0)
            {
                if (typeof attrVal == 'undefined' || (attrVal && regExp.test (currentAttr)))
                {
                    return true;
                }
            }

            return false;
        },

    // -- events ----------------------------------------------

        addEvent : function (evt, func)
        {
            if (this.addEventListener)
            {
                this.addEventListener (evt, function (ev) { processEvent.call (this, ev, func); }, false);
            }
            else
            {
                if (!this.events)
                {
                    this.events = {};
                }

                if (!this.events[evt])
                {
                    this.events[evt] = [];
                }

                this.events[evt].push (func);

                this['on' + evt] = handleEvents;
    
                if (typeof this.window == 'object')
                {
                    this.window['on' + evt] = handleEvents;
                }
            }

            return this;
        },
        
        fireEvent : function (evt)
        {
                if (isMSIE)
                {
                    //fixme: bubble?/propagation
                    var ev = document.createEventObject ();
                    ev.type = evt;
                    var eventColl = this.events[ev.type];

                    for (var i = 0; i < eventColl.length; i++)
                    {
                        processEvent.call (this, ev, eventColl[i]);
                    }
                }
                else
                {
                    var ev = document.createEvent("Events")
                    ev.initEvent(evt, true, true);
                    this.dispatchEvent (ev);
                }
        },

        removeEvent : function (evt, func)
        {
            if (this.removeEventListener)
            {
                this.removeEventListener (evt, func, false);
            }
            else if (this.events)
            {
                var eventColl = this.events[evt];

                for (var i = 0; i < eventColl.length; i++)
                {
                    if(eventColl[i] == func)
                    {
                        delete eventColl[i];
                        eventColl.splice (i, 1);
                    }
                }
            }

            return this;
        },
        
        getTarget : function  (ev)
        {
            var elm = null;

            if (ev.target)
            {
                elm = (ev.target.nodeType === 3) ? ev.target.parentNode : ev.target;
            }
            else
            {
                elm = ev.srcElement;
            }

            addMethods (elm);

            return elm;
        },

        cancelDefault : function (ev)
        {
            if (ev && ev.preventDefault)
            {
                ev.preventDefault ();
            }
            else
            {
                event.returnValue = false;
            }
        },

        cancelBubble : function (ev)
        {
            if (ev && ev.stopPropagation)
            {
                ev.stopPropagation ();
            }
            else
            {
                event.cancelBubble = true;
            }
        },

    // -- domready --------------------------------------------

        DOMReady : function ()
        {
            var func;

            for (var i = 0; (func = arguments[i]); i++)
            {
                functionsToCall.push (func);
            }
        },

    // -- chaining --------------------------------------------

		addMethod : function (method)
        {
			methodsToAdd.push (method);
		},

		addArrayExtPrototype : function (method, func)
        {
			ArrayExt.prototype[method] = func;
		},

        applyMethod : function (method, func)
        {
            if (typeof this[method] != 'function')
            {
                this[method] = func;
            }
        },

    // -- init ------------------------------------------------

        init : function ()
        {
            bseDOM.applyMethod.call (window, '$', this.$);
            window.bseDOM = this;
            
			if (isMSIE) { ArrayExt = Array; }
            ArrayExt.prototype = [];

            var method;

            for (var i = 0; (method = baseMethodsToAdd[i]); i++)
            {
                bseDOM.addMethod ({name:method, func:bseDOM[method]});
            }

            for (var current in ArrayExtMethods)
            {
                bseDOM.addArrayExtPrototype (current, ArrayExtMethods[current]);
            }
        }
    };
}();

bseDOM.init();

// ========================================================
//   bseDOM - 2007 - Raziel Anarki - razielanarki@semmi.se
// --------------------------------------------------------
//   AJAX module
//
//  based on the excellent DOMAssistant
//  with some of my modding
//
//  actually i've reimplemented it a bit
//  differently this time
//
// --------------------------------------------------------
//
//  DOMAssistant is developed by Robert Nyman,
//  (http://www.robertnyman.com), and it is released
//  according to the Creative Commons Deed license
//  (http://creativecommons.org/licenses/GPL/2.0/)
//
//  For more information, please see
//
//    http://www.robertnyman.com/domassistant
//
// --

// sinppet from dean edwards

if (!window.XMLHttpRequest)
{
    window.XMLHttpRequest = function ()
    {
        return new ActiveXObject ('Microsoft.XMLHTTP');
    };
}

// -- renamed classes to avoid possible namespace conflicts

bseDOM.AJAX = function ()
{
    var baseMethodsToAdd =
    [
        'load',
        'updater',
    ];

    var ArrayExtMethods =
    {
        load : function (url, add)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.AJAX.load.call (this[i], url, add);
            }

            return this;
        },

        updater : function (url, interval, add)
        {
            for (var i = 0; i < this.length; i++)
            {
                bseDOM.AJAX.updater.call (this[i], url, interval, add);
            }

            return this;
        }
    };

    return {

        init : function ()
        {
            var method;

            for (var i = 0; (method = baseMethodsToAdd[i]); i++)
            {
                bseDOM.addMethod ({name:method, func:bseDOM.AJAX[method]});
            }
    
            for (var current in ArrayExtMethods)
            {
                bseDOM.addArrayExtPrototype (current, ArrayExtMethods[current]);
            }
        },

    // -- base functions ----

        // bseDOM.AJAX.get ('data.php?param=value', function (xhr) {})
        get : function (url, callback, sync)
        {
            var req = new XMLHttpRequest ();

            req.open ('get', url, true);
            
            if (typeof callback == 'function')
            {
                req.onreadystatechange = function ()
                {
                     if (req.readyState == 4)
                     {
                         callback.call (this, req);
                         delete req;
                     }
                };
            }

            req.setRequestHeader ('X-AJAX-Request', 'true');

            req.send (null);
        },

        // bseDOM.AJAX.post ('data.php', 'param1=value&param2=value2', function (xhr) {})
        post : function (url, params, callback)
        {
            var req = new XMLHttpRequest ();

            req.open ('post', url, true);

            if (typeof callback == 'function')
            {
                req.onreadystatechange = function ()
                {
                     if (req.readyState == 4)
                     {
                         callback.call (this, req);
                         delete req;
                     }
                };
            }

            req.setRequestHeader ('X-AJAX-Request', 'true');
            req.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
            req.setRequestHeader ('Content-Length', params.length);
            req.setRequestHeader ('Connection', 'close'); // not sure where i got this from...

            req.send (params);
        },
        
    // -- json

        // data = bseDOM.AJAX.parseJSON (req);
        // to be called at the beginning of a callback
        parseJSON : function (req)
        {
            // from json.org's json2.js (dated 2007-12-02)
            if (/^[\],:{}\s]*$/
                .test (req.responseText
                    .replace (/\\./g, '@')
                    .replace (/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']')
                    .replace (/(?:^|:|,)(?:\s*\[)+/g, '')
                ))
            {
                return eval ('(' + req.responseText + ')');
            }

            throw new SyntaxError ('parseJSON - could not validate JSON data');
        },
        
    // -- form serializer ----

        serialize : function (formelement)
        {
            var params = [];
            
            function encode (elm)
            {
                if (elm.name)
                    params.push (encodeURIComponent (elm.name) + '=' + encodeURIComponent (elm.value));
            }

            $(formelement)
                .getByTag ('input')
                    .each (function ()
                    {
                        if ((this.type != 'radio' && this.type != 'checkbox') || this.checked)
                        {
                            encode (this);
                        }
                    })
                    .end ()
                .getByTag ('select')
                    .each (function () { encode (this); })
                    .end ()
                .getByTag ('textarea')
                    .each (function () { encode (this); });

            return params.join('&');
        },
        
    // -- behaviourial funcs ----

        // $('news').load('news.php')
        // $('news').load('news.php?from=10', true) //append
        load : function (url, add)
        {
            var elm = this;

            bseDOM.AJAX.get (url, function (req)
            {
                if (req.status == 200)
                {
                    if (add)
                        elm.addContent (req.responseText);
                    else
                        elm.replaceContent (req.responseText);
                    elm.fireEvent ('update');
                }
            });

            return this;
        },

        // $('shoutbox').updater('shouts.php', 10000, false);
        // unset elm.updateInterval to stop
        updater : function (url, interval)
        {
            var elm = this;

            elm.load (url);

            elm.updateInterval = setInterval (function ()
            {
                elm.load (url);
            }, interval);

            return this;
        }
    };
}();

bseDOM.AJAX.init ();

// ========================================================
//   spam protected emails
// --------------------------------------------------------

bseDOM.DOMReady (function ()
{
    var replaces = 0;

    while (document.body.innerHTML.indexOf ('##' + 'kukac##') != -1 && replaces < 1000)
    {
        document.body.innerHTML = document.body.innerHTML.replace ('##kukac' + '##', String.fromCharCode (64));
        replaces++;
    }
});


// ========================================================
//  external links in new window
// --------------------------------------------------------

bseDOM.DOMReady (function ()
{
    $(document)
        .getByAttr ('rel','external', 'a')
        .hasAttr ('href')
        .addEvent ('click', function () { window.open (this.href); return false; })
        .setAttrs ({'title': 'új ablakban nyílik meg'})
        .each (function ()
        {
            var imgs = this.getByTag ('img');

            if (!imgs.length) this.setStyle
            ({
                'background-image': 'url(/js/../common/images/icons/external_link_icon.gif)',
                'background-repeat': 'no-repeat',
                'background-position': 'left center',
                'padding-left': '14px',
                'display': 'inline-block',
                'border': '0'
            });
        });
});


// ========================================================
//  smarter textareas
// --------------------------------------------------------
//   bbcode editor based on weblabor's
//   http://weblabor.hu
// --------------------------------------------------------

(function () {

function resizeTextarea (ev)
{
    this.setStyle ({'height': (this.scrollHeight - 20) + 'px'});  //at least 1em
    this.setStyle ({'height': (this.scrollHeight < 140 ? 140 : this.scrollHeight) + 'px'});
}

function insertTag (callback)
{
    // this = textarea!

     // IE fix
    if (isMSIE)
    {
        var range = document.selection.createRange ();
        
        if (range.parentElement() != this)
        {
            range = this.createTextRange ();
            range.collapse ();
            range.moveStart ('character', this.value.length);
            range.select ();
        }

        var stored_range = range.duplicate ();

        stored_range.moveToElementText (this);
        stored_range.setEndPoint ('EndToEnd', range);

        this.selectionStart = stored_range.text.length - range.text.length;
        this.selectionEnd = this.selectionStart + range.text.length;
    }

    var startPos = this.selectionStart;
    var endPos = this.selectionEnd;
    var text = this.value.substring (startPos, endPos);
    var scrollPos = this.scrollTop;
    if (callback) { text = callback (text); }

    this.value = this.value.substring(0, startPos) + text + this.value.substring(endPos, this.value.length);
    this.focus();
    this.selectionStart = startPos;
    this.selectionEnd = startPos + text.length;
	this.scrollTop = scrollPos;

 	if (isMSIE)
	{
        range = this.createTextRange ();
        range.collapse ();
        range.moveStart ('character', this.selectionStart);
        range.moveEnd ('character', text.length);
        range.select ();
    }

	resizeTextarea.call (this, null);
}

function generalTag (tag, open, sub, value)
{
    //this = textarea;

	insertTag.call (this, function (text)
    {
		var ret = text;
		var content;
	    var param = '';

		var rx_open = new RegExp ('\\[(' + tag + ')((?:[:=][^\\]]+))?\\]','m');
		var rx_close = new RegExp ('\\[/' + tag + '\\]','m');

		var match = ret.match (rx_open);

		var tagm = null;
		var openm = null;

		if (match)
        {
            tagm = match[1]; openm = match[2] || null;

            ret = ret.replace (rx_open, '');
		    ret = ret.replace (rx_close, '');

            if (value)
            {
                ret = value (ret, false);
            }
		}
		
		//alert (match+' - '+tag+'='+tagm+' - '+open+'='+openm);

        if (!match || (tagm == tag && openm != open))
        {
			if (sub) { param = sub (); }

            if (value) { content = value (ret, true); }
                else { content = ret; }

			if ((!sub || param) && (!value || content))
            {

			    ret = '[' + tag + (open ? open : '') + param + ']' + content + '[/' + tag + ']';
			}
		}

		return ret;
	});
}

function listValue (text, add)
{
    // converts items marked with  to bbcode items and back

    // >* first item
    // >* second item * also second item
    // >* third
    
    var ret;

    if (add)
    {
        // add first '\n[item]'
        // replace '\n* ' with '[/item]\n[item]'
        // repalce first '* ' with ''
        // + '[item]\n';
        
        if (text)
        {
            ret = '\n[item]' + text
                    .replace (/(\r\n|\r|\n)/g, '\n') // <- IE fix
                    .replace (/\n\*\s/g, '[/item]\n[item]')
                    .replace (/\*\s/m, '')
                   + '[/item]\n';
        }
        else
        {
            ret = '\n[item][/item]\n';
        }

    }
    else
    {
        // replace '[item]' with '* '
        // remove '[/item]'

        ret = text
                .replace (/(\r\n|\r|\n)/g, '\n') // <- IE fix
                .replace (/\n\[item\]/, '* ')
                .replace (/\[\/item\]\n\[item\]/g, '\n* ')
                .replace (/\[\/item\]\n/, '');
    }
    
    return ret;
}

function askForUrl ()
{
    return (window.prompt ('Hova mutasson a link?\n - belso/link/\n - http://kulsolink.com/', 'http://'));
}

function askImgSrc (text, add)
{
    if (!add) return '';
    return (window.prompt ('A kép címe (url):', 'http://'));
}

function askPicNum (text, add)
{
    if (!add) return '';
    return (window.prompt ('A galériából hányadik képet? (pos=?)', '1'));
}

bseDOM.DOMReady (function ()
{
    $(document)
        .getByTag ('textarea')
        .each (function ()
        {
            if (isMSIE)
            {
                this.addEvent ('propertychange', function (e) { if (e.propertyName.toLowerCase() == 'value') { resizeTextarea.call (this); }});
            }
            else
            {
                this.addEvent ('input', resizeTextarea);
            }

            resizeTextarea.call (this);
        });

    $(document)
        .getByClass ('rich', 'textarea')
        .each (function ()
        {
            var div, text;
            
            text = this;

            div = this.create ('div', {'class':'richedit'});

            div.create ('a', {'href':'javascript:;', 'title': 'Félkövér'}, true, '<img src="/js/../common/images/richedit/text_bold.png" alt="B" />')
                .addEvent ('click', function (ev) { generalTag.call (text, 'b'); return false; });

            div.create ('a', {'href':'javascript:;', 'title': 'Dőlt'}, true, '<img src="/js/../common/images/richedit/text_italic.png" alt="I" />')
                .addEvent ('click', function (ev) { generalTag.call (text, 'i'); return false; });

            div.create ('a', {'href':'javascript:;', 'title': 'Aláhúzott'}, true, '<img src="/js/../common/images/richedit/text_underline.png" alt="U" />')
                .addEvent ('click', function (ev) { generalTag.call (text, 'u'); return false; });

            div.addContent (document.createTextNode(' '));

            div.create ('a', {'href':'javascript:;', 'title': 'Link'}, true, '<img src="/js/../common/images/richedit/link.png" alt="link" />')
                .addEvent ('click', function (ev) { generalTag.call (text, 'url', '=', askForUrl); return false; });

            div.create ('a', {'href':'javascript:;', 'title': 'Idézet'}, true, '<img src="/js/../common/images/richedit/comment.png" alt="idéz" />')
                .addEvent ('click', function (ev) { generalTag.call (text, 'quote'); return false; });
                
            if (this.hasClass ('img'))
            {
                div.addContent (document.createTextNode(' '));

                div.create ('a', {'href':'javascript:;', 'title': 'Kép baloldalt'}, true, '<img src="/js/../common/images/richedit/picture_left.png" alt="balkép" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'img','=left',null,askImgSrc); return false; });

                div.create ('a', {'href':'javascript:;', 'title': 'Kép jobboldalt'}, true, '<img src="/js/../common/images/richedit/picture_right.png" alt="jobbkép" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'img', '=right',null,askImgSrc); return false; });
            }

            if (this.hasClass ('cpm'))
            {
                div.addContent (document.createTextNode(' '));

                div.create ('a', {'href':'javascript:;', 'title': 'Kép a galériából'}, true, '<img src="/js/../common/images/richedit/photo.png" alt="kép" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'pic',null,null, askPicNum); return false; });
            }

            if (this.hasClass ('editor'))
            {
                div.addContent (document.createTextNode(' '));

                div.create ('a', {'href':'javascript:;', 'title': 'Balra igazít'}, true, '<img src="/js/../common/images/richedit/text_align_left.png" alt="bal" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'p', '=left'); return false; });

                div.create ('a', {'href':'javascript:;', 'title': 'Középre igazít'}, true, '<img src="/js/../common/images/richedit/text_align_center.png" alt="közép" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'p', '=center'); return false; });

                div.create ('a', {'href':'javascript:;', 'title': 'Jobbra igazít'}, true, '<img src="/js/../common/images/richedit/text_align_right.png" alt="jobb" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'p', '=right'); return false; });

                div.create ('a', {'href':'javascript:;', 'title': 'Sorkizárt'}, true, '<img src="/js/../common/images/richedit/text_align_justify.png" alt="sorkizár" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'p'); return false; });

                div.addContent (document.createTextNode(' '));

                div.create ('a', {'href':'javascript:;', 'title': 'Lista'}, true, '<img src="/js/../common/images/richedit/text_list_bullets.png" alt="lista" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'list',null,null, listValue); return false; });

                div.create ('a', {'href':'javascript:;', 'title': 'Felsorolás'}, true, '<img src="/js/../common/images/richedit/text_list_numbers.png" alt="felsorol" />')
                    .addEvent ('click', function (ev) { generalTag.call (text, 'list','=1',null, listValue); return false; });

            }

            text.parentNode.insertBefore (div, text);

            if (isMSIE)
            {
                $(div)
                    .getByTag('img')
                    .each (function ()
                    {
                        var s = this.src;

                        if (s.toLowerCase().indexOf(".png") != -1)
                        {
                            this.src = '/js/../common/images/richedit/blank.gif';
                            this.style.filter += "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + s + "', sizingMethod='crop');";
                        }
                    });
            }
        });
});

})();



