function Page()
{
  this.callbacks = new Array();
}

// CONSTANTS

Page.prototype.COOKIE_EXPIRE = 365;

Page.prototype.Events =
{
  LOCATION_CHANGED: 1,
  WIDGETS_CHANGED: 2,
  WIDGETS_ORDER_CHANGED: 3,
  WIDGET_COLLAPSED: 4,
  WIDGET_EXPANDED: 5,
  WIDGETS_COLUMN_CHANGED: 6,
  WIDGET_RESIZED: 7
};

// EVENTS
Page.preloadedImages = {};
Page.prototype.addEventListener = function(eventName, callback)
{
  if (this.callbacks[eventName] == undefined)
    this.callbacks[eventName] = new Array();

  for (var i=0;i<this.callbacks[eventName].length;i++) {
    if (this.callbacks[eventName][i].toString() == callback.toString()) {
      return;
    }
  }

  this.callbacks[eventName].push(callback);
}

Page.prototype.removeEventListener = function(eventName, callback)
{
  if (this.callbacks[eventName] == undefined) 
    return true;
  for (var i=0;i<this.callbacks[eventName].length;i++) {
    if (this.callbacks[eventName][i].toString() == callback.toString()) {
      this.callbacks[eventName].splice(i, 1);
    }
  }
  return true;
}

Page.prototype.fireEvent = function(event, data) {
  for (var i=0;i<this.callbacks[event].length;i++) {
    this.callbacks[event][i].call(window, data);
  }
}

// MAIN METHODS

Page.prototype.urlencode = function(str)
{
  return escape(str).replace(/\+/g,'%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40');
}

Page.prototype.setCookie = function(name,value)
{
  var exdate = new Date();
  exdate.setDate(exdate.getDate() + this.COOKIE_EXPIRE);
  document.cookie = name + "=" + escape(value) + ((this.COOKIE_EXPIRE == null) ? "" : ";expires=" + exdate.toGMTString())+ ';path=/;';
}

Page.prototype.getCookie = function(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 unescape(c.substring(nameEQ.length,c.length));
  }
  return null;
}

Page.prototype.preloadImages = function()
{
 if (typeof arguments[0] == 'object') {
   var data = arguments[0];  
 }else{
   var data = arguments;
 }
 
 $.each(data,function(i,item)
 {
    var img = new Image();
    img.src =  item;
    Page.preloadedImages[item] = img;
 });
};

Page.getPreloadedImage = function(src) {
  if (src in Page.preloadedImages) {
    return Page.preloadedImages[src];
  }
   return false;
}

  
Page.prototype.loadWidgets = function()
{
  $.ajaxSetup({async: false, cache: false});
  params = window.t_location ? {country_code: window.t_location.country_code} : {};
  if(window.location.pathname.indexOf('lang'))
  {
    params.lang_code = window.location.pathname.substr(window.location.pathname.lastIndexOf('/') + 1);
  }
  $.getJSON('/getWidgetList?available=true&format=full',
  	params,
    function(data)
    {
      window.page.all_widgets = data;
    });
  $.getJSON('/getSettingsList',
    params,
    function(data)
    {
      window.page.settings = data;
    });
  $.ajaxSetup({async: true});

  var widgets = new Array();
  if (window.previous_location && window.previous_location.country_code && (window.previous_location.country_code != window.t_location.country_code)){
  	widgets = window.page.all_widgets.slice(0);
  } else 
  if(window.page.getCookie('widgets') != undefined && window.page.getCookie('widgets'))
  {
    $.each(window.page.all_widgets,function(i,item)
    {
      $.each($.evalJSON(window.page.getCookie('widgets')),function(k,item2)
      {
        if(item.widget_id == item2.widget_id)
        {
          item.position = item2.position;
          if(item2.settings != undefined)
          {
			for (i=item2.settings.length-1;i>-1;i--) {
				if (item.settings[i]){
					item.settings[i]['default_value'] = item2.settings[i]['default_value'];
				}
			}
          }
          widgets.push(item);
        }
      });
    });
  }
  else
  {
    widgets = window.page.all_widgets.slice(0);
  }
  
  window.page.widgets = widgets;
  
  window.page.saveWidgets();
}

Page.prototype.isWidgetInstalled = function(widget_id)
{
  var result = false;
  
  $.each(window.page.widgets,function(i,item)
  {
    if(item.widget_id == widget_id)
    {
      result = true;
    }
  });
  
  return result;
}

