/**
 * @file    js/global.js
 *
 * copyright (c) 2006-2009 Frank Hellenkamp [jonas@depagecms.net]
 *
 * @author    Frank Hellenkamp [jonas@depagecms.net]
 */

// global helpers
// {{{ getHexColorFromString()
function getHexColorFromString(colorString) {
    if (colorString == "transparent") {
	var hexCode = "000000";
    } else if (colorString.substr(0, 3) == "rgb") {
        var components = colorString.match(/[0-9]+/g);
        var r = parseInt(components[0]).toString(16);
        var g = parseInt(components[1]).toString(16);
        var b = parseInt(components[2]).toString(16);

        if (r.length < 2) r = "0" + r;
        if (g.length < 2) g = "0" + g;
        if (b.length < 2) b = "0" + b;

        var hexCode = r + g + b;
    } else if (colorString.charAt(0) == "#") {
        var hexCode = colorString.substring(1);
    }

    return "0x" + hexCode;
}
/* }}} */

// javascript flash detection
// {{{ jquery.browser.flash
jQuery.extend(jQuery.browser, {
    flash: (function (neededVersion) {
        var found = false;
	var version = "0,0,0";

	try {
	    // get ActiveX Object for Internet Explorer
	    version = new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
	} catch(e) {
	    // check plugins for Firefox, Safari, Opera etc.
	    try {
		if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
		    version = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
		}
	    } catch(e) {
		return false;
	    }		
	}

	var pv = version.match(/\d+/g);
	var rv = neededVersion.match(/\d+/g);

	for (var i = 0; i < 3; i++) {
	    pv[i] = parseInt(pv[i] || 0);
	    rv[i] = parseInt(rv[i] || 0);

	    if (pv[i] < rv[i]) {
		// player is less than required
	       	return false;
	    } else if (pv[i] > rv[i]) {
		// player is greater than required
		return true;
	    }
	}
	// major version, minor version and revision match exactly
	return true;
    })
});
// }}}
// {{{ jquery.flash
jQuery.fn.flash = function(params) {
    var html1 = "";
    var html2 = "";
    var flashParam = [];

    for (var p in params.params) {
	flashParam.push(p + "=" + encodeURI(params.params[p]));
    }
    var src = params.src;
    if (flashParam.length > 0) {
        src += "?" + flashParam.join("&amp;");
    }

    //object part
    html1 += "<object type=\"application/x-shockwave-flash\" ";
    html1 += "data=\"" + src+ "\" ";
    if (params.width !== undefined) {
	html1 += "width=\"" + params.width + "\" ";
    }
    if (params.height !== undefined) {
	html1 += "height=\"" + params.height + "\" ";
    }
    if (params.className !== undefined) {
	html1 += "class=\"" + params.className + "\" ";
    }
    if (params.id !== undefined) {
	html1 += "id=\"" + params.id + "\" ";
    }
    html1 +="allowFullScreen=\"true\" ";

    //param part
    html2 += "<param name=\"movie\" value=\"" + src + "\" />";
    html2 += "<param name=\"allowFullScreen\" value=\"true\" />";

    if (params.transparent === true) {
	html1 += "mwmode=\"transparent\"";
	html2 += "<param name=\"wmode\" value=\"transparent\" />";
    }
    html1 += ">";

    var value = $( html1 + html2 + "</object>");
    value.plainhtml = html1 + html2 + "</object>";

    return value;
};
// }}}

// embedded jquery plugins
// {{{ jquery pause
/*
 * Jonathan Howard
 *
 * jQuery Pause
 * version 0.2
 *
 * Requires: jQuery 1.0 (tested with svn as of 7/20/2006)
 *
 * Feel free to do whatever you'd like with this, just please give credit where
 * credit is do.
 *
 *
 *
 * pause() will hold everything in the queue for a given number of milliseconds,
 * or 1000 milliseconds if none is given.
 *
 *
 *
 * unpause() will clear the queue of everything of a given type, or 'fx' if no
 * type is given.
 */

$.fn.pause = function(milli,type) {
	milli = milli || 1000;
	type = type || "fx";
	return this.queue(type,function(){
		var self = this;
		setTimeout(function(){
			$.dequeue(self);
		},milli);
	});
};

$.fn.clearQueue = $.fn.unpause = function(type) {
	return this.each(function(){
		type = type || "fx";
		if(this.queue && this.queue[type]) {
			this.queue[type].length = 0;
		}
	});
};
// }}}
// {{{ jquery fx custom
jQuery.fx.prototype.custom = function(from, to, unit){
    this.startTime = (new Date()).getTime();
    this.start = from;
    this.end = to;
    this.unit = unit || this.unit || "px";
    this.now = this.start;
    this.pos = this.state = 0;
    this.update();

    var self = this;
    function t(){
        return self.step();
    }

    t.elem = this.elem;

    jQuery.timers.push(t);

    if ( jQuery.timers.length == 1 ) {
        var timer = setInterval(function(){
            var timers = jQuery.timers;
            
            for ( var i = 0; i < timers.length; i++ ) {
                if ( !timers[i]() ) {
                    timers.splice(i--, 1);
                }
            }

            if ( !timers.length ) {
                clearInterval( timer );
            }
        }, 100);
    }
}
// }}}

