var initialsubj = "www.styreplan.no - en side du kanskje vil se nærmere på";
var initialmsg = "Se [site]";
initialmsg = initialmsg.replace('[site]', window.location);
var good;

function checkEmailAddress(field) {
    var goodEmail = field.value.match(/\b(^(\S+@).+((\.com)|(\.net)|(\.edu)|(\.mil)|(\.gov)|(\.org)|(\.info)|(\.sex)|(\.biz)|(\.aero)|(\.coop)|(\.museum)|(\.name)|(\.pro)|(\..{2,2}))$)\b/gi);
    if (goodEmail) {
        good = true;
    }
    else {
        alert('Please enter a valid address.');
        field.focus();
        field.select();
        good = false;
    }
}

var u = window.location;
function mailThisUrl(email, subjectElemId, bodyElemId) {
    good = false
    checkEmailAddress(document.eMailer.email);
    if (good) {
        var url = "mailto:" + document.eMailer.email.value + "?subject=" + initialsubj + "&;body=" + initialmsg;
        window.location = url;
        Effect.toggle('mail-this-page-div', 'blind');
    }
}


var LoginForm = Class.create({
    initialize: function(loginForm, loginTrigger) {
        this.form = $(loginForm);
        this.trigger = $(loginTrigger);
        this.scheduledHide = null;

        this.trigger.observe("mouseover", this.show.bind(this));
        this.trigger.observe("mouseout", this.hide.bind(this));

        this.form.observe("mouseover", this.show.bind(this));
        this.form.observe("mouseout", this.hide.bind(this));
    },

    show: function() {
        if (this.scheduledHide != null) window.clearTimeout(this.scheduledHide);
        if (!this.form.visible())
            Effect.BlindDown(this.form, { duration: 0.5 });
    },

    hide: function() {
        if (this.scheduledHide != null) window.clearTimeout(this.scheduledHide);
        this.scheduledHide = Effect.BlindUp.delay(1, this.form);
    }
});


var BlindInElementRegister = Class.create();
BlindInElementRegister.prototype = Object.extend(Event.Listener, {
    //Object.extend(BlindInElementRegister , EventListener);
    _register:new Hash(), //element.id ->BlindInElement

    initialize: function() {
    },

    opprett: function(blendetElement){
        var blindInElement = new BlindInElement(blendetElement);
        this._register.set(blendetElement.identify(), blindInElement);
        this.listenForEvent(blindInElement, "vis");
        return blindInElement;
    },

    onVis: function(event){
        var elementSomVises = event.event_data.data;
        this._register.values().each(function(blindInElement){
           if (elementSomVises != blindInElement){
            blindInElement.skjul();
           }
        });
    }
});


