///******************************************************************************/
///************************************************************ EXETEND DATES ***/
///******************************************************************************/
//Date.prototype.render = function(dateTemplate)
//{
//	if(!dateTemplate) return this.toString();
//	var	dateStr		= dateTemplate,
//		monthNames 	= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
//		weekDays	= ["Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"];
//	dateStr = dateStr.replace(/wd/i,weekDays[this.getDay()]);
//	dateStr = dateStr.replace(/dd/i,this.getDate().zeropad());
//	dateStr = dateStr.replace(/mm/i,(this.getMonth()+1).zeropad());
//	dateStr = dateStr.replace(/month/i,monthNames[this.getMonth()]);
//	dateStr = dateStr.replace(/yyyy/i,this.getFullYear());
//	if(/yy/i.test(dateStr))	dateStr = dateStr.replace(/yy/i,this.getYear().toString().substr(2,2));
//	dateStr = dateStr.replace(/hh/i,this.getHours().zeropad());
//	dateStr = dateStr.replace(/mi/i,this.getMinutes().zeropad());
//	dateStr = dateStr.replace(/ss/i,this.getSeconds().zeropad());
//	dateStr = dateStr.replace(/ms/i,this.getMilliseconds().zeropad());
//	return dateStr;
//}
//Date.getDaysInMonth = function(m,y)
//{
//	var d = 31;	
//	if (m == 2 && y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)){d = 29;} 
//	else if (m == 2){d = 28;} 
//	else if (m == 4 || m == 6 || m == 9 || m == 11){d = 30;}
//	return d;	
//}
//Date.prototype.getDaysInMonth = function(m,y)
//{
//	return Date.getDaysInMonth(this.getMonth()+1,this.getFullYear());
//}