// replace content, depending on reader capabilities
// {{{ replaceEmailChars()
function replaceEmailChars(mail) {
    mail = unescape(mail);
    mail = mail.replace(/ \*at\* /g, "@");
    mail = mail.replace(/ \*dot\* /g, ".");
    mail = mail.replace(/ \*punkt\* /g, ".");
    mail = mail.replace(/ \*underscore\* /g, "_");
    mail = mail.replace(/ \*unterstrich\* /g, "_");
    mail = mail.replace(/ \*minus\* /g, "-");
    mail = mail.replace(/mailto: /, "mailto:");

    return mail;
}
// }}}
// {{{ replaceEmailRefs()
function replaceEmailRefs() {
    $("a[href*='mailto:']").each(function() {
        // replace attribute
        $(this).attr("href", replaceEmailChars($(this).attr("href")));
        
        //replace content if necessary
        if ($(this).text().indexOf(" *at* ") > 0) {
            $(this).text(replaceEmailChars($(this).text()));
        }
    });
}
// }}}
// {{{ replaceFlashContent()
function replaceFlashContent() {
    $("img.flash_repl").each(function() {
	var parent = $(this).parent()[0].innerHTML = $().flash({
            src:		this.src.replace(/\.jpg|\.gif|\.png/, ".swf").replace(/\&/, "&amp;"),
            width:		$(this).width(),
            height:		$(this).height(),
            className:	"flash",
            id:		this.id ? this.id + "_flash" : null,
            transparent:    $(this).hasClass("trans")
        }).plainhtml + $(this).parent().html();

        /*
	if (parent[0].nodeName == "A") {
	    // deactivate link for surrounding a-node in safari
	    parent[0].href = "javascript:return false;";
	}
        */
    });
}
// }}}
// {{{ replaceInteractiveContent()
function replaceInteractiveContent() {
    // {{{ get language from content tag in header
    var lang = $("meta[name = 'Content-Language']")[0].content;
    // }}}
    // {{{ add click event for teaser
    $(".teaser").click( function() {
        document.location = $("a", this)[0].href;
    });
    // }}}
    // {{{ add click event for details
    $(".details dt").each( function() {
        var that = $(this);
        var dd = that.nextAll("dd:first");

        if (dd.children("img").length > 0) {
            that.addClass("hasdetails").click( function() {
                if (!that.hasClass("active")) {
                    that.siblings("dt").removeClass("active");
                    that.siblings("dd").slideUp();
                    that.addClass("active");
                    dd.slideDown();
                } else {
                    that.siblings("dd").slideUp();
                    that.removeClass("active");
                }
            }).mouseover(function() {
                $("#lightwaves_flash").each( function() {
                    controlPlayer("fshowHandCursor");
                });
            }).mouseout(function() {
                $("#lightwaves_flash").each( function() {
                    controlPlayer("fhideHandCursor");
                });
            });
        }
    });
    // }}}
    // {{{ replaceTextButtons()
    $("input:submit, input:reset, input:button").each( function() {
        var parent = $(this).parent();
        var button = this;
        var form = this.form;

        $(button).hide();

        parent.append("<a href=\"#\">" + this.value + "</a>").click(function() {
            if (button.type == "submit") {
                var data = {};

                $("input, textarea", form).each( function () {
                    data[this.name] = this.value;
                });

                $("*", form).remove();
                $(form).load(form.action + " .section form > *", data, function() {
                    replaceEmailRefs();
                    replaceInteractiveContent();
                });
            } else if (button.type == "reset") {
                $(form).reset();
            } else {
                $(button).click();
            }

            return false;
        });
    });
    // }}}
    // {{{ removeLogoLink()
    $("#logo a").each( function() {
        $(this).removeAttr("href");
    });
    // }}}
}
// }}}
// {{{ replaceLogonav()
function replaceLogonav() {
    var logonav = $("#logonav a[href]");
    var lopac = 0.4;
        
    // {{{ add click event for logonav
    logonav.each(function() {
        var active = this;
        var pos = $(active).offset();

        // cache subpages
        $("<div></div>").load(active.href + " .section > *");

        $(active).click( function() {
            if (!$(active).hasClass("active")) {
                $("#logonav a").removeClass("active");
                $(".section").hide()[0].id = active.id + "s";

                $(active).blur();

                var title = $(this).text();

                $(active).addClass("active");

                $("#logonav a em").remove();
                $("span", this).append("<em>lade...</em>");

                $(".section *").remove();
                $(".section").load(active.href + " .section > *", null, function() {
                    $(".section").show();
                    $("#logonav a em").remove();

                    document.title = "duisberg . " + title;

                    replaceEmailRefs();
                    replaceInteractiveContent();

                    $("#logonav a:not([href])").each( function() {
                        var alpha = 1 - getDistance(active, this) * 0.001;

                        if (alpha < 0.25) {
                            alpha = 0.25;
                        }
                        $(this).fadeTo("normal", alpha);
                    });

                    try {
                        history.pushState({}, title, active.href);
                    } catch(e) {
                    }
                });
            } else {
                $(".section").hide(0, function() {
                    $("#logonav a:not([href])").each( function() {
                        $(this).fadeTo("normal", 0.6);
                    });
                });

                $(active).removeClass("active").blur();
            }
            return false;
        }).mouseover(function() {
            $("span", this).css({
                opacity: 1
            });
        }).mouseout(function() {
            $("span", this).css({
                opacity: lopac
            });
        });
    });
    // }}}
    // {{{ fadeInLogoNav()
    function fadeInLogoNav(n) {
        if (n == 0) {
            var wait = 2000;
        } else {
            var wait = 600;
        }

        $("span", logonav[n]).pause(wait).fadeTo("fast", 1).fadeTo("slow", lopac, function() {
            if (n < logonav.length - 1) {
                fadeInLogoNav(n + 1);
            }
        });
    }
    // }}}

    fadeInLogoNav(0);
}
// }}}
// {{{ getDistance()
function getDistance(a, b) {
    aOffset = $(a).offset();
    bOffset = $(b).offset();
    
    return Math.sqrt(Math.pow(bOffset.left - aOffset.left, 2) + Math.pow(bOffset.top - aOffset.top, 2));
}
// }}}
// {{{ addControls()
function addControls() {
    // {{{ add controls()
    if ($.browser.msie && parseInt(jQuery.browser.version) < 7) {
        var isuffix = ".gif";
    } else {
        var isuffix = ".png";
    }
    var iplay = scriptPath + "play" + isuffix;
    var ipause = scriptPath + "pause" + isuffix;
    var imute = scriptPath + "mute" + isuffix;
    var iunmute = scriptPath + "unmute" + isuffix;

    if ($("#controls").length == 0) {
        $("<div id=\"controls\"><a href=\"#mute\" class=\"mute\"><img src=\"" + imute + "\"></a><a href=\"#play-pause\" class=\"play\"><img src=\"" + ipause + "\"></a></div>").insertAfter("#back");
        $("#controls .mute").toggle(function() {
            $("img", this)[0].src = iunmute;
            controlPlayer("fmute");
            this.blur();

            return false;
        }, function() {
            $("img", this)[0].src = imute;
            controlPlayer("funmute");
            this.blur();

            return false;
        });
        $("#controls .play").toggle(function() {
            $("img", this)[0].src = iplay;
            controlPlayer("fpause");
            this.blur();
        
            return false;
        }, function() {
            $("img", this)[0].src = ipause;
            controlPlayer("fplay");
            this.blur();

            return false;
        });
    }
    // }}}
    // {{{ add handCursorEvents()
    $("#logonav a[href], #controls a").mouseover(function() {
        $("#lightwaves_flash").each( function() {
            controlPlayer("fshowHandCursor");
        });
    }).mouseout(function() {
        $("#lightwaves_flash").each( function() {
            controlPlayer("fhideHandCursor");
        });
    });
    // }}}
}
// }}}
// {{{ controlPlayer()
function controlPlayer(func) {
    try {
        if ($.browser.msie) {
            eval("window.lightwaves_flash." + func + "()");
        } else {
            eval("document.lightwaves_flash." + func + "()");
        }
    } catch(e) {
        //alert("error");
    }
}
// }}}

