var adRequestCount = 0;
var asyncRequest = true;
var maxTries = 10;
var initialTimeout = 10;
var debug = false; 
function gebi(n) { return document.getElementById(n); }
function containsClass( elem, classname ) {
	var re = new RegExp( '\\b' + classname + '\\b' );
	return re.test( elem.className );
}
function findAdDivs( doc ) {
	var all_divs = doc.getElementsByTagName('div');
	var ad_divs = [];
	for ( var i = 0 ; i < all_divs.length ; i++ ) {
		if ( containsClass( all_divs[i], 'ad') ) {
			ad_divs.push( all_divs[i] );
		}
	}
	return ad_divs;
}
function parse(txt) {
	try { //Internet Explorer
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(txt);
		return xmlDoc; 
	} catch(e) {
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(txt,"text/xml");
		return xmlDoc;
	}
}
function prepareToFetchAds() {
	setTimeout( fetchAdsForPage, 1000 );
}
function fetchAdsForPage ( e ) {
	var category = gebi('cat_id').getAttribute('content');
	if ( isNaN( category ) ) return;
	var ad_divs = findAdDivs( document );
	var requestDoc = XmlDocument.create();
	var requestElem = requestDoc.appendChild( requestDoc.createElement('adrequest') );
	var reqString = '';
	requestElem.setAttribute( 'cat_id', category );
	for ( var i=0 ; i < ad_divs.length ; i++ ) {
		var divElem = requestDoc.createElement('div');
		divElem.setAttribute( 'class', ad_divs[i].className );
		divElem.setAttribute( 'title', ad_divs[i].title );
		divElem.setAttribute( 'id', ad_divs[i].id );
		divElem.setAttribute( 'height', getCSSValue( ad_divs[i], 'height' ) );
		divElem.setAttribute( 'width', getCSSValue( ad_divs[i], 'width' ) );
		requestElem.appendChild( divElem );
	}
	fetchAdSet( requestDoc );
} 
function getCSSValue( obj, property ) {
	if ( obj.currentStyle ) { // IE
		return obj.currentStyle[ property ];
	} else {
		var compStyle = getComputedStyle(obj,'');
		return compStyle.getPropertyValue( property );
	}
}
function log(m) {
	if ( window.console ) if ( window.console.log ) console.log( m );
}
function RequestParams() {
	this.contentType = 'formData';
	this.params = [];
	this.boundary = 'abcdefGHIJKL';
	this.setContentType = function( t ) {
		this.contentType = t;
	};
	this.push = function( n, v ) {
		this.params.push( { name: n, value: v } );
	};
	this.paramString = function() {
		switch ( this.contentType ) {
			case 'urlEncoded':
				return this.urlencoded();
				break;
			case 'formData':
				return this.formData();
				break;
			default:
				return this.urlencoded();
		}
		return false;
	};
	this.urlencoded = function() {
		var tempArray = [];
		for ( var i = 0 ; i < this.params.length ; i++ ) tempArray.push( this.params[i].name + '=' + escape( this.params[i].value ) );
		return tempArray.join( '&' );
	};
	this.formData = function() {
		var tempArray = [];
		var separator = '--' + this.boundary + '\r\n';
		for ( var i = 0 ; i < this.params.length ; i++ ) tempArray.push( 'Content-Disposition: form-data; name="' + this.params[i].name + '"\r\n\r\n' + this.params[i].value + '\r\n'  );
		return separator + tempArray.join( '\r\n'+ separator ) + '\r\n--' + this.boundary + '--\r\n\r\n';
	};
	this.contentTypeHeader = function() {
		switch ( this.contentType ) {
			case 'urlEncoded':
				return 'application/x-www-form-urlencoded';
				break;
			case 'formData':
				return 'multipart/form-data; boundary=' + this.boundary;
				break;
			default:
				return 'application/x-www-form-urlencoded';
		}
		return false;
	}
}
function fetchAdSet( requestDoc ) {

	adRequestCount++;

	var param_obj = new RequestParams();
	param_obj.setContentType( 'urlEncoded' )

	param_obj.push ( 'requestDoc', XML.serialize(requestDoc) );
	param_obj.push ( 'requestSeq', adRequestCount );
	param_obj.push ( 'requestAsyncFlag', ( asyncRequest ? 'async' : 'sync' ) );
	param_obj.push ( 'timeoutBeforeRetry', initialTimeout );

	
	var formRequest = XHRFactory.getInstance();
	if ( ! formRequest ) return;
	formRequest.open( "GET", 'adserver?' + param_obj.paramString(), asyncRequest );
	formRequest.setRequestHeader('Content-Type',param_obj.contentTypeHeader() );
	var ifModifiedSince = new Date(0);
	formRequest.setRequestHeader("If-Modified-Since", ifModifiedSince);

    formRequest.onreadystatechange = function() {
		if ( formRequest.readyState == 4 ) {
			if ( formRequest.status == 200 ) {
				var responseDoc = formRequest.responseXML;
				var responseElem = responseDoc.documentElement
				if ( responseElem.nodeName == 'error' ) {
					log( responseElem.getAttribute('message') );
					if ( responseElem.getAttribute('message') == 'No request received' ) {
						XHRFactory.release( formRequest );
						//asyncRequest = false;
						//initialTimeout += 100;
						if ( adRequestCount < maxTries ) {
							log( 'Re-fetching' );
							setTimeout( fetchAdsForPage, initialTimeout );
						}
						//else location.reload();
					}
				} else  {
					//log( XML.serialize( responseElem ) );
					var divs = responseElem.getElementsByTagName('div');
					for ( var i = 0 ; i < divs.length ; i++ ) {
						var orig_div = gebi( divs[i].getAttribute('id') );
						orig_div.style.backgroundcolor = 'rgb(250,250,255)';
						if ( ! orig_div.outerHTML ) {
							divs[i].removeAttribute('id');
							orig_div.innerHTML = XML.serialize( divs[i] );
						} else {
							orig_div.outerHTML = XML.serialize( divs[i] );
						}
					}
				}
			} else {
				log( formRequest.status );
			}
			XHRFactory.release( formRequest );
		} 
	};

	log( 'trying to fetch ads. try number ' + adRequestCount  );

	if ( debug ) log( param_obj.paramString() );

	formRequest.send( null /*param_obj.paramString()*/ );
}
