function $(id)
{
	return document.getElementById(id);
}
function $F(id)
{
	var o = $(id);
	return o.value;
}
function getCookieVal (offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1)
	endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen) {
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg)
			return getCookieVal (j);
			i = document.cookie.indexOf(" ", i) + 1;
			if (i == 0) break;
	}
	return null;
}
/** 
*	Default namespace singleton 
*/
var Allstream = new function()
{
	//public members
	//this.accordion????? -> see accordion.js
	this.addError = addError;
	this.Blue = "#66b0df";
	//this.carousel????? -> see carousel.js
	this.checkEmail = checkEmail;
	this.checkNotEmpty = checkNotEmpty;
	this.checkTelNum = checkTelNum;
	this.clearFormErrors = clearFormErrors;
	this.click = click;
	this.DarkGray = "#303030";
	this.firstChildByClass = firstChildByClass;
	this.formIsOk = formIsOk;
	this.getHeight = getHeight;
	this.imageSourceBlack = imageSourceBlack;
	this.imageSourceGray = imageSourceGray;
	this.LightOrange = "#ffc993";
	this.MediumGray = "#606060";
	this.onLoadDefault = onLoadDefault;
	this.onLoadBody = callOnLoadBody;
	this.Orange = "#f57f20";
	this.printPage = printPage;
	this.sharePage = sharePage;
	
	//  Added by Vijay	
	this.splash = splash;
	this.switchLang = switchLang;

	// Added by Mahesh for language specific alert message
	this.errors = {
		"en":{"valreqd":"value is required.","email":"You must enter a valid email address.","phone":"at least 10 digits required."},
		"fr":{"valreqd":"Veuillez remplir ce champ.","email":"Vous devez saisir une adresse de courriel valide.","phone":"il doit contenir au moins dix chiffres."}
	};
	this.lang = GetCookie('AlrLanguage');
	// Added by Mahesh - ends 

	//private members
	var _defaultRightPanelBoxContent=null;
	//implementation in ALPHABETICAL order
	function addError(id,msg)
	{
		var c = $(id);
		var eDiv = $(id + "Errors");
		if (! eDiv)
		{
			var eDiv = document.createElement("DIV");
			eDiv.style.color=Allstream.Orange;
			eDiv.id = id + "Errors";
			if (c.nextSibling == null)
			{
				c.parentNode.appendChild(eDiv);
			}
			else 
			{
				c.parentNode.insertBefore(eDiv,c.nextSibling);
			}
		}
		if (eDiv.innerHTML>"")
			eDiv.innerHTML += "<br/>";
		eDiv.innerHTML += "&bull; " + msg;
		c.style.backgroundColor = Allstream.LightOrange;
		if (! c.form.ErrorFound)
		{
			c.form.ErrorFound = true;
			c.focus();
		}
	}
	function checkEmail(id, mandatory)
	{
		if (mandatory)
		{
			if (! checkNotEmpty(id))
				return false;
		}
		var regex = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
		var em = $(id).value;
		if (!regex.test(em))
		{
			if (Allstream.lang == "fr") { // Added by Mahesh for language specific alert message
				addError(id,Allstream.errors.fr.email);
			} else {
				addError(id,Allstream.errors.en.email);
			}// Added by Mahesh for language specific alert message ends 
			return false;
		}
		return true;
	}
	function checkNotEmpty(id)
	{
		if ($F(id)=="")
		{
			if (Allstream.lang == "fr") { // Added by Mahesh for language specific alert message
				addError(id,Allstream.errors.fr.valreqd);
			} else {
				addError(id,Allstream.errors.en.valreqd);
			}		// Added by Mahesh for language specific alert message ends	
			return false;
		}
		return true;
	}
	function checkTelNum(id,mandatory)
	{
	    if (mandatory){
	        if (! checkNotEmpty(id)) 
	        return false;
	    }

            var tn = $(id).value;
            var tnn = "";
            for (var i=0;i<tn.length;i++){
                var tmp = tn.substring(i, i+1);
                if (tmp >= 0 && tmp <= 9) 
                    tnn += tmp; 
            }
            if (tnn.length<10){
				if (Allstream.lang == "fr") { // Added by Mahesh for language specific alert message
					addError(id,Allstream.errors.fr.phone); 
				} else {
					addError(id,Allstream.errors.en.phone); 
				} // Added by Mahesh for language specific alert message - ends
				return false;
            }
            return true; 			
	}
	function clearFormErrors(formId,clearValuesToo)
	{
		var form = $(formId);
		form.ErrorFound = false;
		var ea = form.elements;
		for (var i=0;i<ea.length;i++)
		{
			var c = ea[i];
			if ($(c.id + "Errors"))
			{
				$(c.id + "Errors").innerHTML="";
			}
			c.style.backgroundColor = "white";
			if (clearValuesToo)
			{
				if (c.value)
					c.value = "";
			}
		}
	}
	function click(clickDef)
	{
		if (clickDef.rightPanelId)
		{
			var pnl = $(clickDef.rightPanelId);
			if (_defaultRightPanelBoxContent==null)
			{
				_defaultRightPanelBoxContent = pnl.innerHTML;
			}
			if (clickDef.anchor)
			{
				pnl.innerHTML = $(clickDef.anchor.id + "Content").innerHTML;
			}
			else
			{	
				pnl.innerHTML = _defaultRightPanelBoxContent;
			}
		}
		if (clickDef.containerId)
		{
			var siblings = $(clickDef.containerId).getElementsByTagName("A");
			for (var i=0;i<siblings.length;i++)
			{
				var sib = siblings[i];
				sib.style.color = (sib == clickDef.anchor ? clickDef.selectedColor : clickDef.unselectedColor);
			}
		}
	}
	function clickHashAnchor()
	{
		var q = location.href.indexOf("?");
		if (q > -1)
		{
			var h = location.href.indexOf("h=",q);
			if (h > q)
			{
				var at = location.href.indexOf("&",h);
				var id = "";
				if (at == -1)
					id = location.href.substring(h + 2);
				else
					id = location.href.substring(h + 2,at);
				if (id)
				{
					var anc =  $(id);
					if ($(id).tagName=="A")
						onListClick($(id));
				}
			}
		}
	}
	function firstChildByClass(parentNode,className)
	{
		var a = CSSHelpers.getElementsByClassName(parentNode, className);
		return a.length > 0 ? a[0] : null;
	}
	function formIsOk(formId)
	{
		return true != $(formId).ErrorFound;
	}	
	function getHeight(obj) {
		var currentStyle = CSSHelpers.getCurrentStyle(obj)
		//var oldPos = currentStyle.position;
		//var oldLeft = currentStyle.left;		 
		//obj.style.position = 'absolute';
		//obj.style.left = '-2000px';		
		obj.style.height = 'auto';
		var r = obj.offsetHeight;		
		obj.style.height = '0';
		//obj.style.position = oldPos;
		//obj.style.left = oldLeft;		
		return r;
	}
	function highlightItem(menuItem)
	{
		var colorSelected = Allstream.Orange;
		menuItem.style.color = colorSelected;
		var anchors = menuItem.getElementsByTagName("a");
		if (anchors.length > 0)
		{
			anchors[0].style.color = colorSelected;
		}
	}
	function highlightCurrentMenuItem()
	{
		var menuItems = [
			{txt:"Default",children:[]},
			{txt:"Solutions",children:[]},
			{txt:"Products",children:[]},
			{txt:"Markets",children:[]},
			{txt:"Offers",children:[]},
			{txt:"Support",children:[]},
			{txt:"Resources",children:["custsignin","results"]},
			{txt:"About-Us",children:["rss","facebook","twitter"]}
		];
		var loc = window.location.href.toLowerCase();
		for (var i=0;i<menuItems.length;i++ )
		{
			var menuItemInfo = menuItems[i];
			var menuItem = $("menu" + menuItemInfo.txt);
			if (menuItem == null)
				continue;	
			if (-1 < loc.indexOf(menuItemInfo.txt.toLowerCase()))
			{
				highlightItem(menuItem);
				return;
			}			
			for (var j=0;j<menuItemInfo.children.length;j++)
			{//check children
				if (loc.indexOf(menuItemInfo.children[j] + ".") > -1)
				{
					highlightItem(menuItem);
					return;
				}
			}
		}
		jslog.debug(printStackTrace())
		if ($("footer"))
		{
			var faa = $("footer").getElementsByTagName("A");
			for (var i=0;i<faa.length;i++)
			{
				var a = faa[i];
				if (-1 < loc.indexOf(a.href.toLowerCase()))
				{
					a.style.color = Allstream.Orange;
					break;
				}
			}
		}
	}
	function imageSource(img,search,repl)
	{
		img.src = img.src.replace(search,repl);
	}
	function imageSourceBlack(img)
	{
		img.src = img.src.replace("-gray","-black");
	}
	function imageSourceGray(img)
	{
		img.src = img.src.replace("-black","-gray");
	}
	function onLoadDefault()
	{	
		var theId = document.getElementById('boxListItemContainer');
		highlightCurrentMenuItem();
		var st = $("menuSearchTerm");
		var sb = $("menuSearchButton");
		if (sb.offsetHeight != st.offsetHeight)
		{
			sb.style.height = st.offsetHeight + "px";
		}
		if (window.DD_belatedPNG) {
			
			DD_belatedPNG.fix('.threeColumnCenter .alpha');
		}
		clickHashAnchor();
		
		EventHelpers.addEvent($('headerFrench'), 'click', Allstream.switchLang )
		if (theId == null) {
			html5Widgets.reinit();
		}
		
	}
	
	
	function callOnLoadBody(){
		if (typeof(onLoadBody) == "function") {
			onLoadBody();
		}
	}
	function printPage()
	{
		window.print();
	}
	function sharePage()
	{
		//alert("Share coming soon!");
		stLight.options({
			publisher:'1dd6ab24-534e-4003-95bb-a3e6763fbcc8'
		});
	}
/** end allstream namespace */
}

