﻿
Type.registerNamespace("CodeEffects.Core");
CodeEffects.Core.defined = function(el){return typeof(el)!="undefined" && el != null && el != "NaN";};
CodeEffects.Core.innerTextSupported = function(){return CodeEffects.Core.defined(document.getElementsByTagName("BODY")[0].innerText);};
CodeEffects.Core.getElementText = function(el){return CodeEffects.Core.innerTextSupported() ? el.innerText : el.textContent;};
CodeEffects.Core.write = function(el,text){if(CodeEffects.Core.innerTextSupported())el.innerText = text;else el.textContent = text;};
CodeEffects.Core.ie = function(){return navigator.appName && navigator.appName.toLowerCase().indexOf("explorer") > -1;};
CodeEffects.Core.toggle = function(el){el.style.display=el.style.display=="none"?"":"none";};
CodeEffects.Core.sanitize = function(str){return str.replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace("\"","&quot;");};
CodeEffects.Core.desanitize = function(str){return str.replace("&lt;","<").replace("&gt;",">").replace("&quot;","\"").replace("&amp;","&");};
CodeEffects.Core.cutOff = function(str,max){if(str.length <= max)return str;return str.substr(0,max)+"...";};
CodeEffects.Core.highlight = function(el){el.style.backgroundColor = "#ffff91";};
CodeEffects.Core.dim = function(el){el.style.backgroundColor = "";};
CodeEffects.Core.getDdlTextByValue = function(ddl,value){for(var i in ddl.options)if(ddl.options[i].value == value)return ddl.options[i].text;return value;};
CodeEffects.Core.getDdlSelectedValue = function(ddl){if(!CodeEffects.Core.defined(ddl) || !CodeEffects.Core.defined(ddl.options) || ddl.selectedIndex == -1)return null;return ddl.options[ddl.selectedIndex].value;};
CodeEffects.Core.getDdlSelectedText = function(ddl){if(!CodeEffects.Core.defined(ddl) || !CodeEffects.Core.defined(ddl.options) || ddl.selectedIndex == -1)return null;return ddl.options[ddl.selectedIndex].text;};
CodeEffects.Core.addOptionToDdl = function(ddl,text,value){var opt = document.createElement("OPTION");opt.text = text;opt.value = value;ddl.options.add(opt);};
CodeEffects.Core.selectDdlOptionByValue = function(ddl,value){CodeEffects.Core.selectDdlOption(ddl,value,true);};
CodeEffects.Core.selectDdlOptionByText = function(ddl,text){CodeEffects.Core.selectDdlOption(ddl,text,false);};
CodeEffects.Core.selectDdlOption = function(ddl,comparison,isValue)
{
	if(!CodeEffects.Core.defined(ddl) || !CodeEffects.Core.defined(ddl.options) || ddl.options.length == 0)return;
	var selected = false;
	for(var i=0;i<ddl.options.length;i++)
	{
		if((!isValue && ddl.options[i].text == comparison) || (isValue && ddl.options[i].value == comparison))
		{
			ddl.selectedIndex = i;
			selected = true;
			break;
		}
	}
	if(!selected)ddl.selectedIndex = 0;
};
CodeEffects.Core.emptyDdl = function(ddl,addEmptyOption)
{
	for(var i=ddl.options.length-1;i>=0;i--)ddl.options[i] = null;
	if(ddl.childNodes && ddl.childNodes.length > 0)ddl.innerHTML = "";
	if(addEmptyOption)CodeEffects.Core.addOptionToDdl(ddl,"--","");
};
CodeEffects.Core.fillNumericDdl = function(ddl,start,limit,addLeadingZero)
{
	for(var i=start-1;i<limit;i++)
	{
		var n = i+1;
		var text = addLeadingZero && n < 10 ? "0"+n : n;
		CodeEffects.Core.addOptionToDdl(ddl,text,n);
	}
};
CodeEffects.Core.getCoordinates = function(ev)
{
	ev = ev || window.event;
	if(ev.pageX || ev.pageY){return {x:ev.pageX, y:ev.pageY};}
	return {
		x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.body.scrollTop  - document.body.clientTop
	};
};
CodeEffects.Core.getScrollBarWidth = function()
{
	var inner = document.createElement("DIV");
	inner.style.width = "100%";
	inner.style.height = "200px";
	var outer = document.createElement("DIV");
	outer.style.position = "absolute";
	outer.style.top = outer.style.left = "0px";
	outer.style.width = "200px";
	outer.style.height = "150px";
	outer.style.visibility = outer.style.overflow = "";
	outer.appendChild(inner);
	document.body.appendChild(outer);
	var w1 = inner.offsetWidth;
	outer.style.overflow = "scroll";
	var w2 = inner.offsetWidth;
	if(w1 == w2)w2 = outer.clientWidth;
	document.body.removeChild(outer);
	return w1-w2;
}
CodeEffects.Core.getElementWidth = function(el)
{
	if(CodeEffects.Core.defined(el.offsetWidth) && el.offsetWidth > 0)return el.offsetWidth;
	if(CodeEffects.Core.defined(el.style.pixelWidth) && el.style.pixelWidth > 0)return el.style.pixelWidth;
	if(CodeEffects.Core.defined(el.style.posWidth) && el.style.posWidth > 0)return el.style.posWidth;
	if(CodeEffects.Core.defined(el.style.width) && el.style.width.length > 0)return parseInt(el.style.width.substr(0,el.style.width.length-2));
	return 0;
}
CodeEffects.Core.getElementHeight = function(el)
{
	if(CodeEffects.Core.defined(el.offsetHeight) && el.offsetHeight > 0)return el.offsetHeight;
	if(CodeEffects.Core.defined(el.style.pixelHeight) && el.style.pixelHeight > 0)return el.style.pixelHeight;
	if(CodeEffects.Core.defined(el.style.posHeight) && el.style.posHeight > 0)return el.style.posHeight;
	if(CodeEffects.Core.defined(el.style.height) && el.style.height.length > 0)return parseInt(el.style.height.substr(0,el.style.height.length-2));
	return 50;
}
CodeEffects.Core.getWindowDimensions = function()
{
    var h = 0,w = 0;
    if(self.innerHeight)
    {
       h = window.innerHeight;
       w = window.innerWidth;
    } 
    else
    {
        if(document.documentElement && document.documentElement.clientHeight)
        {
            h = document.documentElement.clientHeight;
            w = document.documentElement.clientWidth;
        }
        else
        {
            if(document.body)
            {
                h = document.body.clientHeight;
                w = document.body.clientWidth;
            }
        }
    }
    return {
        height: parseInt(h,10),
        width: parseInt(w,10)
    };
};
CodeEffects.Core.centerElement = function(el)
{
	var w = CodeEffects.Core.getWindowDimensions();
    var left = w.width == 0 ? 50 : parseInt((w.width - CodeEffects.Core.getElementWidth(el))/2,10);
    var top = w.height == 0 ? 50 : parseInt((w.height - CodeEffects.Core.getElementHeight(el))/2,10);
    el.style.left = left+"px";
    el.style.top = top+"px";
    w=left=top=null;
};
CodeEffects.Core.getScrollWidth = function()
{
   var w = window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft;
   return w ? w : 0;
};
CodeEffects.Core.getScrollHeight = function()
{
   var h = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
   return h ? h : 0;
};
CodeEffects.Core.getKey = function(keyEvent)
{
	var k = null;
	if(CodeEffects.Core.defined(keyEvent))
	{
		if(keyEvent.keyCode)k = keyEvent.keyCode;
		else if(typeof(keyEvent.which)!= 'undefined') k = keyEvent.which;
		return k;
	}
	else return window.event.keyCode;
};
CodeEffects.Core.getParentByTagName = function(el,tagName,val)
{
	if(!CodeEffects.Core.defined(val))val = 0;
	if(val > 0 && el.tagName && el.tagName == tagName)return el;
	if(CodeEffects.Core.defined(el.parentNode))return CodeEffects.Core.getParentByTagName(el.parentNode,tagName,++val);
	return null;
};
CodeEffects.Core.getChildrenByTagName = function(el,tagName,includeSubChildren)
{
	var children = [],node;
	if(el.childNodes)
	{
		for(var i=0;i<el.childNodes.length;i++)
		{
			node = el.childNodes[i];
			if(node.tagName && node.tagName == tagName)children.push(node);
			if(includeSubChildren && node.childNodes && node.childNodes.length > 0)
			{
				var c = CodeEffects.Core.getChildrenByTagName(node,tagName,includeSubChildren);
				for(var j in c)children.push(c[j]);
			}
		}
	}
	return children;
};
CodeEffects.Core.getParentByAttribute = function(el,attribute,value)
{
	if(!CodeEffects.Core.defined(el))return null;
	if(el.getAttribute && CodeEffects.Core.defined(el.getAttribute(attribute)) && (!CodeEffects.Core.defined(value) || el.getAttribute(attribute) == value))return el;
	if(CodeEffects.Core.defined(el.parentNode))return CodeEffects.Core.getParentByAttribute(el.parentNode,attribute,value);
	return null;
};
CodeEffects.Core.getChildrenByAttribute = function(el,attribute,value)
{
	var children = [],node,attr;
	for(var i=0;i<el.childNodes.length;i++)
	{
		node = el.childNodes[i];
		if(node.tagName && node.getAttribute)
		{
			attr = node.getAttribute(attribute);
			if(attr && (!CodeEffects.Core.defined(value) || attr == value))children.push(node);
		}
		if(node.childNodes.length > 0)
		{
			var c = CodeEffects.Core.getChildrenByAttribute(node,attribute,value);
			for(var j in c)children.push(c[j]);
		}
	}
	return children;
};
CodeEffects.Core.getSource = function(url,callback,exCallback)
{
	try
	{
		var r = new Sys.Net.WebRequest();
		r.set_httpVerb("GET");
		r.set_url(url);
		r.add_completed(function(e){if(e.get_responseAvailable())callback(e.get_responseData());});
		var e = new Sys.Net.XMLHttpExecutor();
		r.set_executor(e);
		e.executeRequest();
	}
	catch(e){if(CodeEffects.Core.defined(exCallback))exCallback(e);}
};
CodeEffects.Core.getCode = function(url,jsName,callback)
{
	var head = document.getElementsByTagName("HEAD")[0];
	var ss = CodeEffects.Core.getChildrenByTagName(head,"SCRIPT",false);
	for(var i in ss){if(ss[i].src == url){callback();return;}}
	var s = document.createElement("SCRIPT");
	s.type="text/javascript";
	var tt = null;
	if(CodeEffects.Core.ie())avail();
	else s.onload = function(e){callback();}
	s.src = url;
	head.appendChild(s);
	function avail()
	{
		if(CodeEffects.Core.defined(tt) && typeof(jsName) == "string" && eval("typeof("+jsName+")") == "function")
		{
			window.clearInterval(tt);
			tt = null;
			callback();
			return;
		}
		else
		{
			window.clearInterval(tt);
			tt = window.setInterval(function(){avail();},120);
		}
	};
};
CodeEffects.Core.globalize = function(container,labels)
{
	if(!CodeEffects.Core.defined(labels) || labels.length == 0 || !CodeEffects.Core.defined(container))return;
	var child,txt,att;
	var ATTR_GLOBALIZATION = "attrGlobalVal",ATTR_GLOBAL_TITLE = "attrGlobalTitle";
	for(var i in container.childNodes)
	{
		child = container.childNodes[i];
		if(child.tagName)
		{
			switch(child.tagName)
			{
				case "TD":
				case "TH":
				case "SPAN":
				case "LABEL":
				case "A":
					att = child.getAttribute(ATTR_GLOBALIZATION);
					if(!CodeEffects.Core.defined(att))txt = CodeEffects.Core.getElementText(child);
					else txt = att;
					if(txt.length == 4)
					{
						CodeEffects.Core.write(child,getLabel(txt,labels));
						if(!CodeEffects.Core.defined(att))child.setAttribute(ATTR_GLOBALIZATION,txt);
					}
					setTitle(child,labels);
					break;
				case "IMG":
				case "SELECT":
					setTitle(child,labels);
					break;
				case "INPUT":
					setTitle(child,labels);
					if(child.type == "button" || child.type == "submit")
					{
						att = child.getAttribute(ATTR_GLOBALIZATION);
						if(!CodeEffects.Core.defined(att))txt = child.value;
						else txt = att;
						if(txt.length == 4)
						{
							child.value = getLabel(txt,labels);
							if(!CodeEffects.Core.defined(att))child.setAttribute(ATTR_GLOBALIZATION,txt);
						}
						setTitle(child,labels);
					}
					break;
				case "OPTION":
					if(child.text)
					{
						att = child.getAttribute(ATTR_GLOBALIZATION);
						if(!CodeEffects.Core.defined(att))txt = child.text;
						else txt = att;
						if(txt.length == 4)
						{
							child.text = getLabel(txt,labels);
							if(!CodeEffects.Core.defined(att))child.setAttribute(ATTR_GLOBALIZATION,txt);
						}
					}
					break;
			}
		}
		if(CodeEffects.Core.defined(child.childNodes) && child.childNodes.length > 0)CodeEffects.Core.globalize(child,labels);
	}
	function setTitle(el,ls)
	{
		if(!el.title)return;
		var tt,t = el.getAttribute(ATTR_GLOBAL_TITLE);
		if(!CodeEffects.Core.defined(t))tt = el.title;else tt = t;
		if(tt.length == 4)
		{
			el.title = getLabel(tt,ls);
			if(!CodeEffects.Core.defined(t))el.setAttribute(ATTR_GLOBAL_TITLE,tt);
		}
	};
	function getLabel(tg,ls){return CodeEffects.Core.defined(ls[tg])?ls[tg]:tg;};
};
CodeEffects.Core.toUtcDate = function(localDateString)
{
	var localDate = new Date(localDateString);
	return new Date(localDate.getUTCFullYear(),localDate.getUTCMonth(),localDate.getUTCDate(),localDate.getUTCHours(),localDate.getUTCMinutes(),localDate.getUTCSeconds());
};
CodeEffects.Core.getUTCDate = function(){return CodeEffects.Core.toUtcDate(new Date());};
CodeEffects.Core.getLocalDate = function(utcDateString)
{
	var d = new Date(utcDateString);
	var m = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds()) - new Date().getTimezoneOffset();
	return new Date(m);
};
CodeEffects.Core.registerLoadEvent = function(method)
{
	var ol = window.onload;
	if(typeof(window.onload) != "function")window.onload = method;
	else window.onload = function(e){if(ol)ol();method();}
};
CodeEffects.Core.submitOnEnter = function(container,delegate)
{ // Vlad: this hijacks document's keypress
	var one = CodeEffects.Core.getChildrenByTagName(container,"INPUT",true);
//	var two = CodeEffects.Core.getChildrenByTagName(container,"TEXTAREA",true);
//	if(two.length > 0)one = one.concat(two);
	var two = CodeEffects.Core.getChildrenByTagName(container,"SELECT",true);
	if(two.length > 0)one = one.concat(two);
	if(one.length == 0)return;
	var t;
	for(var i in one)
	{
		t = one[i];
//		if(t.tagName == "TEXTAREA")t.onkeypress = function(e){unsubscribe();return true;} // Vlad: keep textarea enter untouched
		if(t.tagName == "INPUT" && (t.type == "text" || t.type == "password") && typeof(t.onkeypress) != "function")
			t.onkeypress = function(e){subscribe(delegate);return true;}
		else if(t.tagName == "INPUT" && (t.type == "checkbox" || t.type == "radio") && typeof(t.onclick) != "function")
			t.onclick = function(e){subscribe(delegate);return true;}
		else if(t.tagName == "SELECT" && typeof(t.onchange) != "function")
			t.onchange = function(e){subscribe(delegate);return true;}
	}
//	function unsubscribe(){document.onkeypress = null;}
	function subscribe(del)
	{
		document.onkeypress = function(e)
		{
			if(CodeEffects.Core.getKey(e) == 13){del();document.onkeypress = null;return false;}
			else return true;
		}
	};
};
CodeEffects.Core.Elements = function(container,attribute)
{
	var that = this;
	var add = function(el){eval("that."+el.getAttribute(attribute)+" = el;");}
	var els = CodeEffects.Core.getChildrenByAttribute(container,attribute);
	for(var i in els)add(els[i]);
	if(CodeEffects.Core.defined(container.getAttribute(attribute)))add(container);
};