/*
Set document.domain to root domain, this will pass root domain to subsequent included javascript origin checks.
Useful for allowing IFRAME orginating from sub-domians to access parent DOM coming from another domain
@ref : https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript
*/
if(typeof documentDomain != "undefined")
	document.domain = documentDomain;

if (typeof GupShup == "undefined" || !GupShup) {
    /**
     * The GupShup global namespace object.  If GupShup is already defined, the
     * existing GupShup object will not be overwritten so that defined
     * namespaces are preserved.
     * @class GupShup
     * @static
     */
    var GupShup = {};
}

/**
 * Returns the namespace specified and creates it if it doesn't exist
 * <pre>
 * GupShup.namespace("property.package");
 * GupShup.namespace("GupShup.property.package");
 * </pre>
 * Either of the above would create GupShup.property, then
 * GupShup.property.package
 *
 * Be careful when naming packages. Reserved words may work in some browsers
 * and not others. For instance, the following will fail in Safari:
 * <pre>
 * GupShup.namespace("really.long.nested.namespace");
 * </pre>
 * This fails because "long" is a future reserved word in ECMAScript
 *
 * @method namespace
 * @static
 * @param  {String*} arguments 1-n namespaces to create 
 * @return {Object}  A reference to the last namespace object created
 */
GupShup.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=a[i].split(".");
        o=GupShup;

        // GupShup is implied, so it is ignored if it is included
        for (j=(d[0] == "GupShup") ? 1 : 0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }

    return o;
};

/*
 * Initializes the global by creating the default namespaces and applying
 * any new configuration information that is detected.  This is the setup
 * for env.
 * @method init
 * @static
 * @private
 */
(function() {
    GupShup.namespace("widget", "conf", "conf.user", "conf.actions", "callback", "html", "forms" , "html.dynamic", "constants");
})();

GupShup.constants = {
	MILLISEC_IN_ONE_DAY : 1000 * 60 * 60 * 24	
};

/**
 * Provides the utility functions used across the site
 * @class GupShup.util
 */
GupShup.util = GupShup.util || {

JSON_SECURE_START : "/*-secure-",

JSON_SECURE_END : "*/",

trim : function(str)
{ 
	return((""+str).replace(/^\s*([\s\S]*\S+)\s*$|^\s*$/,'$1') ); 
},

getSwfPath : function(fileName){
	fileName = GupShup.util.trim(fileName);
	var arr = fileName.split(".",2); 
	return GupShup.conf.staticImageUrl + '/images/swf/' + GupShup.util.trim(arr[0]) + GupShup.conf.websiteVersion + '.swf';
},


isInitialized : function(variable)
{ 
	return ((typeof (variable) != 'undefined') && (variable != null)); 
},

isNumber : function(str)
{
	var filter=/^[\d]+$/;
	return filter.test(str);
},

isPosiviteFloatNumber : function (str)
{
	str = this.trim(str);
	return /^[+]?[0-9]*(\.[0-9]+)?$/.test(str);
},

isFloatNumber : function (str)
{
	str = this.trim(str);
	return /^[-+]?[0-9]*(\.[0-9]+)?$/.test(str);
},

getDateDiffInDays : function (date1, date2) {
    return (date1.getTime() - date2.getTime())/GupShup.constants.MILLISEC_IN_ONE_DAY;
},

validatePhoneNumber : function(num, isInternational){
	num = this.trim(num);
	if(this.isNumber(num))
	{
		if(typeof isInternational == "undefined" || isInternational == false)
		{
			if(num.length == 10 && num.substring(0,1) != "0")
				return true;
			else if(num.length == 12 && num.substring(0,2) == "91" && num.substring(2,3) != "0")
				return true;
			else
				return false;	
		}
		else
			return true;
	}
	else
		return false;	
},

getValidIndianPhoneNumber : function(num){
	num = this.trim(num);
	if(GupShup.util.validatePhoneNumber(num))
	{
		if(num.length == 12)
			return num;
		else
			return "91" + "" + num;
	}
	else
		return "";
},

escapeCharsForHTML : function(str, replaceLineBreaks){
	var op = "";
	
	for (var i = 0; i < str.length; i++) 
	{
		var c = str.charAt(i);
		if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c == '*')
			op += c;
		else if(c == ' ')
			op += " ";				
		else if(c == '\n')
		{
			if(replaceLineBreaks == true)
				op += " ";
		  	else
		  		op += c;
		}
		else if(str.charCodeAt(i) != 0)
		 op += "&#" + str.charCodeAt(i) + ";";
	}
	
	return op;	  		
},

replaceNewLine : function(str, c)
{
	return str.replace(/\n/g,c);
},

removeCarriageReturn : function (str)
{
	if (!GupShup.util.isInitialized(str))
		return str;

	return str.replace(/\r/g,'');
},

isAscii : function(str)
{
	for (i=0;i<str.length;i++) 
	{
	  if(str.charCodeAt(i) == 13 || str.charCodeAt(i) == 10)
	  	continue;
	  
	  if(!GupShup.util.isPrintableAsciiChar(str.charCodeAt(i)))
		return false;
	}
	return true;
},

