(function(){
GupShup.html.util = GupShup.html.util  || {

/*
 * 	This function will create notification ele of this type
 *	<div id="notification">
 * 		 your text 
 * 		<p>
 * 			<a href="javascript:void(0);" onclick = "someFunct()">Hide</a>
 * 		</p>
 * </div>
 *  
 */
 
createElement : function(type,id,content) {
this.destroyElement(id);
var ele = document.createElement(type);
ele.setAttribute('id',id);
if(typeof content == 'string')
	ele.innerHTML = content;
window.document.body.appendChild(ele);
return ele;
},

createNotificationElement : function(text, onCloseFunct){
	this.destroyElement('notification');
	var closeBox = document.createElement("P");
	var closeLink = document.createElement("A");
	closeLink.innerHTML = "Hide";
	closeLink.setAttribute('href','javascript:void(0);');
	closeLink.onclick = function(){onCloseFunct()};
	closeBox.appendChild(closeLink);
	
	var ele=document.createElement("DIV");
	var textEle = document.createElement("DIV");
	textEle.innerHTML = text;
	ele.appendChild(closeBox);
	ele.appendChild(textEle);
	ele.setAttribute("id",'notification');
	return ele;
},

/*
This function will create Err  ele of this type
<div id="errorBox" style="display:block;">
	<div id="errorMsg">aabra ka dabra </div>
</div>
*/
createErrElement : function(text){
	this.destroyElement('errorBox');
	var msgBox = document.createElement("DIV");
	msgBox.setAttribute('id','errorMsg');
	msgBox.innerHTML = text;
	
	var ele=document.createElement("DIV");
	ele.setAttribute('id','errorBox');
	ele.appendChild(msgBox);
	window.document.body.appendChild(ele);
	return ele;
},

createLoaderElement : function(text){
	this.destroyElement('loader');
	var loader = document.createElement("DIV");
	loader.setAttribute('id','loader');
	loader.innerHTML = text;
	window.document.body.appendChild(loader);
	return loader;
},

showLoader : function(text){
	if(typeof text != 'string' )
		var text = 'Processing your request..';
	loader = this.createLoaderElement(text);
	GupShup.events.register({
				name:'WINDOW_ONSCROLL',
				identifier:'GupShup.html.util.floatLoader',
				handler:GupShup.html.util.floatLoader
				});
	GupShup.html.util.floatLoader();
},

hideLoader : function(){
	this.destroyElement('loader');
	GupShup.events.unregister('GupShup.html.util.floatLoader');
},

floatLoader : function(){
	var loader = document.getElementById("loader");
	GupShup.html.util.alignPopUpTo(loader,{bottom:true,left:true});
},

/*
This function will create toolTip  ele of this type
<div id="toolTip" style="display:none;">
aabra ka dabra
</div>
*
*/
createToolTipElement : function(text){
	this.destroyElement('toolTip');
	var toolTip = document.createElement("DIV");
	toolTip.setAttribute('id','toolTip');
	toolTip.innerHTML = text;
	window.document.body.appendChild(toolTip);
	return toolTip;
},

hideElement : function(elementID, parentDom, dStyle) {
	if(typeof parentDom == "undefined")
		parentDom = document;
	var element = parentDom.getElementById(elementID);
	if(element != null)
		element.style.display = (typeof(dStyle) == "undefined") ? "none" : dStyle;
},

setVisibility : function(elementID, dStyle, parentDom) {
	if(typeof parentDom == "undefined")
		parentDom = document;
	var element = parentDom.getElementById(elementID);
	if(element != null)
		element.style.visibility = dStyle;
},

showElement : function(elementID, isInline, parentDom) {
	if(typeof parentDom == "undefined")
		parentDom = document;
	var element = parentDom.getElementById(elementID);
	if(element != null)
		element.style.display = (isInline == true)? "inline" : "block";
},

destroyElement : function(eleId){
	if(typeof eleId == 'object')
		(eleId.parentNode).removeChild(eleId);
	else
	{
		var ele = document.getElementById(eleId);
		if(ele)
			(ele.parentNode).removeChild(ele);
	}
},

setClass : function(ele,styleClasses){
	
	if(typeof ele == "string")
		ele = document.getElementById(ele);
		
	ele.setAttribute("class", styleClasses);
	ele.setAttribute("className", styleClasses);
	return ele;
},

getElementsByClass : function( searchClass, domNode, tagName) {
	if (domNode == null) domNode = document;
	if (tagName == null) tagName = '*';
	var el = new Array();
	var tags = domNode.getElementsByTagName(tagName);
	var tcl = " "+searchClass+" ";
	for(i=0,j=0; i<tags.length; i++) {
		var test = " " + tags[i].className + " ";
		if (test.indexOf(tcl) != -1)
			el[j++] = tags[i];
	}
	return el;
},

changeTagsDisplayTo : function(src,tagName,style){
var tags = src.getElementsByTagName(tagName);
	for(var i = 0 ; i < tags.length; i++)
	{
		tags[i].style.display = style;
	}
},

showHideElement : function(showId, hideId) {
	this.showElement(showId);
	this.hideElement(hideId);
},

disableBtn : function(Btn) {
	var btn = document.getElementById(Btn);
	if(btn)
	{
		btn.disabled="disabled";
		btn.style.cursor="wait";
		GupShup.html.util.setClass(btn,"dbtn");
	}
},

enableBtn : function(Btn) {
	var btn = document.getElementById(Btn);
	if(btn)
	{
		btn.disabled=false;
		btn.style.cursor="pointer";
		GupShup.html.util.setClass(btn,"mbtn");
	}
},

getWindowEventTarget : function(e){
	if (e.target) target = e.target;
	else if (e.srcElement) target = e.srcElement;
	if (target.nodeType == 3) // defeat Safari bug
		target = targ.parentNode;
	return target;
},

getWindowSize : function(){
  var myWidth = 0, myHeight = 0;
 
  if( typeof( window.innerWidth ) == 'number' )
  {
    //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
  }
  else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
  {
       //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth ;
        myHeight = document.documentElement.clientHeight;
  }
  else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
  {
    //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
  }
 
  var X= myWidth;
  var Y= myHeight;
 
  return {X:X, Y:Y};
},


getScrollXY : function(){
  var scrOfX = 0, scrOfY = 0;
  
  if(typeof( window.pageYOffset ) == 'number')
  {
    //Netscape compliant
        scrOfY = window.pageYOffset;
        scrOfX = window.pageXOffset;
  }
  else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
        scrOfY = document.body.scrollTop;
        scrOfX = document.body.scrollLeft;
  }
  else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
        scrOfY = document.documentElement.scrollTop;
        scrOfX = document.documentElement.scrollLeft ;
  }
 
  var X= scrOfX;
  var Y= scrOfY;
 
  return {X:X, Y:Y};
},

alignPopUpTo : function(popupdiv, pos){
var windowScrolled = this.getScrollXY() ;
var windowSize = this.getWindowSize();
if(pos.top)
	popupdiv.style.top = windowScrolled.Y + "px" ;
if(pos.left)
	popupdiv.style.left = "0px" ;
if(pos.right)
	popupdiv.style.left = (windowSize.X - popupdiv.offsetWidth) + "px" ;
if(pos.bottom)
	popupdiv.style.top = (windowSize.Y + windowScrolled.Y - popupdiv.offsetHeight) + "px" ;
},

adjustPopupTop : function(popupdiv,alignAtCenter,bottomMargin)
{
var windowScrolled = this.getScrollXY() ;
var windowSize = this.getWindowSize();
var popupHeight = parseInt(popupdiv.clientHeight);
var currentPopupTop = parseInt(popupdiv.style.top);
if(!GupShup.util.isNumber(currentPopupTop))
	currentPopupTop = 0;
var adjustedPopuptop = parseInt(currentPopupTop);
if( (windowScrolled.Y + windowSize.Y) < (currentPopupTop + popupHeight))    //if popup going below current window
    {
         adjustedPopuptop = (windowSize.Y + windowScrolled.Y) - (popupHeight + bottomMargin);    //move popup upwards
    }

else if(windowScrolled.Y  > currentPopupTop)    //if popup going above current window
    {
         adjustedPopuptop = windowScrolled.Y;    //move popup downward
    }

if(alignAtCenter)
		adjustedPopuptop = parseInt((windowSize.Y/2 + windowScrolled.Y) - (popupHeight/2));

	popupdiv.style.top = adjustedPopuptop + "px" ;
},

alignBoxAtCenter : function(boxName)
{
	var box = document.getElementById(boxName);	
	var leftPos = this.getposOffset(box);
	var width = box.offsetWidth;
	var ht = box.offsetHeight;
	var windowSize = this.getWindowSize();
	var newLeft = (width >= windowSize.X) ? 0 : (windowSize.X/2 ) - (width/2);
	var newtop = (ht >= windowSize.Y) ? 0 : (windowSize.Y/2 ) - (ht/2);
	box.style.left = newLeft+"px";
	box.style.top = newtop+"px";
},

getposOffset : function(overlay, offsettype){
var totaloffset=(offsettype=="left")? overlay.offsetLeft : overlay.offsetTop;
var parentEl=overlay.offsetParent;
while (parentEl!=null){
totaloffset = (offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
parentEl=parentEl.offsetParent;
}
return totaloffset;
},

getElementPosition : function(referenceObj){
var xpos=this.getposOffset(referenceObj, "left");
var ypos=this.getposOffset(referenceObj, "top");
return{x:xpos,y:ypos,w:referenceObj.offsetWidth,h:referenceObj.offsetHeight};
},

overlay : function(referenceObj, currObj, opt_position, vPad, hPad){
	var xpos=this.getposOffset(referenceObj, "left")+((typeof opt_position!="undefined" && opt_position.indexOf("right")!=-1)? referenceObj.offsetWidth : 0) ;
	var ypos=this.getposOffset(referenceObj, "top")+((typeof opt_position!="undefined" && opt_position.indexOf("bottom")!=-1)? referenceObj.offsetHeight : 0);
	currObj.style.left=xpos+  hPad + "px";
	currObj.style.top=ypos+ vPad + "px";
return true;
},

//change the opacity for different browsers
changeOpac :function(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
},

/*
 * content = {
 * 	msg:'your msg',
 *  element:'yourElement',
      callBack : function()
 * }
 */
showLightBox :function(content)
{
	var blurBg = document.createElement("DIV");
	blurBg.setAttribute("id","blurBg");
	window.document.body.appendChild(blurBg);
	var windowSize = this.getWindowSize();
	var ht = window.document.body.offsetHeight;
	blurBg.style.height =  (ht > 700? ht+100 : 700) + 'px';
	
	if(typeof content.callBack != 'function')
	{
		content.callBack = GupShup.html.util.closeLightBox;
	}
	if(typeof content.msg == 'string')
	{
		var bigErrHolder = this.createBigErr(content);
		this.showElement("bigError");
		this.adjustPopupTop(bigErrHolder,200);
		bigErrHolder.style.left = (windowSize.X - 995)/2 + (730/2 - bigErrHolder.offsetWidth/2 ) + 'px';
	}
	else if(typeof content.element == 'string')
	{
		this.showElement(content.element);
		this.alignBoxAtCenter(content.element);
	}
	this.showElement("blurBg");
	this.changeOpac(50, "blurBg");
},

closeLightBox : function(){
GupShup.html.util.destroyElement('bigError');;
GupShup.html.util.destroyElement('blurBg');
},

createBigErr : function (content)
{
var bigErrHolder = document.createElement("DIV");
bigErrHolder.setAttribute("id",'bigError');

if(typeof content.containerClass == "undefined")
	content.containerClass = "bigErrorWidth";

bigErrHolder.setAttribute("class", content.containerClass);
bigErrHolder.setAttribute("className", content.containerClass);

if(typeof content.width == "number")
	bigErrHolder.style.width = content.width + "px";

if(typeof content.height == "number")
	bigErrHolder.style.height = content.height + "px";


var bigErrTop = document.createElement("DIV");
bigErrTop.setAttribute("class",'bigErrtop bigWarnTopBg');
bigErrTop.setAttribute("className",'bigErrtop bigWarnTopBg');

var closeLink = document.createElement("A");
closeLink.innerHTML = "[x]";
closeLink.setAttribute('href','javascript:void(0);');
closeLink.onclick = content.callBack;

var bigErrMiddle = document.createElement("DIV");

if(typeof content.contentClass == "undefined")
	content.contentClass = "bigWarnMidBg";

bigErrMiddle.setAttribute("class",'middleErr ' + content.contentClass);
bigErrMiddle.setAttribute("className",'middleErr ' + content.contentClass);
bigErrMiddle.innerHTML = content.msg;

var bigErrEnd = document.createElement("DIV");
bigErrEnd.setAttribute("class",'bigErrBot bigWarnBotBg');
bigErrEnd.setAttribute("className",'bigErrBot bigWarnBotBg');

bigErrTop.appendChild(closeLink);
bigErrHolder.appendChild(bigErrTop);
bigErrHolder.appendChild(bigErrMiddle);
bigErrHolder.appendChild(bigErrEnd);

window.document.body.appendChild(bigErrHolder);

return bigErrHolder;
},


clearTextBox : function(box) {
	if(document.getElementById(box))
		document.getElementById(box).value="";
},

submitFormUsingAjax: function(method, url, callback, formName, isMultiPartData) {
	if(isMultiPartData == null || typeof isMultiPartData == 'undefined')
	{
		isMultiPartData = false;
	}
	var cObj = GupShup.ajax.sendForm(method, url, callback, formName, isMultiPartData);
},

getEntityAccessUrl : function(groupName)
{
	return GupShup.conf.fromUrl + "/groups/" + GupShup.util.trim(groupName);
},

isNickValid : function(nick1, len)
{
	var filter1 = /^[\w]+$/;
	var filter2 = /^[\d]+$/;
	
	var nick = GupShup.util.trim(nick1);
	var maxNickLen = (typeof(len) == "number") ? len : 10; 
		if(nick.length < 1)
	{
		return {status : false, err : GupShup.html.errorMessages.blankNick, code:'LENGTH'};
	}
	else if(nick.length > maxNickLen)
	{
		return {status : false, err : GupShup.html.errorMessages.invalidNick, code:'LENGTH'};
	}
	else if(!filter1.test(nick) || filter2.test(nick))
    {
        return {status : false, err : GupShup.html.errorMessages.invalidNick, code:'INVALID_CHAR'};
    }
    if(!GupShup.util.isValidContent(nick,restrictedNames) || !GupShup.util.isValidContent(nick,stopWords))
    {
		return {status : false, err : GupShup.html.errorMessages.blockedNick, code:'NOT_ALLOWED'};
    }
	
	return {status : true};
},

validatePhoneList : function(content, chkForGrpName){
	var content = GupShup.util.trim(content);
	var count = 0;
	var recvList = content.split(',');
	var index = 0;
	var validPhones = new Array();
	for(index = 0; index < recvList.length ; index++)
	{
		var recvr = GupShup.util.trim(recvList[index]);
		if(recvr.length > 0)
		{
			if(chkForGrpName)
			{
				if(GupShup.util.isNumber(recvr) && !GupShup.util.validatePhoneNumber(recvr)) 
					return {status:'INVALID'};
			
				else if(chkForGrpName && !GupShup.util.isNumber(recvr) && GupShup.util.isValidGroupName(recvr).code != 'VALID') //Chk is valid group name
					return {status:'INVALID'};
			}
			else
			{
				if(!GupShup.util.isNumber(recvr) || !GupShup.util.validatePhoneNumber(recvr)) 
					return {status:'INVALID'};
			}
			
			count++;
	
			var validEntry = GupShup.util.isNumber(recvr) ? GupShup.util.getValidIndianPhoneNumber(recvr) : recvr;
			
			for(var i = 0 ; i < validPhones.length; i++)
			{
				if(validPhones[i] == validEntry)
					return {status:'DUPLICATE'};					
			}
			validPhones.push(validEntry);
		}
	}
	return {status:'VALID',total:count};
},

reloadIFrame : function(parentDom, iframeId) {
	var frame = parentDom.getElementById(iframeId);
	var src = frame.src;
	var dt = new Date();
	var params = "sid=" + dt.getTime();
	if(src.indexOf("?") > -1)
		params = "&" + params;
	else
		params = "?" + params;
	frame.src = src + params;
},

addIFrame : function(parentDom, props) {
	var frame = parentDom.getElementById(props.id);	

	if(frame != null)
	return frame;

	var isIE = (navigator.appName == "Microsoft Internet Explorer") ? true : false; 
	var ifrm = null;
	//IE dont consider setAttribute for border and all :(
	if(isIE)
		ifrm = parentDom.createElement('<IFRAME frameborder="0" vspace="0" hspace="0" scrolling="no"></IFRAME>');
	else
	{
		ifrm = parentDom.createElement("IFRAME");
		ifrm.setAttribute("frameborder", "0");
		ifrm.setAttribute("vspace", "0");
		ifrm.setAttribute("hspace", "0");
		ifrm.setAttribute("border", "0");
		ifrm.setAttribute("scrolling", "no");
	}
	
	ifrm.setAttribute("src", props.src); 
	ifrm.setAttribute("id", props.id);
	ifrm.setAttribute("name", props.name);
	if(typeof props.width == "number" && typeof props.height == "number")		
	{
		ifrm.style.width = props.width + "px"; 
		ifrm.style.height = props.height + "px";
	}
	if(typeof(props.position) == "string")
	{
	   ifrm.style.position = props.position;
	   ifrm.style.left = "0px";
	   ifrm.style.top = "0px";
	   ifrm.style.zIndex = "100";
	}
	parentDom.body.appendChild(ifrm);
	return ifrm;
},

moveElementOverIfrmae : function(refEle, targetEleInParent, frameId, parentDom, vPad, hPad){
	var frame = parentDom.getElementById(frameId);
	if(frame == null || typeof(frame) == "undefined")
		return;
	
	var target = parentDom.getElementById(targetEleInParent);
	if(target == null || typeof(target) == "undefined")
		return;
	
	var refElePosInIframe = GupShup.html.util.getElementPosition(refEle);	
	hPad += refElePosInIframe.x;
	vPad += refElePosInIframe.y;
	GupShup.html.util.overlay(frame,target,"left top",vPad,hPad);
},

isIE : function(){
	return (navigator.appName == "Microsoft Internet Explorer") ? true : false;
},

caluclateDocDimension : function(doc){
	if(GupShup.html.util.isIE())
	{
		return {h: doc.body.scrollHeight, w: doc.body.scrollWidth};
	}
	else
	{
		return {h: doc.body.offsetHeight, w: doc.body.offsetWidth};
	}
},

autoIframeResize : function(parentDom, frameId, iframeDim){
	var frame = parentDom.getElementById(frameId);
	
	if(frame == null || typeof(frame) == "undefined")
		return;
		
	var objToResize = (frame.style) ? frame.style : frame;
	
	//If Container has "display:none" den Browsers fails to calculate InnerDOM size, hence display container first
	objToResize.display = "block";
	
	var dim = null;
	
	if(typeof iframeDim == "undefined")
	{
		if(GupShup.html.util.isIE())
			dim = GupShup.html.util.caluclateDocDimension(frame.contentWindow.document);
		else
			dim = GupShup.html.util.caluclateDocDimension(frame.contentDocument);
	}
	else
		dim = iframeDim;
	
	if(dim.h > 0)
	{
		objToResize.display = "block";
		objToResize.height = dim.h + "px";
	}
},

popUpIframeResize : function(parentDom, frameId, iframeDim){
	var frame = parentDom.getElementById(frameId);
	
	if(frame == null || typeof(frame) == "undefined")
		return;
		
	var objToResize = (frame.style) ? frame.style : frame;
	
	//If Container has "display:none" den Browsers fails to calculate InnerDOM size, hence display container first
	objToResize.display = "block";
	
	var dim = null;
	
	if(typeof iframeDim == "undefined")
	{
		if(GupShup.html.util.isIE())
			dim = GupShup.html.util.caluclateDocDimension(frame.contentWindow.document);
		else
			dim = GupShup.html.util.caluclateDocDimension(frame.contentDocument);
	}
	else
		dim = iframeDim;

	objToResize.height = dim.h + "px";
	objToResize.width = dim.w + "px";
},

changeParentWindow : function (href){
	return function(){self.parent.window.location = href;}
},

changeParentWindowSmartly : function(oldHref, newHref){
	if(newHref.indexOf("http://") == 0)
		self.parent.window.location = newHref;
	else
		self.parent.window.location = oldHref;
},

changeHrefsInIFRAME : function(parentDom, frameId){
	var frame = parentDom.getElementById(frameId);
	var innerDoc = (frame.contentDocument) ? frame.contentDocument : frame.contentWindow.document;

	//Change HRFE in all iframes to point parent
	var aArray = innerDoc.getElementsByTagName("A");
	for(var k = 0; k < aArray.length;  k++)
	{
		if(aArray[k].target == "_blank" || aArray[k].target == "_BLANK")
			continue;
	
		var href = aArray[k].href;
		//ignore all A tags which are not leading to new page
		if(href.indexOf("#") < 0 && href.indexOf("javascript") < 0)
		{
			//if tags having HREF like $XXX$ (template Key)
			if(href.indexOf("$") > -1)
			{
				var key = href.substring(href.indexOf("$"),href.lastIndexOf("$") + 1);
				aArray[k].href = "javascript:self.parent.GupShup.html.util.changeParentWindowSmartly('" + href + "','" + key + "');";
			}
			else
			{
				aArray[k].href = "#";
				aArray[k].onclick = GupShup.html.util.changeParentWindow(href);
			}
		}
	}
},

attachEventToObj : function(obj, event, handler){
	var isIE = (navigator.appName == "Microsoft Internet Explorer") ? true : false; 
	if(isIE)
	{
		if (obj.addEventListener) {
		 obj.addEventListener(event, handler, false);
		} else if (obj.attachEvent) {
		 obj.attachEvent("on" + event, handler);
		}
	}
	else
		obj["on" + event] = handler;
},

getDestinationsForReplies : function(text) {
	var destPattern = /^@(\w+)$/;
	text = GupShup.util.trim(text);
	var replyWords = text.split(/[\s!"#$%&'()*+,-./:;<=>?[\]^_`{|}~]/);	//Split on punctuation or white space
	var noOfGrps = 0;
	var wordWithNoAtPresent = false;
	for(var k = 0; k < replyWords.length; k++)
	{
		var w = GupShup.util.trim(replyWords[k]);
		if(destPattern.test(w))
			noOfGrps++;
		else if(w.length > 0)
			wordWithNoAtPresent = true;
	}
	
	return {count:noOfGrps, isTextPresent : (wordWithNoAtPresent && (noOfGrps > 0))};
}
}})();