/** Added by Vijay delta of changes from Galant on 3/3 - Start */

/* function splash(name, lang) to drop cookie when there is 
	 * a click on front page or language hyperlink 
	 * on the topinch.inc section 
	 * Name of cookie to be used: AlrLanguage
	 */
	function splash(name, lang) {

		var expiryDate = new Date();
		expiryDate.setTime(expiryDate.getTime() + (365 * 24 * 60 * 60 * 1000));

		SetCookie(name, lang, expiryDate, "/");

		if (lang.indexOf('fr') != -1) {
			SetCookie('AlrLanguage', 'fr', expiryDate, '/');
		} else {
			SetCookie('AlrLanguage', 'en', expiryDate, '/');
		}
	}
	/* function switchLang() to switch language as a toggle switch
	 * and being called on topinch.inc and index.html
	 */
	function switchLang(e)
	{
		var newURL;
		var french = "/fr";
		var currentUrl = window.location.href;
		var isFrench = currentUrl.lastIndexOf("/fr/");
		var protocol = currentUrl.match(new RegExp("(.*://)(.*?)(/.*)", "im"))[1].toString();
		var server_name = currentUrl.match(new RegExp("(.*://)(.*?)(/.*)", "im"))[2].toString();
		var path = currentUrl.match(new RegExp("(.*://)(.*?)(/.*)", "im"))[3].toString();
		
		if (isFrench < 0) { /* not French */
			newURL = protocol + server_name + french + path;
			splash('splash', 'fr');
		} else {
			path = path.replace("/fr", "");
			newURL = protocol + server_name + path;
			splash('splash', 'en');
		}
		
		//location.href = newURL;
		location.href = document.getElementById("headerFrench").href;
		EventHelpers.preventDefault(e);
	}
