if(!window.console){
	window.console = {};
	console.log = function(arg){ window.status = arg; }
};

/* Imports */
var $Y = YAHOO.util;
var $D = YAHOO.util.Dom;
var $E = YAHOO.util.Event;

var Stage = function Stage() {
	
	var _self = this;
	var _isLoaded = false;
	var _initEvent = new $Y.CustomEvent('onInit', this);
	
	this.onInit = function onInit(handler, scope){
		if(!_isLoaded){ _initEvent.subscribe(handler, scope, true); }
		else{ handler.apply(scope); }
	};
	
	var _init = function _init(){
		// Test browser version
		var unsup = /MSIE 4.|MSIE 5.|Firefox\/1.0|Opera\/8/;
		if(unsup.test( window.navigator.userAgent)){
			var fctn = function unsupported(){
				document.location.href = 'unsupported.html';
			};
			setTimeout(fctn, 5);
			return;
		}

		// Render advertises
		if($Y.Dom.get('advBox')){
			if((self.document.body.clientWidth) >= 1000) {
				$Y.Dom.get('advBox').style.display = 'block';
			} else {
				$Y.Dom.get('advBox').style.display = 'none';
			}
		}

		// Start stage objects;
		for(var i = 0; i < this._initObjects.length; i++){
			Stage.createObject(this._initObjects[i]);
		}

		var removeParam = function(param){
			var url = document.location.href.toString();
			var parts = url.split('?');
			var part1 = parts[0];
			var part2 = parts[1].split('&');
			var params = [];
			for(var i = 0; i < part2.length; i++){
				if(part2[i].toLowerCase().indexOf(param) == -1){
					params.push(part2[i]);
				}
			}
			return parts[0] + (params.length > 0?'?':'') + params.join('&');
		}

		// Enable/Disable Info
		if(document.location.href.indexOf('info=') > -1){
			var message = 'Deseas acceder a la Info?';
			if(this.dataManager.getInfo()){
				message = 'Deseas apagar la Info?';
			}
			if(confirm(message)){
				this.dataManager.toggleInfo();
				document.location.href = removeParam('info');
				return;
			}
		}
		
		// Enable/Disable Debug
		if(document.location.href.indexOf('debug=') > -1){
			var message = 'Deseas acceder al Debugger?';
			if(this.dataManager.getDebug()){
				message = 'Deseas apagar el Debugger?';
			}
			if(confirm(message)){
				this.dataManager.toggleDebug();
				document.location.href = removeParam('debug');
				return;
			}
		}
		
		// Enable/Disable assist
		if(document.location.href.indexOf('assist=') > -1){
			var message = 'Deseas acceder al Assist?';
			if(this.dataManager.getAssist()){
				message = 'Deseas apagar el Assist?';
			}
			if(confirm(message)){
				this.dataManager.toggleAssist();
				document.location.href = removeParam('assist');
				return;
			}
		}
		
		$E.on($D.get('sliderDown'),'click',Stage.SliderDown);

	};
	_initEvent.subscribe(_init);
	
	this.init = function init(){
		_isLoaded = true;
		_initEvent.fire(null);
	};
	
	this.isLoaded = function(){	return _isLoaded; };
	
	this.getSeed = function getSeed(){
		var seedObj = $D.get('seed');
		if(seedObj){
			return parseInt(seedObj.value) || 0;
		}
		seedObj = null;
		return false;
	};
};

/**
 * Static Methods
 */
Stage.getInstance = function() {
	if(!Stage._instance){ Stage._instance = new Stage(); }
	if(!window.Gonow){
		window.Gonow = {};
		Gonow.stage = Stage._instance;
	}
	return Stage._instance;
};

Stage.events = new Object();

Stage.addListener = function addListener(ev, handler, obj) {
	if(!Stage.events[ev]){
		Stage.events[ev] = new $Y.CustomEvent();
		var fctn = function(e){ Stage.events[ev].fire(e); };
		$Y.Event.removeListener(document, ev, fctn);
		$Y.Event.on(document, ev, fctn);
	}
	Stage.events[ev].subscribe(handler, obj);
};

Stage.removeListener = function removeListener(ev, handler) {
	if(Stage.events[ev] && handler){
		Stage.events[ev].unsubscribe(handler);
	}
};

Stage.nextSeed = function(){
	return Math.floor(Math.random() * 1000000);
};

/**
 * Set/Retrieve a cookie
 * To get a cookie to call: cookie('COOKIE_NAME');
 * To set/update a cookie call: cookie('COOKIE_NAME', 'COOKIE_VALUE', '');
 * Expire time:
 *  - '1d' to indicate expire in one day
 *  - '1h' to indicate expire in one hour
 *  - '1m' to indicate expire in one minute
 *  - defaults to one day.
 */
