/*
 * Eyefi Behaviour
 *
 * Functions for easy frontend javascripting
 *
 * Documentation can be found on:
 * https://i.eyefi.nl/xiki/ECML/eyefibehaviour
 *
 * Author: Arjan Scherpenisse <arjan@eyefi.nl>
 */

var EB = new Array();

EB.namespaceprefix = "eb:";
EB.scriptprefix = "/js/";

// addEvent and removeEvent are (c) John Resig;
// http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
EB.addEvent = function( obj, type, fn ) {
	if (obj.addEventListener) {
        obj.addEventListener( type, fn, false );
    } else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); };
		obj.attachEvent( "on"+type, obj[type+fn] );
	} else {
        obj["on"+type] = fn;
    }
};

EB.removeEvent = function( obj, type, fn ) {
	if (obj.removeEventListener) {
		obj.removeEventListener( type, fn, false );
    } else if (obj.detachEvent) {
		obj.detachEvent( "on"+type, obj[type+fn] );
		obj[type+fn] = null;
		obj["e"+type+fn] = null;
	} else {
        obj["on"+type] = null;
    }
};

EB.getElementOptions = function(el, prefix, defaults) {
    if (prefix == null) prefix = EB.namespaceprefix;
    var opts = defaults;
    for (var i=0; i<el.attributes.length; i++) {
        if (el.attributes[i].name.substr(0, prefix.length) == prefix) {
            var n = el.attributes[i].name.substr(prefix.length, el.attributes[i].name.length-prefix.length);
            opts[n] = el.attributes[i].value;
        }
    }
    return opts;
}

EB.includeScript = function(file, type) {
    var head = document.getElementsByTagName("HEAD")[0];
    if (!head) return false;

    var s = document.createElement("SCRIPT");
    if (!type) type = "text/javascript";
    s.setAttribute("type", type);
    s.setAttribute("src", file);
    head.appendChild(s);
}

EB.setCookie = function(name, value, expires, path, domain, secure) {
    document.cookie= name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

EB.getCookie = function(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    } else
        begin += 2;
    var end = document.cookie.indexOf(";", begin);
    if (end == -1)
        end = dc.length;
    return unescape(dc.substring(begin + prefix.length, end));
}