isPrintableAsciiChar : function (ch)
{
	return ((ch > 31) && (ch < 128));
},
isWord : function(str)
{
    return /^[\w]+$/.test(str);
},

isValidContent : function(content,objectionableList)
{
	var words = content.split(" ");
	for(j = 0 ; j < words.length ; j++)
	{
		var str = this.trim(words[j].toLowerCase());
		for(i = 0 ;  i < objectionableList.length ; i ++)	
		{	
			var objectionableWord  = this.trim(objectionableList[i].toLowerCase());
			if(str.indexOf(objectionableWord) != -1)		
				return false;
		}
	}
	return true;
},

isValidGroupName : function(name){
	return GupShup.util.isValidGroupNameWithLen(name, 5, 15);
},

isValidGroupNameWithLen : function (name, minLen, maxLen) {
	var filter1 = /^[\w]+$/;
	var filter2 = /^[\d]+$/;
	if((name.length < minLen) || (name.length > maxLen))
	{
		return  {code :'SHORT_NAME', err : GupShup.html.errorMessages.groupNameGivenLength(minLen, maxLen)} ;
	}
	if(!this.isValidContent(name,restrictedNames))
	{
		return { code :'RESTRICTED_NAME' , err : GupShup.html.errorMessages.blockedGroupName};
	}	
	if(!this.isValidContent(name,stopWords))
	{
		return { code :'RESTRICTED_NAME' , err : GupShup.html.errorMessages.blockedGroupName};
	}
	if(!filter1.test(name))
	{
		return { code :'INVALID_NAME' , err : GupShup.html.errorMessages.invalidCharInGroup};
	}
	if(filter2.test(name))
	{
		return { code :'INVALID_NAME' , err : GupShup.html.errorMessages.invalidGroupName};
	}
	return { code :'VALID'};	
},

isValidTagName : function(name){
	var filter1 = /^[\w]+$/;
	var filter2 = /^[\d]+$/;
	if(name.length > 20)
	{
		return  {code :'LONG_NAME', err : GupShup.html.errorMessages.maxTagName} ;
	}
	if(!this.isValidContent(name,restrictedNames))
	{
		return { code :'RESTRICTED_NAME' , err : GupShup.html.errorMessages.blockedTagName};
	}	
	if(!this.isValidContent(name,stopWords))
	{
		return { code :'RESTRICTED_NAME' , err : GupShup.html.errorMessages.blockedTagName};
	}
	if(!filter1.test(name))
	{
		return { code :'INVALID_NAME' , err : GupShup.html.errorMessages.invalidCharInTag};
	}
	if(filter2.test(name))
	{
		return { code :'INVALID_NAME' , err : GupShup.html.errorMessages.invalidCharInTag};
	}
	return { code :'VALID'};
},

isValidEmail : function(value)
{
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	if(filter.test(this.trim(value)))
		return true;
	else
		return false;
	
},

isValidPhone : function(cCode, phone) {
	var phone = this.trim(phone);
	var cCode = this.trim(cCode);
	if(phone.length < 1 || cCode.length < 1)
	{
		return false;
	}
	
	if(cCode != "91")
	{
		if(!this.validatePhoneNumber(phone,true))
		{
			return false;
		}
	}
	else
	{
		if(!this.validatePhoneNumber(phone,false))
		{
			return false;
		}
	}
	
	return true;
},

changeCCodeLabel : function (frm,target, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	var cCodeEle = pDom.getElementById(frm);
	var code = this.trim(cCodeEle.value);
	while(code.length < 4)
	{
		code = "0" + code;
	}
	pDom.getElementById(target).innerHTML = code;
	return code;
},

isValidUrl : function(url) {
	url = this.trim(url);
	if(url.substr(0,4) != 'http')
		url = 'http://' + url;
	var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	return regexp.test(this.trim(url));
},


isValidEmail : function(email) {
	var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	return filter.test(this.trim(email));
},

putDummyPassword : function(obj)
{
	obj.value = this.getDummyPassword(obj.value.length);
},

getDummyPassword : function(pwdLen) {
	var dummy = '';
	for (var i = 0; i < pwdLen; ++i)
		dummy += '*';
	
	return dummy;
},

/* Using 'element.innerHTML' gives you innerText which is escaped for special HTML characters.
 * To get exactly what we have inside an element - IE supports element.innerText while
 * FireFox provides element.textContent. 
 */
getElementText : function(element) {
	return (element.innerText || element.textContent);
},

removeHTMLComments : function(str){
	return str.replace('<!--', '').replace('-->', '');
},

getInnerHTML : function(elementName, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	return (pDom.getElementById(elementName).innerHTML);
},

getTemplateHTML : function(templateDivId, pDom) {
	return GupShup.util.removeHTMLComments(GupShup.util.getInnerHTML(templateDivId, pDom));
},

getAndClearInnerHTML : function(elementName, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	var html = pDom.getElementById(elementName).innerHTML;
	pDom.getElementById(elementName).innerHTML = "";
	return (html);
},

setInnerHTML : function(elementName, content, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	pDom.getElementById(elementName).innerHTML = content;
},

copyContent : function(srcElementId, targetElementId, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	var srcElement = pDom.getElementById(srcElementId);
	var targetElement = pDom.getElementById(targetElementId);
	targetElement.innerHTML = srcElement.innerHTML;
},

