/*  dokodemodoor.js
 *  (c) 2008 hirashi <hirashima@mynet.co.jp>
 *
 *  dokodemodoor.js is freely distributable under the terms of an MIT-style license.
 *
/*--------------------------------------------------------------------------*/

var dokodemodoor = {
    'imgListDoor' : ['door01.gif', 'door02.gif', 'door03.gif', 'door04.gif'],
    'imgListSwitch' : ['door_off.gif', 'door_off_over.gif', 'door_on.gif', 'door_on_over.gif'],
    'path' : 'http://door.mynet.co.jp/dokodemodoor/img/'
};

dokodemodoor.classCreate = function() {
    return function() { this.initialize.apply(this, arguments); }
}
dokodemodoor.objectExtend = function(destination, source) {
    for (property in source) destination[property] = source[property];
    return destination;
}
dokodemodoor.$ = function() {
    var elements = new Array();
    for (var i = 0; i < arguments.length; i++) {
        var element = arguments[i];
        if (typeof element == 'string') element = document.getElementById(element);
        if (arguments.length == 1) return element;
        elements.push(element);
    }
    return elements;
}

// extend Event Class
if (!window.Event) { var Event = new Object(); }

dokodemodoor.objectExtend(Event, {
    element: function(event) { return event.target || event.srcElement; },

    stop: function(event) {
        if (event.preventDefault) {
            event.preventDefault();
            event.stopPropagation();
         } else {
            event.returnValue = false;
            event.cancelBubble = true;
         }
    },

    findElement: function(event, tagName) {
        var element = Event.element(event);
        while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != tagName.toUpperCase())))
            element = element.parentNode;
        return element;
    },

    observers: false,

    _observeAndCache: function(element, name, observer, useCapture) {
        if (!this.observers) this.observers = [];
        if (element.addEventListener) {
            this.observers.push([element, name, observer, useCapture]);
            element.addEventListener(name, observer, useCapture);
        } else if (element.attachEvent) {
            this.observers.push([element, name, observer, useCapture]);
            element.attachEvent('on' + name, observer);
        }
    },

    unloadCache: function() {
        if (!Event.observers) return;
        for (var i = 0; i < Event.observers.length; i++) {
            Event.stopObserving.apply(this, Event.observers[i]);
            Event.observers[i][0] = null;
        }
        Event.observers = false;
    },

    observe: function(element, name, observer, useCapture) {
        var element = dokodemodoor.$(element);
        useCapture = useCapture || false;
        this._observeAndCache(element, name, observer, useCapture);
    },

    stopObserving: function(element, name, observer, useCapture) {
        var element = dokodemodoor.$(element);
        useCapture = useCapture || false;

        if (element.removeEventListener) {
            element.removeEventListener(name, observer, useCapture);
        } else if (element.detachEvent) {
            element.detachEvent('on' + name, observer);
        }
    }
});
/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);


dokodemodoor.setup = function() {
    dokodemodoor.objDoor = null;
    dokodemodoor.cookie = new dokodemodoor.CookieManager();
    
    dokodemodoor.preload();
    
    var aList = document.getElementsByTagName('a');
    for (var i =0; i < aList.length; i++) {
        var gobj = aList[i].id;
        Event.observe(aList[i], 'click', dokodemodoor.moveStart, false);
    }
    var areaList = document.getElementsByTagName('area');
    for (var i =0; i < areaList.length; i++) {
        var gobj = areaList[i].id;
        Event.observe(areaList[i], 'click', dokodemodoor.moveStart, false);
    }
    
    if (dokodemodoor.cookie.getCookie('dooreffect') != null) {
        var objSwitch = document.createElement('span');
        objSwitch.id = 'dokodemodoor_switch';
        objSwitch.style.margin = '8px 20px 0 0';
        objSwitch.style.border = 'none';
        objSwitch.style.fontSize = '0';
        objSwitch.style.lineHeight = '0';
        
        objSwitch.style.cursor = 'pointer';
        
        objSwitch.style.position = 'fixed';
        if (navigator.userAgent.toLowerCase().indexOf("msie") > -1) objSwitch.style.position = 'absolute';
        objSwitch.style.top = '0';
        objSwitch.style.right = '0';
        
        document.body.appendChild(objSwitch);
        Event.observe(objSwitch, 'click', dokodemodoor.toggleSwitch, false);
        dokodemodoor.toggleSwitch();
        dokodemodoor.toggleSwitch();
    }
}

