function $(id) { return document.getElementById(id); }

/** http://onlinetools.org/articles/unobtrusivejavascript/chapter4.html **/
function addEvent(obj, evType, fn){ 
//  try {
  if (obj.addEventListener){ 
/*    if ((obj+'').toUpperCase().indexOf('IFRAME') != -1) {
        alert('adding event listener ' + evType + ', to obj: ' + obj);
        var mbr = [];
        for(x in obj) mbr.push(x);
        alert('obj members: ' + mbr.join('; '));
    }*/
    obj.addEventListener(evType, fn, false); 
    return true; 
  } else if (obj.attachEvent){ 
    var r = obj.attachEvent("on"+evType, fn); 
    return r; 
  } else { 
    return false; 
  } 
  /*} catch(ex) {
    obj['on'+evType] = fn;
  }*/
}

/*
    Written by Jonathan Snook, http://www.snook.ca/jonathan
    Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

var flipperState = {};
var showArrow = "&#x25BC;";
var hideArrow = "&#x25B6;";
function toggleFlipper(basename) {
    //alert('basename: ' + basename);
    var isHidden = (flipperState[basename]);
    var guide = $(basename+'-wrap');
    addClassName(guide, 'flippable' + ((!isHidden) ? "-hidden" : ""));
    guide.style.display = (!isHidden) ? 'none' : 'block';
    $('toggle-'+basename+'-arrow').innerHTML = ((!isHidden) ? hideArrow : showArrow);
    flipperState[basename] = !isHidden;
}

function appropriateFlipperToggler(basename) {
    return $('toggle-'+basename);
}

function elementClasses(el) {
    return el.className.split(" ");
}

function hasClassName(el, classname) {
    var c = elementClasses(el);
    var i = 0;
    for (i in c) {
        var cl = c[i];
        if (cl == classname) return true;
    }
    return false;
}

function addClassName(el, classname) {
    if (hasClassName(el, classname)) return;
    el.className += " " + classname;
}

function removeClassName(el, classname) {
    if (!hasClassName(el, classname)) return;
    var c = elementClasses(el);
    var nc = [];
    for (i in c) {
        var cl = c[i];
        if (cl != classname) nc.push(cl);
    }
    el.className = nc.join(" ");
}


addEvent(window, 'load', function() {
    var els = getElementsByClassName(document, '*', 'flippable');
    var els2 = getElementsByClassName(document, '*', 'flippable-hidden');
    for (var i in els2) { els.push(els2[i]); }
    for (var i in els) {
        var el = els[i];
        var basename = el.getAttribute('id').replace(/-wrap$/,'');
        var isHidden = (hasClassName(el,'flippable-hidden'));
        flipperState[basename] = isHidden;
        if (isHidden) {
            el.style.display = 'none';
        } else {
            el.style.display = 'block';
        }
        
        var flipper = appropriateFlipperToggler(basename);
        var inh = flipper.innerHTML;
        var flipperarrow = document.createElement('span');
        flipperarrow.setAttribute('id','toggle-'+basename+'-arrow');
        flipperarrow.id = 'toggle-'+basename+'-arrow';
        flipperarrow.innerHTML = (isHidden ? hideArrow : showArrow);
        addClassName(flipperarrow, 'flipper-arrow');
        var flipperlink = document.createElement('a');
        flipperlink.setAttribute('href','#');
        addClassName(flipperlink, 'flipper');
        flipperlink.appendChild(flipperarrow);
        flipperlink.innerHTML += inh;
        flipperlink.setAttribute('onclick', 'toggleFlipper("' + basename + '"); return false;');
        flipper.innerHTML = '';
        flipper.appendChild(flipperlink);
    }
});

productnav = {'Applications and utilities':{'produrls':['thisservice','hexpicker','gmailgrowl','monocle'],'prodtitles':['ThisService','Hex Color Picker','Gmail+Growl','Monocle']},'Source code':{'produrls':['shortcut','ipodtimer'],'prodtitles':['Shortcut Recorder','iPod Lap Timer']}};

function metaWithName(name) {
    var metatags = document.getElementsByTagName('META');
//    alert('meta tags: ' + metatags.length);
    for (var i=0;i<metatags.length;i++) {
        var metat = metatags[i];
        if (metat.getAttribute('name') == name) return metat;
    }
    return null;
}

function screenshotDefault() {
    var metat = metaWithName('x-wafflesoftware-screenshot-default');
    if (metat == null) return;
    var defscr = metat.getAttribute('content');
    return defscr;
}

function currentDept() {
    var currpartregex = new RegExp("(.*)/(.*?)/(.*?)$");
    var currpart = (currpartregex.exec(location.href))[2];
    var metat = metaWithName('x-wafflesoftware-dept');
    if (metat != null)
        currpart = metat.getAttribute('content');
    return currpart;
}

function productName() {
	var h2s = document.getElementsByTagName('h2');
	if (h2s.length > 0) return h2s[0].innerHTML;
	return null;
}

function isLocal(url) {
    return (url.indexOf('file:/') != -1);
}

function otherproductsChanged() {
    var menu = $('otherproducts-select');
    var url = menu.options[menu.selectedIndex].value;
    var currpart = currentDept();
    //alert('currpart: ' + currpart + ", url: " + url);
    var loc = location.href+'';
    var locregex = new RegExp("^(.*)/(.*?)$");
    var mx;
    var keepGoing = true;
    while (keepGoing) {
        mx = locregex.exec(loc);
        //console.log(mx.length + ", " + loc);
        if (mx[2] == currpart) keepGoing = false;
        loc = loc.replace(mx[2], "");
        loc = loc.replace(/\/$/, "");
    }
    loc += "/" + url + "/";
    //alert('loc: ' + loc);
    if (isLocal(loc)) loc += "index.html";
    location.href = loc;
}

addEvent(window, 'load', function() {
    if ($('back-to-wafsof') == null) return;
    c = $('back-to-wafsof');
    if (document.all) return; // IE? bail. it looks too weird.
    var currpart = currentDept();
    if (currpart == "content") return;
    elsestuff = document.createElement('span');
    elsestuff.setAttribute('id','elsestuff');
    elsestuff.id = 'elsestuff';
    otherprods = document.createElement('span');
    otherprods.setAttribute('id','otherproducts');
    otherprods.id = 'otherproducts';
    slct = document.createElement('select');
    slct.setAttribute('id','otherproducts-select');
    slct.setAttribute('onchange','otherproductsChanged()');
    slct.id = 'otherproducts-select';

    for (var k in productnav) {
        obj = productnav[k];
        if (obj['produrls']) {
            group = document.createElement('optgroup');
            group.setAttribute('label',k);
            urls = obj['produrls'];
            titles = obj['prodtitles'];
            for (var i in titles) {
                title = titles[i];
                prod = document.createElement('option');
                prod.innerHTML = title;
                if (urls[i] == currpart) {
                    prod.setAttribute('selected','selected');
                    prod.selected = true;
                }
                prod.setAttribute('value',urls[i]);
                group.appendChild(prod);
            }
            slct.appendChild(group);
        }
    }
    otherprods.appendChild(slct);
    otherprods.innerHTML += "Other products";
    elsestuff.appendChild(otherprods);
    c.insertBefore(elsestuff, c.childNodes[0]);
});

function flip(hider) {

    contents = $(hider+'-contents');
    link = $(hider+'-link');
    h = $(hider+'-header');
    if (contents.style.display == 'none') {
        contents.style.display = 'block';
        h.style.display = 'block';
        link.style.display = 'none';
    } else {
        contents.style.display = 'none';
        h.style.display = 'none';
        link.style.display = 'block';
    }
    
}

addEvent(window, 'load', function(){
    if (!isLocal(location.href)) return;
    var links = document.getElementsByTagName('A');
    for (var i=0; i<links.length;i++) {
        var link = links[i];
        var hr = link.getAttribute('href');
        if ((hr.substr(0,4) != "http") && (hr.substr(-1,1) != '#') && (hr.substr(-4,4) != '.png')) {
            link.setAttribute('href', link.getAttribute('href')+((hr.substr(-1,1) == "/")?'':'/')+"index.html");
        }
    }
});

var warrantsDeveloperToolWarning = ['ipodtimer','shortcut'];
var developerToolWarning = 'This is a developer tool and not a standalone application or utility.';

function hideDeveloperToolWarningWithoutWritingCookie() {

    var otherWarnings = getElementsByClassName(document, '*', 'developer-tool-warning');
    for (var i=0;i<otherWarnings.length;i++) {
        var el = otherWarnings[i];
        el.style.display = 'none';
    }
}

function hideDeveloperToolWarning() {
    var warning = $('developer-tool-warning');
    warning.style.display = 'none';
    hideDeveloperToolWarningWithoutWritingCookie();
    setCookie('saw-developer-tool-warning-'+currentDept(), 'true');
}

addEvent(window, 'load', function() {
    if ($('cap') == null) return;
    var c = $('cap');
    var currpart = currentDept();
    /*var sawwarning = getCookie('saw-developer-tool-warning-'+currpart);
    if (sawwarning != null) { hideDeveloperToolWarningWithoutWritingCookie();return; }*/
    for (var i = 0; i<warrantsDeveloperToolWarning.length; i++) {
        var el = warrantsDeveloperToolWarning[i];
        if (el == currpart) {
            
            var warning = document.createElement('div');
            warning.setAttribute('id', 'developer-tool-warning');
            warning.id = 'developer-tool-warning';
            warning.appendChild(document.createTextNode(developerToolWarning));
            var hidelink = document.createElement('a');
            hidelink.setAttribute('href','#');
            hidelink.setAttribute('onclick','hideDeveloperToolWarning();return false');
            hidelink.appendChild(document.createTextNode('Hide'));
//            warning.appendChild(hidelink)
            c.parentNode.insertBefore(warning, c.nextSibling);
            return;
        }
    }
});