Stage.cookie = function cookie(name, value, expire, doEscape){
	if(name && value){
		var cookie = [name, '=', value];
		if(expire){
			var e = {_m:60*1000, _h:60*60*1000, _d:24*60*60*1000, _:60*60*1000};
			var params = /(\d*)(\w*)/.exec(expire);
			var d = new Date();
			d.setTime(d.getTime()+(params[1]*e['_'+params[2].toLowerCase()]));
			cookie.push('; expires='+d.toGMTString()+'; path=/');
		}
		return document.cookie = doEscape?unescape(cookie.join('')):cookie.join('')
	}else if(name){
		var reg = new RegExp('('+name+'=)(\\d*[^;]*)').exec(doEscape?unescape(document.cookie):document.cookie);
		return reg?reg[2]:undefined;
	}
	return false;
};

Stage.onInit = function onInit(handler, scope) {
	var stage = Stage.getInstance();
	return stage.onInit(handler, scope);
};

Stage.addObject = function addObject(){
	if(arguments.length > 0){
		var stage = Stage.getInstance();
		for(var i = 0; i < arguments.length; i++){
			var cName = arguments[i];
			if(!stage._initObjects){
				stage._initObjects = new Array();
			}
			stage._initObjects.push(cName);
		}
	}
};

Stage.createObject = function createObject(cName){
	var stage = Stage.getInstance();
	var pName = cName.charAt(0).toLowerCase() + cName.slice(1);
	var handler = function handler(){
		try{  if(!stage[pName]){ stage[pName] = new window[cName](); } }
		catch(e){ console.log(e.message, e); }
	};
	Stage.onInit(handler);
};

Stage.validateMail = function validateMail(value) {
	if(!YAHOO.lang.trim(value) == "") {
		var emails = value.split(/ ?[,;] ?/);
		var invalid = [];
		for(var i = 0, l = emails.length; i < l; i++) {
			var email = YAHOO.lang.trim(emails[i]);
			if((!/^[a-zA-Z0-9-_\.]{3,}@[a-zA-Z0-9-_]{3,}(\.[a-zA-Z]{2,}){1,}$/.test(email)) && email != "") {
				invalid.push(email);
			}
		}
		return invalid.length > 0 ? invalid : false;
	} else {
		return -1;
	}
};

/**
 * Data Class
 */