Page.prototype.addWidget = function()
{
  var column = '';
  var min_height;
  
  $('#add_widget').hide();
  
  $('div[id^="column"]').each(function(i)
  {
    if(min_height == undefined || $(this).height() < min_height)
    {
      min_height = $(this).height();
      column = $(this).attr('id');
    }
  });
  
  var widget_id = $(this).attr('widget_id');

  $.each(window.page.all_widgets,function(i,item)
  {
    if(item.widget_id == widget_id)
    {
      item.position.column = parseInt(column.substr(column.lastIndexOf('_') + 1));

      var max_number = 0;
      $.each(window.page.widgets,function(k,widget)
      {
        if(widget.position.column == item.position.column && max_number < widget.position.number)
        {
          max_number = widget.position.number;
        }
      });
      
      item.position.number = parseInt(max_number) + 1;
      
      window.page.widgets.push(item);
      
      if(window.catalog != undefined && window.catalog.createCarousel != undefined)
      {
        window.page.addEventListener(window.page.Events.WIDGETS_CHANGED,window.catalog.createCarousel);
      }
      
      window.page.fireEvent(window.page.Events.WIDGETS_CHANGED);
      
      window.page.createWidgetHTML(item);
      
      var widget = new Widget(item.widget_id,item.widget_name);
      widget.getContent();
      setTimeout(Page.fixColumnHeight, 100);
      return widget;
    }
  });
}

Page.prototype.rebuildWidgets = function(){
  this.loadWidgets();
  var columns = Array();

  $.each(window.page.widgets,function(i,item)
  {
    var column = item.position.column;
    var number = item.position.number;
    
    if(columns[column] == undefined)
    {
      columns[column] = new Array();
    }
    
    if(column != 0 && number != 0)
    {
      if(columns[column][number] == undefined || !columns[column][number])
      {
        columns[column][number] = item;
      }
      else
      {
        while(columns[column][number] == undefined || !columns[column][number])
        {
          number++;
        }
        
        item.position.number = number;
      }
    }
  });
  
  $.each(columns,function(i,widget)
  {
    if(widget != undefined && widget)
    {
	    $.each(widget,function(k,item)
	    {
	      if(item != undefined && item)
	      {
			if ($('[widget_id=' +item.widget_id+']').size() == 0){
		    	window.page.createWidgetHTML(item);
			}
		  }
	    });
	  }
  });
  
  $(".column").sortable({
    connectWith: ['#column_1','#column_2'],
    receive: Widget.onColumnChanged,
    update: Widget.move,
    tolerance: 'intersect',
    forcePlaceholderSize: true,
    placeholder: 'placeholder',
    
    stop: window.page.normolyzeHeight,

	helper : function(ev, el) {
		if(!$.browser.msie){
			return ($(el).clone().addClass('column-2-widget').css('opacity', 0.5));
		}
		else {
			return ($(el).clone().addClass('column-2-widget'));
		}
	},
	handle: '.ui-widget-header',
	scroll: true,
	containment: $('body')
  });
  $(".column").disableSelection();
}
Page.prototype.createWidgetHTML = function(widget)
{
  var html = '<div class="portlet" id="widget_' + widget.widget_name + '" widget_id="' + widget.widget_id + '">';
  html += '<div class="portlet-header"><div class="portlet-header-body"><a href="javascript:void(0)" title="' + window.translations.collapse_box + '" class="toogle-widget expanded-widget"></a><h3 class="widget-title">'; 
  if (widget.url && widget.url != null) {
	  html += '<a href="' + widget.url + '" title="' + window.translations.partner_site + '">' + widget.widget_header + '</a></h3>';
  }else{
	  html +=  widget.widget_header + '</h3>';
  }
  if (widget.closable) {
	  html += '<a href="#" class="close-widget" title="' + window.translations.close_widget + '"></a>';
  }
  if (widget.editable) {
	  html += '<a href="#" class="edit-widget" title="' + window.translations.edit_widget + '"></a>';
  }
  html +=	'<img class="throbber" id="throbber_' + widget.widget_name + '" src="/images/throbber.gif"/>';
  html += '</div><div class="portlet-header-footer"></div></div>';
  html += '<div class="portlet-content"><div class="portlet-content-body">';
  html += '<div id="' + widget.widget_name + '"></div>';
  html += '</div><div class="portlet-content-footer"></div</div>';
  html += '</div>';

  
  $('#column_' + widget.position.column).append(html);
  $("#widget_" + widget.widget_name).addClass("ui-widget ui-widget-content ui-helper-clearfix")
    .find(".portlet-header")
      .addClass("ui-widget-header")
      .end()
    .find(".portlet-content");

  if(widget.editable)
  {
    var form = '<form class="settings_form"><table>';
   $.each(widget.settings,function(i,item)
   {
      form += '<tr><td><label for="' + window.page.settings[item.id].name + '">' + window.page.settings[item.id].text + ':</label></td><td><input id="' + window.page.settings[item.id].id + '" name="setting_' + item.id + '" type="text" value="' + item.default_value + '"/></td></tr>';
   });
   form += '<tr><td></td><td><button type="button" value="' + window.translations.save_settings + '" id="settings_submit_' + widget.widget_name + '" title="Save"><span>' + window.translations.save_settings + '</span></button></td></tr></table></form>';
   
    $('#widget_' + widget.widget_name + ' .portlet-header').after(form);
    
    $('#settings_submit_' + widget.widget_name).click(function()
    {
      var widget_id = $($(this).parents(".ui-widget")).attr('widget_id');
      var form = $($(this)).parents(".settings_form");
      
      $(form).submit(function()
      {
        return false;
      });
      
      $.each(window.page.widgets,function(i,item)
      {
        if(item.widget_id == widget_id)
        {
          var settings = form.serializeArray();
          
          $.each(settings,function(k,settings_item)
          {
            $.each(item.settings,function(j,widget_settings_item)
            {
              if('setting_' + widget_settings_item.id == settings_item.name)
              {
                widget_settings_item.default_value = settings_item.value;
              }
            });
          });
          
          form.slideToggle('normal');
          window.page.saveWidgets();
          new Widget(widget_id,item.widget_name).getContent();
        }
      });
    });
	}
  
  $('.close-widget').click(window.page.closeWidget);
  $('.toogle-widget').click(Page.toogleWidget);
  $('.toogle-widget').click(function(){return false;})
  
  
  $('.close-widget').click( function() { return false; } );
  $('.edit-widget').click(window.page.editWidget);
  $('.edit-widget').click( function() { return false; } );
}