dokodemodoor.preload = function() {
    for (var i = 0; i < dokodemodoor.imgListDoor.length; i++) {
        dokodemodoor.imgListDoor[i] = dokodemodoor.path + dokodemodoor.imgListDoor[i]
        var img = new Image();
        img.src = dokodemodoor.imgListDoor[i];
    }
    for (var i = 0; i < dokodemodoor.imgListSwitch.length; i++) {
        dokodemodoor.imgListSwitch[i] = dokodemodoor.path + dokodemodoor.imgListSwitch[i]
        var img = new Image();
        img.src = dokodemodoor.imgListSwitch[i];
    }
}

dokodemodoor.moveStart = function(e) {
    if (dokodemodoor.cookie.getCookie('dooreffect') === 'false') return;
    dokodemodoor.cookie.setCookie('dooreffect', 'true');

    var obj = Event.findElement(e, 'a');
    if (!obj.href) obj = Event.findElement(e, 'area');
    
    dokodemodoor.objDoor = document.createElement('img');
    objWrapper = document.createElement('span');
    dokodemodoor.objDoor.src = dokodemodoor.imgListDoor[0];
    objWrapper.style.position = 'absolute';
    
    objWrapper.style.top = (e.pageY || (e.clientY + (document.documentElement.scrollTop || document.body.scrollTop))) + 'px';
    objWrapper.style.left = (e.pageX || (e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft))) + 'px';
    dokodemodoor.objDoor.style.position = 'relative';
    dokodemodoor.objDoor.style.border = 'none';
    
    document.body.appendChild(objWrapper);
    objWrapper.appendChild(dokodemodoor.objDoor);
    
    w = dokodemodoor.objDoor.width;
    h = dokodemodoor.objDoor.height;
    dokodemodoor.objDoor.style.width = Math.ceil(w/10)+'px';
    dokodemodoor.objDoor.style.height = Math.ceil(h/10)+'px';
    
    setTimeout("dokodemodoor.move(25)", 1);
    
    // Delay going to link
    if (obj.href == '') return true;
    else {
        setTimeout("window.open('" + obj.href + "','_top');", 1200);
        Event.stop(e);
        return false;
    }
}

dokodemodoor.move = function(count) {
    if (count <= 0) {
        dokodemodoor.objDoor.src = '';
        dokodemodoor.objDoor.style.display = 'none';
        return;
    }
    
    var nowWidth  = (dokodemodoor.objDoor.offsetWidth).toString().replace('%', '');
    var nowHeight = (dokodemodoor.objDoor.offsetHeight).toString().replace('%', '');
    
    if (count == 8) dokodemodoor.objDoor.src = dokodemodoor.imgListDoor[1];
    if (count == 6) dokodemodoor.objDoor.src = dokodemodoor.imgListDoor[2];
    if (count == 3) dokodemodoor.objDoor.src = dokodemodoor.imgListDoor[3];
    
    p = [1.15, 1.15, 1.15, 1.15, 1.15, 1.15, 1.15, 1.1, 1.1, 1
            , 0.9, 1, 1, 1, 1.05, 0.95, 1.2, 1.2, 1.3, 1.3
            , 1.3, 1.3, 1.3, 1.3, 1.3, 1.3
    ][count];
    dokodemodoor.objDoor.style.width = '' + Math.ceil(nowWidth * p) + 'px';
    dokodemodoor.objDoor.style.height = '' + Math.ceil(nowHeight * p) + 'px';
    dokodemodoor.objDoor.style.left = '-' + Math.ceil(nowWidth * p/2) + 'px';
    dokodemodoor.objDoor.style.top = '-' + Math.ceil(nowHeight * p/2) + 'px';
    
    if (count < 11) {
        dokodemodoor.setOpacity(dokodemodoor.objDoor, count*10);
    }
    
    setTimeout("dokodemodoor.move(" + (count-1) + ")", 50);
}

dokodemodoor.setOpacity = function(obj, val) {
    obj.style.filter = "alpha(opacity:" + val + ")";    // IE
    obj.style.opacity = val / 100;                      // FireFox, Safari
}