var DataManager = function DataManager(){
	
	var cookie = 'AMARILLAS_AR';
	var cookieAdvs = 'AMARILLAS_AR_ADVS';
	
	var seed = Stage.getInstance().getSeed();
	
	var _suggest, _info, _debug, _market, _marketDesc, _assist;
	var _seed, _advs;
	var _total = 0, _print = 0;
	
	var _chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
	
	var base10 = function base10(n){
		if(!n){ return n; }
		var v = 0;
		n = n.toString().split('').reverse();
		for(var i = 0, l = n.length; i < l; i++){
			v += _chars.indexOf(n[i]) * Math.pow(64, i);
		}
		return v;
	};
	
	var base64 = function base64(n){
		if(!n){ return n; }
		var ar = [];
		while(n != 0){
			var e = Math.floor(Math.log(n)/Math.log(64));
			var v = Math.pow(64, e);
			ar[e] = Math.floor(n/v);
			n -= ar[e]*v;
		}
		ar.reverse();
		for(var i = 0; i < ar.length; i++){
			ar[i] = _chars.charAt(ar[i]||0);
		}
		return ar.join('');
	};
	
	var _save = function _save(){
		var data = [];
		data.push(_suggest?'1':'0');
		data.push(_info?'1':'0');
		data.push(_debug?'1':'0');
		data.push(base64(isNaN(_market)?'0':_market));
		data.push(_marketDesc?escape(_marketDesc):'');
		data.push(_assist?'1':'0');
		if(_debug){ console.log('AMARILLAS_AR: ' + data.join('|')); }
		Stage.cookie(cookie, data.join('|'), '1');
	};
	
	var _load = function _load(){
		var raw = Stage.cookie(cookie) || "1|0|0|0";
		var values = raw.split('|');
		_suggest = parseInt(values[0]) && true;
		_info = parseInt(values[1]) && true;
		_debug = parseInt(values[2]) && true;
		_market = base10(values[3]);
		_marketDesc = values[4]?unescape(values[4]):'';
		_assist = parseInt(values[5]) && true;
	};
	_load();

	var _saveAdvs = function _saveAdvs(){
		var data = [];
		data.push(base64(seed));
		data.push(base64(_total));
		data.push(base64(_print));
		for(var i in _advs){ 
			data.push(base64(i));
		}
		if(_debug){ console.log('AMARILLAS_AR_ADVS: ' + data.join('|')); }
		Stage.cookie(cookieAdvs, data.join('|'), '1');
	};

	var _loadAdvs = function _loadAdvs(){	
		var raw = Stage.cookie(cookieAdvs) || "|0|0";
		var values = raw.split('|');
		_seed = base10(values[0]);
		_advs = {};
		if(seed && seed == _seed){
			_total = base10(values[1]);
			_print = base10(values[2]);
			for(var i = 3; i < values.length; i++){
				_advs[base10(values[i])] = true;
			}
		}else{
			_saveAdvs();
		}
	};
	_loadAdvs();

	this.getSuggest = function getSuggest(){ return _suggest; };
	this.toggleSuggest = function toggleSuggest(){ _suggest = !_suggest; _save(); };
	this.getInfo = function getInfo(){ return _info; };
	this.toggleInfo = function toggleInfo(){ _info = !_info; _save(); };
	this.getDebug = function getDebug(){ return _debug; };
	this.toggleDebug = function toggleDebug(){ _debug = !_debug; _save(); };
	this.getAssist = function getAssist(){ return _assist; };
	this.toggleAssist = function toggleAssist(){ _assist = !_assist; _save(); };
	this.clearMarket = function clearMarket(){ this.setMarket(0); };
	this.getMarket = function getMarket(){ return _market; };
	this.setMarket = function setMarket(market){ _market = market; _save(); };
	this.getMarketDesc = function getMarketDesc(){ return _marketDesc; };
	this.setMarketDesc = function setMarketDesc(marketDesc){ _marketDesc = marketDesc; _save(); };
	
	this.isSelectedAdvertise = function isSelectedAdvertise(id){
		if(id && _advs[id]){ return true }
		return false;
	};

	this.getAdvertiseLength = function() {
		return _total;
	};

	this.getPrintLength = function() {
		return _print;
	};
	
	this.selectAdvertises = function toggleAdvertises(obj){
		for(var x in obj){
			if(!_advs[x]){
				_print++;
				if(obj[x] == 'true'){_total++;}
			}
			_advs[x] = true;
		}
		_saveAdvs();
	}

	this.unselectAdvertises = function toggleAdvertises(obj){
		for(var x in obj){
			if(_advs[x]){
				if(_advs[x]){
					_print--;
					if(obj[x] == 'true'){_total--;}
				}
				delete _advs[x];
			}
		}
		_saveAdvs();
	}
	
	this.toggleAdvertise = function toggleAdvertise(id, mail){
		var o = {};
		o[id] = mail;
		if(id && _advs[id]){
			this.unselectAdvertises(o);
		}else if(id){
			this.selectAdvertises(o);
		}
	};
};

/**
 * Start Point
 */
$E.on(window,'load', function() {
	Stage.getInstance().init();
});

Stage.addObject('DataManager');

var Request = function Request(async) {

	var _failureFctn, _failureScope;
	this.setFailure = function(fctn, scope){
		_failureFctn = fctn;
		_failureScope = scope;
	}
	
	var _async = !(async === false);
	var _getXmlHttpRequest = function _getXmlHttpRequest() {
		if (window.XMLHttpRequest) {
			return new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			return new ActiveXObject("Microsoft.XMLHTTP");
		}
	};

	var _doRequest = function _doResquest(method, url, success, scope, params) {

		var req = _getXmlHttpRequest();
		req.open(method, url, _async);
		
		if (params) {
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		}
		
		if(_async){
			req.onreadystatechange = function() {
				if(req.readyState == 4){
					if(req.status >= 400){
						if(_failureFctn){
							if(_failureScope != null) { _failureFctn.apply(_failureScope, [req]); }
							else { _failureFctn.apply(null, [req]); }
							// todo: retornar id
							return 0;
						}
					}else{
						if(scope != null) { success.apply(scope, [req]); }
						else { success.apply(null, [req]); }
						// todo: retornar id
						return 0;
					}
				}
			};
			req.send(params);
		}else{
			req.send(params);
			if(req.status >= 400){
				if(_failureFctn){
					if(_failureScope != null) { _failureFctn.apply(_failureScope, [req]); }
					else { _failureFctn.apply(null, [req]); }
				}
			}else{
				if(scope != null) { success.apply(scope, [req]); }
				else { success.apply(null, [req]); }
			}
		}
	};

	var _stop = function _stop(id) {
		//todo: retornar boleano se a conexão foi cortada ou não
		return 0;
	};

	this.get = function get(url, success, scope) {
		// correção temporaria (o microsite nao carrega a primeira pagina)
		// _doRequest('GET', url, success, scope, null); 
		return _doRequest('GET', url, success, scope, null);
	};

	this.post = function post(url, success, scope, params) {
		return _doRequest('POST', url, success, scope, params);
	};

	this.getContent = function getContent(url, toEl, fctn){
		try{
		var handler = function handler(req){
			$D.get(toEl).innerHTML = req.responseText;
			if(fctn){ fctn.call(); }
		};
		this.get(url, handler);
		}catch(e){alert(e.message);}
	};

	this.stop = _stop;
};

