
/* dump anything */
/* as repr: use object.repr = function() { return sdump(this); }; */
dump = function (o, recursive, indent, name) {
    var recursedlist = [];
    var s = sdump(o, recursive, indent, name, recursedlist);
    if (typeof(console)!='undefined') console.log(s);
    else alert(s);
};

sdump = function (v, recursive, indent, name, recursedlist) {
    if (typeof(recursive)=='undefined') recursive = 4;
    if (typeof(indent)=='undefined') indent = '';
    if (typeof(name)=='undefined') name = '?';
    if (typeof(recursedlist)=='undefined') recursedlist = [];
    var s = '';
    if (_stn_arrayIndexOf(recursedlist, v)!==-1) {
        s+= indent + name + ' ; [recursion]\n';
        return s;
        }
    recursedlist.push(v);
    var type = typeof(v);
    var append = "\n"; // ' (' + type + ')' + "\n";
    if (type == 'object') {
        if (v == null) {
            s+= indent + name + ' ; null';
        } else if (recursive) {
            s+= indent + name + ' : ' + "\n";
            s+= _stn_sdump(v, recursive, indent+'.. ', recursedlist);
            append = '';
        } else {
            s+= indent + name + ' : [object]';
        }
    } else if (type == 'function') {
        s+= indent + name + '() {...}';
    } else if (type == 'boolean') {
        if (v) {
            s+= indent + name + ' ; true';
        } else {
            s+= indent + name + ' ; false';
        }
    } else if (type == 'string') {
        s+= indent + name + ' : \'' + v + '\'';
    } else {
        s+= indent + name + ' : ' + v;
    }
    s+= append;
    recursedlist.pop(v);
    return s;
}

_stn_sdump = function (o, recursive, indent, recursedlist) {
    var s = '';
    var iterated = false;
    for (var k in o) {
        iterated = true;
        if (k[0]!='_') { // hide 'protected/private' members
            var v = o[k];
            s+= sdump(v, recursive-1, indent, k, recursedlist);
        }
    };
    if (!iterated && o.length) { // e.g. on 'arguments', the for-in doesn't work
        var n = o.length;
        for (var i=0; i<n; ++i) {
            var v = o[i];
            s+= sdump(v, recursive-1, indent, i, recursedlist);
        };
    }
    return s;
}

_stn_arrayIndexOf = function (thisarray, searchElement, fromIndex) {
    if (!fromIndex) fromIndex = 0;
    for (var i = fromIndex; i<thisarray.length; ++i) {
        if (searchElement == thisarray[i]) {
            return i;
        }
    }
    return -1;
}

get_stylefolder = function() {
  if ( typeof get_stylefolder.stylefolder == 'undefined' ) {
    get_stylefolder.stylefolder = '/style/';
    var firststylesheet = $('link[rel=stylesheet]').eq(0);
    if (firststylesheet && firststylesheet.attr('href').split('/').length>=2) {
      get_stylefolder.stylefolder = '/'+firststylesheet.attr('href').split('/')[1]+'/';
    }
  }
  return get_stylefolder.stylefolder;
}

_stn_setActiveStyleSheet = function (title) {
  $('link').each(function() {
    if ($(this).attr('rel').indexOf('style') != -1 && $(this).attr('title')) {
      $(this).attr('disabled', true);
      if ($(this).attr('title') == title) {
        $(this).attr('disabled', false);
      }
    }
  });
}

print_preview = function () {
  _stn_setActiveStyleSheet('print-preview');
}

cancel_print_preview = function () {
  _stn_setActiveStyleSheet('default');
}

stn_equal_height = function (/*...*/) { // sorry, padding/margins not supported
  stn_equal_height_array(arguments);
}
stn_equal_height_array = function (elementarray) { // sorry, padding/margins not supported
  var max_height = 0;
  for(var i = 0; i < elementarray.length; i++ ) {
    max_height = Math.max(max_height, $(elementarray[i]).height());
  }
  for(i = 0; i < elementarray.length; i++ ) {
    $(elementarray[i]).height(max_height);
  }
}

