zMSHome = "http://media.sensis.com.au/";

//
// Disable slot shuffling by default
//
if (typeof zMSDisableSlotShuffle == "undefined") {
	zMSDisableSlotShuffle = false;
}

var RAND_MAX = 10000000;

/**
 * Generates a random integer between 0 and RAND_MAX.
 */
function zMSRand() {
    return Math.round(Math.random() * RAND_MAX);
}

var zMSplatpage = zMSRand();

/**
 * Returns an array a[0..n-1] such that a[i] = fn(arr[i]) for any i < n.
 */
var map = function(fn, arr) {
    var out = [];
    for (var i = 0; i < arr.length; i++) {
        out.push(fn(arr[i]));
    }
    return out;
}

/**
 * Ensures that the given postcode contains at least four digits.
 * If it contains less than four digits, it will prepend zeroes
 * to the start of the postcode.
 */
var fourDigitPostcode = function(postcode) {
    postcode = postcode.toString();
    while (postcode.length < 4) postcode = "0" + postcode;
    return postcode;
}

/**
 * Given two inputs 'min' and 'max', produce an array of the form:
 *   [min, min + 1, ..., max]
 */
var range = function(minimum, maximum) {
	var items = [];
	for (var i = minimum; i <= maximum; i++) {
		items.push(i);
	}
	return items;
}

/**
 * Builds an adserver request URL.
 */
var buildAdUrl = function(params, prefix) {
    var ident = null;
    if (params["ident"]) {
        ident = params["ident"];
        delete params.ident;
    }
    
    if (!prefix)
        prefix = "jserver";
    
    var url = zMSHome + prefix + "/acc_random=" + zMSRand();
    for (var key in params) {
        if (params.hasOwnProperty(key)) {
            var value = params[key];
            url += "/" + escape(key) + "=" + escape(value);
        }
    }
    url += "/pageid=" + zMSplatpage;
    if (ident)
        url += "/ident=" + ident;
    return url;
}

/**
 * Generate slot arrays for each state.
 */
var generateStateSlots = function() {
	//
	// Performs a Fisher-Yates shuffle on the array [1,2,3]
	//
	var _shuffle123 = function() {
		var input = range(1, 3);
		var n = input.length;
		while (n > 1) {
			var k = Math.round(Math.random() * (n-1));
			n--;
			var t = input[n];
			input[n] = input[k];
			input[k] = t;
		}
		return input;
	}
	
	//
	// Simply returns the array [3,2,1]
	//
	var _noshuffle123 = function() {
		var data = range(1, 3);
		data.reverse();
		return data;
	}
	
	//
	// Determine how slots should be generated (random or no?)
	//
	var slotGenerator = zMSDisableSlotShuffle ? _noshuffle123 : _shuffle123;
	
	//
	// Finally, allocate the slots for each state.
	//
	var states = [
		"QLD", "NSW", "VIC",
		"WA",  "SA",  "NT",
		"TAS", "ACT", "NAT"
	];
	var slots = [];
	for (var i = 0; i < states.length; i++) {
		slots[states[i]] = slotGenerator();
	}
	return slots;
}

var platinumAdSlots = generateStateSlots();

/**
 * Get the next slot for a given state.
 */
var nextPlatinumAdSlot = function(state) {
	if (platinumAdSlots[state].length > 0)
		return platinumAdSlots[state].pop();
	else
		return "";
}

var YOLPLAT_SITE   = "ZYELLOWPAGES.PLATINUM";
var MYLOCPLAT_SITE = "ZMYLOCAL.PLATINUM";

var YOLPLAT_AREA_PREFIX   = "ZYELLOWPAGES.PLATINUM.KEYWORDS.";
var MYLOCPLAT_AREA_PREFIX = "ZMYLOCAL.PLATINUM.KEYWORDS.";

var YOLPLAT_TAG   = "YOLPLATHEADING";
var MYLOCPLAT_TAG = "MYLOCPLATHEADING";

var HEADING_TAGS = [];
HEADING_TAGS[YOLPLAT_SITE] = YOLPLAT_TAG;
HEADING_TAGS[MYLOCPLAT_SITE] = MYLOCPLAT_TAG;

var AREA_PREFIXES = [];
AREA_PREFIXES[YOLPLAT_SITE] = YOLPLAT_AREA_PREFIX;
AREA_PREFIXES[MYLOCPLAT_SITE] = MYLOCPLAT_AREA_PREFIX;

var removeZeroPadding = function(s) {
    var i = 0;
    while (i < s.length && s.charAt(i) == '0') i++;
    return s.substr(i);
}



function platinumAd(mediaIdorSite,arg2,arg3,arg4){
  if(/[0-9]/.test(mediaIdorSite)){
    mediaId = mediaIdorSite;
    mediaidPlatinumAd(mediaId,arg2,arg3);
  }
  else{
    siteId = mediaIdorSite;
    iGenPlatinumAd(siteId,arg2,arg3,arg4);
  }
}

