/*
 * CognitiveMatch Javascript Library Version 1.5.0 2010-04-12.
 */

/* Configuration */

var CM_ACCOUNT_ID = "greetz";
var CM_SERVER = 'engine.uk.cognitivematch.com';
var CM_REQUEST_HTML_PATH = '/cm_request.html';
var CM_ENABLE_FIREBUG_LOGGING = false;
var CM_RESPONSE_CHECK_PERIOD_MS = 10;
var CM_RESPONSE_TIMEOUT_MS = 3500;
var CM_EVENT_DELIM = '|';


function notifyAreaAdded(elementId,isDefault) {
	// Checking if handler is defined
	if(typeof(onCMPanelLoaded)!='undefined') {
		onCMPanelLoaded(elementId,isDefault);
	}
}

function MatchingEngine() {
	this.areas = new Array();
}

/*
 * MatchingEngine customer functions
 */


/**
 * Set the request path if the the cm_request.html file is not in the
 * root directory
 */
MatchingEngine.prototype.setRequestPath = function(pathName) {
	 
	if(arguments.length == 0) {
		// no path specified so return
		return;
	}
	
	var newpath = arguments[0];
	
	if(newpath.charAt(newpath.length-1) == '/'){		
		newpath = newpath.substring(0, newpath.length-1);
	}
	
	CM_REQUEST_HTML_PATH = newpath + CM_REQUEST_HTML_PATH;	
}

/*
 * Setup areas
 */
MatchingEngine.prototype.setup = function(areaNamesList,externalParameters) {

	if (cm_get_ie_ver() == 5)
		return;

	this.areaNames = areaNamesList.split(',');
	this.serverTimeout = false;
	this.timestamp = new Date().getTime();

	for (var i = 0; i < this.areaNames.length;i++) {
		var area = new Object();
		var thisAreaName = this.areaNames[i];
		area.name = thisAreaName;
		area.content = null;
		area.displayed = false;
		this.areas[thisAreaName] = area;
	}

	var cm_request_qs = cm_make_load_areas_qs(this.areaNames);
	var url = 'http://' + cm_get_window_location() + CM_REQUEST_HTML_PATH + '?' + cm_request_qs;
    if (cm_defined(externalParameters)) {
        url = url + '&' + CM_QS_EXTERNAL_PARAMETERS + '=' + cm_encode(externalParameters);   
    }
	var iframeSrc = '<iframe id="cm_server_request" style="display:none" src="'+url+'"></iframe>';
	document.write(iframeSrc);

	setTimeout('MatchingEngine._responseChecker()',CM_RESPONSE_CHECK_PERIOD_MS);

};

MatchingEngine.prototype.display = function(areaName) {

	if (cm_get_ie_ver() == 5) {
		this._displayAreaDefault(areaName);
		return;
	}

    var area = this.areas[areaName];
	if (cm_defined(area)) {

		document.write('<span id="cm_'+areaName+'">');
		if (area.content != null) {
			cm_log('display:responseReceived = true '+areaName);
			document.write(area.content);
			area.displayed = true;
		}
		document.write('</span>');
	}

};

/*
 * Sends a visitorEvent request to the capsule-engine (log of a significant
 * end-user interaction on a tracked page on the customer's domain)
 *
 * Parameters:
 * 	eventType 				   description of the interaction (format dependent on site)
 * [optional] eventParameter(s)  at least on "name=value" string.
 *
 * e.g. logEvent('purchase','id=3445-23-12','price=123','color=red');
 */
MatchingEngine.prototype.logEvent = function(eventType) {

	if(arguments.length == 0) {
		// invalid call - no event details
		return;
	}

	var eventType = arguments[0];
	var eventQsParam = eventType;
	for(var i=1; i < arguments.length; i++) {
		eventQsParam = eventQsParam + CM_EVENT_DELIM + arguments[i];
	}
	
	var qs = 'event=' + cm_encode(eventQsParam) + "&" + cm_common_qs_params() + cm_make_production_mode_global_qs_params();
	var logImage = new Image();
	logImage.src = 'http://' + CM_SERVER + CM_URI_VISITOR_EVENT_V1_PATH + '?' + qs;
}

/*
 * Sends a pageView request to the capsule-engine (log of a visitor clicking
 * on any tracked page on the customer's domain)
 */