var BlindInElement = Class.create();
/* teller som benyttes for å gi de enkelte instansene et
unikt serienummer innen en og samme side */
BlindInElement.teller = 1;
BlindInElement.effekter = {BLIND:"BLIND", FADE:"FADE",DISPLAY:"DISPLAY"};
BlindInElement.prototype = Object.extend(Event.Publisher, {
    initialize: function(blendetElement) {
        this.blendetElement = blendetElement;

        this.synlig = false;
        this.timetSkjuling = null;
        this.serienummer = BlindInElement.teller++;
        this.triggerKnyttetTilBlindetElement = false;
        this.blindInVarighet = 0.3;
        //standard effekt
        this.effekt = BlindInElement.effekter.BLIND;

        this.markørForSynlig = null;
        this.markørForGjemt = null;
        this.nårVis = null;
        this.nårSkjul = null;

        //skjul blendet element
        var _effekt = this.effekt;
        this.effekt = BlindInElement.effekter.DISPLAY;
        this.skjul();
        this.effekt = _effekt;
    },

    registrerMusInnUtTrigger: function(trigger, forsinkelse) {
        if (!this.triggerKnyttetTilBlindetElement) {
            this.triggerKnyttetTilBlindetElement = true;
            this.registrerMusInnUtTrigger(this.blendetElement, forsinkelse)
        }
        if (forsinkelse == null)
            forsinkelse = 200;
        Event.observe(trigger, 'mouseover', function(event) {
            this.triggerAktivert(event, forsinkelse)
        }.bindAsEventListener(this));
        Event.observe(trigger, 'mouseout', this.triggerDeaktivert.bindAsEventListener(this));
        return this;
    },

    registrerMusUtTrigger: function(trigger) {
        if (!this.triggerKnyttetTilBlindetElement) {
            this.triggerKnyttetTilBlindetElement = true;
            this.registrerMusInnUtTrigger(this.blendetElement)
        }
        Event.observe(trigger, 'mouseout', this.triggerDeaktivert.bindAsEventListener(this));
        return this;
    },

    registrerMuseklikkTrigger: function(trigger) {
        Event.observe(trigger, 'click', this.triggerToggel.bindAsEventListener(this));
        return this;
    },

    registrerStilklasseForSynlig: function(element, stilklasse) {
        this.nårVis = function() {
            $(element).addClassName(stilklasse);
        }
        this.nårSkjul = function() {
            $(element).removeClassName(stilklasse);
        }
        return this;
    },

    registrerMarkoerForSynlig: function(element) {
        this.markørForSynlig = element;
        this.markørForSynlig.hide();
        return this;
    },

    registrerMarkoerForGjemt: function(element) {
        this.markørForGjemt = element;
        this.markørForGjemt.show();
        return this;
    },

    setEffekt: function(effekt) {
        if (new Hash(BlindInElement.effekter).get(effekt) == null)
            throw new Error("ugyldig effekt angitt");
        this.effekt = effekt;
    },

    /* private hjelpemetoder */

    //kalles av event for visning av element
    triggerAktivert: function(event, visningsforsinkelse) {
        //sørg for at event ikke blir behandlet flere ganger med mindre den stammer fra en a-tag.
        if (Event.element(event).tagName.toLowerCase() != "a")
            Event.stop(event);
        //kanseler eventuell initiert skjuling
        this.avbrytForsinketSkjuling();
        //vis element
        if (visningsforsinkelse > 0)
            this.initierForsinketVisning(visningsforsinkelse);
        else
            this.vis();
    },

    //kalles av event for skjuling av element
    triggerDeaktivert: function(event) {
        //sørg for at event ikke blir behandlet flere ganger med mindre den stammer fra en a-tag.
        if (Event.element(event).tagName.toLowerCase() != "a")
            Event.stop(event);
        //skjul element
        this.initierForsinketSkjuling();
    },

    initierForsinketVisning: function(forsinkelse) {
        //kun vis dersom visning ikke allerede initialisert
        if (this.timetVisning != null) return;
        this.timetVisning = setTimeout(function() {
            this.vis();
        }.bind(this), forsinkelse);
    },

    avbrytForsinketVisning: function() {
        if (this.timetVisning == null) return;
        clearTimeout(this.timetVisning);
        this.timetVisning = null;
    },

    initierForsinketSkjuling: function() {
        //kun skjul dersom skjuling ikke allerede initialisert
        if (this.timetSkjuling != null) return;
        this.avbrytForsinketVisning()
        this.timetSkjuling = setTimeout(function() {
            this.skjul()
        }.bind(this), 300);
    },

    avbrytForsinketSkjuling: function() {
        if (this.timetSkjuling == null) return;
        clearTimeout(this.timetSkjuling);
        this.timetSkjuling = null;
    },

    triggerToggel: function(event) {
        if (this.synlig)
            this.triggerDeaktivert(event);
        else
            this.triggerAktivert(event);
    },

    vis: function() {
        //vis kun dersom ikke allerede synlig
        if (this.synlig) return;
        this.avbrytForsinketVisning();

        //informer andre BlindInElement om hendelsen
        this.dispatchEvent("vis", this);

        //sørg for at kontaineren er plassert over de øvrige kontainerene i visningsstacken
        this.blendetElement.up().setStyle({zIndex:100});
        this.blendetElement.setStyle({zIndex:101});

        switch (this.effekt) {
            case BlindInElement.effekter.BLIND:
                Effect.BlindDown(this.blendetElement, {
                    duration:this.blindInVarighet, queue:{position:'front', scope:'triggerRad' + this.serienummer, limit:1}
                });
                break;
            case BlindInElement.effekter.FADE:
                new Effect.Appear(this.blendetElement, {duration:this.blindInVarighet, to:0.85});
                break;
            case BlindInElement.effekter.DISPLAY:
            default:
                this.blendetElement.show();
        }

        if (this.markørForSynlig != null) this.markørForSynlig.show();
        if (this.markørForGjemt != null) this.markørForGjemt.hide();
        if (this.nårVis != null) this.nårVis();

        this.synlig = true;
    },

    skjul: function() {
        this.avbrytForsinketSkjuling();
        switch (this.effekt) {
            case BlindInElement.effekter.BLIND:
                Effect.BlindUp(this.blendetElement, {
                    duration:this.blindInVarighet, queue:{position:'front', scope:'triggerRad' + this.serienummer, limit:1}
                });
                break;
            case BlindInElement.effekter.FADE:
                new Effect.Fade(this.blendetElement, {duration:this.blindInVarighet});
                break;
            case BlindInElement.effekter.DISPLAY:
            default:
                this.blendetElement.hide();
        }

        //sørg for at kontaineren er plassert på samme nivå som de øvrige kontainerene i visningsstacken
        this.blendetElement.setStyle({zIndex:0});
        this.blendetElement.up().setStyle({zIndex:0});

        if (this.markørForSynlig != null) this.markørForSynlig.hide();
        if (this.markørForGjemt != null) this.markørForGjemt.show();
        if (this.nårSkjul != null) this.nårSkjul();

        this.synlig = false;
    }
});