///******************************************************************************/
///*********************************************************** EXETEND ARRAYS ***/
///******************************************************************************/
//Array.prototype.push = function()
//{
//    var n = this.length >>> 0;
//    for (var i = 0; i < arguments.length; i++)
//	{
//		this[n] = arguments[i];
//		n = n + 1 >>> 0;
//    }
//    this.length = n;
//    return n;
//}
///******************************************************************************/
///********************************************************** EXETEND NUMBERS ***/
///******************************************************************************/
//Number.prototype.zeropad = function()
//{
//	var num = parseInt(this,10) || 0;
//	return(num<10 ? '0' + num:num);
//}
///******************************************************************************/
///********************************************************** EXETEND STRINGS ***/
///******************************************************************************/
//String.prototype.trim = function()
//{
//	return this.replace(/^\s+|\s+$/,"");
//}
//String.prototype.chars = function(num,mult)
//{	
//	mult = mult || 1;
//	return new Array(num*mult+1).join(this);
//}
///******************************************************************************/
///**************************************************** EXETEND ELEMENTS (FF) ***/
///******************************************************************************/
//if(typeof Element !== "undefined")
//{
//	Element.prototype.swapNode = function (swapWith)
//	{
//		var itemtmp = this.cloneNode(1),
//			parent 	= this.parentNode;		
//		swapWith = parent.replaceChild(itemtmp, swapWith);
//		parent.replaceChild(swapWith, this);
//		parent.replaceChild(this, itemtmp);
//		itemtmp = null;
//	}
//	Element.prototype.contains = function(child)
//	{
//		while(child && child !== this)
//			child = child.parentNode;
//		return(child === this);
//	}
////	Element.prototype.__defineSetter__
////	(
////		"innerText", 
////		function (sText)
////		{
////	   		this.innerHTML = sText.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
////		}
////	);
////	Element.prototype.__defineGetter__
////	(
////		"innerText", 
////		function ()
////		{
////		   var r = this.ownerDocument.createRange();
////		   r.selectNodeContents(this);
////		   return r.toString();
////		}
////	);
////	Event.prototype.__defineGetter__
////	(
////		"srcElement", 
////		function ()
////		{
////		   var node = this.target;
////		   while (node.nodeType != 1) node = node.parentNode;
////		   return node;
////		}
////	);	
////	Event.prototype.__defineSetter__
////	(
////		"cancelBubble", 
////		function (b)
////		{
////		   if (b) this.stopPropagation();
////		}
////	);
////	Event.prototype.__defineSetter__
////	(
////		"returnValue", 
////		function (b)
////		{
////		   if (!b) this.preventDefault();
////		}
////	);
////	Event.prototype.__defineGetter__
////	(
////		"fromElement",
////		function ()
////		{
////		   var node;
////		   if (this.type == "mouseover")
////		      node = this.relatedTarget;
////		   else if (this.type == "mouseout")
////		      node = this.target;
////		   else
////		      return null;
////		   while (node.nodeType != 1) node = node.parentNode;
////		   return node;
////		}
////	);
////	Event.prototype.__defineGetter__
////	(
////		"toElement",
////		function ()
////		{
////		   var node;
////		   if (this.type == "mouseout")
////		      node = this.relatedTarget;
////		   else if (this.type == "mouseover")
////		      node = this.target;
////		   else
////		      return null;
////		   while (node.nodeType != 1) node = node.parentNode;
////		   return node;
////		}
////	);
//}	
///******************************************************************************/
///********************************************************************** DOM ***/
///******************************************************************************/
var $D = new function()
{
	this.$ = function()
	{
		var elements = new Array();
		for (var i=0;i<arguments.length;i++)
		{	
			var element = arguments[i];			
			if(typeof element == "string") 
				element = document.getElementById(element);
			elements.push(element);
		}
		if(elements.length == 0)
			return null;
		else if (elements.length == 1)
			return elements[0];
		else
			return elements;
	}
	this.IsClass = function(objRef,className)
	{
		return ((new RegExp("\\b" + className.trim() + "\\b","gi")).test(objRef.className));
	}
	this.SetClass = function(objRef,className)
	{
		$D.ClearClass(objRef)
		objRef.className = className.trim();
	}
	this.AddClass = function(objRef,className)
	{
		$D.RemoveClass(objRef,className);
		objRef.className = (objRef.className + " " + className).trim();
	}
	this.RemoveClass = function(objRef,className)
	{
		objRef.className = objRef.className.replace(className,"").trim();
	}
	this.ClearClass = function(objRef)
	{
		objRef.className = "";
	}
	this.GetElementsByClassName = function(strClass, objContElm, strTag)
	{
		strTag = strTag || "*";
		objContElm = objContElm || document;
		var objColl = objContElm.getElementsByTagName(strTag);
		if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
		var resultArray = [];
		var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
		var arrClass = strClass.split(delim);
		for (var i = 0, j = objColl.length; i < j; i++)
		{
			var arrObjClass = objColl[i].className.split(' ');
			if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
			var c = 0;
			comparisonLoop:
			for (var k = 0, l = arrObjClass.length; k < l; k++)
			{
		 		for (var m = 0, n = arrClass.length; m < n; m++)
				{
		    		if (arrClass[m] == arrObjClass[k]) c++;
				    	if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length))
						{
				    	  resultArray.push(objColl[i]);
				    	  break comparisonLoop;
		    			}
		  		}
			}
		}
		return resultArray;
	}
	this.GetElementsByTagNames = function(objRef, tagNames)
	{
		objRef = objRef || document;
		var resultArray = [];
		for (var i=1,len=tagNames.length;i<len;i++)
		{
			var tags = objRef.getElementsByTagName(tagNames[i]);
			for (var j=0;j<tags.length;j++)
			{
				resultArray.push(tags[j]);
			}
		}
		var testNode = resultArray[0];
		if(!testNode) return [];
		if (testNode.sourceIndex)
		{
			resultArray.sort(function (a,b)
							{
								return a.sourceIndex - b.sourceIndex;
							});
		}
		else if(testNode.compareDocumentPosition)
		{
			resultArray.sort(function (a,b)
							{
								return 3 - (a.compareDocumentPosition(b) & 6);
							});
		}
		return resultArray;
	}
	this.GetStyle = function(objRef, propName)
	{
		if(objRef.currentStyle)
			return objRef.currentStyle[propName.replace(/-([a-z])/gi,function(a,b){return b.toUpperCase()})];
		else if(window.getComputedStyle)
			return window.getComputedStyle(objRef,null).getPropertyValue(propName.replace(/[A-Z]/g,function(a){return "-" + a.toLowerCase()}));
	}
	this.GetChildLevel = function(parent, child)
	{
		var level = 0;
		while(child && child != parent)
		{
			level ++;
			child = child.parentNode;
		}
		return level;
	}
	this.IsSameChildLevel = function(parent, child1, child2)
	{
		var count1 = 0, count2 = 0;
		while(child1 && child2 && child1 != parent && child2 != parent)
		{
			child1 = child1.parentNode;
			child2 = child2.parentNode;
		}
		return(child1 == parent && child2 == parent);
	}
	this.IsInBoundry = function(point, boundry)
	{
		//IMPLAMENT
	}
	this.GetOffsetPosition = function(objRef)
	{
		var l = 0, t = 0;
		while(objRef)
		{
			l += objRef.offsetLeft;
			t += objRef.offsetTop;
			objRef = objRef.offsetParent;
		}
		return {left:l,top:t};
	}
	this.GetMousePosition = function(e)
	{
		var x = 0, y=0;
		if(e.pageX || e.pageY)
		{
			x = e.pageX;
			y = e.pageY;
		}
		else if(e.clientX || e.clientY)
		{
			x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
			y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
		}
		return {left:x,top:y};
	}
	this.GetOffsetMousePosition = function(e)
	{
		var x = 0, y=0, 
			objRef = e.srcElement;
		
		if(e.offsetX || e.offsetY)
		{
			x = e.offsetX;
			y = e.offsetY;
		}
		else if(e.pageX || e.pageY)
		{
			var pos = $D.getOffsetPosition(objRef);
			x = e.pageX - pos.left;
			y = e.pageY - pos.top;
		}
		return {left:x,top:y};
	}
	this.DocumentWrite = function(str)
	{
		document.write(str);
	}

	this.Select = {}

	this.Select.addOption = function(objRef, text, value)
	{
		objRef.options[objRef.options.length] = new Option(text, (value || text));
	}

}
//var $ = $D.$;
///******************************************************************************/
///******************************************************************* EVENTS ***/
///******************************************************************************/
var $E = new function() {
    var guid = 1;
    var that = this;

    this.add = function(objRef, type, fn, useCapture) {
        var uniqueKey = fn["guid"] ? fn["guid"] : guid++;
        //objRef['e' + type + fn] = f;
        objRef['e' + uniqueKey] = fn;
        if (objRef.attachEvent) {
            //objRef[type + fn] = function() { objRef['e' + type + fn](window.event, objRef); }
            objRef["f" + uniqueKey] = function() { objRef['e' + uniqueKey](window.event, objRef); }
            objRef.attachEvent('on' + type, objRef["f" + uniqueKey]);
        }
        else {
            objRef["f" + uniqueKey] = function(e) { objRef['e' + uniqueKey](e, this) };
            useCapture = useCapture || false;
            objRef.addEventListener(type, objRef["f" + uniqueKey], useCapture);
        }
    };

//    this.attach = function(objRef, type, fn, useCapture) {
//        objRef['e' + type + fn] = fn;

//        if (objRef.attachEvent) {
//            //objRef[type + fn] = function() { objRef['e' + type + fn](window.event, objRef); }
//            var f = function() { fn(window.event, objRef); }
//            objRef.attachEvent('on' + type, f);
//        }
//        else {
//            objRef[type + fn] = function(e) { objRef['e' + type + fn](e, this) };
//            useCapture = useCapture || false;
//            objRef.addEventListener(type, objRef[type + fn], useCapture);
//        }
//    };

    this.remove = function(objRef, type, fn) {
        if (!fn["guid"]) return;
        
        if (objRef.detachEvent) {
            objRef.detachEvent('on' + type, objRef["f" + fn["guid"]]);
            objRef["f" + fn["guid"]] = null;
        }
        else {
            objRef.removeEventListener(type, objRef["f" + fn["guid"]], false);
            objRef["f" + fn["guid"]] = null;
        }
    };
    
    this.onload = function(func) {
        var oldonload = window.onload;
        if (typeof window.onload != "function")
            $E.add(window, "load", func)
        else
            $E.add(window, "load", function() { oldonload(); func(); })
    };

//    this.attachOnLoad = function(func) {
//        var oldonload = window.onload;
//        if (typeof window.onload != "function")
//            $E.attach(window, "load", func)
//        else
//            $E.attach(window, "load", function() { oldonload(); func(); })
//    }

    this.preventDefault = function(e) {
        if (e.preventDefault) {
            e.preventDefault();
        }
        else {
            e.returnValue = false;
            e.cancelBubble = true;
        }
    }
    this.cross = function(e) {
        if (e.keyCode) e.which = e.keyCode; else e.keyCode = e.which;
        if (!e.charCode) e.charCode = e.keyCode;
    }
    this.emulate = function() {
        //IMPLAMENT:
        //mouseenter and mouseleave  - http://blog.stchur.com/2007/03/15/mouseenter-and-mouseleave-events-for-firefox-and-other-non-ie-browsers/
        var events = ["mouseenter", "mouseleave"];
    }
}
///******************************************************************************/
///**************************************************************** UTILITIES ***/
///******************************************************************************/
var $U = new function()
{
	this.setSettings = function (from,to)
	{
		for(var s in from)
		{
			if(typeof from[s] != "object")
			{
				to[s] = from[s];
			}
			else
			{
				if(!to[s]) to[s] = {};
				setSettings(from[s], to[s])
			}
		}
	}
	this.Trace = new function()
	{
		var debugDiv		=  null,
			lineNum			= 1
			lineNumPadding	= 3;
		
		this.write = function(str)	
		{
			if(!debugDiv) debugDiv = buldWindow();			
			var objRef = document.createElement("SPAN");
				objRef.innerHTML = str;
			debugDiv.appendChild(objRef);
			debugDiv.scrollTop = debugDiv.scrollHeight;
		}
		this.writeLine = function(str)	
		{
			if(!debugDiv) debugDiv = buldWindow();
			var objRef = document.createElement("SPAN");
				objRef.innerHTML = str + '<br /><span style="background-color:#CFCFCF">' + '&nbsp;'.chars(lineNumPadding - (lineNum).toString().length) + (lineNum++) + ' </span>&nbsp;';
			debugDiv.appendChild(objRef);
			debugDiv.scrollTop = debugDiv.scrollHeight;
		}
		this.clear = function()
		{
			debugDiv.innerHTML = "";
		}		
		function buldWindow()
		{
			var	objRef 						= document.createElement("DIV");
				objRef.id 					= "$debugDiv";
				objRef.style.bottom			= "0px";
				objRef.style.right			= "0px";
				objRef.style.color			= "blue";
				objRef.style.width			= "300px";
				objRef.style.height			= "200px";
				objRef.style.border			= "2px solid red";
				objRef.style.overflow		= "auto";
				objRef.style.position		= "absolute";
				objRef.style.fontFamily		= "Fixedsys";
				objRef.style.whiteSpace		= "nowrap";
				objRef.style.backgroundColor= "#E0E0E0";
				objRef = document.body.appendChild(objRef);
			objRef.innerHTML = '<span style="background-color:#CFCFCF">' + "&nbsp;".chars(lineNumPadding - (lineNum).toString().length) + (lineNum++) + ' </span>&nbsp;';
			return objRef;
		}
	}	
}
window.trace = $U.Trace.writeLine;
///******************************************************************************/
///************************************************************* Ajax Handler ***/
///******************************************************************************/
//function AjaxHandler(_href, _onResponse, settingsObject)
//{
//	// #region PUBLIC VARIABLES //