MatchingEngine.prototype.logPageView = function() {

    var qs = cm_common_qs_params() + cm_make_production_mode_global_qs_params();
	var logImage = new Image();
	logImage.src = 'http://' + CM_SERVER + CM_URI_PAGE_VIEW_PATH + '?' + qs;
}

/**
 * Log the reward-click event
 */
MatchingEngine.prototype.logReward = function() {

	var impressionId = cm_read_cookie("cm_impid");
	var capsuleName = cm_read_cookie("cm_capsulename");
	var reward = formatReward(document.getElementById("reward").innerHTML);

	var qs = cm_common_qs_params();
	qs = qs + '&' + "erw" + '=' + reward;
	qs = qs + '&' + CM_QS_CAPSULE_NAME_PARAM + '=' + cm_encode(capsuleName);
	qs = qs + '&' + CM_QS_IMPRESSION_ID + '=' + cm_encode(impressionId);
	var url = 'http://' + CM_SERVER + CM_URI_REWARD_EVENT_V1_PATH + '?'+ qs;
	

	if (!cm_is_safari() && !cm_is_chrome()) {

		cm_image_log_click(url);

	} else if (cm_is_safari() || cm_is_chrome()) {

		cm_ajax_log_request(url);

	} else {
		cm_image_log_click(url);
	}

	return true;
}  


 /*
  * Internal methods
  */

/*
 * Basic validation to L-trim the reward and remove the first non numeric character
 * i.e. remove all leading white space chars followed by the £ or $ symbol
 */
function formatReward(rewardString){
	
	var reward = rewardString.replace(/^\s+/,"")
	
	if(isNaN(reward.charAt(0))) {
		return reward.substring(1, reward.length);
	}
	return reward;
}

MatchingEngine.prototype._displayAll = function() {

    var allDisplayed = true; // Set true then check for not displayed case.
    var j = 0;
    for (;j<this.areaNames.length;j++)  {

        var area = this.areas[this.areaNames[j]];
		cm_log('area '+area);

        if (!area.displayed) {

			//cm_log('_displayAllCapsules '+capsule+' !capsule.displayed = true');

            // Check if response filled concurrently via cm_request.html
            if (area.content != null) {
                var el = document.getElementById('cm_'+area.name);
				cm_log('cm_'+area.name+' = '+el);
                // Check for null as element may not be present in DOM as this time.
                if (el != null) {
                    el.innerHTML = area.content;
                    area.displayed = true;
                    /* Notifying that area was added */
                    notifyAreaAdded(el.id,false);
                   // cm_log('set element capsule='+capsule.name+' content='+matchingAreaHTML);
                } else {
                //    cm_log('null element capsule='+capsule.name);
					area.displayed = false;
                    allDisplayed = false;
                }
            } else {
              //  cm_log('allDisplayed = false  capsule='+capsule.name);
			    area.displayed = false;
                allDisplayed = false;
            }

        } else {
            cm_log('capsule.displayed capsule='+area.name);
        }
    }
    return allDisplayed;
};

MatchingEngine.prototype._responseChecker = function () {

    if (this.serverTimeout)
        return;

    var allCapsulesDisplayed = this._displayAll();
	var elapsed = new Date().getTime()-this.timestamp;
	var timeout = elapsed >= CM_RESPONSE_TIMEOUT_MS;
	cm_log("elapsed "+elapsed);
    if (!allCapsulesDisplayed && !timeout) {
        setTimeout('MatchingEngine._responseChecker()',CM_RESPONSE_CHECK_PERIOD_MS);
	} else if (!allCapsulesDisplayed && timeout) {
    	cm_log('timeout allDisplayed='+allCapsulesDisplayed);
		this._handleTimeout();
	}

};

MatchingEngine.prototype._handleTimeout  = function() {

    cm_log('timeout');
    this.serverTimeout = true;
    for (var i = 0;i < this.areaNames.length;i++) {
		var areaName = this.areaNames[i];
		this.areas[areaName].displayed = this._displayAreaDefault(areaName);
    }

};

MatchingEngine.prototype._displayAreaDefault  = function(areaName) {

    var defaultTag = document.getElementById(areaName+'_default');
    if (defaultTag != null) {
        var el = document.getElementById('cm_'+areaName);
        if (el != null) {
            el.innerHTML = defaultTag.innerHTML;
            /* Notifying that area was added */
            notifyAreaAdded(el.id,true);
            //
            return true;
        }
    }
    return false;
};