EB.delCookie = function(name, path, domain) {
    if (EB.getCookie(name)) {
        document.cookie = name + "=" + 
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
}

// get the target element of the last fired event
EB.getEventTarget = function(e) {
    if (!e) e = window.event; 
    return (e.target) ? e.target : e.srcElement;
};

EB.registerAttribute = function(tagname, attribute, callback) {
    if (typeof EB._attributes != "object") EB._attributes = new Array();
    if (typeof EB._attributes[tagname] != "object") EB._attributes[tagname] = new Array();
    EB._attributes[tagname][EB._attributes[tagname].length] = [attribute, callback];
}

EB.processAttributes = function() {
    if (typeof EB._attributes != "object") return;

    for(var tag in EB._attributes) {
        if (typeof EB._attributes[tag] == "function") continue;
        
        var elems = document.getElementsByTagName(tag);
        for (var i=0; i<elems.length; i++) {
            var eventlist = EB._attributes[tag];
            for (var j=0; j<eventlist.length; j++) { 
                if (!elems[i].getAttribute(EB.namespaceprefix+eventlist[j][0])) continue;
                eventlist[j][1](elems[i]);
            }
        }
    }
	EB.processed = true;
}


// Preload all images with the eb:src_mouseover behaviour
EB.addHoverImage = function(img) {

    // Check for the eb:src_mouseover tag
    var src_mouseover = img.getAttribute(EB.namespaceprefix+"src_mouseover");
    if (!src_mouseover) return;
        
    // Save the source of the original image
    img.src_original = img.src;

    // Preload the image
    var preloadimg = new Image();
    preloadimg.src = src_mouseover;
        
    // Assign mouseover() and mouseout() functions
    img.EBHoverImageOver = function(e) {
        img.src = img.getAttribute(EB.namespaceprefix+"src_mouseover");
    };
    img.EBHoverImageOut = function(e) {
        img.src = img.src_original;
    };
    
    EB.addEvent(img, "mouseover", img.EBHoverImageOver);
    EB.addEvent(img, "mouseout", img.EBHoverImageOut);
};

/**
 * Add nofocus behaviour to <A> tags with eb:nofocus="true" attribute.
 *
 * Solution: create a small <A> tag, positioned absolute in the left top,
 * and set the focus to this on a mouse release
 */
EB.addNoFocus = function(a) {
    if (!document.getElementById("EB_unfocus_dots")) {
        var e = document.createElement("A");
        e.id = "EB_unfocus_dots";
        e.href = "javascript:;";
        e.style.position = "absolute";
        e.style.top = "0"; e.style.left="0";
        document.body.appendChild(e);
    }
    document.getElementById("EB_unfocus_dots").href = a.href;
    EB.addEvent(a, "click", function() { document.getElementById("EB_unfocus_dots").focus(); } );
}

/**
 * Hover class
 * eb:class_hover="xx";
 */
EB.addHoverClass = function(el) {
    var hoverclass = el.getAttribute(EB.namespaceprefix+"class_mouseover");
    el.EBHoverClassOver = function() {
        if (el.className != hoverclass) {
            el.tmpClassName = el.className;
            el.className = hoverclass;
        }
    };
    el.EBHoverClassOut = function() {
        if (el.className == hoverclass) {
            el.className = el.tmpClassName;
        }
    };
    EB.addEvent(el, "mouseover", el.EBHoverClassOver);
    EB.addEvent(el, "mouseout", el.EBHoverClassOut);
}

/**
 * Link elements
 */
EB.linkEventOver = function(e) {
    var t = EB.getEventTarget(e);
    var linkname = t.getAttribute(EB.namespaceprefix+"link");
	try{
	    for (var i=0; i<EB.links[linkname].length; i++) {
	        var el = EB.links[linkname][i];
	        if (el == t) continue;
	        if (el.EBHoverImageOver) el.EBHoverImageOver(e);
	        if (el.EBHoverClassOver) el.EBHoverClassOver(e);
	        if (el.EBDivHrefOver) el.EBDivHrefOver(e);
	    }
	} catch(e){
		// void
	}
}

EB.linkEventOut = function(e) {
    var t = EB.getEventTarget(e);
    var linkname = t.getAttribute(EB.namespaceprefix+"link");
	try{
	    for (var i=0; i<EB.links[linkname].length; i++) {
	        var el = EB.links[linkname][i];
	        if (el == t) continue;
	        if (el.EBHoverClassOut) el.EBHoverClassOut(e);
	        if (el.EBHoverImageOut) el.EBHoverImageOut(e);
	        if (el.EBDivHrefOut) el.EBDivHrefOut(e);
	    }
	} catch(e){
		// void
	}
}
EB.addLink = function(x) {
    var linkname = x.getAttribute(EB.namespaceprefix+"link");
    if (typeof EB.links != "object") EB.links = new Array();
    if (typeof EB.links[linkname] != "object") EB.links[linkname] = new Array();

    EB.links[linkname][EB.links[linkname].length] = x;

    EB.addEvent(x, "mouseover", EB.linkEventOver);
    EB.addEvent(x, "mouseout", EB.linkEventOut);
}

/**
 * Toggle elements
 */
EB.toggle = function(id, attribute) {
    if (!attribute) attribute = 'style.display';
    var states = [];
    if (arguments.length < 3) {
        states = ["none", "block"];
    } else {
        var i=0;
        for (i=2;i<arguments.length;i++)
        states[states.length] = arguments[i];
    }
    
    var target = typeof id == "string"?document.getElementById(id):id;
    var l = attribute.split(".");
    var att = eval("target."+attribute);
    if (!att) eval("target."+attribute+" = '"+states[0]+"';");
    
    for (i=0; i<states.length; i++) {
        if (att == states[i]) {
            att = states[(i+1)%states.length];
            eval("target."+attribute+" = att;");
            break;
        }
    }
}

/**
 * Toggle elements in a group: only one open at the same time. 
 */
EB.toggleGroup = function(id) {
	if(EB.processed){
	    var target = document.getElementById(id);
	    if (!target) alert('toggleGroup: unknown element \''+id+'\'');
	
	    group = target.getAttribute(EB.namespaceprefix+"togglegroup");
	
	    if (target.style.display && target.style.display == "block") {
	        //target.style.display = "none";
	        //EB.setCookie("EB_togglegroup_"+group, "-");
	    } else {
	        for (var i=0; i<EB.togglegroups[group].length; i++) {
	            var el = EB.togglegroups[group][i];
	            el.style.display = "none";
	        }
	        target.style.display = "block";
	        //EB.setCookie("EB_togglegroup_"+group, id);
	    }
	}
}

EB.addToggleGroup = function(el) {
    if (!EB._togglestatus) EB._togglestatus = [];
    
    var group = el.getAttribute(EB.namespaceprefix+"togglegroup");
    if (typeof EB.togglegroups != "object") EB.togglegroups = new Array();
    if (typeof EB.togglegroups[group] != "object") EB.togglegroups[group] = new Array();
    EB.togglegroups[group][EB.togglegroups[group].length] = el;

    if (!EB._togglestatus[group] && EB.getCookie("EB_togglegroup_"+group) == el.id) {
        EB.toggleGroup(el.id);
    }
}

//
//	GROUP TOGGLES
//

/*EB.groupToggle = function(group, site_root){
	try{

		for (var i=0; i<EB.grouptoggles["lang_"+group].length; i++) {
	        var el = EB.grouptoggles["lang_"+group][i];
			if (el.style.display && el.style.display == "none") {
	        	el.style.display = "block";
				EB.setCookie("carambola_multilang_lang_"+group, "on");
				flag = document.getElementById("flag_"+group);
				var preloadimg = new Image();
				preloadimg.src = site_root + "img/flags/"+group+".png";
        		flag.src = preloadimg.src;
			} else {
				el.style.display = "none";
				EB.setCookie("carambola_multilang_lang_"+group, "off");
				flag = document.getElementById("flag_"+group);
				var preloadimg = new Image();
				preloadimg.src = site_root + "img/flags/"+group+"_off.png";
        		flag.src = preloadimg.src;
			}
	    }
	} catch(e){

	}
}*/

EB.groupToggle = function(group, image, disabled_image){
	for (var i=0; i<EB.grouptoggles[group].length; i++) {
        var el = EB.grouptoggles[group][i];
		if (el.style.display && el.style.display == "none") {
        	el.style.display = "block";
			EB.setCookie("carambola_grouptoggle_"+group, "on");
			flag = document.getElementById("flag_"+group);
			var preloadimg = new Image();
			preloadimg.src = image;
       		flag.src = preloadimg.src;
		} else {
			el.style.display = "none";
			EB.setCookie("carambola_grouptoggle_"+group, "off");
			flag = document.getElementById("flag_"+group);
			var preloadimg = new Image();
			preloadimg.src = disabled_image;
       		flag.src = preloadimg.src;
		}
    }
}

EB.addGroupToggle = function(el) {
	var group = el.getAttribute(EB.namespaceprefix+"grouptoggle");

    if (typeof EB.grouptoggles != "object") EB.grouptoggles = new Array();
    if (typeof EB.grouptoggles[group] != "object") EB.grouptoggles[group] = new Array();
    EB.grouptoggles[group][EB.grouptoggles[group].length] = el;
	
}


/**
 * Initialize scrolling div
 */
EB.initScroller = function(el) {
    if(el.getAttribute(EB.namespaceprefix+"scroller") != "true") return;
	
    if (!EB.scroller) {
        EB.includeScript(EB.scriptprefix+"eb-scroller.js");
        setTimeout(function(){EB.initScroller(el);}, 100);
        return;
    }

    EB.scroller.create(el);
}


// Link to previous page
EB.goBack = function() {
    window.history.go(-1);
}

// Add a bookmark
EB.addFavorite = function(url, title) {
    if (!document.all) {
        alert('Please hit ctrl-b to bookmark this page');
    } else {
        external.AddFavorite(linkUrl,linkTitle);
    }
    return false;
}

// Check browser
EB.checkBrowser = function() {
    if (typeof EB._browser == "object") return EB._browser;
    var b = new Array();
	b.ver=navigator.appVersion; b.dom=document.getElementById?1:0;
	b.mac=(b.ver.indexOf("PPC")!= -1)?1:0; b.win=(b.ver.indexOf("Win")!= -1)?1:0;
	b.ie5=(b.ver.indexOf("MSIE")!= -1 && b.dom && parseInt(b.ver) >= 4)?1:0;
	b.ie4=(document.all && !b.dom)?1:0; b.ie=(b.ie5 || b.ie4);
	b.saf=(b.ver.indexOf("Safari")>-1 && b.mac) ?1:0;
	b.ns6=(b.dom && b.ver.indexOf("MOZILLA")!= -1)?1:0; b.ns4=(document.layers && !b.dom)?1:0; 
	b.ns=(b.ns4 || b.ns6 || b.saf);
	b.eyefi=(b.ie || b.ns);
    EB._browser = b;
	return EB._browser;
}

EB.window = {
    
    /**
     * Center a window.
     * Example:
     * EB.addEvent(window, "load", EB.window.center);
     * this centers a window on load.
     */
    center: function() {
        saw = screen.availWidth;
        sah = screen.availHeight;
        self.moveTo(((saw/2)-380),((sah/2)-220));
    },

    /**
     * Close a window. Doh ;-)
     */
    close: function() {
        window.close();
    },

    /**
     * Link from popup to main window
     * EB.window.openInMain('/index.php');
     */
    openInMain: function(url) {
        opener.parent.location=url;
        opener.focus();
        EB.window.close();
    },

    /**
     * Make the window fullscreen
     */
    fullscreen: function() {
        if (!window.moveTo || !window.resizeTo) return;
        window.moveTo(0,0) 
        window.resizeTo(screen.availWidth,screen.availHeight)
    },

    /**
     * Make a popup window
     * EB.window.popup('aap.php', 320, 240);
     * EB.window.popup('aap.php', 320, 240, ['location','resizable']); // resizablepopup with location bar
     */
    popup: function(url, w, h, opts) {
        var all_options = {'toolbar': false, 'location': false, 'directories': false,
                           'status': false, 'menubar': false,
                           'scrolling': false, 'scrollbars': false, 'resizable': false};
        if (typeof opts == "object") {
            for (var j=0; j<opts.length; j++) all_options[opts[j]] = true;
        }
        s = "";
        for (var i in all_options) s += i+"="+(all_options[i]?"yes":"no")+",";
        if (w) s += "width="+w+",";
        if (h) s += "height="+h+",";
        s = s.substr(0,s.length-1);
        window.open(url,'pop',s);        
    }
};



// FLASH
var hasFlash = false;
EB._detectFlash = function() {
    if (hasFlash) return;
    
    var p = (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"]) ? navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin : 0;
    if (p) {
        hasFlash = parseInt(p.description.substring(p.description.indexOf(".")-1)) >= 6;
	} else if (navigator.userAgent && navigator.userAgent.indexOf("MSIE")>=0) {
        document.write('<SCRIPT LANGUAGE=VBScript\> \n');
        document.write('on error resume next \n');
        document.write('hasFlash = ( IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n');
        document.write('if ( hasFlash <= 0 ) then hasFlash = ( IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6")))\n');
        document.write('<\/SCRIPT\> \n');
	}
}

EB.writeFlash = function(ourSwf, ourWidth, ourHeight, ourBg, msgOrPage, noFlashMsg) {
    EB._detectFlash();
    if (hasFlash) {
        document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
        document.write('  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" ');
        document.write(' ID=FLASH_AD WIDTH='+ourWidth+' HEIGHT='+ourHeight+'>');
        document.write(' <PARAM NAME=movie VALUE="'+ourSwf+'"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE='+ourBg+'> '); 
        document.write(' <EMBED src="'+ourSwf+'" quality=high ');
        document.write(' swLiveConnect=FALSE WIDTH='+ourWidth+' HEIGHT='+ourHeight+' bgcolor='+ourBg);
        document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">');
        document.write(' </EMBED>');
        document.write(' </OBJECT>');
	} else { // if the right flash player version has not been found:
		if (msgOrPage==1) { document.write('<meta http-equiv="Refresh" content="1; URL='+noFlashMsg+'">'); }
		else if (msgOrPage==2) { EB.window.popup(noFlashMsg,'noflash',350,350); }
		else if (msgOrPage==3) { document.write('<a href="http://www.macromedia.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" target="_blank">'+noFlashMsg+'</a>');  }
		else if (msgOrPage==4) { alert(noFlashMsg); }
		else if (msgOrPage==5) { document.write('<a href="http://www.macromedia.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" target="_blank"><img src="'+noFlashMsg+'" width="'+ourWidth+'" height="'+ourHeight+'" style="border: 0" /></a>');  }
	}
};

// <span eb:rate="true" />
EB.initRate = function(el) {
    var opts = EB.getElementOptions(el, null, {"num": 5, "half": false, "value": 0,
    "img_on": "/img/star_full.jpg", "img_off": "/img/star_empty.jpg", "img_half": "/img/star_half.jpg", "img_over": "/img/star_over.jpg",
    "readonly": false, "url": false, "update_input": false});

    opts.num = parseInt(opts.num);
    opts.value = parseFloat(opts.value);
    var img_on = document.createElement("IMG"); img_on.src = opts.img_on;
    var img_off = document.createElement("IMG"); img_off.src = opts.img_off;
    var img_half = document.createElement("IMG"); img_half.src = opts.img_half;

    var id;
    if (!opts.readonly) {
        var img_over = document.createElement("IMG"); img_over.src = opts.img_over;
        if (!EB.rate) EB.rate = { globalid: 1 };
        id = EB.rate.globalid++;
        EB.rate[id] = { images: [], opts: opts, img_on: img_on, img_off: img_off, img_half: img_half, img_over: img_over };
    }
    
    // first clear contents of the span
    while (el.childNodes.length) el.removeChild(el.childNodes[0]);
    
    // add <num> images
    for (i=0; i<opts.num; i++) {
        var orig;
        if (i+1 <=opts.value)
            orig = img_on;
        else if (i+1 <= opts.value+0.5)
            orig = img_half;
        else
            orig = img_off;
        
        var im = orig.cloneNode(false);        
        if (!opts.readonly) {
            im.rate_id = id;
            im.i = i;
            im.orig = orig;
            im.over = img_over;
            im.style.cursor = "pointer";
            EB.addEvent(im, "mouseover", EB.rateMouseOver);
            EB.addEvent(im, "mouseout", EB.rateMouseOut);
            EB.addEvent(im, "click", EB.rateMouseClick);
            EB.rate[id].images[EB.rate[id].images.length] = im;
        }
        el.appendChild(im);
    }
    if (opts.update_input) {
        document.getElementById(opts.update_input).value = opts.value;
    }
    
}

EB.rateMouseOver = function(e) {
    var img = EB.getEventTarget(e);
    var r = EB.rate[img.rate_id];
    for (i=0; i<=img.i; i++) {
        r.images[i].src = r.images[i].over.src;
    }

}

EB.rateMouseOut = function(e) {
    var img = EB.getEventTarget(e);
    var r = EB.rate[img.rate_id];
    for (i=0; i<=img.i; i++) {
        r.images[i].src = r.images[i].orig.src;
    }
}

EB.rateMouseClick = function(e) {
    var img = EB.getEventTarget(e);
    var r = EB.rate[img.rate_id];
    for (i=0; i<r.opts.num; i++) {
        var im = (i <= img.i) ? r.img_on : r.img_off;
        r.images[i].orig = im;
        r.images[i].src = im.src;
    }
    // handling of rate action
    if (r.opts.update_input) {
        // update a hidden element
        var h = document.getElementById(r.opts.update_input);
        h.value = img.i+1;
    }
    if (r.opts.url) {
        alert("FIXME: submit to "+r.opts.url)
    }
    
}

// ATTRIBUTE REGISTRATIE GEDEELTE
EB.registerAttribute("IMG", "src_mouseover", EB.addHoverImage);
EB.registerAttribute("INPUT", "src_mouseover", EB.addHoverImage);

EB.registerAttribute("A", "class_mouseover", EB.addHoverClass);
EB.registerAttribute("IMG", "class_mouseover", EB.addHoverClass);
EB.registerAttribute("TD", "class_mouseover", EB.addHoverClass);
EB.registerAttribute("TR", "class_mouseover", EB.addHoverClass);
EB.registerAttribute("DIV", "class_mouseover", EB.addHoverClass);

EB.registerAttribute("A", "nofocus", EB.addNoFocus);

EB.registerAttribute("A", "grouptoggle", EB.addGroupToggle);
EB.registerAttribute("IMG", "grouptoggle", EB.addGroupToggle);
EB.registerAttribute("DIV", "grouptoggle", EB.addGroupToggle);

EB.registerAttribute("DIV", "togglegroup", EB.addToggleGroup);
EB.registerAttribute("A", "togglegroup", EB.addToggleGroup);

EB.registerAttribute("A", "link", EB.addLink);
EB.registerAttribute("IMG", "link", EB.addLink);
EB.registerAttribute("TD", "link", EB.addLink);

EB.registerAttribute("SPAN", "rate", EB.initRate);

EB.registerAttribute("DIV", "scroller", EB.initScroller);

// LOAD GEDEELTE
EB.addEvent(window, "load", EB.processAttributes);