getPlaceHolderUrl : function (placeHolder)
{
	return GupShup.conf.placeHolderUrlTemplate.replace('<>', placeHolder);
},

expandTemplateInDiv : function(parentDivId, tmplDivId, tmplPlaceHolderMap, dataObjArray, pDom) {
	if(typeof pDom == "undefined")
		pDom = document;

	var template = GupShup.util.getTemplateHTML(tmplDivId , pDom);
	var innerHTML = GupShup.util.expandTemplate(template, tmplPlaceHolderMap, dataObjArray, pDom);
	
	/* Get the div into which the inner HTML should be plugged in, and plug in the HTML. */
	var parentDiv = pDom.getElementById(parentDivId);
	parentDiv.innerHTML = innerHTML; 
},

expandTemplate : function(template, tmplPlaceHolderMap, dataObjArray, pDom) {

	if(typeof pDom == "undefined")
		pDom = document;

	 // Initialze with an array having empty object. 
	 // Thus, if there are any fixedMembers in the template they will be replaced.
	if(!GupShup.util.isInitialized(dataObjArray))
		dataObjArray = [{}];
		
	var innerHTML = "";
	
	/* For each entry in the data Array, 
	 * Get the list of replacement instructions in the Map
	 * Execute each instruction on the each element in the array
	 */
	for(var i=0; i < dataObjArray.length; i++)
	{
		var dataEntry = dataObjArray[i];
		var expansion = template;
		
		for(var j=0; j < tmplPlaceHolderMap.length; j++)
		{
			var entry = tmplPlaceHolderMap[j];
			
			if(!GupShup.util.isInitialized(entry) || !GupShup.util.isInitialized(entry.key))
				continue;
			
			var key = entry.key;
			
			var replacementData = GupShup.util.getReplacementData(entry, dataEntry, i, pDom);

			var regExObj = new RegExp("\\$", 'g'); // Fix the key for the '$' sign
			key = key.replace(regExObj, '\\\$');
			regExObj = new RegExp(key, 'g'); // Form the regEx to be replaced in the template.

			expansion = expansion.replace(regExObj, replacementData);
		}

		innerHTML += expansion; 
	}

	return innerHTML;
},

getReplacementData : function (templateEntry, dataEntry, pos, pDom)
{
	if(typeof pDom == "undefined")
		pDom = document;

	var replacementData = '';
	
	if(typeof(templateEntry) == "undefined")
		return replacementData; 
	
	if (typeof templateEntry.dataMember != "undefined")
	{
		replacementData = GupShup.util.getObjMemberVal(dataEntry, templateEntry.dataMember);
		if(typeof templateEntry.dataProcessor == "function")
			replacementData = templateEntry.dataProcessor(replacementData, dataEntry, pos);
	}
	else if (typeof templateEntry.fixedMember != "undefined")
	{
		replacementData = templateEntry.fixedMember;
		if(typeof templateEntry.dataProcessor == "function")
			replacementData = templateEntry.dataProcessor(replacementData, dataEntry, pos);
	}
	else if (typeof templateEntry.templateMember == "object")
	{
		var newDataObjArr = null;
		var tmplHTML ='';
		if (typeof templateEntry.templateMember.tmplGenerator == "function")
			tmplHTML = templateEntry.templateMember.tmplGenerator(templateEntry.templateMember.tmplDivId);
		else
			tmplHTML = GupShup.util.getTemplateHTML(templateEntry.templateMember.tmplDivId, pDom);
		var tmplMap = templateEntry.templateMember.tmplMap;
		if (typeof templateEntry.templateMember.templateDataMember != "undefined")	// Value must be array if defined
			newDataObjArr = GupShup.util.getObjMemberVal(dataEntry, templateEntry.templateMember.templateDataMember);
		else if (typeof templateEntry.templateMember.templateDataGenerator == "function")
			newDataObjArr = templateEntry.templateMember.templateDataGenerator(dataEntry);
		else
			newDataObjArr = [dataEntry];
		replacementData = GupShup.util.expandTemplate(tmplHTML, tmplMap, newDataObjArr);
	}
	else if (typeof templateEntry.templateOptions == "object")
	{
		var newDataObjArr = null;
		if (typeof templateEntry.templateDataMember != "undefined")	// Value must be array if defined
			newDataObjArr = GupShup.util.getObjMemberVal(dataEntry, templateEntry.templateDataMember);
		else if (typeof templateEntry.templateDataGenerator == "function")
			newDataObjArr = templateEntry.templateDataGenerator(dataEntry);
		else
			newDataObjArr = [dataEntry];
		
		for(var i=0; i<newDataObjArr.length; i++)
		{
			var templateIndex = templateEntry.templateSelector(newDataObjArr[i],dataEntry);
			if(templateIndex >= 0)
			{
				var template = templateEntry.templateOptions[templateIndex];
				var tmplHTML = '';
				if (typeof template.tmplGenerator == "function")
					tmplHTML = templateEntry.templateOptions[templateIndex].tmplGenerator(template.tmplDivId);
				else
					tmplHTML = GupShup.util.getTemplateHTML(template.tmplDivId, pDom);
				var tmplMap = template.tmplMap;
				replacementData += GupShup.util.expandTemplate(tmplHTML, tmplMap, [newDataObjArr[i]]);
			}
		}
	}

	return replacementData;
},