// fix browser behaviours
// {{{ fixHeightIE6()
function fixHeightIE6() {
    var body = $("body");
    var content = $("content");

    if (body.height() > content.height()) {
	content.height(body.height());
    }
}
// }}}
// {{{ fixFlashDisplayOpera()
function fixFlashDisplayOpera(numcall) {
    numcall++;
    if (numcall < 20) {
	setTimeout("fixFlashDisplayOpera(" + numcall + ")", 200);
    }

    if (numcall % 2 == 0) {
	$("object").css({ border: "0px solid" });
    } else {
	$("object").css({ border: "none" });
    }
}
// }}}

// {{{ register events
$(document).ready(function() {
    // init global vars
    // {{{ get language from content tag in header
    window.lang = $("meta[name = 'Content-Language']")[0].content;
    // }}}
    // {{{ get script path for relative links
    window.scriptPath = $("script[src *= 'global.js']")[0].src.match(/^.*\//).toString();
    // }}}
        
    $("body").addClass("javascript");

    // replace content
    replaceEmailRefs();
    replaceLogonav();
    replaceInteractiveContent();

    // add flash content
    if ($.browser.flash("9,0,0")) {
        replaceFlashContent();

	$("body").addClass("flash");
    }

    // fix browser bugs
    if ($.browser.opera) {
	fixFlashDisplayOpera(0);
    }
});
// }}}
    
/* vim:set ft=javascript sw=4 sts=4 fdm=marker : */