/** end allstream namespace */

/** Changes added by Vijay received from Galant - 3/3 - End */
var AllstreamBoxList = new function()
{
	this.next = next;
	this.prev = prev;
	this.update = update;
	//html id's
	var Container		= "boxListContainer";
	var Header			= "boxListHeader";
	var ItemContainer	= "boxListItemContainer";
	var PageCountBot	= "boxListPgCountBot";
	var PageCountTop	= "boxListPgCountTop";
	var PageNumberLblBot= "boxListPgNumBot";
	var PageNumberLblTop= "boxListPgNumTop";
	var PageNumberTop	= "boxListPage";
	var PageNumberBot	= "boxListPageBot";
	var Sort			= "boxListSort";
	//	
	function next()
	{
		var p = Number($(PageNumberTop).value);
		if (p < Number($(PageCountTop).innerHTML))
		{
			$(PageNumberTop).value = p + 1;
			update();
		}
	}
	function prev()
	{
		var p = Number($(PageNumberTop).value);
		if (p > 1)
		{
			$(PageNumberTop).value = p - 1;
			update();
		}
	}
	
	
	function update(eventType)
	{			
	
		// check for infinte IE loop
		var isIELoop = printStackTrace().join(',\n ').match(/update/g).length > 1;
		/* if (isIELoop) {
			return;
		} */
		
		var cols=3;
		var rows=2;
		var h = "";
		var sb = $(Sort);
		
		$(Header).innerHTML = sb.options[sb.selectedIndex].text;
		//extract divs to boxes
		var boxes = [];
		var cn = $(ItemContainer).childNodes;
		for (var i=0;i<cn.length;i++ )
		{
			var div = cn[i];
			if (div.tagName == "DIV")
			{//we use title attribute==sortbox.value for item category filtering
				if (sb.value=="" || div.title.indexOf(sb.value)>-1)
				{
					boxes.push(cn[i]);
				}
			}
		}
		//
		var pages = Math.max(1, Math.ceil(boxes.length / (rows * cols)));
		var page = Math.max(1,Math.min(pages,Number($(PageNumberTop).value)));
		
		var offset = (page - 1) * cols * rows;
		var max = Math.min(boxes.length,offset + rows*cols);
		for (var i=offset;i < max;i++)
		{
			var box = boxes[i];
			if (i > offset && (i - offset) % cols == 0)
			{//new row
				h += "<div class='clearAll'>&nbsp;</div>"			
			}
			h += "<div class='boxListItem blurredBorder";
			if ((i - offset) % cols == 0)
			{
				h += " boxListItemLeft";
			}
			h += "'>" + box.innerHTML + "</div>";
		}
		h += "<div class='clearAll'>&nbsp;</div>";
		$(Container).innerHTML = h;
		$(PageCountTop).innerHTML = pages;
		$(PageCountBot).innerHTML = pages;
		
		
		DOMHelpers.setAttributeValue($(PageNumberTop), "max", pages);
		DOMHelpers.setAttributeValue($(PageNumberBot), "max", pages);
		
		//fdSliderController.redrawAll();
		
		$(PageNumberTop).value = page;
		$(PageNumberBot).value = page;
		
		$(PageNumberLblBot).innerHTML = page;
		$(PageNumberLblTop).innerHTML = page;
		fdSliderController.updateSlider(PageNumberBot); 
		fdSliderController.updateSlider(PageNumberTop);
		// check for infinte IE loop
		var isIELoop = false;
		
		// for Internet Explorer (using conditional comments)
		/*@cc_on @*/
		/*@if (@_win32)
		isIELoop = printStackTrace().join(',\n ').match(/\"change\"/) != null;
		/*@end @*/
		//alert(printStackTrace().join(',\n ').match(/update/g) +", " + isIELoop);
		
		
		if (eventType == "select") {
		
			//fdSliderController.destroyAll();
			//removeSliderPolyfill();
			//html5Widgets.reinit();
			
			// hackity hack
			var ids = [PageNumberTop, PageNumberBot];
			
			for (var i = 0; i < ids.length; i++) {
				var id = ids[i]
				var sliderHandle = CSSHelpers.getElementsByClassName($('fd-slider-' + id), 'fd-slider-handle')[0];
				DOMHelpers.setAttributeValue(sliderHandle, 'aria-valuemax', pages);
				var slider = fdSliderController.getSlider(id);
				slider.setMax(pages);	
				slider.disable();
				slider.enable();
				slider.onResize();
				//DOMHelpers.setAttributeValue(slider, 'aria-valuenow', 1);
			}
		} else if (!isIELoop) {
			$(PageNumberTop).value = page
			$(PageNumberBot).value = page;
			
			html5Widgets.reinit();
			/* fdSliderController.updateSlider(PageNumberBot); 
			fdSliderController.updateSlider(PageNumberTop);
			fdSliderController.redrawAll(); */
			//jslog.debug(XMLHelpers.getOuterXML($(PageNumberTop)))
			//jslog.debug(StringHelpers.sprintf("Max: %d, min: %d", max, min))

		}
	}
	
	function changeEvent(e) {
		var target = EventHelpers.getEventTarget(e);
		var p = Number(target.value);
		
		$(PageNumberTop).value = p;
		update();
		
	}
	
	this.init = function () {
		if (EventHelpers.hasPageLoadHappened(arguments) || !$('boxListPage')) {
			return;
		}
		
		EventHelpers.addEvent($('boxListPage'), 'change', changeEvent);
		EventHelpers.addEvent($('boxListPageBot'), 'change', changeEvent);
		
	}
}