getObjMemberVal : function(obj, dataMemberName) {
	var val = null;
	if((obj != null) && (dataMemberName != null) && (GupShup.util.trim(dataMemberName).length > 0))
	{
		/* Get the member hierarchy in the object and traverse it to get the requested element. */
		var memberArr = dataMemberName.split('.');
		if(typeof obj[memberArr[0]] != 'undefined')
		{
			val = obj[memberArr[0]];
			for(var i=1; i<memberArr.length; i++)
			{
				if(typeof val[memberArr[i]] != 'undefined')
					val = val[memberArr[i]];
				else
					return "";
			}
		}
	}
	
	return (val == null)? "" : val;
},
/*	function call shud be  --> 
	expandPaginationTemplate(reqObj,pagination)
	reqObj =  {
			navOnClickFunction : 'javascript:GupShup.util.getJsonItems',
			url:'http://smsgupshup.com/getJsonItems',
			queryStr:'type=GLOBAL_FEATURED&sortyBy=recency', 
			callBack:{
			success:indexAjaxHandler,
			failure:indexAjaxHandler,
			argument:{type:'GLOBAL_FEATURED'} 
			} 
		}

	pagination {
	start : 0,
	total : 100,
	returned : 5,
	windowSize: 3,
	listType : "subscribers" ,"posts"....,
	itemsPerPage : 10,
	template : 'defaultPaginationTemplate',
	doc : domObj,
	scrollToTop : true
	}
	*/