//	this.OnResponse			= _onResponse;
//	this.Href				= _href;
//	this.ResponseText		= null;		
//	this.Settings = 
//		{
//			Async				: true,
//			Method				: "GET",
//			ThrowOnServerError	: true
//		};
//		
//	// #endregion PUBLIC VARIABLES //

//	
//	// #region PRIVATE VARIABLES //	
//	
//	var config	= this.Settings,
//		href	= "",
//		reqObj 	= null,
//		objRef	= this;
//			
//	// #endregion PRIVATE VARIABLES //
//	
// 			
//	(function init()
//	{
//		ctor();
//	})()
//	
//	function ctor()
//	{
//		if(reqObj) return true;
//		try{
//			reqObj = new XMLHttpRequest();
//		}
//		catch(e)
//		{
//			try{
//				reqObj = new ActiveXObject("Msxml2.XMLHTTP.4.0");
//			}
//			catch(e)
//			{
//				try{
//					reqObj = new ActiveXObject("Msxml2.XMLHTTP");
//				}
//				catch(e)
//				{
//					try{
//						reqObj = new ActiveXObject("microsoft.XMLHTTP");
//					}
//					catch(e)
//					{
//						reqObj = null;
//					}
//				}
//			}
//		}
//		if(!reqObj)
//		{
//			throw new Error("$AJAX error: Unable to initialize XMLHttp object");
//			return false;
//		}
//		else
//		{
//			$U.setSettings(settingsObject,config);
//			return true;
//		}
//	}	