Page.toogleWidget = function() {
 
    
  	var myPortlet = $(this).parents(".portlet:first").find(".portlet-content");
  	$(myPortlet).toggle();
  	var isVisible = myPortlet.is(':visible');
  	var isHidden = myPortlet.is(':hidden');
  	var widget_id = $(this).parents(".portlet:first").attr('widget_id');
  	if(isVisible){
  			$(this).attr('title',window.translations.collapse_box);
			$(this).parents(".portlet:first").find(".portlet-header-footer").show();
			window.page.fireEvent(window.page.Events.WIDGET_EXPANDED, widget_id);
  	}
  	if(isHidden){
  			$(this).attr('title',window.translations.expand_box);
			$(this).parents(".portlet:first").find(".portlet-header-footer").hide();
			window.page.fireEvent(window.page.Events.WIDGET_COLLAPSED, widget_id);
  	}
  	$(this).toggleClass('expanded-widget');
  	$(this).toggleClass('collapsed-widget'); 
}

Page.prototype.saveWidgets = function()
{
  var widgets = new Array();
  $.each(window.page.widgets,function(i,item){
    widgets.push(
      {
        widget_id: item.widget_id, 
        position: 
        {
          column: item.position.column, 
          number: item.position.number
        },
        settings: item.settings != undefined ? item.settings : {}
      });
  });

  window.page.setCookie('widgets',$.toJSON(widgets));
}

Page.prototype.editWidget = function()
{
    var widget_id = $($(this).parents(".ui-widget")).attr('widget_id');
   $($(this).parents(".ui-widget")).find('.settings_form').slideToggle('normal');
}

Page.prototype.createHTML = function()
{
  var host = document.location.host.split(".").reverse();
  host = host[2];
  if(host == 'dashboard')
  {
    host = 'skyhookwireless';
  }
  
  $('body').append('<div id="header">' +
                     '<div class="wrapper">'+ 
                       '<h1 id="loki_logo" title="http://www.loki.com"><span>' + window.translations.site_title + '</span></h1>' +
                       (host ? '<h3><a id="partner_logo" href="http://www.' + host + '.com/" title="http://www.' + host + '.com/"><img src="/images/brought_' + host + '.gif"></a></h3>' : '') +
                       '<div id="language_section"><a href="/lang/en"><img src="/images/US.png"/></a> <a href="/lang/fr"><img src="/images/FR.png"/></a> <a href="/lang/de"><img src="/images/DE.png"/></a></div>' +
                     '</div>'+
                   '</div>' +
                   '<div class="container" id="container">' +
                     '<div id="column_1" class="column"></div>' +
                     '<div id="column_2" class="column"></div>' + 
                   '</div>' +
                   '<div id="tray-wrapper"></div>' +
                   '<div id="footer">'+
                     '<span id="plugin_version" class="copy"><div style="float:left;">&nbsp;</div></span>' +
                     '<span id="skyhook" class="copy">&copy; 2009 <a target="_blank" href="http://skyhookwireless.com">Skyhook Wireless Inc.</a></span>'+
                     '<span id="manage" class="copy"><a href="javascript: void(0);" class="manage-sites" title="' + window.translations.manage_sites + '"><span>' + window.translations.manage_sites + '</span></a></span>'+
                   '</div>');
  
  if(LokiAPI.isInstalled() && compareVersions(LokiAPI.installedVersion,"3.1.1.0") >= 0){
	  $('.manage-sites').click(function(){
	  	window.loki.showManageDomains();
	  });
  }else{
  	$(".manage-sites").remove();
  }
  
  $('#loki_logo').click(function()
  {
    window.open('http://loki.com');
  });

}

