//*************************

function generateUid() {
	var uid = ++gUniqueIdBase;
	return "uig_"+uid;
}

//*******************************


/*
Object.dump = function () {
	var dump = "";
	for (var attr in this) {
		if (attr != "dump") {
			dump += " "+attr+": "+this[attr];
		}
	}
	return dump;
}
*/

//*******************************



function registerAllSubWidgets(rootElem) {	
	var allElems = rootElem.getElementsByTagName("*");
	var ii;
	var length = allElems.length;
	var regExp = new RegExp("^widget_([^ ]+)");
	var newWidgets = [];
	
	function registerIfWidget(curElem) {
		try {
			var className = curElem.className;
			if (className) {
				var widgetId = curElem.id;
				var match = regExp.exec(className);
				var widgetName = null;
				if (match) {
					widgetName = match[1];
				} else if (gWidgetParams[widgetId]) {
					widgetName = getAndClearWidgetParam(widgetId,"constructor");
					if (!widgetName) {
						widgetName = "DowWidget";
					}
				}
				
				if (widgetName) {
					var newWidget = gWidgets[widgetId];
					if (!newWidget) {
						newWidget = DowWidget.newWidget(widgetId , widgetName);
						gWidgets[widgetId]=newWidget;
					}
					newWidgets.push(newWidget);
				}
			}
		} catch (ex) {
			alert("registerIfWidget: "+curElem + " -> "+ex);
			throw ex;
		}
	}
	
	
	registerIfWidget(rootElem);
	for (ii=0; ii<length ; ii++ ) {
		var curElem = allElems.item(ii);
		if (curElem) { //because getAndClearWidgetParam removes script Elements after the list was generated with this and curElem can be null
			registerIfWidget(curElem);
		}
	}
	
	for (var index=0 ; index<newWidgets.length ; index++) {
		var curWidget = newWidgets[index];
		if (curWidget.postInit) {
			curWidget.postInit(); //for when you need the other widgets already initialized
		}
	}
}

function registerAllWidgets() {	
	try {
		registerAllSubWidgets(document.documentElement);
	} catch(ex) {
		alert(ex);
	}
}

if (!window.addEventListener) {
	window.addEventListener = function(name, callback , capture) {
		window.attachEvent("on"+name,callback);
	}
}

if(!window.Node){  //IE6
    Node = {ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5,  ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12};
};

if(!window.XMLHttpRequest){  //IE6
	XMLHttpRequest = function() {
		return new ActiveXObject("Microsoft.XMLHTTP");
	};
};
	
function on_window_load() {
	//alert("on_window_load");
	registerAllWidgets();
}

//window.addEventListener("load", on_window_load, false);

var gWidgets = {};
var gUniqueIdBase = 1000;
var gWidgetParams = {};

function clearWidgetParam(uid) {
	gWidgetParams[uid] = {};
	var widget = gWidgets[uid];
	if (widget) {
		//widget.destructor ?
		gWidgets[uid] = null;
	}
}

function registerWidgetParam(uid , name , value) {
	if (!gWidgetParams[uid]) {
		clearWidgetParam(uid);
	}
	gWidgetParams[uid][name]=value;
}

function getAndClearWidgetParam(uid , name) {
	var value = gWidgetParams[uid][name];
/*   NO id allowed in SCRIPT element!!!
	var scriptElem = document.getElementById("script_"+uid+"_"+name);
	if (scriptElem && scriptElem.parentNode) {
		scriptElem.parentNode.removeChild(scriptElem);
	}
*/	
	return value;
}

function addJSStyleSheet() {
	//var cssStr = ".hidewhenjs {display: none;}";
	var cssStr = ".hidewhenjs {visibility: hidden;}"; //so we can get image width in IE6
	var textElem=document.createTextNode(cssStr);

	var styleElem=document.createElement("style");
	styleElem.type = 'text/css';
	
	if(styleElem.styleSheet){// IE
		styleElem.styleSheet.cssText = cssStr;
	} else {// w3c
		styleElem.appendChild(textElem);
	}
	
	var headElem = document.getElementsByTagName('head').item(0);
	headElem.appendChild(styleElem);
}


addJSStyleSheet();