function mediaidPlatinumAd(mediaID,location,positionNumber){

if(location == "1")
	location = "NSW";
else if(location == "2")
	location = "VIC";
else if(location == "3")
	location = "WA";
else if(location == "4")
	location = "QLD";
else if(location == "5")
	location = "SA";
else if(location == "6")
	location = "ACT";
else if(location == "7")
	location = "NT";
else if(location == "8")
	location = "TAS";
else 
	location = "NAT";

//specific webpage defined targeted variables

var cl = "aclidck";
  
  if(navigator.userAgent.indexOf("MSIE")!=-1){
var ran = zMSRand();
  document.write('<A HREF="http://media.sensis.com.au/'+cl.substring(0,1)+cl.substring(4,5)+cl.substring(1,4)+cl.substring(5,7)+'/acc_random='+ran+'/SITE=ZYELLOWPAGES.PLATINUM/AREA=ZYELLOWPAGES.PLATINUM.KEYWORDS.'+location+'/IYPMEDIAID='+mediaID.toUpperCase()+'/AAMSZ=138x95/pageid='+zMSplatpage+'/ident='+mediaID.toUpperCase()+'" target="_blank">');

  document.write('<IMG SRC="http://media.sensis.com.au/xserver/acc_random='+ran+'/SITE=ZYELLOWPAGES.PLATINUM/AREA=ZYELLOWPAGES.PLATINUM.KEYWORDS.'+location+'/IYPMEDIAID='+mediaID.toUpperCase()+'/AAMSZ=138x95/pageid='+zMSplatpage+'/ident='+mediaID.toUpperCase()+'" border=0></A>');
}else{
 document.write('<scr'+'ipt src="http://media.sensis.com.au/jserver/acc_random='+zMSRand()+'/SITE=ZYELLOWPAGES.PLATINUM/AREA=ZYELLOWPAGES.PLATINUM.KEYWORDS.'+location+'/IYPMEDIAID='+mediaID.toUpperCase()+'/AAMSZ=138x95/pageid='+zMSplatpage+'/ident='+mediaID.toUpperCase()+'">\n');

  document.write('</scr'+'ipt>');
}}


/**
 * Generate a Platinum ad call.
 */
function iGenPlatinumAd(siteId, location, headingId, postcodes) {
    //
    // Determine the relevent tag & area prefix for this product.
    //
    var headingTag = HEADING_TAGS[siteId];
    var areaPrefix = AREA_PREFIXES[siteId];
    
    if (!postcodes)
        postcodes = [];
    if (!location)
        location = "NAT";
    
    //
    // Ensure all postcodes have at least four digits.
    //
    postcodes = map(fourDigitPostcode, postcodes);
    
    var params = [];
    params["SITE"]     = siteId;
    params["AREA"]     = areaPrefix + location + ".POS" + nextPlatinumAdSlot(location);

    //
    // YPOL sends us heading codes with a leading zero, but the reference data
    // omits it: strip out leading zeros sent by YPOL.
    //
    params[headingTag] = removeZeroPadding(headingId.toString());
    params["AAMSZ"]    = "138x95";
    if (postcodes.length > 0) {
        params["KEYWORD"] = postcodes.join(".");
    }
    else {
        params["KEYWORD"] = ".";
    }
    var url = buildAdUrl(params);
    document.write('<script src="' + url + '"></script>');
}

/**
 * Maps a location number to its corresponding state code.
 */
var locationToState = function(location) {
    var mappings = {
        1: "NSW",
        2: "VIC",
        3: "WA",
        4: "QLD",
        5: "SA",
        6: "ACT",
        7: "NT",
        8: "TAS"
    };
    
    if (mappings[location])
        return mappings[location];
    else
        return "NAT";
}

/**
 * Generates the HTML required for a sponsorship ad (e.g. RBB, Sponsorship).
 */
var sponsorshipAd = function(siteId, size, mediaId, location) {
    mediaID = mediaID.toString().toUpperCase();
    location = locationToState(location);

    var params           = {};
    params["SITE"]       = siteId;
    params["AREA"]       = "ZYELLOWPAGES.PLATINUM.KEYWORDS." + location;
    params["IYPMEDIAID"] = mediaID;
    params["AAMSZ"]      = size;
    params["ident"]      = mediaID;
    
    if(navigator.userAgent.indexOf("MSIE")!=-1){
        var ran = zMSRand();
        var clickUrl = buildAdUrl(params, "adclick");
        var imageUrl = buildAdUrl(params, "xserver");
        document.write('<a href="' + clickUrl + '" target="_blank">');
        document.write('<img src="' + imageUrl + '" border="0">');
        document.write('</a>');
    }
    else {
        var url = buildAdUrl(params);
        document.write('<script src="' + url + '"></script>');
    }
}

/**
 * Generates the HTML for a specific RBB campaign.
 */
function relatedBusinessBadgeMedia(mediaID,location){
    sponsorshipAd("ZYELLOWPAGES.RELATEDBUSINESS", "210x50", mediaID, location);
}

/**
 * Generates the HTML for a specific Sponsorship campaign.
 */
function sponsorshipBadgeMedia(mediaID,location){
    sponsorshipAd("ZYELLOWPAGES.SPONSORSHIP", "90x35", mediaID, location);
}