MatchingEngine.prototype._callback = function(areaName,areaContent) {

    cm_log('_callback areaName='+areaName);
    var area = this.areas[areaName];
	if (cm_defined(area)) {
		area.content = areaContent;
	}
};

MatchingEngine.prototype._callback_display_default = function(areaName) {

    cm_log('_callback_display_default areaName='+areaName);
    if (areaName != CM_AREA_NAME_WILDCARD) {
        this._displayAreaDefault(areaName);
    } else {
        for (var i = 0;i < this.areaNames.length;i++) {
            this._displayAreaDefault(this.areaNames[i]);
        }
    }

};




/*
   URL methods
 */

var CM_QS_ACCOUNT_ID_PARAM = "acctid";
var CM_QS_CAPSULE_NAME_PARAM = "capnm";
var CM_QS_TIME_PARAM = "t";
var CM_QS_TIME_ZONE_PARAM = "tzo";
var CM_QS_IMPRESSION_ID = "impid";
var CM_QS_NAVIGATOR_PLUGINS = "nplg";
var CM_QS_WINDOW_HISTORY_LENGTH = "hstl";
var CM_QS_WINDOW_SCREEN_HEIGHT = "scrh";
var CM_QS_WINDOW_SCREEN_WIDTH = "scrw";
var CM_QS_WINDOW_PIXEL_DEPTH = "scrd";
var CM_QS_EXTERNAL_PARAMETERS = "ep";
var CM_QS_REFERRER = "ref";
var CM_QS_PAGE = "pg";
var CM_QS_ERROR = "err";
var CM_MAX_URL = 1024;

var CM_URI_CLICK_LOG_PATH = "/v1/click";
var CM_URI_REQUEST_LOG_PATH = "/v1/request";
var CM_URI_PAGE_VIEW_PATH = "/v1/page-view";

var CM_URI_VISITOR_EVENT_V1_PATH = "/v1/visitor-event";

var CM_URI_LOG_URL_REQUEST = "/v1/log-url-request";
var CM_URI_REWARD_EVENT_V1_PATH  = "/v1/secure-click-reward";

var CM_COOKIE_NAME_CAPSULE_CLICK = "click";
var CM_AREA_NAME_WILDCARD    = "*";

function cm_make_load_areas_qs(areaNames) {

    var qs = cm_common_qs_params();

    for (var i = 0;i < areaNames.length;i++) {
        qs = qs + '&=[&' + CM_QS_CAPSULE_NAME_PARAM + '=' + cm_encode(areaNames[i]) + '&=]';
    }

    qs = qs + cm_make_production_mode_global_qs_params();

    return qs;

}

function cm_common_qs_params() {
    return CM_QS_ACCOUNT_ID_PARAM + '=' + cm_encode(CM_ACCOUNT_ID) + '&' + cm_make_time_qs();
}

function isNeedPage() {
	var https = (document.location.protocol == "https");
	return https /*| true*/;
}

function cm_make_production_mode_global_qs_params() {

    var qs = '';

    if (cm_defined(navigator.plugins)) {
        qs = qs + '&' + CM_QS_NAVIGATOR_PLUGINS + '=' +  navigator.plugins.length;
    }
    if (cm_defined(window.history)) {
        qs = qs + '&' + CM_QS_WINDOW_HISTORY_LENGTH + '=' +  window.history.length;
    }
    if (cm_defined(window.screen.height)) {
        qs = qs + '&' + CM_QS_WINDOW_SCREEN_HEIGHT + '=' +  window.screen.height;
    }
    if (cm_defined(window.screen.width)) {
        qs = qs + '&' + CM_QS_WINDOW_SCREEN_WIDTH + '=' +  window.screen.width;
    }
    if (cm_defined(window.screen.pixelDepth)) {
        qs = qs + '&' + CM_QS_WINDOW_PIXEL_DEPTH + '=' +  window.screen.pixelDepth;
    }
    //add the page url only when using SSL
    if( isNeedPage() ) {
    	qs = qs + '&' + CM_QS_PAGE + '=' + cm_encode(cm_trim(document.location.href));
    }
    if (cm_defined(document.referrer)) {
    	if(document.referrer)	//only add this parameter if not empty
    		qs = qs + '&' + CM_QS_REFERRER + '=' + cm_encode(document.referrer);
    }

    return qs;
}

