EventManager = {

  storage: new Array(),
  interval_storage: new Array(),
  suspendedEvents: new Array(),

  // Supported events and posibility to generate them
  windowLoad: false,
  windowUnLoad: false,
  bodyClick: false,

  wizardClosed: true,

  receivedAdServerURL: true,
  receivedAdStreamURL: true,
  receivedStreamURL: true,
  receivedMainFreeStreamURL: true,
  beforeTabShow: true,

  onPlayerStatusChanged: true,
  onPlayerClick: true,
  onMediaTypeChanged: true,

  addListener: function(event_name, object_pointer)
  {
    if (typeof eval("this." + event_name) != "boolean")
      return false;

    for (var i = 0; i < this.storage.length; i++) {
      if (this.storage[i]['name'] == event_name)
        if (this.storage[i]['object'] == object_pointer)
          return true;
    }

    new_index = this.storage.length;
    this.storage[new_index] = new Array();
    this.storage[new_index]['name'] = event_name;
    this.storage[new_index]['object'] = object_pointer;

    return true;
  },

  generate: function(event_name, custom_event_object)
  {
    if (typeof eval("this." + event_name) != "boolean" || eval("this." + event_name) != true)
      return false;

    var called_events = 0;

    for (var i = 0; i < this.storage.length; i++) {
      if (this.storage[i]['name'] != event_name)
        continue;

      var current_object = this.storage[i]['object'];
      EventManager.runEvent(current_object, event_name, custom_event_object, null);

      called_events++;
    }

    return called_events;
  },

  runEvent: function(current_object, event_name, custom_event_object, suspended_index)
  {
    var retval = eval("current_object." + event_name + "(custom_event_object)");
    EventManager.processResult(event_name, custom_event_object, current_object, retval, suspended_index);
  },

  processResult: function(event_name, custom_event_object, current_object, retval, suspended_index)
  {
    var is_suspended = (typeof suspended_index == "numeric") ? true : false;

    if (typeof(retval) == "undefined") {
      // Object skips this event because. All right
      if (is_suspended)
        this.suspendedEvents[suspended_index]['status'] = 'skipped';
    }
    else
      if (typeof(retval) == "boolean" && retval == true) {
        // Object processes this event successfully
        if (is_suspended)
          this.suspendedEvents[suspended_index]['status'] = 'done';
      }
      else
        if (typeof(retval) == "boolean" && retval == false) {
          // Object could not process this event. Looks like logic issue
          if (is_suspended)
            this.suspendedEvents[suspended_index]['status'] = 'failed';
        }
        else
          if (typeof(retval) == "number" && retval < 0) {
            // Object want to suspend this issue because data is not ready
            if (is_suspended) {
              var index = suspended_index;
            }
            else {
              var index = this.suspendedEvents.length;
              this.suspendedEvents[index] = new Array();
              this.suspendedEvents[index]['name'] = event_name;
              this.suspendedEvents[index]['object'] = current_object;
              this.suspendedEvents[index]['event_object'] = custom_event_object;
              this.suspendedEvents[index]['suspended_times'] = 0;
              this.suspendedEvents[index]['status'] = 'waiting';
            }

            var suspended_event = this.suspendedEvents[index];
            var timer = window.setTimeout("EventManager.runSuspendedEvent(" + index + ")", (-retval));
            suspended_event['timer'] = timer;
            suspended_event['suspended_times']++;
            suspended_event['interval'] = (-retval);
          }
  },

  runSuspendedEvent: function(index)
  {
    suspended_event = this.suspendedEvents[index];
    window.clearTimeout(suspended_event['timer']);

    if (suspended_event['status'] == 'waiting')
      EventManager.runEvent(suspended_event['object'], suspended_event['name'], suspended_event['event_object'], index);
  },


  cancelSuspendedEvent: function(event_name)
  {
    for (var i = 0; i < this.suspendedEvents.length; i++) {
      if (this.suspendedEvents[i]['name'] == event_name)
        this.suspendedEvents[i]['status'] = 'canceled';
    }
  },

  initInterval: function(object_pointer, method_name, milliseconds)
  {
    var new_index = null;

    for (var i = 0; i < this.interval_storage.length; i++) {
      if (this.interval_storage[i]['name'] == method_name)
        if (this.interval_storage[i]['object'] == object_pointer) {
          if (this.interval_storage[i]['interval'])
            return true;

          new_index = i;
          break;
        }
    }

    if (!new_index)
      new_index = this.interval_storage.length;
    this.interval_storage[new_index] = new Array();
    this.interval_storage[new_index]['name'] = method_name;
    this.interval_storage[new_index]['object'] = object_pointer;
    this.interval_storage[new_index]['interval'] = milliseconds;

    return new_index;
  },

  //! \brief Execute method each milliseconds time
  startInterval: function(object_pointer, method_name, milliseconds)
  {
    var index = this.initInterval(object_pointer, method_name, milliseconds);
    if (typeof index == "boolean")
      return index;
    this.interval_storage[index]['type'] = 'interval';
    this.interval_storage[index]['timerID'] = window.setInterval("EventManager.runInterval(" + index + ")", milliseconds);

    return true;
  },

  //! \brief Execute method each milliseconds time
  startTimeout: function(object_pointer, method_name, milliseconds)
  {
    var index = this.initInterval(object_pointer, method_name, milliseconds);
    if (typeof index == "boolean")
      return index;
    this.interval_storage[index]['type'] = 'once';
    this.interval_storage[index]['timerID'] = window.setTimeout("EventManager.runInterval(" + index + ")", milliseconds);

    return true;
  },

  stopInterval: function(object_pointer, method_name)
  {
    for (var i = 0; i < this.interval_storage.length; i++) {
      if (this.interval_storage[i]['name'] == method_name)
        if (this.interval_storage[i]['object'] == object_pointer) {
          if (!this.interval_storage[i]['interval'])
            return false;

          window.clearTimeout(this.interval_storage[i]['timerID']);
          this.interval_storage[i]['interval'] = 0;
          return true;
        }
    }

    return false;
  },

  runInterval: function(index)
  {
    var interval_data = this.interval_storage[index];

    var object_pointer = interval_data['object'];
    var method_name = interval_data['name'];
    var type = interval_data['type'];

    if (type == 'once') {
      interval_data['interval'] = 0;
      window.clearTimeout(interval_data['timerID']);
    }

    var retval = eval("object_pointer." + method_name + "()");

    return true;
  },

  // Add support window.onload
  generateWindowLoad: function()
  {
    this.windowLoad = true;
    EventManager.generate("windowLoad", {});
    this.windowLoad = false;
  },

  generateWindowUnLoad: function()
  {
    this.windowUnLoad = true;
    EventManager.generate("windowUnLoad", {});
    this.windowUnLoad = false;
  },

  generateBodyClick: function()
  {
    this.bodyClick = true;
    EventManager.generate("bodyClick", {});
    this.bodyClick = false;
  }
}
Helper = {

  jumptvURL: "",
  jumptvSSLEnabled: null,
  languageCode: "",
  parnerCode: "",
  location: "",
  sessionCreateTime: "",
  
  getSecureJumpTVUrl: function()
  {
    if (this.jumptvSSLEnabled) 
      return this.jumptvURL.replace(/http:/, "https:");
    else 
      return this.jumptvURL.replace(/https:/, "http:");
  },
  
  getJumpTVUrl: function()
  {
    return this.jumptvURL.replace(/https:/, "http:");
  },
  
  getLang: function()
  {
    return this.languageCode;
  },
  
  getLocation: function()
  {
    return this.location;
  },
  
  getBrowser: function()
  {
  
    var str = navigator.userAgent;
    
    if (str.match(/Firefox\//)) 
      return 'FF';
    else 
      if (str.match(/Opera\//)) 
        return 'OP';
      else 
        if (str.match(/Safari\//)) 
          return 'SA';
        else 
          if (str.match(/Konqueror /)) 
            return 'KO';
          else 
            if (str.match(/MSIE /)) 
              return 'IE';
            else 
              return 'UNKNOWN';
  },
  
  
  getOS: function()
  {
    var str = navigator.userAgent;
    
    if (str.match(/Linux/)) 
      return 'LX';
    else 
      if (str.match(/Windows/)) 
        return 'MS';
      else 
        return 'UNKNOWN';
  },
  
  
  
  refresh: function(url)
  {
    var new_url = '';
    
    if (typeof url != 'undefined' && url) 
      new_url = url;
    else 
      new_url = document.location.href;
    
    new_url = new_url.replace(/#.*/, '');
    
    document.location.href = new_url;
  },
  
  
  getCookie: function(cookieName)
  {
    var theCookie = "" + document.cookie;
    var ind = theCookie.indexOf(cookieName);
    if (ind == -1 || cookieName == "") 
      return "";
    var ind1 = theCookie.indexOf(';', ind);
    if (ind1 == -1) 
      ind1 = theCookie.length;
    return unescape(theCookie.substring(ind + cookieName.length + 1, ind1));
  },
  
  setCookie: function(name, value, expires, path, domain, secure)
  {
    var today = new Date();
    
    today.setTime(today.getTime());
    
    if (expires) {
      expires = expires * 1000 * 60 * 60 * 24;
    }
    
    var expires_date = new Date(today.getTime() + (expires));
    
    document.cookie = name + '=' + escape(value) +
    ((expires) ? ';expires=' + expires_date.toGMTString() : '') + //expires.toGMTString()
    ((path) ? ';path=' + path : '') +
    ((domain) ? ';domain=' + domain : '') +
    ((secure) ? ';secure' : '');
  },
  
  addGetParam: function(main_url, param_name, param_value)
  {
    var param_separator = '?';
    if (main_url.indexOf('?') > 0) 
      param_separator = '&';
    
    if (typeof(param_value) == 'object' && param_value === null) 
      return main_url;
    
    return main_url + param_separator + param_name + "=" + encodeURIComponent(param_value);
  },
  
  calculatePopUpPosition: function(width, height, horizontal_align, vertical_align)
  {
    if (horizontal_align != 'center' || vertical_align != 'middle') 
      return;
    
    
    // Calculate windows size and position
    var window_params = {
      x: 0,
      y: 0,
      width: width,
      height: height
    }
    
    if (Helper.getBrowser() == 'IE') {
      window_params.x = window.screenLeft + window.document.documentElement.clientWidth / 2;
      window_params.y = window.screenTop + window.document.documentElement.clientHeight / 2;
    }
    else {
      window_params.x = window.screenX + window.innerWidth / 2 + (window.outerWidth - window.innerWidth - 4);
      window_params.y = window.screenY + window.innerHeight / 2 + (window.outerHeight - window.innerHeight - 25);
    }
    
    window_params.x = parseInt(window_params.x - window_params.width / 2);
    window_params.y = parseInt(window_params.y - window_params.height / 2);
    
    return window_params;
  },
  
  
  getPartnerCode: function()
  {
    return this.parnerCode;
  },
  
  
  waiter: function(element)
  {
    $(element).update('<img src="/img/waiter.gif" alt="waiter"/>');
  },
  
  getElementPosition: function(obj)
  {
    var curleft = 0;
    var curtop = 0;
    
    obj = $(obj);
    
    if (typeof obj.offsetParent !== "unknown" && obj.offsetParent) {
      curleft = obj.offsetLeft;
      curtop = obj.offsetTop;
      while (obj = obj.offsetParent) {
        curleft += obj.offsetLeft - (obj.tagName != 'HTML' ? obj.scrollLeft : 0);
        curtop += obj.offsetTop - (obj.tagName != 'HTML' ? obj.scrollTop : 0);
      }
    }
    return {
      left: curleft,
      top: curtop
    };
  },
  
  riseClickEvent: function(object)
  {
    if (Prototype.Browser.IE) {
      object.fireEvent('onClick');
    }
    else {
      var evt = document.createEvent("MouseEvents");
      evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
      object.dispatchEvent(evt);
    }
  },
  
  onButtonClick: function(event)
  {
    var target = Event.element(event);
    
    if (target.tagName != 'A' && target.tagName != 'BUTTON') {
      var tBody = target.parentNode.parentNode;
      
      var links = tBody.getElementsByTagName('a');
      
      if (typeof(links[0]) != "undefined") {
        this.riseClickEvent(links[0]);
        return;
      }
      
      var buttons = tBody.getElementsByTagName('button');
      
      if (typeof(buttons[0]) != "undefined") 
        this.riseClickEvent(buttons[0]);
    }
  },
  
  detectPlayerType: function()
  {
  	if(this.getCookie('wcq_player_type'))
		return;
	
	if(Player.is_wmp_plugin_installed())
		this.setCookie('wcq_player_type', 'application/x-ms-wmp', 30*24*3600*1000, '/');
  }  
};

Wizard = {

  window: null,
  timer_check_closing: null,
  refresh_url: null,
  successful_subscription_refresh_url: null,

  signInWidth: 595,
  signInHeight: 390,

  signUpWidth: 595,
  signUpHeight: 390,

  subscriptionWidth: 595,
  subscriptionHeight: 390,


  is_opened: function()
  {
    return (typeof(this.window) == 'object' && this.window != null && this.window.closed == false);
  },


  signIn: function(product_id, location, trigger, refresh_url)
  {
    if (this.is_opened())
      return;

    if (typeof refresh_url == 'string')
      this.refresh_url = refresh_url;

    // Create URL. NULL values won't be added to URL
    var url = Helper.getSecureJumpTVUrl() + '/' + Helper.getLang() + '/' + 'signin';
    if (typeof product_id == "number" && product_id)
      url += '/' + product_id;

    url = Helper.addGetParam(url, 'cobrand_partner', Helper.getPartnerCode());
    url = Helper.addGetParam(url, 'location', location);
    url = Helper.addGetParam(url, 'trigger', trigger);

    var window_position = Helper.calculatePopUpPosition(this.signInWidth, this.signInHeight, 'center', 'middle');

    this.open(url, window_position);
  },


  signUp: function(product_id, location, trigger, refresh_url)
  {
    if (this.is_opened())
      return;

    if (typeof refresh_url == 'string')
      this.refresh_url = refresh_url;

    // Create URL. NULL values won't be added to URL
    var url = Helper.getSecureUrl() + '/' + Helper.getLang() + '/' + 'signup';
    if (typeof product_id == "number" && product_id)
      url += '/' + product_id;

    url = Helper.addGetParam(url, 'cobrand_partner', Helper.getPartnerCode());
    url = Helper.addGetParam(url, 'location', location);
    url = Helper.addGetParam(url, 'trigger', trigger);

    var window_position = Helper.calculatePopUpPosition(this.signUpWidth, this.signUpHeight, 'center', 'middle');

    this.open(url, window_position);
  },


  subscribe: function(product_id, default_pricing_model_id, location, trigger, refresh_url, successful_subscription_refresh_url)
  {
    if (this.is_opened())
      return;

    if (typeof refresh_url == 'string')
      this.refresh_url = refresh_url;

    if (typeof successful_subscription_refresh_url == 'string')
      this.successful_subscription_refresh_url = successful_subscription_refresh_url;

    // Create URL. NULL values won't be added to URL
    var url = Helper.getSecureJumpTVUrl() + '/' + Helper.getLang() + '/' + 'subscription/' + product_id;
    url = Helper.addGetParam(url, 'cobrand_partner', Helper.getPartnerCode());
    url = Helper.addGetParam(url, 'location', location);
    url = Helper.addGetParam(url, 'trigger', trigger);
    if (default_pricing_model_id)
      url = Helper.addGetParam(url, 'defaultpm', default_pricing_model_id);

    var window_position = Helper.calculatePopUpPosition(this.subscriptionWidth, this.subscriptionHeight, 'center', 'middle');

    this.open(url, window_position);
  },
  
  
  openSubscription: function(formRefence)
  {
    var productId = 0;
    var options = formRefence.elements['paymentOption'];
    for(var i = 0; i < options.length; i++)
      if(options[i].checked)
        productId = options[i].value; 
    
    var pricingId = formRefence.elements['pricing['+productId+']'].value;
    var successful_subscription_refresh_url = formRefence.elements['redirect['+productId+']'].value;
    
    this.subscribe(productId, pricingId, Helper.getLocation(), 'payment_options', null, successful_subscription_refresh_url);    
  },

  calculatePopUpPosition: function(width, height, horizontal_align, vertical_align)
  {
    if (horizontal_align != 'center' || vertical_align != 'middle') 
      return;
    
    
    // Calculate windows size and position
    var window_params = {
      x: 0,
      y: 0,
      width: width,
      height: height
    }
    
    if (Helper.getBrowser() == 'IE') {
      window_params.x = window.screenLeft + window.document.documentElement.clientWidth / 2;
      window_params.y = window.screenTop + window.document.documentElement.clientHeight / 2;
    }
    else {
      window_params.x = window.screenX + window.innerWidth / 2 + (window.outerWidth - window.innerWidth - 4);
      window_params.y = window.screenY + window.innerHeight / 2 + (window.outerHeight - window.innerHeight - 25);
    }
    
    window_params.x = parseInt(window_params.x - window_params.width / 2);
    window_params.y = parseInt(window_params.y - window_params.height / 2);
    
    return window_params;
  },


  open: function(url, window_position)
  {
    var params = new Array();

    var i = -1;
    i++;
    params[i] = 'left=' + window_position.x;
    i++;
    params[i] = 'top=' + window_position.y;
    i++;
    params[i] = 'width=' + window_position.width;
    i++;
    params[i] = 'height=' + window_position.height;

    i++;
    params[i] = 'menubar=no';
    i++;
    params[i] = 'toolbar=no';
    i++;
    params[i] = 'resizable=no';
    i++;
    params[i] = 'scrollbars=no';
    i++;
    params[i] = 'status=no';
    i++;
    params[i] = 'dependent=no';


    // Open wizard
    this.window = window.open(url, 'wizard', params.join(', '));
	try {
    	this.window.focus();
		}
		catch(e) {}


    // Check closing child window
    this.timer_check_closing = window.setInterval(this.check_closing, 100);
    // It'll close child window if visitor closes main one
    EventManager.addListener('windowUnLoad', this);
    // It'll process main window if visitor closes child one
    EventManager.addListener('wizardClosed', this);
  },


  close: function()
  {
    if (this.is_opened()) {
      this.window.close();
      EventManager.generate('wizardClosed', {
        type: 'automatically'
      });
    }
  },


  signOut: function()
  {
    var signOutElement = document.createElement('script');
    signOutElement.type = "text/javascript";
    signOutElement.src = Helper.getJumpTVUrl() + '/controller.php?action=logout&writeJSCode=' + encodeURIComponent("Wizard.afterSignOut();");

    document.body.appendChild(signOutElement);
  },


  /* Events */
  afterSignOut: function()
  {
    Helper.refresh();
  },

  wizardClosed: function()
  {
    if (parseInt(Helper.getCookie('wizard_done')) > 0) {
      if (Helper.getCookie('wizard_done_type') == 'subscription' && this.successful_subscription_refresh_url)
        Helper.refresh(this.successful_subscription_refresh_url);
      else if(this.refresh_url)
        Helper.refresh(this.refresh_url);
      else
        Helper.refresh();
    }
    
    this.refresh_url = null;
    this.successful_subscription_refresh_url = null;
  },


  //! \brief Check closing for subscription window of current browser window
  //! NOTE: function called by timer and hasn't 'this' variable
  check_closing: function()
  {
    if (Wizard.is_opened())
      return;

    window.clearInterval(Wizard.timer_check_closing);

    EventManager.generate('wizardClosed', {
      type: 'manually'
    });
  },


  windowUnLoad: function()
  {
    this.close();
  },

	showPaymentOptions: function( matchId )
	{
    paymentOptionsPopup.open('/'+Helper.getLang()+'/payment_options/view/' + matchId + '/' + Helper.getLocation());
	}
}