if (typeof IS_DEV == 'undefined') IS_DEV = false;

var uaStr = navigator.userAgent.toLowerCase();
var HAS_BADJS = ( (uaStr.indexOf("mac") > -1) && (uaStr.indexOf("msie") > -1) );  

if (IS_DEV){
	/*
	if (typeof(console) != 'undefined'){
		this.LOG = {};
		this.
		this.LOG.error = console.error;
		this.inspect = console.dir;
	}else{
		var LOG = {
			'info' : function(str){ logDebug(str); },
			'warning': function(str){ logWarning(str); },
			'error': function(str){ logError(str); },
			'fatal': function(str){ logFatal(str); }
		}
	}
	*/
	var inspect = function (obj){ 
		/*
		var logStr = "";
		for (var um in obj){ 
			IS_IE ? (logStr += um + ': ' + obj[um] ) : (
		}; 
		if (IS_IE) alert(logStr);
		*/
		for (var um in obj){ 

		}
	}
}else{
	var LOG = { 'info': function(){}, 'error': function(){} };
	var inspect = function(){};
}

 var $ = function(id){return document.getElementById(id);}; 

 var $$ = function(tagName, className, parent){
	if (typeof(tagName) == 'undefined' || tagName === null) {
		tagName = '*';
	}
	if (typeof(parent) == 'undefined' || parent === null) {
		parent = document;
	}
	var children = (parent.getElementsByTagName(tagName) || document.all);
	if (typeof(className) == 'undefined' || className === null) {
		//return MochiKit.Base.extend(null, children);
		return children;
	}

	var elements = [];
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var classNames = child.className.split(' ');
		for (var j = 0; j < classNames.length; j++) {
			if (classNames[j] == className) {
				elements.push(child);
				break;
			}
		}
	}
	return elements;
 }; 

/* GOOGLE {{{ */
/*
	function google_ad_request_done(ads){

		var adParent = document.getElementById('C_googleAds');
		var adStr = "<div>";
			for (var i = 0; i < ads.length; i++){
				adStr += "<div class='ad' onclick='window.open(\"" + ads[i].url + "\");'>";
					adStr += "<div class='adTitle'>" + ads[i].line1 + "</div>";
					adStr += "<div class='meta'>" + ads[i].line2 + ' ' + ads[i].line3 + "</div>";
					adStr += "<div class='adUrl meta'>" + ads[i].visible_url + "</div>";
				adStr += "</div>";
			}
				
			adStr += "<div class='meta byGoogle'>Ads by Google</div>";
		adStr += "</div>";
		adParent.innerHTML = adStr;
	}
	var google_ad_client    = 'ca-pub-6712932617380765';
	var google_ad_output    = 'js';
	var google_max_num_ads  = 4;
	var google_safe         = 'high';
	var google_ad_type      = 'text';
	var google_adtest       = 'off';
	*/
/* }}} */

var findCoords = function( e ) {
	var posX = 0, posY = 0;

	if ( !e ) {
		return [ 0, 0 ];
	}

	if ( e.pageX || e.pageY ) {
		posX = e.pageX;
		posY = e.pageY;
	}
	else if ( e.clientX || e.clientY ) {
		if ( document.body.scrollTop ) {
			posX = e.clientX + document.body.scrollLeft;
			posY = e.clientY + document.body.scrollTop;
		}
		else if ( document.documentElement.scrollTop ) {
			posX = e.clientX + document.documentElement.scrollLeft;
			posY = e.clientY + document.documentElement.scrollTop;
		}
		else {
			posX = e.clientX;
			posY = e.clientY;
		}
	}

	return [ posX, posY ];
}