expandPaginationTemplate : function(reqObj, pagination , context, doc){
	
	if(typeof doc == 'undefined')
		doc = document;

	if(pagination.windowSize == 1)
		return this.expandDefaultPaginationTemplate(reqObj, pagination , context, doc);
	
	var offset = 0;
	
	if(!isNaN(pagination.start))
		offset = parseInt(pagination.start);
		
	var itemsPerPage = GupShup.conf.ITEMS_PER_PAGE;
	
	if(!isNaN(pagination.itemsPerPage))
		itemsPerPage = parseInt(pagination.itemsPerPage);
	
	var totalItems = parseInt(pagination.total);
		
	var itemsRetrived = parseInt(pagination.returned);
	var currentPage = (offset/itemsPerPage) + 1;
	var totalPages = Math.ceil(totalItems/itemsPerPage);
	
	var navOnClickFunction = "javascript:GupShup.util.getJsonItems";
	var reqType = '';
	var pgUrl = '';
	var scrollToTop = "window.scroll(0,0);";
	if(typeof pagination.scrollToTop != "undefined" && pagination.scrollToTop == false)
		scrollToTop = "";
		
	if (GupShup.util.isInitialized(reqObj.navOnClickFunction))
	{
		navOnClickFunction = reqObj.navOnClickFunction;
		reqType = 'ONCLICK';
	}
	else
	{
		pgUrl = reqObj.url;
		if(reqObj.url.indexOf("?") < 0)
			pgUrl += "?" + reqObj.queryStr;
		else
			pgUrl += "&" + reqObj.queryStr;
		
		if(typeof reqObj.callBack == 'object')
			reqType = 'AJAX';
		else
			reqType = 'RELOAD';
	}
	
	/*No need for pagination if no items retrived or items retrived are less than demand*/
	if(totalItems < 1 || ((currentPage == 1) && ((itemsRetrived < itemsPerPage) || (totalItems == itemsPerPage))))
	{
		return "";
	}
	
	var hmPgLink,prevPgLink,nextPgLink,endPgLink;
	var hmPgF,prevPgF,nextPgF,endPgF;
	
	if(currentPage == 1)
	{
		prevPgLink = pgUrl + "&page=1";
	}
	else
	{
		prevPgLink = pgUrl + "&page=" + (currentPage-1);
	}
	if(currentPage == totalPages)
	{
		nextPgLink = pgUrl + "&page=" + totalPages;
	}
	else
	{
		nextPgLink = pgUrl + "&page=" + (currentPage+1);
	}
	
	hmPgLink = pgUrl + "&page=1";
	endPgLink = pgUrl + "&page=" + totalPages;
	
	switch(reqType)
	{
		case 'ONCLICK':
		case 'AJAX':{
						prevPgLink = nextPgLink = hmPgLink = endPgLink = 'javascript:void(0);';
						GupShup.conf[context] = {};
						GupShup.conf[context].window = new Array();
						navOnClickFunction = navOnClickFunction + "(GupShup.conf." + context + ".$PAGE$);" + scrollToTop + "return(false);" 
						break;
					}
		case 'RELOAD': navOnClickFunction = "return(true);";
						break;
	}
	
	var windowContent = "";
	var windowSize = pagination.windowSize > totalPages ?  totalPages : pagination.windowSize; 
	
	//check if navigation window start with 1st page eg: <1> 2 <3> <4> <5>
	if(currentPage <= Math.floor(windowSize/2))
	{
		for(var i = 1 ; i <= windowSize ; i ++ )
		{
			if(currentPage == i)
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationCurrentLinkTemplate'),GupShup.templates.paginationCurrentLinkMap,[{pageNo:i}]);
			else
			{
				var windowPos = i%windowSize;
				GupShup.conf[context].window[windowPos] = this.clone(reqObj);
				GupShup.conf[context].window[windowPos].start = itemsPerPage*(i-1);
				GupShup.conf[context].window[windowPos].limit = itemsPerPage;
				var windowNavFunct = navOnClickFunction.replace('$PAGE$','window[' + windowPos + ']');
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationActiveLinkTemplate'),GupShup.templates.paginationActiveLinkMap,[{url:(pgUrl + "&page=" + i),activeFunct:windowNavFunct,pageNo:i}]);
			}
		}
	}
	
	//check if navigation window reached to end  eg:  <6> <7> <8> 9 <10>
	else if(currentPage > (totalPages - Math.ceil(windowSize/2)))
	{
		for(var i = (totalPages - (windowSize-1)); i <= totalPages ; i ++ )
		{
			if(currentPage == i)
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationCurrentLinkTemplate'),GupShup.templates.paginationCurrentLinkMap,[{pageNo:i}]);
			else
			{
				var windowPos = i%windowSize;
				GupShup.conf[context].window[windowPos] = this.clone(reqObj);
				GupShup.conf[context].window[windowPos].start = itemsPerPage*(i-1);
				GupShup.conf[context].window[windowPos].limit = itemsPerPage;
				var windowNavFunct = navOnClickFunction.replace('$PAGE$','window[' + windowPos + ']');
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationActiveLinkTemplate'),GupShup.templates.paginationActiveLinkMap,[{url:(pgUrl + "&page=" + i),activeFunct:windowNavFunct,pageNo:i}]);
			}
		}
	}
	
	//navigation window has current page at center eg:  <3> <4>  5  <6> <7>
	else
	{
		for(var i = (currentPage - Math.floor(windowSize/2)); i < (currentPage + Math.ceil(windowSize/2))  ; i ++ )
		{
			if(currentPage == i)
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationCurrentLinkTemplate'),GupShup.templates.paginationCurrentLinkMap,[{pageNo:i}]);
			else
			{
				var windowPos = i%windowSize;
				GupShup.conf[context].window[windowPos] = this.clone(reqObj);
				GupShup.conf[context].window[windowPos].start = itemsPerPage*(i-1);
				GupShup.conf[context].window[windowPos].limit = itemsPerPage;
				var windowNavFunct = navOnClickFunction.replace('$PAGE$','window[' + windowPos + ']');
				windowContent += this.expandTemplate(GupShup.util.getInnerHTML('paginationActiveLinkTemplate'),GupShup.templates.paginationActiveLinkMap,[{url:(pgUrl + "&page=" + i),activeFunct:windowNavFunct,pageNo:i}]);
			}
		}
		
	}
	
	if(typeof GupShup.conf[context] == 'object')
	{
		GupShup.conf[context].homePage = this.clone(reqObj);
		GupShup.conf[context].homePage.start = 0;
		GupShup.conf[context].homePage.limit = itemsPerPage;
		GupShup.conf[context].nextPage = this.clone(reqObj);
		GupShup.conf[context].nextPage.start = itemsPerPage*(currentPage < totalPages  ? currentPage : (totalPages-1));
		GupShup.conf[context].nextPage.limit = itemsPerPage;
		GupShup.conf[context].prevPage = this.clone(reqObj);
		GupShup.conf[context].prevPage.start = itemsPerPage*(currentPage > 1 ? (currentPage - 2) : 0);
		GupShup.conf[context].prevPage.limit = itemsPerPage;
		GupShup.conf[context].endPage = this.clone(reqObj);
		GupShup.conf[context].endPage.start = itemsPerPage*(totalPages-1);
		GupShup.conf[context].endPage.limit = itemsPerPage;
	}
	
	var lType = 'messages';
	if(typeof pagination.listType == 'string')
		lType = pagination.listType;
	var dataForMap =[{
					listType: lType,
					start:(offset+1),
					limit:(offset + itemsRetrived),
					total: totalItems,
					homePageLink:hmPgLink,
					prevPageLink:prevPgLink,
					nextPageLink:nextPgLink,
					endPageLink:endPgLink,
					homePageFunct:navOnClickFunction.replace('$PAGE$','homePage'),
					prevPageFunct:navOnClickFunction.replace('$PAGE$','prevPage'),
					nextPageFunct:navOnClickFunction.replace('$PAGE$','nextPage'),
					endPageFunct:navOnClickFunction.replace('$PAGE$','endPage'),
					content:windowContent
					}]
	
	var tmpl = (typeof(pagination.template) == "undefined") ? 'paginationTemplate' : pagination.template;
	 
	var op = this.expandTemplate(GupShup.util.getInnerHTML(tmpl, doc),GupShup.templates.paginationMap,dataForMap, doc);
	return op;
},