var DEBUG_WAFSOF = false;

function log(str) {
    if (!DEBUG_WAFSOF) return;
//    alert(str);
    try {
        var xyzzy = console.firebug;
        if (xyzzy != null) {
            console.log(str);
        } else {
            alert(str);
        }
    } catch(er) {
        alert(str);
    }
}

/*
//XX
var loadTab = null;

var cachedPages = {};

function getXHR() {
    if (window.XMLHttpRequest) { 
        return new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        return new ActiveXObject("Microsoft.XMLHTTP");
    } else return null;
}

function ajaxRequest(url, callback) {
    
    var req = getXHR();
    if (req == null) return;
    
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            log('ready state == 4, status: ' + req.status);
            if ((req.status == 200) || (req.status == 0) || (req.status == undefined)) {
                callback(true, req);
            }
        }
    };
    req.open('GET', url, true);
//    req.overrideMimeType('text/xml');
    req.send();
    
}

function makeAbsoluteUrl(url, baseurl) {
    var o = baseurl.replace(/\/([^\/]+)$/, "/");
    o += url;
    o = o.replace(/\/\./, "");
    o = o.replace(/\/([^\/]+)\/\.\./, "/");
    log("made absolute url: "+o+ " (from: " + url + " and "+ baseurl +")");
    return o;
}

function iframeRequest(url, callback) {
    var absu = makeAbsoluteUrl(url, location.href);
    if (cachedPages[absu] != null) { callback(true, true, cachedPages[absu], absu); } else {
    $('loading-iframe').onload = function() { callback(true, false, $('loading-iframe'), absu)};
    $('loading-iframe').src = absu;
    log('location: '+$('loading-iframe').src);
    }

}


function doLoadTab() {
    var tab = loadTab;

    log('load tab' + tab.innerHTML);

    if (tab == activeTab) return;
    
    log('not active');
    iframeRequest(tab.getAttribute('href'), function (worked, cached, req, origURL) {
        log("did load");
        if (!worked) { log("didn't work: " + req); return; }
        
        var knee;
        if (cached) {
            knee = req;
        } else {
            var x = $('loading-iframe').contentDocument;
        
            x.innerHTML = req.responseText;
            log(x);
            log(x.getElementById('knee'));
            
            knee = x.getElementById('knee').innerHTML;
            
            cachedPages[origURL] = knee;
        }

        activeTab.parentNode.className = '';
        tab.parentNode.className = 'active';
        $('knee').innerHTML = knee;
        
        activeTab = tab;
        
    });
    
}

function kickOffLoadTab(tab) {
    
    loadTab = tab;
    window.setTimeout('doLoadTab()', 40);
    log("returning");
    return false;
}

var activeTab = null;

// Apple Store-like Load Tab In-Place
addEvent(window, 'load', function() {

    return;
    
    if ($('tabs') == null) return;
    if ($('knee') == null) return;
    var t = $('tabs');
    var linx = t.getElementsByTagName('A');
    for (var i = 0; i<linx.length; i++) {
        var link = linx[i];
        var hr = link.getAttribute('href');
        if (hr != null && hr != '') {
            link.setAttribute('onclick','return kickOffLoadTab(this)');
//            link.setAttribute('href','#');
            if (link.parentNode.className == 'active') {
                activeTab = link;
            }
        }
    }
    var loadingiframe = document.createElement('iframe');
    loadingiframe.src = "about:blank";
    loadingiframe.id = 'loading-iframe';
    document.body.appendChild(loadingiframe);
    
    cachedPages[location.href] = $('knee').innerHTML;
});

//X/*/

