Landieb = {
    REQUIRED_PROTOTYPE: '1.6.0.2',
    REQUIRED_SCRIPTACULOUS: '1.8.1',
    baseUrl: '/js/',
    pageUrl: '/',
    convertVersionString: function(versionString) {
        var v = versionString.replace(/_.*|\./g,'');
        v = parseInt(v+'0'.times(4-v.length));
        return versionString.indexOf('_')>-1?v-1:v;
    },
    errorHandler: function(desc, page, line, chr) {
        alert('desc: ' + desc + '\npage: ' + page + '\nline: ' + line + '\nchr: ' + chr);
        return false;
    },
    init: function() {
        if ((typeof Prototype == 'undefined') ||
            (typeof Element == 'undefined') ||
            (typeof Element.Methods == 'undefined') ||
            (Landieb.convertVersionString(Prototype.Version) < Landieb.convertVersionString(Landieb.REQUIRED_PROTOTYPE))) {
            throw('Landieb requires the Prototype JavaScript framework >= ' + Landieb.REQUIRED_PROTOTYPE);
        }
        if ((typeof Scriptaculous == 'undefined') ||
            (typeof Scriptaculous.load == 'undefined') ||
            (typeof Scriptaculous.require == 'undefined') ||
            (Landieb.convertVersionString(Scriptaculous.Version) < Landieb.convertVersionString(Landieb.REQUIRED_SCRIPTACULOUS))) {
            throw('Landieb requires the script.aculo.us framework >= ' + Landieb.REQUIRED_SCRIPTACULOUS);
        }
        if ((typeof Builder == 'undefined') ||
            (typeof Builder.node == 'undefined') ||
            (typeof Builder.NODEMAP == 'undefined')) {
            throw('Landieb requires the script.aculo.us Builder');
        }
        var thisJs = /Landieb\.js$/;
        $$('head script[src]').findAll( function(script){
            return script.src.match(thisJs);
        }).each( function(script){
            Landieb.baseUrl = script.src.replace(thisJs,'');
            Landieb.baseUrl = Landieb.baseUrl.replace('http://' + document.location.host, '');
        });
        $$('input.select4Copy').each( function(inputElement) {
            Event.observe(inputElement, 'click', $(inputElement).select);
            Event.observe(inputElement, 'focus', $(inputElement).select);
        });
        $$('.script').each( function(element) {
            $(element).show();
        });
        $$('.noscript').each( function(element) {
            $(element).hide();
        });
        //if ($$('input.ImageBrowser').length) {
        //    Landieb.load('ImageBrowser', function(transport) {
        //        if (transport.success) {
        //            $$('input.ImageBrowser').each( function(element) {
        //                Landieb.ImageBrowser.init(element);
        //            });
        //        }
        //    });
        //}
        if ($('messages_inbox') || $('messages_outbox')) {
            $$('a.messages_select').each( function(element) {
                Event.observe(element, 'mousedown', function(event) {
                    Event.stop(event);
                    $$('#messages_inbox input[type=checkbox]').each( function(select) {
                        $(select).writeAttribute('checked', 'checked').checked = true;
                    });
                    $$('#messages_outbox input[type=checkbox]').each( function(select) {
                        $(select).writeAttribute('checked', 'checked').checked = true;
                    });
                });
            });
            $$('a.messages_deSelect').each( function(element) {
                Event.observe(element, 'mousedown', function(event) {
                    Event.stop(event);
                    $$('#messages_inbox input[type=checkbox]').each( function(select) {
                        $(select).writeAttribute('checked', false).checked = false;
                    });
                    $$('#messages_outbox input[type=checkbox]').each( function(select) {
                        $(select).writeAttribute('checked', false).checked = false;
                    });
                });
            });
            $$('a.messages_show').each( function(element) {
                if ($(element).hasAttribute('rel') && !isNaN($(element).readAttribute('rel')) && $('message_text_' + $(element).readAttribute('rel'))) {
                    Event.observe(element, 'click', function(event) {
                        Event.stop(event);
                        Effect.toggle('message_text_' + $(element).readAttribute('rel'), 'blind', { duration: 0.4, queue: { position: 'end', scope: 'message_text_' + $(element).readAttribute('rel') } });
                        if ($(element).hasClassName('bold')) {
                            var form = Event.findElement(event, 'form');
                            if ($(form).id == 'messages_inbox') {
                                new Ajax.Request($(element).readAttribute('href'));
                                if ($('messages_message_' + $(element).readAttribute('rel'))) {
                                    $(element).removeClassName('bold');
                                    $('messages_message_' + $(element).readAttribute('rel')).previous().down().writeAttribute('src', '/images/icons/email_open.png');
                                }
                            }
                        }
                    });
                }
            });
            if ($('messages_info')) {
                $$('a.message_delete_info').each( function(element) {
                    Event.observe(element, 'click', function(event) {
                        Event.stop(event);
                        $(element).up().remove();
                    });
                });
                $$('a.message_delete').each( function(element) {
                    if ($(element).hasAttribute('rel') && !isNaN($(element).readAttribute('rel')) && $('message_' + $(element).readAttribute('rel'))) {
                        Event.observe(element, 'click', function(event) {
                            Event.stop(event);
                            Effect.toggle('message_' + $(element).readAttribute('rel'), 'blind', {
                                duration: 0.8,
                                queue: { position: 'end', scope: 'message_' + $(element).readAttribute('rel') },
                                afterFinish: function() {
                                    $('message_' + $(element).readAttribute('rel')).remove();
                                }
                            });
                            var url = '/messages';
                            var form = Event.findElement(event, 'form');
                            if ($(form).id == 'messages_outbox') {
                                var url = '/messages/outbox'
                            }
                            new Ajax.Request(url, {
                                method: 'post',
                                parameters: {
                                    'delete_selected': true,
                                    'messages[]': [$(element).readAttribute('rel')]
                                },
                                onComplete: function (transport) {
                                    if (!transport.responseJSON) {
                                        if (transport.responseText.isJSON()) {
                                            transport.responseJSON = transport.responseText.evalJSON();
                                        }
                                    }
                                    if (transport.responseJSON) {
                                        transport.responseJSON.info.each( function(info) {
                                            var build = Builder.node('p', [
                                                Builder.node('a', {className: 'message_delete_info', href: 'javascript: void(0);'}, [
                                                    Builder.node('img', {src: '/images/icons/cross.png', alt: ''})
                                                ])
                                            ]);
                                            $(build).insert(info);
                                            $('messages_info').insert(build);
                                            Event.observe($(build).down(), 'click', function(event) {
                                                Event.stop(event);
                                                $(build).remove();
                                            });
                                        });
                                        transport.responseJSON.error.each( function(error) {
                                            var build = Builder.node('p', {className: 'red'}, [
                                                Builder.node('a', {className: 'message_delete_info', href: 'javascript: void(0);'}, [
                                                    Builder.node('img', {src: '/images/icons/cross.png', alt: ''})
                                                ])
                                            ]);
                                            $(build).insert(error);
                                            $('messages_info').insert(build);
                                            Event.observe($(build).down(), 'click', function(event) {
                                                Event.stop(event);
                                                $(build).remove();
                                            });
                                        });
                                    }
                                },
                                onFailure: function () {
                                    window.location = '/messages/delete/' + $(element).readAttribute('rel');
                                }
                            });
                        });
                    }
                });
            }
        }
        if ($('messages_new_to_del') && $('messages_new_to_add')) {
            var mother = $('messages_new_to_del').up().identify();
            var inputs = $$('#' + mother + ' input');
            var counts = inputs.length;
            if (counts < 2) {
                $('messages_new_to_del').hide();
            } else if (counts > 2) {
                $('messages_new_to_add').hide();
            }
            Landieb.load('controls', function(transport) {
                if (transport.success) {
                    inputs.each( function(element) {
                        new Ajax.Autocompleter($(element).id, 'messages_new_autocomplete', '/autocomplete', {
                            method: 'get',
                            paramName: 'nick',
                            minChars: 3
                        });
                    });
                }
            });
            Event.observe('messages_new_to_del', 'click', function(event) {
                Event.stop(event);
                var mother = $('messages_new_to_del').up().identify();
                var inputs = $$('#' + mother + ' input');
                var counts = inputs.length;
                if (counts > 1) {
                    counts--;
                    inputs[counts].previous().remove();
                    inputs[counts].next().remove();
                    inputs[counts].remove();
                    if (counts <= 1) {
                        $('messages_new_to_del').hide();
                    } else if (!$('messages_new_to_del').visible()) {
                        $('messages_new_to_del').show();
                    }
                    if (counts < 3 && !$('messages_new_to_add').visible()) {
                        $('messages_new_to_add').show();
                    }
                }
            });
            Event.observe('messages_new_to_1', 'change', function(event){
                new Ajax.Autocompleter('messages_new_to_1', 'messages_new_autocomplete', '/autocomplete', {
                            method: 'get',
                            paramName: 'nick',
                            minChars: 3
                        });
            });
            Event.observe('messages_new_to_add', 'click', function(event) {
                Event.stop(event);
                var mother = $('messages_new_to_add').up().identify();
                var counts = $$('#' + mother + ' input').length;
                if (counts < 3) {
                    counts++;
                    $(mother).insert('<label for="messages_new_to_' + counts + '">Empfänger ' + counts + ' : </label>');
                    $(mother).insert('<input id="messages_new_to_' + counts + '" class="messages_new_to" autocomplete="off" type="text" name="to[]" value="" />');
                    $(mother).insert('<br class="clearB" />');
                    $('messages_new_to_' + counts).focus();
                    new Ajax.Autocompleter('messages_new_to_' + counts, 'messages_new_autocomplete', '/autocomplete', {
                        method: 'get',
                        paramName: 'nick',
                        minChars: 3
                    });
                    if (counts >= 3) {
                        $('messages_new_to_add').hide();
                    } else if (!$('messages_new_to_add').visible()) {
                        $('messages_new_to_add').show();
                    }
                    if (counts > 1 && !$('messages_new_to_del').visible()) {
                        $('messages_new_to_del').show();
                    }
                }
            });
        }
        if ($('messages_new_textarea') && $('messages_new_signs')) {
            var signs = $('messages_new_textarea').getValue().length;
            signs = (5000 - signs);
            $('messages_new_signs').update(signs);
            Event.observe('messages_new_textarea', 'keyup', function(event) {
                var signs = $('messages_new_textarea').getValue().length;
                if (!signs) {
                    $('messages_new_signs').update('5000');
                } else if (signs <= 5000) {
                    signs = (5000 - signs);
                    $('messages_new_signs').update(signs);
                }
            });
        }
        //if ($$('.BBCode')) {
        //    Landieb.load('BBCode', function(transport) {
        //        if (transport.success) {
        //            $$('.BBCode').each( function(element) {
        //                new Landieb.BBCode(element);
        //            });
        //        }
        //    });
        //}
        $$('.toggle').each( function(toggleLink) {
            Event.observe(toggleLink, 'click', function(event) {
                $w($(toggleLink).getAttribute ('class')).each( function(toggleElement) {

					if ($(toggleElement)) {
                        $(toggleElement).toggle();
                    }
                });
                if ($(toggleLink).hasClassName('self') && !$('self')) {
                    $(toggleLink).toggle();
                }
            });
        });
        if ($$('input.selectUsername').length) {
            Landieb.load('controls', function(transport) {
                if (transport.success) {
                    if (!$('Autocompleter')) {
                        $$('body')[0].appendChild(
                            Builder.node('div', {id: 'Autocompleter'}));
                    }
                    $$('input.selectUsername').each( function(selectInput) {
                        new Ajax.Autocompleter(selectInput, 'Autocompleter', Landieb.pageUrl + 'autocomplete', {
                            method: 'get',
                            paramName: 'nick',
                            minChars: 3
                        });
                    });
                }
            });
        }
        if ($$('.counter').length) {
            $$('.counter').each( function(counter) {
                var time = $(counter).innerHTML.split(' ');
                if (time.size() != 2) return;
                if (isNaN(time[0]) || isNaN(time[1])) return;
                Landieb._temp.counter.list.set($(counter).identify(), {
                    time: time[0],
                    current: time[1]});
            });
            if (Landieb._temp.counter.list.keys().size()) {
                Landieb.counter();
                Landieb._temp.counter.timer = new PeriodicalExecuter(Landieb.counter, 1);
            }
        }
        //if ($('saleMax') && $('saleMaxValue') && $('saleInput')) {
        //
        //    Event.observe('saleMax', 'click', function(event) {
        //
        //        $('saleInput').value = $('saleMaxValue').innerHTML;
        //
        //        if (Object.isFunction(saleUpdatePrice)) {
        //            saleUpdatePrice();
        //        }
        //
        //    });
        //
        //}
        //
        //if ($('saleInput') && $('salePrice') && $('saleSubmit')) {
        //
        //    var saleUpdatePrice = function() {
        //
        //        if (isNaN($F('saleInput'))) {
        //            $('saleInput').value = 1;
        //        } else if ($('saleMaxValue') &&
        //                   Number($F('saleInput')) > Number($('saleMaxValue').innerHTML)) {
        //            $('saleInput').value = $('saleMaxValue').innerHTML;
        //        }
        //
        //        var price = Number($('salePrice').innerHTML.replace(',', '.'));
        //        price = String(roundNumber(Number($F('saleInput')) * price)).replace('.', ',');
        //        $('saleSubmit').value = 'für ' + price + ' Euro Verkaufen';
        //
        //    };
        //
        //    Event.observe('saleInput', 'change', saleUpdatePrice);
        //    Event.observe('saleInput', 'keyup', saleUpdatePrice);
        //
        //}
    },
    load: function(script, callBack, noCache) {
        if (!Object.isFunction(callBack)) {
            if (callBack === true && typeof noCache == 'undefined') {
                noCache = true;
            }
            callBack = null;
        }
        var scriptUrl = Landieb.baseUrl + script.replace(/_/g, '/') + '.js';
        if ($$('head script[src=' + scriptUrl + ']').length ||
            $$('head script[src=http://' + document.location.href + scriptUrl + ']').length) {
            Landieb._temp.loader[script] = {success: true, error: null, callBack: null};
        }
        if (!Landieb._temp.loader[script] || noCache === true) {
            if (noCache === true && Landieb._temp.callBack[script]) {
                Landieb._temp.callBack[script] = false;
            }
            Landieb._temp.loader[script] = {success: null, error: null, callBack: callBack};
            if (document.loaded) {
                new Ajax.Request(scriptUrl, {
                    method: 'get',
                    onSuccess: function(transport) {
                        try {
                            eval(transport.responseText);
                            Landieb.callBack(script, {success: true});
                        } catch (error) {
                            Landieb.callBack(script, {success: false, error: error});
                        }
                    },
                    onFailure: function(transport) {
                        Landieb.callBack(script, {success: false, error: transport.status + ' ' + transport.statusText});
                    }
                });
            } else {
                $$('head')[0].appendChild(
                    Builder.node('script', {type: 'text/javascript', src: scriptUrl}));
                $$('head')[0].appendChild(
                    Builder.node('script', {type: 'text/javascript'},
                    Landieb.callBack( script, {success: true}))
                    );
            }
        } else if (Landieb._temp.loader[script].success === null) {
            Landieb.load.delay(0.01, script, callBack);
        } else if (callBack) {
            callBack(Landieb._temp.loader[script]);
        }
    },
    callBack: function(script) {
        if (!Landieb._temp.loader[script]) return;
        if (Landieb._temp.callBack[script]) return;
        Landieb._temp.loader[script] = Object.extend(
            Landieb._temp.loader[script], arguments[1] || {});
        Landieb._temp.callBack[script] = true;
        var callBack = Landieb._temp.loader[script].callBack;
        Landieb._temp.loader[script].callBack = null;
        if (callBack) {
            callBack(Landieb._temp.loader[script]);
        }
    },
    counter: function() {
        if (!Landieb._temp.counter.list.keys().size()) {
            Landieb._temp.counter.timer.stop();
            return;
        }
        Landieb._temp.counter.list.each( function(counter) {
            if (!$(counter.key) || !counter.value.current--) {
                Landieb._temp.counter.list.unset(counter.key);
                return;
            }
            var seconds = Math.floor(counter.value.current%60);
            var minutes = Math.floor(counter.value.current/60)%60;
            var hours   = Math.floor(counter.value.current/3600)%24;
            var days    = Math.floor(counter.value.current/(3600*24));
            if (seconds < 10) seconds = '0' + seconds;
            if (minutes < 10) minutes = '0' + minutes;
            if (hours < 10) hours = '0' + hours;
            if ($(counter.key).hasClassName('progressBar')) {
                var percent = (counter.value.current/counter.value.time)*100;
                if (!days) {
                    $(counter.key).update('<span class="progressBarInner" style="width: ' + percent + '%;"></span><span class="progressBarText">' + hours + ':' + minutes + ':' + seconds + '</span><span class="progressBarPercent">' + (100 - Math.ceil(percent)) + '%</span></span>');
                } else {
                    days += ((days == 1) ? ' Tag' : ' Tage');
                    $(counter.key).update('<span class="progressBarInner" style="width: ' + percent + '%;"></span><span class="progressBarText">' + days + ', ' + hours + ':' + minutes + ':' + seconds + '</span><span class="progressBarPercent">' + (100 - Math.ceil(percent)) + '%</span></span>');
                }
            } else {
                if (!days) {
                    $(counter.key).update(hours + ':' + minutes + ':' + seconds);
                } else {
                    days += ((days == 1) ? ' Tag' : ' Tage');
                    $(counter.key).update(days + ', ' + hours + ':' + minutes + ':' + seconds);
                }
            }
            //console.log('percent = ' + percent);
            if(percent == 0){
                closeModal();
            }
        });
    },
    _temp: {
        loader: {},
        callBack: {},
        counter: {
            timer: null,
            list: new Hash()
        }
    }
};

