/**
 * @name: 		im_gui.js
 * @author: 	Albert Harounian
 * @author: 	Ron Bentata (getObjOpacity function)
 * @version: 	2.6.2
 * @desc:		Extra DOM functions
 * @since:		January 07, 2008
 * @revision:	August 06, 2008
 * @revision:	August 10, 2008
 * @revision:	October 06, 2008
 * @revision:	October 12, 2008
 * @revision:	October 13, 2008
 * @revision:	October 15, 2008
 * @revision:	October 19, 2008
 * @revision:	October 22, 2008
 * @revision:	November 02, 2008
 * @revision:	November 23, 2008
 * @revision:	November 25, 2008
 * @revision:	December 10, 2008
 * @revision:	December 11, 2008
 *
 * ************ STRUCTURE ************
 	im_gui
 		- browser
 		+ window
 			- newWindow
 			- getWindowInnerDim
 			- getCenterizedPos
 			- getCenterizedScreen
 			- getPageScroll
 		- getBodyDim
 		- obj
 		+ misc
 			- obj
 			- innerData
 			- toggleData
 			- gotoURL
 			- findPosX
			- findPosY
			- toInt
			- setSize
			- textSelection
			- appendAfter
			- getSrcElement
			- getObjSize
			- inArray
			- getMousePos
		+ display
			- setOpacity
			- getObjOpacity
			- hideDLLObjs
			- showDLLObjs
			- toggle
			- hide
			- show
			- fixPng
		+ date	
			- sectotime
		+ string	
			- pad
			- limitStr
			- stripTags
			- toNumber
		+ input
			- initTxtInputs
			- invertValue
			- setInspector
			- getCursorPosition
			- setCursorPosition
		+ css	
			- addClass
			- removeClass
			- toggleClass
			- hasClass
			- swapClass
 */

