/**
* Javascript
* standard-funktionen
*
* @author heiko pfefferkorn
* @copyright 2007 i-fabrik gmbh
* @version $Id: core.js,v 1.2 2007/10/23 08:58:36 nico Exp $
*
*/

    var Core = {
        start: function(){
            DBG.log('Core.start');
            DBG.time('Core.time');

            Core.menu();
            Core.tTip();
			Core.addCalendarEvents();

			// Eingabe Suchbegriff
			if($('input_suche')) {
				$('input_suche').addEvent('blur', function() {
					if(this.value=='')
						this.value = PROJECT.core.search.defaultPhrase;
				}).addEvent('focus', function() {
					if(this.value==PROJECT.core.search.defaultPhrase)
						this.value='';
				});
			}

			// Standards fuer Inputfelder
            $$('input, select, textarea').each(function(elm){
                elm.addEvent('focus', function(){
                    this.addClass('focus');
                }).addEvent('blur', function(){
                    this.removeClass('focus');
                });
            });

			// SYSTEM: PRE-Tags positionnieren
            if($$('pre')) WIDGETS.setPreTagPosition();

            DBG.timeEnd('Core.time');
        },

        menu: function(){
            if($$('#navi li.navi_main')) {
                DBG.log('Core.menu');

                $$('#navi li.navi_main').each(function(li, i) {
                    li.addEvent('mouseover', function() {
                        this.addClass('over');
                    }).addEvent('mouseout', function() {
                        this.removeClass('over');
                    });
                 });
            }
        },


        tTip: function() {
            if ($$('.tooltip')) {
                DBG.log('Core.tTip > (.tooltip)');

                var ttip = new Tips($$('.tooltip'), {
                    onShow: function(toolTip) {
                        toolTip.setOpacity(0.7);
                    },
                    maxTitleChars: 50,
                    offsets      : {x:12,y:14},
                    className    : 'standard'
                });
            }

            if ($$('.tooltip_special')) {
                DBG.log('Core.tTip > (.tooltip_special)');

                var ttip_special = new Tips($$('.tooltip_special'), {
                    maxTitleChars: 50,
                    offsets      : {x:12,y:14},
                    className    : 'special'
                });
            }
        },

        addCalendarEvents: function() {
        	if($$('.getCalendarDate')) {
        		$$('.getCalendarDate').each(function(elm) {
        			var id = elm.id;
					Calendar.setup({
						'inputField': elm,
						'ifFormat'  : '%d.%m.%Y',
						'button'    : 'datebutton_'+id
					});
        		});
        	}
        }
    };


    var WIDGETS = {
        openWindow: function(url,wn,ft,ww,wh,wc){
            if(window.screen)
                if(wc){
                    var wl = (screen.width-ww)/2;
                    var wt = (screen.height-wh)/2;
                    ft+=(ft!='')?',':'';
                    ft+=',left='+wl+',top='+wt;
                }
            window.open(url,wn,ft+((ft!='')?',':'')+'width='+ww+',height='+wh);
        },

        validateEmail: function(s){
            var rx1  = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
            var rx2  = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$");
            var flag = !rx1.test(s) && rx2.test(s);

            return flag;
        },

        setMouseOverClass: function(o,c){
            if(!o) return;

            o.each(function(elm){
                o.addEvent('mouseover', function(){ this.addClass(c); });
                o.addEvent('mouseout', function(){ this.removeClass(c); });
            });
        },

        checkDate: function(o){
            var v_parse = parseDate(o.getValue, "d.M.y");

            if( v_parse==null ){
                var prompt_date = new MooPrompt("", "Bitte korrigieren Sie Ihre Datumeingabe!", {
                    width       : 260,
                    height      : 55,
                    buttons     : 1,
                    button1     : 'OK',
                    buttonClass1: 'input_button',
                    onButton1   : function(){
                        $(o.id).focus();
                        $(o.id).select();
                    }
                });
            }
        },

        setPreTagPosition: function() {
            var pos = 0;

            $$("pre").each(function(pre) {
                var pre_fx   = new Fx.Styles(pre, {duration:400, wait:false});
                var pre_drag = new Drag.Move($(pre), {
                    'onStart'    : function(elm) {elm.setOpacity(0.2);},
                    'onComplete': function(elm) {
                        var f_color = '#33ff66';
                        var b_color = '#000000';

                        elm.setStyles({'background-color':f_color,'color':b_color});
                        elm.setOpacity(1);
                        pre_fx.start({
                            'background-color': b_color,
                            'color'           : f_color
                        });
                    },
                    'limit'     : {x:[0,0], y:[0,getScrollHeight()]}
                });
                pre.setStyle("top", pos);
                var pre_size = pre.getSize();
                pos+= pre_size.size.y+5;
            });
        }
    };

    var FullSearch = {
        start: function(form, options) {
            this.options = {
                classEntryOver: 'sr_ov',

                idIndicator   : 'search_indicator',	// ID des Ajax-Indicator fuer die Tabelle
                idListHolder  : 'sr_list',
                idNav         : 'sr_nav',
                idPartInfo    : 'sr_i_',            // ID (erster Teil) des Elements mit der Zusatzinfo (zweiter Teil ist die ID die durch 'splitIdClass' gewonnen wird)
                idPartSlide   : '_slide',           // ID (erster Teil) des Elements mit der Zusatzinfo (zweiter Teil ist die ID die durch 'splitIdClass' gewonnen wird)
                idResultHolder: 'search_result',

                form        : '',
                action      : '',
                method      : 'post',
                hidden      : {},
                idHiddenSite: '',
                unique_id   : '',
                session_name: 'PHPSESSID',
                session_id  : '',
                language    : 'en',

                errPhrase: 'search_error_searchphrase',
                phrase   : 'searchphrase',

                selectorInfo      : '.sr_i',
                selectorEntry     : '#sr_list dl', // Selector des Elements auf dem der Mouseover zum Einblenden der Zusatzinfo gesetzt werden soll
                selectorNavigation: '.sr_nav dd',

                splitIdClass: '#' // String anhand dem die Event-ID und der Event-Typ fuer das weitere Vorgehen getrennt werden kann
            };

            // Kein Formular da > brich ab
            if (!form)
                return false;

            // Setze separate Options anhand des Formulares
            this.form = form;
            options.action = form.getProperty('action');
            options.method = form.getProperty('method');

            // Fuege alle Optionen zusammen
            this.options = $merge(this.options, options||{});

            // Diese Optioneen muessen gegeben sein
            if (this.options.action=='')
                return false;

            // FX - Fehler Suchbegriff leer
            this.fx_err_phrase = new Fx.Slide(this.options.errPhrase, {duration:350});
            this._hideError();
            $(this.options.errPhrase).setStyle('display', 'block');
            this._hideLoadState();

            // Suchbegriff und Default-Suchebgriff vordefinieren
            this.searchphrase         = '';
            this.searchphrase_default = '';

            // Definitionen der Ebene fuer die Einblendung des Teasers
            this.info_x     = (window.ie) ? $(this.options.idListHolder).getPosition().x+1 : $(this.options.idListHolder).getPosition().x;
            this.info_width = $(this.options.idListHolder).getCoordinates().width;
            this.info_data  = {};

            // Setze und starte das Formular
            this.setForm();
        },

        setForm: function() {
            var pointer = this;

            this.form.setProperty('action', this.options.action);
            this.form.setProperty('method', this.options.method);

            // generiere Hiddenfelder
            $each(this.options.hidden, function(value, key) {
                var hidden = new Element('input', {
                    'type' : 'hidden',
                    'name' : key,
                    'id'   : key,
                    'value': value
                }).injectInside(pointer.form);
            });

            this.form.addEvent('submit', function(e) {
                if (e)
                    new Event(e).stop();

                var form_this = this;

                pointer.searchphrase         = $(pointer.options.phrase).getProperty('value').clean();
                pointer.searchphrase_default = ($(pointer.options.phrase).getProperty('defaultvalue')) ? $(pointer.options.phrase).getProperty('defaultvalue').clean() : '';

                pointer._hideResult();

                if (pointer.checkForm()) {
                    pointer._hideError();
                    pointer._showLoadState();

                    form_this.send({
                        onFailure: function(e) {
                            pointer._hideLoadState();
                            $(pointer.options.idListHolder).innerHTML = JAPPLO_GLOBAL.core.ajax.error;
                            pointer._showResult();
                        },
                        onComplete: function(responseText,responseXML) {
                            pointer.build(responseXML);
                        }
                    });
                } else {
                    pointer._hideLoadState();
                    pointer._showError();
                }
            });

            this.form.fireEvent('submit');
        },

        checkForm: function() {
            return (this.searchphrase!='' && this.searchphrase!=this.searchphrase_default) ? true : false;
        },

        build: function(response) {
            $(this.options.phrase).value = this.searchphrase;

            var xml_data = response.getElementsByTagName('results')[0];

            // Navigation
            if (xml_data.getElementsByTagName('menu')[0])
                $(this.options.idNav).innerHTML = xml_data.getElementsByTagName('menu')[0].childNodes[0].nodeValue;

            // Liste
            if (xml_data.getElementsByTagName('list')[0]) {
                $(this.options.idListHolder).innerHTML = '';
                $(this.options.idListHolder).innerHTML = xml_data.getElementsByTagName('list')[0].childNodes[0].nodeValue;
            }

            this.parse();
        },

        parse: function() {
            var pointer = this;

            // setze MouseOver fuer die Navigation
            $$(this.options.selectorNavigation).each(function(nav) {
                var site_id = nav.getProperty('title');
                nav.title = '';

                nav.addEvent('mouseover', function(ev) {
                    this.addClass('ov');
                }).addEvent('mouseout', function(ev) {
                    this.removeClass('ov');
                }).addEvent('click', function(ev) {
                    pointer.getSite(site_id);
                });
            });

            // setze Standardstyles fuer Infoeintraege
            $$(this.options.selectorInfo).each(function(info) {
                var id_info   = info.getProperty('id');
                var id_slider = id_info+pointer.options.idPartSlide;

                var slider = $(id_info).getChildren();
                slider.setProperty('id', id_slider);

                pointer.info_data[id_info] = {
                    'fx'   : new Fx.Slide(id_slider, {duration: 150}),
                    'x'    : pointer.info_x,
                    'y'    : 0,
                    'width': pointer.info_width
                };

                info.setStyles({
                    'position': 'absolute',
                    'top'     : pointer.info_data[id_info].y,
                    'left'    : pointer.info_data[id_info].x,
                    'width'   : pointer.info_data[id_info].width,
                    'display' : 'none'
                });
            });

            // hole alle Eintraege, setze Aktionen und Zusatzaktionen -styles fuer Infoeintraege
            $$(this.options.selectorEntry).each(function(entry) {
                var t       = entry.getProperty('id').split(pointer.options.splitIdClass);
                var id      = t[0];
                var typ     = t[1];
                var id_info = pointer.options.idPartInfo+id;

                if ($(id_info)) {
                    // rufe den FX einmal auf damit er auch kapiert das er da ist (sonst beim ersten MouseOver nur einblenden)
                    pointer.hideInfo(id);

                    entry.addEvent('mouseover', function(ev) {
                        if (pointer.info_data[id_info].y<=0) {
                            var y = this.getPosition().y+this.getSize().scrollSize.y;
                            if (window.ie) y++;
                            pointer.info_data[id_info].y = y;
                            $(id_info).setStyle('top', pointer.info_data[id_info].y);
                        }

                        this.addClass(typ);
                        this.addClass(pointer.options.classEntryOver);
                        pointer.showInfo(id);
                    }).addEvent('mouseout', function(ev) {
                        this.removeClass(typ);
                        this.removeClass(pointer.options.classEntryOver);
                        pointer.hideInfo(id);
                    });
                } else {
                    entry.addEvent('mouseover', function(ev) {
                        this.addClass(typ);
                        this.addClass(pointer.options.classEntryOver);
                    }).addEvent('mouseout', function(ev) {
                        this.removeClass(typ);
                        this.removeClass(pointer.options.classEntryOver);
                    });
                }
            });

            this._hideLoadState();
            this._showResult();
        },

        getSite: function(site_id) {
            $(this.options.phrase).value = this.searchphrase;

            if ($(this.options.idHiddenSite))
                $(this.options.idHiddenSite).value = site_id;

            this.form.fireEvent('submit');
        },

        showInfo: function(id) {
            $(this.options.idPartInfo+id).setStyle('display', 'block');
            this.info_data[this.options.idPartInfo+id].fx.slideIn();
        },

        hideInfo: function(id) {
            this.info_data[this.options.idPartInfo+id].fx.hide();
            $(this.options.idPartInfo+id).setStyle('display', 'none');
        },

        _showError: function() {
            var p = $(this.options.errPhrase).getParent();
            p.setStyle('display','block');
            this.fx_err_phrase.slideIn();
        },

        _hideError: function() {
            var p = $(this.options.errPhrase).getParent();
            this.fx_err_phrase.hide();
            p.setStyle('display','none');
        },

        _showLoadState: function() {
            $(this.options.idIndicator).setStyle('display', 'block');
        },

        _hideLoadState: function() {
            $(this.options.idIndicator).setStyle('display', 'none');
        },

        _showResult: function() {
            $(this.options.idResultHolder).setStyle('display', 'block');
            $(this.options.idListHolder).setStyle('display', 'block');

            $(this.options.idNav).setStyle('display', 'block');
        },

        _hideResult: function() {
            $(this.options.idListHolder).setInnerHTML = '&nbsp;';
            $(this.options.idListHolder).setStyle('display', 'none');

            $(this.options.idNav).setInnerHTML = '&nbsp;';
            $(this.options.idNav).setStyle('display', 'none');

            this._showLoadState();
        }
    };


    if (window.opera)
        window.addEvent('load', Core.start);
    else
        window.addEvent('domready', Core.start);