dokodemodoor.toggleSwitch = function() {
    var now = dokodemodoor.cookie.getCookie('dooreffect');
    
    if(now == 'true') {    // ON -> OFF
        document.getElementById('dokodemodoor_switch').innerHTML = '<img src="' + dokodemodoor.imgListSwitch[0] + '">';
        document.getElementById('dokodemodoor_switch').onmouseover = function(){this.firstChild.src = dokodemodoor.imgListSwitch[1];};
        document.getElementById('dokodemodoor_switch').onmouseout  = function(){this.firstChild.src = dokodemodoor.imgListSwitch[0];};
        dokodemodoor.cookie.setCookie('dooreffect', 'false');
    }
    else if(now == 'false') {    // OFF -> ON
        document.getElementById('dokodemodoor_switch').innerHTML = '<img src="' + dokodemodoor.imgListSwitch[2] + '">';
        document.getElementById('dokodemodoor_switch').onmouseover = function(){this.firstChild.src = dokodemodoor.imgListSwitch[3];};
        document.getElementById('dokodemodoor_switch').onmouseout  = function(){this.firstChild.src = dokodemodoor.imgListSwitch[2];};
        dokodemodoor.cookie.setCookie('dooreffect', 'true');
    }
}

dokodemodoor.CookieManager = dokodemodoor.classCreate();
dokodemodoor.CookieManager.prototype = {
    BROWSER_IS_IE:
        (document.all
         && window.ActiveXObject
         && navigator.userAgent.toLowerCase().indexOf("msie") > -1
         && navigator.userAgent.toLowerCase().indexOf("opera") == -1),

    /**
     * I hate navigator string based browser detection too, but when Opera alone
     * chokes on cookies containing double quotes...
     */
    BROWSER_IS_OPERA:
        (navigator.userAgent.toLowerCase().indexOf("opera") != -1),

    initialize: function(options) {
        this.options = {
            shelfLife: 30 * 24*60*60*1000,
            userData: false
        };
        options = this.options

        this.cookieShelfLife = options.shelfLife;
        this.userDataForIE = options.userData;

        // Internet Explorer has a cookie handling bug - if the *combined size*
        // of all cookies stored for a given domain is greater than 4096 bytes,
        // document.cookie will return an empty string. Until this is fixed, we
        // can fall back on IE's proprietary userData behaviour if necessary.
        if (this.BROWSER_IS_IE && this.userDataForIE) {
            this.IE_CACHE_NAME = "storage";
            if (dokodemodoor.$(this.IE_CACHE_NAME) == null) {
                var div = document.createElement("DIV");
                div.id = this.IE_CACHE_NAME;
                document.body.appendChild(div);
            }
            this.store = dokodemodoor.$(this.IE_CACHE_NAME);
            this.store.style.behavior = "url('#default#userData')";
        }
    },
    getCookie: function(aCookieName) {
        var result = null;
        if (this.BROWSER_IS_IE && this.userDataForIE) {
            this.store.load(this.IE_CACHE_NAME);
            result = this.store.getAttribute(aCookieName);
        } else {
            for (var i = 0; i < document.cookie.split('; ').length; i++) {
                var crumb = document.cookie.split('; ')[i].split('=');
                if (crumb[0] == aCookieName && crumb[1] != null) {
                    result = crumb[1];
                    break;
                }
            }
        }

        if (this.BROWSER_IS_OPERA && result != null) {
            result = result.replace(/%22/g, '"');
        }
        return result;
    },
    setCookie: function(aCookieName, aCookieValue) {
        if (this.BROWSER_IS_IE && this.userDataForIE) {
            this.store.setAttribute(aCookieName, aCookieValue);
            this.store.save(this.IE_CACHE_NAME);
        } else {
            if (this.BROWSER_IS_OPERA) aCookieValue = aCookieValue.replace(/"/g, "%22");
            var date = new Date();
            date.setTime(date.getTime() + (this.cookieShelfLife));
            var expires = '; expires=' + date.toGMTString();
            document.cookie = aCookieName + '=' + aCookieValue + expires + '; path=/';
        }
    }
}

Event.observe(window, 'load', dokodemodoor.setup, false);