function GetRandom( min, max ) {
	if( min > max ) {
		return( -1 );
	}
	if( min == max ) {
		return( min );
	}

    return( min + parseInt( Math.random() * ( max-min+1 ) ) );
}

function roundNumber(num, dec) {
    if (typeof(dec) == 'undefined') dec = 2;
	return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}
Event.observe(document, 'dom:loaded', Landieb.init);


// found at http://www.fobit.com/index.php?article=JavaScript%3A%20number_format
function number_format (number, decimals, dec_point, thousands_sep)
{
  var exponent = "";
  var numberstr = number.toString ();
  var eindex = numberstr.indexOf ("e");
  if (eindex > -1)
  {
    exponent = numberstr.substring (eindex);
    number = parseFloat (numberstr.substring (0, eindex));
  }

  if (decimals != null)
  {
    var temp = Math.pow (10, decimals);
    number = Math.round (number * temp) / temp;
  }
  var sign = number < 0 ? "-" : "";
  var integer = (number > 0 ?
      Math.floor (number) : Math.abs (Math.ceil (number))).toString ();

  var fractional = number.toString ().substring (integer.length + sign.length);
  dec_point = dec_point != null ? dec_point : ".";
  fractional = decimals != null && decimals > 0 || fractional.length > 1 ?
               (dec_point + fractional.substring (1)) : "";
  if (decimals != null && decimals > 0)
  {
    for (i = fractional.length - 1, z = decimals; i < z; ++i)
      fractional += "0";
  }

  thousands_sep = (thousands_sep != dec_point || fractional.length == 0) ?
                  thousands_sep : null;
  if (thousands_sep != null && thousands_sep != "")
  {
	for (i = integer.length - 3; i > 0; i -= 3)
      integer = integer.substring (0 , i) + thousands_sep + integer.substring (i);
  }

  return sign + integer + fractional + exponent;
}