jQuery.fn.supersleight = function(settings) {
  settings = jQuery.extend({
    imgs: true,
    backgrounds: true,
    shim: '/style/fix-ie6/xpix.gif',
    apply_positioning: true
  }, settings);
  
  return this.each(function(){
    if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7 && parseInt(jQuery.browser.version, 10) > 4) {
      jQuery(this).find('*').andSelf().each(function(i,obj) {
        var self = jQuery(obj);
        // background pngs
        if (settings.backgrounds && self.css('background-image').match(/\.png/i) !== null) {
          var bg = self.css('background-image');
          var src = bg.substring(5,bg.length-2);
          var mode = (self.css('background-repeat') == 'no-repeat' ? 'crop' : 'scale');
          var styles = {
            'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')",
            'background-image': 'url('+settings.shim+')'
          };
          self.css(styles);
        };
        // image elements
        if (settings.imgs && self.is('img[src$=png]')){
          var styles = {
            'width': self.width() + 'px',
            'height': self.height() + 'px',
            'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + self.attr('src') + "', sizingMethod='scale')"
          };
          self.css(styles).attr('src', settings.shim);
        };
        // apply position to 'active' elements
        if (settings.apply_positioning && self.is('a, input') && (self.css('position') === '' || self.css('position') == 'static')){
          self.css('position', 'relative');
        };
      });
    };
  });
};