Page.prototype.normolyzeHeight = function(){
    var max_h = 0;
    $('.ui-sortable').each(function(){
        var h = 0;
        for (var i = 0; i < this.childNodes.length; i++) {
            h += $(this.childNodes[i]).outerHeight(true);
        }
        if (h > max_h) {
            max_h = h;
        }
    });
    if ($.browser.msie) {
      $('.ui-sortable').css('height', max_h);
    }else{
      $('.ui-sortable').css('min-height', max_h);
    }
}

Page.prototype.closeWidget = function()
{
   var widget_id = $($(this).parents(".ui-widget")).attr('widget_id');

   $($(this).parents(".ui-widget")).fadeOut('normal',function()
   {
     $(this).remove();
     Page.fixColumnHeight();
   });
   
   for(var k = 0; k < window.page.all_widgets.length; k++)
   {
     if(window.page.all_widgets[k].widget_id == widget_id)
     {
       Tray.addWidget(window.page.all_widgets[k]);
     }
   }

   for(var i = 0; i < window.page.widgets.length; i++)
   {
     if(window.page.widgets[i].widget_id == widget_id)
     {
       window.page.widgets.splice(i,1);
     }
   }
 
   window.page.fireEvent(window.page.Events.WIDGETS_CHANGED);
}

Page.showPluginVersion = function() 
{
  var version = LokiAPI.pluginDescription;
  if (version == undefined) 
  {
    setTimeout(Page.showPluginVersion, 3000);
  }
  else 
  {
    //$('#plugin_version').html('<div style="float:left;"> ' + window.translations.plugin_version + version.substr(version.indexOf('.') + 1) + '</div>' + $('#plugin_version').html());
	$('#plugin_version').html('<div style="float:left;"> ' + window.translations.plugin_version + version.substr(version.indexOf('.') + 1) + '</div><a class="upgrade-plugin" title="' + window.translations.new_version.replace('{version}',LokiAPI.availableVersion) + '"><span>' + window.translations.new_version.replace('{version}',LokiAPI.availableVersion) + '</span></a>');
  }
  
  if(LokiAPI.isInstalled() && LokiAPI.isUpgradeAvailable()){
    $('.upgrade-plugin').click(function(){
      LokiAPI.startUpgrade();
      $(".upgrade-plugin").remove();
    });
  }else{
    $(".upgrade-plugin").remove();
  }
}

Page.prototype.getLocation = function()
{
  if(window.loki == undefined)
  {
    var Loki = new LokiAPI();
    window.loki = Loki;
  }
  
  //Page.showPluginVersion();

  if(window.t_location == undefined)
  {
	  Loki.onSuccess = function(location) {
	    $.unblockUI();
	    
	    window.t_location = {country_code: location.country_code, house_number: location.house_number, street: location.street, city: location.city, region_code: location.region_code, postal_code: location.postal_code, latitude: location.latitude, longitude: location.longitude, country: location.country};//location
	    
	    window.page.fireEvent(window.page.Events.LOCATION_CHANGED);
	  };
	  Loki.onFailure = function(error, msg){
    	//
    	last_loc = $.evalJSON(window.page.getCookie('location'));
    	if ((error==LokiPlugin.WPS_ERROR_WIFI_NOT_AVAILABLE || error==LokiPlugin.WPS_ERROR_NO_WIFI_IN_RANGE) && last_loc && last_loc.country_code){
	  		window.t_location = last_loc;
	  		$.unblockUI();
	   		window.page.fireEvent(window.page.Events.LOCATION_CHANGED);
        return;
      }
    	//
	    Loki.onSuccess = function(location)
	    {
			$('#warning_div').html(window.translations.ip_geocode + msg);
			$('#warning_div').show();

	      window.ip_location = true;
	      
	      window.t_location = {country_code: location.country_code, house_number: location.house_number, street: location.street, city: location.city, region_code: location.region_code, postal_code: location.postal_code, latitude: location.latitude, longitude: location.longitude, country: location.country};//location
	      
	      $.unblockUI();
	      
	      window.page.fireEvent(window.page.Events.LOCATION_CHANGED);
	    }
	    
	    Loki.onFailure = function(error, msg)
	    {
	      $.unblockUI();
	      
			$('#warning_div').text(window.translations.unable_geocode + msg);
			$('#warning_div').show();

			  $('#tune_dialog').dialog({bgiframe: true,
			                            autoOpen: false,
			                            height: 550,
			                            width: 472,
			                            title: window.translations.tune_location,
			                            modal: true
			  });
	      
	      window.page.prepareTuneLocationDialog();
	    }
	    
	    Loki.requestIPLocation(true,Loki.FULL_STREET_ADDRESS_LOOKUP);
	  };
	  
    $.blockUI({ message: '<h3><img src="/images/throbber.gif"/>' + window.translations.loki_working + '</h3>' });
    Loki.requestLocation(true,Loki.FULL_STREET_ADDRESS_LOOKUP);
  }
  else
  {
    window.loki.onReverseGeocoded = function(result)
    {
      window.t_location = result;
      
      window.page.fireEvent(window.page.Events.LOCATION_CHANGED);
    }
    window.loki.reverseGeocode(window.t_location.latitude,window.t_location.longitude, window.loki.FULL_STREET_ADDRESS_LOOKUP);
  }
}