//	this.execute = function(params)
//	{	
//		var queryString = "";
//		
//		if(params)
//		{
//			for(var p in params)
//			{
//				queryString += p + "=" + params[p] + "&";
//			}
//		}
//		
//		if(typeof objRef.OnResponse != "function")
//		{
//			throw new Error("$AJAX error: onResponse does not contain function, unable to return data!");
//		}

//		href = this.Href;
//		
//		if(config.Method != "POST")
//		{
//			
//			if(href.indexOf("?") == -1)
//				href += "?";
//			else
//				href += "&";
//			
//			href += queryString + "r=" + Math.random();
//		}			
//			
//		reqObj.open(config.Method, href, config.Async)

//		if(config.Method == "POST")
//		{
//			reqObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//		}
//		reqObj.onreadystatechange = function() 
//		{
//			if(reqObj.readyState == 4)
//			{		
//				if(reqObj.status == 200)
//				{	
//					if(typeof objRef.OnResponse == "function")
//					{
//						objRef.ResponseText = reqObj.ResponseText;
//						objRef.OnResponse(reqObj.ResponseText);
//					}
//				}
//				else if(config.ThrowOnServerError) 
//				{
//					throw new Error("$AJAX error: " + reqObj.statusText + "\nStatus: " + reqObj.status + "\nError:\n" + reqObj.ResponseText);
//				}
//			}
//		}
//		if(config.Method == "POST")
//			reqObj.send(queryString);
//		else
//			reqObj.send(null);
//	}