var im_gui={
	
	version: '2.5.0',

	browser: {

		ie: /msie/i.test(navigator.userAgent),
		ie6: /msie 6/i.test(navigator.userAgent),
		ie7: /msie 7/i.test(navigator.userAgent),
		ff: /firefox/i.test(navigator.userAgent),
		safari: /safari/i.test(navigator.userAgent),
		java: navigator.javaEnabled(),
		ns: (navigator.appName == 'Netscape'),
		userAgent: navigator.userAgent.toLowerCase(),
		version: parseFloat(navigator.appVersion.substr(21)) || parseFloat(navigator.appVersion)
	},
	
	window: {
		
		_dlgWin: null,
		
		newWindow: function(mypage,myname,w,h,scroll){
			if (typeof scroll == 'undefined') scroll='auto';
			var POS=this.getCenterizedScreen(w,h);
			settings='width='+w+',height='+h+',top='+POS.y+',left='+POS.x+',scrollbars='+scroll+',location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=no';
			/*if (this._dlgWin){ this._dlgWin.close(); }*/
			this._dlgWin=window.open(mypage,myname,settings);
		},
		
		getWindowInnerDim: function(){			
			if (self.innerHeight){ 
				/* All browsers except IE */
				return {'width': self.innerWidth, 'height': self.innerHeight};
			}else if (document.documentElement && document.documentElement.clientHeight){
				/* IE 6 Strict */
				return {'width': document.documentElement.clientWidth, 'height': document.documentElement.clientHeight};
			}else if (document.body){ 
				/* All other IE */
				return {'width': document.body.clientWidth, 'height': document.body.clientHeight};
			}
		},
		
		getCenterizedPos: function(elemWidth, elemHieght){
			var pageScroll=this.getPageScroll();
			var centerX=(screen.availWidth/2-elemWidth/2)+pageScroll.x;
			var centerY=(screen.availHeight/2-elemHieght/2)+pageScroll.y-80;
			return {'x': centerX, 'y': centerY};
		},
		
		getCenterizedScreen: function(elemWidth, elemHieght){
			var pageScroll=this.getPageScroll();
			var centerX=(screen.width/2-elemWidth/2);
			var centerY=(screen.height/2-elemHieght/2);
			return {'x': centerX, 'y': centerY};
		},
		
		getPageScroll: function(){
			var pageX=pageY=0;
			if (self.pageYOffset){ 
				/* All browsers except IE */
				pageX=self.pageXOffset;
				pageY=self.pageYOffset;
			}else if (document.documentElement && document.documentElement.scrollTop){
				/* IE 6 Strict */
				pageX=document.documentElement.scrollLeft;
				pageY=document.documentElement.scrollTop;
			}else if (document.body){
				/* All other IE */
				pageX=document.body.scrollLeft;
				pageY=document.body.scrollTop;
			}
			return {'x': pageX, 'y': pageY};
		}
	},
	
	getBodyDim: function(){
		return {
			offsetWidth: (this.browser.ie||this.browser.safari ? document.body.scrollWidth : window.innerWidth+window.scrollMaxX),
			offsetHeight: (this.browser.ie||this.browser.safari ? document.body.scrollHeight : window.innerHeight+window.scrollMaxY)
		};
	},
	
	obj: function(id,type,parent){
		return this.misc.obj(id,type,parent);
	},
	
	misc: {
		
		obj: function(id,type,parent){
			if(type=="tag"){
				if(typeof(parent)=='object'){
					if(parent && parent.getElementsByTagName(id)){
						return parent.getElementsByTagName(id);
					}
				}else if(typeof(parent)=='string'){
					if(this.obj(parent) && this.obj(parent).getElementsByTagName(id)){
						return this.obj(parent).getElementsByTagName(id);
					}
				}
			}else if(type=="name"){
				if(document.getElementsByName(id)){
					return document.getElementsByName(id)[0];
				}
			}else{
				if(typeof(id)=='object'){
					return id;
				}else if(document.getElementById(id)){
					return document.getElementById(id);
				}
			}
			return (false);
		},
		
		innerData: function(id, data, addingPos){
			if(typeof(data)=='undefined'){var data='';}
			if(typeof(id)=='object'){
				if(typeof(addingPos)=='undefined' || !addingPos){
					id.innerHTML=data;
				}else if(addingPos=='begin' || addingPos=='before'){
					id.innerHTML=data + id.innerHTML;
				}else if(addingPos=='end' || addingPos=='after'){
					id.innerHTML += data;
				}
			}else{
				if(typeof(addingPos)=='undefined' || !addingPos){
					this.obj(id).innerHTML=data;
				}else if(addingPos=='begin' || addingPos=='before'){
					this.obj(id).innerHTML=data + this.obj(id).innerHTML;
				}else if(addingPos=='end' || addingPos=='after'){
					this.obj(id).innerHTML += data;
				}
			}
			var scripts=data.toString().match(new RegExp('<script[^>]*>[^<]+</script>', 'gi'));
			if(scripts){
				for(var i=0; i<scripts.length; i++){
					if(new RegExp('<script[^>]*>([^<]+)</script>', 'i').exec(scripts[i]).length>0){
						eval(new RegExp('<script[^>]*>([^<]+)</script>', 'i').exec(scripts[i])[1].replace(new RegExp('\t', 'g'), ''));
					}
				}
			}
		},
		
		toggleData: function(){ /* data1, data2, objID [, objID, ...] */
			if(arguments.length>2){
				for(var i=2; i<arguments.length; i++){
					if(typeof(arguments[i])=='string'){arguments[i]=this.obj(arguments[i]);}
					if(typeof(arguments[i])=='object'){
						if(this.inArray(arguments[i].nodeName.toLowerCase(), new Array('input', 'textarea'))){
							arguments[i].value=(arguments[i].value==arguments[0]?arguments[1]:arguments[0]);
						}else{
							arguments[i].innerHTML=(arguments[i].innerHTML==arguments[0]?arguments[1]:arguments[0]);
						}
					}
				}
			}
		},
		
		gotoURL: function(url){
			document.location.href=url;
		},
		
		findPosX: function(objID){
			if(typeof(objID)=='string'){var objID=im_gui.obj(objID);}
			if(!objID){return false;}
			var curleft=0;
			if (objID.offsetParent){
				while (objID.offsetParent){
					curleft += objID.offsetLeft;
					objID=objID.offsetParent;
				}
			}else{
				if (objID.x) curleft += objID.x;
			}
			return curleft;
		},
		
		findPosY: function(objID){
			if(typeof(objID)=='string'){var objID=im_gui.obj(objID);}
			if(!objID){return false;}
			var curtop=0;
			if (objID.offsetParent){
				while (objID.offsetParent){
					curtop += objID.offsetTop;
					objID=objID.offsetParent;
				}
			}else{
				if (objID.y) curtop += objID.y;
			}
			return curtop;
		},
		
		toInt: function(val){
			if (val=='' || val==null || val==NaN) val=0;
			return (parseInt(val));
		},
		
		setSize: function(base,inc){
			return ((this.toInt(base)+inc)+'px');
		},
		
		textSelection: function(nodeObj, isAvailable){
			nodeObj=(typeof(nodeObj)=='string' ? im_gui.misc.obj(nodeObj) : nodeObj);
			if (im_gui.browser.ie){
				nodeObj.setAttribute('isTextSelectionAvailable', isAvailable);
				nodeObj.onselectstart=function(){return this.getAttribute('isTextSelectionAvailable');};
			}else if(im_gui.browser.ff){
				/* God bless Mozilla FireFox! */
				nodeObj.style.MozUserSelect=(isAvailable ? "" : "none");
			}
		},
		
		appendAfter: function(refChild, newChild) { 
			refChild.parentNode.insertBefore(newChild,refChild.nextSibling); 
		},
		
		getSrcElement: function(e){
			var src='';var e=(e||window.event);
			if (e.target){src=e.target;}else if (e.srcElement){src=e.srcElement;}
			if(src.nodeType==3){src=src.parentNode;}
			return src;
		},
		
		getObjSize: function(objArr){
			var i=0;
			for (var j in objArr){if(objArr.propertyIsEnumerable(j)){i++;}}
			return i;
		},
	
		inArray: function(needle, haystack){
			for(var i in haystack){
				if(needle==haystack[i]){
					return true;
				}
			}
			return false;
		},
	
		getMousePos: function(e){
			return (im_gui.browser.ie?{x:event.clientX,y:event.clientY}:{x:e.pageX,y:e.pageY});
		}
	},
	
	display: {
		
		setOpacity: function(obj,intOpacity){
			if(typeof(obj)=='string'){obj=im_gui.misc.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			if (im_gui.browser.ie){
				if(typeof(obj)=='object'){
					obj.style.filter="alpha(opacity="+intOpacity+")";
				}else{
					im_gui.misc.obj(obj).style.filter="alpha(opacity="+intOpacity+")";
				}
			}else{
				if(typeof(obj)=='object'){
					obj.style.opacity=intOpacity/100;
				}else{
					im_gui.misc.obj(obj).style.opacity=intOpacity/100;
				}
			}
		},
		
		getObjOpacity: function(obj){
			if(typeof(obj)=='string'){obj=im_gui.misc.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			var opc;
			if(im_gui.browser.ie){
				if(typeof(obj)=='object'){
					if (obj && obj.filters && obj.filters.alpha && obj.filters.alpha.opacity){
						opc=obj.filters.alpha.opacity;
					}else{
						this.setOpacity(obj,100);
						opc=100;
					}
				}else{
					if (im_gui.misc.obj(obj) && im_gui.misc.obj(obj).filters && im_gui.misc.obj(obj).filters.alpha && im_gui.misc.obj(obj).filters.alpha.opacity){
						opc=im_gui.misc.obj(obj).filters.alpha.opacity;
					}else{
						this.setOpacity(im_gui.misc.obj(obj),100);
						opc=100;
					}
				}
			}else{
				if(typeof(obj)=='object'){
					opc=obj.style.opacity*100;
				}else{
					opc=im_gui.misc.obj(obj).style.opacity*100;
				}
			}
			if (opc==''){
				if(typeof(obj)=='object'){
					this.setOpacity(obj,100);
				}else{
					this.setOpacity(im_gui.misc.obj(obj),100);
				}
				opc=100;
			}
			return (opc);
		},
	
		hideDLLObjs: function(){
			var elems=im_gui.obj("object","tag",document);
			for(var i=0; i<elems.length;i++){
				if(
					(
						elems[i].getAttribute("classid")!=null && 
						elems[i].getAttribute("classid")=="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
					) || (
						elems[i].getAttribute("type")!=null && 
						elems[i].getAttribute("type")=="application/x-shockwave-flash"
					)
					){
					elems[i].style.visibility="hidden";
				}
			}
			if(document.all){
				elems=im_gui.obj("select","tag",document);
				for(var i=0; i<elems.length;i++){
					elems[i].style.visibility="hidden";
				}
			}
		},
		
		showDLLObjs: function(){
			var elems=im_gui.obj("object","tag",document);
			for(var i=0; i<elems.length;i++){
				if(
					(
						elems[i].getAttribute("classid")!=null && 
						elems[i].getAttribute("classid")=="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
					) || (
						elems[i].getAttribute("type")!=null && 
						elems[i].getAttribute("type")=="application/x-shockwave-flash"
					)
					){
					elems[i].style.visibility="visible";
				}
			}
			if(document.all){
				elems=im_gui.obj("select","tag",document);
				for(var i=0; i<elems.length;i++){
					elems[i].style.visibility="visible";
				}
			}
		},
		
		toggle: function(){
			if(arguments.length>0){
				for(var i=0; i<arguments.length; i++){
					if(typeof(arguments[i])=='string'){arguments[i]=im_gui.obj(arguments[i]);}
					if(typeof(arguments[i])=='object'){
						if(arguments[i].style.display!='none'){
							arguments[i].setAttribute('originaldisplaystyle', arguments[i].style.display);
							arguments[i].style.display='none';
						}else{
							if(arguments[i].getAttribute('originaldisplaystyle')==null){
								arguments[i].style.display='';
							}else{
								arguments[i].style.display=arguments[i].getAttribute('originaldisplaystyle');
							}
						}
					}
				}
			}
		},
		
		hide: function(){
			if(arguments.length>0){
				for(var i=0; i<arguments.length; i++){
					if(typeof(arguments[i])=='string'){arguments[i]=im_gui.obj(arguments[i]);}
					if(typeof(arguments[i])=='object'){
						if(arguments[i].style.display!='none'){
							arguments[i].setAttribute('originaldisplaystyle', arguments[i].style.display);
							arguments[i].style.display='none';
						}
					}
				}
			}
		},
		
		show: function(){
			if(arguments.length>0){
				for(var i=0; i<arguments.length; i++){
					if(typeof(arguments[i])=='string'){arguments[i]=im_gui.obj(arguments[i]);}
					if(typeof(arguments[i])=='object'){
						if(arguments[i].style.display=='none'){
							if(arguments[i].getAttribute('originaldisplaystyle')==null){
								arguments[i].style.display='';
							}else{
								arguments[i].style.display=arguments[i].getAttribute('originaldisplaystyle');
							}
						}
					}
				}
			}
		},
		
		fixPng: function(){
			if(im_gui.browser.ie6){
				if (document.all && document.body.filters){
					tofix = document.body.getElementsByTagName('img');
					for(var i=0; i<tofix.length; i++){
						var img = tofix[i];
						var imgName = img.src.toUpperCase()
						if (imgName.substring(imgName.length-3, imgName.length) == "PNG"){
							var imgID = (img.id) ? "id='" + img.id + "' " : "";
							var imgClass = (img.className) ? "class='" + img.className + "' " : "";
							var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' ";
							var imgStyle = "display:inline-block;" + img.style.cssText ;
							if (img.align == "left") imgStyle = "float:left;" + imgStyle;
							if (img.align == "right") imgStyle = "float:right;" + imgStyle;
							var imgClick = (img.onclick != null) ? "onclick=\"" + img.onclick + "; anonymous();\"" : "";
							if (img.parentElement.href) imgStyle = "cursor:pointer;" + imgStyle;
							var strNewHTML = "<span " + imgID + imgClass + imgTitle + imgClick 
							+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
							+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
							+ "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>";
							img.outerHTML = strNewHTML;
							i = i-1;
						}
					}
				}
			}
		}
	},
	
	datetime: {
		
		sectotime: function(secs){
			var h,m;
			h=Math.floor(secs / 3600);
			secs -= h*3600;
			m=Math.floor(secs / 60);
			secs -= m*60;
			secs=Math.round(secs);
			if (secs==60) secs=0;
			return ((h>0?(h<10?'0'+h:h)+':':'')+(m<10?'0'+m:m)+':'+(secs<10?'0'+secs:secs));
		}
	},
	
	string: {
		
		pad: function(num,pad,size,side){
			if(typeof(side)=='undefined'){var side='';}
			if (num.length == size) return(num);
			for (var i=num.length-1 ; i<size ; i++){
				if (side=='right'){
					num += ""+pad;
				}else if (side=='left'){
					num=""+pad+num;
				}else{
					num=""+pad+num+pad;
				}
			}
			return (num);
		},
		
		limitStr: function(str, maxLength){
			return (str.length > maxLength-4 ? str.substr(0, maxLength) + ' ...' : str);
		},
		
		stripTags: function(str){
			return str.replace(/<(:?[^>]+)>/gi, '');
		},
		
		toNumber: function(str, forceTo){
			if(typeof(forceTo)=='undefined'){var forceTo='';}
			if(str.toString().indexOf('.')>-1||forceTo=='float'){
				return parseFloat(str);
			}else{
				return parseInt(str);
			}
		}
	},
	
	input: {
		
		initTxtInputs: function(){
			if(arguments.length>0){
				for(var i=0; i<arguments.length; i++){
					if(typeof(arguments[i])=='string'){arguments[i]=im_gui.obj(arguments[i]);}
					if(typeof(arguments[i])=='object'){
						arguments[i].onfocus=function (){im_gui.input.invertValue(this,'focus',this.defaultValue);};
						arguments[i].onblur=function (){im_gui.input.invertValue(this,'blur',this.defaultValue);};
					}
				}
			}else{
				var inps=im_gui.misc.obj('input','tag',document);
				for(i=0;i<inps.length;i++){
					if(inps[i].getAttribute('type')=='text'){
						if(inps[i].getAttribute('invertValue')=='yes'){
							inps[i].onfocus=function (){im_gui.input.invertValue(this,'focus',this.defaultValue);};
							inps[i].onblur=function (){im_gui.input.invertValue(this,'blur',this.defaultValue);};
						}
					}
				}
				var inps=im_gui.misc.obj('textarea','tag',document);
				for(i=0;i<inps.length;i++){
					if(inps[i].getAttribute('invertValue')=='yes'){
						inps[i].onfocus=function (){im_gui.input.invertValue(this,'focus',this.defaultValue);};
						inps[i].onblur=function (){im_gui.input.invertValue(this,'blur',this.defaultValue);};
					}
				}
			}
		},
		
		invertValue: function(objInput, evntRaised, strTxt){
			if (evntRaised=='focus'){
				if(objInput.value==strTxt){objInput.value='';}
			}else if (evntRaised=='blur'){
				if(objInput.value==''){objInput.value=strTxt;}
			}
		},
		
		setInspector: function(){
			for(var i=0;i<arguments.length;i++){
				if(typeof(arguments[i])=='string'){arguments[i]=im_gui.obj(arguments[i]);}
				if(typeof(arguments[i])=='object'){
					arguments[i].onkeypress=function(e){
						var key = (document.all?event.keyCode:e.which);
						var skey = (document.all?event.shiftKey:(key==16?true:false));
						var div = document.createElement('div');div.id='label_'+(Math.random());
						with(div.style){padding='3px';position='absolute';backgroundColor='#B1CDF2';color='#173863';fontSize='11px';
						left=im_gui.misc.findPosX(this)+(this.offsetWidth+1)+'px';top=im_gui.misc.findPosY(this)+'px';};
						if((key>=65&&key<=90&&!skey)||(key>=97&&key<=122&&skey)){div.innerHTML+='<div>CAPS LOCK: ON</div>';}
						if(new RegExp('[א-ת]').test(this.value.substr(-1))){div.innerHTML+='Non-English character!</div>';}
						if(div.innerHTML!=''){document.body.appendChild(div);
						if(typeof(im_effects)=='object'){window.setTimeout('im_effects.fade(\''+div.id+'\', 0, 1000);', 1500);}
						window.setTimeout('document.body.removeChild(im_gui.obj(\''+div.id+'\'));',2600);}
					};
				}
			}
		},
		
		getCursorPosition: function(obj){
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			var iCaretPos=0;
			if (document.selection){ 
				obj.focus();
				var oSel=document.selection.createRange();
				oSel.moveStart('character', -obj.value.length);
				iCaretPos=oSel.text.length;
			}else if (obj.selectionStart||obj.selectionStart=='0'){
				iCaretPos=obj.selectionStart;
			}
			return iCaretPos;
		},
		
		setCursorPosition: function(obj) {
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			if (document.selection){ 
				obj.focus ();
				var oSel=document.selection.createRange ();
				oSel.moveStart('character', -obj.value.length);
				oSel.moveStart('character', iCaretPos);
				oSel.moveEnd('character', 0);
				oSel.select ();
			}else if (obj.selectionStart||obj.selectionStart=='0'){
				obj.selectionStart=iCaretPos;
				obj.selectionEnd=iCaretPos;
				obj.focus();
			}
		}

	},
	
	css: {
		addClass: function(obj, theClassName){
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			if(!this.hasClass(obj,theClassName)){obj.className+=(obj.className=='' ? theClassName : ' '+theClassName);}
		},
		
		removeClass: function(obj, theClassName){
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			obj.className=obj.className.replace(new RegExp('\\b'+theClassName+'$', 'g'), '');
			obj.className=obj.className.replace(new RegExp('\\s'+theClassName+'\\s', 'g'), ' ');
		},
		
		toggleClass: function(){
			if(arguments.length<2){return false;}
			var obj='';
			var theClassName=arguments[arguments.length-1];
			for(var i=0;i<arguments.length-1;i++){
				obj=arguments[i];
				if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
				if(typeof(obj)=='object'){
					if(this.hasClass(obj,theClassName)){this.removeClass(obj,theClassName);}else{this.addClass(obj,theClassName);};
				}
			}			
		},
		
		hasClass: function(obj, theClassName){
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			return new RegExp('\\b'+theClassName+'\\b').test(obj.className);
		},
		
		swapClass: function(obj, theClassName_1, theClassName_2){
			if(typeof(obj)=='string'){var obj=im_gui.obj(obj);}
			if(typeof(obj)!='object'){return false;}
			if(this.hasClass(obj,theClassName_1)){
				obj.className=obj.className.replace(new RegExp('\\b'+theClassName_1+'\\b'), theClassName_2);
			}else if(this.hasClass(obj,theClassName_2)){
				obj.className=obj.className.replace(new RegExp('\\b'+theClassName_2+'\\b'), theClassName_1);
			}
		}
	}
};
