//
// ZEN LIBRARY
// Copyright 2009, ZenWebware
// www.zenwebware.com
//


//
// Javascript extension functions.
//
document.getElementsByClassName = function(cl) {
    var retnode = [];
    var myclass = new RegExp('\\b' + cl + '\\b');
    var elem = this.getElementsByTagName('*');
    for(var i = 0; i < elem.length; i++) {
        var classes = elem[i].className;
        if(myclass.test(classes)) retnode.push(elem[i]);
    }
    return retnode;
}; 


//
// Window helper functions.
//
function f_clientWidth() {
    return f_filterResults (
    	window.innerWidth ? window.innerWidth : 0,
    	document.documentElement ? document.documentElement.clientWidth : 0,
    	document.body ? document.body.clientWidth : 0
    );
}


function f_clientHeight() {
    return f_filterResults (
    	window.innerHeight ? window.innerHeight : 0,
    	document.documentElement ? document.documentElement.clientHeight : 0,
    	document.body ? document.body.clientHeight : 0
    );
}


function f_scrollLeft() {
    return f_filterResults (
    	window.pageXOffset ? window.pageXOffset : 0,
    	document.documentElement ? document.documentElement.scrollLeft : 0,
    	document.body ? document.body.scrollLeft : 0
    );
}


function f_scrollTop() {
    return f_filterResults (
    	window.pageYOffset ? window.pageYOffset : 0,
    	document.documentElement ? document.documentElement.scrollTop : 0,
    	document.body ? document.body.scrollTop : 0
    );
}


function f_filterResults(n_win, n_docel, n_body) {
    var n_result = n_win ? n_win : 0;
    if (n_docel && (!n_result || (n_result > n_docel)))
    	n_result = n_docel;
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}


function page_width() {
    if(window.innerHeight && window.scrollMaxY) { // Firefox
        return window.innerWidth + window.scrollMaxX;
    } else if(document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        return document.body.scrollWidth;
    } else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
        return document.body.offsetWidth + document.body.offsetLeft;
    }
}


function page_height() {
    if(window.innerHeight && window.scrollMaxY) { // Firefox
        return window.innerHeight + window.scrollMaxY;
    } else if(document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        return document.body.scrollHeight;
    } else { // works in Explorer 6 Strict, Mozilla (not FF) and Safari
        return document.body.offsetHeight + document.body.offsetTop;
    }
}


//
// Cookie functions.
//
function save_cookie(name, value) {
    document.cookie = name + "='" + value + "'";
}


function load_cookie(name) {
    var cookie_str = document.cookie;
    var start_pos = cookie_str.indexOf(name);
    if(start_pos != -1) {
        start_pos = start_pos + name.length + 2;
        var end_pos = cookie_str.indexOf("'", start_pos);
        return cookie_str.substring(start_pos, end_pos);
    } else {
        return false;
    }
}


//
// Scroll functions.
//
function save_scroll_position() {
    save_cookie("scroll_position", f_scrollTop());
}


function load_scroll_position() {
    scroll_pos = load_cookie("scroll_position");
    if(scroll_pos) {
    	window.pageYOffset ? window.pageYOffset = scroll_pos : 0,
    	document.documentElement ? document.documentElement.scrollTop = scroll_pos : 0,
    	document.body ? document.body.scrollTop = scroll_pos : 0
    }
}