Page.prototype.tuneLocationDialog = function()
{
  $('#tune_dialog').dialog({bgiframe: true,
                            autoOpen: false,
                            height: 550,
                            width: 462,
                            title: window.translations.tune_location,
                            modal: true
  });
  
  $('#tune_link').click(window.page.prepareTuneLocationDialog);
}

Page.prototype.prepareTuneLocationDialog = function()
{
  $('#tune_dialog').dialog('option', 'title', window.translations.tune_location);
  $('#tune_submit').attr('disabled','disabled');
  $('#tune_cancel').click(function()
  {
    $('#tune_dialog').dialog('close');
  });
  $('#tune_dialog').dialog('open');

  var tune_map = new google.maps.Map2(document.getElementById("tune_gmap"));
  if(window.t_location && window.t_location.latitude)
  {
    var latLng = new GLatLng(window.t_location.latitude, window.t_location.longitude);
    tune_map.setCenter(latLng, 13);
  }
  else
  {
    var latLng = new GLatLng(0, 0);
    tune_map.setCenter(latLng, 1);
  }
  tune_map.setUIToDefault();
  
  opts = {
    "draggable": true
  }
  
  var tune_location = {marker: new GMarker(latLng, opts), tune_map: tune_map};
  tune_location.marker.enableDragging();
  
  $('#tune_geocode').bind('click',{map: tune_map, marker: tune_location.marker},window.page.geocode);
  $('#tune_form').bind('submit',{map: tune_map, marker: tune_location.marker},function(event)
  {
    window.page.geocode(event);
    
    event.preventDefault();
  });
  
  
  tune_location.tune_map.addOverlay(tune_location.marker);
  GEvent.addListener(tune_location.marker, 'dragend', function()
  {
    window.loki.onReverseGeocoded = function(result)
    {
    	if( !(result && result.latitude) ){return;}
      tune_location.t_location = result;
      
      $('#tune_submit').removeAttr('disabled');
      $('#tune_submit').bind('click',{tune_location: tune_location},window.page.refreshLocation);
    }
    
    var latLng = tune_location.marker.getLatLng();
    tune_location.tune_map.setCenter(latLng);
    
    window.loki.reverseGeocode(latLng.lat(), latLng.lng(), window.loki.FULL_STREET_ADDRESS_LOOKUP);
  });
  
  GEvent.addListener(tune_location.marker, 'dragstart', function()
  {
    $('#tune_submit').attr('disabled','disabled');
  });
  
  tune_location.marker.show();
}