var screenshotMinHeight = 230;

function givemax(one, two) {
    if (one > two) return one;
    else return two;
}

function showScreenshot(scr) {

    var olderscr = activeScreenshot.parentNode;
    var olderclasses = (olderscr.className+'').split(/\s+/);
    var oldernewclasses = [];
    for(var i = 0; i<olderclasses.length; i++) {
        var oldcls = olderclasses[i];
        log('class: ' + oldcls);
        if (oldcls != 'active') oldernewclasses.push(oldcls);
    }
    olderscr.className = oldernewclasses.join(' ');
    scr.parentNode.className += " active";
    log(scr);
    var rel = scr.getAttribute('rel');
    var dim = /^size(\d+)x(\d+)$/.exec(rel);
    var showst = $('inner-shower').style;
    showst.backgroundImage = "url('" + scr.href + "')";
    showst.width = dim[1]+"px";
    showst.height = givemax(dim[2],screenshotMinHeight)+"px";
    var cap = $('screenshot-caption');
    while (cap.childNodes.length > 0) cap.removeChild(cap.firstChild);
    cap.appendChild(document.createTextNode(scr.getAttribute('title')));
    activeScreenshot = scr;
    return false;
}

var activeScreenshot = null;

addEvent(window, 'load', function() {

//    return;
    
    if ($('screenshot-showcase') == null) return;
    
    var scsh = $('screenshot-showcase');
    
    var shower = document.createElement('div');
    shower.id = 'screenshot-shower';
    var innersh = document.createElement('div');
    innersh.id = 'inner-shower';
    innersh.innerHTML = "&nbsp;";
    shower.appendChild(innersh);
    var scrcap = document.createElement('strong');
    scrcap.id = 'screenshot-caption';
    shower.appendChild(scrcap);
    scsh.parentNode.appendChild(shower);
    
    var scrDef = screenshotDefault();
    
    var hasSetActive = false
    var i = 0;
    var linx = scsh.getElementsByTagName('A');
    for (i = 0; i<linx.length; i++) {
        var link = linx[i];
        var hr = link.getAttribute('href');
        if (hr != null && hr != '') {
            link.setAttribute('onclick','return showScreenshot(this)');
//            link.setAttribute('href','#');
            if (!hasSetActive && hr == scrDef) {
                link.className += " active";
                activeScreenshot = link;
                showScreenshot(link);
                hasSetActive = true;
            }
        }
    }
    scsh.childNodes[0].style.width = ((80*i)+((i-1)*10))+'px';


});