var valueInput;
Stage.changeValueInput = function(e, o) {
	var _o = o || {};
	var objInput = $E.getTarget(e);
	var objLabel = $D.get(_o.label);
	if (!_o.clearValue) {
		if (!_o.blur) {
			$D.replaceClass(objLabel,'onInline','off');
			$E.on(objInput,'blur', Stage.changeValueInput,{blur:true, label: _o.label})
		} else {
			if (objInput.value == '') { $D.replaceClass(objLabel,'off','onInline'); }
			$E.removeListener(objInput,'blur');
			_o.blur = false;
		}
	} else {
		if (!_o.blur) {
			valueInput = objInput.value;
			objInput.value = '';
			$E.on(objInput,'blur', Stage.changeValueInput,{blur:true, clearValue: true});
		} else {
			if (objInput.value == valueInput || objInput.value == '') { 
				objInput.value = valueInput;
			}
			$E.removeListener(objInput,'blur');
			valueInput = '';
			_o.blur = false;
		}
		
	}
};

Stage.openWindow = function(url, w, h, name){
  var screenHeight = ($D.getViewportHeight() - h) / 2;
  var screenWidth = ($D.getViewportWidth() - w) / 2;
  window.open(url,'pop'+name,'width=' + w + ',height=' + h + ',scrollbars=no,toolbar=0,location=0,status=0,menubar=0,resizable=0,left=' + screenWidth + ',top=' + screenHeight);
}


Stage.SliderUp = function(e,o) {
	$D.get('faqContent').scrollTop -= 15;
	
	if($D.get('sliderDown').className == 'down-disable') {
		$E.addListener($D.get('sliderDown'),'click',Stage.SliderDown);
		$D.get('sliderDown').className = 'down';
	}
	
	var sTop = $D.get('faqContent').scrollTop;
	var sHeight = $D.get('faqContent').scrollHeight;
	var cHeight = $D.get('faqContent').clientHeight;
	
	if(sTop == 0) {
		$E.removeListener($D.get('sliderUp'),'click',Stage.SliderUp);
		$D.get('sliderUp').className = 'up-disable';
	}
};

Stage.SliderDown = function(e,o) {
	
	$D.get('faqContent').scrollTop += 15;
	
	if($D.get('sliderUp').className == 'up-disable') {
		$E.addListener($D.get('sliderUp'),'click',Stage.SliderUp);
		$D.get('sliderUp').className = 'up';
	}
	
	var sTop = $D.get('faqContent').scrollTop;
	var sHeight = $D.get('faqContent').scrollHeight;
	var cHeight = $D.get('faqContent').clientHeight;
	
	if(cHeight + sTop >= sHeight) {
		$E.removeListener($D.get('sliderDown'),'click',Stage.SliderDown);
		$D.get('sliderDown').className = 'down-disable';
	}
};





Stage.getDocumentSize = function() {
	var myHeight = document.documentElement.scrollHeight;
	var myWidth = document.documentElement.scrollWidth;
  	return [myWidth, myHeight];
};


	var _iframeGetDocument = function(idIframe) {
		var frameContents = document.getElementById(idIframe);
	    var cWindow;
	    var cDocument;
	        
	    if(window.frames && window.frames[idIframe]){ //IE5, Konq, Safari
				cWindow = window.frames[idIframe];
	    }else if(frameContents.contentWindow){ //IE5.5+, Moz 1.0+, Opera
				cWindow = frameContents.contentWindow;
	    }else{ //Moz < 0.9 (Netscape 6.0)
				cWindow = frameContents;
	    }
	        
	    if(cWindow.document){ //Moz 0.9+, Konq, Safari, IE, Opera
				cDocument = cWindow.document;
	    }else{//Moz < 0.9 (Netscape 6.0)
	      cDocument = cWindow.contentDocument;
	    }

    return cDocument;
	};