var menuWrapper = new function () {
	var me = this;
	var fx, fxOut;
	var isIn = false;
	var mouseCoords;
	var hoverItems;
	
	me.init = function () {
		if (EventHelpers.hasPageLoadHappened(arguments)) {
			return;
		}
		me.el = $('menuWrap');
		
		// Handle hovers 
		EventHelpers.addEvent($("homeImage"), 'mouseover', homeHover);
		EventHelpers.addEvent($("homeImage"), 'mouseout', homeHover);
		
		hoverItems = CSSHelpers.getElementsByClassName(me.el, 'hoverItem');
		//alert(hoverItems.length)
		EventHelpers.addEvent(document.body, 'mousemove', trackMouse)
		/* for (var i=0; i<hoverItems.length; i++) {
			var item = hoverItems[i];
			
			EventHelpers.addEvent(item, 'mouseover', mouseOverEvent);
			
		} */
		
		EventHelpers.addEvent(me.el, 'mouseout', mouseOutEvent);
	}
	
	function homeHover()
	{
		$("homeImage").src = "http://media.allstream.com/designimages/home-white.png";
	}
	
	function homeNormal()
	{
		$("homeImage").src = "http://media.allstream.com/designimages/home-white.png";
	}
	
	function trackMouse(e) {
		mouseCoords = EventHelpers.getMouseCoords(e);
		var over = document.elementFromPoint(mouseCoords.x, mouseCoords.y);
		var li = over;
		
		//jslog.debug(over.nodeName)
		do {
			if (li.nodeName != 'LI' || !CSSHelpers.isMemberOfClass(li, 'menu2')) {
				li = DOMHelpers.getAncestorByTagName(li, 'li');
			}
		} while (li && !CSSHelpers.isMemberOfClass(li, 'menu2'));
		
		if (li) {
			mouseOverEvent(e);
		} else {
			mouseOutEvent(e);
		}
	}
	
	function showSubmenus() {
		
		CSSHelpers.removeClass(me.el, 'hidden');
		var node = cssQuery('.menu2')[2];
		
		
	}
	
	function hideSubmenus() {
		changeSelectVisibility('visible');
	}
	
	function hasMovedOut() {
		var over = document.elementFromPoint(mouseCoords.x, mouseCoords.y);
		
		if (over == me.el) {
			return false;
		}
		
		for (var i = 0; i < hoverItems.length; i++) {
			var item = hoverItems[i];
			if (item.contains(over)) {
				return false;
			} 
		}
		return true;
	}
	
	function mouseOverEvent(e) {
		if (!isIn) {
			
			
			
			
			
			isIn = true;
			
			if (me.el.offsetHeight > 200) {
				showSubmenus();
			}
			
			if (fx) {
				fx.complete();
			}
			changeSelectVisibility('hidden');
			showSubmenus();
			fx = new FX('menuWrap', {
				height: {
					to: 400
				}
			}, 0.4, 'easeInOut', showSubmenus);
			fx.start();
			
		}
		//EventHelpers.cancelBubbling(e);
		
	}
	
	function mouseOutEvent(e) {
		if (isIn) {
			
			
			
			
			
			isIn = false;
			
			CSSHelpers.addClass(me.el, 'hidden');
			if (fx) {
				fx.complete();
			}
			fx = new FX('menuWrap', {
				height: {
					to: 29
				}
			}, 0.4, 'easeInOut', hideSubmenus);
			fx.start();
			
		}
		
	}
	
	function changeSelectVisibility(val) {
		
		if (CSSHelpers.isMemberOfClass(document.body, 'ie6')) {
		
		
			var selects = document.getElementsByTagName('select');
			
			for (var i = 0; i < selects.length; i++) {
				selects[i].style.visibility = val;
			}
		}
	}
	
}