var addEvent = function (obj, evType, fn){
	/*
	var IS_SAFARI = (navigator.userAgent.toLowerCase().indexOf('applewebkit') != -1);
	if (IS_SAFARI && evType == 'click'){
		obj['on'+ evType] = fn;
	} else */ if (obj.addEventListener){
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

/* LOC PICKER {{{ */
	if (typeof(Meetup) == 'undefined') {
		Meetup = {};
	}
	if (typeof(Meetup.LocPicker) == 'undefined') {
		Meetup.LocPicker = {};
	}

	Meetup.LocPicker.Location = { 
		country: null, 
		zip: null,
		set : function(co, zip) {
			this.country = co;
			this.zip = zip;
		},
		hasPostalCodes : function(){ return (this.country == 'us' || this.country == 'ca' || this.country == 'gb') },
		getZipLabel    : function(){
			if (this.country == 'us') return 'ZIP code';
			else if (this.country == 'ca') return 'Postal Code';
			else if (this.country == 'gb') return 'Postcode';
			else return	'City';
		}
	};

	Meetup.LocPicker.Menu = { 
		CONTAINER_ID : "locMenu",
		COUNTRY_MENU_ID : "co",
		ZIP_FIELD_ID : "zip",
		ZIP_LABEL_ID : "zipLabel",
		READY_ID : "ready",
		
		setWaiting    : function(){ $(this.CONTAINER_ID).style.cursor = 'wait'; $(this.ZIP_LABEL_ID).innerHTML = 'Loading cities...' },
		setReady   : function(){$(this.CONTAINER_ID).style.cursor = ''; $(this.ZIP_LABEL_ID).innerHTML = Meetup.LocPicker.Location.getZipLabel(); Meetup.LocPicker.doLocPickerReadyCallback(); },

		showZipField : function(){
			$(this.ZIP_LABEL_ID).innerHTML = Meetup.LocPicker.Location.getZipLabel();
			this.cityDOM.style.display = 'none';
			this.cityDOM.name = 'notzip';
			this.cityDOM.setAttribute('id', 'notzip');
			this.zipDOM.style.display = 'block';
			this.zipDOM.name = 'zip';
			this.zipDOM.setAttribute('id', 'zip');
		},
		showCityMenu : function(){ 
			$(this.ZIP_LABEL_ID).innerHTML = 'City';
			this.zipDOM.style.display = 'none';
			this.zipDOM.name = 'notzip';
			this.zipDOM.setAttribute('id', 'notzip');	
			this.cityDOM.style.display = 'block';
			this.cityDOM.name = 'zip';
			this.cityDOM.setAttribute('id', 'zip');	

		},
		rebuildCityMenu : function(cities){ 
			while( this.cityDOM.hasChildNodes() ){ this.cityDOM.removeChild( this.cityDOM.firstChild ); }

			for (var i = 0; i < cities.length; i++){
				if (cities[i].code != null ){ 
					var newOpt = this.cityDOM.appendChild ( document.createElement('option') );
					newOpt.setAttribute('value', cities[i].code);
					if( cities[i].code == Meetup.LocPicker.Location.zip) {
						newOpt.selected = "selected";
						newOpt.setAttribute('selected', 'selected');

					}
					newOpt.innerHTML = cities[i].name;
				}
			}
			this.showCityMenu();
			this.setReady();
		},
		getCountry : function(){
			var menu = $(this.COUNTRY_MENU_ID)
			return menu[menu.selectedIndex].value;
		 },
		getZip : function(){
			return $(this.ZIP_FIELD_ID).value;
		 },
		init : function(){
			if(HAS_BADJS) return false;
				   
			this.form = $(this.ZIP_FIELD_ID).form;

			var activeMenu = this.form[this.ZIP_FIELD_ID];

			if (activeMenu.type == "text"){
				this.zipDOM = activeMenu;
				var cDOM = document.createElement('select');
				cDOM.setAttribute("name", "notzip");
				cDOM.style.display = 'none';
				cDOM.className = 'locNameUpdateCity';
				activeMenu.parentNode.appendChild(cDOM);
				this.cityDOM = cDOM;
			}else{
				this.cityDOM = activeMenu;
				var zDOM = document.createElement('input');
				zDOM.setAttribute("type", "text");
				zDOM.setAttribute("name", "notzip");
				zDOM.style.display = 'none';
				zDOM.className = 'locNameUpdateZip';
				activeMenu.parentNode.appendChild(zDOM);
				this.zipDOM = zDOM;
			}
		}
	};

	Meetup.LocPicker.doLocPickerReadyCallback = function() {};

	Meetup.LocPicker.CityDataGetter = {
		cache : {},
		deserialize : function (str){
			var cis = str.split("||");
			var retArray = new Array();
			for (var i = 0; i < cis.length; i++){
				var iCi = cis[i].split("::");
				if (iCi[0] && iCi[1]) retArray[retArray.length] = { name:iCi[0].replace(/^\s*|\s*$/g,""), code:iCi[1].replace(/^\s*|\s*$/g,"") }
			}
			return retArray;
		},
		get : function (co){
			if (this.cache[co]){
				Meetup.LocPicker.Menu.rebuildCityMenu(this.cache[co]);
				return;
			}
			var url = "/get-loc-data.jsp?co=" + co;
			if (window.XMLHttpRequest) {
				req = new XMLHttpRequest();
			} else if (window.ActiveXObject) {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			try{
				req.onreadystatechange = function(){
					var P = Meetup.LocPicker
					if (req.readyState == 4) {
						if (req.status == 200) {
							if (req.responseText){
								var locs = req.responseText;
								if (locs.length < 1){
									LOG.error('PROBLEM! DATA NOT RECEIVED FOR :' + loc.co + '! FULL RESPONSE: ' + req.responseText);
								}else{
									var cities = P.CityDataGetter.deserialize(locs);
									P.CityDataGetter.cache[co] = cities;
									P.Menu.rebuildCityMenu(cities);
									P.Menu.setReady();
								}
							}else{
								LOG.error('PROBLEM! NO TEXT FOR :' + loc.co + '! FULL RESPONSE: ' + req.responseText);
							}
							
						} else {

						}
						P.Menu.setReady();
					}
				}
				req.open("GET", url, true);
				req.send(null);
			}catch(e){
				LOG.error('BAD PROBLEM: ' + e)
			}
		}
		
	};

	Meetup.LocPicker.switchCountry = function(){
		var P = Meetup.LocPicker;
		P.Location.set( P.Menu.getCountry(), P.Menu.getZip() ) 
		if ( P.Location.hasPostalCodes() ){
			P.Menu.showZipField();
			P.Menu.setReady();
		}else{
			P.Menu.setWaiting();
			P.CityDataGetter.get(P.Location.country);
		}
	}

	Meetup.LocPicker.__init__ = function(){
		var P = Meetup.LocPicker;
			
		P.Menu.init();
		P.Location.set( P.Menu.getCountry(), P.Menu.getZip() ); 
		
		var dbCountry = $('dbCo').value;
		if (dbCountry != P.Location.country){
			P.Location.country = dbCountry;
			P.switchCountry();
		}
		
		$(P.Menu.COUNTRY_MENU_ID).onchange = function(){

			P.switchCountry();
		}
	}

/* }}} */

var notWhitespace = /\S/
function cleanWhitespace(node) {
	for (var x = 0; x < node.childNodes.length; x++) {
		var childNode = node.childNodes[x]
		if ((childNode.nodeType == 3)&&(!notWhitespace.test(childNode.nodeValue))) {
			// that is, if it's a whitespace text node
			node.removeChild(node.childNodes[x])
			x--
		}
		if (childNode.nodeType == 1) {
			// elements can have text child nodes of their own
			cleanWhitespace(childNode)
		}
	}
}

function setPageHeight(){

	var setHeight = function(){
		var b = (!browseEl) ? 0 : browseEl.offsetHeight+60;
		var n = (!navEl) ? 0 : navEl.offsetHeight+60;
		var h = Math.max(b, n);

		if(h > pageEl.offsetHeight){

			pageEl.style.height = h + 'px';
		}
	}
	
	var resizeListener = function(e){
		stopBubble(e);
		setHeight();
	}

	var navEl  = document.getElementById('C_sectionNav');
	var pageEl = document.getElementById('C_pageBodyBox');
	var browseEl = document.getElementById('C_bb');
	if ((navEl || browseEl) && pageEl ) {
		addEvent(window, 'resize', resizeListener);
		setHeight();
	}
}
addEvent(window, "load", setPageHeight);

/* Meetup.URI {{{ */
if (typeof(Meetup) == 'undefined') { Meetup = {}; }
Meetup.URI = function( strURI ){
	this._uri = strURI ? strURI : document.location.href;
	bindMethods(this);
	this._parse();
};

Meetup.URI.prototype = {
	valid : false,
	_parse : function(){



    //var uriPartNames = ["source","protocol","authority","domain","port","path","directoryPath","fileName","query","anchor"];
    //var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(this._uri);
		/*
    var uri = {};
    
    for(var i = 0; i < 10; i++){
        uri[uriPartNames[i]] = (uriParts[i] ? uriParts[i] : "");
    }
    
    // Always end directoryPath with a trailing backslash if a path was present in the source URI
    // Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key
    if(uri.directoryPath.length > 0){
        uri.directoryPath = uri.directoryPath.replace(/\/?$/, "/");
    }
	*/
    


		//TODO: port number


		var parts = this._uri.split("?");
		var q = ( parts.length > 1) ? parts[1] : false;

		var parts = parts[0].split("://");
		if (parts.length < 2) {
			LOG.error("unable to parse URI because scheme is missing ("+this._uri+")");
			return false; //need the scheme prefix
		}

		var p = parts[0];

		parts = parts[1].split("/");
		if (parts.length < 2){
			LOG.error("unable to parse URI because no slashes ("+this._uri+")");
			return false; //need at lease one slash
		}

		this.valid = true;

		//this.URI = uri;
		this.scheme = p;
		this.domainName = parts[0];
		this.path = parts.slice(1);
		this.querystring = q ? q.split("&") : [];


	},
	addToQuerystring : function( name, value ){
		/* don't add qs params to redirects */
		if ( some(this.path, function(p) { return (p=="/r/"); } ) ) return;
		if (!this.querystring) 
			this.querystring = [name+"="+value];
		else 
			this.querystring[this.querystring.length] = name+"="+value;
	},
	toString : function(){
		return this.scheme + "://" + this.domainName + "/" + this.path.join("/") + (this.querystring ? ("?" + this.querystring.join("&")) : "" );

	},
	__repr__ : function(){ 
		return "{"+
			"_uri: '"+this._uri+"'"+
			", scheme: '"+this.scheme+"'"+
			", domainName: '"+this.domainName+"'"+
			", path: '"+this.path.join("/")+"'"+
			", querystring: '"+(this.querystring ? ("?" + this.querystring.join("&")) : "" )+"'"+
		"}"; 
	}
}
/* }}}   */