//}
/******************************************************************************/
/**************************************************************** EXTENDERS ***/
/******************************************************************************/
//function DateFieldExtender(controlReference,settingsObject)
//{
//	// #region PUBLIC VARIABLES //
//	
//	this.Settings = 
//		{
//			DateFormat			: null,
//			FieldHidden			: true,
//			FieldReadonly		: true,
//			ExtenderType		: "selects",
//			YearOffset			: 5,
//			YearEndOffset		: null,
//			YearStartOffset		: null,
//			ZeroPadding			: true,
//			Default				:
//				{
//					Year		: null,
//					Month		: null,
//					Day			: null,
//					Hour		: null,
//					Minute		: null
//				},
//			DisplayTimeSelect	: true,
//			DisplayDateSelect	: true,				
//			DisplayFirstOptions	: false,
//			FirstOptionText		:
//				{
//					Year		: "שנה",
//					Month		: "חודש",
//					Day			: "יום",
//					Hour		: "שעה",
//					Minute		: "דקה"
//				}
//		};	
//	
//	// #endregion PUBLIC VARIABLES //

//	
//	// #region PRIVATE VARIABLES //
//	
//	var fieldToExtend	= null,
//		originalValue	= null,
//		config			= this.Settings,
//		container		= null,
//		controls		= 
//		{
//			daySelect			: null,
//			dayMonthDivider		: null,
//			monthSelect			: null,
//			monthDayDivider		: null,
//			yearSelect			: null,		
//			yearhourDivider		: null,
//			hourSelect			: null,
//			hourminuteDivider	: null,
//			minuteSelect		: null
//		};
//		
//	// #endregion PRIVATE VARIABLES //
// 			
//	(function init()
//	{
//		$E.onload(ctor);
//	})();

//	function ctor()
//	{
//		fieldToExtend = $(controlReference);
//		
//		if(!fieldToExtend) throw Error("Unable to extend control, invalid element refernce");
//		
//		originalValue = Date.parse(fieldToExtend.value) || null;
//	
//		$U.setSettings(settingsObject,config);
//		var d = null;
//		if(originalValue)
//		{	
//			d = new Date(originalValue);
//		}
//		else if(!config.DisplayFirstOptions)
//		{
//			d = new Date();
//		}
//	
//		if(d)
//		{
//			if(config.Default.Year == null) config.Default.Year = d.getFullYear();
//			if(config.Default.Month == null) config.Default.Month = d.getMonth()+1;
//			if(config.Default.Day == null) config.Default.Day = d.getDate();
//			if(config.Default.Hour == null) config.Default.Hour = d.getHours();
//			if(config.Default.Minute == null) config.Default.Minute = d.getMinutes();		
//		}
//	
//		if(!config.DateFormat)
//		{
//			config.DateFormat = "";
//			if(config.DisplayDateSelect) config.DateFormat = "dd/mm/yyyy";
//			if(config.DisplayTimeSelect)
//			{
//				if(config.DisplayDateSelect) config.DateFormat += " ";
//				config.DateFormat += "hh:mi";
//			}
//		}
//	
//		if(config.FieldReadonly) fieldToExtend.readOnly = true;
//		if(config.FieldHidden)	 fieldToExtend.style.display = "none";
//		if(config.ExtenderType == "selects") selects_render();
//	}
//	
//	function setFieldValue(newValue)
//	{
//		var d = Date.parse(newValue);

//		if(d) fieldToExtend.value = new Date(d).render(config.DateFormat);
//		else  fieldToExtend.value = "";
//	}
//	
//	// #region SELECTS DISPLAY TYPE //
//	
//	function selects_render()
//	{
//		container = document.createElement("SPAN");
//		container.dir = "ltr";
//		container.style.direction = "ltr";
//		
//		if(config.DisplayDateSelect)
//		{
//			controls.daySelect		= container.appendChild(document.createElement("SELECT"));
//			controls.dayMonthDivider= container.appendChild(document.createElement("SPAN"));
//			controls.monthSelect	= container.appendChild(document.createElement("SELECT"));
//			controls.monthDayDivider= container.appendChild(document.createElement("SPAN"));
//			controls.yearSelect		= container.appendChild(document.createElement("SELECT"));
//			
//			controls.dayMonthDivider.innerHTML = "&nbsp;/&nbsp;";
//			controls.monthDayDivider.innerHTML = "&nbsp;/&nbsp;";
//			
//			$E.add(controls.yearSelect,"change",selects_dateOnChange);
//			$E.add(controls.monthSelect,"change",selects_dateOnChange);
//			$E.add(controls.daySelect,"change",selects_dateOnChange);			
//			
//			var thisYear	= new Date().getFullYear(),
//				startYear	= thisYear - (config.YearStartOffset != null ? config.YearStartOffset:config.YearOffset),
//				endYear		= thisYear + (config.YearEndOffset != null ? config.YearEndOffset:config.YearOffset);