function cm_make_time_qs() {
    var date = new Date();
    return CM_QS_TIME_PARAM + '=' + date.getTime() + '&' + CM_QS_TIME_ZONE_PARAM + '=' + date.getTimezoneOffset();
}

/*
   Logging
 */

function cm_log_click(capsuleName,impressionId) {

	var qs = cm_common_qs_params();
	qs = qs + '&' + CM_QS_CAPSULE_NAME_PARAM + '=' + cm_encode(capsuleName);
	qs = qs + '&' + CM_QS_IMPRESSION_ID + '=' + cm_encode(impressionId);
	var url = 'http://' + CM_SERVER + CM_URI_CLICK_LOG_PATH + '?'+ qs;

	if (!cm_is_safari() && !cm_is_chrome()) {

		cm_image_log_click(url);

	} else if (cm_is_safari() || cm_is_chrome()) {

		cm_ajax_log_request(url);

	} else {
		cm_image_log_click(url);
	}

	return true;

}

function cm_ajax_log_request(url) {
	req = cm_new_xmlhttprequest();
	if (req) {
		// Asynchronous is false
		req.open("GET", url, false);
		req.send("");
		return true;
	} else {
		return false;
	}
}

function cm_new_xmlhttprequest() {

	var req = false;
	// branch for native XMLHttpRequest object
	if(window.XMLHttpRequest && !(window.ActiveXObject)) {
		try {
			req = new XMLHttpRequest();
		} catch(e) {
			req = false;
		}
	// branch for IE/Windows ActiveX version
	} else if(window.ActiveXObject) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				req = false;
			}
		}
	}
	return req;
}

function cm_image_log_click(url) {
	cm_log('cm_image_log_click url='+url);
	var logImage = new Image();
	logImage.src = url;
	cm_ie_friendly_delay();
	return true;
}

function cm_ie_friendly_delay() {
	var x = 0;
    var now = new Date().getTime();
    var delay = now+150;
    while (new Date().getTime() < delay) {
        var e = document.getElementById(new Date().getTime());
		if (e != null)
			x = x+1;
    }
	return x > 0;
}

function cm_log_click_check() {
	var cookie = cm_read_cookie(CM_COOKIE_NAME_CAPSULE_CLICK);
	if (cookie != null) {
		var logImage = new Image();
		logImage.src = 'http://' + CM_SERVER + CM_URI_CLICK_LOG_PATH + '?'+cookie;
		cm_delete_cookie(CM_COOKIE_NAME_CAPSULE_CLICK);
	}
}


/*
   Utils
 */

function cm_is_safari() {
	var ua = navigator.userAgent.toLowerCase();
	if (ua.indexOf('safari/') != -1 && ua.indexOf('chrome') == -1){
		return true;
	} else {
		return false;
	}
}

function cm_is_chrome() {
	var ua = navigator.userAgent.toLowerCase();
	return ua.indexOf('chrome') != -1;
}

function cm_defined(name) {
    return typeof(name) != 'undefined';
}

function cm_log(m) {
    if (CM_ENABLE_FIREBUG_LOGGING) {
        console.log(m);
    }
}

function cm_encode(p) {
    return encodeURIComponent(p);
}

function cm_trim(p) {
     if(!p) return "";
     if(p.length <= CM_MAX_URL) return p;
     return p.substr(0, CM_MAX_URL);
}

function cm_get_window_location() {
    var hostname = window.location.hostname;
    if (cm_defined(window.location.port) & window.location.port != '')
        hostname = hostname + ':' + window.location.port;
    return hostname;
}

/*
   Cookie Utils
 */

function cm_set_cookie(name,value,seconds) {
    var expires;
	if (seconds) {
		var date = new Date();
		date.setTime(date.getTime()+(seconds*1000));
		expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
	document.cookie = name+"="+value+expires+"; path=/";
}

function cm_read_cookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function cm_delete_cookie(name) {
	cm_set_cookie(name,"",-1);
}

function cm_get_ie_ver()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

/**
 * Declare variable last.
 */
var MatchingEngine = new MatchingEngine();