/*
function call shud be  --> 
	expandPaginationTemplate(reqObj,pagination)
	reqObj =  {
			navOnClickFunction : 'javascript:GupShup.util.getJsonItems',
			url:'http://smsgupshup.com/getJsonItems',
			queryStr:'type=GLOBAL_FEATURED&sortyBy=recency', 
			callBack:{
			success:indexAjaxHandler,
			failure:indexAjaxHandler,
			argument:{type:'GLOBAL_FEATURED'} 
			} 
		}
	pagination  = {
	start : 0,
	returned : 10,
	windowSize: 1
	}
	pagination.windoSize  shud be 1
*/
expandDefaultPaginationTemplate : function(reqObj, pagination , context, doc){
	
	var offset = 0;
	
	if(typeof doc == 'undefined')
		doc = document;

	if(!isNaN(pagination.start))
		offset = parseInt(pagination.start);
	
	var itemsPerPage = GupShup.conf.ITEMS_PER_PAGE;
	
	if(!isNaN(pagination.itemsPerPage))
		itemsPerPage = parseInt(pagination.itemsPerPage);
	
	
	var itemsRetrived = parseInt(pagination.returned);
	var currentPage = (offset/itemsPerPage) + 1;
	
	var navOnClickFunction = "javascript:GupShup.util.getJsonItems";
	var reqType = '';
	var pgUrl = '';
	
	var scrollToTop = "window.scroll(0,0);";
	if((typeof pagination.scrollToTop != "undefined" && pagination.scrollToTop == false) || (itemsPerPage < GupShup.conf.ITEMS_PER_PAGE))
		scrollToTop = "";
	if(typeof pagination.scrollToTop != "undefined" && pagination.scrollToTop == true)
		scrollToTop = "window.scroll(0,0);";
		
	if (GupShup.util.isInitialized(reqObj.navOnClickFunction))
	{
		navOnClickFunction = reqObj.navOnClickFunction;
		reqType = 'ONCLICK';
	}
	else
	{
		pgUrl = reqObj.url;
		if(reqObj.url.indexOf("?") < 0)
			pgUrl += "?" + reqObj.queryStr;
		else
			pgUrl += "&" + reqObj.queryStr;
		
		if(typeof reqObj.callBack == 'object')
			reqType = 'AJAX';
		else
			reqType = 'RELOAD';
	}	
	
	/*No need for pagination if no items retrived or items retrived are less than demand*/
	if((currentPage == 1) && (itemsRetrived <= itemsPerPage))
	{
		return "";
	}
	
	var prevPgLink,nextPgLink;
	var prevPgF,nextPgF;
	
	if(currentPage == 1)
	{
		prevPgLink = pgUrl + "&page=1";
	}
	else
	{
		prevPgLink = pgUrl + "&page=" + (currentPage-1);
	}
	
	if(itemsRetrived > itemsPerPage)
	{
		nextPgLink = pgUrl + "&page=" + (currentPage+1);
	}
	else
	{
		nextPgLink = pgUrl + "&page=" + (currentPage);
	}

	switch(reqType)
	{
		case 'ONCLICK':
		case 'AJAX':{
					prevPgLink = nextPgLink = 'javascript:void(0);';
					GupShup.conf[context] = {};
					navOnClickFunction = navOnClickFunction + "(GupShup.conf." + context + ".$PAGE$);" + scrollToTop + "return(false);" 
					break;
					}
		case 'RELOAD': navOnClickFunction = "return(true);";
						break;
	}
	
	if(typeof GupShup.conf[context] == 'object')
	{
		GupShup.conf[context].prevPage = this.clone(reqObj);
		GupShup.conf[context].prevPage.start = itemsPerPage*(currentPage > 1 ? (currentPage - 2) : 0);
		GupShup.conf[context].prevPage.limit = itemsPerPage+1;
		GupShup.conf[context].nextPage = this.clone(reqObj);
		GupShup.conf[context].nextPage.start = itemsPerPage*((itemsRetrived > itemsPerPage)  ? (currentPage) : (currentPage-1));
		GupShup.conf[context].nextPage.limit = itemsPerPage+1;
	}
	
	var dataForMap =[{
					prevPageLink:prevPgLink,
					nextPageLink:nextPgLink,
					prevPageFunct: navOnClickFunction.replace('$PAGE$','prevPage'),
					nextPageFunct:navOnClickFunction.replace('$PAGE$','nextPage'),
					content:currentPage
					}]
	
	var tmpl = (typeof(pagination.template) == "undefined") ? 'defaultPaginationTemplate' : pagination.template;
			
	var op = this.expandTemplate(GupShup.util.getInnerHTML(tmpl, doc),GupShup.templates.defaultPaginationMap,dataForMap, doc);
	return op;
},

expandPaginationTemplateInDiv : function(parentDivId, reqObj, pagination , context) {
	var innerHTML = this.expandPaginationTemplate(reqObj, pagination , context);
	/* Get the div into which the inner HTML should be plugged in, and plug in the HTML. */
	var parentDiv = document.getElementById(parentDivId);
	parentDiv.innerHTML = innerHTML; 
},

getJsonFromResponse : function(content)
{
	content = content.replace(this.JSON_SECURE_START,"");
	var endPos = content.lastIndexOf(this.JSON_SECURE_END);
	if(endPos > 0)
		content = content.substr(0,endPos);
	return YAHOO.lang.JSON.parse(content);
},

