mirror of
https://github.com/pinry/pinry.git
synced 2025-11-17 10:20:39 +01:00
Removing unused vendor libs, custom tiling works, new design started
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
from tastypie.resources import ModelResource
|
from tastypie.resources import ModelResource
|
||||||
from tastypie import fields
|
from tastypie import fields
|
||||||
|
from tastypie.authorization import DjangoAuthorization
|
||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
@@ -15,7 +16,7 @@ class UserResource(ModelResource):
|
|||||||
include_resource_uri = False
|
include_resource_uri = False
|
||||||
|
|
||||||
|
|
||||||
class PinResource(ModelResource): # pylint: disable-msg=R0904
|
class PinResource(ModelResource):
|
||||||
tags = fields.ListField()
|
tags = fields.ListField()
|
||||||
submitter = fields.ForeignKey(UserResource, 'submitter', full=True)
|
submitter = fields.ForeignKey(UserResource, 'submitter', full=True)
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ class PinResource(ModelResource): # pylint: disable-msg=R0904
|
|||||||
'published': ['gt'],
|
'published': ['gt'],
|
||||||
'submitter': ['exact']
|
'submitter': ['exact']
|
||||||
}
|
}
|
||||||
|
authorization = DjangoAuthorization()
|
||||||
|
|
||||||
def build_filters(self, filters=None):
|
def build_filters(self, filters=None):
|
||||||
if filters is None:
|
if filters is None:
|
||||||
|
|||||||
@@ -1,33 +1,40 @@
|
|||||||
body {
|
body {
|
||||||
margin-top: 70px;
|
margin-top: 70px;
|
||||||
background: url("/static/core/img/background.png");
|
background: #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar-inner {
|
.navbar-inner {
|
||||||
background-image: none;
|
background-image: none;
|
||||||
background: white;
|
background: #222;
|
||||||
filter: none;
|
filter: none;
|
||||||
border-bottom: 1px solid #999;
|
|
||||||
height: 48px;
|
height: 48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar .brand {
|
.navbar .brand {
|
||||||
margin-left: 0;
|
margin-left: 0;
|
||||||
color: #333;
|
color: #fff;
|
||||||
font-family: 'Monoton';
|
font-family: 'Monoton';
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar .nav > li > a {
|
.navbar .nav > li > a {
|
||||||
color: #333;
|
color: #333;
|
||||||
|
background: #ddd;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
border-left: 1px solid #ccc;
|
padding: 3px 13px;
|
||||||
padding: 14px 20px 15px;
|
margin: 12px 7px;
|
||||||
|
border-radius: 2px;
|
||||||
|
-moz-border-radius: 2px;
|
||||||
|
-webkit-border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar .nav > li:last-child > a {
|
||||||
|
margin-right: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.navbar .nav > li > a:hover {
|
.navbar .nav > li > a:hover {
|
||||||
color: #333;
|
color: #ddd;
|
||||||
text-decoration: underline;
|
background: #275173;
|
||||||
}
|
}
|
||||||
|
|
||||||
.messages {
|
.messages {
|
||||||
@@ -75,7 +82,7 @@ body {
|
|||||||
.pin {
|
.pin {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
border: 1px solid #ccc;
|
box-shadow: 0 1px 3px #bbb;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,82 +1,102 @@
|
|||||||
$(window).load(function() {
|
$(window).load(function() {
|
||||||
function tileLayout() {
|
|
||||||
// Config
|
|
||||||
var blockMargin = 20;
|
|
||||||
var blockWidth = 240;
|
|
||||||
// End Config
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tileLayout will simply tile/retile the block/pin container when run. This
|
||||||
|
* was put into a function in order to adjust frequently on screen size
|
||||||
|
* changes.
|
||||||
|
*/
|
||||||
|
function tileLayout() {
|
||||||
|
// Defines our containers
|
||||||
var blockContainer = $('#pins');
|
var blockContainer = $('#pins');
|
||||||
var blocks = blockContainer.children('.pin');
|
var blocks = blockContainer.children('.pin');
|
||||||
var rowSize = Math.floor(blockContainer.width()/blockWidth);
|
|
||||||
var blockWidth = (blockContainer.width()-blockMargin*(rowSize))/rowSize;
|
|
||||||
var colHeights = []
|
|
||||||
|
|
||||||
|
// Size of blocks/pins and the spacing between them
|
||||||
|
var blockMargin = 20;
|
||||||
|
var blockWidth = 240;
|
||||||
|
|
||||||
|
// How many items we can fit in a row and our array for the row heights
|
||||||
|
var rowSize = Math.floor(blockContainer.width()/(blockWidth+blockMargin));
|
||||||
|
var colHeights = [];
|
||||||
|
|
||||||
|
// These are used for horizontal positioning
|
||||||
|
var rowMargins = [];
|
||||||
|
var marginLeft = 0;
|
||||||
|
|
||||||
|
// Fill our colHeights array with 0 for each row we have
|
||||||
|
for (var i=0; i < rowSize; i++) colHeights[i] = 0;
|
||||||
|
|
||||||
|
// Fill out our rowMargins which will be static after this
|
||||||
for (var i=0; i < rowSize; i++) {
|
for (var i=0; i < rowSize; i++) {
|
||||||
colHeights[i] = 0;
|
// Our first item has a special margin to keep things centered
|
||||||
|
if (i == 0) rowMargins[0] = (blockContainer.width()-rowSize*(blockWidth+blockMargin))/2;
|
||||||
|
else rowMargins[i] = rowMargins[i-1]+(blockWidth+blockMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Loop through every block
|
||||||
for (var b=0; b < blocks.length; b++) {
|
for (var b=0; b < blocks.length; b++) {
|
||||||
|
// Get the jQuery object of the current block
|
||||||
block = blocks.eq(b);
|
block = blocks.eq(b);
|
||||||
|
|
||||||
var col = -1;
|
// Position our new pin in the shortest column
|
||||||
var colHeight = 0;
|
var sCol = 0;
|
||||||
for (var i=0; i < rowSize; i++) {
|
for (var i=0; i < rowSize; i++) {
|
||||||
if (col < 0) {
|
if (colHeights[sCol] > colHeights[i]) sCol = i;
|
||||||
col = 0;
|
|
||||||
colHeight = colHeights[col];
|
|
||||||
} else {
|
|
||||||
if (colHeight > colHeights[i]) {
|
|
||||||
col = i;
|
|
||||||
colHeight = colHeights[col];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
block.css({
|
block.css({
|
||||||
'margin-left': blockWidth*col+col*blockMargin
|
'margin-left': rowMargins[sCol],
|
||||||
|
'margin-top': colHeights[sCol],
|
||||||
|
'display': 'block'
|
||||||
});
|
});
|
||||||
|
|
||||||
blockMarginTop = blockMargin;
|
colHeights[sCol] += block.height()+(blockMargin*3);
|
||||||
block.css({
|
|
||||||
'margin-top': colHeight+blockMarginTop
|
|
||||||
});
|
|
||||||
colHeights[col] += block.height()+blockMarginTop;
|
|
||||||
|
|
||||||
block.css('display', 'block');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.spinner').css('display', 'none');
|
$('.spinner').css('display', 'none');
|
||||||
blockContainer.css('height', colHeights.sort().slice(-1)[0]);
|
blockContainer.css('height', colHeights.sort().slice(-1)[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var offset = 0;
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load our pins using the pins template into our UI, be sure to define a
|
||||||
|
* offset outside the function to keep a running tally of your location.
|
||||||
|
*/
|
||||||
function loadPins() {
|
function loadPins() {
|
||||||
|
// Show our loading symbol
|
||||||
$('.spinner').css('display', 'block');
|
$('.spinner').css('display', 'block');
|
||||||
|
|
||||||
|
// Fetch our pins from the api using our current offset
|
||||||
$.get('/api/v1/pin/?format=json&offset='+String(offset), function(pins) {
|
$.get('/api/v1/pin/?format=json&offset='+String(offset), function(pins) {
|
||||||
console.log(pins.objects[0])
|
// Use the fetched pins as our context for our pins template
|
||||||
var source = $('#pins-template').html();
|
var template = Handlebars.compile($('#pins-template').html());
|
||||||
var template = Handlebars.compile(source);
|
var html = template({pins: pins.objects});
|
||||||
var context = {
|
|
||||||
pins: pins.objects
|
// Append the newly compiled data to our container
|
||||||
}
|
|
||||||
var html = template(context);
|
|
||||||
$('#pins').append(html);
|
$('#pins').append(html);
|
||||||
|
|
||||||
|
// We need to then wait for images to load in and then tile
|
||||||
$('#pins').ajaxStop(function() {
|
$('#pins').ajaxStop(function() {
|
||||||
|
$('img').load(function() {
|
||||||
tileLayout();
|
tileLayout();
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Up our offset, it's currently defined as 30 in our settings
|
||||||
offset += 30;
|
offset += 30;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set offset for loadPins and do our initial load
|
||||||
|
var offset = 0;
|
||||||
loadPins();
|
loadPins();
|
||||||
|
|
||||||
|
// If our window gets resized keep the tiles looking clean and in our window
|
||||||
$(window).resize(function() {
|
$(window).resize(function() {
|
||||||
tileLayout();
|
tileLayout();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// If we scroll to the bottom of the document load more pins
|
||||||
$(window).scroll(function() {
|
$(window).scroll(function() {
|
||||||
if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
|
if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
|
||||||
loadPins();
|
loadPins();
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
|
{% spaceless %}
|
||||||
{% load new_pin %}
|
{% load new_pin %}
|
||||||
{% load compress %}
|
{% load compress %}
|
||||||
{% load verbatim %}
|
|
||||||
|
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{{ site_name }} - {% block title %}{% endblock %}</title>
|
<title>{{ site_name }} - {% block title %}{% endblock %}</title>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Monoton">
|
||||||
{% compress css %}
|
{% compress css %}
|
||||||
<link rel="stylesheet" href="/static/vendor/bootstrap/2.0.3/css/bootstrap.css">
|
<link rel="stylesheet" href="/static/vendor/bootstrap/2.0.3/css/bootstrap.css">
|
||||||
<link rel="stylesheet" href="/static/vendor/fancybox/2.0.6/jquery.fancybox.css">
|
<link rel="stylesheet" href="/static/vendor/fancybox/2.0.6/jquery.fancybox.css">
|
||||||
@@ -14,7 +15,6 @@
|
|||||||
<link rel="stylesheet" href="/static/core/css/pinry.css">
|
<link rel="stylesheet" href="/static/core/css/pinry.css">
|
||||||
{% endcompress %}
|
{% endcompress %}
|
||||||
|
|
||||||
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Monoton">
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="navbar navbar-fixed-top">
|
<div class="navbar navbar-fixed-top">
|
||||||
@@ -47,38 +47,23 @@
|
|||||||
|
|
||||||
{% new_pin request %}
|
{% new_pin request %}
|
||||||
|
|
||||||
{% verbatim %}
|
{% block templates %}{% endblock %}
|
||||||
<script id="pins-template" type="text/x-handlebars-template">
|
|
||||||
{{#each pins}}
|
|
||||||
<div class="pin">
|
|
||||||
<img src="{{thumbnail}}">
|
|
||||||
{{#if description}}
|
|
||||||
<p>{{description}}</p>
|
|
||||||
{{/if}}
|
|
||||||
{{#if tags}}
|
|
||||||
<p>
|
|
||||||
{{#each tags}}
|
|
||||||
<span class="label">{{this}}</span>
|
|
||||||
{{/each}}
|
|
||||||
</p>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{/each}}
|
|
||||||
</script>
|
|
||||||
{% endverbatim %}
|
|
||||||
|
|
||||||
{% compress js %}
|
|
||||||
<script src="/static/vendor/jquery/1.7.2/jquery.js"></script>
|
|
||||||
<script src="/static/vendor/bootstrap/2.0.3/js/bootstrap.js"></script>
|
|
||||||
<script src="/static/vendor/handlebars/handlebars.js"></script>
|
|
||||||
|
|
||||||
|
{% compress js inline %}
|
||||||
<script>
|
<script>
|
||||||
var username = "{{ user.username }}";
|
var username = "{{ user.username }}";
|
||||||
var isSuperuser = {{ user.is_superuser|lower }};
|
var isSuperuser = {{ user.is_superuser|lower }};
|
||||||
</script>
|
</script>
|
||||||
|
{% endcompress %}
|
||||||
|
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
|
||||||
|
{% compress js %}
|
||||||
|
<script src="/static/vendor/bootstrap/2.0.3/js/bootstrap.js"></script>
|
||||||
|
<script src="/static/vendor/handlebars/1.0.0/handlebars.js"></script>
|
||||||
|
|
||||||
<script src="/static/core/js/pinry.js"></script>
|
<script src="/static/core/js/pinry.js"></script>
|
||||||
<script src="/static/core/js/messages.js"></script>
|
<script src="/static/core/js/messages.js"></script>
|
||||||
{% endcompress %}
|
{% endcompress %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
{% endspaceless %}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{% extends 'core/base.html' %}
|
{% extends 'core/base.html' %}
|
||||||
|
{% load verbatim %}
|
||||||
|
|
||||||
{% block title %}Recent Pins{% endblock %}
|
{% block title %}Recent Pins{% endblock %}
|
||||||
|
|
||||||
@@ -6,9 +7,34 @@
|
|||||||
<div id="pins"></div>
|
<div id="pins"></div>
|
||||||
<div class="container spinner">
|
<div class="container spinner">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="span2 offset5">
|
<div class="span12" align="center">
|
||||||
<img src="/static/core/img/loader.gif" alt="Loader">
|
<img src="/static/core/img/loader.gif" alt="Loader">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block templates %}
|
||||||
|
{% verbatim %}
|
||||||
|
<script id="pins-template" type="text/x-handlebars-template">
|
||||||
|
{{#each pins}}
|
||||||
|
<div class="pin">
|
||||||
|
{{#if editable}}
|
||||||
|
<i class="icon-white icon-pencil"></i>
|
||||||
|
{{/if}}
|
||||||
|
<img src="{{thumbnail}}" />
|
||||||
|
{{#if description}}
|
||||||
|
<p>{{description}}</p>
|
||||||
|
{{/if}}
|
||||||
|
{{#if tags}}
|
||||||
|
<p>
|
||||||
|
{{#each tags}}
|
||||||
|
<span class="label">{{this}}</span>
|
||||||
|
{{/each}}
|
||||||
|
</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
|
</script>
|
||||||
|
{% endverbatim %}
|
||||||
|
{% endblock %}
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
/*!
|
|
||||||
* jQuery imagesLoaded plugin v2.0.1
|
|
||||||
* http://github.com/desandro/imagesloaded
|
|
||||||
*
|
|
||||||
* MIT License. by Paul Irish et al.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*jshint curly: true, eqeqeq: true, noempty: true, strict: true, undef: true, browser: true */
|
|
||||||
/*global jQuery: false */
|
|
||||||
|
|
||||||
;(function($, undefined) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
// blank image data-uri bypasses webkit log warning (thx doug jones)
|
|
||||||
var BLANK = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==';
|
|
||||||
|
|
||||||
$.fn.imagesLoaded = function( callback ) {
|
|
||||||
var $this = this,
|
|
||||||
deferred = $.isFunction($.Deferred) ? $.Deferred() : 0,
|
|
||||||
hasNotify = $.isFunction(deferred.notify),
|
|
||||||
$images = $this.find('img').add( $this.filter('img') ),
|
|
||||||
loaded = [],
|
|
||||||
proper = [],
|
|
||||||
broken = [];
|
|
||||||
|
|
||||||
function doneLoading() {
|
|
||||||
var $proper = $(proper),
|
|
||||||
$broken = $(broken);
|
|
||||||
|
|
||||||
if ( deferred ) {
|
|
||||||
if ( broken.length ) {
|
|
||||||
deferred.reject( $images, $proper, $broken );
|
|
||||||
} else {
|
|
||||||
deferred.resolve( $images );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $.isFunction( callback ) ) {
|
|
||||||
callback.call( $this, $images, $proper, $broken );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function imgLoaded( img, isBroken ) {
|
|
||||||
// don't proceed if BLANK image, or image is already loaded
|
|
||||||
if ( img.src === BLANK || $.inArray( img, loaded ) !== -1 ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// store element in loaded images array
|
|
||||||
loaded.push( img );
|
|
||||||
|
|
||||||
// keep track of broken and properly loaded images
|
|
||||||
if ( isBroken ) {
|
|
||||||
broken.push( img );
|
|
||||||
} else {
|
|
||||||
proper.push( img );
|
|
||||||
}
|
|
||||||
|
|
||||||
// cache image and its state for future calls
|
|
||||||
$.data( img, 'imagesLoaded', { isBroken: isBroken, src: img.src } );
|
|
||||||
|
|
||||||
// trigger deferred progress method if present
|
|
||||||
if ( hasNotify ) {
|
|
||||||
deferred.notifyWith( $(img), [ isBroken, $images, $(proper), $(broken) ] );
|
|
||||||
}
|
|
||||||
|
|
||||||
// call doneLoading and clean listeners if all images are loaded
|
|
||||||
if ( $images.length === loaded.length ){
|
|
||||||
setTimeout( doneLoading );
|
|
||||||
$images.unbind( '.imagesLoaded' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no images, trigger immediately
|
|
||||||
if ( !$images.length ) {
|
|
||||||
doneLoading();
|
|
||||||
} else {
|
|
||||||
$images.bind( 'load.imagesLoaded error.imagesLoaded', function( event ){
|
|
||||||
// trigger imgLoaded
|
|
||||||
imgLoaded( event.target, event.type === 'error' );
|
|
||||||
}).each( function( i, el ) {
|
|
||||||
var src = el.src;
|
|
||||||
|
|
||||||
// find out if this image has been already checked for status
|
|
||||||
// if it was, and src has not changed, call imgLoaded on it
|
|
||||||
var cached = $.data( el, 'imagesLoaded' );
|
|
||||||
if ( cached && cached.src === src ) {
|
|
||||||
imgLoaded( el, cached.isBroken );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if complete is true and browser supports natural sizes, try
|
|
||||||
// to check for image status manually
|
|
||||||
if ( el.complete && el.naturalWidth !== undefined ) {
|
|
||||||
imgLoaded( el, el.naturalWidth === 0 || el.naturalHeight === 0 );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cached images don't fire load sometimes, so we reset src, but only when
|
|
||||||
// dealing with IE, or image is complete (loaded) and failed manual check
|
|
||||||
// webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
|
|
||||||
if ( el.readyState || el.complete ) {
|
|
||||||
el.src = BLANK;
|
|
||||||
el.src = src;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return deferred ? deferred.promise( $this ) : $this;
|
|
||||||
};
|
|
||||||
|
|
||||||
})(jQuery);
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
(function(c,n){var k="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";c.fn.imagesLoaded=function(l){function m(){var b=c(h),a=c(g);d&&(g.length?d.reject(e,b,a):d.resolve(e));c.isFunction(l)&&l.call(f,e,b,a)}function i(b,a){b.src===k||-1!==c.inArray(b,j)||(j.push(b),a?g.push(b):h.push(b),c.data(b,"imagesLoaded",{isBroken:a,src:b.src}),o&&d.notifyWith(c(b),[a,e,c(h),c(g)]),e.length===j.length&&(setTimeout(m),e.unbind(".imagesLoaded")))}var f=this,d=c.isFunction(c.Deferred)?c.Deferred():
|
|
||||||
0,o=c.isFunction(d.notify),e=f.find("img").add(f.filter("img")),j=[],h=[],g=[];e.length?e.bind("load.imagesLoaded error.imagesLoaded",function(b){i(b.target,"error"===b.type)}).each(function(b,a){var e=a.src,d=c.data(a,"imagesLoaded");if(d&&d.src===e)i(a,d.isBroken);else if(a.complete&&a.naturalWidth!==n)i(a,0===a.naturalWidth||0===a.naturalHeight);else if(a.readyState||a.complete)a.src=k,a.src=e}):m();return d?d.promise(f):f}})(jQuery);
|
|
||||||
9404
pinry/vendor/static/vendor/jquery/1.7.2/jquery.js
vendored
9404
pinry/vendor/static/vendor/jquery/1.7.2/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -1,78 +0,0 @@
|
|||||||
/******************************************
|
|
||||||
* Websanova.com
|
|
||||||
*
|
|
||||||
* Resources for web entrepreneurs
|
|
||||||
*
|
|
||||||
* @author Websanova
|
|
||||||
* @copyright Copyright (c) 2012 Websanova.
|
|
||||||
* @license This websanova JavaScript url is dual licensed under the MIT and GPL licenses.
|
|
||||||
* @link http://www.websanova.com
|
|
||||||
* @github http://github.com/websanova/js-url
|
|
||||||
* @version 1.7.2
|
|
||||||
*
|
|
||||||
******************************************/
|
|
||||||
|
|
||||||
window.url = (function() {
|
|
||||||
function isNumeric(arg) {
|
|
||||||
return !isNaN(parseFloat(arg)) && isFinite(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return function url(arg, url) {
|
|
||||||
var _ls = url || window.location.toString();
|
|
||||||
|
|
||||||
if(_ls.substring(0,2) === '//') _ls = 'http:' + _ls;
|
|
||||||
else if(_ls.split('://').length === 1) _ls = 'http://' + _ls;
|
|
||||||
|
|
||||||
url = _ls.split('/');
|
|
||||||
var _l = {auth:''}, host = url[2].split('@');
|
|
||||||
|
|
||||||
if(host.length === 1) host = host[0].split(':');
|
|
||||||
else{ _l.auth = host[0]; host = host[1].split(':'); }
|
|
||||||
|
|
||||||
_l.protocol=url[0], _l.hostname=host[0], _l.port=(host[1]||'80'), _l.pathname='/' + url.slice(3, url.length).join('/').split('?')[0].split('#')[0];
|
|
||||||
var _p = _l.pathname;
|
|
||||||
if(_p.split('.').length === 1 && _p[_p.length-1] !== '/') _p += '/';
|
|
||||||
var _h = _l.hostname, _hs = _h.split('.'), _ps = _p.split('/');
|
|
||||||
|
|
||||||
if(!arg) return _ls;
|
|
||||||
else if(arg === 'hostname') return _h;
|
|
||||||
else if(arg === 'domain') return _hs.slice(-2).join('.');
|
|
||||||
else if(arg === 'tld') return _hs.slice(-1).join('.');
|
|
||||||
else if(arg === 'sub') return _hs.slice(0, _hs.length - 2).join('.');
|
|
||||||
else if(arg === 'port') return _l.port || '80';
|
|
||||||
else if(arg === 'protocol') return _l.protocol.split(':')[0];
|
|
||||||
else if(arg === 'auth') return _l.auth;
|
|
||||||
else if(arg === 'user') return _l.auth.split(':')[0];
|
|
||||||
else if(arg === 'pass') return _l.auth.split(':')[1] || '';
|
|
||||||
else if(arg === 'path') return _p;
|
|
||||||
else if(arg[0] === '.')
|
|
||||||
{
|
|
||||||
arg = arg.substring(1);
|
|
||||||
if(isNumeric(arg)) {arg = parseInt(arg); return _hs[arg < 0 ? _hs.length + arg : arg-1] || ''; }
|
|
||||||
}
|
|
||||||
else if(isNumeric(arg)){ arg = parseInt(arg); return _ps[arg < 0 ? _ps.length - 1 + arg : arg] || ''; }
|
|
||||||
else if(arg === 'file') return _ps.slice(-1)[0];
|
|
||||||
else if(arg === 'filename') return _ps.slice(-1)[0].split('.')[0];
|
|
||||||
else if(arg === 'fileext') return _ps.slice(-1)[0].split('.')[1] || '';
|
|
||||||
else if(arg[0] === '?' || arg[0] === '#')
|
|
||||||
{
|
|
||||||
var params = _ls, param = null;
|
|
||||||
|
|
||||||
if(arg[0] === '?') params = (params.split('?')[1] || '').split('#')[0];
|
|
||||||
else if(arg[0] === '#') params = (params.split('#')[1] || '');
|
|
||||||
|
|
||||||
if(!arg[1]) return params;
|
|
||||||
|
|
||||||
arg = arg.substring(1);
|
|
||||||
params = params.split('&');
|
|
||||||
|
|
||||||
for(var i=0,ii=params.length; i<ii; i++)
|
|
||||||
{
|
|
||||||
param = params[i].split('=');
|
|
||||||
if(param[0] === arg) return param[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/* url() v1.7.2 - http://github.com/websanova/js-url */window.url=(function(){function b(c){return !isNaN(parseFloat(c))&&isFinite(c)}return function a(p,d){var c=d||window.location.toString();if(c.substring(0,2)==="//"){c="http:"+c}else{if(c.split("://").length===1){c="http://"+c}}d=c.split("/");var g={auth:""},o=d[2].split("@");if(o.length===1){o=o[0].split(":")}else{g.auth=o[0];o=o[1].split(":")}g.protocol=d[0],g.hostname=o[0],g.port=(o[1]||"80"),g.pathname="/"+d.slice(3,d.length).join("/").split("?")[0].split("#")[0];var e=g.pathname;if(e.split(".").length===1&&e[e.length-1]!=="/"){e+="/"}var k=g.hostname,l=k.split("."),m=e.split("/");if(!p){return c}else{if(p==="hostname"){return k}else{if(p==="domain"){return l.slice(-2).join(".")}else{if(p==="tld"){return l.slice(-1).join(".")}else{if(p==="sub"){return l.slice(0,l.length-2).join(".")}else{if(p==="port"){return g.port||"80"}else{if(p==="protocol"){return g.protocol.split(":")[0]}else{if(p==="auth"){return g.auth}else{if(p==="user"){return g.auth.split(":")[0]}else{if(p==="pass"){return g.auth.split(":")[1]||""}else{if(p==="path"){return e}else{if(p[0]==="."){p=p.substring(1);if(b(p)){p=parseInt(p);return l[p<0?l.length+p:p-1]||""}}else{if(b(p)){p=parseInt(p);return m[p<0?m.length-1+p:p]||""}else{if(p==="file"){return m.slice(-1)[0]}else{if(p==="filename"){return m.slice(-1)[0].split(".")[0]}else{if(p==="fileext"){return m.slice(-1)[0].split(".")[1]||""}else{if(p[0]==="?"||p[0]==="#"){var h=c,f=null;if(p[0]==="?"){h=(h.split("?")[1]||"").split("#")[0]}else{if(p[0]==="#"){h=(h.split("#")[1]||"")}}if(!p[1]){return h}p=p.substring(1);h=h.split("&");for(var j=0,n=h.length;j<n;j++){f=h[j].split("=");if(f[0]===p){return f[1]}}}}}}}}}}}}}}}}}}}return""}})();
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
/*!
|
|
||||||
jQuery Wookmark plugin 0.5
|
|
||||||
@name jquery.wookmark.js
|
|
||||||
@author Christoph Ono (chri@sto.ph or @gbks)
|
|
||||||
@version 0.5
|
|
||||||
@date 3/19/2012
|
|
||||||
@category jQuery plugin
|
|
||||||
@copyright (c) 2009-2012 Christoph Ono (www.wookmark.com)
|
|
||||||
@license Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
|
||||||
*/
|
|
||||||
$.fn.wookmark = function(options) {
|
|
||||||
|
|
||||||
if(!this.wookmarkOptions) {
|
|
||||||
this.wookmarkOptions = $.extend( {
|
|
||||||
container: $('body'),
|
|
||||||
offset: 2,
|
|
||||||
autoResize: false,
|
|
||||||
itemWidth: $(this[0]).outerWidth(),
|
|
||||||
resizeDelay: 50
|
|
||||||
}, options);
|
|
||||||
} else if(options) {
|
|
||||||
this.wookmarkOptions = $.extend(this.wookmarkOptions, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Layout variables.
|
|
||||||
if(!this.wookmarkColumns) {
|
|
||||||
this.wookmarkColumns = null;
|
|
||||||
this.wookmarkContainerWidth = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Main layout function.
|
|
||||||
this.wookmarkLayout = function() {
|
|
||||||
// Calculate basic layout parameters.
|
|
||||||
var columnWidth = this.wookmarkOptions.itemWidth + this.wookmarkOptions.offset;
|
|
||||||
var containerWidth = this.wookmarkOptions.container.width();
|
|
||||||
var columns = Math.floor((containerWidth+this.wookmarkOptions.offset)/columnWidth);
|
|
||||||
var offset = Math.round((containerWidth - (columns*columnWidth-this.wookmarkOptions.offset))/2);
|
|
||||||
|
|
||||||
// If container and column count hasn't changed, we can only update the columns.
|
|
||||||
var bottom = 0;
|
|
||||||
if(this.wookmarkColumns != null && this.wookmarkColumns.length == columns) {
|
|
||||||
bottom = this.wookmarkLayoutColumns(columnWidth, offset);
|
|
||||||
} else {
|
|
||||||
bottom = this.wookmarkLayoutFull(columnWidth, columns, offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set container height to height of the grid.
|
|
||||||
this.wookmarkOptions.container.css('height', bottom+'px');
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform a full layout update.
|
|
||||||
*/
|
|
||||||
this.wookmarkLayoutFull = function(columnWidth, columns, offset) {
|
|
||||||
// Prepare Array to store height of columns.
|
|
||||||
var heights = [];
|
|
||||||
while(heights.length < columns) {
|
|
||||||
heights.push(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store column data.
|
|
||||||
this.wookmarkColumns = [];
|
|
||||||
while(this.wookmarkColumns.length < columns) {
|
|
||||||
this.wookmarkColumns.push([]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop over items.
|
|
||||||
var item, top, left, i=0, k=0, length=this.length, shortest=null, shortestIndex=null, bottom = 0;
|
|
||||||
for(; i<length; i++ ) {
|
|
||||||
item = $(this[i]);
|
|
||||||
|
|
||||||
// Find the shortest column.
|
|
||||||
shortest = null;
|
|
||||||
shortestIndex = 0;
|
|
||||||
for(k=0; k<columns; k++) {
|
|
||||||
if(shortest == null || heights[k] < shortest) {
|
|
||||||
shortest = heights[k];
|
|
||||||
shortestIndex = k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Postion the item.
|
|
||||||
item.css({
|
|
||||||
position: 'absolute',
|
|
||||||
top: shortest+'px',
|
|
||||||
left: (shortestIndex*columnWidth + offset)+'px'
|
|
||||||
});
|
|
||||||
|
|
||||||
// Update column height.
|
|
||||||
heights[shortestIndex] = shortest + item.outerHeight() + this.wookmarkOptions.offset;
|
|
||||||
bottom = Math.max(bottom, heights[shortestIndex]);
|
|
||||||
|
|
||||||
this.wookmarkColumns[shortestIndex].push(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bottom;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This layout function only updates the vertical position of the
|
|
||||||
* existing column assignments.
|
|
||||||
*/
|
|
||||||
this.wookmarkLayoutColumns = function(columnWidth, offset) {
|
|
||||||
var heights = [];
|
|
||||||
while(heights.length < this.wookmarkColumns.length) {
|
|
||||||
heights.push(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
var i=0, length = this.wookmarkColumns.length, column;
|
|
||||||
var k=0, kLength, item;
|
|
||||||
var bottom = 0;
|
|
||||||
for(; i<length; i++) {
|
|
||||||
column = this.wookmarkColumns[i];
|
|
||||||
kLength = column.length;
|
|
||||||
for(k=0; k<kLength; k++) {
|
|
||||||
item = column[k];
|
|
||||||
item.css({
|
|
||||||
left: (i*columnWidth + offset)+'px',
|
|
||||||
top: heights[i]+'px'
|
|
||||||
});
|
|
||||||
heights[i] += item.outerHeight() + this.wookmarkOptions.offset;
|
|
||||||
|
|
||||||
bottom = Math.max(bottom, heights[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bottom;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Listen to resize event if requested.
|
|
||||||
this.wookmarkResizeTimer = null;
|
|
||||||
if(!this.wookmarkResizeMethod) {
|
|
||||||
this.wookmarkResizeMethod = null;
|
|
||||||
}
|
|
||||||
if(this.wookmarkOptions.autoResize) {
|
|
||||||
// This timer ensures that layout is not continuously called as window is being dragged.
|
|
||||||
this.wookmarkOnResize = function(event) {
|
|
||||||
if(this.wookmarkResizeTimer) {
|
|
||||||
clearTimeout(this.wookmarkResizeTimer);
|
|
||||||
}
|
|
||||||
this.wookmarkResizeTimer = setTimeout($.proxy(this.wookmarkLayout, this), this.wookmarkOptions.resizeDelay)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Bind event listener.
|
|
||||||
if(!this.wookmarkResizeMethod) {
|
|
||||||
this.wookmarkResizeMethod = $.proxy(this.wookmarkOnResize, this);
|
|
||||||
}
|
|
||||||
$(window).resize(this.wookmarkResizeMethod);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear event listeners and time outs.
|
|
||||||
*/
|
|
||||||
this.wookmarkClear = function() {
|
|
||||||
if(this.wookmarkResizeTimer) {
|
|
||||||
clearTimeout(this.wookmarkResizeTimer);
|
|
||||||
this.wookmarkResizeTimer = null;
|
|
||||||
}
|
|
||||||
if(this.wookmarkResizeMethod) {
|
|
||||||
$(window).unbind('resize', this.wookmarkResizeMethod);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Apply layout
|
|
||||||
this.wookmarkLayout();
|
|
||||||
|
|
||||||
// Display items (if hidden).
|
|
||||||
this.show();
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
/*!
|
|
||||||
jQuery Wookmark plugin 0.5
|
|
||||||
@name jquery.wookmark.js
|
|
||||||
@author Christoph Ono (chri@sto.ph or @gbks)
|
|
||||||
@version 0.5
|
|
||||||
@date 3/19/2012
|
|
||||||
@category jQuery plugin
|
|
||||||
@copyright (c) 2009-2012 Christoph Ono (www.wookmark.com)
|
|
||||||
@license Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
|
|
||||||
*/
|
|
||||||
$.fn.wookmark=function(a){if(!this.wookmarkOptions){this.wookmarkOptions=$.extend({container:$("body"),offset:2,autoResize:false,itemWidth:$(this[0]).outerWidth(),resizeDelay:50},a)}else if(a){this.wookmarkOptions=$.extend(this.wookmarkOptions,a)}if(!this.wookmarkColumns){this.wookmarkColumns=null;this.wookmarkContainerWidth=null}this.wookmarkLayout=function(){var a=this.wookmarkOptions.itemWidth+this.wookmarkOptions.offset;var b=this.wookmarkOptions.container.width();var c=Math.floor((b+this.wookmarkOptions.offset)/a);var d=Math.round((b-(c*a-this.wookmarkOptions.offset))/2);var e=0;if(this.wookmarkColumns!=null&&this.wookmarkColumns.length==c){e=this.wookmarkLayoutColumns(a,d)}else{e=this.wookmarkLayoutFull(a,c,d)}this.wookmarkOptions.container.css("height",e+"px")};this.wookmarkLayoutFull=function(a,b,c){var d=[];while(d.length<b){d.push(0)}this.wookmarkColumns=[];while(this.wookmarkColumns.length<b){this.wookmarkColumns.push([])}var e,f,g,h=0,i=0,j=this.length,k=null,l=null,m=0;for(;h<j;h++){e=$(this[h]);k=null;l=0;for(i=0;i<b;i++){if(k==null||d[i]<k){k=d[i];l=i}}e.css({position:"absolute",top:k+"px",left:l*a+c+"px"});d[l]=k+e.outerHeight()+this.wookmarkOptions.offset;m=Math.max(m,d[l]);this.wookmarkColumns[l].push(e)}return m};this.wookmarkLayoutColumns=function(a,b){var c=[];while(c.length<this.wookmarkColumns.length){c.push(0)}var d=0,e=this.wookmarkColumns.length,f;var g=0,h,i;var j=0;for(;d<e;d++){f=this.wookmarkColumns[d];h=f.length;for(g=0;g<h;g++){i=f[g];i.css({left:d*a+b+"px",top:c[d]+"px"});c[d]+=i.outerHeight()+this.wookmarkOptions.offset;j=Math.max(j,c[d])}}return j};this.wookmarkResizeTimer=null;if(!this.wookmarkResizeMethod){this.wookmarkResizeMethod=null}if(this.wookmarkOptions.autoResize){this.wookmarkOnResize=function(a){if(this.wookmarkResizeTimer){clearTimeout(this.wookmarkResizeTimer)}this.wookmarkResizeTimer=setTimeout($.proxy(this.wookmarkLayout,this),this.wookmarkOptions.resizeDelay)};if(!this.wookmarkResizeMethod){this.wookmarkResizeMethod=$.proxy(this.wookmarkOnResize,this)}$(window).resize(this.wookmarkResizeMethod)}this.wookmarkClear=function(){if(this.wookmarkResizeTimer){clearTimeout(this.wookmarkResizeTimer);this.wookmarkResizeTimer=null}if(this.wookmarkResizeMethod){$(window).unbind("resize",this.wookmarkResizeMethod)}};this.wookmarkLayout();this.show()}
|
|
||||||
Reference in New Issue
Block a user