﻿
function _ggp_add_event(o, ev, f, c) {

    if (c == undefined) c = false;
    if (o.attachEvent) {
        o.attachEvent('on' + ev, f);
    } else if (o.addEventListener) {
        o.addEventListener(ev, f, c);
    }
}

function _ggp_get_event_element(e) {

    if (!e) var e = window.event;

    if (e.target) t = e.target;
    else if (e.srcElement) t = e.srcElement;

    if (t.nodeType == 3) t = t.parentNode;

    return t;
}

function _ggp_get_style_value(el, prop){
	var val = el.style[prop] || false;
	if (!val) {
		if (document.defaultView) 
		    val = document.defaultView.getComputedStyle(el,null).getPropertyValue(prop);
		else if (el.currentStyle) 
		    val = el.currentStyle[prop];
	}	    
    return val;
}

function _ggp_previous_html_element(element) {

    while (element && element.previousSibling) {
        element = element.previousSibling;
        if (element && element.nodeType == 1) {
            return element;
        }
    }
}

function _ggp_get_elements(obj, names, filter) {

    var elements = new Array();
    for (var i = 0; i < names.length; i++) {
        var tags = obj.getElementsByTagName(names[i]);
        for (var j = 0; j < tags.length; j++) {
        	if(!filter || filter(tags[j]))
            	elements.push(tags[j]);
        }
    }
    var testNode = elements[0];
    if (!testNode) return [];
    if (testNode.sourceIndex) {
        elements.sort(function(a, b) {
            return a.sourceIndex - b.sourceIndex;
        });
    }
    else if (testNode.compareDocumentPosition) {
        elements.sort(function(a, b) {
            return 3 - (a.compareDocumentPosition(b) & 6);
        });
    }
    return elements;
}

function _ggp_get_single_element(obj, names, filter) {
	var elements = _ggp_get_elements(obj, names, filter);
	return elements && elements.length ? elements[0] : null;
}

function _ggp_get_element_info(el) {

    var t = el.offsetTop;
    var l = el.offsetLeft;
    var b = el.offsetHeight;
    var r = el.offsetWidth;

    if (el.style && el.style.position == 'absolute') {
        t = el.style.top;
        l = el.style.left;
    } else {
        while (el.offsetParent != null) {
            el = el.offsetParent;
            t += el.offsetTop;
            l += el.offsetLeft;
        }
    }

    return { top: t, left: l, bottom: t + b, right: l + r };
}

if (GGP == undefined) var GGP = {};

GGP.Window = function() {
    return {
        getAll: function() {
            return [this.getHeight(), this.getWidth(), this.getScrollY(), this.getScrollX()];
        }
        , getInfo: function(noquirks) {
            return { height: this.getHeight(this.min, noquirks), width: this.getWidth(this.min, noquirks),
                     scrollY: this.getScrollY(this.min, noquirks), scrollX: this.getScrollX(this.min, noquirks)
                    };
        }
        , getHeight: function(filter, noquirks) {
            if (!filter) filter = this.min;
            return filter(
                                window.innerHeight ? window.innerHeight : 0,
                                document.documentElement ? document.documentElement.clientHeight : 0,
                                document.body && !noquirks ? document.body.clientHeight : 0
                            );
        }
        , getWidth: function(filter, noquirks) {
            if (!filter) filter = this.min;
            return filter(
		                        window.innerWidth ? window.innerWidth : 0,
		                        document.documentElement ? document.documentElement.clientWidth : 0,
		                        document.body && !noquirks ? document.body.clientWidth : 0
                            );
        }
        , getScrollY: function(filter) {
            if (!filter) filter = this.min;
            return filter(
		                        window.pageYOffset ? window.pageYOffset : 0,
		                        document.documentElement ? document.documentElement.scrollTop : 0,
		                        document.body ? document.body.scrollTop : 0
                            );
        }
        , getScrollX: function(filter) {
            if (!filter) filter = this.min;
            return filter(
		                        window.pageXOffset ? window.pageXOffset : 0,
		                        document.documentElement ? document.documentElement.scrollLeft : 0,
		                        document.body ? document.body.scrollLeft : 0
                            );
        }
        , max: function(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;
        }
        , min: function(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;
        }
    };
} ();

