Cramer = {}
Cramer.Behavior = (function(){
function init() {
    if (arguments.callee.done) return;
    arguments.callee.done = true;
    if (_timer) clearInterval(_timer);

//YOUR INIT CODE GOES HERE


//bug fix for background image flickers in Internet Explorer
/*@cc_on @*/
/*@if (@_win32)
	document.execCommand("BackgroundImageCache", false, true);  
/*@end @*/

};
if (document.addEventListener) {
    document.addEventListener("DOMContentLoaded", init, false);
};
/*@cc_on @*/
/*@if (@_win32)
    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
    var script = $("__ie_onload");
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            init(); // call the onload handler
        }
    };
/*@end @*/
if (/WebKit/i.test(navigator.userAgent)) { // sniff
    var _timer = setInterval(function() {
        if (/loaded|complete/.test(document.readyState)) {
            init(); // call the onload handler
        }
    }, 10);
};
window.onload = init;

function $() {
	var elements = [];
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
		if (arguments.length == 1)
			return element;
		elements.push(element);
	}
	return elements;
};
function insertAfter(parent, node, referenceNode) {
      parent.insertBefore(node, referenceNode.nextSibling);
};
function preloadImages(){
	var pics = [];
	for(var i=0;i<arguments.length;i++){
        pics[i]=new Image();
        pics[i].src=arguments[i];
		}
};
function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return [curleft,curtop];
};
function getElementsByClass(theclass,node,tag) {
    var classElements = [];
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+theclass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
	return classElements;
};
function ajax( options ) {
    options = {
        type: options.type || "POST",
        url: options.url || "",
        timeout: options.timeout || 5000,
        onComplete: options.onComplete || function(){},
        onError: options.onError || function(){},
        onSuccess: options.onSuccess || function(){},
        data: options.data || ""
    };
	if ( typeof XMLHttpRequest == "undefined" )
    	XMLHttpRequest = function(){
        	return new ActiveXObject(
            	navigator.userAgent.indexOf("MSIE 5") >= 0 ? "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
        );
    };
	var xml = new XMLHttpRequest();
    xml.open(options.type, options.url, true);
    var requestDone = false;
    setTimeout(function(){
         requestDone = true;
    }, options.timeout);
    xml.onreadystatechange = function(){
        if ( xml.readyState == 4 && !requestDone ) {
            if ( httpSuccess( xml ) ) {
                options.onSuccess( httpData( xml, options.data ) );
            } else {
                options.onError();
            }
            options.onComplete();
            xml = null;
        }
    };
    xml.send();
    function httpSuccess(r) {
        try {
            return !r.status && location.protocol == "file:" ||
                ( r.status >= 200 && r.status < 300 ) ||
                r.status == 304 ||
                navigator.userAgent.indexOf("Safari") >= 0 && typeof r.status == "undefined";
        } catch(e){}
        return false;
    }
    function httpData(r,type) {
    	switch (type) {
			case  "xml" :
				data=r.responseXML;
				break;
			case "script" :
				data=eval(r.responseText);
				break;
			case "text" :
				data=r.responseText;
				break;				
			default:
				data=r.responseText;
				break;				
			}
       return data;
    }
};
function getFirstChild(element) {
    element = element.firstChild;
    return element && element.nodeType != 1 ? nextSibling(element) : element;
};
function getPreviousSibling(element) {
    do {
        element = element.previousSibling;
    } while ( element && element.nodeType != 1 );
    return element;
};
function getNextSibling(element) {
    do {
        element = element.nextSibling;
    } while ( element && element.nodeType != 1 );
    return element;
};
function getLastChild(element) {
   element = elem.lastChild;
    return element && element.nodeType != 1 ? prevSibling(element) : element;
};

function addEvent(element, type, handler) {
	if (!handler.$$guid) handler.$$guid = addEvent.guid++;
	if (!element.events) element.events = {};
	var handlers = element.events[type];
	if (!handlers) {
		handlers = element.events[type] = {};
		if (element["on" + type]) {
			handlers[0] = element["on" + type];
		}
	}
	handlers[handler.$$guid] = handler;
	element["on" + type] = handleEvent;
};
addEvent.guid = 1;
function removeEvent(element, type, handler) {
	if (element.events && element.events[type]) {
		delete element.events[type][handler.$$guid];
	}
};
function handleEvent(event) {
	var returnValue = true;
	event = event || fixEvent(window.event);
	var handlers = this.events[event.type];
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		if (this.$$handleEvent(event) === false) {
			returnValue = false;
		}
	}
	return returnValue;
};
function fixEvent(event) {
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};
function addClass(element, className) {
    if (!hasClass(element, className)) {
      element.className += (element.className ? " " : "") + className;
    }
};
  
function hasClass(element, className) {
    var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)");
    return regexp.test(element.className);
};

function removeClass(element, className) {
    var regexp = new RegExp("(^|\\s)" + className + "(\\s|$)", "g");
    element.className = trim(element.className.replace(regexp, "$2"));
};

function toggleClass(element, className) {
    if (hasClass(element, className)) {
      removeClass(element, className);
    } else {
      addClass(element, className);
    }
};
function getText(e) {
    var t = "";
	e = e.childNodes || e;
	for ( var j = 0; j < e.length; j++ ) {
        t += e[j].nodeType != 1 ?
            e[j].nodeValue : text(e[j].childNodes);
    }
    return t;
};
// http://blog.stevenlevithan.com/archives/faster-trim-javascript
function trim(string) {
  return string.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};
//PRIVATE SITE SPECIFIC FUNCTIONS GO HERE

	return {
//PUBLIC METHODS AND ATTRIBUTES GO HERE
// IN THE RETURNED OBJECT
		//Methods look like this
		//method1 : function(){ alert(method1")},
		//called Cramer.Behavior.method1();
		//Attrributes look like this
		//attribute1 : value,
		//accessed as Cramer.Behavior.attribute1
	};
})();