addEvent(window, 'load', function() {

//    return;

	var wematch = function(wherein, str) {
		return (wherein.toLowerCase().indexOf(str.toLowerCase()) != -1);
	}
	
	var platformmatch = function(str) {
		return wematch(navigator.platform, str);
	}
	
	var browsermatch = function(str) {
		var x = wematch(navigator.userAgent, str);
		//alert('browser' + navigator.userAgent + ", " + str + "=======" + x);
		return x;
	}
	
	var dept = metaWithName('x-wafflesoftware-dept');
	
	if (dept != null && dept.getAttribute('content') == 'content') return;



	var kind = null;

	if ((platformmatch('macppc') || platformmatch('macintosh')) && (!browsermatch('os x') && !browsermatch('osx'))) {
		kind = 'os9';
	}
		
	if (platformmatch('mac') && kind == null)
		return;
	
	if (platformmatch('win'))
		kind = 'windows';
		
	if (platformmatch('linux') || platformmatch('X11'))
		kind = 'linux';
		
	if (kind == null)
		kind = 'bsd';
		
	var texts = {
		'windows': "It looks like you're using Microsoft Windows. Please note that %product% will not work on any version of Microsoft Windows and is only available for Mac OS X.",
		'linux': "It looks like you're using a Linux distribution. Please note that %product% will not work on any Linux distribution and is only available for Mac OS X.",
		'bsd': "It looks like you're using a BSD-based operating system. Please note that %product% will not work on any version of BSD and is only available for Mac OS X.",
		'os9': "It looks like you're using Mac&nbsp;OS 9 or older. Please note that %product% will not work on any version of Mac&nbsp;OS earlier than Mac OS X."
	};
		
	/*  <div id="using-diff-os" class="using-windows"></div>
    <div id="using-diff-os" class="using-linux"></div>
    <div id="using-diff-os" class="using-bsd"></div>
    <div id="using-diff-os" class="using-os9"></div> */
    
    var div = document.createElement('div');
    div.id = 'using-diff-os';
    div.innerHTML = texts[kind].replace('%product%', productName());
    div.className = 'using-' + kind;
    
    $('cap').parentNode.insertBefore(div, $('cap').nextSibling);

});


function getCookie( name ) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

function setCookie( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

function deleteCookie( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}