//			if(config.DisplayFirstOptions)
//			{
//				$D.Select.addOption(controls.yearSelect,config.FirstOptionText.Year,"")
//			}				
//			for(var i = startYear; i <= endYear; i++)
//			{
//				$D.Select.addOption(controls.yearSelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad())
//				if(config.Default.Year == i)
//					controls.yearSelect.options[controls.yearSelect.options.length-1].selected = true;
//			}
//			if(config.DisplayFirstOptions)
//			{
//				$D.Select.addOption(controls.monthSelect,config.FirstOptionText.Month,"")
//			}				
//			for(var i = 1; i <= 12; i++)
//			{
//				$D.Select.addOption(controls.monthSelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad())
//				if(config.Default.Month == i)	
//					controls.monthSelect.options[controls.monthSelect.options.length-1].selected = true;
//			}
//			if(config.DisplayFirstOptions)
//			{
//				$D.Select.addOption(controls.daySelect,config.FirstOptionText.Day,"")
//			}				
//			for(var i = 1; i <= 31; i++)
//			{
//				$D.Select.addOption(controls.daySelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad())
//				if(config.Default.Day == i)	
//					controls.daySelect.options[controls.daySelect.options.length-1].selected = true;
//			}
//		}
//		if(config.DisplayTimeSelect)
//		{
//			if(config.DisplayDateSelect)
//			{
//				controls.yearhourDivider	= container.appendChild(document.createElement("SPAN"));
//				controls.yearhourDivider.innerHTML		= "&nbsp;&nbsp;&nbsp;";
//			}
//			
//			controls.hourSelect			= container.appendChild(document.createElement("SELECT"));
//			controls.hourminuteDivider	= container.appendChild(document.createElement("SPAN"));
//			controls.minuteSelect		= container.appendChild(document.createElement("SELECT"));
//			
//			controls.hourminuteDivider.innerHTML	= "&nbsp;:&nbsp;";

//			$E.add(controls.hourSelect,"change",selects_timeOnChange);
//			$E.add(controls.minuteSelect,"change",selects_timeOnChange);

//			if(config.DisplayFirstOptions)
//			{
//				$D.Select.addOption(controls.hourSelect,config.FirstOptionText.Hour,"")
//			}				
//			for(var i = 0; i <= 23; i++)
//			{
//				$D.Select.addOption(controls.hourSelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad())
//				if(config.Default.Hour == i)	
//					controls.hourSelect.options[controls.hourSelect.options.length-1].selected = true;
//			}
//			if(config.DisplayFirstOptions)
//			{
//				$D.Select.addOption(controls.minuteSelect,config.FirstOptionText.Minute,"")
//			}				
//			for(var i = 0; i <= 59; i++)
//			{
//				$D.Select.addOption(controls.minuteSelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad())
//				if(config.Default.Minute == i)	
//					controls.minuteSelect.options[controls.minuteSelect.options.length-1].selected = true;
//			}
//		}		
//		fieldToExtend.parentNode.insertBefore(container,fieldToExtend);
//		setFieldValue(selects_getValue());
//	}
//	function selects_dateOnChange()
//	{
//		var y				= parseInt(controls.yearSelect.value,10),
//			m				= parseInt(controls.monthSelect.value,10),
//			d				= parseInt(controls.daySelect.value,10),
//			optionsOffset	= config.DisplayFirstOptions ? 1:0,
//			daysnum			= Date.getDaysInMonth(m,y);
//		
//		if(controls.daySelect.options.length - optionsOffset > daysnum)
//		{
//			controls.daySelect.options.length = daysnum + optionsOffset;
//		}
//		else if(controls.daySelect.options.length - optionsOffset  < daysnum)	
//		{
//			for(var i=parseInt(controls.daySelect.options[controls.daySelect.options.length -1].value,10) + 1; i <= daysnum; i++)
//			{
//				$D.Select.addOption(controls.daySelect,(config.ZeroPadding ? i.zeropad():i),i.zeropad());
//			}
//		}	
//		setFieldValue(selects_getValue());
//	}
//	function selects_timeOnChange()
//	{
//		setFieldValue(selects_getValue());
//	}
//	function selects_getValue()
//	{
//		var value = "";
//		
//		if(config.DisplayDateSelect)
//		{
//			value = controls.yearSelect.value
//					+ "/"
//					+ controls.monthSelect.value
//					+ "/"
//					+ controls.daySelect.value;
//		}
//		if(config.DisplayTimeSelect)
//		{
//			value += " " + controls.hourSelect.value
//					+ ":" 
//					+ controls.minuteSelect.value;
//		}
//		return value;
//	}
//	// #endregion SELECTS DISPLAY TYPE //	
//}	




