/*
      var ns_ignore_referrer = 'netsociety.nl';
      var ns_ignore_referrer = "(^https?\://[(\\w+\\.)]*netsociety.nl/)|^https?\://[(\\w+\\.)]*netsociety.nl/"
      var ns_cpc_id = 'gclid';
      var ns_visit_storage = 'actracking_nsv';
      var ns_conversion_storage = 'actracking_nsc';
      var ns_cookie_name = 'ns_channels2d';
      var ns_cookie_expire = 10;
*/

      
      function NS_CreateCookie(name, value, days)
      {
          if (days) 
          {
      		    var date = new Date();
      		    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
      		    
      		    var expires = "; expires=" + date.toGMTString();
      	  }
          else var expires = "";
          
      	 document.cookie = name + "=" + value + expires + "; path=/";
      }
      
      function NS_ReadCookie(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 NS_EraseCookie(name) 
      {
      	 NS_CreateCookie(name,"",-1);
      }

      
      function NS_GetStringDate()
      {                
        // DATE
        date = new Date();
        year = date.getFullYear();
        month = date.getMonth() + 1;
        day = date.getDate();
      
        // string representation of the current date - always 8 characters long      
        dateString = '' + year + (month < 10 ? '0' + month : month) + (day < 10 ? '0' + day : day)
        
        return dateString;
      }
      
      function NS_GetOrganics()
      {
        var __searray = new Array();
        __searray["google"] = "q";
        __searray["yahoo"] = "p";
        __searray["msn"] = "q";
        __searray["aol"] = "query";
        __searray["aol"] = "encquery";
        __searray["lycos"] = "query";
        __searray["ask"] = "q";
        __searray["altavista"] = "q";
        __searray["netscape"] = "query";
        __searray["cnn"] = "query";
        __searray["looksmart"] = "qt";
        __searray["about"] = "terms";
        __searray["mamma"] = "query";
        __searray["alltheweb"] = "q";
        __searray["gigablast"] = "q";
        __searray["voila"] = "rdata";
        __searray["virgilio"] = "qs";
        __searray["live"] = "q";
        __searray["baidu"] = "wd";
        __searray["alice"] = "qs";
        __searray["yandex"] = "text";
        __searray["najdi"] = "q";
        __searray["aol"] = "q";
        __searray["club-internet"] = "query";
        __searray["mama"] = "query";
        __searray["seznam"] = "q";
        __searray["search"] = "q";
        __searray["wp"] = "szukaj";
        __searray["onet"] = "qt";
        __searray["netsprint"] = "q";
        __searray["google.interia"] = "q";
        __searray["szukacz"] = "q";
        __searray["yam"] = "k";
        __searray["pchome"] = "q";
        __searray["kvasir"] = "searchExpr";
        __searray["sesam"] = "q";
        __searray["ozu"] = "q";
        __searray["terra"] = "query";
        __searray["nostrum"] = "query";
        __searray["mynet"] = "q";
        __searray["ekolay"] = "q";
        __searray["search.ilse"] = "search_for";
        __searray["bing"] = "q";
        
        return __searray;
      }
      
      function NS_GetCPCs()
      {
        var __searray = new Array();
        __searray["google"] = "q";
        __searray["yahoo"] = "p";
        __searray["msn"] = "q";
        __searray["bing"] = "q";
        
        return __searray;
      }
      
      // take just first 40 characters;
      // removes '|' character that has a special purpose 
      function NS_TrimString(str)
      {
          str = (str.length <= 40 ? str : str.substring(0, 40));
          str = str.replace("|","-");
          
          return str;            
      }
 
      // get key value from the query string;
      // returns string if not found     
      function QueryKeyValue(q, key) 
      {
           
          if (q.split('?').length < 2)
            return null;
          else
            q = q.split('?')[1];
                  
          var keyValues = q.split("&");
          
          for(var i=0; i < keyValues.length; i++) 
          {
              keyValue = keyValues[i].split("=");
              
              // the keyValue does not have the right form 'key=val'
              if (keyValue.length != 2)
                  continue;

              if (keyValue[0] == key)
                  return keyValue[1];
          }
          
          // the key was not found
          return null;
      }

      //
      // CHANNELS DEFINITIONS
      //

      // DIRECT
      function NS_Direct()
      {
          // not direct
          if (document.referrer != '')
              return null;
              
          channelString = "D" + NS_GetStringDate();
          return channelString;            
      }

      // ORGANIC
      function NS_Organic()
      {
          // not organic
          if (document.referrer == '')
              return null;
      
          var organics = NS_GetOrganics();

          for (organic in organics)
          {
              var organicRE = new RegExp("^https?\://[(\\w+\\.)]*" + organic + "\\.\\w{2,5}");  // matches 'server' with http://server.com | http://www.server.nl | http://what.ever.server.com

              // referrer does not match current organic search server 
              if (!organicRE.test(document.referrer))
                 continue;
             
              // referrer is one of the search engines
              // give me cpc id if available
              cpcid = this.QueryKeyValue(document.location.search, this.ns_cpc_id);
                                                                  
              // if cpc exists then this is cpc channel
              if (cpcid != null)
                return null;
              
              // from query string of the referrer url give me value with searched keyword
              key = organics[organic];
              var qvalue = this.QueryKeyValue(document.referrer, key);
                         
              channelString = "O(" + encodeURI(NS_TrimString(qvalue != null ? qvalue : "UNKNOWN_VALUE_" + organic)) + ")" + NS_GetStringDate();
              //!!channelString = "O" + NS_GetStringDate();
              
              return channelString;                
          }
          
          // any found
          return null; 
      }
      
      // CPC
      function NS_Cpc()
      {
          // not cpc
          if (document.referrer == '')
              return null;
      
          var cpcs = NS_GetCPCs();

          for (cpc in cpcs)
          {
              var cpcRE = new RegExp("^https?\://[(\\w+\\.)]*" + organic + "\\.\\w{2,5}/");  // matches 'server' with http://server.com | http://www.server.nl | http://what.ever.server.com
              
              // referrer does not match current cpc server 
              if (!cpcRE.test(document.referrer))
                 continue;
              
              // referrer is one of the cpc servers 
              // give me cpc id if available
              cpcid = this.QueryKeyValue(window.location.search, this.cpc_id)

              // this is not cpc channel
              if (cpcid == null)
                return null;
                            
              var qvalue = this.QueryKeyValue(document.referrer, cpcs[cpc]);
              
              channelString = "C(" + encodeURI(NS_TrimString(qvalue != null ? qvalue : "UNKNOWN_CPC_" + cpc)) + ")" + NS_GetStringDate();
              //!!channelString = "C" + NS_GetStringDate();
                            
              return channelString;                
          }
          
          // any found
          return null; 
      }      

      function NS_StoreVariables(pageTracker, variablePrefix, values)
      {
          // only 5 or less values to store          
          if (values.length <= 5)
          {
            values5 = new Array();
            values5[0] = 'none';
            values5[1] = 'none';
            values5[2] = 'none';
            values5[3] = 'none';
            values5[4] = 'none';
                        
            for(var i = 0; i < values.length; i++)
            {
              values5[i] = values[i];
            }
            
            pageTracker._setCustomVar(1, variablePrefix + '1', values5[0], 3);
            pageTracker._setCustomVar(2, variablePrefix + '2', values5[1], 3);
            pageTracker._setCustomVar(3, variablePrefix + '3', values5[2], 3);
            pageTracker._setCustomVar(4, variablePrefix + '4', values5[3], 3);
            pageTracker._setCustomVar(5, variablePrefix + '5', values5[4], 3);
          }
          // more than 5 values => take only last 5
          else
          {            
            pageTracker._setCustomVar(1, variablePrefix + (values.length-4), values[values.length-5], 3);
            pageTracker._setCustomVar(2, variablePrefix + (values.length-3), values[values.length-4], 3);
            pageTracker._setCustomVar(3, variablePrefix + (values.length-2), values[values.length-3], 3);
            pageTracker._setCustomVar(4, variablePrefix + (values.length-1), values[values.length-2], 3);
            pageTracker._setCustomVar(5, variablePrefix + (values.length-0), values[values.length-1], 3);
          }          
      }

      function NS_ACTracking(pageTracker, conversion)
      {
          // on conversion -> log channels and then delete them from cookies
          if (conversion)
          {
            // get channels stored in cookie
            var cookieChannels = NS_ReadCookie(this.ns_cookie_name);
            
            // if comming directly to conversion page for first visit then cookie is empty
            if (cookieChannels == null)
            {
              emptyArray = new Array();
              emptyArray[0] = "NOCHANNEL";
            
              // log conversion with channels
              //!!NS_PixelImage("http://scripts.netsociety.nl/log/" + this.ns_conversion_storage + "?q1=DIRECT&q2=NONE&q3=$DATETIME");

              // store in GA                             
              NS_StoreVariables(pageTracker, '6C', emptyArray)            
            
            } else
            {
              // store in GA
              userId = cookieChannels.split('||')[0];
              channelsRight = cookieChannels.split('||')[1];
              channelsArray = channelsRight.split('|');
              
              // log conversion with channels            
              //!!NS_PixelImage("http://scripts.netsociety.nl/log/" + this.ns_conversion_storage + "?q1=" +  channelsRight + "&q2=" + userId + "&q3=$DATETIME");

              // store in GA            
              NS_StoreVariables(pageTracker, '6C', channelsArray)
            }
            
            // remove current channels
            NS_EraseCookie(this.ns_cookie_name);
           
            return null;              
          }
          else
          {
            var ignoreRE = new RegExp("^https?\://[(\\w+\\.)]*" + this.ns_ignore_referrer + "/");
  
            // coming from the client's page => skip 
            if (ignoreRE.test(document.referrer))
                return;

            // read stored channels          
            var channels = NS_ReadCookie(this.ns_cookie_name);
                        
          
            var direct = NS_Direct();
            var organic = NS_Organic();
            var cpc = NS_Cpc();
            
            var channel = null;
            
            if (direct != null)
                channel = direct;
            else if (organic != null)
                channel = organic;
            else if (cpc != null)
                channel = cpc;              
            else
                channel = "R(" + encodeURI(NS_TrimString(document.referrer)) + ")" + NS_GetStringDate();    // referrer
                //!!channel = "R" + NS_GetStringDate();    // referrer
  
            // new incomming => generate unique id for this user  
            if (channels == null)          
                channels = Math.floor(Math.random()*1000000) + "||" + channel;
            else          
                channels += '|' + channel;

            // store in cookie                
            NS_CreateCookie(this.ns_cookie_name, channels, this.ns_cookie_expire);

            // log visit with all channels
            if (channels == null)
            {            
              //!!NS_PixelImage("http://scripts.netsociety.nl/log/" + this.ns_visit_storage + "?q1=NONE&q2=NONE&q3=$DATETIME");
              return;
            }

            userId = channels.split('||')[0];
            channelsRight = channels.split('||')[1];
            channelsArray = channelsRight.split('|');
            
            //!!NS_PixelImage("http://scripts.netsociety.nl/log/" + this.ns_visit_storage + "?q1=" + channelsRight + "&q2=" + userId + "&q3=$DATETIME");
            
            // store in GA
            NS_StoreVariables(pageTracker, '6V_' + userId + '_', channelsArray)
            
            return channel;
          }              
      }                               
      
      function NS_PixelImage(src)
      {
        document.write("<im"+"g src='" + src + "' width='1px' height='1px' border='0' />");
      }