(function( $ ){
  $.fn.stentor_gallery = function(options) {

    var settings = {
      'speed'    : 1500,
      'interval' : 10000, // > speed
      'easing'   : 'swing', // swing or linear
      'animate'  : {'opacity': 0},
      'reset'    : {'opacity': 1}
      };

    return $(this).each(function() {

      if ( options ) {
        $.extend( settings, options );
      }

      var gallery = this;
      var ul = $('ul', this);

      if ($('> li', ul).length<=1) return;

      $(ul).height($(ul).height()+1);//+1 for ie fix
      $(ul).width($(ul).width());
      $('li.placeholder', ul).addClass('current').removeClass('placeholder');
      var dots = $('p.dots', gallery);
      var has_dots = dots.length > 0;

      function select_current_dot() {
        if (has_dots) {
          var currentli_index = 0;
          $('li', ul).each(function(index) {
              if ($(this).hasClass('current')) {
                  currentli_index = index;
              }
          });
          $('a', dots).removeClass('current').eq(currentli_index).addClass('current', 'fast');
        }
      }
      select_current_dot();

      var animation = null;
      var firstli = $('li:first-child', ul);
      var currentli = null;
      var nextli = null;

      function animate(speed) {
        $('a', dots).removeClass('current', speed);
        currentli.animate(settings.animate, speed, settings.easing, function() {
          currentli.removeClass('current');
          nextli.addClass('current');
          currentli.css(settings.reset);
          currentli = nextli;
          nextli = nextli.next();
          if (!nextli.length) nextli = firstli;
          currentli.removeClass('next');
          nextli.addClass('next');
          select_current_dot();
        });
      }

      currentli = $('li.current', ul);
      if (!currentli.length) {
          currentli = $('li:first-child', ul).addClass('current');
      }
      nextli = $('li.current', ul).next();
      if (!nextli.length) nextli = firstli;
      nextli.addClass('next');
      animation = window.setInterval(function() { animate(settings.speed); }, settings.interval);

      $('> li', ul).hover(function() { currentli.stop(true, true);
                                     if (animation) {
                                         window.clearInterval(animation);
                                         animation = null;
                                     }}, 
                        function() { animation = window.setInterval(function() { animate(settings.speed); }, settings.interval); });

      $('a', dots).click(function() {
          if ($(this).hasClass('selected')) {
            animation = window.setInterval(function() { animate(settings.speed); }, settings.interval);
            $(this).removeClass('selected');
            return false;
          }
          currentli.stop(true, true);
          if (animation) {
              window.clearInterval(animation);
              animation = null;
          }
          if (!$(this).hasClass('current')) {
            var clickindex = parseInt($(this).attr('href').replace(/#/, ''), 10)-1;
            nextli = $('li', ul).removeClass('next').eq(clickindex).addClass('next');
            animate('fast');
          }
          $('a', dots).removeClass('selected')
          $(this).addClass('selected');
          return false;
      });

    });
  };

  $.fn.stentor_fadegallery = function(options) {
    var settings = {'easing' : 'linear'};
    return $(this).each(function() {
      if ( options ) {
        $.extend( settings, options );
      }
      settings.animate = {'opacity': 0};
      settings.reset = {'opacity': 1};
      return $(this).stentor_gallery(settings);
    });
  };

  $.fn.stentor_slidegallery = function(options) {
    var settings = {};
    return $(this).each(function() {
      if ( options ) {
        $.extend( settings, options );
      }
      var w = $('ul', this).width();
      settings.animate = {'left': -w};
      settings.reset = {'left': 0};
      return $(this).stentor_gallery(settings);
    });
  };
})( jQuery );


/*
  Example config & initialization
  Note: maps js is only loaded on pages that contain one or more elements with 
        an id of a mapconfig. Only those elements are initializes.

  var mapsconfig = [{id: 'map_dealers'
                    ,directions_label: 'directions'
                    ,latlng: {lat:51.958709, lng:4.578517}
                    ,zoom: 14
                    ,icon: '/admin/style/stentor-maps-marker.png'
                    ,maptype: 'terrain'
                    ,with_infocontrol: false
                    ,markers: [{title:"Guidance Rotterdam BV"
                               ,latlng: {lat:51.959515, lng:4.584567}
                               ,info: '<h2>Guidance BV</h2>'+
                                      '<p>Burgemeester Schalijlaan 70<br>'+
                                      '   2908 LS Capelle a/d IJssel<br>'+
                                      '   </p>'
                               //,icon: '/admin/style/stentor-maps-marker.png'
                               }
                              ,{title:"Guidance Delft"
                               ,latlng: {lat:52.009752, lng:4.359982}
                               ,info: '<h2>Guidance Delft</h2>'+
                                      '<p>Molstraat 19<br>'+
                                      '   2611 EM Delft<br>'+
                                      '   </p>'
                               //,icon: '/admin/style/stentor-maps-marker.png'
                               }
                              ]
                    }
                   ,{id: 'map_canvas'
                    ,directions_label: 'directions'
                    ,latlng: {lat:51.958709, lng:4.578517}
                    ,zoom: 6 // 6 = netherlands fits in 320px height, 14 = city block
                    ,icon: '/admin/style/stentor-maps-marker.png'
                    ,maptype: 'terrain'
                    ,with_infocontrol: false
                    ,markers: [{title:"Guidance Rotterdam BV"
                               ,latlng: {lat:51.959515, lng:4.584567}
                               ,info: '<h2>Guidance BV</h2>'+
                                      '<p>Burgemeester Schalijlaan 70<br>'+
                                      '   2908 LS Capelle a/d IJssel<br>'+
                                      '   </p>'
                               //,icon: '/admin/style/stentor-maps-marker.png'
                               }
                              ,{title:"Guidance Delft"
                               ,latlng: {lat:52.009752, lng:4.359982}
                               ,info: '<h2>Guidance Delft</h2>'+
                                      '<p>Molstraat 19<br>'+
                                      '   2611 EM Delft<br>'+
                                      '   </p>'
                               //,icon: '/admin/style/stentor-maps-marker.png'
                               }
                              ]
                    }
                   ];
  stn_initialize_google_maps(mapsconfig);

*/
function stn_initialize_google_maps(mapsconfig) {

  var page_contains_maps = false;
  for (var mapconfigindex in mapsconfig) {
    var mapconfig = mapsconfig[mapconfigindex];
    $('#'+mapconfig.id).each(function() {
      page_contains_maps = true;
    });
  }
  if (page_contains_maps) {
    var language = $('html').attr('lang');

    function initialize_google_maps() {

      for (var mapconfigindex in mapsconfig) {
        var mapconfig = mapsconfig[mapconfigindex];
        $('#'+mapconfig.id).each(function() {

            var maptype = google.maps.MapTypeId.HYBRID;
            if (mapconfig.maptype) {
              if (mapconfig.maptype=='hybrid') maptype = google.maps.MapTypeId.HYBRID;
              if (mapconfig.maptype=='roadmap') maptype = google.maps.MapTypeId.ROADMAP;
              if (mapconfig.maptype=='satellite') maptype = google.maps.MapTypeId.SATELLITE;
              if (mapconfig.maptype=='terrain') maptype = google.maps.MapTypeId.TERRAIN;
            }

            var map_options = {
              zoom: mapconfig.zoom,
              center: new google.maps.LatLng(mapconfig.latlng.lat,mapconfig.latlng.lng),
              mapTypeControlOptions: {
                style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
              },
              mapTypeId: maptype
            }
            var map = new google.maps.Map(document.getElementById(mapconfig.id), map_options);
            var openinfowindow = null;

            for (var markerindex in mapconfig.markers) {
              var marker = mapconfig.markers[markerindex];
              var scope = function() {
                  var mapicon = get_stylefolder()+'google-maps-marker-stentor.png';
                  if (mapconfig.icon) mapicon = mapconfig.icon;
                  if (marker.icon) mapicon = marker.icon;

                  var mapmarker = new google.maps.Marker({
                        position: new google.maps.LatLng(marker.latlng.lat,marker.latlng.lng),
                        title: marker.title,
                        icon: mapicon,
                        map: map
                    });

                  var directionslabel = 'directions';
                  if (mapconfig.directions_label) directionslabel = mapconfig.directions_label;
                  var directionsurl = 'http://maps.google.com/maps?hl='+language
                                      +'&ie=UTF8'
                                      +'&ll='+mapconfig.latlng.lat+','+mapconfig.latlng.lng
                                      +'&z='+mapconfig.zoom
                                      +'&daddr='+encodeURI(marker.title+' @'+marker.latlng.lat+','+marker.latlng.lng)

                  var infowindow = new google.maps.InfoWindow({
                    content: '<div>'+marker.info+'</div>'
                  });

                  google.maps.event.addListener(mapmarker, 'click', function() {
                    if (openinfowindow) openinfowindow.close();
                    infowindow.open(map,mapmarker);
                    openinfowindow = infowindow;
                  });
              }
              scope();
            }

            if (mapconfig.with_infocontrol) {
              var lastll = null;
              function infocontrol_contents(ll)
              {
                var clickll = '';
                if (ll) lastll = ll;
                if (lastll) clickll = 'click: '+lastll.lat()+', '+lastll.lng()+'<br>';
                return 'center: '+map.getCenter().lat()+', '+map.getCenter().lng()+'<br>'+
                       'zoom: '+map.getZoom()+'<br>'+
                       clickll;
              }
              var infocontrol = document.createElement('DIV');
              $(infocontrol).css({background: 'white', color: 'black', border: '1px solid black', padding: '0 4px', margin: '5px', opacity: '0.7'})
                            .html(infocontrol_contents());
              map.controls[google.maps.ControlPosition.TOP_LEFT].push(infocontrol);

              google.maps.event.addListener(map, 'click', function(e) {
                $(infocontrol).html(infocontrol_contents(e.latLng));
              });
              google.maps.event.addListener(map, 'zoom_changed', function() {
                $(infocontrol).html(infocontrol_contents());
              });
              google.maps.event.addListener(map, 'center_changed', function() {
                $(infocontrol).html(infocontrol_contents());
              });

            }

        });
      }
    }
    window.initialize_google_maps = initialize_google_maps;
    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = "http://maps.google.com/maps/api/js?sensor=false&language="+language+"&callback=initialize_google_maps";
    document.body.appendChild(script);
  }

}