function ScrollerExtender(controlReference,settingsObject) {
   
	// #region PUBLIC VARIABLES //
	this.Settings = 
		{
			Direction		: "up",
			MouseOverStop	: true, 
			MouseOverScroll	: false, 
			InitialDelay	: 10,
			Speed			: 10
		};
		
	// #endregion PUBLIC VARIABLES //
	
	// #region PRIVATE VARIABLES //

		var config = this.Settings,
		member = null,
		elementToExtend = null,
		scrollContentFirst = null,
		scrollContentSecond = null,
		scrollContentSize = 0,
		visibleScrollSize = 0,
		scrollResetValue = 0,
		members =
		{
			down:
			{
				coefficient		: -1,
				scrollObject	: "scrollTop",
				scrollSizeObject: "scrollHeight",
				offsetSizeObject: "offsetHeight",
				hiddehOverflow	: "overflowX",
				scrollResetValue: 1000000
			},
			up:
			{
				coefficient		: 1,
				scrollObject	: "scrollTop",
				scrollSizeObject: "scrollHeight",
				offsetSizeObject: "offsetHeight",
				hiddehOverflow	: "overflowX",
				scrollResetValue: 0
			},
			right:
			{
				coefficient		: -1,
				scrollObject	: "scrollLeft",
				scrollSizeObject: "scrollWidth",
				offsetSizeObject: "offsetWidth",
				hiddehOverflow	: "overflowY",
				scrollResetValue: 1000000
			},
			left:
			{
				coefficient		: 1,
				scrollObject	: "scrollLeft",
				scrollSizeObject: "scrollWidth",
				offsetSizeObject: "offsetWidth",
				hiddehOverflow	: "overflowY",
				scrollResetValue: 0
			}
		};

	// #endregion PRIVATE VARIABLES //

	(function init() {	
		$E.onload(ctor);
	})();
	
	function ctor()
	{
	    elementToExtend = $D.$(controlReference);
		
		if(!elementToExtend) throw Error("Unable to extend control, invalid element refernce");
				
		$U.setSettings(settingsObject,config);

		member = members[config.Direction];
		//scrollResetValue = member.scrollResetValue;
		
		elementToExtend.style.width 	= (parseInt($D.GetStyle(elementToExtend, "width")) || elementToExtend.offsetWidth) + "px";
		elementToExtend.style.height 	= (parseInt($D.GetStyle(elementToExtend, "hidth")) || elementToExtend.offsetHeight) + "px";
		
		var scrollContentHTML = elementToExtend.innerHTML;
		
		elementToExtend.innerHTML = "";
		scrollContentFirst = elementToExtend.appendChild(document.body.appendChild(document.createElement("DIV")));
		scrollContentFirst.id = controlReference + "_scrollFirst";
		scrollContentFirst.innerHTML =  scrollContentHTML;
		scrollContentSize = scrollContentFirst[member.offsetSizeObject];
		visibleScrollSize	= elementToExtend[member.offsetSizeObject];

		//if (config.Direction == "down") {
		//    scrollResetValue = visibleScrollSize;
		//}
		
		var	numScrollContentRepeations = Math.ceil(visibleScrollSize/scrollContentSize);	
		var content = [];
		for(var i=-1; i <= numScrollContentRepeations; i++)
		{
			content.push(scrollContentHTML);
		}
				
		scrollContentFirst.innerHTML =  content.join("");
		scrollContentFirst.style.height = elementToExtend.style.height;
		scrollContentFirst.style.overflow = "hidden";
	
		scrollContentSecond = elementToExtend.appendChild(scrollContentFirst.cloneNode(true));
		scrollContentSecond.style.display = "none";

		scrollContentFirst.otherScrollContent = scrollContentSecond;
		scrollContentSecond.otherScrollContent = scrollContentFirst;
	
		scrollContentFirst[member.scrollObject] = member.scrollResetValue;
		scrollContentSecond[member.scrollObject] = member.scrollResetValue;

		
		if(config.MouseOverStop)
		{
			$E.add(scrollContentFirst, "mousemove", stopScrollOn);
			$E.add(scrollContentFirst, "mouseout", doScrollOn);
			$E.add(scrollContentSecond, "mousemove", stopScrollOn);
			$E.add(scrollContentSecond, "mouseout", doScrollOn);
		}
		
		setTimeout(function(){doScroll(scrollContentFirst);},config.InitialDelay);
	}
	function doScroll(currentScrollContent)
	{	
		clearInterval(currentScrollContent.$timer);
		
		currentScrollContent.$timer = setInterval
		(
			function()
			{
  				currentScrollContent[member.scrollObject] = currentScrollContent[member.scrollObject] + member.coefficient;
  				if(
  					((config.Direction == "up" || config.Direction == "left") && currentScrollContent[member.scrollObject] > scrollContentSize)
  					||
  					((config.Direction == "down" || config.Direction == "right") &&  currentScrollContent[member.scrollSizeObject] - currentScrollContent[member.scrollObject] - visibleScrollSize > scrollContentSize)
  				)
  				{
  					clearInterval(currentScrollContent.$timer);
  					//currentScrollContent[member.scrollObject] = member.scrollResetValue;
  					currentScrollContent.style.display = "none";
  					currentScrollContent.otherScrollContent.style.display = "block";
  					currentScrollContent.otherScrollContent[member.scrollObject] = member.scrollResetValue;
  					doScroll(currentScrollContent.otherScrollContent);
  				}
			}
			,150 / config.Speed
		);
	}	
	function doScrollOn(e,objRef)
	{
		doScroll(objRef);
		objRef.style.overflow = "hidden";
	}
	function stopScrollOn(e,objRef)
	{
		if(objRef.$timer) clearInterval(objRef.$timer);
		if(config.MouseOverScroll)
		{
			objRef.style.overflow = "auto";
			objRef.style[member.hiddenOverflow] = "hidden";
		}
	}
}