/*
	function call shud be  --> 
	GupShup.util.getJsonItems(   {
						start:10, 
						limit:15,
						url:'http://smsgupshup.com/getJsonItems',
						queryStr:'type=GLOBAL_FEATURED&sortyBy=recency', 
						callBack:{
						success:indexAjaxHandler,
						failure:indexAjaxHandler,
						argument:{type:'GLOBAL_FEATURED'} 
						}    ) 
},

*/
getJsonItems : function(req){
	if(typeof req != 'object')
		return;
	var reqParams = "start=" + req.start + "&limit=" + req.limit + "&" + req.queryStr;
	var reqUrl = req.url;
	if(req.url.indexOf("?") < 0)
		reqUrl += "?" + reqParams;
	else
		reqUrl += "&" + reqParams;
		
	var callBack = {
	success: req.callBack.success,
	failure: req.callBack.failure,
	argument: req.callBack.argument
	}
	
	var transaction = GupShup.ajax.send('GET', reqUrl, callBack, 'PAGINATION');
},

clone : function(obj){
    if (typeof obj !== 'object' || obj == null) {
        return obj;
    }
    var c = obj instanceof Array ? [] : {};
    for (var i in obj) {
        var prop = obj[i];
        if (typeof prop == 'object') {
           if (prop instanceof Array) {
               c[i] = [];
               for (var j = 0; j < prop.length; j++) {
                   if (typeof prop[j] != 'object') {
                       c[i].push(prop[j]);
                   } else {
                       c[i].push(this.clone(prop[j]));
                   }
               }
           } else {
				//not making deep copy
               c[i] = prop;
           }
        } else {
           c[i] = prop;
        }
    }
    return c;
},

getDateFrom : function (dayBoxName,monthBoxName,yearBoxName) {
	var myDayStr = document.getElementById(dayBoxName).value;
	var myMonthStr = document.getElementById(monthBoxName).value;
	var myYearStr = document.getElementById(yearBoxName).value;
	var myMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); 
	var myDateStr = myDayStr + ' ' + myMonth[myMonthStr] + ' ' + myYearStr;
	
	/* Using form values, create a new date object
	using the setFullYear function */
	var myDate = new Date();
	myDate.setFullYear( myYearStr, myMonthStr, myDayStr );
	return myDate;
},

checkDate : function (dayBoxName,monthBoxName,yearBoxName) {
	var myDayStr = document.getElementById(dayBoxName).value;
	var myMonthStr = document.getElementById(monthBoxName).value;
	var myYearStr = document.getElementById(yearBoxName).value;
	var myMonth = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); 
	var myDateStr = myDayStr + ' ' + myMonth[myMonthStr] + ' ' + myYearStr;
	
	/* Using form values, create a new date object
	using the setFullYear function */
	var myDate = new Date();
	myDate.setFullYear( myYearStr, myMonthStr, myDayStr );
	if ( myDate.getMonth() != myMonthStr ) {
	  	return false;
	} else {
	  return myDate;
	}
},

isValidAge : function (dob,minAge) {
	var today = new Date();
	var minDob = new Date();
	minDob.setYear(today.getYear - 13);
	minDob.setMonth(today.getMonth);
	minDob.setDate(today.getDate);
	if(dob >= minDob )	
		return true;
	else
		return true;
},

