// Define FLOOKII Object
var FLOOKII = {};

// Create 'target' method
// Return the element where the event occured
FLOOKII.target = function (event) {

    if (event.srcElement) {
        return event.srcElement;
    }
    else if (event.target) {
        return event.target;
    }
    
    return false;

};

// Create 'addEvent' method
// Register event listeners in a cross browser fashion
FLOOKII.addEvent = function (elm, evType, fn, useCapture) {

    if (elm.addEventListener) {

        elm.addEventListener(evType, fn, useCapture);
        return true;

    }
    else if (elm.attachEvent) {

        var r = elm.attachEvent('on' + evType, fn);
        return r;

    }

    return true;
    
};

// Create 'getElementsByTagPropertyValue' method
// Get Elements by TagName by Property Type and Property Value
FLOOKII.getElementsByTagPropertyValue = function (tagname, property, value) {

    var elm   = document.getElementsByTagName(tagname),
        len   = elm.length,
        nodes = [],
        i,
        current_elm,
        prop;

    for (i = 0; i < len; i = i + 1) {
        current_elm = elm[i];
        for (prop in current_elm) {
            if (prop === property) {
                if (current_elm[prop] === value) {
                    nodes.push(current_elm); 
                    break;               
                } 
            } 
        }
    }

    return nodes;

};

// Create 'getElementsByClassName' method
// Get Elements by Class Name
FLOOKII.getElementsByClassName = function (classname) {

    var elm   = document.getElementsByTagName('*'),
        len   = elm.length,
        nodes = [],
        i;

    for (i = 0; i < len; i = i + 1) {
        if (elm[i].className.match(classname)) { 
            nodes.push(elm[i]);
        }
    }

    return nodes;

};

// Create 'getParentByClassName' method
// Get element parent with defined classname, cancel search after 'depth' iterations
FLOOKII.getParentByClassName = function (element, classname, depth) {

    var parent = element.parentNode,
        i;
             
    for (i = 0; i < depth; i = i + 1) {

        if (parent.className === classname) {
         
            return parent;
         
        }
   
        parent = parent.parentNode;
     
    }

    return false;

};

// Create 'getChildByTagName' method
// Get child element by tagname and index
FLOOKII.getChildByTagName = function (element, index, tagname) {

    var child = element.childNodes[index];
     
    if (child.tagName === tagname) {
        return child;
    }
     
    return false;

};

// Create 'alternateClass' method
// Returns function that alternately returns the classnames provided
FLOOKII.alternateClass = function (class1, class2) {

    var row_no     = 0,
        row_class  = [];
    row_class[0]   = class1;
    row_class[1]   = class2;
    
    // Create function to return the alternate class name
    function switch_classes() {
     
        if (row_no === 0) {
            row_no = 1;
            return row_class[row_no];
        }    
        else {
            row_no = 0;
            return row_class[row_no];
        }
    }
        
    return switch_classes;
        
};

// Create 'fireEvent' method
// Fire an event (i.e create a fake event)
FLOOKII.fireEvent = function (element, event_module, event) {

    var event_obj;
    
    if (document.createEvent) {
        event_obj = document.createEvent(event_module);
        event_obj.initEvent(event, true, true);
        element.dispatchEvent(event_obj);
        return true;
    }
    else if (document.createEventObject) {
        element.fireEvent('on' + event);
        return true;
    }

    return false;
    
};

// Create 'getIframeDocument' method
// Return content document from iframe element
FLOOKII.getIframeDocument = function (iframe) {

    if (iframe.contentDocument) {
        // Firefox, Opera
        return iframe.contentDocument;
    }
    else if (iframe.contentWindow) {
        // Internet Explorer
        return iframe.contentWindow.document;
    }
    
    return false;
    
};

// Create 'getComputedStyle' method
// Return computed style on element for defined attribute
FLOOKII.getComputedStyle = function (element, attribute) {

    var attribute_value;
    
    if (document.defaultView) {
        attribute_value = document.defaultView.getComputedStyle(element, '').getPropertyValue(attribute);
        return attribute_value.toString(); 
    }
    else {
        attribute_value = element.currentStyle[attribute];
        if (typeof attribute_value !== 'string' || attribute_value === 'auto' && attribute.match('(height|width)')) {
            attribute = attribute === 'height' ? 'clientHeight' : 'clientWidth';
            attribute_value = element[attribute];
        }
        return attribute_value.toString();
    }
    
    return false;
};