Page.prototype.geocode = function(event)
{
  $('#tune_submit').attr('disabled','disabled');
  var geocoder = new GClientGeocoder();
  
  geocoder.getLocations(
    $('#tune_address').val(),
    function(point) {
      if (!point) {
        alert($('#tune_address').val() +  ' ' + window.translations.address_not_found);
      } else {
        var location = {latitude: point.Placemark[0].Point.coordinates[1], longitude: point.Placemark[0].Point.coordinates[0]};
        
        var latLng = new GLatLng(location.latitude,location.longitude);
        
        event.data.map.setCenter(latLng, 13);
        event.data.marker.setLatLng(latLng);
        event.data.map.addOverlay(event.data.marker);
        
        var address = point.Placemark[0].AddressDetails;
        
        if(address.Country != undefined && address.Country.AdministrativeArea != undefined)
        {
          location.country_code=address.Country.CountryNameCode;
		  location.country = address.Country.CountryName;
          if(address.Country.AdministrativeArea.AdministrativeAreaName != undefined)
          {
            location.region_code = address.Country.AdministrativeArea.AdministrativeAreaName;
          }
          if(address.Country.AdministrativeArea.Locality != undefined)
          {
            if(address.Country.AdministrativeArea.Locality != undefined)
            {
              location.city = address.Country.AdministrativeArea.Locality.LocalityName;
            }
            
            if(address.Country.AdministrativeArea.Locality.PostalCode != undefined)
            {
              location.postal_code = address.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
            }
            
            if(address.Country.AdministrativeArea.Locality.Thoroughfare != undefined)
            {
              /*var streetAddress = address.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName.split(' ');
              location.house_number = streetAddress.shift();
              location.street = streetAddress.join(' ');*/
			  location.street = address.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
			  if(!isNaN(parseInt(address.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName)))
			  {
			    location.house_number = parseInt(address.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName);
			    location.street = location.street.replace(location.house_number,"");
			  }
            }
          }
          else if(address.Country.AdministrativeArea.SubAdministrativeArea != undefined && address.Country.AdministrativeArea.SubAdministrativeArea.Locality != undefined)
          {
            if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality != undefined)
            {
              location.city = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
            }
            if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName != undefined)
            {
              if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality != undefined)
              {
                if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode != undefined)
                {
                  location.postal_code = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.PostalCode.PostalCodeNumber;
                }
                if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare != undefined)
                {
                  /*var streetAddress = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName.split(' ');
                  location.house_number = streetAddress.shift();
                  location.street = streetAddress.join(' ');
				  
				                var streetAddress = address.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName.split(' ');
              location.house_number = streetAddress.shift();
              location.street = streetAddress.join(' ');*/
			  location.street = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName;
			  if(!isNaN(parseInt(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName)))
			  {
			  location.house_number = parseInt(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare.ThoroughfareName);
				location.street = location.street.replace(location.house_number,"");
				}
  			    }
              }
              else
              {
                if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode != undefined)
                {
                  location.postal_code = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
                }
                if(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare != undefined)
                {
                  /*var streetAddress = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName.split(' ');
                  location.house_number = streetAddress.shift();
                  location.street = streetAddress.join(' ');*/
				  
			  location.street = address.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
			  if(!isNaN(parseInt(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName)))
			  {
				location.house_number = parseInt(address.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName);
				location.street = location.street.replace(location.house_number,"");
			  }
				  
                }
              }
            }
          }
          else
          {
	          if(address.Country.AdministrativeArea.SubAdministrativeArea != undefined && address.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName != undefined)
	          {
	            location.city = address.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
	          }
	        }
        }
        
        var tune_location = {t_location: location};
				if (location && location.postal_code){
        	if( !location.latitude && !location.longitude ){return;}
					$('#tune_submit').removeAttr('disabled');
					$('#tune_submit').bind('click',{tune_location: tune_location},window.page.refreshLocation);
					return;
				}
        // Do loki.ReverseGeocode to get more detailed location
				window.loki.onReverseGeocoded = function(result) {
        	if( !result.latitude && !result.longitude ){return;}
    		  tune_location.t_location = result;
    		  $('#tune_submit').removeAttr('disabled');
    		  $('#tune_submit').bind('click',{tune_location: tune_location},window.page.refreshLocation);
				}
        
       	window.loki.reverseGeocode(location.latitude, location.longitude, window.loki.FULL_STREET_ADDRESS_LOOKUP);
      }
    }
  );
}

Page.prototype.refreshLocation = function(event)
{
  
  if(window.page.getCookie('location') != undefined)
  {
    window.previous_location = $.evalJSON(window.page.getCookie('location'));
  }
  else
  {
    window.previous_location = window.t_location;
  }
	window.t_location = {country_code: event.data.tune_location.t_location.country_code, house_number: event.data.tune_location.t_location.house_number, street: event.data.tune_location.t_location.street, city: event.data.tune_location.t_location.city, region_code: event.data.tune_location.t_location.region_code, postal_code: event.data.tune_location.t_location.postal_code, latitude: event.data.tune_location.t_location.latitude, longitude: event.data.tune_location.t_location.longitude, country: event.data.tune_location.t_location.country};//event.data.tune_location.t_location;//
  
  $('#tune_dialog').dialog('close');
  window.page.setCookie('location',$.toJSON(window.t_location));
	$('#warning_div').hide();
	$('#warning_div').text('');
  
  window.loki.tuneLocation(event.data.tune_location.t_location.latitude, event.data.tune_location.t_location.longitude);
  
  window.page.fireEvent(window.page.Events.LOCATION_CHANGED);
}