isValidImage : function (fileName) {
	
	if(fileName.length > 0 )
	{
		if(this.isImageFile(fileName))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	return true;
},

isImageFile : function (fileName) {
	var supportedExtensions = new Array("jpg","jpeg","gif");
	incomingsupportedExtensions =  fileName.split(".");
	var extensionPos = incomingsupportedExtensions.length - 1;
	
	if(extensionPos >= 0)
	{
		fileExtension = incomingsupportedExtensions[extensionPos];
		fileExtension = fileExtension.toLowerCase();
		var isImage = false;
		for(var i = 0; i < supportedExtensions.length && !isImage; i ++)
		{
	  		if((fileExtension.lastIndexOf(supportedExtensions[i])==-1))
	  		 {
	  		 	isImage = false;
	  		 }
	  		else
	  		{
	  			isImage = true;
	  			return true;
	  		}
		}
		return false;
	}
	else
	   return false;
},

getFileExtension : function (fileName) {
	var fileName = this.trim(fileName);
	var incomingsupportedExtensions =  fileName.split(".");
	var extensionPos = incomingsupportedExtensions.length - 1;
	
	if(extensionPos >= 0)
	{
		var fileExtension = incomingsupportedExtensions[extensionPos];
		fileExtension = fileExtension.toLowerCase();
		return fileExtension;
	}
	
	return "";
},

getFileAndExtension : function (fileName) {
	var fileName = this.trim(fileName);
	var incomingsupportedExtensions =  fileName.split(".");
	var extensionPos = incomingsupportedExtensions.length - 1;
	
	if(extensionPos >= 0)
	{
		var fileExtension = incomingsupportedExtensions[extensionPos];
		fileExtension = fileExtension.toLowerCase();
		incomingsupportedExtensions.pop();
		return {ext:fileExtension, name:incomingsupportedExtensions.join(".")};
	}
	
	return {};
},

getNewSubmitForm : function() {
 var submitForm = document.createElement("FORM");
 window.document.body.appendChild(submitForm);
 submitForm.method = "POST";
 return submitForm;
},

createNewFormElement : function(inputForm, elementName, elementValue) {
 var newElement =  null;
 if(window.ActiveXObject)
	newElement = document.createElement('<INPUT name="' + elementName + '">');
 else
	newElement = document.createElement('INPUT');
	
 newElement.setAttribute('name', elementName);
 newElement.setAttribute('value', elementValue);
 newElement.setAttribute('type', "hidden");
 inputForm.appendChild(newElement);
 return newElement;
},

createAndAppendDummyForm : function(formName){
	if((arguments.length == 0) || (arguments.length%2 == 0))
		return;
	var form = null;
	
	if(typeof document.forms[formName] == "object")		
	{
		GupShup.html.util.destroyElement(document.forms[formName]);
	}
	
	if(window.ActiveXObject)
		form = document.createElement('<FORM name="' + formName + '">');
	else
		form = document.createElement("FORM");

	form.setAttribute('method',"POST");
	form.setAttribute('id',formName);
	form.setAttribute('name',formName);
	
	for(var i=1;i < arguments.length; i=i+2)
	{
		this.createNewFormElement(form, arguments[i], arguments[i + 1]);
	}
	
	if(typeof document.getElementById('KB927917') == 'object')
		document.getElementById('KB927917').appendChild(form);
	else
		window.document.body.appendChild(form);
	return form;
},

postData : function(url) {
	if((arguments.length == 0) || (arguments.length%2 == 0))
	return;
	
	var submitForm = this.getNewSubmitForm();
	for(var i=1;i < arguments.length; i=i+2)
	{
		this.createNewFormElement(submitForm, arguments[i], arguments[i + 1]);
	}
	submitForm.action= url;
	submitForm.submit();

},

getQueryStringFromObject : function(obj,separator,delimiter){
	if(typeof obj != 'object')
		return '';
		
	if(typeof separator != 'string')
		separator = '=';
		
	if(typeof delimiter != 'string')
		delimiter = '&';
		
	var qStr = '';
	for (var i in obj){
		if(qStr.length > 0)
			qStr += delimiter;
		qStr += i + separator + obj[i];
	}
	return qStr;
},

getGroupNameFromAccessUrl : function(accUrl)
{
	accUrl = this.trim(accUrl);
	var start = accUrl.search(/groups/) + 7;
	return accUrl.substr(start);
},

validateSearchQuery : function () {
	var searchForm = document.forms["headerSearchForm"];
	if (!GupShup.util.isInitialized(searchForm))
		return false;

	var searchTextBox = searchForm.elements["query"];
	if (!GupShup.util.isInitialized(searchTextBox))
		return false;

	if (!GupShup.util.isAscii(searchTextBox.value))
	{
		alert(GupShup.html.errorMessages.invalidSearchQuery);
		return false;
	}
	
	return true;
},

callUrchinTracker : function(xhr) {
	try
	{
		var respObject = GupShup.util.getJsonFromResponse(xhr.responseText);
		if ((typeof(respObject) == 'object') && (GupShup.util.isInitialized(respObject.status)) && (respObject.status == 'SUCCESS')
			&& (GupShup.util.isInitialized(respObject.urchinUrl))) 
		{
			if(typeof(_gat) == 'object')
			{
				var pageTracker = _gat._getTracker(GupShup.conf.gaWebarooCode); //  gaWebarooCode should be defined in jsvariables.jsp
				pageTracker._trackPageview(respObject.urchinUrl);
			}
		}
		
	}
	catch(error)
	{
		if (GupShup.conf.jsDebug)
			alert('Error while calling urchin tracker' + error);
	}
	
	GupShup.html.util.hideLoader();
},

disableRightClick : function(){
	
	var rightClikcFunct = function(e){
		if (document.all)
			return false;
		if (document.layers || (document.getElementById && !document.all)) 
		{
			if (e.which==2||e.which==3)
			return false;
		}
	};
	if (document.layers)
	{
		document.captureEvents(Event.MOUSEDOWN);
	}

	document.onmousedown = rightClikcFunct;
	document.onmouseup = rightClikcFunct;
	document.oncontextmenu=new Function("return false;");
},

htmlDecode : function(data){
	data = data.replace(/&#(\d+);/g, function(wholematch, parenmatch1) {
		return String.fromCharCode(+parenmatch1);
	});
	return data;
},

htmlDoubleDecode : function(data){
	data = data.replace(/&amp;/g, '&');
	data = GupShup.util.htmlDecode(data);
	return data;
},

getFunction : function(fName){
	var resp = {status:false, h: null};
	if(typeof fName == "string")
	{
		fName = this.trim(fName);
		if(fName.length < 1)
			return resp;
			
		var f = fName.split(".");
		var o = window;
        for (var j = 0; j < f.length-1 ; j++)
		{
			if(typeof o[f[j]] != "undefined")
			{
				o[f[j]]=o[f[j]];
				o=o[f[j]];
			}
			else
				return resp;
        }
		if(typeof o[f[j]] == "function")
			return {status:true, h:o[f[j]]};
		else
			return resp;
	}
	else if(typeof fName == "function")
		return {status:true, h:fName};
	else
		return resp;
}
}
