﻿if (!SAINTRYN)
    var SAINTRYN = {};

//selectors 
SAINTRYN.$ = function (element) {
    if (typeof element == 'string'){
		element = document.getElementById(element);
	}
    return element;
}

SAINTRYN.$$ = function(nodeTree, className) {
	nodeTree = SAINTRYN.$(nodeTree);
	
    var localArray = new Array();
    
    if(nodeTree == null) return false;
    for (var iLoopA = 0; iLoopA < nodeTree.childNodes.length; iLoopA++) {
        if (nodeTree.childNodes[iLoopA].nodeType == 1) {
            if (nodeTree.childNodes[iLoopA].className != undefined) {
                if (SAINTRYN.HasClass(nodeTree.childNodes[iLoopA], className)) {
                    localArray[localArray.length] = nodeTree.childNodes[iLoopA];
                }
            }
            var recursiveSearch = SAINTRYN.$$(nodeTree.childNodes[iLoopA], className);
            if (recursiveSearch.length > 0) {
                for (var iLoopB = 0; iLoopB < recursiveSearch.length; iLoopB++) {
                    localArray.push(recursiveSearch[iLoopB]);
                }
            }
        }
    }

    return localArray;
}

// event management
SAINTRYN.BindEvent = function(targetElement, eventType, eventCallback) {
	if (SAINTRYN.$(targetElement)) {
		targetElement = SAINTRYN.$(targetElement);
		targetElement[eventType] = function(e) {
			if (!e) {
				var e = window.event;
				if (!e.currentTarget) e.currentTarget = this;
			}
			return eventCallback.call(this, e);
		}
	} else {
		//alert('could not find element to attach event!');
		return false;
	}
}
SAINTRYN.ClearEvent = function(targetElement, eventType) {
	targetElement = SAINTRYN.$(targetElement);
	targetElement[eventType] = null;
}
SAINTRYN.BindClick = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onclick', eventCallback);
}
SAINTRYN.BindMouseOver = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onmouseover', eventCallback);
}
SAINTRYN.BindMouseOut = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onmouseout', eventCallback);
}

// css class management
SAINTRYN.ClassSwitcher = function(myAction, element, c1, c2) {
	return _ClassSwitcher(myAction, SAINTRYN.$(element), c1, c2);
}
SAINTRYN.AddClass = function(element, c1) {
	element = SAINTRYN.$(element);
	if (!SAINTRYN.HasClass(element, c1)) {
		element.className += element.className ? ' ' + c1 : c1;
	}
}
SAINTRYN.RemoveClass = function(element, c1) {
	element = SAINTRYN.$(element);
	var rep = element.className.match(' ' + c1) ? ' ' + c1 : c1;
	element.className = element.className.replace(rep, '');
}
SAINTRYN.HasClass = function(element, c1) {
	element = SAINTRYN.$(element);
	return new RegExp('\\b' + c1 + '\\b').test(element.className);
}
SAINTRYN.ToggleClass = function(element, c1) {
	element = SAINTRYN.$(element);
	if (SAINTRYN.HasClass(element, c1)) {
		SAINTRYN.RemoveClass(element, c1);
	} else {
		SAINTRYN.AddClass(element, c1);
	}
}
SAINTRYN.SwapClass = function(element, c1, c2) {
	element = SAINTRYN.$(element);
	element.className = !SAINTRYN.HasClass(element, c1) ? element.className.replace(c2, c1) : element.className.replace(c1, c2);
}

// Facebook animation management class
SAINTRYN.AnimationManager = function() {

    function _Scroll(subject, toPos, options) {
        var scrollLeft = parseInt(subject.scrollLeft);
        var change = toPos - scrollLeft;

        var total = scrollLeft + Math.ceil((change / 1.5));

        if (change == -1)
            change = 0;

        subject.scrollLeft = total;
        function recursiveRepeat() {
            _Scroll(subject, toPos, options);
        }
        if (change == 0) {
            //done
            options.completedCallback(options.completedCallbackTarget);
            clearTimeout(timer);
            return;
        }
        var timer = setTimeout(recursiveRepeat, 100);
    }

    function _Fade(subject, toOpacity, timeEffectFrequency) {
        var currentOpacity = subject.style.opacity * 100;
        var change = toOpacity - currentOpacity;
        var total = currentOpacity + Math.ceil((change / 2));

        if (change == -1)
            change = 0;

        subject.style.opacity = total / 100;
        function recursiveRepeat() {
            _Fade(subject, toOpacity, timeEffectFrequency);
        }
        if (change == 0) {
            clearTimeout(timer);
            return;
        }
        timer = setTimeout(recursiveRepeat, 100);

    }

    return {
        Scroll: function(subject, toPos, options) {
            _Scroll(subject, toPos, options);
            
        },
        Fade: function(subject, toOpacity, timeEffectFrequency) {
            _Fade(subject, toOpacity, timeEffectFrequency);
        }
    }
} ();


SAINTRYN.fireEvent = function(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}