Page.prototype.reloadAllWidgets = function()
{
  $('[widget_id]').each(function(){
	$(this).remove();
  });
  window.page.rebuildWidgets();
  
  Tray.init();
  for(var i = 0; i < window.page.widgets.length; i++)
  {
    var widget = window.page.widgets[i];
    if(widget.position.column != 0 && widget.position.number !=0)
    {
      new Widget(widget.widget_id,widget.widget_name).getContent();
    }
  }
}

// WIDGET METHODS

var Widget = function(id, name)
{
  this.id = id;
  this.name = name;
}



Widget.move = function(event, ui)
{
  var widgetId = $(ui.item).attr('widget_id');
  for(var i = 0; i < window.page.widgets.length; i++)
  {
    var item = $('#widget_' + window.page.widgets[i].widget_name);
    var number = item.parent().children().index(item) + 1;
    var columnId = item.parent().attr('id');
    var column = parseInt(columnId.substr(columnId.lastIndexOf('_') + 1));
    window.page.widgets[i].position.column = column;
    window.page.widgets[i].position.number = number;
  }
  
  window.page.fireEvent(window.page.Events.WIDGETS_ORDER_CHANGED, widgetId);
}



Widget.onColumnChanged = function(event, ui) {
  var widgetId = $(ui.item).attr('widget_id');
  window.page.fireEvent(window.page.Events.WIDGETS_COLUMN_CHANGED, widgetId);
}


Widget.prototype.getContent = function()
{
  var name = this.name;
  $('#throbber_' + this.name).show();
  var params = {id: this.id, house_number: window.t_location.house_number, street: window.t_location.street, region_code: window.t_location.region_code, city: window.t_location.city, postal_code: window.t_location.postal_code, latitude: window.t_location.latitude, longitude: window.t_location.longitude, country_code: window.t_location.country_code, country: window.t_location.country }
  
  $.each(window.page.widgets,function(i,item)
  {
	  if(item.settings != undefined && item.widget_name == name)
	  {
	    $.each(item.settings,function(k,setting)
	    {
	      params[window.page.settings[setting.id].name] = setting.default_value;
	    });
	  }
  });
  $('#' + this.name).load('/getWidget',params,
      function(responseText, textStatus, XMLHttpRequest)
      {
        $('#throbber_' + name).hide();
        Page.fixColumnHeight();
      }
    );
}

// BOOTSTRAP