var tabFix = new function () {
	var me = this;
	
	me.fix = function () {
		fdSliderController.redrawAll();
	}
	
	me.init = function () {
		var tabs = cssQuery('table.sectionTab td');
		
		for (var i=0; i<tabs.length; i++) {
			EventHelpers.addEvent(tabs[i], 'click', me.fix)
		}
	}
}

var list = new function () {
	var me = this;
	
	me.fix = function () {
		
		//jslog.debug('xx: ' + DebugHelpers.getProperties(window.CSSHover));
		
	}
	
	me.init = function () {
		var listItems = cssQuery("ul.ulBigOrange li a");
		
		for (var i=0; i<listItems.length; i++) {
			EventHelpers.addEvent(listItems[i], 'click', me.fix);
		}
	}
}

var balloonFix = new function () {
	var me = this;
	
	function changeClass(e) {
		var node = EventHelpers.getEventTarget(e);
		if (node.nodeName != 'A') {
			node = DOMHelpers.getAncestorByTagName(node, 'a');
		}
		var className = node.className;
		
		switch (className) {
			case "balloonUp":
			
				CSSHelpers.addClass($('WzTtDiV'), 'balloonUp');
				break;
			default:
				CSSHelpers.removeClass($('WzTtDiV'), 'balloonUp');
		}
		
		
	}
	
	me.init = function () {
		var tooltipLinks = cssQuery('a[onmouseover]');
		for (var i=0; i<tooltipLinks.length; i++) {
			if (tooltipLinks[i].onmouseover.toString().indexOf('Tip(') >= 0) {
				EventHelpers.addEvent(tooltipLinks[i], 'mouseover', changeClass);
			}
		}
	}
}

var shadowFix = new function () {
	var me =this;
	
	me.init = function () {
		if (EventHelpers.hasPageLoadHappened(arguments)) {
			return;
		}
		var containers = document.getElementsByTagName('css3-container');
		
		for (var i=0; i<containers.length; i++ ) {
			containers[i].style.display = 'block'
		}
		
		
 	}
}

EventHelpers.addPageLoadEvent('Allstream.onLoadDefault');
EventHelpers.addPageLoadEvent('AllstreamBoxList.init')
EventHelpers.addPageLoadEvent('menuWrapper.init');
EventHelpers.addPageLoadEvent('LoremIpsum.init');
EventHelpers.addPageLoadEvent('tabFix.init');
EventHelpers.addPageLoadEvent('list.init');
EventHelpers.addPageLoadEvent('balloonFix.init');
EventHelpers.addPageLoadEvent('shadowFix.init')
EventHelpers.addEvent(window, 'load', Allstream.onLoadBody);