//function TimeCounterExtender(controlReference,propertyName,settingsObject)
//{
//	// #region PUBLIC VARIABLES //
//	this.Settings = 
//		{
//			DisplayTemplate : "hh:mi:ss"
//		};	
//	// #endregion PUBLIC VARIABLES //

//	
//	// #region PRIVATE VARIABLES //
//	
//	var elementToExtend	= null,
//		originalValue	= null,
//		date			= new Date(),
//		config			= this.Settings;
//		
//	// #endregion PRIVATE VARIABLES //
//	
// 			
//	(function init()
//	{
//		$E.onload(ctor);
//	})();
//	
//	function ctor()
//	{
//		elementToExtend = $(controlReference);
//		if(!elementToExtend) throw Error("Unable to extend control, invalid element refernce");
//		if(typeof elementToExtend[propertyName] == "undefined") throw Error("Unable to extend control, invalid property name");
//		
//		$U.setSettings(settingsObject,config);
//				
//		originalValue = (elementToExtend[propertyName] || "").trim();
//		
//		if(/^(\d?\d):(\d?\d)(:(\d?\d))?$/gi.test(originalValue))
//		{
//			date.setHours(RegExp.$1);
//			date.setMinutes(RegExp.$2);
//			date.setSeconds(RegExp.$4 || 0);
//		}	
//		
//		elementToExtend.$timer = setTimeout(function(){render();},1000);
//		
//		function render()
//		{
//			clearTimeout(elementToExtend.$timer);
//			date.setSeconds(date.getSeconds()+1);
//  			elementToExtend[propertyName] = date.render(config.DisplayTemplate);
//  			setTimeout(function(){render();},1000)
//		}
//	}
//}
//function CheckboxStatusExtender(controlReference,settingsObject)
//{
//	// #region PUBLIC VARIABLES //
//	this.Settings = 
//		{
//			HrefFormat			: "/Admin/Events/SetStatus.ashx?eventId={0}&isActive={1}",
//			DisableOnRequest	: true,
//			ParameterFormat		: "truefalse" //truefalse, yesno, onoff, numeric
//		};	
//	// #endregion PUBLIC VARIABLES //

//	
//	// #region PRIVATE VARIABLES //
//	
//	var elementToExtend		= null,
//		config				= this.Settings,
//		parameterFormater	= 
//		{
//			numeric		: {"true":1,"false":0},
//			truefalse	: {"true":"true","false":"false"},
//			yesno		: {"true":"yes","false":"no"},
//			onoff		: {"true":"on","false":"off"}
//		};
//		
//	// #endregion PRIVATE VARIABLES //
//	
//	(function ctor()
//	{
//		elementToExtend = $(controlReference);
//		if(!elementToExtend) throw Error("Unable to extend control, invalid element refernce");
//		if(elementToExtend.tagName.toLowerCase() != "input" || elementToExtend.type.toLowerCase() != "checkbox")  throw Error("Unable to extend control, element must be Input - Type Checkbox'");
//		
//		$U.setSettings(settingsObject,config);
//		
//		$E.add(elementToExtend, "click", setStatus);
//	})();
//	
//	function setStatus(e,objRef)
//	{
//		elementToExtend.disabled = config.DisableOnRequest;
//		
//		var href = config.HrefFormat;	
//		href = href.replace(/\{0\}/gi,elementToExtend.value);
//		href = href.replace(/\{1\}/gi,parameterFormater[config.ParameterFormat][elementToExtend.checked.toString()]);

//		var ajax = new AjaxHandler(href,setStatusCallback,{ThrowOnServerError:true});
//		ajax.execute();
//	}
//	
//	function setStatusCallback(response)
//	{
//		elementToExtend.disabled = false;
//	}
//}