Tray = {
  container: null,
  wrapper: null,
  widgets: {},
  item_pattern: '<li><a class="tray_item" widget_id="{id}" title="{name}" href="javascript: void(0)"><img alt="{name}" src="{logo}"></a></li>',
  init: function() {
    Tray.loadWidgets(Tray.createHTML);
     $('body').bind('onresize', Tray.onWindowResize);
     window.onresize = Tray.onWindowResize;
  },
  
  installWidget: function() {
    window.page.addWidget.call($(this));
    $(this).slideDown('normal',function(){$(this).parents('li').remove();});
    
    delete Tray.widgets[$(this).attr('widget_id')];
    
    if(Tray.isEmpty())
    {
      $('#tray-wrapper').slideUp('normal');
	  $('#tray').hide;
    }
  },
  
  isEmpty: function()
  {
    var result = true;
    $.each(Tray.widgets,function(i,item)
    {
      if(item != undefined)
      {
        result = false;
      }
    });
    return result;
  },
  
  onWindowResize: function() {
    if (Tray.wrapper) {
      var width = Tray.getClientWidth();
      var height = Tray.getClientHeight();
      var top = height - parseInt(Tray.wrapper.css('height')) + 'px';
      var left = Math.ceil((width - parseInt(Tray.wrapper.css('width'))) / 2) + 'px';
      Tray.wrapper.css({
        top: top,
        left: left
      });
    }
  },
  
  loadWidgets: function(callback) {
    var widgets = [];
    
    for(var i = 0; i < window.page.all_widgets.length; i++)
    {
      if(!window.page.isWidgetInstalled(window.page.all_widgets[i].widget_id) && window.page.all_widgets[i].closable)
      {
        widgets.push(window.page.all_widgets[i]);
      }
    }
    callback.call(window, widgets);
  },
  
  createHTML: function(widgets) {
  	var tray = $('div#tray');
    if(!tray.length)
    {
      var tray = $('<div id="tray" class="tray"></div>');
  	//var trayWrapper = $('<div id="tray-wrapper"></div>');
      Tray.wrapper = tray;
      Tray.container = $('<ul id="tray_icon_container"></ul>');
      tray.append(Tray.container);
  	$('#tray-wrapper').append(tray);
    }
    var display = widgets.length ? 'block' : 'none';
    var width = Tray.getClientWidth();
    var height = Tray.getClientHeight();
    var top = height - parseInt(tray.css('height')) + 'px';
    var left = Math.ceil((width - parseInt(tray.css('width'))) / 2) + 'px';
    var position = $.browser.msie?'absolute':'fixed';

    tray.css({
      margin: 'auto',
      display: display
    });
    for (var i=0;i<widgets.length;i++) {
	  if($('[widget_id=' +widgets[i].widget_id+']').size() == 0){
      	Tray.addWidget(widgets[i]);
	  }
    }
  },
  calcTop: function(e) {
    var height = Tray.getClientHeight();
    var top = height - parseInt(e.clientHeight);
    e.style.top = top + document.documentElement.scrollTop + 'px';
  },

  
  addWidget: function(widget) {
    if(!$('#tray').length)
    {
      Tray.createHTML(new Object());
    }
	$('#tray-wrapper:hidden').slideDown('normal');
	$('#tray:hidden').show();
    
    var html = Tray.item_pattern.replace('{name}', widget.widget_header)
        .replace('{id}', widget.widget_id)
        .replace('{logo}', widget.logo);
    Tray.container.append(html);
    
    
    $('.tray_item').click(Tray.installWidget);
    
    
    Tray.widgets[widget.widget_id] = widget;
  },
  
  getClientWidth: function () {
    return parseInt(document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth);
  },

  getClientHeight: function () {
    if (!window.innerHeight) {
      if(!(document.documentElement.clientHeight == 0))
  		{
	  		return  document.documentElement.clientHeight;
		  }
  		else
	  	{
		    return document.body.clientHeight;
		  }
    }else{
      return window.innerHeight;
    }
    return parseInt(document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight);
  }
}

$(document).ready(function(){
  var Page = new window.Page();

  window.page = Page;
  var images = ['/images/logos/weatherbug.jpg', 
        '/images/logos/topix.jpg', 
        '/images/logos/yelp.jpg', 
        '/images/logos/flickr.jpg', 
        '/images/logos/twitter.jpg', 
        '/images/logos/zevents.jpg', 
        '/images/logos/yahoo.jpg',
        '/images/logos/partners/allmenus.gif', 
        '/images/logos/partners/brightkite.png', 
        '/images/logos/partners/citysquares.png', 
        '/images/logos/partners/dropio.png', 
        '/images/logos/partners/geocaching.gif', 
        '/images/logos/partners/irlconnect.png', 
        '/images/logos/partners/krillion.png', 
        '/images/logos/partners/loopt.png', 
        '/images/logos/partners/nearbynow.png', 
        '/images/logos/partners/outsidein.gif', 
        '/images/logos/partners/praized.gif', 
        '/images/logos/partners/radiusim.gif', 
        '/images/logos/partners/skout.png', 
        '/images/logos/partners/thefind.gif', 
        '/images/logos/partners/trapster.gif', 
        '/images/logos/partners/workstreamer.gif'];
  window.page.preloadImages(images);

  window.page.addEventListener(window.page.Events.LOCATION_CHANGED,window.page.reloadAllWidgets);
  window.page.addEventListener(window.page.Events.WIDGETS_CHANGED,window.page.saveWidgets);
  window.page.addEventListener(window.page.Events.WIDGETS_ORDER_CHANGED,window.page.saveWidgets);
  window.page.addEventListener(window.page.Events.WIDGET_RESIZED,window.page.normolyzeHeight);
  window.page.addEventListener(window.page.Events.WIDGET_EXPANDED,window.page.normolyzeHeight);
  window.page.addEventListener(window.page.Events.WIDGET_COLAPSED, window.page.normolyzeHeight);

  window.page.createHTML();
  window.page.getLocation();
});

Page.fixColumnHeight=function(){
  heights_sum1=0;
	heights_sum2=0;
	$('div#column_1 div.ui-widget').each(function(){heights_sum1+=15+$(this).height();});
	$('div#column_2 div.ui-widget').each(function(){heights_sum2+=15+$(this).height();});
	$('div#column_2').height(heights_sum2);
  $('div#column_2').css({'min-height':heights_sum2});
	$('div#column_1').height(heights_sum1);
  $('div#column_1').css({'min-height':heights_sum1});
}
$(window).ajaxStop(function(){
setTimeout(Page.fixColumnHeight, 1000);
});
